@jielga/tmdatagrid 0.2.0 → 0.3.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.
Files changed (35) hide show
  1. package/dist/index.d.ts +397 -37
  2. package/dist/index.js +1550 -978
  3. package/dist/index.js.map +1 -1
  4. package/dist/styles.css +1 -1
  5. package/package.json +1 -1
  6. package/skills/columns/SKILL.md +1 -1
  7. package/skills/features/SKILL.md +1 -1
  8. package/skills/getting-started/SKILL.md +41 -6
  9. package/skills/options/SKILL.md +1 -1
  10. package/skills/server-side/SKILL.md +1 -1
  11. package/src/tmdatagrid/components/TMDataGrid.module.css +11 -1
  12. package/src/tmdatagrid/components/TMDataGrid.tsx +6 -0
  13. package/src/tmdatagrid/components/TMDataGridColumnsPanel.tsx +7 -1
  14. package/src/tmdatagrid/components/TMDataGridFilterPanel.module.css +15 -0
  15. package/src/tmdatagrid/components/TMDataGridFilterPanel.tsx +87 -10
  16. package/src/tmdatagrid/components/TMDataGridFilterPills.module.css +35 -0
  17. package/src/tmdatagrid/components/TMDataGridFilterPills.tsx +135 -0
  18. package/src/tmdatagrid/components/TMDataGridFooter.module.css +8 -0
  19. package/src/tmdatagrid/components/TMDataGridFooter.tsx +70 -42
  20. package/src/tmdatagrid/components/TMDataGridGroupColumn.module.css +48 -0
  21. package/src/tmdatagrid/components/TMDataGridGroupColumn.tsx +147 -0
  22. package/src/tmdatagrid/components/TMDataGridHeaderCell.module.css +6 -0
  23. package/src/tmdatagrid/components/TMDataGridHeaderCell.tsx +77 -1
  24. package/src/tmdatagrid/components/TMDataGridSelectColumn.tsx +83 -6
  25. package/src/tmdatagrid/components/TMDataGridTable.module.css +38 -4
  26. package/src/tmdatagrid/components/TMDataGridTable.tsx +396 -32
  27. package/src/tmdatagrid/components/TMDataGridToolbar.tsx +3 -0
  28. package/src/tmdatagrid/components/icons.ts +5 -0
  29. package/src/tmdatagrid/core/capabilities.ts +81 -11
  30. package/src/tmdatagrid/core/filterOperators.ts +25 -0
  31. package/src/tmdatagrid/core/grouping.ts +21 -0
  32. package/src/tmdatagrid/core/persistence.ts +12 -0
  33. package/src/tmdatagrid/core/rowSelection.ts +202 -0
  34. package/src/tmdatagrid/index.ts +26 -2
  35. package/src/tmdatagrid/useTMDataGrid.tsx +240 -35
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createContext","useContext","TMDataGridSize","TMDataGridApi","TMDataGridRowData","Record","TMDataGridContextValue","size","rowHeight","controlSize","TMDataGridContext","TMDataGridContextProvider","Provider","useTMDataGridContext","api","Error","TMDataGridColumnType","TMDataGridColumnMeta","ColumnLike","id","columnDef","header","meta","parent","getColumnLabel","column","label","getColumnType","type","getColumnAlign","align","isColumnReorderable","enableOrdering","undefined","Button","Checkbox","ScrollArea","Text","TextInput","useSelector","useState","classes","useTMDataGridContext","getColumnLabel","SearchIcon","TMDataGridColumnsPanel","$","_c","table","controlSize","search","setSearch","columnVisibility","store","_temp","T0","hideableColumns","shownCount","t0","t1","t2","t3","t4","t5","visibleInPanel","columns","getAllLeafColumns","needle","trim","toLowerCase","filter","column","includes","_temp2","t6","column_1","id","length","columnsPanel","t7","Symbol","for","event","currentTarget","value","t8","columnsPanelSearch","Autosize","columnsPanelList","t9","column_2","getCanHide","event_0","toggleVisibility","checked","map","t10","t11","event_1","toggleAllColumnsVisible","t12","t13","resetColumnVisibility","t14","columnsPanelFooter","t15","column_0","state","Row","RowData","TableFeatures","TMDataGridFilterValue","operator","TMDataGridFilterOperator","value","TMDataGridColumnType","FILTER_OPERATOR_LABELS","Record","contains","equals","notEquals","startsWith","endsWith","greaterThan","greaterThanOrEqual","lessThan","lessThanOrEqual","isEmpty","isNotEmpty","STRING_OPERATORS","NUMBER_OPERATORS","VALUELESS_OPERATORS","getOperatorsForType","type","getDefaultOperator","operatorNeedsValue","includes","isTMDataGridFilterValue","isFilterActive","trim","matchesFilter","cellValue","undefined","filterText","numericCell","Number","NaN","numericFilter","compareNumeric","isNaN","cellText","String","toLowerCase","needle","tmDataGridFilterFn","row","TFeatures","TData","columnId","filterValue","getValue","ActionIcon","Button","Select","Stack","TextInput","useSelector","classes","useTMDataGridContext","getColumnLabel","getColumnType","TMDataGridFilterOperator","TMDataGridFilterValue","FILTER_OPERATOR_LABELS","getDefaultOperator","getOperatorsForType","isTMDataGridFilterValue","operatorNeedsValue","CloseIcon","FALLBACK_FILTER","operator","value","asFilterValue","TMDataGridFilterPanel","$","_c","table","ui","controlSize","opened","_temp","columnFilters","store","_temp2","filterableColumns","t0","getAllLeafColumns","filter","_temp3","map","_temp4","columnOptions","t1","removeFilter","columnId","remaining","id","setColumnFilters","length","actions","closeFilterPanel","t2","changeFilterColumn","fromColumnId","toColumnId","current","find","filter_0","target","getColumn","filter_1","filter_2","openFilterPanel","t3","patchFilter","columnId_0","patch","filter_3","t4","addFilter","nextColumn","column_1","some","filter_4","column","t5","t6","filter_5","column_2","type","needsValue","filterRow","next","_temp5","next_0","event","currentTarget","Symbol","for","alignSelf","t7","t8","filterPanel","label","column_0","getCanFilter","state_0","state","filterPanelOpen","Column","RowData","TMDataGridRowData","isColumnReorderable","TMDataGridFeatures","TMDataGridTable","UseTMDataGridOptions","TMDataGridRowSelectionMode","TMDataGridFeatureFlags","sorting","filtering","hiding","pinning","resizing","ordering","rowSelection","rowSelectionMode","highlightSelectedRows","pagination","readFeatureFlags","options","Pick","TData","enableSorting","enableColumnFilters","enableHiding","enableColumnPinning","enableColumnResizing","enableColumnOrdering","enableRowSelection","enablePagination","manualPagination","TMDataGridColumnCapabilities","canSort","canFilter","canHide","canPin","canResize","canReorder","getColumnCapabilities","column","features","getCanSort","getCanFilter","getCanHide","getCanPin","getCanResize","TMDataGridCapabilities","canSortAny","canFilterAny","canHideAny","canPinAny","canReorderAny","canSelectRows","canPaginate","getGridCapabilities","table","columns","getAllLeafColumns","any","predicate","capabilities","some","c","ActionIcon","Group","Select","Text","RowData","useSelector","ReactNode","classes","useTMDataGridContext","getGridCapabilities","ChevronLeftIcon","ChevronRightIcon","TMDataGridTable","TMDataGridPaginationApi","pageIndex","pageSize","pageCount","rowCount","canPreviousPage","canNextPage","setPageIndex","setPageSize","previousPage","nextPage","firstPage","lastPage","getTMDataGridPaginationApi","table","TData","store","state","pagination","getPageCount","getRowCount","getCanPreviousPage","getCanNextPage","index","size","TMDataGridFooterProps","pageSizeOptions","ReadonlyArray","api","TMDataGridFooter","t0","$","_c","t1","undefined","features","controlSize","canPaginate","t2","t3","footer","total","from","to","Math","min","sizeOptions","includes","sort","_temp","t4","map","String","t5","t6","value","Number","t7","t8","t9","t10","t11","t12","t13","Symbol","for","t14","t15","t16","t17","t18","t19","t20","t21","a","b","Column","ColumnPinningState","TMDataGridRowData","isColumnReorderable","TMDataGridFeatures","TMDataGridTable","GridColumn","GridTable","TMDataGridColumnRegion","TMDataGridDropSide","getColumnRegion","columnPinning","columnId","left","includes","right","moveInList","ids","ReadonlyArray","movedId","targetId","side","Array","remaining","filter","id","targetIndex","indexOf","splice","MoveColumnArgs","table","moveColumn","store","state","region","leafIds","getAllLeafColumns","map","column","setColumnOrder","setColumnPinning","previous","getRegionColumns","getLeftVisibleLeafColumns","getRightVisibleLeafColumns","getCenterVisibleLeafColumns","ColumnStepArgs","direction","getStepTargetColumn","columns","index","findIndex","target","moveColumnByStep","Checkbox","useSelector","ColumnDef","Row","RowData","TMDataGridFeatures","TMDataGridTable","SELECT_COLUMN_ID","SelectAllCheckbox","t0","$","_c","table","t1","getIsAllRowsSelected","allSelected","store","t2","getIsSomeRowsSelected","someSelected","t3","t4","getToggleAllRowsSelectedHandler","t5","SelectRowCheckbox","row","getIsSelected","selected","getIsSomeSelected","getCanSelect","t6","getToggleSelectedHandler","t7","_temp","event","stopPropagation","createSelectColumn","TData","id","meta","label","align","enableOrdering","size","minSize","maxSize","enableResizing","enableSorting","enableColumnFilter","enableGlobalFilter","enablePinning","header","cell","TableState","TMDataGridFeatures","GridState","DATA_STATE_SLICES","const","ReadonlyArray","SETTINGS_STATE_SLICES","TMDataGridDataSlice","TMDataGridSettingsSlice","TMDataGridPersistKey","key","slices","TSlice","TMDataGridStorageMode","TMDataGridPersistence","dataKey","settingsKey","storageMode","serialize","value","Partial","deserialize","ResolvedKey","resolveKey","entry","defaultSlices","resolveStorage","persistence","Storage","window","sessionStorage","localStorage","prop","Record","undefined","isString","isFiniteNumber","Number","isFinite","isArrayOf","isItem","item","Array","isArray","every","isRecordOf","Object","values","hasStringId","SLICE_GUARDS","columnFilters","globalFilter","sorting","pagination","pageIndex","pageSize","columnVisibility","columnSizing","columnOrder","columnPinning","isValidSlice","slice","guard","readSlices","storage","resolved","raw","getItem","parsed","record","restored","writeSlices","state","payload","setItem","resolveKeys","data","settings","hasPersistenceKeys","defaultDeserialize","JSON","parse","defaultSerialize","stringify","readPersistedState","writePersistedState","useCreateStore","ColumnDef","columnFacetingFeature","columnFilteringFeature","columnOrderingFeature","columnPinningFeature","columnResizingFeature","columnSizingFeature","columnVisibilityFeature","createColumnHelper","createFacetedMinMaxValues","createFacetedRowModel","createFacetedUniqueValues","createFilteredRowModel","createPaginatedRowModel","createSortedRowModel","filterFns","globalFilteringFeature","metaHelper","RowData","rowPaginationFeature","rowSelectionFeature","rowSortingFeature","sortFns","Table","tableFeatures","TableOptions","TableState","useTable","Store","useEffect","useMemo","useState","TMDataGridColumnType","tmDataGridFilterFn","getDefaultOperator","hasPersistenceKeys","readPersistedState","TMDataGridPersistence","writePersistedState","readFeatureFlags","TMDataGridFeatureFlags","TMDataGridRowSelectionMode","createSelectColumn","SELECT_COLUMN_ID","PERSIST_DEBOUNCE_MS","TMDataGridColumnMeta","label","type","flex","align","enableOrdering","TMDataGridTableMeta","loading","noResultsLabel","rowHeight","totalRowCount","tmDataGridFeatures","filteredRowModel","sortedRowModel","paginatedRowModel","facetedRowModel","facetedMinMaxValues","facetedUniqueValues","tmDataGrid","tableMeta","columnMeta","TMDataGridFeatures","TMDataGridTable","TData","createTMDataGridColumnHelper","TMDataGridUiState","filterPanelOpen","columnsPanelOpen","filterPanelColumnId","draggedColumnId","TMDataGridUiActions","openFilterPanel","columnId","closeFilterPanel","setColumnsPanelOpen","open","toggleColumnsPanel","startColumnDrag","endColumnDrag","TMDataGridUiStore","TMDataGridApi","table","ui","features","UseTMDataGridOptions","Omit","persist","enableColumnOrdering","enablePagination","rowSelectionMode","highlightSelectedRows","TMDataGridColumnDef","withTMDataGridDefaults","columns","ReadonlyArray","Array","map","column","isArray","filterFn","useTMDataGrid","t0","$","_c","options","selectionEnabled","enableRowSelection","pinningEnabled","enableColumnPinning","selectColumnEnabled","t1","base","t2","persistedState","t3","t4","t5","initialState","columnPinning","left","filter","_temp","t6","right","t7","t8","pagination","t9","pageIndex","pageSize","t10","t11","columnResizeMode","enableSorting","enableColumnResizing","globalFilterFn","t12","t13","store","state","timeout","pending","flush","undefined","subscription","subscribe","clearTimeout","setTimeout","unsubscribe","t14","Symbol","for","_temp5","t15","t16","setState","prev","_temp2","prev_1","_temp3","columnId_0","prev_3","_temp4","prev_4","prev_2","prev_0","id","openColumnFilter","api","getColumn","getFilterValue","setFilterValue","operator","columnDef","meta","value","actions","ActionIcon","Menu","Tooltip","flexRender","Header","useSelector","shallow","DragEvent","ReactNode","useRef","useState","classes","sticky","TMDataGridRowData","useTMDataGridContext","TMDataGridColumnLayout","getColumnCapabilities","getGridCapabilities","getColumnRegion","getStepTargetColumn","moveColumn","moveColumnByStep","TMDataGridDropSide","getColumnAlign","getColumnLabel","isFilterActive","ArrowDownIcon","ArrowUpIcon","ColumnsIcon","DotsVerticalIcon","EyeOffIcon","FilterIcon","MoveLeftIcon","MoveRightIcon","PinLeftIcon","PinOffIcon","PinRightIcon","SELECT_COLUMN_ID","TMDataGridFeatures","openColumnFilter","TMDataGridHeader","TMDataGridHeaderCell","t0","$","_c","header","layout","api","table","features","column","menuOpened","setMenuOpened","dropSide","setDropSide","cellRef","suppressSortRef","t1","Symbol","for","compare","sorting","columnFilters","resizingColumnId","columnPinning","store","_temp","draggedColumnId","ui","_temp2","isLeaf","subHeaders","length","t2","label","t3","align","t4","id","find","sort","desc","sortDirection","isSorted","undefined","t5","t6","filter","value","some","isFiltered","isResizing","pinnedAt","capabilities","canSort","canFilter","canHide","canPin","canResize","canReorder","t7","canHideAny","canManageColumns","isDragged","t8","isDropTarget","t9","handleDragStart","event","dataTransfer","effectAllowed","setData","actions","startColumnDrag","t10","handleDragOver","event_0","preventDefault","dropEffect","bounds","current","getBoundingClientRect","clientX","left","width","t11","handleDragLeave","event_1","next","relatedTarget","Node","currentTarget","contains","t12","handleDrop","event_2","endColumnDrag","columnId","targetId","side","t13","handleDragEnd","t14","setPinned","position","state","columnSizing","setColumnSizing","prev","Math","round","pin","menuItems","t15","t16","toggleSorting","t17","t18","t19","push","menuItemActive","t20","t21","t22","t23","t24","direction","previous","next_0","t25","toggleVisibility","setColumnsPanelOpen","isDivider","at","pop","headerCellSortable","headerCellDragging","headerCellDropBefore","headerCellDropAfter","isBoundary","stickyLeft","stickyRight","headerCell","Boolean","cellClass","join","t26","t27","t28","t29","t30","t31","offset","t32","t33","t34","t35","right","zIndex","t36","event_3","getToggleSortingHandler","t37","columnDef","isPlaceholder","headerTitle","getContext","t38","headerActions","headerAction","event_4","stopPropagation","event_5","_temp3","_temp4","t39","columnSeparatorResizable","t40","columnSeparatorActive","t41","columnSeparator","t42","t43","event_7","getResizeHandler","t44","t45","_temp5","t46","event_8","event_6","opened","state_0","columnResizing","isResizingColumn","columnOrder","node","type","Divider","Loader","Text","Cell","flexRender","Row","RowData","useSelector","useVirtualizer","useCallback","useEffect","useRef","classes","sticky","TMDataGridRowData","useTMDataGridContext","TMDataGridFilterPanel","TMDataGridHeaderCell","getColumnAlign","SearchIcon","TMDataGridFeatures","TMDataGridColumnLayout","pinnedAt","offset","isBoundary","UNPINNED_LAYOUT","TMDataGridBodyCell","t0","$","_c","cell","rowHeight","layout","t1","column","t2","stickyLeft","t3","stickyRight","t4","bodyCell","filter","Boolean","t5","join","t6","undefined","t7","t8","t9","t10","minHeight","left","right","position","zIndex","t11","columnDef","getContext","t12","cellContent","t13","TMDataGridTableProps","onRowClick","row","TData","TMDataGridTable","table","features","controlSize","store","loading","noResultsLabel","options","meta","scrollContainerRef","HTMLDivElement","rows","pagination","getPaginatedRowModel","getPrePaginatedRowModel","pageCount","getPageCount","state","pageIndex","setPageIndex","virtualizer","count","length","getScrollElement","current","estimateSize","getItemKey","index","id","overscan","initialRect","height","width","virtualItems","getVirtualItems","paddingTop","start","paddingBottom","getTotalSize","at","end","leftLeafColumns","getLeftLeafColumns","rightLeafColumns","getRightLeafColumns","centerLeafColumns","getCenterLeafColumns","orderedColumns","centerHeaderGroups","getCenterHeaderGroups","leftHeaderGroups","getLeftHeaderGroups","rightHeaderGroups","getRightHeaderGroups","headerGroups","map","group","headers","columnSizing","columnTracks","isFixed","minSize","maxSize","isResized","isPinned","getIsPinned","minWidth","track","getSize","flex","gridTemplateColumns","c","gridMinWidth","reduce","sum","columnLayout","Map","widthOf","columnId","findIndex","leftOffset","set","rightOffset","reverse","layoutFor","get","isEmpty","selectsOnRowClick","rowSelection","rowSelectionMode","rowIsInteractive","handleRowActivate","getCanSelect","toggleSelected","tableWrapper","scrollContainer","grid","display","headerGroup","groupIndex","headerRow","header","gridColumn","virtualItem","key","getIsSelected","highlightSelectedRows","bodyRow","cursor","event","target","currentTarget","preventDefault","getLeftVisibleCells","getCenterVisibleCells","getRightVisibleCells","messageRow","ActionIcon","Popover","Text","Tooltip","useSelector","ReactNode","classes","TMDataGridColumnsPanel","useTMDataGridContext","getGridCapabilities","isFilterActive","BurgerIcon","FilterIcon","openColumnFilter","TMDataGridToolbar","t0","$","_c","children","t1","toolbar","TMDataGridToolbarSpacer","Symbol","for","toolbarSpacer","TMDataGridSummaryCount","table","controlSize","store","undefined","getRowCount","shown","t2","options","meta","totalRowCount","getPreFilteredRowModel","rows","length","total","t3","TMDataGridColumnsButton","ui","features","opened","_temp","canHideAny","actions","toggleColumnsPanel","setColumnsPanelOpen","state","columnsPanelOpen","TMDataGridFilterButton","api","_temp2","columnFilters","_temp3","activeCount","filter","_temp4","canFilterAny","closeFilterPanel","firstFilterable","getAllLeafColumns","find","_temp5","id","openFilterPanel","t4","column","getCanFilter","value","state_0","filterPanelOpen","MantineSize","TMDataGridSize","DEFAULT_TMDATAGRID_SIZE","SIZE_ROW_HEIGHT","Record","xs","sm","md","lg","xl","SIZE_CONTROL_SIZE","RowData","CSSProperties","ReactNode","useMemo","classes","TMDataGridColumnsPanel","TMDataGridContextProvider","TMDataGridFilterPanel","TMDataGridFooter","TMDataGridTable","TMDataGridColumnsButton","TMDataGridFilterButton","TMDataGridSummaryCount","TMDataGridToolbar","TMDataGridToolbarSpacer","DEFAULT_TMDATAGRID_SIZE","SIZE_CONTROL_SIZE","SIZE_ROW_HEIGHT","TMDataGridSize","TMDataGridApi","TMDataGridProps","TData","children","size","className","style","Record","TMDataGridRoot","t0","$","_c","table","ui","features","t1","undefined","rowHeight","options","meta","t2","t3","controlSize","api","t4","root","filter","Boolean","t5","join","t6","t7","TMDataGrid","Object","assign","Toolbar","Spacer","SummaryCount","ColumnsButton","FilterButton","Table","Footer","FilterPanel","ColumnsPanel"],"sources":["../src/tmdatagrid/components/TMDataGrid.module.css","../src/tmdatagrid/components/TMDataGridColumnsPanel.module.css","../src/tmdatagrid/TMDataGridContext.ts","../src/tmdatagrid/core/columnUtils.ts","../src/tmdatagrid/components/TMDataGridColumnsPanel.tsx","../src/tmdatagrid/components/TMDataGridFilterPanel.module.css","../src/tmdatagrid/core/filterOperators.ts","../src/tmdatagrid/components/TMDataGridFilterPanel.tsx","../src/tmdatagrid/components/TMDataGridFooter.module.css","../src/tmdatagrid/core/capabilities.ts","../src/tmdatagrid/components/TMDataGridFooter.tsx","../src/tmdatagrid/components/TMDataGridTable.module.css","../src/tmdatagrid/components/sticky.module.css","../src/tmdatagrid/components/TMDataGridHeaderCell.module.css","../src/tmdatagrid/core/columnOrdering.ts","../src/tmdatagrid/components/TMDataGridSelectColumn.tsx","../src/tmdatagrid/core/persistence.ts","../src/tmdatagrid/useTMDataGrid.tsx","../src/tmdatagrid/components/TMDataGridHeaderCell.tsx","../src/tmdatagrid/components/TMDataGridTable.tsx","../src/tmdatagrid/components/TMDataGridToolbar.module.css","../src/tmdatagrid/components/TMDataGridToolbar.tsx","../src/tmdatagrid/core/sizes.ts","../src/tmdatagrid/components/TMDataGrid.tsx"],"sourcesContent":["/* The grid root: the size scale every other module reads, and the frame.\n Each component owns its own module; these variables cascade into all of\n them, and the pinned-column boundary shared by header and body cells lives\n in sticky.module.css. */\n\n/* Size scale. Row heights mirror SIZE_ROW_HEIGHT in core/sizes.ts — the\n virtualizer needs the number in JS, so the two have to agree. */\n.root[data-size=\"xs\"] {\n --dg-row-height: 34px;\n --dg-header-height: 32px;\n --dg-font-size: var(--mantine-font-size-xs);\n --dg-padding: 6px;\n}\n\n.root[data-size=\"sm\"] {\n --dg-row-height: 42px;\n --dg-header-height: 38px;\n --dg-font-size: var(--mantine-font-size-sm);\n --dg-padding: 8px;\n}\n\n.root[data-size=\"md\"] {\n --dg-row-height: 52px;\n --dg-header-height: 44px;\n --dg-font-size: var(--mantine-font-size-sm);\n --dg-padding: 10px;\n}\n\n.root[data-size=\"lg\"] {\n --dg-row-height: 62px;\n --dg-header-height: 52px;\n --dg-font-size: var(--mantine-font-size-md);\n --dg-padding: 14px;\n}\n\n.root[data-size=\"xl\"] {\n --dg-row-height: 72px;\n --dg-header-height: 60px;\n --dg-font-size: var(--mantine-font-size-lg);\n --dg-padding: 18px;\n}\n\n.root {\n /* Fallbacks, so the parts still work if rendered outside a sized root. */\n --dg-row-height: 52px;\n --dg-header-height: 44px;\n --dg-font-size: var(--mantine-font-size-sm);\n --dg-padding: 10px;\n /* Background of a highlighted (selected) row. Override it on the grid:\n <TMDataGrid style={{ \"--dg-row-selected-bg\": \"var(--mantine-color-blue-0)\" }} /> */\n --dg-row-selected-bg: var(--mantine-primary-color-light);\n\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n /* Header text is a stretched flex item, so an inherited `text-align: center`\n from the host page would centre headers away from their cell content. */\n text-align: left;\n border: 1px solid var(--mantine-color-default-border);\n border-radius: var(--mantine-radius-md);\n background-color: var(--mantine-color-body);\n}\n",".columnsPanel {\n width: 280px;\n display: flex;\n flex-direction: column;\n}\n\n.columnsPanelSearch {\n padding: var(--mantine-spacing-sm);\n}\n\n.columnsPanelList {\n display: flex;\n flex-direction: column;\n gap: var(--mantine-spacing-sm);\n padding: 0 var(--mantine-spacing-sm) var(--mantine-spacing-sm);\n}\n\n.columnsPanelFooter {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mantine-spacing-sm);\n padding: var(--mantine-spacing-sm);\n border-top: 1px solid var(--mantine-color-default-border);\n}\n","import { createContext, useContext } from \"react\";\nimport type { TMDataGridSize } from \"./core/sizes\";\nimport type { TMDataGridApi } from \"./useTMDataGrid\";\n\n/**\n * Row shape the chrome components work against. They only ever touch columns,\n * rows and cells generically, so the concrete row type is erased at the context\n * boundary — the same trick Mantine uses for its compound components.\n */\nexport type TMDataGridRowData = Record<string, unknown>;\n\nexport type TMDataGridContextValue = TMDataGridApi<TMDataGridRowData> & {\n size: TMDataGridSize;\n /** Row height in px, already resolved from `size` and `meta.rowHeight`. */\n rowHeight: number;\n /** Mantine control size that pairs with `size`. */\n controlSize: TMDataGridSize;\n};\n\nconst TMDataGridContext = createContext<unknown>(null);\n\nexport const TMDataGridContextProvider = TMDataGridContext.Provider;\n\nexport function useTMDataGridContext(): TMDataGridContextValue {\n const api = useContext(TMDataGridContext);\n if (!api) {\n throw new Error(\n \"TMDataGrid compound components must be rendered inside <TMDataGrid>\",\n );\n }\n return api as TMDataGridContextValue;\n}\n","import type { TMDataGridColumnType } from \"./filterOperators\";\nimport type { TMDataGridColumnMeta } from \"../useTMDataGrid\";\n\n/**\n * Structural shape of the column bits the chrome reads. Kept minimal so these\n * helpers work with any `Column`/`Header` instance without dragging generics\n * through every call site.\n */\ntype ColumnLike = {\n id: string;\n columnDef: { header?: unknown; meta?: TMDataGridColumnMeta };\n /** Set on a leaf that sits inside a header group. */\n parent?: unknown;\n};\n\n/** Menu- and panel-facing column name. */\nexport function getColumnLabel(column: ColumnLike): string {\n const label = column.columnDef.meta?.label;\n if (label) return label;\n const header = column.columnDef.header;\n return typeof header === \"string\" ? header : column.id;\n}\n\nexport function getColumnType(column: ColumnLike): TMDataGridColumnType {\n return column.columnDef.meta?.type ?? \"string\";\n}\n\nexport function getColumnAlign(column: ColumnLike): \"left\" | \"right\" | \"center\" {\n return column.columnDef.meta?.align ?? \"left\";\n}\n\n/**\n * Whether a column may be moved. Ordering is the one column feature TanStack\n * has no column option for, so the switch lives in `meta.enableOrdering`.\n *\n * A leaf inside a header group is never movable: `columnOrder` sequences leaf\n * columns, so moving one out of its group would leave the group header spanning\n * columns that no longer belong to it.\n */\nexport function isColumnReorderable(column: ColumnLike): boolean {\n if (column.columnDef.meta?.enableOrdering === false) return false;\n return column.parent === undefined;\n}\n","import { Button, Checkbox, ScrollArea, Text, TextInput } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { useState } from \"react\";\nimport classes from \"./TMDataGridColumnsPanel.module.css\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getColumnLabel } from \"../core/columnUtils\";\nimport { SearchIcon } from \"./icons\";\n\n/**\n * The \"Manage columns\" surface. Reachable from every column header menu and\n * from the grid's burger menu, so it lives on its own and is rendered by\n * `TMDataGrid.ColumnsButton`.\n */\nexport function TMDataGridColumnsPanel() {\n const { table, controlSize } = useTMDataGridContext();\n const [search, setSearch] = useState(\"\");\n\n const columnVisibility = useSelector(\n table.store,\n (state) => state.columnVisibility,\n );\n\n const columns = table.getAllLeafColumns();\n const needle = search.trim().toLowerCase();\n const visibleInPanel = needle\n ? columns.filter((column) =>\n getColumnLabel(column).toLowerCase().includes(needle),\n )\n : columns;\n\n const hideableColumns = columns.filter((column) => column.getCanHide());\n const shownCount = hideableColumns.filter(\n (column) => columnVisibility[column.id] !== false,\n ).length;\n\n return (\n <div className={classes.columnsPanel}>\n <div className={classes.columnsPanelSearch}>\n <TextInput\n value={search}\n onChange={(event) => setSearch(event.currentTarget.value)}\n placeholder=\"Search\"\n leftSection={<SearchIcon size={16} stroke={1.6} />}\n size={controlSize}\n data-autofocus\n />\n </div>\n\n <ScrollArea.Autosize mah={260} type=\"auto\">\n <div className={classes.columnsPanelList}>\n {visibleInPanel.map((column) => (\n <Checkbox\n key={column.id}\n size={controlSize}\n label={getColumnLabel(column)}\n disabled={!column.getCanHide()}\n checked={columnVisibility[column.id] !== false}\n onChange={(event) =>\n column.toggleVisibility(event.currentTarget.checked)\n }\n />\n ))}\n {visibleInPanel.length === 0 && (\n <Text size={controlSize} c=\"dimmed\">\n No columns match “{search}”\n </Text>\n )}\n </div>\n </ScrollArea.Autosize>\n\n <div className={classes.columnsPanelFooter}>\n <Checkbox\n size={controlSize}\n label=\"Show/Hide All\"\n checked={shownCount === hideableColumns.length}\n indeterminate={shownCount > 0 && shownCount < hideableColumns.length}\n onChange={(event) =>\n table.toggleAllColumnsVisible(event.currentTarget.checked)\n }\n />\n <Button\n variant=\"subtle\"\n size=\"compact-sm\"\n onClick={() => table.resetColumnVisibility()}\n >\n RESET\n </Button>\n </div>\n </div>\n );\n}\n","/* Floats over the first body rows, anchored to `.tableWrapper`. Sits just\n below the header row, so its offset follows the size scale rather than a\n fixed pixel count. */\n.filterPanel {\n position: absolute;\n top: calc(var(--dg-header-height) + 2px);\n left: var(--mantine-spacing-md);\n z-index: 5;\n padding: var(--mantine-spacing-sm);\n border-radius: var(--mantine-radius-md);\n border: 1px solid var(--mantine-color-default-border);\n background-color: var(--mantine-color-body);\n box-shadow: var(--mantine-shadow-md);\n}\n\n.filterRow {\n display: flex;\n align-items: flex-end;\n gap: var(--mantine-spacing-xs);\n}\n","import type { Row, RowData, TableFeatures } from \"@tanstack/react-table\";\n\n/**\n * The value shape stored in `columnFilters` for every TMDataGrid column.\n *\n * TanStack resolves `filterFn` statically per column, so the operator travels\n * inside the filter *value* instead. That keeps the whole filter model plain,\n * serialisable JSON — which is what makes it portable to a server-side\n * `manualFiltering` table (just forward `columnFilters` to the API).\n */\nexport type TMDataGridFilterValue = {\n operator: TMDataGridFilterOperator;\n value: string;\n};\n\nexport type TMDataGridColumnType = \"string\" | \"number\";\n\nexport type TMDataGridFilterOperator =\n | \"contains\"\n | \"equals\"\n | \"notEquals\"\n | \"startsWith\"\n | \"endsWith\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"isEmpty\"\n | \"isNotEmpty\";\n\nexport const FILTER_OPERATOR_LABELS: Record<TMDataGridFilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n notEquals: \"does not equal\",\n startsWith: \"starts with\",\n endsWith: \"ends with\",\n greaterThan: \"is greater than\",\n greaterThanOrEqual: \"is greater than or equal to\",\n lessThan: \"is less than\",\n lessThanOrEqual: \"is less than or equal to\",\n isEmpty: \"is empty\",\n isNotEmpty: \"is not empty\",\n};\n\nconst STRING_OPERATORS: readonly TMDataGridFilterOperator[] = [\n \"contains\",\n \"equals\",\n \"notEquals\",\n \"startsWith\",\n \"endsWith\",\n \"isEmpty\",\n \"isNotEmpty\",\n];\n\nconst NUMBER_OPERATORS: readonly TMDataGridFilterOperator[] = [\n \"equals\",\n \"notEquals\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"isEmpty\",\n \"isNotEmpty\",\n];\n\n/** Operators that ignore the value input (the input is disabled for these). */\nconst VALUELESS_OPERATORS: readonly TMDataGridFilterOperator[] = [\n \"isEmpty\",\n \"isNotEmpty\",\n];\n\nexport function getOperatorsForType(\n type: TMDataGridColumnType,\n): readonly TMDataGridFilterOperator[] {\n return type === \"number\" ? NUMBER_OPERATORS : STRING_OPERATORS;\n}\n\nexport function getDefaultOperator(\n type: TMDataGridColumnType,\n): TMDataGridFilterOperator {\n return type === \"number\" ? \"equals\" : \"contains\";\n}\n\nexport function operatorNeedsValue(operator: TMDataGridFilterOperator): boolean {\n return !VALUELESS_OPERATORS.includes(operator);\n}\n\nexport function isTMDataGridFilterValue(\n value: unknown,\n): value is TMDataGridFilterValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"operator\" in value &&\n typeof (value as TMDataGridFilterValue).operator === \"string\"\n );\n}\n\n/**\n * A filter only narrows the row set once it has something to compare against.\n * Half-typed filters stay in state (so the panel keeps rendering their row) but\n * are treated as inactive for the funnel indicator and for row matching.\n */\nexport function isFilterActive(value: unknown): boolean {\n if (!isTMDataGridFilterValue(value)) return false;\n return !operatorNeedsValue(value.operator) || value.value.trim() !== \"\";\n}\n\nexport function matchesFilter(\n cellValue: unknown,\n { operator, value }: TMDataGridFilterValue,\n): boolean {\n if (operator === \"isEmpty\") {\n return cellValue === null || cellValue === undefined || cellValue === \"\";\n }\n if (operator === \"isNotEmpty\") {\n return cellValue !== null && cellValue !== undefined && cellValue !== \"\";\n }\n\n const filterText = value.trim();\n if (filterText === \"\") return true;\n\n const numericCell = typeof cellValue === \"number\" ? cellValue : Number.NaN;\n const numericFilter = Number(filterText);\n const compareNumeric =\n !Number.isNaN(numericCell) && !Number.isNaN(numericFilter);\n\n switch (operator) {\n case \"greaterThan\":\n return compareNumeric && numericCell > numericFilter;\n case \"greaterThanOrEqual\":\n return compareNumeric && numericCell >= numericFilter;\n case \"lessThan\":\n return compareNumeric && numericCell < numericFilter;\n case \"lessThanOrEqual\":\n return compareNumeric && numericCell <= numericFilter;\n default:\n break;\n }\n\n const cellText = String(cellValue ?? \"\").toLowerCase();\n const needle = filterText.toLowerCase();\n\n switch (operator) {\n case \"contains\":\n return cellText.includes(needle);\n case \"equals\":\n return compareNumeric ? numericCell === numericFilter : cellText === needle;\n case \"notEquals\":\n return compareNumeric ? numericCell !== numericFilter : cellText !== needle;\n case \"startsWith\":\n return cellText.startsWith(needle);\n case \"endsWith\":\n return cellText.endsWith(needle);\n default:\n return true;\n }\n}\n\n/**\n * The single filter function every TMDataGrid column uses. It dispatches on the\n * operator carried by the filter value, which is what lets one column offer\n * \"contains\" / \"does not equal\" / \"is empty\" without redefining the column.\n */\nexport function tmDataGridFilterFn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string, filterValue: unknown): boolean {\n if (!isTMDataGridFilterValue(filterValue)) return true;\n return matchesFilter(row.getValue(columnId), filterValue);\n}\n","import { ActionIcon, Button, Select, Stack, TextInput } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport classes from \"./TMDataGridFilterPanel.module.css\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getColumnLabel, getColumnType } from \"../core/columnUtils\";\nimport {\n type TMDataGridFilterOperator,\n type TMDataGridFilterValue,\n FILTER_OPERATOR_LABELS,\n getDefaultOperator,\n getOperatorsForType,\n isTMDataGridFilterValue,\n operatorNeedsValue,\n} from \"../core/filterOperators\";\nimport { CloseIcon } from \"./icons\";\n\nconst FALLBACK_FILTER: TMDataGridFilterValue = { operator: \"contains\", value: \"\" };\n\nfunction asFilterValue(value: unknown): TMDataGridFilterValue {\n return isTMDataGridFilterValue(value) ? value : FALLBACK_FILTER;\n}\n\n/**\n * The MUI-style filter surface: one row per active column filter, each row a\n * column / operator / value triple. It only ever reads and writes the table's\n * `columnFilters` state, so a `manualFiltering` grid gets the same panel for\n * free — the state is forwarded to the server instead of a row model.\n */\nexport function TMDataGridFilterPanel() {\n const { table, ui, controlSize } = useTMDataGridContext();\n const opened = useSelector(ui, (state) => state.filterPanelOpen);\n const columnFilters = useSelector(\n table.store,\n (state) => state.columnFilters,\n );\n\n if (!opened) return null;\n\n const filterableColumns = table\n .getAllLeafColumns()\n .filter((column) => column.getCanFilter());\n\n const columnOptions = filterableColumns.map((column) => ({\n value: column.id,\n label: getColumnLabel(column),\n }));\n\n function removeFilter(columnId: string) {\n const remaining = columnFilters.filter((filter) => filter.id !== columnId);\n table.setColumnFilters(remaining);\n if (remaining.length === 0) ui.actions.closeFilterPanel();\n }\n\n function changeFilterColumn(fromColumnId: string, toColumnId: string) {\n const current = asFilterValue(\n columnFilters.find((filter) => filter.id === fromColumnId)?.value,\n );\n const target = table.getColumn(toColumnId);\n table.setColumnFilters(\n columnFilters\n .filter((filter) => filter.id !== toColumnId)\n .map((filter) =>\n filter.id === fromColumnId\n ? {\n id: toColumnId,\n value: {\n operator: getDefaultOperator(\n target ? getColumnType(target) : \"string\",\n ),\n value: current.value,\n } satisfies TMDataGridFilterValue,\n }\n : filter,\n ),\n );\n ui.actions.openFilterPanel(toColumnId);\n }\n\n function patchFilter(columnId: string, patch: Partial<TMDataGridFilterValue>) {\n table.setColumnFilters(\n columnFilters.map((filter) =>\n filter.id === columnId\n ? { ...filter, value: { ...asFilterValue(filter.value), ...patch } }\n : filter,\n ),\n );\n }\n\n function addFilter() {\n const nextColumn = filterableColumns.find(\n (column) => !columnFilters.some((filter) => filter.id === column.id),\n );\n if (!nextColumn) return;\n table.setColumnFilters([\n ...columnFilters,\n {\n id: nextColumn.id,\n value: {\n operator: getDefaultOperator(getColumnType(nextColumn)),\n value: \"\",\n } satisfies TMDataGridFilterValue,\n },\n ]);\n }\n\n return (\n <div className={classes.filterPanel}>\n <Stack gap=\"xs\">\n {columnFilters.map((filter) => {\n const column = table.getColumn(filter.id);\n const value = asFilterValue(filter.value);\n const type = column ? getColumnType(column) : \"string\";\n const needsValue = operatorNeedsValue(value.operator);\n\n return (\n <div key={filter.id} className={classes.filterRow}>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"lg\"\n aria-label=\"Remove filter\"\n onClick={() => removeFilter(filter.id)}\n >\n <CloseIcon size={18} stroke={1.6} />\n </ActionIcon>\n\n <Select\n label=\"Column\"\n size={controlSize}\n w={160}\n allowDeselect={false}\n data={columnOptions}\n value={filter.id}\n onChange={(next) => next && changeFilterColumn(filter.id, next)}\n />\n\n <Select\n label=\"Operator\"\n size={controlSize}\n w={170}\n allowDeselect={false}\n data={getOperatorsForType(type).map((operator) => ({\n value: operator,\n label: FILTER_OPERATOR_LABELS[operator],\n }))}\n value={value.operator}\n onChange={(next) =>\n next &&\n patchFilter(filter.id, {\n operator: next as TMDataGridFilterOperator,\n })\n }\n />\n\n <TextInput\n label=\"Value\"\n size={controlSize}\n w={180}\n type={type === \"number\" && needsValue ? \"number\" : \"text\"}\n disabled={!needsValue}\n placeholder={needsValue ? \"Filter value\" : \"\"}\n value={needsValue ? value.value : \"\"}\n onChange={(event) =>\n patchFilter(filter.id, { value: event.currentTarget.value })\n }\n />\n </div>\n );\n })}\n\n <Button\n variant=\"subtle\"\n size=\"compact-sm\"\n style={{ alignSelf: \"flex-start\" }}\n onClick={addFilter}\n >\n Add filter\n </Button>\n </Stack>\n </div>\n );\n}\n",".footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--mantine-spacing-lg);\n padding: 4px var(--mantine-spacing-sm);\n min-height: 48px;\n flex-shrink: 0;\n border-top: 1px solid var(--mantine-color-default-border);\n}\n","import type { Column, RowData } from \"@tanstack/react-table\";\nimport type { TMDataGridRowData } from \"../TMDataGridContext\";\nimport { isColumnReorderable } from \"./columnUtils\";\nimport type {\n TMDataGridFeatures,\n TMDataGridTable,\n UseTMDataGridOptions,\n} from \"../useTMDataGrid\";\n\n/**\n * Table-level feature switches, read straight off the options object.\n *\n * Why not just call `column.getCanSort()` everywhere? Because that is a method\n * call on a `column` whose identity survives an options change, so the React\n * Compiler caches the result and the chrome keeps rendering for a feature that\n * was switched off. Reading the options into a fresh object each render gives\n * every derived value something that actually changes to invalidate on.\n *\n * TanStack still decides: these flags are combined with `getCanX()`, which is\n * what applies the per-column overrides.\n */\n/**\n * How rows are selected — see `rowSelectionMode` on {@link UseTMDataGridOptions}.\n */\nexport type TMDataGridRowSelectionMode = \"checkbox\" | \"row\";\n\nexport type TMDataGridFeatureFlags = {\n sorting: boolean;\n filtering: boolean;\n hiding: boolean;\n pinning: boolean;\n resizing: boolean;\n ordering: boolean;\n rowSelection: boolean;\n /** Only meaningful while `rowSelection` is on. Defaults to `\"checkbox\"`. */\n rowSelectionMode: TMDataGridRowSelectionMode;\n /** Whether a selected row takes the highlight colour. Follows the mode. */\n highlightSelectedRows: boolean;\n /**\n * The one default-off flag: pagination must be asked for, either with the\n * grid's `enablePagination` or implicitly by declaring `manualPagination`.\n * Off, the grid renders every filtered row and relies on virtualization.\n */\n pagination: boolean;\n};\n\nexport function readFeatureFlags<TData extends RowData>(\n options: Pick<\n UseTMDataGridOptions<TData>,\n | \"enableSorting\"\n | \"enableColumnFilters\"\n | \"enableHiding\"\n | \"enableColumnPinning\"\n | \"enableColumnResizing\"\n | \"enableColumnOrdering\"\n | \"enableRowSelection\"\n | \"rowSelectionMode\"\n | \"highlightSelectedRows\"\n | \"enablePagination\"\n | \"manualPagination\"\n >,\n): TMDataGridFeatureFlags {\n return {\n sorting: options.enableSorting !== false,\n filtering: options.enableColumnFilters !== false,\n hiding: options.enableHiding !== false,\n pinning: options.enableColumnPinning !== false,\n resizing: options.enableColumnResizing !== false,\n ordering: options.enableColumnOrdering !== false,\n rowSelection: options.enableRowSelection !== false,\n rowSelectionMode: options.rowSelectionMode ?? \"checkbox\",\n // In \"row\" mode the highlight *is* the feedback for a click, so it is on.\n // With checkboxes the box already says it, so it is off unless asked for.\n highlightSelectedRows:\n options.highlightSelectedRows ?? options.rowSelectionMode === \"row\",\n pagination:\n options.enablePagination === true || options.manualPagination === true,\n };\n}\n\n/**\n * What one column's header may offer.\n *\n * | Affordance | Turned off by |\n * | ---------- | ------------- |\n * | Sort arrow, Sort ASC/DESC | `enableSorting` (table or column) |\n * | Filter item, panel entry | `enableColumnFilters` / `enableColumnFilter` |\n * | Hide column | `enableHiding` (table or column) |\n * | Pin to left / right | `enableColumnPinning` / `enablePinning` |\n * | Resize dragging | `enableColumnResizing` / `enableResizing` |\n * | Header dragging, Move left / right | `enableColumnOrdering` / `meta.enableOrdering` |\n */\nexport type TMDataGridColumnCapabilities = {\n canSort: boolean;\n canFilter: boolean;\n canHide: boolean;\n canPin: boolean;\n canResize: boolean;\n canReorder: boolean;\n};\n\nexport function getColumnCapabilities(\n column: Column<TMDataGridFeatures, TMDataGridRowData, unknown>,\n features: TMDataGridFeatureFlags,\n): TMDataGridColumnCapabilities {\n return {\n canSort: features.sorting && column.getCanSort(),\n canFilter: features.filtering && column.getCanFilter(),\n canHide: features.hiding && column.getCanHide(),\n canPin: features.pinning && column.getCanPin(),\n canResize: features.resizing && column.getCanResize(),\n // Ordering has no TanStack capability method — see isColumnReorderable.\n canReorder: features.ordering && isColumnReorderable(column),\n };\n}\n\n/** The same questions, asked of the whole grid — used to hide toolbar buttons. */\nexport type TMDataGridCapabilities = {\n canSortAny: boolean;\n canFilterAny: boolean;\n canHideAny: boolean;\n canPinAny: boolean;\n canReorderAny: boolean;\n canSelectRows: boolean;\n canPaginate: boolean;\n};\n\nexport function getGridCapabilities(\n table: TMDataGridTable<TMDataGridRowData>,\n features: TMDataGridFeatureFlags,\n): TMDataGridCapabilities {\n const columns = table.getAllLeafColumns();\n const any = (predicate: (capabilities: TMDataGridColumnCapabilities) => boolean) =>\n columns.some((column) => predicate(getColumnCapabilities(column, features)));\n\n return {\n canSortAny: any((c) => c.canSort),\n canFilterAny: any((c) => c.canFilter),\n canHideAny: any((c) => c.canHide),\n canPinAny: any((c) => c.canPin),\n canReorderAny: any((c) => c.canReorder),\n canSelectRows: features.rowSelection,\n canPaginate: features.pagination,\n };\n}\n","import { ActionIcon, Group, Select, Text } from \"@mantine/core\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport type { ReactNode } from \"react\";\nimport classes from \"./TMDataGridFooter.module.css\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getGridCapabilities } from \"../core/capabilities\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"./icons\";\nimport type { TMDataGridTable } from \"../useTMDataGrid\";\n\n/** Distilled pagination state and actions for building a custom pager. */\nexport type TMDataGridPaginationApi = {\n pageIndex: number;\n pageSize: number;\n /** `-1` when a manual grid declares `pageCount: -1` (unknown total). */\n pageCount: number;\n rowCount: number;\n canPreviousPage: boolean;\n canNextPage: boolean;\n setPageIndex: (pageIndex: number) => void;\n setPageSize: (pageSize: number) => void;\n previousPage: () => void;\n nextPage: () => void;\n firstPage: () => void;\n lastPage: () => void;\n};\n\n/**\n * Reads {@link TMDataGridPaginationApi} off a table. The Footer feeds it to the\n * `pagination` render prop; a pager living outside the Footer can call it with\n * the table from `useTMDataGrid` directly.\n */\nexport function getTMDataGridPaginationApi<TData extends RowData>(\n table: TMDataGridTable<TData>,\n): TMDataGridPaginationApi {\n const { pageIndex, pageSize } = table.store.state.pagination;\n return {\n pageIndex,\n pageSize,\n pageCount: table.getPageCount(),\n rowCount: table.getRowCount(),\n canPreviousPage: table.getCanPreviousPage(),\n canNextPage: table.getCanNextPage(),\n setPageIndex: (index) => table.setPageIndex(index),\n setPageSize: (size) => table.setPageSize(size),\n previousPage: () => table.previousPage(),\n nextPage: () => table.nextPage(),\n firstPage: () => table.firstPage(),\n lastPage: () => table.lastPage(),\n };\n}\n\nexport type TMDataGridFooterProps = {\n pageSizeOptions?: ReadonlyArray<number>;\n /** Replaces the built-in pager. Receives the distilled pagination API. */\n pagination?: (api: TMDataGridPaginationApi) => ReactNode;\n};\n\n/**\n * MUI-style pager: \"Rows per page · from–to of total · ‹ ›\".\n *\n * Renders nothing unless pagination is enabled (`enablePagination` or\n * `manualPagination`) — the footer is a pager; extra footer content belongs in\n * your own layout.\n *\n * Row totals come from `table.getRowCount()`, which prefers `options.rowCount`\n * — so a server-paged grid shows the server's total without changes here.\n */\nexport function TMDataGridFooter({\n pageSizeOptions = [10, 25, 50, 100],\n pagination,\n}: TMDataGridFooterProps) {\n const { table, features, controlSize } = useTMDataGridContext();\n useSelector(table.store);\n\n if (!getGridCapabilities(table, features).canPaginate) return null;\n\n if (pagination) {\n return (\n <div className={classes.footer}>\n {pagination(getTMDataGridPaginationApi(table))}\n </div>\n );\n }\n\n const { pageIndex, pageSize } = table.store.state.pagination;\n const total = table.getRowCount();\n const from = total === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min(total, (pageIndex + 1) * pageSize);\n // A page size restored from storage, or set through `initialState`, need not\n // be one of the offered sizes. Without it in the list the Select renders\n // blank, so the current size is folded in rather than shown as nothing.\n const sizeOptions = pageSizeOptions.includes(pageSize)\n ? pageSizeOptions\n : [...pageSizeOptions, pageSize].sort((a, b) => a - b);\n\n return (\n <div className={classes.footer}>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <Text size={controlSize} c=\"dimmed\">\n Rows per page:\n </Text>\n <Select\n size={controlSize}\n w={78}\n allowDeselect={false}\n variant=\"unstyled\"\n data={sizeOptions.map(String)}\n value={String(pageSize)}\n onChange={(value) => {\n table.setPageSize(Number(value) || pageSizeOptions[0]);\n table.setPageIndex(0);\n }}\n />\n </Group>\n\n <Text size={controlSize} c=\"dimmed\">\n {from}–{to} of {total}\n </Text>\n\n <Group gap={4} wrap=\"nowrap\">\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n aria-label=\"Previous page\"\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n >\n <ChevronLeftIcon size={18} stroke={1.6} />\n </ActionIcon>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n aria-label=\"Next page\"\n disabled={!table.getCanNextPage()}\n onClick={() => table.nextPage()}\n >\n <ChevronRightIcon size={18} stroke={1.6} />\n </ActionIcon>\n </Group>\n </div>\n );\n}\n","/* Anchors the filter panel, which floats over the first body rows. */\n.tableWrapper {\n position: relative;\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.scrollContainer {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n\n/* Column tracks are set inline via gridTemplateColumns. */\n.grid {\n display: grid;\n}\n\n/* Rows are real layout boxes (not display: contents) so position: sticky works,\n and subgrid keeps their cells on the parent's column tracks. */\n.headerRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: subgrid;\n position: sticky;\n top: 0;\n z-index: 3;\n}\n\n.bodyRow {\n --row-bg: var(--mantine-color-body);\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: subgrid;\n align-items: stretch;\n}\n\n.bodyRow:hover {\n --row-bg: var(--mantine-color-default-hover);\n}\n\n/* Selection and highlight are separate: a row is always `data-selected`, but it\n only takes the highlight colour when `highlightSelectedRows` is on — the\n default in row selection mode, off with checkboxes. */\n.bodyRow[data-highlighted=\"true\"] {\n --row-bg: var(--dg-row-selected-bg);\n}\n\n/* Row selection mode: the row is the control, so it takes focus and must not\n start a text selection on the click that toggles it. */\n.bodyRow[data-selects-on-click=\"true\"] {\n user-select: none;\n}\n\n.bodyRow:focus-visible {\n outline: 2px solid var(--mantine-primary-color-filled);\n outline-offset: -2px;\n}\n\n/* Clipping lives on .cellContent, not here — a pinned cell has to let its\n boundary gradient escape past its own right/left edge. */\n.bodyCell {\n display: flex;\n align-items: center;\n padding: 0 var(--dg-padding);\n border-bottom: 1px solid var(--mantine-color-default-border);\n /* Inherited from .bodyRow — sticky cells need an opaque background. */\n background-color: var(--row-bg);\n font-size: var(--dg-font-size);\n}\n\n.cellContent {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.bodyCell[data-align=\"right\"] {\n justify-content: flex-end;\n}\n\n.bodyCell[data-align=\"center\"] {\n justify-content: center;\n}\n\n/* Only stretch to fill when left-aligned, so right/centre stay put. */\n.bodyCell[data-align=\"left\"] .cellContent {\n flex: 1 1 auto;\n}\n\n.messageRow {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--mantine-spacing-xs);\n padding: var(--mantine-spacing-xl);\n}\n","/* Boundary of a pinned column group. Shared, because the edge is cast by both\n the header cell and every body cell in the same column — the two have to\n draw an identical band or the seam shows at the header.\n\n A box-shadow is drawn per cell, and its blur fades in at each cell's own top\n and bottom edge — stacked down a column that reads as banding at every row\n seam. Instead: a crisp 1px border for the hard edge, plus a gradient pseudo\n element pinned to `top: 0; bottom: 0` so consecutive cells butt together into\n one unbroken band. Mantine sets `color-scheme` on the root, so light-dark()\n resolves without a second selector. */\n.stickyLeft {\n border-right: 1px solid var(--mantine-color-default-border);\n}\n\n.stickyRight {\n border-left: 1px solid var(--mantine-color-default-border);\n}\n\n.stickyLeft::after,\n.stickyRight::after {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: 4px;\n pointer-events: none;\n}\n\n.stickyLeft::after {\n left: 100%;\n background: linear-gradient(\n to right,\n light-dark(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.28)),\n transparent\n );\n}\n\n.stickyRight::after {\n right: 100%;\n background: linear-gradient(\n to left,\n light-dark(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.28)),\n transparent\n );\n}\n",".headerCell {\n position: relative;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 0 var(--dg-padding);\n min-width: 0;\n min-height: var(--dg-header-height);\n font-weight: 600;\n font-size: var(--dg-font-size);\n background-color: var(--mantine-color-body);\n border-bottom: 1px solid var(--mantine-color-default-border);\n user-select: none;\n}\n\n.headerCell[data-align=\"right\"] {\n justify-content: flex-end;\n}\n\n.headerCell[data-align=\"center\"] {\n justify-content: center;\n}\n\n/* Sorted or filtered columns read as active, like the MUI data grid. */\n.headerCell[data-active=\"true\"] .headerTitle {\n color: var(--mantine-primary-color-filled);\n}\n\n.headerTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Right-aligned headers stay text so the ellipsis still works; centered ones\n hold a control (the select-all checkbox), so they become a flex box. */\n.headerCell[data-align=\"right\"] .headerTitle {\n text-align: right;\n}\n\n.headerCell[data-align=\"center\"] .headerTitle {\n display: flex;\n justify-content: center;\n}\n\n.headerActions {\n display: flex;\n align-items: center;\n gap: 0;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n/* Actions always reserve their width. On right-aligned columns they move to the\n leading edge so the header text stays flush with the cell values below it. */\n.headerCell[data-align=\"right\"] .headerActions {\n order: -1;\n margin-left: 0;\n margin-right: auto;\n}\n\n/* Idle actions are removed from layout, not just faded — reserving their width\n would truncate header text that otherwise fits. Indicators that must stay\n visible (active sort, active filter, open menu) set data-pinned-visible. */\n.headerAction {\n display: none;\n}\n\n.headerCell:hover .headerAction,\n.headerCell:focus-within .headerAction,\n.headerAction[data-pinned-visible=\"true\"] {\n display: flex;\n}\n\n.headerCellSortable {\n cursor: pointer;\n}\n\n/* Column reordering. The dragged header stays in place and dims — the browser\n already carries a snapshot of it under the pointer — while the header being\n dragged over draws a bar on the edge the column will land against. */\n.headerCellDragging {\n opacity: 0.4;\n}\n\n.headerCellDropBefore::before,\n.headerCellDropAfter::before {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background-color: var(--mantine-primary-color-filled);\n z-index: 5;\n pointer-events: none;\n}\n\n.headerCellDropBefore::before {\n left: 0;\n}\n\n.headerCellDropAfter::before {\n right: 0;\n}\n\n/* Doubles as the column divider seen between every header cell. */\n.columnSeparator {\n position: absolute;\n top: 25%;\n right: 0;\n height: 50%;\n width: 10px;\n transform: translateX(50%);\n display: flex;\n justify-content: center;\n z-index: 1;\n}\n\n.columnSeparatorResizable {\n cursor: col-resize;\n touch-action: none;\n}\n\n/* The divider is a hover affordance, not permanent chrome — it only appears on\n the header cell you are pointing at, or on the column being resized. */\n.columnSeparator::after {\n content: \"\";\n width: 1px;\n height: 100%;\n background-color: transparent;\n transition:\n background-color 120ms ease,\n width 120ms ease;\n}\n\n.headerCell:hover .columnSeparator::after,\n.headerCell:focus-within .columnSeparator::after {\n background-color: var(--mantine-color-default-border);\n}\n\n.columnSeparatorResizable:hover::after,\n.columnSeparatorActive::after {\n width: 2px;\n background-color: var(--mantine-primary-color-filled);\n}\n\n/* Marks the pin position a column is currently in. */\n.menuItemActive {\n background-color: var(--mantine-color-default-hover);\n font-weight: 600;\n}\n","import type { Column, ColumnPinningState } from \"@tanstack/react-table\";\nimport type { TMDataGridRowData } from \"../TMDataGridContext\";\nimport { isColumnReorderable } from \"./columnUtils\";\nimport type { TMDataGridFeatures, TMDataGridTable } from \"../useTMDataGrid\";\n\ntype GridColumn = Column<TMDataGridFeatures, TMDataGridRowData, unknown>;\ntype GridTable = TMDataGridTable<TMDataGridRowData>;\n\n/**\n * The lane a column renders in.\n *\n * Pinning splits the grid into three, and TanStack sequences them from two\n * different state slices: `columnPinning.left` / `.right` order the pinned\n * lanes, `columnOrder` orders the centre. A move therefore always stays inside\n * one lane — moving a column into another one would be a pin, not a reorder.\n */\nexport type TMDataGridColumnRegion = \"left\" | \"center\" | \"right\";\n\n/** Which edge of the column under the pointer a dragged column lands on. */\nexport type TMDataGridDropSide = \"before\" | \"after\";\n\nexport function getColumnRegion(\n columnPinning: ColumnPinningState,\n columnId: string,\n): TMDataGridColumnRegion {\n if (columnPinning.left.includes(columnId)) return \"left\";\n if (columnPinning.right.includes(columnId)) return \"right\";\n return \"center\";\n}\n\n/** Moves one id next to another, leaving every other id in place. */\nfunction moveInList(\n ids: ReadonlyArray<string>,\n movedId: string,\n targetId: string,\n side: TMDataGridDropSide,\n): Array<string> {\n const remaining = ids.filter((id) => id !== movedId);\n const targetIndex = remaining.indexOf(targetId);\n if (targetIndex === -1) return [...ids];\n remaining.splice(side === \"before\" ? targetIndex : targetIndex + 1, 0, movedId);\n return remaining;\n}\n\nexport type MoveColumnArgs = {\n table: GridTable;\n /** Column being moved. */\n columnId: string;\n /** Column it was dropped on. */\n targetId: string;\n side: TMDataGridDropSide;\n};\n\n/**\n * Moves a column next to another one. A no-op when the two are in different\n * pinned regions, or when either id is unknown.\n *\n * `columnOrder` is always written as the full leaf order, including hidden and\n * pinned columns, so a column keeps its place when it is later shown or\n * unpinned. Pinned lanes are read from `columnPinning`, so a move inside one\n * updates that array as well.\n */\nexport function moveColumn({\n table,\n columnId,\n targetId,\n side,\n}: MoveColumnArgs): void {\n if (columnId === targetId) return;\n\n const columnPinning = table.store.state.columnPinning;\n const region = getColumnRegion(columnPinning, columnId);\n if (region !== getColumnRegion(columnPinning, targetId)) return;\n\n const leafIds = table.getAllLeafColumns().map((column) => column.id);\n table.setColumnOrder(moveInList(leafIds, columnId, targetId, side));\n\n if (region !== \"center\") {\n table.setColumnPinning((previous) => ({\n ...previous,\n [region]: moveInList(previous[region], columnId, targetId, side),\n }));\n }\n}\n\n/** Visible leaf columns of one lane, in the order they render. */\nfunction getRegionColumns(\n table: GridTable,\n region: TMDataGridColumnRegion,\n): Array<GridColumn> {\n if (region === \"left\") return table.getLeftVisibleLeafColumns();\n if (region === \"right\") return table.getRightVisibleLeafColumns();\n return table.getCenterVisibleLeafColumns();\n}\n\nexport type ColumnStepArgs = {\n table: GridTable;\n columnId: string;\n /** `-1` moves towards the start of the lane, `1` towards its end. */\n direction: -1 | 1;\n};\n\n/**\n * The column a single step would swap with, or `null` when there is none.\n *\n * A neighbour that cannot be reordered acts as a wall rather than being skipped\n * — that is what keeps the checkbox column anchored at the start of the left\n * lane. Use it to enable or disable a \"move\" control.\n */\nexport function getStepTargetColumn({\n table,\n columnId,\n direction,\n}: ColumnStepArgs): GridColumn | null {\n const region = getColumnRegion(table.store.state.columnPinning, columnId);\n const columns = getRegionColumns(table, region);\n const index = columns.findIndex((column) => column.id === columnId);\n if (index === -1) return null;\n\n const target = columns[index + direction];\n if (!target || !isColumnReorderable(target)) return null;\n return target;\n}\n\n/** Moves a column one position within its lane. Hidden columns are stepped over. */\nexport function moveColumnByStep({\n table,\n columnId,\n direction,\n}: ColumnStepArgs): void {\n const target = getStepTargetColumn({ table, columnId, direction });\n if (!target) return;\n\n moveColumn({\n table,\n columnId,\n targetId: target.id,\n side: direction === -1 ? \"before\" : \"after\",\n });\n}\n","import { Checkbox } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport type { ColumnDef, Row, RowData } from \"@tanstack/react-table\";\nimport type { TMDataGridFeatures, TMDataGridTable } from \"../useTMDataGrid\";\n\nexport const SELECT_COLUMN_ID = \"__select__\";\n\n/**\n * Both checkboxes subscribe to the table store themselves rather than reading\n * the selection off the render they were handed.\n *\n * A cell is rendered by `flexRender`, which mounts the cell function as its own\n * component — but the body cell above it keeps the same props across a\n * selection change (row, column and layout identities all survive it), so the\n * React Compiler reuses the memoized element and the subtree never re-renders.\n * The row highlight would update, from state `TMDataGridTable` subscribes to,\n * while the box below it stayed unchecked.\n *\n * Selection is derived inside the selector, not from a method call in the\n * component body, for the same reason: `table` and `row` identities survive the\n * change, so a call in the body would be cached along with them.\n */\nfunction SelectAllCheckbox<TData extends RowData>({\n table,\n}: {\n table: TMDataGridTable<TData>;\n}) {\n const allSelected = useSelector(table.store, () =>\n table.getIsAllRowsSelected(),\n );\n const someSelected = useSelector(table.store, () =>\n table.getIsSomeRowsSelected(),\n );\n\n return (\n <Checkbox\n size=\"xs\"\n aria-label=\"Select all rows\"\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={table.getToggleAllRowsSelectedHandler()}\n />\n );\n}\n\nfunction SelectRowCheckbox<TData extends RowData>({\n row,\n}: {\n row: Row<TMDataGridFeatures, TData>;\n}) {\n const selected = useSelector(row.table.store, () => row.getIsSelected());\n const someSelected = useSelector(row.table.store, () =>\n row.getIsSomeSelected(),\n );\n\n return (\n <Checkbox\n size=\"xs\"\n aria-label=\"Select row\"\n checked={selected}\n disabled={!row.getCanSelect()}\n indeterminate={someSelected && !selected}\n onChange={row.getToggleSelectedHandler()}\n // A row can select on click too; the checkbox must not toggle twice.\n onClick={(event) => event.stopPropagation()}\n />\n );\n}\n\n/**\n * The generated checkbox column, prepended under\n * `rowSelectionMode: \"checkbox\"` — the default whenever row selection is on.\n */\nexport function createSelectColumn<TData extends RowData>(): ColumnDef<\n TMDataGridFeatures,\n TData,\n unknown\n> {\n return {\n id: SELECT_COLUMN_ID,\n meta: {\n label: \"Checkbox selection\",\n align: \"center\",\n // Structurally the first column; it also anchors the left pinned lane, so\n // no other column can be moved in front of it.\n enableOrdering: false,\n },\n size: 48,\n minSize: 48,\n maxSize: 48,\n enableResizing: false,\n enableSorting: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n // Structurally pinned to the left; users shouldn't be able to move it.\n enablePinning: false,\n header: ({ table }) => <SelectAllCheckbox table={table} />,\n cell: ({ row }) => <SelectRowCheckbox row={row} />,\n };\n}\n","import type { TableState } from \"@tanstack/react-table\";\nimport type { TMDataGridFeatures } from \"../useTMDataGrid\";\n\ntype GridState = TableState<TMDataGridFeatures>;\n\n/**\n * Persistence deliberately does not use Mantine's `useLocalStorage`.\n *\n * That hook owns a piece of state and returns `[value, setValue]`. Here the\n * table already owns the state and storage only mirrors it, so routing writes\n * through the hook would keep a second copy and trigger a React state update on\n * every change, including every pointer move during a column resize. Its\n * defaults also work against this use: `getInitialValueInEffect: true` delivers\n * the stored value after mount, while `initialState` is only read on the first\n * render, and `sync: true` would let two open tabs overwrite each other's\n * column layout.\n *\n * The option vocabulary follows Mantine's: `StorageType` is its type, and\n * `serialize` / `deserialize` behave as they do in `UseStorageOptions`.\n */\n\n/**\n * State slices describing what the user is looking at. Derived from the data,\n * so they can go stale as it changes.\n */\nexport const DATA_STATE_SLICES = [\n \"columnFilters\",\n \"globalFilter\",\n \"sorting\",\n \"pagination\",\n] as const satisfies ReadonlyArray<keyof GridState>;\n\n/**\n * State slices describing how the user configured the grid. Independent of the\n * data, and the ones users notice losing.\n */\nexport const SETTINGS_STATE_SLICES = [\n \"columnVisibility\",\n \"columnSizing\",\n \"columnOrder\",\n \"columnPinning\",\n] as const satisfies ReadonlyArray<keyof GridState>;\n\nexport type TMDataGridDataSlice = (typeof DATA_STATE_SLICES)[number];\nexport type TMDataGridSettingsSlice = (typeof SETTINGS_STATE_SLICES)[number];\n\n/**\n * A storage key, optionally narrowed to a subset of its group's slices.\n *\n * - `\"employees.data\"` — persists every slice in the group.\n * - `[\"employees.data\", [\"sorting\"]]` — persists only the listed slices.\n */\nexport type TMDataGridPersistKey<TSlice extends string> =\n | string\n | readonly [key: string, slices: readonly TSlice[]];\n\n/** Same values as Mantine's `StorageType`, which the package does not re-export. */\nexport type TMDataGridStorageMode = \"localStorage\" | \"sessionStorage\";\n\nexport type TMDataGridPersistence = {\n /** Key for filters, global filter, sorting and pagination. */\n dataKey?: TMDataGridPersistKey<TMDataGridDataSlice>;\n /** Key for column visibility, sizing, order and pinning. */\n settingsKey?: TMDataGridPersistKey<TMDataGridSettingsSlice>;\n /** Which storage area to use. Defaults to `\"localStorage\"`. */\n storageMode?: TMDataGridStorageMode;\n /** Serializes a payload before it is stored. Defaults to `JSON.stringify`. */\n serialize?: (value: Partial<GridState>) => string;\n /** Parses a stored payload. Defaults to `JSON.parse`. */\n deserialize?: (value: string) => unknown;\n};\n\ntype ResolvedKey = { key: string; slices: ReadonlyArray<keyof GridState> };\n\nfunction resolveKey<TSlice extends string>(\n entry: TMDataGridPersistKey<TSlice> | undefined,\n defaultSlices: ReadonlyArray<keyof GridState>,\n): ResolvedKey | null {\n if (!entry) return null;\n if (typeof entry === \"string\") return { key: entry, slices: defaultSlices };\n\n const [key, slices] = entry;\n if (!key) return null;\n // An empty list means nothing was selected, which is not the same as \"all\".\n return { key, slices: slices as ReadonlyArray<keyof GridState> };\n}\n\nfunction resolveStorage(\n persistence: TMDataGridPersistence | undefined,\n): Storage | null {\n if (!persistence) return null;\n // Absent under SSR, and access throws outright in some privacy modes.\n try {\n if (typeof window === \"undefined\") return null;\n return persistence.storageMode === \"sessionStorage\"\n ? window.sessionStorage\n : window.localStorage;\n } catch {\n return null;\n }\n}\n\n/**\n * Shape guards for restored state.\n *\n * A stored payload outlives the code that wrote it: a slice can change shape\n * between releases, and nothing stops anyone from editing storage by hand. The\n * value goes straight into `initialState`, where a wrong shape surfaces as a\n * crash inside TanStack rather than as a bad read here. A slice that fails its\n * guard is dropped; the rest still restore.\n */\nfunction prop(value: unknown, key: string): unknown {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\n\nconst isFiniteNumber = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nfunction isArrayOf(\n value: unknown,\n isItem: (item: unknown) => boolean,\n): boolean {\n return Array.isArray(value) && value.every(isItem);\n}\n\nfunction isRecordOf(\n value: unknown,\n isItem: (item: unknown) => boolean,\n): boolean {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n return Object.values(value).every(isItem);\n}\n\nconst hasStringId = (entry: unknown): boolean => isString(prop(entry, \"id\"));\n\nconst SLICE_GUARDS: Record<\n TMDataGridDataSlice | TMDataGridSettingsSlice,\n (value: unknown) => boolean\n> = {\n columnFilters: (value) => isArrayOf(value, hasStringId),\n // TanStack leaves the global filter value untyped — the grid's own default\n // filters on a string, but a consumer may store anything here.\n globalFilter: () => true,\n sorting: (value) =>\n isArrayOf(\n value,\n (entry) => hasStringId(entry) && typeof prop(entry, \"desc\") === \"boolean\",\n ),\n pagination: (value) => {\n const pageIndex = prop(value, \"pageIndex\");\n const pageSize = prop(value, \"pageSize\");\n return (\n isFiniteNumber(pageIndex) &&\n pageIndex >= 0 &&\n isFiniteNumber(pageSize) &&\n pageSize > 0\n );\n },\n columnVisibility: (value) =>\n isRecordOf(value, (entry) => typeof entry === \"boolean\"),\n columnSizing: (value) => isRecordOf(value, isFiniteNumber),\n columnOrder: (value) => isArrayOf(value, isString),\n columnPinning: (value) =>\n isArrayOf(prop(value, \"left\"), isString) &&\n isArrayOf(prop(value, \"right\"), isString),\n};\n\nfunction isValidSlice(slice: keyof GridState, value: unknown): boolean {\n const guard = SLICE_GUARDS[slice as keyof typeof SLICE_GUARDS];\n return guard === undefined || guard(value);\n}\n\nfunction readSlices(\n storage: Storage | null,\n resolved: ResolvedKey | null,\n deserialize: (value: string) => unknown,\n): Partial<GridState> {\n if (!storage || !resolved) return {};\n try {\n const raw = storage.getItem(resolved.key);\n if (!raw) return {};\n const parsed = deserialize(raw);\n if (typeof parsed !== \"object\" || parsed === null) return {};\n\n const record = parsed as Record<string, unknown>;\n const restored: Record<string, unknown> = {};\n // Only copy the selected slices. A payload written before the selection was\n // narrowed cannot reintroduce slices the caller has since opted out of.\n for (const slice of resolved.slices) {\n if (!(slice in record)) continue;\n if (!isValidSlice(slice, record[slice])) continue;\n restored[slice] = record[slice];\n }\n return restored as Partial<GridState>;\n } catch {\n return {};\n }\n}\n\nfunction writeSlices(\n storage: Storage | null,\n resolved: ResolvedKey | null,\n state: GridState,\n serialize: (value: Partial<GridState>) => string,\n): void {\n if (!storage || !resolved) return;\n const payload: Record<string, unknown> = {};\n for (const slice of resolved.slices) payload[slice] = state[slice];\n try {\n storage.setItem(resolved.key, serialize(payload as Partial<GridState>));\n } catch {\n // Quota exceeded or storage disabled. Persistence is best effort.\n }\n}\n\nfunction resolveKeys(persistence: TMDataGridPersistence | undefined) {\n return {\n data: resolveKey(persistence?.dataKey, DATA_STATE_SLICES),\n settings: resolveKey(persistence?.settingsKey, SETTINGS_STATE_SLICES),\n };\n}\n\n/** True when at least one key is configured. */\nexport function hasPersistenceKeys(\n persistence: TMDataGridPersistence | undefined,\n): boolean {\n const { data, settings } = resolveKeys(persistence);\n return data !== null || settings !== null;\n}\n\nconst defaultDeserialize = (value: string): unknown => JSON.parse(value);\nconst defaultSerialize = (value: Partial<GridState>): string =>\n JSON.stringify(value);\n\n/** State to merge into `initialState`, read once on mount. */\nexport function readPersistedState(\n persistence?: TMDataGridPersistence,\n): Partial<GridState> {\n const storage = resolveStorage(persistence);\n const { data, settings } = resolveKeys(persistence);\n const deserialize = persistence?.deserialize ?? defaultDeserialize;\n return {\n ...readSlices(storage, settings, deserialize),\n ...readSlices(storage, data, deserialize),\n };\n}\n\n/** Writes both payloads. Called on every table state change. */\nexport function writePersistedState(\n state: GridState,\n persistence?: TMDataGridPersistence,\n): void {\n const storage = resolveStorage(persistence);\n if (!storage) return;\n const { data, settings } = resolveKeys(persistence);\n const serialize = persistence?.serialize ?? defaultSerialize;\n writeSlices(storage, data, state, serialize);\n writeSlices(storage, settings, state, serialize);\n}\n","import { useCreateStore } from \"@tanstack/react-store\";\nimport {\n type ColumnDef,\n columnFacetingFeature,\n columnFilteringFeature,\n columnOrderingFeature,\n columnPinningFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n createColumnHelper,\n createFacetedMinMaxValues,\n createFacetedRowModel,\n createFacetedUniqueValues,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFns,\n globalFilteringFeature,\n metaHelper,\n type RowData,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n sortFns,\n type Table,\n tableFeatures,\n type TableOptions,\n type TableState,\n useTable,\n} from \"@tanstack/react-table\";\nimport type { Store } from \"@tanstack/store\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n type TMDataGridColumnType,\n tmDataGridFilterFn,\n getDefaultOperator,\n} from \"./core/filterOperators\";\nimport {\n hasPersistenceKeys,\n readPersistedState,\n type TMDataGridPersistence,\n writePersistedState,\n} from \"./core/persistence\";\nimport {\n readFeatureFlags,\n type TMDataGridFeatureFlags,\n type TMDataGridRowSelectionMode,\n} from \"./core/capabilities\";\nimport {\n createSelectColumn,\n SELECT_COLUMN_ID,\n} from \"./components/TMDataGridSelectColumn\";\n\n/**\n * How long the grid waits after the last state change before writing to\n * storage. Long enough to collapse a resize drag into one write, short enough\n * that a reload right after a change still sees it.\n */\nconst PERSIST_DEBOUNCE_MS = 200;\n\n/** Per-column configuration the TMDataGrid chrome reads. */\nexport type TMDataGridColumnMeta = {\n /** Name shown in menus and the column manager. Falls back to a string header. */\n label?: string;\n /** Drives which filter operators are offered. Defaults to `\"string\"`. */\n type?: TMDataGridColumnType;\n /** Share of the leftover width this column claims. Defaults to `1`. */\n flex?: number;\n align?: \"left\" | \"right\" | \"center\";\n /**\n * `false` keeps the column where it is: no header dragging, no move items.\n * Column ordering is the one feature TanStack defines no column option for,\n * so its switch lives here rather than on the column definition.\n */\n enableOrdering?: boolean;\n};\n\n/** Grid-wide configuration passed through `options.meta`. */\nexport type TMDataGridTableMeta = {\n loading?: boolean;\n noResultsLabel?: string;\n /** Row height used by the virtualizer. Defaults to `52`. */\n rowHeight?: number;\n /**\n * Unfiltered row total. Only needed for server-driven grids, where the client\n * never holds the full data set — `TMDataGrid.SummaryCount` uses it as denominator.\n */\n totalRowCount?: number;\n};\n\n/**\n * Every feature the TMDataGrid chrome can drive. Defined at module scope so the\n * reference stays stable across renders (see the TanStack table-state skill).\n */\nexport const tmDataGridFeatures = tableFeatures({\n columnFilteringFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n columnPinningFeature,\n columnVisibilityFeature,\n columnOrderingFeature,\n columnSizingFeature,\n columnResizingFeature,\n columnFacetingFeature,\n\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n facetedRowModel: createFacetedRowModel(),\n facetedMinMaxValues: createFacetedMinMaxValues(),\n facetedUniqueValues: createFacetedUniqueValues(),\n\n filterFns: { ...filterFns, tmDataGrid: tmDataGridFilterFn },\n sortFns,\n\n tableMeta: metaHelper<TMDataGridTableMeta>(),\n columnMeta: metaHelper<TMDataGridColumnMeta>(),\n});\n\nexport type TMDataGridFeatures = typeof tmDataGridFeatures;\n\nexport type TMDataGridTable<TData extends RowData> = Table<\n TMDataGridFeatures,\n TData\n>;\n\nexport function createTMDataGridColumnHelper<TData extends RowData>() {\n return createColumnHelper<TMDataGridFeatures, TData>();\n}\n\n/**\n * Chrome state that is *not* table state: which panels are open, and which\n * column opened the filter panel. Kept in a TanStack Store so consumers can\n * subscribe to it the same way they subscribe to `table.store`.\n */\nexport type TMDataGridUiState = {\n filterPanelOpen: boolean;\n columnsPanelOpen: boolean;\n /** Column whose filter row should be focused when the panel opens. */\n filterPanelColumnId: string | null;\n /**\n * Column being dragged by its header, if any. Held here rather than read from\n * `dataTransfer`, which browsers keep unreadable until the drop.\n */\n draggedColumnId: string | null;\n};\n\nexport type TMDataGridUiActions = {\n openFilterPanel: (columnId?: string | null) => void;\n closeFilterPanel: () => void;\n setColumnsPanelOpen: (open: boolean) => void;\n toggleColumnsPanel: () => void;\n startColumnDrag: (columnId: string) => void;\n endColumnDrag: () => void;\n};\n\nexport type TMDataGridUiStore = Store<TMDataGridUiState, TMDataGridUiActions>;\n\n/** What `useTMDataGrid` returns — spread straight onto `<TMDataGrid />`. */\nexport type TMDataGridApi<TData extends RowData> = {\n table: TMDataGridTable<TData>;\n ui: TMDataGridUiStore;\n /** Table-level feature switches, re-read from options on every render. */\n features: TMDataGridFeatureFlags;\n};\n\nexport type UseTMDataGridOptions<TData extends RowData> = Omit<\n TableOptions<TMDataGridFeatures, TData>,\n \"features\"\n> & {\n /**\n * Restore and persist table state across mounts. Two keys, because the two\n * kinds of state have different lifetimes — see {@link TMDataGridPersistence}.\n *\n * Keep the object referentially stable (module scope or `useMemo`); it is a\n * dependency of the subscription that writes back.\n */\n persist?: TMDataGridPersistence;\n /**\n * Header drag-and-drop and the move items in the column menu. Defaults to\n * `true`.\n *\n * The one feature switch the grid defines itself: TanStack's\n * `columnOrderingFeature` ships state and APIs but no `enable` option, since\n * reordering is entirely a matter of interface.\n */\n enableColumnOrdering?: boolean;\n /**\n * Client-side pagination and the built-in `TMDataGrid.Footer` pager.\n * Defaults to `false`: the grid renders every filtered row and relies on\n * virtualization.\n *\n * The second grid-defined switch (TanStack defines no `enablePagination`\n * option). `manualPagination: true` implies it — a server-paged grid needs\n * no extra flag.\n */\n enablePagination?: boolean;\n /**\n * How rows are selected. Defaults to `\"checkbox\"`.\n *\n * - `\"checkbox\"` — the generated checkbox column selects; clicking a row\n * elsewhere does not.\n * - `\"row\"` — no checkbox column; clicking a row toggles it. Other rows keep\n * their state, so a click never clears the rest of the selection.\n *\n * Ignored when `enableRowSelection` is `false`. Both modes write to the same\n * `rowSelection` state.\n */\n rowSelectionMode?: TMDataGridRowSelectionMode;\n /**\n * Give selected rows the highlight background. Defaults to `true` under\n * `rowSelectionMode: \"row\"`, where the highlight is the only feedback a click\n * gives, and `false` under `\"checkbox\"`, where the box already shows it.\n *\n * The colour is the `--dg-row-selected-bg` CSS variable, so it can be changed\n * without turning the flag on or off:\n *\n * ```tsx\n * <TMDataGrid\n * {...grid}\n * style={{ \"--dg-row-selected-bg\": \"var(--mantine-color-blue-0)\" }}\n * />\n * ```\n */\n highlightSelectedRows?: boolean;\n};\n\ntype TMDataGridColumnDef<TData extends RowData> = ColumnDef<\n TMDataGridFeatures,\n TData,\n unknown\n>;\n\n/**\n * Point every column at the operator-dispatching filter function unless the\n * column opted into its own.\n */\nfunction withTMDataGridDefaults<TData extends RowData>(\n columns: ReadonlyArray<TMDataGridColumnDef<TData>>,\n): Array<TMDataGridColumnDef<TData>> {\n return columns.map((column) => {\n if (\"columns\" in column && Array.isArray(column.columns)) {\n return {\n ...column,\n columns: withTMDataGridDefaults<TData>(column.columns),\n };\n }\n return { filterFn: \"tmDataGrid\", ...column } as TMDataGridColumnDef<TData>;\n });\n}\n\n/**\n * Builds a TMDataGrid table plus its chrome store.\n *\n * Every `TableOptions` field passes straight through, so a server-driven grid\n * only needs `manualPagination` / `manualFiltering` / `manualSorting`,\n * `rowCount` and the matching `onXChange` callbacks — the chrome reads\n * `getRowCount()` / `getPageCount()` / `getPaginatedRowModel()`, all of which\n * already respect manual mode. `manualPagination` also switches the pagination\n * flag on, so `<TMDataGrid.Footer />` renders its pager without further\n * options.\n */\nexport function useTMDataGrid<TData extends RowData>({\n persist,\n // Not TanStack options, so they are kept out of what `useTable` receives.\n enableColumnOrdering,\n enablePagination,\n rowSelectionMode,\n highlightSelectedRows,\n ...options\n}: UseTMDataGridOptions<TData>): TMDataGridApi<TData> {\n const selectionEnabled = options.enableRowSelection !== false;\n const pinningEnabled = options.enableColumnPinning !== false;\n // Only \"checkbox\" mode owns a column; \"row\" mode selects from the row itself.\n const selectColumnEnabled =\n selectionEnabled && rowSelectionMode !== \"row\";\n\n const columns = useMemo(() => {\n const base = withTMDataGridDefaults<TData>(\n options.columns as ReadonlyArray<TMDataGridColumnDef<TData>>,\n );\n return selectColumnEnabled ? [createSelectColumn<TData>(), ...base] : base;\n }, [options.columns, selectColumnEnabled]);\n\n // Read once on mount: `initialState` is only consumed on the first render,\n // and re-reading later would fight the user's live edits.\n const [persistedState] = useState(() => readPersistedState(persist));\n\n const table = useTable({\n columnResizeMode: \"onChange\",\n enableSorting: true,\n enableColumnResizing: true,\n globalFilterFn: \"includesString\",\n ...options,\n features: tmDataGridFeatures,\n columns: columns as TableOptions<TMDataGridFeatures, TData>[\"columns\"],\n initialState: {\n ...options.initialState,\n ...persistedState,\n columnPinning: {\n // The checkbox column is structurally pinned, so it is re-applied on\n // top of anything restored from storage.\n left: [\n ...(selectColumnEnabled && pinningEnabled ? [SELECT_COLUMN_ID] : []),\n ...(\n persistedState.columnPinning?.left ??\n options.initialState?.columnPinning?.left ??\n []\n ).filter((id) => id !== SELECT_COLUMN_ID),\n ],\n right:\n persistedState.columnPinning?.right ??\n options.initialState?.columnPinning?.right ??\n [],\n },\n pagination: {\n pageIndex: 0,\n pageSize: 25,\n ...options.initialState?.pagination,\n ...persistedState.pagination,\n },\n },\n });\n\n // Mirror every state change back to storage. Subscribing (rather than writing\n // from an effect on a state snapshot) means nothing is missed, including\n // changes made straight through the table API by the consumer.\n //\n // Writes are debounced because `columnResizeMode: \"onChange\"` publishes a new\n // state on every pointer move of a resize drag, and `setItem` serialises\n // synchronously on the main thread. The trailing edge is enough: storage only\n // has to agree with the table once the user stops.\n useEffect(() => {\n if (!hasPersistenceKeys(persist)) return;\n writePersistedState(table.store.state, persist);\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let pending: TableState<TMDataGridFeatures> | null = null;\n\n const flush = () => {\n timeout = undefined;\n if (pending === null) return;\n writePersistedState(pending, persist);\n pending = null;\n };\n\n const subscription = table.store.subscribe((state) => {\n pending = state;\n if (timeout !== undefined) clearTimeout(timeout);\n timeout = setTimeout(flush, PERSIST_DEBOUNCE_MS);\n });\n\n return () => {\n subscription.unsubscribe();\n if (timeout !== undefined) clearTimeout(timeout);\n // An unmount mid-debounce would otherwise drop the last change.\n flush();\n };\n }, [persist, table]);\n\n const ui = useCreateStore<TMDataGridUiState, TMDataGridUiActions>(\n {\n filterPanelOpen: false,\n columnsPanelOpen: false,\n filterPanelColumnId: null,\n draggedColumnId: null,\n },\n ({ setState }) => ({\n openFilterPanel: (columnId = null) =>\n setState((prev) => ({\n ...prev,\n filterPanelOpen: true,\n filterPanelColumnId: columnId,\n })),\n closeFilterPanel: () =>\n setState((prev) => ({\n ...prev,\n filterPanelOpen: false,\n filterPanelColumnId: null,\n })),\n setColumnsPanelOpen: (open) =>\n setState((prev) => ({ ...prev, columnsPanelOpen: open })),\n toggleColumnsPanel: () =>\n setState((prev) => ({ ...prev, columnsPanelOpen: !prev.columnsPanelOpen })),\n startColumnDrag: (columnId) =>\n setState((prev) => ({ ...prev, draggedColumnId: columnId })),\n endColumnDrag: () =>\n setState((prev) => ({ ...prev, draggedColumnId: null })),\n }),\n );\n\n // Deliberately not memoized on `table`: the flags must re-derive whenever the\n // caller passes different options, and `table` keeps the same identity when\n // they do. See readFeatureFlags.\n const features = readFeatureFlags({\n ...options,\n enableColumnOrdering,\n enablePagination,\n rowSelectionMode,\n highlightSelectedRows,\n });\n\n return { table, ui, features };\n}\n\n/**\n * Opens the filter panel for a column, seeding an empty filter row when the\n * column has none yet — mirrors \"Filter\" in the column header menu.\n */\nexport function openColumnFilter<TData extends RowData>(\n api: TMDataGridApi<TData>,\n columnId: string,\n): void {\n const column = api.table.getColumn(columnId);\n if (column && column.getFilterValue() === undefined) {\n column.setFilterValue({\n operator: getDefaultOperator(column.columnDef.meta?.type ?? \"string\"),\n value: \"\",\n });\n }\n api.ui.actions.openFilterPanel(columnId);\n}\n","import { ActionIcon, Menu, Tooltip } from \"@mantine/core\";\nimport { flexRender, type Header } from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { shallow } from \"@tanstack/store\";\nimport { type DragEvent, type ReactNode, useRef, useState } from \"react\";\nimport classes from \"./TMDataGridHeaderCell.module.css\";\nimport sticky from \"./sticky.module.css\";\nimport {\n type TMDataGridRowData,\n useTMDataGridContext,\n} from \"../TMDataGridContext\";\nimport type { TMDataGridColumnLayout } from \"./TMDataGridTable\";\nimport { getColumnCapabilities, getGridCapabilities } from \"../core/capabilities\";\nimport {\n getColumnRegion,\n getStepTargetColumn,\n moveColumn,\n moveColumnByStep,\n type TMDataGridDropSide,\n} from \"../core/columnOrdering\";\nimport { getColumnAlign, getColumnLabel } from \"../core/columnUtils\";\nimport { isFilterActive } from \"../core/filterOperators\";\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n ColumnsIcon,\n DotsVerticalIcon,\n EyeOffIcon,\n FilterIcon,\n MoveLeftIcon,\n MoveRightIcon,\n PinLeftIcon,\n PinOffIcon,\n PinRightIcon,\n} from \"./icons\";\nimport { SELECT_COLUMN_ID } from \"./TMDataGridSelectColumn\";\nimport { type TMDataGridFeatures, openColumnFilter } from \"../useTMDataGrid\";\n\nexport type TMDataGridHeader = Header<\n TMDataGridFeatures,\n TMDataGridRowData,\n unknown\n>;\n\nexport function TMDataGridHeaderCell({\n header,\n layout,\n}: {\n header: TMDataGridHeader;\n layout: TMDataGridColumnLayout;\n}) {\n const api = useTMDataGridContext();\n const { table, features } = api;\n const column = header.column;\n const [menuOpened, setMenuOpened] = useState(false);\n const [dropSide, setDropSide] = useState<TMDataGridDropSide | null>(null);\n const cellRef = useRef<HTMLDivElement>(null);\n // A resize drag ends with a click that bubbles to the header — without this\n // every resize would also toggle the column's sort order.\n const suppressSortRef = useRef(false);\n\n // Subscribing to the slices this cell renders from keeps it live even when the\n // surrounding tree is memoized (React Compiler) or the table lives elsewhere.\n // `columnOrder` is in the list because the move menu items are derived from\n // the column's neighbours, which is exactly what an order change invalidates.\n const { sorting, columnFilters, resizingColumnId, columnPinning } =\n useSelector(\n table.store,\n (state) => ({\n sorting: state.sorting,\n columnFilters: state.columnFilters,\n resizingColumnId: state.columnResizing.isResizingColumn,\n columnPinning: state.columnPinning,\n columnOrder: state.columnOrder,\n }),\n { compare: shallow },\n );\n const draggedColumnId = useSelector(api.ui, (state) => state.draggedColumnId);\n\n const isLeaf = header.subHeaders.length === 0;\n const label = getColumnLabel(column);\n const align = getColumnAlign(column);\n const sortDirection = sorting.find((sort) => sort.id === column.id)?.desc;\n const isSorted = sortDirection !== undefined;\n const isFiltered = columnFilters.some(\n (filter) => filter.id === column.id && isFilterActive(filter.value),\n );\n const isResizing = resizingColumnId === column.id;\n const pinnedAt = layout.pinnedAt;\n\n // Every affordance below mirrors a TanStack capability check, so switching a\n // feature off through the table options removes the markup with it.\n const capabilities = getColumnCapabilities(column, features);\n const canSort = isLeaf && capabilities.canSort;\n const canFilter = isLeaf && capabilities.canFilter;\n const canHide = isLeaf && capabilities.canHide;\n const canPin = isLeaf && capabilities.canPin;\n const canResize = capabilities.canResize;\n const canReorder = isLeaf && capabilities.canReorder;\n const canManageColumns =\n isLeaf && getGridCapabilities(table, features).canHideAny;\n\n // A column only moves inside its own pinned lane, so a header in another one\n // never lights up as a target. See TMDataGridColumnRegion.\n const isDragged = draggedColumnId === column.id;\n const isDropTarget =\n canReorder &&\n draggedColumnId !== null &&\n !isDragged &&\n getColumnRegion(columnPinning, draggedColumnId) ===\n getColumnRegion(columnPinning, column.id);\n\n function handleDragStart(event: DragEvent<HTMLDivElement>) {\n event.dataTransfer.effectAllowed = \"move\";\n // Some browsers refuse to start a drag with an empty payload.\n event.dataTransfer.setData(\"text/plain\", column.id);\n api.ui.actions.startColumnDrag(column.id);\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>) {\n if (!isDropTarget) return;\n // Only a prevented dragover marks an element as a drop target.\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n const bounds = cellRef.current?.getBoundingClientRect();\n if (!bounds) return;\n setDropSide(\n event.clientX < bounds.left + bounds.width / 2 ? \"before\" : \"after\",\n );\n }\n\n function handleDragLeave(event: DragEvent<HTMLDivElement>) {\n // dragleave also fires when the pointer crosses into a child element.\n const next = event.relatedTarget;\n if (next instanceof Node && event.currentTarget.contains(next)) return;\n setDropSide(null);\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>) {\n event.preventDefault();\n setDropSide(null);\n api.ui.actions.endColumnDrag();\n if (!isDropTarget || !dropSide || !draggedColumnId) return;\n moveColumn({\n table,\n columnId: draggedColumnId,\n targetId: column.id,\n side: dropSide,\n });\n }\n\n function handleDragEnd() {\n setDropSide(null);\n api.ui.actions.endColumnDrag();\n }\n\n /**\n * Pinned columns are positioned with `getStart()` / `getAfter()`, which sum\n * `column.getSize()`. Fluid (`fr`) columns don't report their rendered width\n * there, so freeze the measured width into `columnSizing` as we pin — that\n * keeps the column looking the same and keeps the offsets exact.\n */\n function setPinned(position: \"left\" | \"right\" | false) {\n if (position && !(column.id in table.store.state.columnSizing)) {\n const width = cellRef.current?.getBoundingClientRect().width;\n if (width) {\n table.setColumnSizing((prev) => ({\n ...prev,\n [column.id]: Math.round(width),\n }));\n }\n }\n column.pin(position);\n }\n\n const menuItems: ReactNode[] = [];\n if (canSort) {\n menuItems.push(\n <Menu.Item\n key=\"sort-asc\"\n leftSection={<ArrowUpIcon size={16} stroke={1.6} />}\n onClick={() => column.toggleSorting(false)}\n >\n Sort by ASC\n </Menu.Item>,\n <Menu.Item\n key=\"sort-desc\"\n leftSection={<ArrowDownIcon size={16} stroke={1.6} />}\n onClick={() => column.toggleSorting(true)}\n >\n Sort by DESC\n </Menu.Item>,\n <Menu.Divider key=\"sort-divider\" />,\n );\n }\n if (canFilter) {\n menuItems.push(\n <Menu.Item\n key=\"filter\"\n leftSection={<FilterIcon size={16} stroke={1.6} />}\n onClick={() => openColumnFilter(api, column.id)}\n >\n Filter\n </Menu.Item>,\n <Menu.Divider key=\"filter-divider\" />,\n );\n }\n if (canPin) {\n menuItems.push(\n <Menu.Item\n key=\"pin-left\"\n className={pinnedAt === \"left\" ? classes.menuItemActive : undefined}\n leftSection={<PinLeftIcon size={16} stroke={1.6} />}\n onClick={() => setPinned(pinnedAt === \"left\" ? false : \"left\")}\n >\n Pin to left\n </Menu.Item>,\n <Menu.Item\n key=\"pin-right\"\n className={pinnedAt === \"right\" ? classes.menuItemActive : undefined}\n leftSection={<PinRightIcon size={16} stroke={1.6} />}\n onClick={() => setPinned(pinnedAt === \"right\" ? false : \"right\")}\n >\n Pin to right\n </Menu.Item>,\n );\n if (pinnedAt) {\n menuItems.push(\n <Menu.Item\n key=\"unpin\"\n leftSection={<PinOffIcon size={16} stroke={1.6} />}\n onClick={() => setPinned(false)}\n >\n Unpin\n </Menu.Item>,\n );\n }\n menuItems.push(<Menu.Divider key=\"pin-divider\" />);\n }\n if (canReorder) {\n // The keyboard path to reordering, and the discoverable one — a header you\n // can drag looks no different from one you cannot.\n const previous = getStepTargetColumn({\n table,\n columnId: column.id,\n direction: -1,\n });\n const next = getStepTargetColumn({\n table,\n columnId: column.id,\n direction: 1,\n });\n if (previous || next) {\n menuItems.push(\n <Menu.Item\n key=\"move-left\"\n disabled={!previous}\n leftSection={<MoveLeftIcon size={16} stroke={1.6} />}\n onClick={() =>\n moveColumnByStep({ table, columnId: column.id, direction: -1 })\n }\n >\n Move left\n </Menu.Item>,\n <Menu.Item\n key=\"move-right\"\n disabled={!next}\n leftSection={<MoveRightIcon size={16} stroke={1.6} />}\n onClick={() =>\n moveColumnByStep({ table, columnId: column.id, direction: 1 })\n }\n >\n Move right\n </Menu.Item>,\n <Menu.Divider key=\"move-divider\" />,\n );\n }\n }\n if (canHide) {\n menuItems.push(\n <Menu.Item\n key=\"hide\"\n leftSection={<EyeOffIcon size={16} stroke={1.6} />}\n onClick={() => column.toggleVisibility(false)}\n >\n Hide column\n </Menu.Item>,\n );\n }\n if (canManageColumns) {\n menuItems.push(\n <Menu.Item\n key=\"manage\"\n leftSection={<ColumnsIcon size={16} stroke={1.6} />}\n onClick={() => api.ui.actions.setColumnsPanelOpen(true)}\n >\n Manage columns\n </Menu.Item>,\n );\n }\n // A trailing divider reads as a dropped item — drop the divider instead.\n while (menuItems.length > 0 && isDivider(menuItems.at(-1))) {\n menuItems.pop();\n }\n\n const cellClass = [\n classes.headerCell,\n canSort ? classes.headerCellSortable : \"\",\n isDragged ? classes.headerCellDragging : \"\",\n dropSide === \"before\" ? classes.headerCellDropBefore : \"\",\n dropSide === \"after\" ? classes.headerCellDropAfter : \"\",\n layout.isBoundary && pinnedAt === \"left\" ? sticky.stickyLeft : \"\",\n layout.isBoundary && pinnedAt === \"right\" ? sticky.stickyRight : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={cellRef}\n role=\"columnheader\"\n data-testid={`dg-header-${column.id}`}\n data-active={isSorted || isFiltered}\n data-align={align}\n // Only meaningful on a sortable column: \"none\" advertises that this\n // header sorts, which is a lie on one that doesn't.\n aria-sort={\n canSort\n ? isSorted\n ? sortDirection\n ? \"descending\"\n : \"ascending\"\n : \"none\"\n : undefined\n }\n className={cellClass}\n // Dropped while a resize is running, so that dragging the separator\n // resizes the column instead of starting to move it. The resize handler\n // records the column on mousedown, before the first pointer move.\n draggable={canReorder && !isResizing}\n onDragStart={canReorder ? handleDragStart : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n onDragOver={isDropTarget ? handleDragOver : undefined}\n onDragLeave={isDropTarget ? handleDragLeave : undefined}\n onDrop={isDropTarget ? handleDrop : undefined}\n style={{\n left: pinnedAt === \"left\" ? layout.offset : undefined,\n right: pinnedAt === \"right\" ? layout.offset : undefined,\n position: pinnedAt ? \"sticky\" : undefined,\n zIndex: pinnedAt ? 4 : undefined,\n }}\n onClick={\n canSort\n ? (event) => {\n if (suppressSortRef.current) {\n suppressSortRef.current = false;\n return;\n }\n column.getToggleSortingHandler()?.(event);\n }\n : undefined\n }\n >\n {header.isPlaceholder ? null : (\n <Tooltip label={label} openDelay={600} withinPortal disabled={!isLeaf}>\n <span className={classes.headerTitle}>\n {flexRender(column.columnDef.header, header.getContext())}\n </span>\n </Tooltip>\n )}\n\n {isLeaf && (\n <div className={classes.headerActions}>\n {isFiltered && (\n <ActionIcon\n className={classes.headerAction}\n data-pinned-visible=\"true\"\n variant=\"subtle\"\n color=\"gray\"\n size=\"xs\"\n aria-label={`Filter on ${label}`}\n onClick={(event) => {\n event.stopPropagation();\n openColumnFilter(api, column.id);\n }}\n >\n <FilterIcon size={14} stroke={1.6} />\n </ActionIcon>\n )}\n\n {canSort && (\n <ActionIcon\n className={classes.headerAction}\n data-pinned-visible={isSorted}\n variant=\"subtle\"\n color=\"gray\"\n size=\"xs\"\n aria-label={`Sort ${label}`}\n onClick={column.getToggleSortingHandler()}\n >\n {sortDirection ? (\n <ArrowDownIcon size={14} stroke={1.6} />\n ) : (\n <ArrowUpIcon size={14} stroke={1.6} />\n )}\n </ActionIcon>\n )}\n\n {menuItems.length > 0 && column.id !== SELECT_COLUMN_ID && (\n <Menu\n opened={menuOpened}\n onChange={setMenuOpened}\n position=\"bottom-start\"\n shadow=\"md\"\n width={220}\n withinPortal\n >\n <Menu.Target>\n <ActionIcon\n className={classes.headerAction}\n data-pinned-visible={menuOpened}\n variant=\"subtle\"\n color=\"gray\"\n size=\"xs\"\n aria-label={`${label} column menu`}\n onClick={(event) => {\n event.stopPropagation();\n setMenuOpened((opened) => !opened);\n }}\n >\n <DotsVerticalIcon size={14} stroke={1.6} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown onClick={(event) => event.stopPropagation()}>\n {menuItems}\n </Menu.Dropdown>\n </Menu>\n )}\n </div>\n )}\n\n <div\n className={[\n classes.columnSeparator,\n canResize ? classes.columnSeparatorResizable : \"\",\n isResizing ? classes.columnSeparatorActive : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n // Keeps a drag that starts on the separator from being picked up by the\n // draggable header around it.\n draggable={false}\n onMouseDown={\n canResize\n ? (event) => {\n suppressSortRef.current = true;\n header.getResizeHandler()(event);\n }\n : undefined\n }\n onTouchStart={canResize ? header.getResizeHandler() : undefined}\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n );\n}\n\nfunction isDivider(node: ReactNode): boolean {\n return (\n typeof node === \"object\" &&\n node !== null &&\n \"type\" in node &&\n node.type === Menu.Divider\n );\n}\n","import { Loader, Text } from \"@mantine/core\";\nimport {\n type Cell,\n flexRender,\n type Row,\n type RowData,\n} from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport classes from \"./TMDataGridTable.module.css\";\nimport sticky from \"./sticky.module.css\";\nimport { type TMDataGridRowData, useTMDataGridContext } from \"../TMDataGridContext\";\nimport { TMDataGridFilterPanel } from \"./TMDataGridFilterPanel\";\nimport { TMDataGridHeaderCell } from \"./TMDataGridHeaderCell\";\nimport { getColumnAlign } from \"../core/columnUtils\";\nimport { SearchIcon } from \"./icons\";\nimport type { TMDataGridFeatures } from \"../useTMDataGrid\";\n\n/** Where a column sits relative to the pinned regions, resolved once per render. */\nexport type TMDataGridColumnLayout = {\n pinnedAt: \"left\" | \"right\" | false;\n /** Distance in px from the grid's left or right edge. */\n offset: number;\n /** Last left-pinned / first right-pinned column — the one that casts the edge. */\n isBoundary: boolean;\n};\n\nconst UNPINNED_LAYOUT: TMDataGridColumnLayout = {\n pinnedAt: false,\n offset: 0,\n isBoundary: false,\n};\n\nfunction TMDataGridBodyCell({\n cell,\n rowHeight,\n layout,\n}: {\n cell: Cell<TMDataGridFeatures, TMDataGridRowData, unknown>;\n rowHeight: number;\n layout: TMDataGridColumnLayout;\n}) {\n return (\n <div\n role=\"cell\"\n data-align={getColumnAlign(cell.column)}\n className={[\n classes.bodyCell,\n layout.isBoundary && layout.pinnedAt === \"left\" ? sticky.stickyLeft : \"\",\n layout.isBoundary && layout.pinnedAt === \"right\"\n ? sticky.stickyRight\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n minHeight: rowHeight,\n left: layout.pinnedAt === \"left\" ? layout.offset : undefined,\n right: layout.pinnedAt === \"right\" ? layout.offset : undefined,\n position: layout.pinnedAt ? \"sticky\" : undefined,\n zIndex: layout.pinnedAt ? 2 : undefined,\n }}\n >\n <span className={classes.cellContent}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </span>\n </div>\n );\n}\n\nexport type TMDataGridTableProps<TData extends RowData> = {\n /**\n * Called when a body row is clicked. Runs in addition to row selection under\n * `rowSelectionMode: \"row\"`, not instead of it.\n */\n onRowClick?: (row: Row<TMDataGridFeatures, TData>) => void;\n};\n\n/**\n * The scrollable grid surface. Always virtualized: only the rows inside the\n * viewport (plus overscan) are mounted — which is what makes the default\n * no-pagination mode viable at any row count. Pagination is opt-in via\n * `enablePagination` (or implied by `manualPagination`).\n */\nexport function TMDataGridTable<TData extends RowData = TMDataGridRowData>({\n onRowClick,\n}: TMDataGridTableProps<TData>) {\n const { table, features, rowHeight, controlSize } = useTMDataGridContext();\n\n // The body depends on every state slice (sorting, filters, paging, sizing,\n // visibility, selection), so it subscribes to the whole table store.\n useSelector(table.store);\n\n const { loading, noResultsLabel = \"No rows match your filters\" } =\n table.options.meta ?? {};\n\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n // Pagination off (the default): every filtered+sorted row, virtualized.\n // Pagination on: the current page; under `manualPagination` TanStack returns\n // the rows as delivered, so the same branch serves server paging.\n const rows = features.pagination\n ? table.getPaginatedRowModel().rows\n : table.getPrePaginatedRowModel().rows;\n\n // A persisted pageIndex can outlive the data that produced it; TanStack only\n // auto-resets on live filter/sort/data changes, not on restored state. The\n // guard makes the dependency-free effect idempotent.\n useEffect(() => {\n if (!features.pagination) return;\n const pageCount = table.getPageCount();\n if (pageCount > 0 && table.store.state.pagination.pageIndex >= pageCount) {\n table.setPageIndex(pageCount - 1);\n }\n });\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: useCallback(() => rowHeight, [rowHeight]),\n getItemKey: useCallback((index: number) => rows[index]?.id ?? index, [rows]),\n overscan: 6,\n initialRect: { height: 600, width: 1200 },\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualizer.getTotalSize() - (virtualItems.at(-1)?.end ?? 0);\n\n const leftLeafColumns = table.getLeftLeafColumns();\n const rightLeafColumns = table.getRightLeafColumns();\n const centerLeafColumns = table.getCenterLeafColumns();\n\n const orderedColumns = [\n ...leftLeafColumns,\n ...centerLeafColumns,\n ...rightLeafColumns,\n ];\n\n // Headers and cells must follow the same left → center → right order as the\n // column tracks, otherwise pinning a column would shuffle it out of its lane.\n const centerHeaderGroups = table.getCenterHeaderGroups();\n const leftHeaderGroups = table.getLeftHeaderGroups();\n const rightHeaderGroups = table.getRightHeaderGroups();\n const headerGroups = centerHeaderGroups.map((group, index) => ({\n id: group.id,\n headers: [\n ...(leftHeaderGroups[index]?.headers ?? []),\n ...group.headers,\n ...(rightHeaderGroups[index]?.headers ?? []),\n ],\n }));\n // Unresized columns stay fluid (`minmax(min, flex fr)`) so the grid fills the\n // viewport; dragging a resize handle pins that column to an exact pixel width.\n // minWidth is the sum of those floors — anything wider and the grid would\n // force a horizontal scrollbar it doesn't need.\n //\n // Pinned columns are always exact: their sticky offsets come from\n // `getStart()` / `getAfter()`, which sum `getSize()` and cannot see an `fr`.\n const columnSizing = table.store.state.columnSizing;\n const columnTracks = orderedColumns.map((column) => {\n const isFixed = column.columnDef.minSize === column.columnDef.maxSize;\n const isResized = column.id in columnSizing;\n const isPinned = column.getIsPinned() !== false;\n const minWidth = column.columnDef.minSize ?? 80;\n if (isFixed || isResized || isPinned) {\n return { track: `${column.getSize()}px`, minWidth: column.getSize() };\n }\n return {\n track: `minmax(${minWidth}px, ${column.columnDef.meta?.flex ?? 1}fr)`,\n minWidth,\n };\n });\n const gridTemplateColumns = columnTracks.map((c) => c.track).join(\" \");\n const gridMinWidth = columnTracks.reduce((sum, c) => sum + c.minWidth, 0);\n\n /**\n * Sticky offsets are derived here, from state this component subscribes to,\n * and handed down as props.\n *\n * Deriving them inside the cell via `column.getIsPinned()` /\n * `column.getStart()` looks equivalent but isn't: those are plain calls on a\n * `column` object whose identity survives a pin, so the React Compiler caches\n * the result and the cell keeps rendering with stale pinning. Building the\n * offsets from the same widths as the grid tracks also guarantees the two\n * agree to the pixel.\n */\n const columnLayout = new Map<string, TMDataGridColumnLayout>();\n const widthOf = (columnId: string) =>\n columnTracks[orderedColumns.findIndex((c) => c.id === columnId)]?.minWidth ??\n 0;\n\n let leftOffset = 0;\n for (const column of leftLeafColumns) {\n columnLayout.set(column.id, {\n pinnedAt: \"left\",\n offset: leftOffset,\n isBoundary: column.id === leftLeafColumns.at(-1)?.id,\n });\n leftOffset += widthOf(column.id);\n }\n let rightOffset = 0;\n for (const column of [...rightLeafColumns].reverse()) {\n columnLayout.set(column.id, {\n pinnedAt: \"right\",\n offset: rightOffset,\n isBoundary: column.id === rightLeafColumns[0]?.id,\n });\n rightOffset += widthOf(column.id);\n }\n for (const column of centerLeafColumns) {\n columnLayout.set(column.id, {\n pinnedAt: false,\n offset: 0,\n isBoundary: false,\n });\n }\n const layoutFor = (columnId: string) =>\n columnLayout.get(columnId) ?? UNPINNED_LAYOUT;\n\n const isEmpty = rows.length === 0;\n\n // \"row\" mode: the row itself is the selection control — clicking it toggles\n // that row and leaves the rest of the selection alone.\n const selectsOnRowClick =\n features.rowSelection && features.rowSelectionMode === \"row\";\n const rowIsInteractive = selectsOnRowClick || onRowClick !== undefined;\n\n const handleRowActivate = (row: Row<TMDataGridFeatures, TMDataGridRowData>) => {\n if (selectsOnRowClick && row.getCanSelect()) row.toggleSelected();\n onRowClick?.(row as unknown as Row<TMDataGridFeatures, TData>);\n };\n\n return (\n <div className={classes.tableWrapper}>\n <div ref={scrollContainerRef} className={classes.scrollContainer}>\n <div\n role=\"table\"\n className={classes.grid}\n // Virtualization means most rows are not in the DOM, so the counts\n // have to be stated rather than inferred from what is rendered. Every\n // row carries its aria-rowindex for the same reason.\n aria-rowcount={rows.length + headerGroups.length}\n aria-colcount={orderedColumns.length}\n style={{ gridTemplateColumns, minWidth: gridMinWidth }}\n >\n <div role=\"rowgroup\" style={{ display: \"contents\" }}>\n {headerGroups.map((headerGroup, groupIndex) => (\n <div\n key={headerGroup.id}\n role=\"row\"\n aria-rowindex={groupIndex + 1}\n className={classes.headerRow}\n >\n {headerGroup.headers.map((header) => (\n <TMDataGridHeaderCell\n key={header.id}\n header={header}\n layout={layoutFor(header.column.id)}\n />\n ))}\n </div>\n ))}\n </div>\n\n {paddingTop > 0 && (\n <div aria-hidden style={{ gridColumn: \"1/-1\", height: paddingTop }} />\n )}\n\n <div role=\"rowgroup\" style={{ display: \"contents\" }}>\n {virtualItems.map((virtualItem) => {\n const row = rows[virtualItem.index];\n if (!row) return null;\n return (\n <div\n key={virtualItem.key}\n role=\"row\"\n aria-rowindex={virtualItem.index + headerGroups.length + 1}\n data-testid={`dg-row-${row.id}`}\n data-selected={row.getIsSelected()}\n // Selection is state; the highlight is a display choice, so\n // the two are separate attributes.\n data-highlighted={\n features.highlightSelectedRows && row.getIsSelected()\n }\n data-selects-on-click={selectsOnRowClick}\n aria-selected={\n features.rowSelection ? row.getIsSelected() : undefined\n }\n className={classes.bodyRow}\n style={{\n minHeight: rowHeight,\n cursor: rowIsInteractive ? \"pointer\" : undefined,\n }}\n // Keyboard parity with the checkbox the row replaces.\n tabIndex={selectsOnRowClick ? 0 : undefined}\n onClick={\n rowIsInteractive ? () => handleRowActivate(row) : undefined\n }\n onKeyDown={\n selectsOnRowClick\n ? (event) => {\n if (event.key !== \" \" && event.key !== \"Enter\") return;\n if (event.target !== event.currentTarget) return;\n event.preventDefault();\n handleRowActivate(row);\n }\n : undefined\n }\n >\n {[\n ...row.getLeftVisibleCells(),\n ...row.getCenterVisibleCells(),\n ...row.getRightVisibleCells(),\n ].map((cell) => (\n <TMDataGridBodyCell\n key={cell.id}\n cell={cell}\n rowHeight={rowHeight}\n layout={layoutFor(cell.column.id)}\n />\n ))}\n </div>\n );\n })}\n </div>\n\n {isEmpty && loading === true && (\n <div role=\"row\" className={classes.messageRow}>\n <Loader size=\"lg\" />\n </div>\n )}\n\n {isEmpty && loading !== true && (\n <div role=\"row\" className={classes.messageRow}>\n <SearchIcon size={40} stroke={1.4} opacity={0.4} />\n <Text size={controlSize} c=\"dimmed\">\n {noResultsLabel}\n </Text>\n </div>\n )}\n\n {paddingBottom > 0 && (\n <div\n aria-hidden\n style={{ gridColumn: \"1/-1\", height: paddingBottom }}\n />\n )}\n </div>\n </div>\n\n <TMDataGridFilterPanel />\n </div>\n );\n}\n",".toolbar {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-xs);\n padding: 6px var(--mantine-spacing-xs);\n min-height: 42px;\n flex-shrink: 0;\n}\n\n.toolbarSpacer {\n flex: 1;\n}\n","import { ActionIcon, Popover, Text, Tooltip } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport type { ReactNode } from \"react\";\nimport classes from \"./TMDataGridToolbar.module.css\";\nimport { TMDataGridColumnsPanel } from \"./TMDataGridColumnsPanel\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getGridCapabilities } from \"../core/capabilities\";\nimport { isFilterActive } from \"../core/filterOperators\";\nimport { BurgerIcon, FilterIcon } from \"./icons\";\nimport { openColumnFilter } from \"../useTMDataGrid\";\n\n/** Row above the grid. Compose it from the pieces below, or anything else. */\nexport function TMDataGridToolbar({ children }: { children?: ReactNode }) {\n return <div className={classes.toolbar}>{children}</div>;\n}\n\n/** Pushes the following toolbar items to the right. */\nexport function TMDataGridToolbarSpacer() {\n return <div className={classes.toolbarSpacer} />;\n}\n\n/**\n * Visible rows over total rows. On a server-driven grid, set\n * `meta.totalRowCount` for the denominator — the client never sees every row.\n */\nexport function TMDataGridSummaryCount({ children }: { children?: ReactNode }) {\n const { table, controlSize } = useTMDataGridContext();\n useSelector(table.store);\n\n if (children !== undefined) {\n return (\n <Text size={controlSize} c=\"dimmed\">\n {children}\n </Text>\n );\n }\n\n const shown = table.getRowCount();\n const total =\n table.options.meta?.totalRowCount ??\n table.getPreFilteredRowModel().rows.length;\n\n return (\n <Text size={controlSize} c=\"dimmed\">\n {shown} / {total}\n </Text>\n );\n}\n\n/**\n * Burger menu in the grid's top-right corner — opens \"Manage columns\".\n * Renders nothing when no column can be hidden (`enableHiding: false`).\n */\nexport function TMDataGridColumnsButton() {\n const { table, ui, features, controlSize } = useTMDataGridContext();\n const opened = useSelector(ui, (state) => state.columnsPanelOpen);\n\n if (!getGridCapabilities(table, features).canHideAny) return null;\n\n return (\n <Popover\n opened={opened}\n onChange={ui.actions.setColumnsPanelOpen}\n position=\"bottom-end\"\n shadow=\"md\"\n radius=\"md\"\n withinPortal\n trapFocus\n >\n <Popover.Target>\n <Tooltip label=\"Manage columns\" openDelay={400}>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size={controlSize}\n aria-label=\"Manage columns\"\n onClick={ui.actions.toggleColumnsPanel}\n >\n <BurgerIcon size={18} stroke={1.6} />\n </ActionIcon>\n </Tooltip>\n </Popover.Target>\n <Popover.Dropdown p={0}>\n <TMDataGridColumnsPanel />\n </Popover.Dropdown>\n </Popover>\n );\n}\n\n/**\n * Toggles the filter panel, seeding a filter row on the first filterable column.\n * Renders nothing when no column can be filtered (`enableColumnFilters: false`).\n */\nexport function TMDataGridFilterButton() {\n const api = useTMDataGridContext();\n const { table, ui, features, controlSize } = api;\n const opened = useSelector(ui, (state) => state.filterPanelOpen);\n const columnFilters = useSelector(\n table.store,\n (state) => state.columnFilters,\n );\n const activeCount = columnFilters.filter((filter) =>\n isFilterActive(filter.value),\n ).length;\n\n if (!getGridCapabilities(table, features).canFilterAny) return null;\n\n return (\n <Tooltip label=\"Filters\" openDelay={400}>\n <ActionIcon\n variant={opened || activeCount > 0 ? \"light\" : \"subtle\"}\n color={activeCount > 0 ? undefined : \"gray\"}\n size={controlSize}\n aria-label=\"Filters\"\n onClick={() => {\n if (opened) {\n ui.actions.closeFilterPanel();\n return;\n }\n const firstFilterable = table\n .getAllLeafColumns()\n .find((column) => column.getCanFilter());\n if (firstFilterable) openColumnFilter(api, firstFilterable.id);\n else ui.actions.openFilterPanel();\n }}\n >\n <FilterIcon size={16} stroke={1.6} />\n </ActionIcon>\n </Tooltip>\n );\n}\n","import type { MantineSize } from \"@mantine/core\";\n\nexport type TMDataGridSize = MantineSize;\n\nexport const DEFAULT_TMDATAGRID_SIZE: TMDataGridSize = \"md\";\n\n/**\n * Row height per size, in px.\n *\n * The virtualizer needs this as a number — it cannot read the CSS variable —\n * so the scale lives here and `TMDataGrid.module.css` mirrors it. `meta.rowHeight`\n * overrides it when a grid needs a height the scale doesn't offer.\n */\nexport const SIZE_ROW_HEIGHT: Record<TMDataGridSize, number> = {\n xs: 34,\n sm: 42,\n md: 52,\n lg: 62,\n xl: 72,\n};\n\n/** Size of the Mantine controls rendered inside the grid chrome. */\nexport const SIZE_CONTROL_SIZE: Record<TMDataGridSize, MantineSize> = {\n xs: \"xs\",\n sm: \"xs\",\n md: \"sm\",\n lg: \"sm\",\n xl: \"md\",\n};\n","import type { RowData } from \"@tanstack/react-table\";\nimport { type CSSProperties, type ReactNode, useMemo } from \"react\";\nimport classes from \"./TMDataGrid.module.css\";\nimport { TMDataGridColumnsPanel } from \"./TMDataGridColumnsPanel\";\nimport { TMDataGridContextProvider } from \"../TMDataGridContext\";\nimport { TMDataGridFilterPanel } from \"./TMDataGridFilterPanel\";\nimport { TMDataGridFooter } from \"./TMDataGridFooter\";\nimport { TMDataGridTable } from \"./TMDataGridTable\";\nimport {\n TMDataGridColumnsButton,\n TMDataGridFilterButton,\n TMDataGridSummaryCount,\n TMDataGridToolbar,\n TMDataGridToolbarSpacer,\n} from \"./TMDataGridToolbar\";\nimport {\n DEFAULT_TMDATAGRID_SIZE,\n SIZE_CONTROL_SIZE,\n SIZE_ROW_HEIGHT,\n type TMDataGridSize,\n} from \"../core/sizes\";\nimport type { TMDataGridApi } from \"../useTMDataGrid\";\n\nexport type TMDataGridProps<TData extends RowData> = TMDataGridApi<TData> & {\n children: ReactNode;\n /**\n * Mantine size scale. Drives row height, font size, cell padding and the\n * size of the controls in the chrome. `meta.rowHeight` still wins if set.\n */\n size?: TMDataGridSize;\n className?: string;\n /**\n * Inline styles. Widened to accept CSS variables, which is how the grid's\n * colours are themed — `--dg-row-selected-bg` for the selected row\n * background. Plain `CSSProperties` rejects `--*` keys.\n */\n style?: CSSProperties & Record<`--${string}`, string | number>;\n};\n\n/**\n * Root of the grid. Takes the object returned by `useTMDataGrid` — spread it —\n * and publishes it to the compound components below it:\n *\n * ```tsx\n * const grid = useTMDataGrid({ data, columns });\n *\n * <TMDataGrid {...grid}>\n * <TMDataGrid.Toolbar>\n * <TMDataGrid.SummaryCount />\n * <TMDataGrid.Spacer />\n * <TMDataGrid.ColumnsButton />\n * </TMDataGrid.Toolbar>\n * <TMDataGrid.Table />\n * <TMDataGrid.Footer />\n * </TMDataGrid>\n * ```\n */\nfunction TMDataGridRoot<TData extends RowData>({\n table,\n ui,\n features,\n size = DEFAULT_TMDATAGRID_SIZE,\n children,\n className,\n style,\n}: TMDataGridProps<TData>) {\n const rowHeight = table.options.meta?.rowHeight ?? SIZE_ROW_HEIGHT[size];\n\n const api = useMemo(\n () => ({\n table,\n ui,\n features,\n size,\n rowHeight,\n controlSize: SIZE_CONTROL_SIZE[size],\n }),\n [table, ui, features, size, rowHeight],\n );\n\n return (\n <TMDataGridContextProvider value={api}>\n <div\n data-size={size}\n className={[classes.root, className].filter(Boolean).join(\" \")}\n style={style}\n >\n {children}\n </div>\n </TMDataGridContextProvider>\n );\n}\n\nexport const TMDataGrid = Object.assign(TMDataGridRoot, {\n Toolbar: TMDataGridToolbar,\n Spacer: TMDataGridToolbarSpacer,\n SummaryCount: TMDataGridSummaryCount,\n ColumnsButton: TMDataGridColumnsButton,\n FilterButton: TMDataGridFilterButton,\n Table: TMDataGridTable,\n Footer: TMDataGridFooter,\n /** Rendered by `TMDataGrid.Table`; exported for custom layouts. */\n FilterPanel: TMDataGridFilterPanel,\n /** Rendered by `TMDataGrid.ColumnsButton`; exported for custom layouts. */\n ColumnsPanel: TMDataGridColumnsPanel,\n});\n"],"mappings":";;;;;;;;;;;;;;GEmBMU,KAAoBV,EAAuB,IAAI,GAExCW,KAA4BD,GAAkBE;AAE3D,SAAOC,IAAA;CACL,IAAAC,IAAYb,EAAWS,EAAiB;CACxC,IAAI,CAACI,GACH,MAAUC,MACR,qEACF;CACD,OACMD;AAA6B;;;ACdtC,SAAgBU,GAAeC,GAA4B;CACzD,IAAMC,IAAQD,EAAOL,UAAUE,MAAMI;CACrC,IAAIA,GAAO,OAAOA;CAClB,IAAML,IAASI,EAAOL,UAAUC;CAChC,OAAO,OAAOA,KAAW,WAAWA,IAASI,EAAON;AACtD;AAEA,SAAgBQ,GAAcF,GAA0C;CACtE,OAAOA,EAAOL,UAAUE,MAAMM,QAAQ;AACxC;AAEA,SAAgBC,GAAeJ,GAAiD;CAC9E,OAAOA,EAAOL,UAAUE,MAAMQ,SAAS;AACzC;AAUA,SAAgBC,GAAoBN,GAA6B;CAE/D,OADIA,EAAOL,UAAUE,MAAMU,mBAAmB,MACvCP,EAAOF,WAAWU,KAAAA;AAC3B;;;AC7BA,SAAOY,KAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAC,UAAAC,mBAA+BP,EAAqB,GACpD,CAAAQ,GAAAC,KAA4BX,EAAS,EAAE,GAEvCY,IAAyBb,EACvBS,EAAKK,OACLC,EACF,GAAEC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC;CAAA,IAAAlB,EAAA,OAAAM,KAAAN,EAAA,OAAAG,KAAAH,EAAA,OAAAI,KAAAJ,EAAA,OAAAE,GAAA;EAEF,IAAAiB,IAAgBjB,EAAKkB,kBAAmB,GACxCC,IAAejB,EAAMkB,KAAM,CAAC,CAAAC,YAAa;EAOzCb,AANAQ,IAAuBG,IACnBF,EAAOK,QAAQC,MACb5B,GAAe4B,CAAM,CAAC,CAAAF,YAAa,CAAC,CAAAG,SAAUL,CAAM,CAEhD,IAJaF,GAMvBT,IAAwBS,EAAOK,OAAQG,EAA+B;EAAE,IAAAC;EAMtDZ,AANsDhB,EAAA,QAAAM,IAErBsB,IAAA5B,EAAA,OAAjD4B,KAAAC,MAAYvB,EAAiBmB,EAAMK,QAAS,IAAK9B,EAAA,MAAAM,GAAAN,EAAA,MAAA4B,IADnDjB,IAAmBD,EAAec,OAChCI,CACF,CAAC,CAAAG,QAGiBf,IAAArB,GAAOqC;EAAa,IAAAC;EAAA,AAAAjC,EAAA,QAAAkC,OAAAC,IAAA,2BAAA,KAIpBF,KAAAG,MAAW/B,EAAU+B,EAAKC,cAAcC,KAAM,GAACtC,EAAA,MAAAiC,KAAAA,IAAAjC,EAAA;EAAA,IAAAuC;EAS3C3B,AAT2CZ,EAAA,QAAAkC,OAAAC,IAAA,2BAAA,KAE5CI,IAAA,kBAAC,IAAD;GAAkB,MAAA;GAAY,QAAA;EAAG,CAAA,GAAIvC,EAAA,MAAAuC,KAAAA,IAAAvC,EAAA,KAAAA,EAAA,QAAAG,KAAAH,EAAA,QAAAI,KALtDa,IAAA,kBAAA,OAAA;GAAgB,WAAAtB,GAAO6C;aACrB,kBAAC,GAAD;IACSpC,OAAAA;IACG,UAAA6B;IACE,aAAA;IACC,aAAAM;IACPpC,MAAAA;IACN,kBAAA;GAAc,CAAA;EAEZ,CAAA,GAAAH,EAAA,MAAAG,GAAAH,EAAA,MAAAI,GAAAJ,EAAA,MAAAiB,KAAAA,IAAAjB,EAAA,KAELS,IAAAnB,EAAUmD,UAAe3B,IAAA,KAAUC,IAAA,QAClBH,IAAAjB,GAAO+C;EAAiB,IAAAC;EAYpC3C,AAZoCA,EAAA,QAAAM,KAAAN,EAAA,QAAAG,KAClBwC,KAAAC,MAClB,kBAAC,GAAD;GAEQzC,MAAAA;GACC,OAAAN,GAAe4B,CAAM;GAClB,UAAA,CAACA,EAAMoB,WAAY;GACpB,SAAAvC,EAAiBmB,EAAMK,QAAS;GAC/B,WAAAgB,MACRrB,EAAMsB,iBAAkBX,EAAKC,cAAcW,OAAQ;EAAC,GANjDvB,EAAMK,EAM2C,GAGzD9B,EAAA,MAAAM,GAAAN,EAAA,MAAAG,GAAAH,EAAA,MAAA2C,KAAAA,IAAA3C,EAAA,KAXAa,IAAAK,EAAc+B,IAAKN,CAWnB,GAAC3C,EAAA,KAAAM,GAAAN,EAAA,KAAAG,GAAAH,EAAA,KAAAI,GAAAJ,EAAA,KAAAE,GAAAF,EAAA,KAAAS,GAAAT,EAAA,KAAAU,GAAAV,EAAA,KAAAW,GAAAX,EAAA,KAAAY,GAAAZ,EAAA,KAAAa,GAAAb,EAAA,KAAAc,GAAAd,EAAA,MAAAe,GAAAf,EAAA,MAAAgB,GAAAhB,EAAA,MAAAiB,GAAAjB,EAAA,MAAAkB;CAAA,OAAAA,AAAAT,IAAAT,EAAA,IAAAU,IAAAV,EAAA,IAAAW,IAAAX,EAAA,IAAAY,IAAAZ,EAAA,IAAAa,IAAAb,EAAA,IAAAc,IAAAd,EAAA,IAAAe,IAAAf,EAAA,KAAAgB,IAAAhB,EAAA,KAAAiB,IAAAjB,EAAA,KAAAkB,IAAAlB,EAAA;CAAA,IAAA4B;CAAA,AAAA5B,EAAA,QAAAG,KAAAH,EAAA,QAAAI,KAAAJ,EAAA,QAAAkB,EAAAa,UACDH,IAAAV,EAAca,WAAY,KACzB,kBAAC,GAAD;EAAY5B,MAAAA;EAAe,GAAA;YAA3B;GAAoC;GACfC;GAAO;EADvB;KAGNJ,EAAA,MAAAG,GAAAH,EAAA,MAAAI,GAAAJ,EAAA,MAAAkB,EAAAa,QAAA/B,EAAA,MAAA4B,KAAAA,IAAA5B,EAAA;CAAA,IAAAiC;CAAA,AAAAjC,EAAA,QAAAY,KAAAZ,EAAA,QAAAa,KAAAb,EAAA,QAAA4B,KAjBHK,IAAA,kBAAA,OAAA;EAAgB,WAAArB;YAAhB,CACGC,GAYAe,CAKG;KAAA5B,EAAA,MAAAY,GAAAZ,EAAA,MAAAa,GAAAb,EAAA,MAAA4B,GAAA5B,EAAA,MAAAiC,KAAAA,IAAAjC,EAAA;CAAA,IAAAuC;CAAA,AAAAvC,EAAA,QAAAS,KAAAT,EAAA,QAAAc,KAAAd,EAAA,QAAAe,KAAAf,EAAA,QAAAiC,KAnBRM,IAAA,kBAAC,GAAD;EAA0B,KAAAzB;EAAU,MAAAC;YAClCkB;CADkB,CAAA,GAoBEjC,EAAA,MAAAS,GAAAT,EAAA,MAAAc,GAAAd,EAAA,MAAAe,GAAAf,EAAA,MAAAiC,GAAAjC,EAAA,MAAAuC,KAAAA,IAAAvC,EAAA;CAMT,IAAA2C,IAAAhC,MAAeD,EAAeqB,QACxBmB,IAAAvC,IAAa,KAAKA,IAAaD,EAAeqB,QAAOoB;CAAA,AAAAnD,EAAA,QAAAE,IAERiD,IAAAnD,EAAA,OADlDmD,KAAAC,MACRlD,EAAKmD,wBAAyBjB,EAAKC,cAAcW,OAAQ,GAAChD,EAAA,MAAAE,GAAAF,EAAA,MAAAmD;CAAA,IAAAG;CAAA,AAAAtD,EAAA,QAAAG,KAAAH,EAAA,QAAAkD,KAAAlD,EAAA,QAAAmD,KAAAnD,EAAA,QAAA2C,KAN9DW,IAAA,kBAAC,GAAD;EACQnD,MAAAA;EACA,OAAA;EACG,SAAAwC;EACM,eAAAO;EACL,UAAAC;CACkD,CAAA,GAE5DnD,EAAA,MAAAG,GAAAH,EAAA,MAAAkD,GAAAlD,EAAA,MAAAmD,GAAAnD,EAAA,MAAA2C,GAAA3C,EAAA,MAAAsD,KAAAA,IAAAtD,EAAA;CAAA,IAAAuD;CAAA,AAAAvD,EAAA,QAAAE,IAOOqD,IAAAvD,EAAA,OANTuD,IAAA,kBAAC,GAAD;EACU,SAAA;EACH,MAAA;EACI,eAAMrD,EAAKsD,sBAAuB;YAC5C;CAJM,CAAA,GAMExD,EAAA,MAAAE,GAAAF,EAAA,MAAAuD;CAAA,IAAAE;CAAA,AAAAzD,EAAA,QAAAsD,KAAAtD,EAAA,QAAAuD,KAhBXE,IAAA,kBAAA,OAAA;EAAgB,WAAA9D,GAAO+D;YAAvB,CACEJ,GASAC,CAOI;KAAAvD,EAAA,MAAAsD,GAAAtD,EAAA,MAAAuD,GAAAvD,EAAA,MAAAyD,KAAAA,IAAAzD,EAAA;CAAA,IAAA2D;CACF,OADE3D,EAAA,QAAAyD,KAAAzD,EAAA,QAAAgB,KAAAhB,EAAA,QAAAiB,KAAAjB,EAAA,QAAAuC,KAnDRoB,IAAA,kBAAA,OAAA;EAAgB,WAAA3C;YAAhB;GACEC;GAWAsB;GAsBAkB;EAkBI;KAAAzD,EAAA,MAAAyD,GAAAzD,EAAA,MAAAgB,GAAAhB,EAAA,MAAAiB,GAAAjB,EAAA,MAAAuC,GAAAvC,EAAA,MAAA2D,KAAAA,IAAA3D,EAAA,KApDN2D;AAoDM;AA3EH,SAAAhC,GAAAiC,GAAA;CAAA,OAiB8CnC,EAAMoB,WAAY;AAAC;AAjBjE,SAAArC,GAAAqD,GAAA;CAAA,OAMQA,EAAKvD;AAAiB;;;;GEWxBgE,KAAmE;CAC9EE,UAAU;CACVC,QAAQ;CACRC,WAAW;CACXC,YAAY;CACZC,UAAU;CACVC,aAAa;CACbC,oBAAoB;CACpBC,UAAU;CACVC,iBAAiB;CACjBC,SAAS;CACTC,YAAY;AACd,GAEMC,KAAwD;CAC5D;CACA;CACA;CACA;CACA;CACA;CACA;AAAY,GAGRC,IAAwD;CAC5D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAAY,GAIRC,IAA2D,CAC/D,WACA,YAAY;AAGd,SAAgBC,GACdC,GACqC;CACrC,OAAOA,MAAS,WAAWH,IAAmBD;AAChD;AAEA,SAAgBK,GACdD,GAC0B;CAC1B,OAAOA,MAAS,WAAW,WAAW;AACxC;AAEA,SAAgBE,GAAmBvB,GAA6C;CAC9E,OAAO,CAACmB,EAAoBK,SAASxB,CAAQ;AAC/C;AAEA,SAAgByB,GACdvB,GACgC;CAChC,OACE,OAAOA,KAAU,cACjBA,KACA,cAAcA,KACd,OAAQA,EAAgCF,YAAa;AAEzD;AAOA,SAAgB0B,GAAexB,GAAyB;CAEtD,OADKuB,GAAwBvB,CAAK,IAC3B,CAACqB,GAAmBrB,EAAMF,QAAQ,KAAKE,EAAMA,MAAMyB,KAAK,MAAM,KADzB;AAE9C;AAEA,SAAgBC,GACdC,GACA,EAAE7B,aAAUE,YACH;CACT,IAAIF,MAAa,WACf,OAAO6B,KAAc,QAAmCA,MAAc;CAExE,IAAI7B,MAAa,cACf,OAAO6B,KAAc,QAAmCA,MAAc;CAGxE,IAAME,IAAa7B,EAAMyB,KAAK;CAC9B,IAAII,MAAe,IAAI,OAAO;CAE9B,IAAMC,IAAc,OAAOH,KAAc,WAAWA,IAAYI,KAC1DE,IAAgBF,OAAOF,CAAU,GACjCK,IACJ,CAACH,OAAOI,MAAML,CAAW,KAAK,CAACC,OAAOI,MAAMF,CAAa;CAE3D,QAAQnC,GAAR;EACE,KAAK,eACH,OAAOoC,KAAkBJ,IAAcG;EACzC,KAAK,sBACH,OAAOC,KAAkBJ,KAAeG;EAC1C,KAAK,YACH,OAAOC,KAAkBJ,IAAcG;EACzC,KAAK,mBACH,OAAOC,KAAkBJ,KAAeG;EAC1C,SACE;CACJ;CAEA,IAAMG,IAAWC,OAAOV,KAAa,EAAE,CAAC,CAACW,YAAY,GAC/CC,IAASV,EAAWS,YAAY;CAEtC,QAAQxC,GAAR;EACE,KAAK,YACH,OAAOsC,EAASd,SAASiB,CAAM;EACjC,KAAK,UACH,OAAOL,IAAiBJ,MAAgBG,IAAgBG,MAAaG;EACvE,KAAK,aACH,OAAOL,IAAiBJ,MAAgBG,IAAgBG,MAAaG;EACvE,KAAK,cACH,OAAOH,EAAS7B,WAAWgC,CAAM;EACnC,KAAK,YACH,OAAOH,EAAS5B,SAAS+B,CAAM;EACjC,SACE,OAAO;CACX;AACF;AAOA,SAAgBC,GAGdC,GAA4BG,GAAkBC,GAA+B;CAE7E,OADA,CAAKtB,GAAwBsB,CAAW,KACjCnB,GAAce,EAAIK,SAASF,CAAQ,GAAGC,CAAW;AAC1D;;;AC1JA,IAAMoB,KAAyC;CAAEC,UAAU;CAAYC,OAAO;AAAG;AAEjF,SAASC,GAAcD,GAAuC;CAC5D,OAAOL,GAAwBK,CAAK,IAAIA,IAAQF;AAClD;AAQA,SAAOI,KAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAC,UAAAC,OAAAC,mBAAmCpB,EAAqB,GACxDqB,IAAevB,EAAYqB,GAAIG,EAAgC,GAC/DC,IAAsBzB,EACpBoB,EAAKM,OACLC,EACF;CAEA,IAAI,CAACJ,GAAM,OAAS;CAAK,IAAAK,GAAAC;CAAA,AAAAX,EAAA,OAAAE,KAStBQ,IAAAV,EAAA,IAAAW,IAAAX,EAAA,OAPHU,IAA0BR,EAAKU,kBACV,CAAC,CAAAC,OACZC,EAAiC,GAErBH,IAAAD,EAAiBK,IAAKC,EAG1C,GAAChB,EAAA,KAAAE,GAAAF,EAAA,KAAAU,GAAAV,EAAA,KAAAW;CAHH,IAAAM,IAAsBN,GAGlBO;CAAA,AAAAlB,EAAA,OAAAO,KAAAP,EAAA,OAAAE,KAAAF,EAAA,OAAAG,KAEJe,IAAA,SAAAE,GAAA;EACE,IAAAC,IAAkBd,EAAaM,QAAQA,MAAYA,EAAMS,OAAQF,CAAQ;EAEzE,AADAlB,EAAKqB,iBAAkBF,CAAS,GAC5BA,EAASG,WAAY,KAAGrB,EAAEsB,QAAQC,iBAAkB;CAAE,GAC3D1B,EAAA,KAAAO,GAAAP,EAAA,KAAAE,GAAAF,EAAA,KAAAG,GAAAH,EAAA,KAAAkB,KAAAA,IAAAlB,EAAA;CAJD,IAAAmB,IAAAD,GAICS;CAAA,AAAA3B,EAAA,OAAAO,KAAAP,EAAA,OAAAE,KAAAF,EAAA,OAAAG,KAEDwB,IAAA,SAAAE,GAAAC,GAAA;EACE,IAAAC,IAAgBjC,GACdS,EAAayB,MAAMC,MAAYpB,EAAMS,OAAQO,CAAmB,CAAC,EAAAhC,KACnE,GACAqC,IAAehC,EAAKiC,UAAWL,CAAU;EAkBzC3B,AAjBAD,EAAKqB,iBACHhB,EAAaM,QACHuB,MAAYvB,EAAMS,OAAQQ,CAAU,CAAC,CAAAf,KACxCsB,MACHxB,EAAMS,OAAQO,IAAd;GAAAP,IAEUQ;GAAUjC,OACP;IAAAD,UACKN,GACR4C,IAAShD,GAAcgD,CAAiB,IAAxC,QACF;IAACrC,OACMkC,EAAOlC;GAChB;EAEG,IAVTwC,CAWF,CACJ,GACAlC,EAAEsB,QAAQa,gBAAiBR,CAAU;CAAC,GACvC9B,EAAA,KAAAO,GAAAP,EAAA,KAAAE,GAAAF,EAAA,KAAAG,GAAAH,EAAA,MAAA2B,KAAAA,IAAA3B,EAAA;CAvBD,IAAA4B,IAAAD,GAuBCY;CAAA,AAAAvC,EAAA,QAAAO,KAAAP,EAAA,QAAAE,KAEDqC,IAAA,SAAAE,GAAAC,GAAA;EACExC,EAAKqB,iBACHhB,EAAaQ,KAAK4B,MAChB9B,EAAMS,OAAQF,IAAd;GAAA,GACSP;GAAMhB,OAAS;IAAA,GAAKC,GAAce,EAAMhB,KAAM;IAAC,GAAK6C;GAAM;EAC1D,IAFTC,CAGF,CACF;CAAC,GACF3C,EAAA,MAAAO,GAAAP,EAAA,MAAAE,GAAAF,EAAA,MAAAuC,KAAAA,IAAAvC,EAAA;CARD,IAAAwC,IAAAD,GAQCK;CAAA,AAAA5C,EAAA,QAAAO,KAAAP,EAAA,QAAAU,KAAAV,EAAA,QAAAE,KAED0C,IAAA,WAAA;EACE,IAAAE,IAAmBpC,EAAiBsB,MAClCe,MAAY,CAACxC,EAAayC,MAAMC,MAAYpC,EAAMS,OAAQ4B,EAAM5B,EAAG,CACrE;EACKwB,KACL5C,EAAKqB,iBAAkB,CAAA,GAClBhB,GACH;GAAAe,IACMwB,EAAUxB;GAAGzB,OACV;IAAAD,UACKN,GAAmBJ,GAAc4D,CAAU,CAAC;IAACjD,OAChD;GACT;EACF,CAAC,CACF;CAAC,GACHG,EAAA,MAAAO,GAAAP,EAAA,MAAAU,GAAAV,EAAA,MAAAE,GAAAF,EAAA,MAAA4C,KAAAA,IAAA5C,EAAA;CAfD,IAAA6C,IAAAD,GAeCO;CAAA,IAAAnD,EAAA,QAAA4B,KAAA5B,EAAA,QAAAO,KAAAP,EAAA,QAAAiB,KAAAjB,EAAA,QAAAI,KAAAJ,EAAA,QAAAwC,KAAAxC,EAAA,QAAAmB,KAAAnB,EAAA,QAAAE,GAAA;EAAA,IAAAkD;EAiEOpD,AAjEPA,EAAA,QAAA4B,KAAA5B,EAAA,QAAAiB,KAAAjB,EAAA,QAAAI,KAAAJ,EAAA,QAAAwC,KAAAxC,EAAA,QAAAmB,KAAAnB,EAAA,QAAAE,KAKwBkD,KAAAC,MAAA;GACjB,IAAAC,IAAepD,EAAKiC,UAAWtB,EAAMS,EAAG,GACxCzB,IAAcC,GAAce,EAAMhB,KAAM,GACxC0D,IAAaL,IAAShE,GAAcgE,CAAiB,IAAxC,UACbM,IAAmB/D,GAAmBI,EAAKD,QAAS;GAAE,OAGpD,kBAAA,OAAA;IAAgC,WAAAb,GAAO0E;cAAvC;KACE,kBAAC,GAAD;MACU,SAAA;MACF,OAAA;MACD,MAAA;MACM,cAAA;MACF,eAAMtC,EAAaN,EAAMS,EAAG;gBAErC,kBAAC,GAAD;OAAiB,MAAA;OAAY,QAAA;MAAG,CAAA;KAPvB,CAAA;KAUX,kBAAC,GAAD;MACQ,OAAA;MACAlB,MAAAA;MACH,GAAA;MACY,eAAA;MACTa,MAAAA;MACC,OAAAJ,EAAMS;MACH,WAAAoC,MAAUA,KAAQ9B,EAAmBf,EAAMS,IAAKoC,CAAI;KAAC,CAAA;KAGjE,kBAAC,GAAD;MACQ,OAAA;MACAtD,MAAAA;MACH,GAAA;MACY,eAAA;MACT,MAAAb,GAAoBgE,CAAI,CAAC,CAAAxC,IAAK4C,EAGlC;MACK,OAAA9D,EAAKD;MACF,WAAAgE,MACRA,KACApB,EAAY3B,EAAMS,IAAK,EAAA1B,UACX8D,EACZ,CAAC;KAAC,CAAA;KAIN,kBAAC,GAAD;MACQ,OAAA;MACAtD,MAAAA;MACH,GAAA;MACG,MAAAmD,MAAS,YAATC,IAAA,WAAA;MACI,UAAA,CAACA;MACE,aAAAA,IAAA,iBAAA;MACN,OAAAA,IAAa3D,EAAKA,QAAlB;MACG,WAAAgE,MACRrB,EAAY3B,EAAMS,IAAK,EAAAzB,OAASgE,EAAKC,cAAcjE,MAAO,CAAC;KAAC,CAAA;IAG5D;MAnDIgB,EAAMS,EAmDV;EAAA,GAETtB,EAAA,MAAA4B,GAAA5B,EAAA,MAAAiB,GAAAjB,EAAA,MAAAI,GAAAJ,EAAA,MAAAwC,GAAAxC,EAAA,MAAAmB,GAAAnB,EAAA,MAAAE,GAAAF,EAAA,MAAAoD,KAAAA,IAAApD,EAAA,KA5DAmD,IAAA5C,EAAaQ,IAAKqC,CA4DlB,GAACpD,EAAA,MAAA4B,GAAA5B,EAAA,MAAAO,GAAAP,EAAA,MAAAiB,GAAAjB,EAAA,MAAAI,GAAAJ,EAAA,MAAAwC,GAAAxC,EAAA,MAAAmB,GAAAnB,EAAA,MAAAE,GAAAF,EAAA,MAAAmD;CAAA,OAAAA,IAAAnD,EAAA;CAAA,IAAAoD;CAAA,AAAApD,EAAA,QAAA+D,OAAAC,IAAA,2BAAA,KAKOZ,IAAA,EAAAa,WAAa,aAAa,GAACjE,EAAA,MAAAoD,KAAAA,IAAApD,EAAA;CAAA,IAAAkE;CAAA,AAAAlE,EAAA,QAAA6C,IAI3BqB,IAAAlE,EAAA,OAPTkE,IAAA,kBAAC,GAAD;EACU,SAAA;EACH,MAAA;EACE,OAAAd;EACEP,SAAAA;YACV;CALM,CAAA,GAOE7C,EAAA,MAAA6C,GAAA7C,EAAA,MAAAkE;CAAA,IAAAC;CAEP,OAFOnE,EAAA,QAAAmD,KAAAnD,EAAA,QAAAkE,KAvEbC,IAAA,kBAAA,OAAA;EAAgB,WAAApF,GAAOqF;YACrB,kBAAC,GAAD;GAAW,KAAA;aAAX,CACGjB,GA8DDe,CA/DI;;CAwEF,CAAA,GAAAlE,EAAA,MAAAmD,GAAAnD,EAAA,MAAAkE,GAAAlE,EAAA,MAAAmE,KAAAA,IAAAnE,EAAA,KAzENmE;AAyEM;AAvJH,SAAAR,GAAA/D,GAAA;CAAA,OAiH4D;EAAAC,OAC1CD;EAAQyE,OACRhF,GAAuBO;CAChC;AAAC;AApHV,SAAAoB,GAAAsD,GAAA;CAAA,OAcoD;EAAAzE,OAChDqD,EAAM5B;EAAG+C,OACTpF,GAAeiE,CAAM;CAC9B;AAAC;AAjBI,SAAApC,GAAAoC,GAAA;CAAA,OAYiBA,EAAMqB,aAAc;AAAC;AAZtC,SAAA9D,GAAA+D,GAAA;CAAA,OAKQC,EAAKlE;AAAc;AAL3B,SAAAD,GAAAmE,GAAA;CAAA,OAEqCA,EAAKC;AAAgB;;;;AEgBjE,SAAgBoB,GACdC,GAcwB;CACxB,OAAO;EACLX,SAASW,EAAQG,kBAAkB;EACnCb,WAAWU,EAAQI,wBAAwB;EAC3Cb,QAAQS,EAAQK,iBAAiB;EACjCb,SAASQ,EAAQM,wBAAwB;EACzCb,UAAUO,EAAQO,yBAAyB;EAC3Cb,UAAUM,EAAQQ,yBAAyB;EAC3Cb,cAAcK,EAAQS,uBAAuB;EAC7Cb,kBAAkBI,EAAQJ,oBAAoB;EAG9CC,uBACEG,EAAQH,yBAAyBG,EAAQJ,qBAAqB;EAChEE,YACEE,EAAQU,qBAAqB,MAAQV,EAAQW,qBAAqB;CACtE;AACF;AAuBA,SAAgBQ,GACdC,GACAC,GAC8B;CAC9B,OAAO;EACLR,SAASQ,EAAShC,WAAW+B,EAAOE,WAAW;EAC/CR,WAAWO,EAAS/B,aAAa8B,EAAOG,aAAa;EACrDR,SAASM,EAAS9B,UAAU6B,EAAOI,WAAW;EAC9CR,QAAQK,EAAS7B,WAAW4B,EAAOK,UAAU;EAC7CR,WAAWI,EAAS5B,YAAY2B,EAAOM,aAAa;EAEpDR,YAAYG,EAAS3B,YAAYX,GAAoBqC,CAAM;CAC7D;AACF;AAaA,SAAgBe,GACdC,GACAf,GACwB;CACxB,IAAMgB,IAAUD,EAAME,kBAAkB,GAClCC,KAAOC,MACXH,EAAQK,MAAMtB,MAAWoB,EAAUrB,GAAsBC,GAAQC,CAAQ,CAAC,CAAC;CAE7E,OAAO;EACLO,YAAYW,GAAKI,MAAMA,EAAE9B,OAAO;EAChCgB,cAAcU,GAAKI,MAAMA,EAAE7B,SAAS;EACpCgB,YAAYS,GAAKI,MAAMA,EAAE5B,OAAO;EAChCgB,WAAWQ,GAAKI,MAAMA,EAAE3B,MAAM;EAC9BgB,eAAeO,GAAKI,MAAMA,EAAEzB,UAAU;EACtCe,eAAeZ,EAAS1B;EACxBuC,aAAab,EAASvB;CACxB;AACF;;;AChHA,SAAgBwE,GACdC,GACyB;CACzB,IAAM,EAAEb,cAAWC,gBAAaY,EAAME,MAAMC,MAAMC;CAClD,OAAO;EACLjB;EACAC;EACAC,WAAWW,EAAMK,aAAa;EAC9Bf,UAAUU,EAAMM,YAAY;EAC5Bf,iBAAiBS,EAAMO,mBAAmB;EAC1Cf,aAAaQ,EAAMQ,eAAe;EAClCf,eAAegB,MAAUT,EAAMP,aAAagB,CAAK;EACjDf,cAAcgB,MAASV,EAAMN,YAAYgB,CAAI;EAC7Cf,oBAAoBK,EAAML,aAAa;EACvCC,gBAAgBI,EAAMJ,SAAS;EAC/BC,iBAAiBG,EAAMH,UAAU;EACjCC,gBAAgBE,EAAMF,SAAS;CACjC;AACF;AAkBA,SAAOiB,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAA0B,EAAAN,iBAAAO,GAAAf,kBAAAY,GAC/BJ,IAAAO,MAAAC,KAAAA,IAAA;EAAmB;EAAI;EAAI;EAAI;CAAG,IAAlCD,GAGA,EAAAnB,UAAAqB,aAAAC,mBAAyCzC,EAAqB;CAG9D,IAFAH,EAAYsB,EAAKE,KAAM,GAEnB,CAACpB,GAAoBkB,GAAOqB,CAAQ,CAAC,CAAAE,aAAY,OAAS;CAE9D,IAAInB,GAAU;EAAA,IAAAoB;EAAA,AAAAP,EAAA,OAAAb,KAAAa,EAAA,OAAAjB,KAGPwB,IAAApB,EAAWL,GAA2BC,CAAK,CAAC,GAACiB,EAAA,KAAAb,GAAAa,EAAA,KAAAjB,GAAAiB,EAAA,KAAAO,KAAAA,IAAAP,EAAA;EAAA,IAAAQ;EAC1C,OAD0CR,EAAA,OAAAO,IAC1CC,IAAAR,EAAA,MAFNQ,IAAA,kBAAA,OAAA;GAAgB,WAAA7C,GAAO8C;aACpBF;EACG,CAAA,GAAAP,EAAA,KAAAO,GAAAP,EAAA,KAAAQ,IAFNA;CAEM;CAIV,IAAA,EAAAtC,cAAAC,gBAAgCY,EAAKE,MAAMC,MAAMC,YAAYoB;CAAA,AAAAP,EAAA,OAAAjB,IAC5BwB,IAAAP,EAAA,MAAnBO,IAAAxB,EAAKM,YAAa,GAACW,EAAA,KAAAjB,GAAAiB,EAAA,KAAAO;CAAjC,IAAAG,IAAcH,GACdI,IAAaD,MAAU,IAAV,IAAkBxC,IAAYC,IAAW,GACtDyC,IAAWC,KAAIC,IAAKJ,IAAQxC,IAAY,KAAKC,CAAQ,GAIrD4C,IAAoBpB,EAAeqB,SAAU7C,CAEU,IAFnCwB,IAEhB,CAAA,GAAIA,GAAiBxB,CAAQ,CAAC,CAAA8C,KAAMC,EAAe,GAAEV;CAAA,AAAAR,EAAA,OAAAK,IAO5CG,IAAAR,EAAA,MAFPQ,IAAA,kBAAC,GAAD;EAAYH,MAAAA;EAAe,GAAA;YAAS;CAA/B,CAAA,GAEEL,EAAA,KAAAK,GAAAL,EAAA,KAAAQ;CAAA,IAAAW;CAAA,AAAAnB,EAAA,OAAAe,IAMwBI,IAAAnB,EAAA,OAAvBmB,IAAAJ,EAAWK,IAAKC,MAAM,GAACrB,EAAA,KAAAe,GAAAf,EAAA,MAAAmB;CACtB,IAAAG,IAAAD,OAAOlD,CAAQ,GAACoD;CAAA,AAAAvB,EAAA,QAAAL,KAAAK,EAAA,QAAAjB,KACbwC,KAAAC,MAAA;EAERzC,AADAA,EAAKN,YAAagD,OAAOD,CAA2B,KAAjB7B,EAAe,EAAG,GACrDZ,EAAKP,aAAc,CAAC;CAAC,GACtBwB,EAAA,MAAAL,GAAAK,EAAA,MAAAjB,GAAAiB,EAAA,MAAAuB,KAAAA,IAAAvB,EAAA;CAAA,IAAA0B;CAAA,AAAA1B,EAAA,QAAAK,KAAAL,EAAA,QAAAmB,KAAAnB,EAAA,QAAAsB,KAAAtB,EAAA,QAAAuB,KAVHG,IAAA,kBAAC,GAAD;EACQrB,MAAAA;EACH,GAAA;EACY,eAAA;EACP,SAAA;EACF,MAAAc;EACC,OAAAG;EACG,UAAAC;CAGT,CAAA,GACDvB,EAAA,MAAAK,GAAAL,EAAA,MAAAmB,GAAAnB,EAAA,MAAAsB,GAAAtB,EAAA,MAAAuB,GAAAvB,EAAA,MAAA0B,KAAAA,IAAA1B,EAAA;CAAA,IAAA2B;CAAA,AAAA3B,EAAA,QAAAQ,KAAAR,EAAA,QAAA0B,KAfJC,IAAA,kBAAC,GAAD;EAAW,KAAA;EAAU,MAAA;YAArB,CACEnB,GAGAkB,CAJI;KAgBE1B,EAAA,MAAAQ,GAAAR,EAAA,MAAA0B,GAAA1B,EAAA,MAAA2B,KAAAA,IAAA3B,EAAA;CAAA,IAAA4B;CAAA,AAAA5B,EAAA,QAAAK,KAAAL,EAAA,QAAAW,KAAAX,EAAA,QAAAY,KAAAZ,EAAA,QAAAU,KAERkB,IAAA,kBAAC,GAAD;EAAYvB,MAAAA;EAAe,GAAA;YAA3B;GACGM;GAAK;GAAEC;GAAG;GAAKF;EADb;KAEEV,EAAA,MAAAK,GAAAL,EAAA,MAAAW,GAAAX,EAAA,MAAAY,GAAAZ,EAAA,MAAAU,GAAAV,EAAA,MAAA4B,KAAAA,IAAA5B,EAAA;CAAA,IAAA6B;CAAA,AAAA7B,EAAA,QAAAjB,IAOkC8C,IAAA7B,EAAA,OAA1B6B,IAAA9C,EAAKO,mBAAoB,GAACU,EAAA,MAAAjB,GAAAiB,EAAA,MAAA6B;CAA3B,IAAAC,IAAA,CAACD,GAA0BE;CAAA,AAAA/B,EAAA,QAAAjB,IACFgD,IAAA/B,EAAA,OAA1B+B,UAAMhD,EAAKL,aAAc,GAACsB,EAAA,MAAAjB,GAAAiB,EAAA,MAAA+B;CAAA,IAAAC;CAAA,AAAAhC,EAAA,QAAAiC,OAAAC,IAAA,2BAAA,KAEnCF,IAAA,kBAAC,GAAD;EAAuB,MAAA;EAAY,QAAA;CAAG,CAAA,GAAIhC,EAAA,MAAAgC,KAAAA,IAAAhC,EAAA;CAAA,IAAAmC;CAAA,AAAAnC,EAAA,QAAA8B,KAAA9B,EAAA,QAAA+B,KAP5CI,IAAA,kBAAC,GAAD;EACU,SAAA;EACF,OAAA;EACK,cAAA;EACD,UAAAL;EACD,SAAAC;YAETC;CAPS,CAAA,GAQEhC,EAAA,MAAA8B,GAAA9B,EAAA,MAAA+B,GAAA/B,EAAA,MAAAmC,KAAAA,IAAAnC,EAAA;CAAA,IAAAoC;CAAA,AAAApC,EAAA,QAAAjB,IAKsBqD,IAAApC,EAAA,OAAtBoC,IAAArD,EAAKQ,eAAgB,GAACS,EAAA,MAAAjB,GAAAiB,EAAA,MAAAoC;CAAvB,IAAAC,KAAA,CAACD,GAAsBE;CAAA,AAAAtC,EAAA,QAAAjB,IACFuD,IAAAtC,EAAA,OAAtBsC,UAAMvD,EAAKJ,SAAU,GAACqB,EAAA,MAAAjB,GAAAiB,EAAA,MAAAsC;CAAA,IAAAC;CAAA,AAAAvC,EAAA,QAAAiC,OAAAC,IAAA,2BAAA,KAE/BK,IAAA,kBAAC,GAAD;EAAwB,MAAA;EAAY,QAAA;CAAG,CAAA,GAAIvC,EAAA,MAAAuC,KAAAA,IAAAvC,EAAA;CAAA,IAAAwC;CAAA,AAAAxC,EAAA,QAAAqC,MAAArC,EAAA,QAAAsC,KAP7CE,IAAA,kBAAC,GAAD;EACU,SAAA;EACF,OAAA;EACK,cAAA;EACD,UAAAH;EACD,SAAAC;YAETC;CAPS,CAAA,GAQEvC,EAAA,MAAAqC,IAAArC,EAAA,MAAAsC,GAAAtC,EAAA,MAAAwC,KAAAA,IAAAxC,EAAA;CAAA,IAAAyC;CAAA,AAAAzC,EAAA,QAAAmC,KAAAnC,EAAA,QAAAwC,KAlBfC,IAAA,kBAAC,GAAD;EAAY,KAAA;EAAQ,MAAA;YAApB,CACEN,GASAK,CAVI;KAmBExC,EAAA,MAAAmC,GAAAnC,EAAA,MAAAwC,GAAAxC,EAAA,MAAAyC,KAAAA,IAAAzC,EAAA;CAAA,IAAA0C;CACJ,OADI1C,EAAA,QAAAyC,KAAAzC,EAAA,QAAA2B,KAAA3B,EAAA,QAAA4B,KA1CVc,IAAA,kBAAA,OAAA;EAAgB,WAAA/E,GAAO8C;YAAvB;GACEkB;GAkBAC;GAIAa;EAoBI;KAAAzC,EAAA,MAAAyC,GAAAzC,EAAA,MAAA2B,GAAA3B,EAAA,MAAA4B,GAAA5B,EAAA,MAAA0C,KAAAA,IAAA1C,EAAA,KA3CN0C;AA2CM;AAxEH,SAAAxB,GAAAyB,GAAAC,GAAA;CAAA,OA0B6CD,IAAIC;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AIzEzD,SAAgBW,GACdC,GACAC,GACwB;CAGxB,OAFID,EAAcE,KAAKC,SAASF,CAAQ,IAAU,SAC9CD,EAAcI,MAAMD,SAASF,CAAQ,IAAU,UAC5C;AACT;AAGA,SAASI,GACPC,GACAE,GACAC,GACAC,GACe;CACf,IAAME,IAAYN,EAAIO,QAAQC,MAAOA,MAAON,CAAO,GAC7CO,IAAcH,EAAUI,QAAQP,CAAQ;CAG9C,OAFIM,MAAgB,KAAW,CAAC,GAAGT,CAAG,KACtCM,EAAUK,OAAOP,MAAS,WAAWK,IAAcA,IAAc,GAAG,GAAGP,CAAO,GACvEI;AACT;AAoBA,SAAgBQ,GAAW,EACzBD,UACAlB,aACAQ,aACAC,WACuB;CACvB,IAAIT,MAAaQ,GAAU;CAE3B,IAAMT,IAAgBmB,EAAME,MAAMC,MAAMtB,eAClCuB,IAASxB,GAAgBC,GAAeC,CAAQ;CACtD,IAAIsB,MAAWxB,GAAgBC,GAAeS,CAAQ,GAAG;CAEzD,IAAMe,IAAUL,EAAMM,kBAAkB,CAAC,CAACC,KAAKC,MAAWA,EAAOb,EAAE;CAGnE,AAFAK,EAAMS,eAAevB,GAAWmB,GAASvB,GAAUQ,GAAUC,CAAI,CAAC,GAE9Da,MAAW,YACbJ,EAAMU,kBAAkBC,OAAc;EACpC,GAAGA;GACFP,IAASlB,GAAWyB,EAASP,IAAStB,GAAUQ,GAAUC,CAAI;CACjE,EAAE;AAEN;AAGA,SAASqB,GACPZ,GACAI,GACmB;CAGnB,OAFIA,MAAW,SAAeJ,EAAMa,0BAA0B,IAC1DT,MAAW,UAAgBJ,EAAMc,2BAA2B,IACzDd,EAAMe,4BAA4B;AAC3C;AAgBA,SAAgBG,GAAoB,EAClClB,UACAlB,aACAmC,gBACoC;CAEpC,IAAME,IAAUP,GAAiBZ,GADlBpB,GAAgBoB,EAAME,MAAMC,MAAMtB,eAAeC,CACxBsB,CAAM,GACxCgB,IAAQD,EAAQE,WAAWb,MAAWA,EAAOb,OAAOb,CAAQ;CAClE,IAAIsC,MAAU,IAAI,OAAO;CAEzB,IAAME,IAASH,EAAQC,IAAQH;CAE/B,OADI,CAACK,KAAU,CAACjD,GAAoBiD,CAAM,IAAU,OAC7CA;AACT;AAGA,SAAgBC,GAAiB,EAC/BvB,UACAlB,aACAmC,gBACuB;CACvB,IAAMK,IAASJ,GAAoB;EAAElB;EAAOlB;EAAUmC;CAAU,CAAC;CAC5DK,KAELrB,GAAW;EACTD;EACAlB;EACAQ,UAAUgC,EAAO3B;EACjBJ,MAAM0B,MAAc,KAAK,WAAW;CACtC,CAAC;AACH;;;ACtIA,IAAac,IAAmB;AAiBhC,SAAAC,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAkD,EAAAC,aAAAH,GAIjDI;CAAA,AAAAH,EAAA,OAAAE,IAE+BC,IAAAH,EAAA,MADeG,UAC3CD,EAAKE,qBAAsB,GAACJ,EAAA,KAAAE,GAAAF,EAAA,KAAAG;CAD9B,IAAAE,IAAoBd,EAAYW,EAAKI,OAAQH,CAE7C,GAAEI;CAAA,AAAAP,EAAA,OAAAE,IAE6BK,IAAAP,EAAA,MADeO,UAC5CL,EAAKM,sBAAuB,GAACR,EAAA,KAAAE,GAAAF,EAAA,KAAAO;CAQZ,IAAAG,IATEnB,EAAYW,EAAKI,OAAQC,CAS3BE,KAAA,CAAiBJ,GAAWM;CAAA,AAAAX,EAAA,OAAAE,IACMS,IAAAX,EAAA,MAAvCW,IAAAT,EAAKU,gCAAiC,GAACZ,EAAA,KAAAE,GAAAF,EAAA,KAAAW;CAAA,IAAAE;CACjD,OADiDb,EAAA,OAAAK,KAAAL,EAAA,OAAAU,KAAAV,EAAA,OAAAW,KALnDE,IAAA,kBAAC,GAAD;EACO,MAAA;EACM,cAAA;EACFR,SAAAA;EACM,eAAAK;EACL,UAAAC;CAAuC,CAAA,GACjDX,EAAA,KAAAK,GAAAL,EAAA,KAAAU,GAAAV,EAAA,KAAAW,GAAAX,EAAA,KAAAa,KAAAA,IAAAb,EAAA,IANFa;AAME;AAIN,SAAAC,GAAAf,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAkD,EAAAc,WAAAhB,GAIjDI;CAAA,AAAAH,EAAA,OAAAe,IACwEZ,IAAAH,EAAA,MAAzBG,UAAMY,EAAGC,cAAe,GAAChB,EAAA,KAAAe,GAAAf,EAAA,KAAAG;CAAvE,IAAAc,IAAiB1B,EAAYwB,EAAGb,MAAMI,OAAQH,CAAyB,GAAEI;CAAA,AAAAP,EAAA,OAAAe,IAEhDR,IAAAP,EAAA,MADyBO,UAChDQ,EAAGG,kBAAmB,GAAClB,EAAA,KAAAe,GAAAf,EAAA,KAAAO;CADzB,IAAAE,IAAqBlB,EAAYwB,EAAGb,MAAMI,OAAQC,CAElD,GAAEG;CAAA,AAAAV,EAAA,OAAAe,IAO+BL,IAAAV,EAAA,MAAlBU,IAAAK,EAAGI,aAAc,GAACnB,EAAA,KAAAe,GAAAf,EAAA,KAAAU;CAAnB,IAAAC,IAAA,CAACD,GACIG,IAAAJ,KAAA,CAAiBQ,GAAQG;CAAA,AAAApB,EAAA,OAAAe,IACAK,IAAApB,EAAA,MAA9BoB,IAAAL,EAAGM,yBAA0B,GAACrB,EAAA,KAAAe,GAAAf,EAAA,KAAAoB;CAAA,IAAAE;CAGxC,OAHwCtB,EAAA,OAAAiB,KAAAjB,EAAA,OAAAW,KAAAX,EAAA,QAAAa,KAAAb,EAAA,QAAAoB,KAN1CE,IAAA,kBAAC,GAAD;EACO,MAAA;EACM,cAAA;EACFL,SAAAA;EACC,UAAAN;EACK,eAAAE;EACL,UAAAO;EAED,SAAAG;CAAkC,CAAA,GAC3CvB,EAAA,KAAAiB,GAAAjB,EAAA,KAAAW,GAAAX,EAAA,MAAAa,GAAAb,EAAA,MAAAoB,GAAApB,EAAA,MAAAsB,KAAAA,IAAAtB,EAAA,KATFsB;AASE;AApBN,SAAAC,GAAAC,GAAA;CAAA,OAmB0BA,EAAKC,gBAAiB;AAAC;AASjD,SAAgBC,KAId;CACA,OAAO;EACLE,IAAI/B;EACJgC,MAAM;GACJC,OAAO;GACPC,OAAO;GAGPC,gBAAgB;EAClB;EACAC,MAAM;EACNC,SAAS;EACTC,SAAS;EACTC,gBAAgB;EAChBC,eAAe;EACfC,oBAAoB;EACpBC,oBAAoB;EAEpBC,eAAe;EACfC,SAAS,EAAEvC,eAAY,kBAAC,IAAD,EAA0BA,SAAM,CAAA;EACvDwC,OAAO,EAAE3B,aAAU,kBAAC,IAAD,EAAwBA,OAAI,CAAA;CACjD;AACF;;;AC1EA,IAAa+B,KAAoB;CAC/B;CACA;CACA;CACA;AAAY,GAODG,KAAwB;CACnC;CACA;CACA;CACA;AAAe;AAkCjB,SAASiB,GACPC,GACAC,GACoB;CACpB,IAAI,CAACD,GAAO,OAAO;CACnB,IAAI,OAAOA,KAAU,UAAU,OAAO;EAAEd,KAAKc;EAAOb,QAAQc;CAAc;CAE1E,IAAM,CAACf,GAAKC,KAAUa;CAGtB,OAFKd,IAEE;EAAEA;EAAaC;CAAyC,IAF9C;AAGnB;AAEA,SAASe,GACPC,GACgB;CAChB,IAAI,CAACA,GAAa,OAAO;CAEzB,IAAI;EAEF,OADI,OAAOE,SAAW,MAAoB,OACnCF,EAAYV,gBAAgB,mBAC/BY,OAAOC,iBACPD,OAAOE;CACb,QAAQ;EACN,OAAO;CACT;AACF;AAWA,SAASC,EAAKb,GAAgBT,GAAsB;CAClD,OAAO,OAAOS,KAAU,YAAYA,IAC/BA,EAAkCT,KACnCwB,KAAAA;AACN;AAEA,IAAMC,MAAYhB,MAAoC,OAAOA,KAAU,UAEjEiB,MAAkBjB,MACtB,OAAOA,KAAU,YAAYkB,OAAOC,SAASnB,CAAK;AAEpD,SAASoB,GACPpB,GACAqB,GACS;CACT,OAAOE,MAAMC,QAAQxB,CAAK,KAAKA,EAAMyB,MAAMJ,CAAM;AACnD;AAEA,SAASK,GACP1B,GACAqB,GACS;CAIT,OAHI,OAAOrB,KAAU,aAAYA,KAAkBuB,MAAMC,QAAQxB,CAAK,IAC7D,KAEF2B,OAAOC,OAAO5B,CAAK,CAAC,CAACyB,MAAMJ,CAAM;AAC1C;AAEA,IAAMQ,MAAexB,MAA4BW,GAASH,EAAKR,GAAO,IAAI,CAAC,GAErEyB,KAGF;CACFC,gBAAgB/B,MAAUoB,GAAUpB,GAAO6B,EAAW;CAGtDG,oBAAoB;CACpBC,UAAUjC,MACRoB,GACEpB,IACCK,MAAUwB,GAAYxB,CAAK,KAAK,OAAOQ,EAAKR,GAAO,MAAM,KAAM,SAClE;CACF6B,aAAalC,MAAU;EACrB,IAAMmC,IAAYtB,EAAKb,GAAO,WAAW,GACnCoC,IAAWvB,EAAKb,GAAO,UAAU;EACvC,OACEiB,GAAekB,CAAS,KACxBA,KAAa,KACblB,GAAemB,CAAQ,KACvBA,IAAW;CAEf;CACAC,mBAAmBrC,MACjB0B,GAAW1B,IAAQK,MAAU,OAAOA,KAAU,SAAS;CACzDiC,eAAetC,MAAU0B,GAAW1B,GAAOiB,EAAc;CACzDsB,cAAcvC,MAAUoB,GAAUpB,GAAOgB,EAAQ;CACjDwB,gBAAgBxC,MACdoB,GAAUP,EAAKb,GAAO,MAAM,GAAGgB,EAAQ,KACvCI,GAAUP,EAAKb,GAAO,OAAO,GAAGgB,EAAQ;AAC5C;AAEA,SAASyB,GAAaC,GAAwB1C,GAAyB;CACrE,IAAM2C,IAAQb,GAAaY;CAC3B,OAAOC,MAAU5B,KAAAA,KAAa4B,EAAM3C,CAAK;AAC3C;AAEA,SAAS4C,GACPC,GACAC,GACA5C,GACoB;CACpB,IAAI,CAAC2C,KAAW,CAACC,GAAU,OAAO,CAAC;CACnC,IAAI;EACF,IAAMC,IAAMF,EAAQG,QAAQF,EAASvD,GAAG;EACxC,IAAI,CAACwD,GAAK,OAAO,CAAC;EAClB,IAAME,IAAS/C,EAAY6C,CAAG;EAC9B,IAAI,OAAOE,KAAW,aAAYA,GAAiB,OAAO,CAAC;EAE3D,IAAMC,IAASD,GACTE,IAAoC,CAAC;EAG3C,KAAK,IAAMT,KAASI,EAAStD,QACrBkD,KAASQ,KACVT,GAAaC,GAAOQ,EAAOR,EAAM,MACtCS,EAAST,KAASQ,EAAOR;EAE3B,OAAOS;CACT,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAASC,GACPP,GACAC,GACAO,GACAtD,GACM;CACN,IAAI,CAAC8C,KAAW,CAACC,GAAU;CAC3B,IAAMQ,IAAmC,CAAC;CAC1C,KAAK,IAAMZ,KAASI,EAAStD,QAAQ8D,EAAQZ,KAASW,EAAMX;CAC5D,IAAI;EACFG,EAAQU,QAAQT,EAASvD,KAAKQ,EAAUuD,CAA6B,CAAC;CACxE,QAAQ,CACN;AAEJ;AAEA,SAASE,GAAYhD,GAAgD;CACnE,OAAO;EACLiD,MAAMrD,GAAWI,GAAaZ,SAASZ,EAAiB;EACxD0E,UAAUtD,GAAWI,GAAaX,aAAaV,EAAqB;CACtE;AACF;AAGA,SAAgBwE,GACdnD,GACS;CACT,IAAM,EAAEiD,SAAMC,gBAAaF,GAAYhD,CAAW;CAClD,OAAOiD,MAAS,QAAQC,MAAa;AACvC;AAEA,IAAME,MAAsB5D,MAA2B6D,KAAKC,MAAM9D,CAAK,GACjE+D,MAAoB/D,MACxB6D,KAAKG,UAAUhE,CAAK;AAGtB,SAAgBiE,GACdzD,GACoB;CACpB,IAAMqC,IAAUtC,GAAeC,CAAW,GACpC,EAAEiD,SAAMC,gBAAaF,GAAYhD,CAAW,GAC5CN,IAAcM,GAAaN,eAAe0D;CAChD,OAAO;EACL,GAAGhB,GAAWC,GAASa,GAAUxD,CAAW;EAC5C,GAAG0C,GAAWC,GAASY,GAAMvD,CAAW;CAC1C;AACF;AAGA,SAAgBgE,GACdb,GACA7C,GACM;CACN,IAAMqC,IAAUtC,GAAeC,CAAW;CAC1C,IAAI,CAACqC,GAAS;CACd,IAAM,EAAEY,SAAMC,gBAAaF,GAAYhD,CAAW,GAC5CT,IAAYS,GAAaT,aAAagE;CAE5CX,AADAA,GAAYP,GAASY,GAAMJ,GAAOtD,CAAS,GAC3CqD,GAAYP,GAASa,GAAUL,GAAOtD,CAAS;AACjD;;;AC7MA,IAAMiH,KAAsB,KAoCfY,KAAqBhC,GAAc;CAC9CtB;CACAc;CACAK;CACAF;CACAC;CACAhB;CACAG;CACAJ;CACAG;CACAD;CACAJ;CAEAwD,kBAAkB7C,EAAuB;CACzC8C,gBAAgB5C,GAAqB;CACrC6C,mBAAmB9C,GAAwB;CAC3C+C,iBAAiBlD,GAAsB;CACvCmD,qBAAqBpD,GAA0B;CAC/CqD,qBAAqBnD,GAA0B;CAE/CI,WAAW;EAAE,GAAGA;EAAWgD,YAAY9B;CAAmB;CAC1DX;CAEA0C,WAAW/C,GAAgC;CAC3CgD,YAAYhD,GAAiC;AAC/C,CAAC;AASD,SAAgBoD,KAAsD;CACpE,OAAO7D,GAA8C;AACvD;AA6GA,SAASyF,GACPC,GACmC;CACnC,OAAOA,EAAQG,KAAKC,MACd,aAAaA,KAAUF,MAAMG,QAAQD,EAAOJ,OAAO,IAC9C;EACL,GAAGI;EACHJ,SAASD,GAA8BK,EAAOJ,OAAO;CACvD,IAEK;EAAEM,UAAU;EAAc,GAAGF;CAAO,CAC5C;AACH;AAaA,SAAOG,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAAhB,GAAAC,GAAAE,GAAAc,GAAAlB,GAAAG;CAAA,AAAAa,EAAA,OAAAD,KAQuBd,IAAAe,EAAA,IAAAd,IAAAc,EAAA,IAAAZ,IAAAY,EAAA,IAAAE,IAAAF,EAAA,IAAAhB,IAAAgB,EAAA,IAAAb,IAAAa,EAAA,OARuB,6GAAAE,KAAAH,GAQvBC,EAAA,KAAAD,GAAAC,EAAA,KAAAf,GAAAe,EAAA,KAAAd,GAAAc,EAAA,KAAAZ,GAAAY,EAAA,KAAAE,GAAAF,EAAA,KAAAhB,GAAAgB,EAAA,KAAAb;CAC5B,IAAAgB,IAAyBD,EAAOE,uBAAwB,IACxDC,IAAuBH,EAAOI,wBAAyB,IAEvDC,IACEJ,KAAoBhB,MAAqB,OAAMqB;CAAA,IAAAR,EAAA,OAAAE,EAAAX,WAAAS,EAAA,OAAAO,GAAA;EAG/C,IAAAE,IAAanB,GACXY,EAAOX,OACT;EAC0ES,AAAnEQ,IAAAD,IAAA,CAAuBxE,GAA0B,GAAC,GAAK0E,CAAI,IAA3DA,GAAmET,EAAA,KAAAE,EAAAX,SAAAS,EAAA,KAAAO,GAAAP,EAAA,KAAAQ;CAAA,OAAAA,IAAAR,EAAA;CAJ5E,IAAAT,IAIEiB,GACyCE;CAAA,AAAAV,EAAA,QAAAhB,IAIwB0B,IAAAV,EAAA,OAAjCU,UAAMjF,GAAmBuD,CAAO,GAACgB,EAAA,MAAAhB,GAAAgB,EAAA,MAAAU;CAAnE,IAAA,CAAAC,KAAyBvF,EAASsF,CAAiC,GASxDE,IAAArB,GAA6DsB;CAAA,AAAAb,EAAA,QAAAK,KAAAL,EAAA,QAAAO,KAQ5DM,IAAAN,KAAAF,IAAA,CAAyCrE,CAAgB,IAAzD,CAAA,GAA+DgE,EAAA,MAAAK,GAAAL,EAAA,MAAAO,GAAAP,EAAA,MAAAa,KAAAA,IAAAb,EAAA;CAAA,IAAAc;CAAA,AAAAd,EAAA,QAAAE,EAAAa,cAAAC,eAAAC,QAAAjB,EAAA,QAAAW,EAAAK,eAAAC,QAAAjB,EAAA,QAAAa,KAD/DC,IAAA,CAAA,GACAD,GAA+D,IAEjEF,EAAcK,eAAoBC,QAClCf,EAAOa,cAA4BC,eAAMC,QADzC,CAAA,EAAA,CAEEC,OACKC,EAA+B,CAAC,GAC1CnB,EAAA,MAAAE,EAAAa,cAAAC,eAAAC,MAAAjB,EAAA,MAAAW,EAAAK,eAAAC,MAAAjB,EAAA,MAAAa,GAAAb,EAAA,MAAAc,KAAAA,IAAAd,EAAA;CAAA,IAAAoB;CAAA,AAAApB,EAAA,QAAAE,EAAAa,cAAAC,eAAAK,SAAArB,EAAA,QAAAW,EAAAK,eAAAK,SAECD,IAAAT,EAAcK,eAAqBK,SACnCnB,EAAOa,cAA4BC,eAAOK,SAD1C,CAAA,GAEErB,EAAA,MAAAE,EAAAa,cAAAC,eAAAK,OAAArB,EAAA,MAAAW,EAAAK,eAAAK,OAAArB,EAAA,MAAAoB,KAAAA,IAAApB,EAAA;CAAA,IAAAsB;CAAA,AAAAtB,EAAA,QAAAc,KAAAd,EAAA,QAAAoB,KAdSE,IAAA;EAAAL,MAGPH;EAOLO,OAECD;CAGJ,GAACpB,EAAA,MAAAc,GAAAd,EAAA,MAAAoB,GAAApB,EAAA,MAAAsB,KAAAA,IAAAtB,EAAA;CAII,IAAAuB,IAAArB,EAAOa,cAAyBS,YAAAC;CAAA,AAAAzB,EAAA,QAAAW,EAAAa,cAAAxB,EAAA,QAAAuB,KAHzBE,IAAA;EAAAC,WACC;EAACC,UACF;EAAE,GACTJ;EAAgC,GAChCZ,EAAca;CACnB,GAACxB,EAAA,MAAAW,EAAAa,YAAAxB,EAAA,MAAAuB,GAAAvB,EAAA,MAAAyB,KAAAA,IAAAzB,EAAA;CAAA,IAAA4B;CAAA,AAAA5B,EAAA,QAAAE,EAAAa,gBAAAf,EAAA,QAAAW,KAAAX,EAAA,QAAAsB,KAAAtB,EAAA,QAAAyB,KAxBWG,IAAA;EAAA,GACT1B,EAAOa;EAAa,GACpBJ;EAAcK,eACFM;EAedE,YACWC;CAMd,GAACzB,EAAA,MAAAE,EAAAa,cAAAf,EAAA,MAAAW,GAAAX,EAAA,MAAAsB,GAAAtB,EAAA,MAAAyB,GAAAzB,EAAA,MAAA4B,KAAAA,IAAA5B,EAAA;CAAA,IAAA6B;CAAA,AAAA7B,EAAA,QAAAE,KAAAF,EAAA,QAAA4B,KAAA5B,EAAA,QAAAY,KAjCoBiB,IAAA;EAAAC,kBACH;EAAUC,eACb;EAAIC,sBACG;EAAIC,gBACV;EAAgB,GAC7B/B;EAAOrB,UACAhC;EAAkB0C,SACnBqB;EAA6DG,cACxDa;CA0BhB,GAAC5B,EAAA,MAAAE,GAAAF,EAAA,MAAA4B,GAAA5B,EAAA,MAAAY,GAAAZ,EAAA,MAAA6B,KAAAA,IAAA7B,EAAA;CAlCD,IAAArB,IAAc3D,GAAS6G,CAkCtB,GAAEK,GAAAC;CAUHjH,AAVG8E,EAAA,QAAAhB,KAAAgB,EAAA,QAAArB,KAUOuD,UAAA;EACR,IAAI,CAAC1G,GAAmBwD,CAAO,GAAC;EAChCrD,GAAoBgD,EAAKyD,MAAMC,OAAQrD,CAAO;EAE1CsD,IAAAA,GACJC,IAAqD,MAErDC,UAAc;GACZF,IAAUG,KAAAA,GACNF,MAAY,SAChB5G,GAAoB4G,GAASvD,CAAO,GACpCuD,IAAUA;EAAH,GAGTG,IAAqB/D,EAAKyD,MAAMO,WAAWN,MAAA;GAGzCC,AAFAC,IAAUF,GACNC,MAAYG,KAAAA,KAAWG,aAAaN,CAAO,GAC/CA,IAAUO,WAAWL,GAAOvG,EAAmB;EAAxC,CACR;EAAE,aAEI;GAILuG,AAHAE,EAAYI,YAAa,GACrBR,MAAYG,KAAAA,KAAWG,aAAaN,CAAO,GAE/CE,EAAM;EAAC;CACR,GACAL,IAAA,CAACnD,GAASL,CAAK,GAACqB,EAAA,MAAAhB,GAAAgB,EAAA,MAAArB,GAAAqB,EAAA,MAAAkC,GAAAlC,EAAA,MAAAmC,MAAAD,IAAAlC,EAAA,KAAAmC,IAAAnC,EAAA,MA1BnB9E,EAAUgH,GA0BPC,CAAgB;CAAC,IAAAY;CAAA,AAAA/C,EAAA,QAAAgD,OAAAC,IAAA,2BAAA,KAGlBF,IAAA;EAAAnF,iBACmB;EAAKC,kBACJ;EAAKC,qBACF;EAAIC,iBACR;CACnB,GAACiC,EAAA,MAAA+C,KAAAA,IAAA/C,EAAA;CANH,IAAApB,IAAWxF,EACT2J,GAMAG,EAsBF,GAAEC;CAAA,AAAAnD,EAAA,QAAAf,KAAAe,EAAA,QAAAd,KAAAc,EAAA,QAAAZ,KAAAY,EAAA,QAAAE,KAAAF,EAAA,QAAAb,KAKegE,IAAAvH,GAAiB;EAAA,GAC7BsE;EAAOjB;EAAAC;EAAAC;EAAAC;CAKZ,CAAC,GAACY,EAAA,MAAAf,GAAAe,EAAA,MAAAd,GAAAc,EAAA,MAAAZ,GAAAY,EAAA,MAAAE,GAAAF,EAAA,MAAAb,GAAAa,EAAA,MAAAmD,KAAAA,IAAAnD,EAAA;CANF,IAAAnB,IAAiBsE,GAMdC;CAE2B,OAF3BpD,EAAA,QAAAnB,KAAAmB,EAAA,QAAArB,KAAAqB,EAAA,QAAApB,KAEIwE,IAAA;EAAAzE;EAAAC;EAAAC;CAAsB,GAACmB,EAAA,MAAAnB,GAAAmB,EAAA,MAAArB,GAAAqB,EAAA,MAAApB,GAAAoB,EAAA,MAAAoD,KAAAA,IAAApD,EAAA,KAAvBoD;AAAuB;AA5IzB,SAAAF,GAAAnD,GAAA;CAyGF,IAAA,EAAAsD,gBAAAtD;CAAY,OAAM;EAAA9B,kBACAuC,MAAA;GAAC,IAAAtC,IAAAsC,MAAAiC,KAAAA,IAAA,OAAAjC;GAAe,OAC/B6C,GAASC,OAAW;IAAA,GACfA;IAAI1F,iBACU;IAAIE,qBACAI;GACvB,EAAE;EAAC;EAAAC,wBAEHkF,EAASE,EAIP;EAACnF,sBACgBC,MACnBgF,GAASG,OAAW;GAAA,GAAKF;GAAIzF,kBAAoBQ;EAAK,EAAE;EAACC,0BAEzD+E,EAASI,EAAiE;EAAClF,kBAC5DmF,MACfL,GAASM,OAAW;GAAA,GAAKL;GAAIvF,iBAAmBG;EAAS,EAAE;EAACM,qBAE5D6E,EAASO,EAA8C;CAC3D;AAAC;AA9HE,SAAAA,GAAAC,GAAA;CAAA,OA6HqB;EAAA,GAAKP;EAAIvF,iBAAmB;CAAK;AAAC;AA7HvD,SAAA0F,GAAAK,GAAA;CAAA,OAyHqB;EAAA,GAAKR;EAAIzF,kBAAoB,CAACyF,EAAIzF;CAAkB;AAAC;AAzH1E,SAAA0F,GAAAQ,GAAA;CAAA,OAiHqB;EAAA,GACfT;EAAI1F,iBACU;EAAKE,qBACD;CACvB;AAAC;AArHF,SAAAqD,GAAA6C,GAAA;CAAA,OA8CoBA,MAAOhI;AAAgB;AAqGlD,SAAgBiI,GACdC,GACAhG,GACM;CACN,IAAMyB,IAASuE,EAAIvF,MAAMwF,UAAUjG,CAAQ;CAO3CgG,AANIvE,KAAUA,EAAOyE,eAAe,MAAM3B,KAAAA,KACxC9C,EAAO0E,eAAe;EACpBC,UAAU/I,GAAmBoE,EAAO4E,UAAUC,MAAMpI,QAAQ,QAAQ;EACpEqI,OAAO;CACT,CAAC,GAEHP,EAAItF,GAAG8F,QAAQzG,gBAAgBC,CAAQ;AACzC;;;AC5XA,SAAOkJ,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,GAAA,GAA8B,EAAAC,WAAAC,cAAAJ,GAOnCK,IAAYjC,EAAqB,GACjC,EAAAkC,UAAAC,gBAA4BF,GAC5BG,IAAeL,EAAMK,QACrB,CAAAC,GAAAC,KAAoC1C,EAAS,EAAK,GAClD,CAAA2C,GAAAC,KAAgC5C,EAAoC,IAAI,GACxE6C,IAAgB9C,EAAuB,IAAI,GAG3C+C,IAAwB/C,EAAO,EAAK,GAAEgD;CAAA,AAAAd,EAAA,OAAAe,OAAAC,IAAA,2BAAA,KAgBlCF,IAAA,EAAAG,SAAWtD,GAAQ,GAACqC,EAAA,KAAAc,KAAAA,IAAAd,EAAA;CAVxB,IAAA,EAAAkB,YAAAC,kBAAAC,qBAAAC,sBACE3D,EACE2C,EAAKiB,OACLC,IAOAT,CACF,GACFU,IAAwB9D,EAAY0C,EAAGqB,IAAKC,EAAgC,GAE5EC,IAAezB,EAAM0B,WAAWC,WAAY,GAAEC;CAAA,AAAA9B,EAAA,OAAAO,IACVuB,IAAA9B,EAAA,MAAtB8B,IAAAjD,GAAe0B,CAAM,GAACP,EAAA,KAAAO,GAAAP,EAAA,KAAA8B;CAApC,IAAAC,IAAcD,GAAuBE;CAAA,AAAAhC,EAAA,OAAAO,IACDyB,IAAAhC,EAAA,MAAtBgC,IAAApD,GAAe2B,CAAM,GAACP,EAAA,KAAAO,GAAAP,EAAA,KAAAgC;CAApC,IAAAC,KAAcD,GAAuBE;CAAA,AAAAlC,EAAA,OAAAO,EAAA4B,MAAAnC,EAAA,OAAAkB,KACfgB,KAAAhB,EAAOkB,MAAMC,MAAUA,EAAIF,OAAQ5B,EAAM4B,EAAS,CAAC,EAAAG,MAAAtC,EAAA,KAAAO,EAAA4B,IAAAnC,EAAA,KAAAkB,GAAAlB,EAAA,KAAAkC,MAAAA,KAAAlC,EAAA;CAAzE,IAAAuC,KAAsBL,IACtBM,KAAiBD,OAAkBE,KAAAA,GAAUC;CAAA,IAAA1C,EAAA,OAAAO,EAAA4B,MAAAnC,EAAA,OAAAmB,GAAA;EAAA,IAAAwB;EAG5C3C,AAH4CA,EAAA,QAAAO,EAAA4B,KAEwBQ,IAAA3C,EAAA,OAAnE2C,KAAAC,MAAYA,EAAMT,OAAQ5B,EAAM4B,MAAOrD,GAAe8D,EAAMC,KAAM,GAAC7C,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAA2C,IADlDD,KAAAvB,EAAa2B,KAC9BH,CACF,GAAC3C,EAAA,KAAAO,EAAA4B,IAAAnC,EAAA,KAAAmB,GAAAnB,EAAA,MAAA0C;CAAA,OAAAA,KAAA1C,EAAA;CAFD,IAAA+C,KAAmBL,IAGnBM,KAAmB5B,MAAqBb,EAAM4B,IAC9Cc,IAAiB9C,EAAM8C,UAAUN;CAAA,AAAA3C,EAAA,QAAAO,KAAAP,EAAA,QAAAM,KAIZqC,KAAAtE,GAAsBkC,GAAQD,CAAQ,GAACN,EAAA,MAAAO,GAAAP,EAAA,MAAAM,GAAAN,EAAA,MAAA2C,MAAAA,KAAA3C,EAAA;CAA5D,IAAAkD,KAAqBP,IACrBQ,IAAgBxB,KAAUuB,GAAYC,SACtCC,KAAkBzB,KAAUuB,GAAYE,WACxCC,KAAgB1B,KAAUuB,GAAYG,SACtCC,KAAe3B,KAAUuB,GAAYI,QACrCC,KAAkBL,GAAYK,WAC9BC,IAAmB7B,KAAUuB,GAAYM,YAAYC;CAAA,AAAAzD,EAAA,QAAAM,KAAAN,EAAA,QAAA2B,KAAA3B,EAAA,QAAAK,KAEnDoD,KAAA9B,KAAUrD,GAAoB+B,GAAOC,CAAQ,CAAC,CAAAoD,YAAW1D,EAAA,MAAAM,GAAAN,EAAA,MAAA2B,GAAA3B,EAAA,MAAAK,GAAAL,EAAA,MAAAyD,MAAAA,KAAAzD,EAAA;CAD3D,IAAA2D,KACEF,IAIFG,KAAkBpC,MAAoBjB,EAAM4B,IAAI0B;CAAA,AAAA7D,EAAA,QAAAwD,KAAAxD,EAAA,QAAAO,EAAA4B,MAAAnC,EAAA,QAAAqB,MAAArB,EAAA,QAAAwB,KAAAxB,EAAA,QAAA4D,MAE9CC,KAAAL,KACAhC,MAAoB,QADpB,CAECoC,MACDrF,GAAgB8C,IAAeG,CAAe,MAC5CjD,GAAgB8C,IAAed,EAAM4B,EAAG,GAACnC,EAAA,MAAAwD,GAAAxD,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAAqB,IAAArB,EAAA,MAAAwB,GAAAxB,EAAA,MAAA4D,IAAA5D,EAAA,MAAA6D,MAAAA,KAAA7D,EAAA;CAL7C,IAAA8D,IACED,IAI4CE;CAAA,AAAA/D,EAAA,QAAAI,EAAAqB,MAAAzB,EAAA,QAAAO,EAAA4B,MAE9C4B,KAAA,SAAAE,GAAA;EAIE7D,AAHA6D,EAAKC,aAAaC,gBAAiB,QAEnCF,EAAKC,aAAaE,QAAS,cAAc7D,EAAM4B,EAAG,GAClD/B,EAAGqB,GAAG4C,QAAQC,gBAAiB/D,EAAM4B,EAAG;CAAC,GAC1CnC,EAAA,MAAAI,EAAAqB,IAAAzB,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAA+D,MAAAA,KAAA/D,EAAA;CALD,IAAAgE,KAAAD,IAKCQ;CAAA,AAAAvE,EAAA,QAAA8D,IAYAS,KAAAvE,EAAA,OAVDuE,KAAA,SAAAE,GAAA;EACE,IAAI,CAACX,GAAY;EAGjBG,AADAA,EAAKS,eAAgB,GACrBT,EAAKC,aAAaS,aAAc;EAChC,IAAAC,IAAehE,EAAOiE,SAA+BC,sBAAC;EACjDF,KACLjE,EACEsD,EAAKc,UAAWH,EAAMI,OAAQJ,EAAMK,QAAS,IAA7C,WAAA,OACF;CAAC,GACFjF,EAAA,MAAA8D,GAAA9D,EAAA,MAAAuE;CAVD,IAAAC,KAAAD,IAUCW;CAAA,AAAAlF,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KAEDkE,KAAA,SAAAE,GAAA;EAEE,IAAAC,IAAapB,EAAKqB;EACdD,aAAgBE,QAAQtB,EAAKuB,cAAcC,SAAUJ,CAAI,KAC7D1E,EAAY,IAAI;CAAC,GAClBX,EAAA,MAAAkF,MAAAA,KAAAlF,EAAA;CALD,IAAAmF,KAAAD,IAKCQ;CAAA,AAAA1F,EAAA,QAAAI,EAAAqB,MAAAzB,EAAA,QAAAO,EAAA4B,MAAAnC,EAAA,QAAAwB,KAAAxB,EAAA,QAAAU,KAAAV,EAAA,QAAA8D,KAAA9D,EAAA,QAAAK,KAEDqF,KAAA,SAAAE,GAAA;EACE3B,EAAKS,eAAgB,GACrB/D,EAAY,IAAI,GAChBP,EAAGqB,GAAG4C,QAAQwB,cAAe,GACzB,GAAC/B,KAAD,CAAkBpD,KAAlB,CAA+Bc,MACnC/C,GAAW;GAAA4B;GAAAyF,UAECtE;GAAeuE,UACfxF,EAAM4B;GAAG6D,MACbtF;EACR,CAAC;CAAC,GACHV,EAAA,MAAAI,EAAAqB,IAAAzB,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAAwB,GAAAxB,EAAA,MAAAU,GAAAV,EAAA,MAAA8D,GAAA9D,EAAA,MAAAK,GAAAL,EAAA,MAAA0F,MAAAA,KAAA1F,EAAA;CAXD,IAAA2F,KAAAD,IAWCO;CAAA,AAAAjG,EAAA,QAAAI,EAAAqB,KAKAwE,KAAAjG,EAAA,OAHDiG,KAAA,WAAA;EAEE7F,AADAO,EAAY,IAAI,GAChBP,EAAGqB,GAAG4C,QAAQwB,cAAe;CAAC,GAC/B7F,EAAA,MAAAI,EAAAqB,IAAAzB,EAAA,MAAAiG;CAHD,IAAAC,KAAAD,IAGCE;CAAA,AAAAnG,EAAA,QAAAO,KAAAP,EAAA,QAAAK,KAQD8F,KAAA,SAAAE,GAAA;EACE,IAAIA,KAAA,EAAc9F,EAAM4B,MAAO9B,EAAKiB,MAAMgF,MAAMC,eAAc;GAC5D,IAAAtB,IAAcrE,EAAOiE,SAA+BC,sBAAO,CAAC,CAAAG;GAC5D,AAAIA,KACF5E,EAAKmG,iBAAiBC,OAAW;IAAA,GAC5BA;KACFlG,EAAM4B,KAAMuE,KAAIC,MAAO1B,CAAK;GAC/B,EAAE;EACH;EAEH1E,EAAMqG,IAAKP,CAAQ;CAAC,GACrBrG,EAAA,MAAAO,GAAAP,EAAA,MAAAK,GAAAL,EAAA,MAAAmG,MAAAA,KAAAnG,EAAA;CAXD,IAAAoG,IAAAD,IAWCU;CAAA,IAAA7G,EAAA,QAAAI,KAAAJ,EAAA,QAAAoD,MAAApD,EAAA,QAAAqD,MAAArD,EAAA,QAAA2D,MAAA3D,EAAA,QAAAsD,MAAAtD,EAAA,QAAAwD,KAAAxD,EAAA,QAAAmD,KAAAnD,EAAA,QAAAO,KAAAP,EAAA,QAAAiD,KAAAjD,EAAA,QAAAoG,KAAApG,EAAA,QAAAK,GAAA;EAGD,IADAwG,IAA+B,CAAA,GAC3B1D,GAAO;GAAA,IAAA2D;GAAA,AAAA9G,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KAIQ8F,IAAA,kBAAC,GAAD;IAAmB,MAAA;IAAY,QAAA;GAAG,CAAA,GAAI9G,EAAA,MAAA8G,KAAAA,IAAA9G,EAAA;GAAA,IAAA+G;GAAA,AAAA/G,EAAA,QAAAO,IAIzCwG,IAAA/G,EAAA,OANZ+G,IAAA,kBAAA,EAAA,MAAA;IAEe,aAAAD;IACJ,eAAMvG,EAAMyG,cAAe,EAAK;cAC1C;GAED,GALM,UAKN,GAAYhH,EAAA,MAAAO,GAAAP,EAAA,MAAA+G;GAAA,IAAAE;GAAA,AAAAjH,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KAGGiG,IAAA,kBAAC,GAAD;IAAqB,MAAA;IAAY,QAAA;GAAG,CAAA,GAAIjH,EAAA,MAAAiH,KAAAA,IAAAjH,EAAA;GAAA,IAAAkH;GAAA,AAAAlH,EAAA,QAAAO,IAI3C2G,IAAAlH,EAAA,OANZkH,IAAA,kBAAA,EAAA,MAAA;IAEe,aAAAD;IACJ,eAAM1G,EAAMyG,cAAe,EAAI;cACzC;GAED,GALM,WAKN,GAAYhH,EAAA,MAAAO,GAAAP,EAAA,MAAAkH;GAAA,IAAAC;GAddN,AAcc7G,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KACZmG,IAAA,kBAAA,EAAA,SAAA,CAAgC,GAAd,cAAc,GAAGnH,EAAA,MAAAmH,KAAAA,IAAAnH,EAAA,KAfrC6G,EAASO,KACPL,GAOAG,GAOAC,CACF;EAAC;EAEH,IAAI/D,IAAS;GAAA,IAAA0D;GAAA,AAAA9G,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KAIM8F,IAAA,kBAAC,GAAD;IAAkB,MAAA;IAAY,QAAA;GAAG,CAAA,GAAI9G,EAAA,MAAA8G,KAAAA,IAAA9G,EAAA;GAAA,IAAA+G;GAAA,AAAA/G,EAAA,QAAAI,KAAAJ,EAAA,QAAAO,EAAA4B,MAFpD4E,IAAA,kBAAA,EAAA,MAAA;IAEe,aAAAD;IACJ,eAAMlH,GAAiBQ,GAAKG,EAAM4B,EAAG;cAC/C;GAED,GALM,QAKN,GAAYnC,EAAA,MAAAI,GAAAJ,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAA+G,KAAAA,IAAA/G,EAAA;GAAA,IAAAiH;GAPdJ,AAOc7G,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KACZiG,IAAA,kBAAA,EAAA,SAAA,CAAkC,GAAhB,gBAAgB,GAAGjH,EAAA,MAAAiH,KAAAA,IAAAjH,EAAA,KARvC6G,EAASO,KACPL,GAOAE,CACF;EAAC;EAEH,IAAI3D,IAAM;GAIO,IAAAwD,IAAA7D,MAAa,SAASjF,EAAOqJ,iBAA7B5E,KAAAA,GAAwDsE;GAAA,AAAA/G,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KACtD+F,IAAA,kBAAC,GAAD;IAAmB,MAAA;IAAY,QAAA;GAAG,CAAA,GAAI/G,EAAA,MAAA+G,KAAAA,IAAA/G,EAAA;GAAA,IAAAiH;GAAA,AAAAjH,EAAA,QAAAiD,KAAAjD,EAAA,QAAAoG,KAC1Ca,UAAMb,EAAUnD,MAAa,UAAb,MAAoC,GAACjD,EAAA,MAAAiD,GAAAjD,EAAA,MAAAoG,GAAApG,EAAA,MAAAiH,KAAAA,IAAAjH,EAAA;GAAA,IAAAkH;GAAA,AAAAlH,EAAA,QAAA8G,KAAA9G,EAAA,QAAAiH,KAJhEC,IAAA,kBAAA,EAAA,MAAA;IAEa,WAAAJ;IACE,aAAAC;IACJ,SAAAE;cACV;GAED,GANM,UAMN,GAAYjH,EAAA,MAAA8G,GAAA9G,EAAA,MAAAiH,GAAAjH,EAAA,MAAAkH,KAAAA,IAAAlH,EAAA;GAGC,IAAAmH,IAAAlE,MAAa,UAAUjF,EAAOqJ,iBAA9B5E,KAAAA,GAAyD6E;GAAA,AAAAtH,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KACvDsG,IAAA,kBAAC,GAAD;IAAoB,MAAA;IAAY,QAAA;GAAG,CAAA,GAAItH,EAAA,MAAAsH,KAAAA,IAAAtH,EAAA;GAAA,IAAAuH;GAAA,AAAAvH,EAAA,QAAAiD,KAAAjD,EAAA,QAAAoG,KAC3CmB,UAAMnB,EAAUnD,MAAa,WAAb,OAAsC,GAACjD,EAAA,MAAAiD,GAAAjD,EAAA,MAAAoG,GAAApG,EAAA,MAAAuH,KAAAA,IAAAvH,EAAA;GAAA,IAAAwH;GAKpE,IALoExH,EAAA,QAAAmH,KAAAnH,EAAA,QAAAuH,KAJlEC,IAAA,kBAAA,EAAA,MAAA;IAEa,WAAAL;IACE,aAAAG;IACJ,SAAAC;cACV;GAED,GANM,WAMN,GAAYvH,EAAA,MAAAmH,GAAAnH,EAAA,MAAAuH,GAAAvH,EAAA,MAAAwH,KAAAA,IAAAxH,EAAA,KAhBd6G,EAASO,KACPF,GAQAM,CAQF,GACIvE,GAAQ;IAAA,IAAAwE;IAAA,AAAAzH,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KAIOyG,IAAA,kBAAC,GAAD;KAAkB,MAAA;KAAY,QAAA;IAAG,CAAA,GAAIzH,EAAA,MAAAyH,KAAAA,IAAAzH,EAAA;IAAA,IAAA0H;IAHtDb,AAGsD7G,EAAA,QAAAoG,IAIxCsB,IAAA1H,EAAA,OANZ0H,IAAA,kBAAA,EAAA,MAAA;KAEe,aAAAD;KACJ,eAAMrB,EAAU,EAAK;eAC/B;IAED,GALM,OAKN,GAAYpG,EAAA,MAAAoG,GAAApG,EAAA,MAAA0H,IAPdb,EAASO,KACPM,CAOF;GAAC;GACF,IAAAD;GACDZ,AADC7G,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KACcyG,IAAA,kBAAA,EAAA,SAAA,CAA+B,GAAb,aAAa,GAAGzH,EAAA,MAAAyH,KAAAA,IAAAzH,EAAA,KAAjD6G,EAASO,KAAMK,CAAkC;EAAC;EAEpD,IAAIjE,GAAU;GAAA,IAAAsD;GAAA,AAAA9G,EAAA,QAAAO,EAAA4B,MAAAnC,EAAA,QAAAK,KAGKyG,IAAAtI,GAAoB;IAAA6B;IAAAyF,UAEzBvF,EAAM4B;IAAGwF,WACR;GACb,CAAC,GAAC3H,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAAK,GAAAL,EAAA,MAAA8G,KAAAA,IAAA9G,EAAA;GAJF,IAAA4H,IAAiBd,GAIdC;GAAA,AAAA/G,EAAA,QAAAO,EAAA4B,MAAAnC,EAAA,QAAAK,KACU0G,IAAAvI,GAAoB;IAAA6B;IAAAyF,UAErBvF,EAAM4B;IAAGwF,WACR;GACb,CAAC,GAAC3H,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAAK,GAAAL,EAAA,MAAA+G,KAAAA,IAAA/G,EAAA;GAJF,IAAA6H,IAAad;GAKb,IAAIa,KAAAC,GAAgB;IAIJ,IAAAZ,IAAA,CAACW,GAAQV;IAAA,AAAAlH,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KACNkG,IAAA,kBAAC,GAAD;KAAoB,MAAA;KAAY,QAAA;IAAG,CAAA,GAAIlH,EAAA,MAAAkH,KAAAA,IAAAlH,EAAA;IAAA,IAAAmH;IAAA,AAAAnH,EAAA,QAAAO,EAAA4B,MAAAnC,EAAA,QAAAK,KAC3C8G,UACPzI,GAAiB;KAAA2B;KAAAyF,UAAmBvF,EAAM4B;KAAGwF,WAAa;IAAG,CAAC,GAAC3H,EAAA,MAAAO,EAAA4B,IAAAnC,EAAA,MAAAK,GAAAL,EAAA,MAAAmH,KAAAA,IAAAnH,EAAA;IAAA,IAAAsH;IAAA,AAAAtH,EAAA,QAAAiH,KAAAjH,EAAA,QAAAmH,KALnEG,IAAA,kBAAA,EAAA,MAAA;KAEY,UAAAL;KACG,aAAAC;KACJ,SAAAC;eAGV;IAED,GARM,WAQN,GAAYnH,EAAA,MAAAiH,GAAAjH,EAAA,MAAAmH,GAAAnH,EAAA,MAAAsH,KAAAA,IAAAtH,EAAA;IAGA,IAAAuH,IAAA,CAAClC,GAAImC;IAAA,AAAAxH,EAAA,QAAAe,OAAAC,IAAA,2BAAA,KACFwG,IAAA,kBAAC,GAAD;KAAqB,MAAA;KAAY,QAAA;IAAG,CAAA,GAAIxH,EAAA,MAAAwH,KAAAA,IAAAxH,EAAA;IAAA,IAAAyH;IAAA,AAAAzH,EAAA,SAAAO,EAAA4B,MAAAnC,EAAA,SAAAK,KAC5CoH,UACP/I,GAAiB;KAAA2B;KAAAyF,UAAmBvF,EAAM4B;KAAGwF,WAAa;IAAE,CAAC,GAAC3H,EAAA,OAAAO,EAAA4B,IAAAnC,EAAA,OAAAK,GAAAL,EAAA,OAAAyH,KAAAA,IAAAzH,EAAA;IAAA,IAAA0H;IAAA,AAAA1H,EAAA,SAAAuH,KAAAvH,EAAA,SAAAyH,KALlEC,IAAA,kBAAA,EAAA,MAAA;KAEY,UAAAH;KACG,aAAAC;KACJ,SAAAC;eAGV;IAED,GARM,YAQN,GAAYzH,EAAA,OAAAuH,GAAAvH,EAAA,OAAAyH,GAAAzH,EAAA,OAAA0H,KAAAA,IAAA1H,EAAA;IAAA,IAAA8H;IApBdjB,AAoBc7G,EAAA,SAAAe,OAAAC,IAAA,2BAAA,KACZ8G,IAAA,kBAAA,EAAA,SAAA,CAAgC,GAAd,cAAc,GAAG9H,EAAA,OAAA8H,KAAAA,IAAA9H,EAAA,MArBrC6G,EAASO,KACPE,GAUAI,GAUAI,CACF;GAAC;EACF;EAEH,IAAIzE,IAAO;GAAA,IAAAyD;GAAA,AAAA9G,EAAA,SAAAe,OAAAC,IAAA,2BAAA,KAIQ8F,IAAA,kBAAC,GAAD;IAAkB,MAAA;IAAY,QAAA;GAAG,CAAA,GAAI9G,EAAA,OAAA8G,KAAAA,IAAA9G,EAAA;GAAA,IAAA+G;GAHtDF,AAGsD7G,EAAA,SAAAO,IAIxCwG,IAAA/G,EAAA,QANZ+G,IAAA,kBAAA,EAAA,MAAA;IAEe,aAAAD;IACJ,eAAMvG,EAAMwH,iBAAkB,EAAK;cAC7C;GAED,GALM,MAKN,GAAY/H,EAAA,OAAAO,GAAAP,EAAA,OAAA+G,IAPdF,EAASO,KACPL,CAOF;EAAC;EAEH,IAAIpD,IAAgB;GAAA,IAAAmD;GAAA,AAAA9G,EAAA,SAAAe,OAAAC,IAAA,2BAAA,KAID8F,IAAA,kBAAC,GAAD;IAAmB,MAAA;IAAY,QAAA;GAAG,CAAA,GAAI9G,EAAA,OAAA8G,KAAAA,IAAA9G,EAAA;GAAA,IAAA+G;GAHvDF,AAGuD7G,EAAA,SAAAI,EAAAqB,GAAA4C,UAIzC0C,IAAA/G,EAAA,QANZ+G,IAAA,kBAAA,EAAA,MAAA;IAEe,aAAAD;IACJ,eAAM1G,EAAGqB,GAAG4C,QAAQ2D,oBAAqB,EAAI;cACvD;GAED,GALM,QAKN,GAAYhI,EAAA,OAAAI,EAAAqB,GAAA4C,SAAArE,EAAA,OAAA+G,IAPdF,EAASO,KACPL,CAOF;EAAC;EAGH,OAAOF,EAAShF,SAAU,KAAKoG,GAAUpB,EAASqB,GAAI,EAAE,CAAC,IACvDrB,EAASsB,IAAK;EACfnI,AAAAA,EAAA,MAAAI,GAAAJ,EAAA,MAAAoD,IAAApD,EAAA,MAAAqD,IAAArD,EAAA,MAAA2D,IAAA3D,EAAA,MAAAsD,IAAAtD,EAAA,MAAAwD,GAAAxD,EAAA,MAAAmD,GAAAnD,EAAA,MAAAO,GAAAP,EAAA,MAAAiD,GAAAjD,EAAA,MAAAoG,GAAApG,EAAA,MAAAK,GAAAL,EAAA,MAAA6G;CAAA,OAAAA,IAAA7G,EAAA;CAIC,IAAA8G,KAAA3D,IAAUnF,EAAOoK,qBAAjB,IACArB,KAAAnD,KAAY5F,EAAOqK,qBAAnB,IACApB,KAAAvG,MAAa,WAAW1C,EAAOsK,uBAA/B,IACApB,KAAAxG,MAAa,UAAU1C,EAAOuK,sBAA9B,IACApB,KAAAhH,EAAMqI,cAAevF,MAAa,SAAShF,GAAMwK,aAAjD,IACAnB,KAAAnH,EAAMqI,cAAevF,MAAa,UAAUhF,GAAMyK,cAAlD,IAAmEnB;CAAA,AAAAvH,EAAA,SAAA8G,MAAA9G,EAAA,SAAA+G,MAAA/G,EAAA,SAAAiH,MAAAjH,EAAA,SAAAkH,MAAAlH,EAAA,SAAAmH,MAAAnH,EAAA,SAAAsH,MAPnDC,KAAA;EAChBvJ,EAAO2K;EACP7B;EACAC;EACAE;EACAC;EACAC;EACAG;CAAmE,CACpE,CAAA1E,OACSgG,OAAO,GAAC5I,EAAA,OAAA8G,IAAA9G,EAAA,OAAA+G,IAAA/G,EAAA,OAAAiH,IAAAjH,EAAA,OAAAkH,IAAAlH,EAAA,OAAAmH,IAAAnH,EAAA,OAAAsH,IAAAtH,EAAA,OAAAuH,MAAAA,KAAAvH,EAAA;CATlB,IAAA6I,KAAkBtB,GASAuB,KACV,GAAG,GAMMtB,KAAA,aAAajH,EAAM4B,MACnBsF,KAAAjF,MAAAO,IAKX2E,KAAAvE,IACIX,KACED,KAAA,eAAA,cADF,SADJE,KAAAA,GAYSqF,KAAAtE,KAAA,CAAeR,IACb+F,KAAAvF,IAAAQ,KAAAvB,KAAAA,GACFuG,KAAAxF,IAAA0C,KAAAzD,KAAAA,GACCwG,KAAAnF,IAAAU,KAAA/B,KAAAA,GACCyG,KAAApF,IAAAqB,KAAA1C,KAAAA,GACL0G,KAAArF,IAAA6B,KAAAlD,KAAAA,GAEA2G,KAAAnG,MAAa,SAAS9C,EAAMkJ,SAA5B5G,KAAAA,GACC6G,KAAArG,MAAa,UAAU9C,EAAMkJ,SAA7B5G,KAAAA,GACG8G,IAAAtG,IAAA,WAAAR,KAAAA,GACF+G,KAAAvG,IAAA,IAAAR,KAAAA,GAAwBgH;CAAA,AAAAzJ,EAAA,SAAAoJ,MAAApJ,EAAA,SAAAsJ,MAAAtJ,EAAA,SAAAuJ,KAAAvJ,EAAA,SAAAwJ,MAJ3BC,KAAA;EAAAzE,MACCoE;EAA+CM,OAC9CJ;EAAgDjD,UAC7CkD;EAA+BI,QACjCH;CACV,GAACxJ,EAAA,OAAAoJ,IAAApJ,EAAA,OAAAsJ,IAAAtJ,EAAA,OAAAuJ,GAAAvJ,EAAA,OAAAwJ,IAAAxJ,EAAA,OAAAyJ,MAAAA,KAAAzJ,EAAA;CAAA,IAAA4J;CAAA,AAAA5J,EAAA,SAAAmD,KAAAnD,EAAA,SAAAO,KAECqJ,IAAAzG,KAAA0G,MAAA;EAEM,IAAIhJ,EAAegE,SAAQ;GACzBhE,EAAegE,UAAW;GAAH;EAAA;EAGzBtE,EAAMuJ,wBAAkC,CAAC,GAAN7F,CAAK;CAAC,IAN/CxB,KAAAA,GAQazC,EAAA,OAAAmD,GAAAnD,EAAA,OAAAO,GAAAP,EAAA,OAAA4J,KAAAA,IAAA5J,EAAA;CAAA,IAAA+J;CAAA,AAAA/J,EAAA,SAAAO,EAAAyJ,aAAAhK,EAAA,SAAAE,KAAAF,EAAA,SAAA2B,KAAA3B,EAAA,SAAA+B,KAGdgI,KAAA7J,EAAM+J,gBAAN,OACC,kBAAC,GAAD;EAAgBlI;EAAkB,WAAA;EAAK,cAAA;EAAuB,UAAA,CAACJ;YAC7D,kBAAA,QAAA;GAAiB,WAAA3D,EAAOkM;aACrB1M,GAAW+C,EAAMyJ,UAAU9J,QAASA,EAAMiK,WAAY,CAAC;EACnD,CAAA;CAHD,CAAA,GAKTnK,EAAA,OAAAO,EAAAyJ,WAAAhK,EAAA,OAAAE,GAAAF,EAAA,OAAA2B,GAAA3B,EAAA,OAAA+B,GAAA/B,EAAA,OAAA+J,MAAAA,KAAA/J,EAAA;CAAA,IAAAoK;CAAA,AAAApK,EAAA,SAAAI,KAAAJ,EAAA,SAAAmD,KAAAnD,EAAA,SAAAO,KAAAP,EAAA,SAAA+C,MAAA/C,EAAA,SAAA2B,KAAA3B,EAAA,SAAAwC,MAAAxC,EAAA,SAAA+B,KAAA/B,EAAA,SAAA6G,KAAA7G,EAAA,SAAAQ,KAAAR,EAAA,SAAAuC,MAEA6H,KAAAzI,KACC,kBAAA,OAAA;EAAgB,WAAA3D,EAAOqM;YAAvB;GACGtH,MACC,kBAAC,GAAD;IACa,WAAA/E,EAAOsM;IACE,uBAAA;IACZ,SAAA;IACF,OAAA;IACD,MAAA;IACO,cAAA,aAAavI;IAChB,UAAAwI,MAAA;KAEP3K,AADAqE,EAAKuG,gBAAiB,GACtB5K,GAAiBQ,GAAKG,EAAM4B,EAAG;IAAC;cAGlC,kBAAC,GAAD;KAAkB,MAAA;KAAY,QAAA;IAAG,CAAA;GAZxB,CAAA;GAgBZgB,KACC,kBAAC,GAAD;IACa,WAAAnF,EAAOsM;IACG9H,uBAAAA;IACb,SAAA;IACF,OAAA;IACD,MAAA;IACO,cAAA,QAAQT;IACX,SAAAxB,EAAMuJ,wBAAyB;cAGtC,EADDvH,KACE,IAEA,GAFD;KAAqB,MAAA;KAAY,QAAA;IAAG,CAEF;GAZ3B,CAAA;GAiBZsE,EAAShF,SAAU,KAAKtB,EAAM4B,OAAAA,gBAC7B,kBAAC,GAAD;IACU3B,QAAAA;IACEC,UAAAA;IACD,UAAA;IACF,QAAA;IACA,OAAA;IACP,cAAA;cANF,CAQE,kBAAA,EAAA,QAAA,EAAA,UACE,kBAAC,GAAD;KACa,WAAAzC,EAAOsM;KACG9J,uBAAAA;KACb,SAAA;KACF,OAAA;KACD,MAAA;KACO,cAAA,GAAGuB,EAAK;KACX,UAAA0I,MAAA;MAEPhK,AADAwD,EAAKuG,gBAAiB,GACtB/J,EAAciK,EAAmB;KAAC;eAGpC,kBAAC,GAAD;MAAwB,MAAA;MAAY,QAAA;KAAG,CAAA;IAZ9B,CAAA,EAcb,CAAA,GACA,kBAAA,EAAA,UAAA;KAAwB,SAAAC;eACrB9D;IACH,CAAA,CA1BG;;EA6BH;KACP7G,EAAA,OAAAI,GAAAJ,EAAA,OAAAmD,GAAAnD,EAAA,OAAAO,GAAAP,EAAA,OAAA+C,IAAA/C,EAAA,OAAA2B,GAAA3B,EAAA,OAAAwC,IAAAxC,EAAA,OAAA+B,GAAA/B,EAAA,OAAA6G,GAAA7G,EAAA,OAAAQ,GAAAR,EAAA,OAAAuC,IAAAvC,EAAA,OAAAoK,MAAAA,KAAApK,EAAA;CAKG,IAAA4K,KAAArH,KAAYvF,EAAO6M,2BAAnB,IACAC,KAAA9H,KAAahF,EAAO+M,wBAApB,IAA+CC;CAAA,AAAAhL,EAAA,SAAA4K,MAAA5K,EAAA,SAAA8K,MAHtCE,KAAA;EACThN,EAAOiN;EACPL;EACAE;CAA+C,CAChD,CAAAlI,OACSgG,OAAO,GAAC5I,EAAA,OAAA4K,IAAA5K,EAAA,OAAA8K,IAAA9K,EAAA,OAAAgL,MAAAA,KAAAhL,EAAA;CALP,IAAAkL,KAAAF,GAKOlC,KACV,GAAG,GAACqC;CAAA,AAAAnL,EAAA,SAAAuD,MAAAvD,EAAA,SAAAE,KAKViL,KAAA5H,MAAA6H,MAAA;EAGMlL,AADAW,EAAegE,UAAW,IAC1B3E,EAAMmL,iBAAkB,CAAC,CAACpH,CAAK;CAAC,IAHtCxB,KAAAA,GAKazC,EAAA,OAAAuD,IAAAvD,EAAA,OAAAE,GAAAF,EAAA,OAAAmL,MAAAA,KAAAnL,EAAA;CAAA,IAAAsL;CAAA,AAAAtL,EAAA,SAAAuD,MAAAvD,EAAA,SAAAE,KAEDoL,KAAA/H,KAAYrD,EAAMmL,iBAA8B,IAAhD5I,KAAAA,GAAiDzC,EAAA,OAAAuD,IAAAvD,EAAA,OAAAE,GAAAF,EAAA,OAAAsL,MAAAA,KAAAtL,EAAA;CAAA,IAAAuL;CAAA,AAAAvL,EAAA,SAAAkL,MAAAlL,EAAA,SAAAmL,MAAAnL,EAAA,SAAAsL,MAnBjEC,IAAA,kBAAA,OAAA;EACa,WAAAL;EASA,WAAA;EAET,aAAAC;EAOY,cAAAG;EACL,SAAAE;CAAkC,CAAA,GAC3CxL,EAAA,OAAAkL,IAAAlL,EAAA,OAAAmL,IAAAnL,EAAA,OAAAsL,IAAAtL,EAAA,OAAAuL,KAAAA,IAAAvL,EAAA;CAAA,IAAAyL;CACE,OADFzL,EAAA,SAAAiC,MAAAjC,EAAA,SAAA6I,MAAA7I,EAAA,SAAAwH,MAAAxH,EAAA,SAAAyH,MAAAzH,EAAA,SAAA0H,MAAA1H,EAAA,SAAA8H,MAAA9H,EAAA,SAAA+I,MAAA/I,EAAA,SAAAgJ,MAAAhJ,EAAA,SAAAiJ,MAAAjJ,EAAA,SAAAkJ,MAAAlJ,EAAA,SAAAmJ,MAAAnJ,EAAA,SAAAyJ,MAAAzJ,EAAA,SAAA4J,KAAA5J,EAAA,SAAA+J,MAAA/J,EAAA,SAAAoK,MAAApK,EAAA,SAAAuL,KAhJJE,KAAA,kBAAA,OAAA;EACO7K,KAAAA;EACA,MAAA;EACQ,eAAA4G;EACA,eAAAC;EACDxF,cAAAA;EAIV,aAAAyF;EAQSmB,WAAAA;EAIA,WAAAf;EACE,aAAAiB;EACF,WAAAC;EACC,YAAAC;EACC,aAAAC;EACL,QAAAC;EACD,OAAAM;EAOL,SAAAG;YAlCJ;GA6CGG;GAQAK;GAsEDmB;EAsBI;KAAAvL,EAAA,OAAAiC,IAAAjC,EAAA,OAAA6I,IAAA7I,EAAA,OAAAwH,IAAAxH,EAAA,OAAAyH,IAAAzH,EAAA,OAAA0H,IAAA1H,EAAA,OAAA8H,IAAA9H,EAAA,OAAA+I,IAAA/I,EAAA,OAAAgJ,IAAAhJ,EAAA,OAAAiJ,IAAAjJ,EAAA,OAAAkJ,IAAAlJ,EAAA,OAAAmJ,IAAAnJ,EAAA,OAAAyJ,IAAAzJ,EAAA,OAAA4J,GAAA5J,EAAA,OAAA+J,IAAA/J,EAAA,OAAAoK,IAAApK,EAAA,OAAAuL,GAAAvL,EAAA,OAAAyL,MAAAA,KAAAzL,EAAA,MAjJNyL;AAiJM;AAnaH,SAAAD,GAAAE,GAAA;CAAA,OAiaqBzH,EAAKuG,gBAAiB;AAAC;AAja5C,SAAAG,GAAAgB,GAAA;CAAA,OAqY0C1H,EAAKuG,gBAAiB;AAAC;AArYjE,SAAAE,GAAAkB,GAAA;CAAA,OA+XuC,CAACA;AAAM;AA/X9C,SAAAlK,GAAAmK,GAAA;CAAA,OAiCkDvF,EAAK9E;AAAgB;AAjCvE,SAAAD,GAAA+E,GAAA;CAAA,OAwBW;EAAApF,SACDoF,EAAKpF;EAAQC,eACPmF,EAAKnF;EAAcC,kBAChBkF,EAAKwF,eAAeC;EAAiB1K,eACxCiF,EAAKjF;EAAc2K,aACrB1F,EAAK0F;CACpB;AAAC;AAyYP,SAAS/D,GAAUgE,GAA0B;CAC3C,OACE,OAAOA,KAAS,cAChBA,KACA,UAAUA,KACVA,EAAKC,SAAS5O,EAAK6O;AAEvB;;;AC9bA,IAAMyB,KAA0C;CAC9CH,UAAU;CACVC,QAAQ;CACRC,YAAY;AACd;AAEA,SAAAE,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAA4B,EAAAC,SAAAC,cAAAC,cAAAL,GAQ3BM;CAAA,AAAAL,EAAA,OAAAE,EAAAI,SAI4CD,IAAAL,EAAA,MAA3BK,IAAAf,GAAeY,EAAII,MAAO,GAACN,EAAA,KAAAE,EAAAI,QAAAN,EAAA,KAAAK;CAGrC,IAAAE,IAAAH,EAAMR,cAAeQ,EAAMV,aAAc,SAAST,GAAMuB,aAAxD,IACAC,IAAAL,EAAMR,cAAeQ,EAAMV,aAAc,UACrCT,GAAMyB,cADV,IAEMC;CAAA,AAAAX,EAAA,OAAAO,KAAAP,EAAA,OAAAS,KALGE,IAAA;EACT3B,EAAO4B;EACPL;EACAE;CAEM,CACP,CAAAI,OACSC,OAAO,GAACd,EAAA,KAAAO,GAAAP,EAAA,KAAAS,GAAAT,EAAA,KAAAW,KAAAA,IAAAX,EAAA;CAPP,IAAAe,IAAAJ,EAOOK,KACV,GAAG,GAGHC,IAAAb,EAAMV,aAAc,SAASU,EAAMT,SAAnCuB,KAAAA,GACCC,IAAAf,EAAMV,aAAc,UAAUU,EAAMT,SAApCuB,KAAAA,GACGE,IAAAhB,EAAMV,WAAN,WAAAwB,KAAAA,GACFG,IAAAjB,EAAMV,WAAN,IAAAwB,KAAAA,GAA+BI;CAAA,AAAAtB,EAAA,OAAAG,KAAAH,EAAA,OAAAiB,KAAAjB,EAAA,OAAAmB,KAAAnB,EAAA,OAAAoB,KAAApB,EAAA,OAAAqB,KALlCC,IAAA;EAAAC,WACMpB;EAASqB,MACdP;EAAsDQ,OACrDN;EAAuDO,UACpDN;EAAsCO,QACxCN;CACV,GAACrB,EAAA,KAAAG,GAAAH,EAAA,KAAAiB,GAAAjB,EAAA,KAAAmB,GAAAnB,EAAA,KAAAoB,GAAApB,EAAA,KAAAqB,GAAArB,EAAA,MAAAsB,KAAAA,IAAAtB,EAAA;CAAA,IAAA4B;CAAA,AAAA5B,EAAA,QAAAE,IAG2D0B,IAAA5B,EAAA,OAAzD4B,IAAApD,GAAW0B,EAAII,OAAOuB,UAAU3B,MAAOA,EAAI4B,WAAY,CAAC,GAAC9B,EAAA,MAAAE,GAAAF,EAAA,MAAA4B;CAAA,IAAAG;CAAA,AAAA/B,EAAA,QAAA4B,IACrDG,IAAA/B,EAAA,OAFP+B,IAAA,kBAAA,QAAA;EAAiB,WAAA/C,EAAOgD;YACrBJ;CACI,CAAA,GAAA5B,EAAA,MAAA4B,GAAA5B,EAAA,MAAA+B;CAAA,IAAAE;CACH,OADGjC,EAAA,QAAAK,KAAAL,EAAA,QAAAsB,KAAAtB,EAAA,QAAA+B,KAAA/B,EAAA,QAAAe,KAtBTkB,IAAA,kBAAA,OAAA;EACO,MAAA;EACO,cAAA5B;EACD,WAAAU;EASJ,OAAAO;YAQPS;CAGI,CAAA,GAAA/B,EAAA,MAAAK,GAAAL,EAAA,MAAAsB,GAAAtB,EAAA,MAAA+B,GAAA/B,EAAA,MAAAe,GAAAf,EAAA,MAAAiC,KAAAA,IAAAjC,EAAA,KAvBNiC;AAuBM;AAkBV,SAAgBK,GAA2D,EACzEH,iBAC8B;CAC9B,IAAM,EAAEI,UAAOC,aAAUrC,cAAWsC,mBAAgBtD,EAAqB;CAIzER,EAAY4D,EAAMG,KAAK;CAEvB,IAAM,EAAEC,YAASC,oBAAiB,iCAChCL,EAAMM,QAAQC,QAAQ,CAAC,GAEnBC,IAAqBhE,EAAuB,IAAI,GAIhDkE,IAAOT,EAASU,aAClBX,EAAMY,qBAAqB,CAAC,CAACF,OAC7BV,EAAMa,wBAAwB,CAAC,CAACH;CAKpCnE,QAAgB;EACd,IAAI,CAAC0D,EAASU,YAAY;EAC1B,IAAMG,IAAYd,EAAMe,aAAa;EACrC,AAAID,IAAY,KAAKd,EAAMG,MAAMa,MAAML,WAAWM,aAAaH,KAC7Dd,EAAMkB,aAAaJ,IAAY,CAAC;CAEpC,CAAC;CAED,IAAMK,IAAc9E,GAAe;EACjC+E,OAAOV,EAAKW;EACZC,wBAAwBd,EAAmBe;EAC3CC,cAAclF,QAAkBsB,GAAW,CAACA,CAAS,CAAC;EACtD6D,YAAYnF,GAAaoF,MAAkBhB,EAAKgB,EAAM,EAAEC,MAAMD,GAAO,CAAChB,CAAI,CAAC;EAC3EkB,UAAU;EACVC,aAAa;GAAEC,QAAQ;GAAKC,OAAO;EAAK;CAC1C,CAAC,GAEKC,IAAeb,EAAYc,gBAAgB,GAC3CC,IAAaF,EAAa,EAAE,EAAEG,SAAS,GACvCC,IACJjB,EAAYkB,aAAa,KAAKL,EAAaM,GAAG,EAAE,CAAC,EAAEC,OAAO,IAEtDC,IAAkBxC,EAAMyC,mBAAmB,GAC3CC,IAAmB1C,EAAM2C,oBAAoB,GAC7CC,IAAoB5C,EAAM6C,qBAAqB,GAE/CC,IAAiB;EACrB,GAAGN;EACH,GAAGI;EACH,GAAGF;CAAgB,GAKfK,IAAqB/C,EAAMgD,sBAAsB,GACjDC,IAAmBjD,EAAMkD,oBAAoB,GAC7CC,IAAoBnD,EAAMoD,qBAAqB,GAC/CC,IAAeN,EAAmBO,KAAKC,GAAO7B,OAAW;EAC7DC,IAAI4B,EAAM5B;EACV6B,SAAS;GACP,GAAIP,EAAiBvB,EAAM,EAAE8B,WAAW,CAAA;GACxC,GAAGD,EAAMC;GACT,GAAIL,EAAkBzB,EAAM,EAAE8B,WAAW,CAAA;EAAG;CAEhD,EAAE,GAQIC,IAAezD,EAAMG,MAAMa,MAAMyC,cACjCC,IAAeZ,EAAeQ,KAAKvF,MAAW;EAClD,IAAM4F,IAAU5F,EAAOuB,UAAUsE,YAAY7F,EAAOuB,UAAUuE,SACxDC,IAAY/F,EAAO4D,MAAM8B,GACzBM,IAAWhG,EAAOiG,YAAY,MAAM,IACpCC,IAAWlG,EAAOuB,UAAUsE,WAAW;EAI7C,OAHID,KAAWG,KAAaC,IACnB;GAAEG,OAAO,GAAGnG,EAAOoG,QAAQ,EAAC;GAAMF,UAAUlG,EAAOoG,QAAQ;EAAE,IAE/D;GACLD,OAAO,UAAUD,EAAQ,MAAOlG,EAAOuB,UAAUiB,MAAM6D,QAAQ,EAAC;GAChEH;EACF;CACF,CAAC,GACKI,IAAsBX,EAAaJ,KAAKgB,MAAMA,EAAEJ,KAAK,CAAC,CAACzF,KAAK,GAAG,GAC/D8F,IAAeb,EAAac,QAAQC,GAAKH,MAAMG,IAAMH,EAAEL,UAAU,CAAC,GAalES,oBAAe,IAAIC,IAAoC,GACvDC,KAAWC,MACfnB,EAAaZ,EAAegC,WAAWR,MAAMA,EAAE3C,OAAOkD,CAAQ,EAAE,EAAEZ,YAClE,GAEEc,IAAa;CACjB,KAAK,IAAMhH,KAAUyE,GAMnBuC,AALAL,EAAaM,IAAIjH,EAAO4D,IAAI;EAC1BxE,UAAU;EACVC,QAAQ2H;EACR1H,YAAYU,EAAO4D,OAAOa,EAAgBF,GAAG,EAAE,CAAC,EAAEX;CACpD,CAAC,GACDoD,KAAcH,EAAQ7G,EAAO4D,EAAE;CAEjC,IAAIsD,IAAc;CAClB,KAAK,IAAMlH,KAAU,CAAC,GAAG2E,CAAgB,CAAC,CAACwC,QAAQ,GAMjDD,AALAP,EAAaM,IAAIjH,EAAO4D,IAAI;EAC1BxE,UAAU;EACVC,QAAQ6H;EACR5H,YAAYU,EAAO4D,OAAOe,EAAiB,EAAE,EAAEf;CACjD,CAAC,GACDsD,KAAeL,EAAQ7G,EAAO4D,EAAE;CAElC,KAAK,IAAM5D,KAAU6E,GACnB8B,EAAaM,IAAIjH,EAAO4D,IAAI;EAC1BxE,UAAU;EACVC,QAAQ;EACRC,YAAY;CACd,CAAC;CAEH,IAAM8H,KAAaN,MACjBH,EAAaU,IAAIP,CAAQ,KAAKvH,IAE1B+H,IAAU3E,EAAKW,WAAW,GAI1BiE,IACJrF,EAASsF,gBAAgBtF,EAASuF,qBAAqB,OACnDC,IAAmBH,KAAqB1F,MAAejB,KAAAA,GAEvD+G,KAAqB7F,MAAoD;EAE7ED,AADI0F,KAAqBzF,EAAI8F,aAAa,KAAG9F,EAAI+F,eAAe,GAChEhG,IAAaC,CAAgD;CAC/D;CAEA,OACE,kBAAC,OAAD;EAAK,WAAWpD,EAAQoJ;YAAxB,CACE,kBAAC,OAAD;GAAK,KAAKrF;GAAoB,WAAW/D,EAAQqJ;aAC/C,kBAAC,OAAD;IACE,MAAK;IACL,WAAWrJ,EAAQsJ;IAInB,iBAAerF,EAAKW,SAASgC,EAAahC;IAC1C,iBAAeyB,EAAezB;IAC9B,OAAO;KAAEgD;KAAqBJ,UAAUM;IAAa;cARvD;KAUE,kBAAC,OAAD;MAAK,MAAK;MAAW,OAAO,EAAEyB,SAAS,WAAW;gBAC/C3C,EAAaC,KAAK2C,GAAaC,MAC9B,kBAAC,OAAD;OAEE,MAAK;OACL,iBAAeA,IAAa;OAC5B,WAAWzJ,EAAQ0J;iBAElBF,EAAYzC,QAAQF,KAAK8C,MACxB,kBAAC,IAAD;QAEUA;QACR,QAAQjB,EAAUiB,EAAOrI,OAAO4D,EAAE;OAAE,GAF/ByE,EAAOzE,EAEwB,CAEvC;MACE,GAZEsE,EAAYtE,EAYd,CACN;KACE,CAAA;KAEJO,IAAa,KACZ,kBAAC,OAAD;MAAK,eAAA;MAAY,OAAO;OAAEmE,YAAY;OAAQvE,QAAQI;MAAW;KAAE,CAAA;KAGrE,kBAAC,OAAD;MAAK,MAAK;MAAW,OAAO,EAAE8D,SAAS,WAAW;gBAC/ChE,EAAasB,KAAKgD,MAAgB;OACjC,IAAMzG,IAAMa,EAAK4F,EAAY5E;OAE7B,OADK7B,IAEH,kBAAC,OAAD;QAEE,MAAK;QACL,iBAAeyG,EAAY5E,QAAQ2B,EAAahC,SAAS;QACzD,eAAa,UAAUxB,EAAI8B;QAC3B,iBAAe9B,EAAI2G,cAAc;QAGjC,oBACEvG,EAASwG,yBAAyB5G,EAAI2G,cAAc;QAEtD,yBAAuBlB;QACvB,iBACErF,EAASsF,eAAe1F,EAAI2G,cAAc,IAAI7H,KAAAA;QAEhD,WAAWlC,EAAQiK;QACnB,OAAO;SACL1H,WAAWpB;SACX+I,QAAQlB,IAAmB,YAAY9G,KAAAA;QACzC;QAEA,UAAU2G,IAAoB,IAAI3G,KAAAA;QAClC,SACE8G,UAAyBC,EAAkB7F,CAAG,IAAIlB,KAAAA;QAEpD,WACE2G,KACKsB,MAAU;SACLA,EAAML,QAAQ,OAAOK,EAAML,QAAQ,WACnCK,EAAMC,WAAWD,EAAME,kBAC3BF,EAAMG,eAAe,GACrBrB,EAAkB7F,CAAG;QACvB,IACAlB,KAAAA;kBAGL;SACC,GAAGkB,EAAImH,oBAAoB;SAC3B,GAAGnH,EAAIoH,sBAAsB;SAC7B,GAAGpH,EAAIqH,qBAAqB;QAAC,CAC9B,CAAC5D,KAAK3F,MACL,kBAAC,IAAD;SAEQA;SACKC;SACX,QAAQuH,EAAUxH,EAAKI,OAAO4D,EAAE;QAAE,GAH7BhE,EAAKgE,EAGwB,CAErC;OACE,GA/CE2E,EAAYC,GA+Cd,IAlDU;MAoDnB,CAAC;KACE,CAAA;KAEJlB,KAAWjF,MAAY,MACtB,kBAAC,OAAD;MAAK,MAAK;MAAM,WAAW3D,EAAQ0K;gBACjC,kBAAC,GAAD,EAAQ,MAAK,KAAI,CAAA;KACd,CAAA;KAGN9B,KAAWjF,MAAY,MACtB,kBAAC,OAAD;MAAK,MAAK;MAAM,WAAW3D,EAAQ0K;gBAAnC,CACE,kBAAC,IAAD;OAAY,MAAM;OAAI,QAAQ;OAAK,SAAS;MAAI,CAAA,GAChD,kBAAC,GAAD;OAAM,MAAMjH;OAAa,GAAE;iBACxBG;MACG,CAAA,CACH;;KAGN+B,IAAgB,KACf,kBAAC,OAAD;MACE,eAAA;MACA,OAAO;OAAEiE,YAAY;OAAQvE,QAAQM;MAAc;KAAE,CAAA;IAGtD;;EACF,CAAA,GAEL,kBAAC,IAAD,CAAsB,CAAA,CACnB;;AAET;;;;;;;AEvVA,SAAO8F,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAA2B,EAAAC,gBAAAH,GAAsCI;CACd,OADcH,EAAA,OAAAE,IACdC,IAAAH,EAAA,MAAjDG,IAAA,kBAAA,OAAA;EAAgB,WAAAb,GAAOc;EAAWF;CAAe,CAAA,GAAAF,EAAA,KAAAE,GAAAF,EAAA,KAAAG,IAAjDA;AAAiD;AAI1D,SAAOE,KAAA;CAAA,IAAAL,IAAAC,EAAA,CAAA,GAAAF;CAC2C,OAD3CC,EAAA,OAAAM,OAAAC,IAAA,2BAAA,KACER,IAAA,kBAAA,OAAA,EAAgB,WAAAT,GAAOkB,cAAc,CAAA,GAAIR,EAAA,KAAAD,KAAAA,IAAAC,EAAA,IAAzCD;AAAyC;AAOlD,SAAOU,GAAAV,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAgC,EAAAC,gBAAAH,GACrC,EAAAW,UAAAC,mBAA+BnB,EAAqB;CAGpD,IAFAJ,EAAYsB,EAAKE,KAAM,GAEnBV,MAAaW,KAAAA,GAAS;EAAA,IAAAV;EAIf,OAJeH,EAAA,OAAAE,KAAAF,EAAA,OAAAW,KAEtBR,IAAA,kBAAC,GAAD;GAAYQ,MAAAA;GAAe,GAAA;GACxBT;EADE,CAAA,GAEEF,EAAA,KAAAE,GAAAF,EAAA,KAAAW,GAAAX,EAAA,KAAAG,KAAAA,IAAAH,EAAA,IAFPG;CAEO;CAEV,IAAAA;CAAA,AAAAH,EAAA,OAAAU,IAEgCP,IAAAH,EAAA,MAAnBG,IAAAO,EAAKI,YAAa,GAACd,EAAA,KAAAU,GAAAV,EAAA,KAAAG;CAAjC,IAAAY,IAAcZ,GAAoBa;CAAA,AAAAhB,EAAA,OAAAU,IAGUM,IAAAhB,EAAA,MAD1CgB,IAAAN,EAAKO,QAAQC,MAAoBC,iBACjCT,EAAKU,uBAAwB,CAAC,CAAAC,KAAKC,QAAOtB,EAAA,KAAAU,GAAAV,EAAA,KAAAgB;CAF5C,IAAAO,IACEP,GAC2CQ;CAKpC,OALoCxB,EAAA,OAAAW,KAAAX,EAAA,OAAAe,KAAAf,EAAA,OAAAuB,KAG3CC,IAAA,kBAAC,GAAD;EAAYb,MAAAA;EAAe,GAAA;YAA3B;GACGI;GAAM;GAAIQ;EADR;KAEEvB,EAAA,KAAAW,GAAAX,EAAA,KAAAe,GAAAf,EAAA,KAAAuB,GAAAvB,EAAA,MAAAwB,KAAAA,IAAAxB,EAAA,KAFPwB;AAEO;AAQX,SAAOC,KAAA;CAAA,IAAAzB,IAAAC,EAAA,CAAA,GACL,EAAAS,UAAAgB,OAAAC,aAAAhB,mBAA6CnB,EAAqB,GAClEoC,IAAexC,EAAYsC,GAAIG,EAAiC;CAEhE,IAAI,CAACpC,GAAoBiB,GAAOiB,CAAQ,CAAC,CAAAG,YAAW,OAAS;CAAK,IAAA/B;CAAA,AAAAC,EAAA,OAAAM,OAAAC,IAAA,2BAAA,KAqBxDR,IAAA,kBAAC,GAAD;EAAkB,MAAA;EAAY,QAAA;CAAG,CAAA,GAAIC,EAAA,KAAAD,KAAAA,IAAAC,EAAA;CAAA,IAAAG;CAAA,AAAAH,EAAA,OAAAW,KAAAX,EAAA,OAAA0B,EAAAK,QAAAC,sBAT3C7B,IAAA,kBAAA,EAAA,QAAA,EAAA,UACE,kBAAC,GAAD;EAAe,OAAA;EAA4B,WAAA;YACzC,kBAAC,GAAD;GACU,SAAA;GACF,OAAA;GACAQ,MAAAA;GACK,cAAA;GACF,SAAAe,EAAEK,QAAQC;aAEnBjC;EAPS,CAAA;CADL,CAAA,EAWV,CAAA,GAAiBC,EAAA,KAAAW,GAAAX,EAAA,KAAA0B,EAAAK,QAAAC,oBAAAhC,EAAA,KAAAG,KAAAA,IAAAH,EAAA;CAAA,IAAAgB;CAAA,AAAAhB,EAAA,OAAAM,OAAAC,IAAA,2BAAA,KACjBS,IAAA,kBAAA,EAAA,UAAA;EAAqB,GAAA;YACnB,kBAAC,IAAD,CAAuB,CAAA;CACzB,CAAA,GAAmBhB,EAAA,KAAAgB,KAAAA,IAAAhB,EAAA;CAAA,IAAAwB;CACX,OADWxB,EAAA,OAAA4B,KAAA5B,EAAA,OAAAG,KAAAH,EAAA,OAAA0B,EAAAK,QAAAE,uBAxBrBT,IAAA,kBAAC,GAAD;EACUI;EACE,UAAAF,EAAEK,QAAQE;EACX,UAAA;EACF,QAAA;EACA,QAAA;EACP,cAAA;EACA,WAAA;YAPF,CASE9B,GAaAa,CAtBM;KAyBEhB,EAAA,KAAA4B,GAAA5B,EAAA,KAAAG,GAAAH,EAAA,KAAA0B,EAAAK,QAAAE,qBAAAjC,EAAA,KAAAwB,KAAAA,IAAAxB,EAAA,IAzBVwB;AAyBU;AAhCP,SAAAK,GAAAK,GAAA;CAAA,OAEqCA,EAAKC;AAAiB;AAsClE,SAAOC,KAAA;CAAA,IAAApC,IAAAC,EAAA,EAAA,GACLoC,IAAY7C,EAAqB,GACjC,EAAAkB,UAAAgB,OAAAC,aAAAhB,mBAA6C0B,GAC7CT,IAAexC,EAAYsC,GAAIY,EAAgC,GAK/DG,IAJsBrD,EACpBsB,EAAKE,OACL4B,EAEkBD,CAAAA,CAAaG,OAAQC,EAEzC,CAAC,CAAArB;CAED,IAAI,CAAC7B,GAAoBiB,GAAOiB,CAAQ,CAAC,CAAAiB,cAAa,OAAS;CAKhD,IAAA7C,IAAA6B,KAAUa,IAAc,IAAxB,UAAA,UACFtC,IAAAsC,IAAc,IAAd5B,KAAAA,IAAA,QAAoCG;CAAA,AAAAhB,EAAA,OAAAqC,KAAArC,EAAA,OAAA4B,KAAA5B,EAAA,OAAAU,KAAAV,EAAA,OAAA0B,KAGlCV,UAAA;EACP,IAAIY,GAAM;GACRF,EAAEK,QAAQc,iBAAkB;GAAC;EAAA;EAG/B,IAAAC,IAAwBpC,EAAKqC,kBACR,CAAC,CAAAC,KACdC,EAAiC;EACzC,AAAIH,IAAiBjD,GAAiBwC,GAAKS,EAAeI,EAAG,IACxDxB,EAAEK,QAAQoB,gBAAiB;CAAE,GACnCnD,EAAA,KAAAqC,GAAArC,EAAA,KAAA4B,GAAA5B,EAAA,KAAAU,GAAAV,EAAA,KAAA0B,GAAA1B,EAAA,KAAAgB,KAAAA,IAAAhB,EAAA;CAAA,IAAAwB;CAAA,AAAAxB,EAAA,OAAAM,OAAAC,IAAA,2BAAA,KAEDiB,IAAA,kBAAC,GAAD;EAAkB,MAAA;EAAY,QAAA;CAAG,CAAA,GAAIxB,EAAA,KAAAwB,KAAAA,IAAAxB,EAAA;CAAA,IAAAoD;CAE/B,OAF+BpD,EAAA,OAAAW,KAAAX,EAAA,OAAAD,KAAAC,EAAA,OAAAG,KAAAH,EAAA,OAAAgB,KAlBzCoC,IAAA,kBAAC,GAAD;EAAe,OAAA;EAAqB,WAAA;YAClC,kBAAC,GAAD;GACW,SAAArD;GACF,OAAAI;GACDQ,MAAAA;GACK,cAAA;GACF,SAAAK;aAYTQ;EAjBS,CAAA;CADL,CAAA,GAoBExB,EAAA,KAAAW,GAAAX,EAAA,KAAAD,GAAAC,EAAA,KAAAG,GAAAH,EAAA,KAAAgB,GAAAhB,EAAA,MAAAoD,KAAAA,IAAApD,EAAA,KApBVoD;AAoBU;AAnCP,SAAAH,GAAAI,GAAA;CAAA,OA4BuBA,EAAMC,aAAc;AAAC;AA5B5C,SAAAX,GAAAD,GAAA;CAAA,OASHhD,GAAegD,EAAMa,KAAM;AAAC;AATzB,SAAAf,GAAAgB,GAAA;CAAA,OAMQtB,EAAKK;AAAc;AAN3B,SAAAD,GAAAJ,GAAA;CAAA,OAGqCA,EAAKuB;AAAgB;;;AC5FjE,IAAaG,KAA0C,MAS1CC,KAAkD;CAC7DE,IAAI;CACJC,IAAI;CACJC,IAAI;CACJC,IAAI;CACJC,IAAI;AACN,GAGaC,KAAyD;CACpEL,IAAI;CACJC,IAAI;CACJC,IAAI;CACJC,IAAI;CACJC,IAAI;AACN;;;AC6BA,SAAA6B,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAA+C,EAAAC,UAAAC,OAAAC,aAAAV,MAAAW,GAAAZ,aAAAE,cAAAC,aAAAG,GAI7CL,IAAAW,MAAAC,KAAAA,IAAAA,OAAAD,GAKAE,IAAkBL,EAAKM,QAAQC,MAAgBF,aAAInB,GAAgBM,IASlDgB,IAAAvB,GAAkBO,IAAKiB;CAAA,AAAAX,EAAA,OAAAI,KAAAJ,EAAA,OAAAO,KAAAP,EAAA,OAAAN,KAAAM,EAAA,OAAAU,KAAAV,EAAA,OAAAE,KAAAF,EAAA,OAAAG,KAN/BQ,IAAA;EAAAT;EAAAC;EAAAC;EAAAV;EAAAa;EAAAK,aAMQF;CACf,GAACV,EAAA,KAAAI,GAAAJ,EAAA,KAAAO,GAAAP,EAAA,KAAAN,GAAAM,EAAA,KAAAU,GAAAV,EAAA,KAAAE,GAAAF,EAAA,KAAAG,GAAAH,EAAA,KAAAW,KAAAA,IAAAX,EAAA;CARH,IAAAa,IACSF,GASPG;CAAA,AAAAd,EAAA,OAAAL,IAMwDmB,IAAAd,EAAA,MAAzCc,IAAA,CAACvC,EAAOwC,MAAOpB,CAAS,CAAC,CAAAqB,OAAQC,OAAO,GAACjB,EAAA,KAAAL,GAAAK,EAAA,KAAAc;CAAzC,IAAAI,IAAAJ,EAAyCK,KAAM,GAAG,GAACC;CAAA,AAAApB,EAAA,OAAAP,KAAAO,EAAA,QAAAN,KAAAM,EAAA,QAAAJ,KAAAI,EAAA,QAAAkB,KAFhEE,IAAA,kBAAA,OAAA;EACa1B,aAAAA;EACA,WAAAwB;EACJtB;EAENH;CACG,CAAA,GAAAO,EAAA,KAAAP,GAAAO,EAAA,MAAAN,GAAAM,EAAA,MAAAJ,GAAAI,EAAA,MAAAkB,GAAAlB,EAAA,MAAAoB,KAAAA,IAAApB,EAAA;CAAA,IAAAqB;CACoB,OADpBrB,EAAA,QAAAa,KAAAb,EAAA,QAAAoB,KAPRC,IAAA,kBAAC,IAAD;EAAkCR,OAAAA;YAChCO;CADwB,CAAA,GAQEpB,EAAA,MAAAa,GAAAb,EAAA,MAAAoB,GAAApB,EAAA,MAAAqB,KAAAA,IAAArB,EAAA,KAR5BqB;AAQ4B;AAIhC,IAAaC,KAAaC,OAAOC,OAAO1B,IAAgB;CACtD2B,SAASzC;CACT0C,QAAQzC;CACR0C,cAAc5C;CACd6C,eAAe/C;CACfgD,cAAc/C;CACdgD,OAAOlD;CACPmD,QAAQpD;CAERqD,aAAatD;CAEbuD,cAAczD;AAChB,CAAC"}
1
+ {"version":3,"file":"index.js","names":["createContext","useContext","TMDataGridSize","TMDataGridApi","TMDataGridRowData","Record","TMDataGridContextValue","size","rowHeight","controlSize","TMDataGridContext","TMDataGridContextProvider","Provider","useTMDataGridContext","api","Error","TMDataGridColumnType","TMDataGridColumnMeta","ColumnLike","id","columnDef","header","meta","parent","getColumnLabel","column","label","getColumnType","type","getColumnAlign","align","isColumnReorderable","enableOrdering","undefined","Row","RowData","TMDataGridFeatures","getGroupDataRows","row","TData","Array","subRows","length","getLeafRows","filter","leaf","UnstyledButton","ColumnDef","Row","RowData","useSelector","shallow","classes","ChevronRightIcon","getColumnLabel","getGroupDataRows","TMDataGridFeatures","TMDataGridTable","GROUP_COLUMN_ID","INDENT_STEP","BLANK_GROUP_LABEL","formatGroupValue","value","undefined","Date","toLocaleDateString","String","GroupCell","t0","$","_c","row","t1","getIsExpanded","expanded","table","store","getIsGrouped","t2","groupingValue","label","t3","depth","t4","paddingInlineStart","t5","t6","event","stopPropagation","toggleExpanded","t7","Symbol","for","t8","chevron","t9","groupLabel","t10","t11","length","groupCount","t12","groupToggle","GroupHeader","compare","grouping","_temp","columnId","column","getColumn","map","join","state","createGroupColumn","TData","id","meta","enableOrdering","size","minSize","enableSorting","enableColumnFilter","enableGlobalFilter","enableHiding","enablePinning","cell","aggregatedCell","header","Button","Checkbox","ScrollArea","Text","TextInput","useSelector","useState","classes","useTMDataGridContext","getColumnLabel","GROUP_COLUMN_ID","SearchIcon","TMDataGridColumnsPanel","$","_c","table","controlSize","search","setSearch","columnVisibility","store","_temp","T0","hideableColumns","shownCount","t0","t1","t2","t3","t4","t5","visibleInPanel","columns","getAllLeafColumns","filter","_temp2","needle","trim","toLowerCase","column_0","column","includes","_temp3","t6","column_2","id","length","columnsPanel","t7","Symbol","for","event","currentTarget","value","t8","columnsPanelSearch","Autosize","columnsPanelList","t9","column_3","getCanHide","event_0","toggleVisibility","checked","map","t10","t11","event_1","toggleAllColumnsVisible","t12","t13","resetColumnVisibility","t14","columnsPanelFooter","t15","column_1","state","Row","RowData","TableFeatures","TMDataGridFilterValue","operator","TMDataGridFilterOperator","value","TMDataGridColumnType","FILTER_OPERATOR_LABELS","Record","contains","equals","notEquals","startsWith","endsWith","greaterThan","greaterThanOrEqual","lessThan","lessThanOrEqual","isEmpty","isNotEmpty","STRING_OPERATORS","NUMBER_OPERATORS","VALUELESS_OPERATORS","getOperatorsForType","type","getDefaultOperator","operatorNeedsValue","includes","isTMDataGridFilterValue","isFilterActive","trim","formatFilterLabel","label","filter","text","matchesFilter","cellValue","undefined","filterText","numericCell","Number","NaN","numericFilter","compareNumeric","isNaN","cellText","String","toLowerCase","needle","tmDataGridFilterFn","row","TFeatures","TData","columnId","filterValue","getValue","ActionIcon","Button","Select","Stack","Text","TextInput","useSelector","useEffect","useRef","classes","useTMDataGridContext","getColumnLabel","getColumnType","TMDataGridFilterOperator","TMDataGridFilterValue","FILTER_OPERATOR_LABELS","getDefaultOperator","getOperatorsForType","isTMDataGridFilterValue","operatorNeedsValue","CloseIcon","FALLBACK_FILTER","operator","value","asFilterValue","TMDataGridFilterPanel","$","_c","table","ui","controlSize","opened","_temp","columnFilters","store","_temp2","panelRef","t0","t1","handlePointerDown","event","target","Element","current","contains","closest","actions","closeFilterPanel","document","addEventListener","removeEventListener","addFilter","changeFilterColumn","clearAllFilters","columnOptions","patchFilter","removeFilter","t2","filterableColumns","getAllLeafColumns","filter","_temp3","map","_temp4","columnId","remaining","id","setColumnFilters","length","fromColumnId","toColumnId","find","filter_0","target_0","getColumn","filter_1","filter_2","openFilterPanel","t3","columnId_0","patch","filter_3","t4","nextColumn","column_1","some","filter_4","column","t5","column_2","filter_5","canAddFilter","event_0","key","stopPropagation","Symbol","for","t6","t7","filterPanelHeader","t8","t9","filter_6","column_3","type","needsValue","filterRow","withinPortal","next","_temp5","next_0","event_1","currentTarget","t10","t11","t12","t13","filterPanelFooter","t14","t15","filterPanel","label","column_0","getCanFilter","state_0","state","filterPanelOpen","TableState","TMDataGridFeatures","GridState","DATA_STATE_SLICES","const","ReadonlyArray","SETTINGS_STATE_SLICES","TMDataGridDataSlice","TMDataGridSettingsSlice","TMDataGridPersistKey","key","slices","TSlice","TMDataGridStorageMode","TMDataGridPersistence","dataKey","settingsKey","storageMode","serialize","value","Partial","deserialize","ResolvedKey","resolveKey","entry","defaultSlices","resolveStorage","persistence","Storage","window","sessionStorage","localStorage","prop","Record","undefined","isString","isFiniteNumber","Number","isFinite","isArrayOf","isItem","item","Array","isArray","every","isRecordOf","Object","values","hasStringId","SLICE_GUARDS","columnFilters","globalFilter","sorting","pagination","pageIndex","pageSize","expanded","columnVisibility","columnSizing","columnOrder","columnPinning","grouping","isValidSlice","slice","guard","readSlices","storage","resolved","raw","getItem","parsed","record","restored","writeSlices","state","payload","setItem","resolveKeys","data","settings","hasPersistenceKeys","defaultDeserialize","JSON","parse","defaultSerialize","stringify","readPersistedState","writePersistedState","Column","RowData","TMDataGridRowData","isColumnReorderable","TMDataGridFeatures","TMDataGridTable","UseTMDataGridOptions","TMDataGridSelectionMode","TMDataGridFeatureFlags","sorting","filtering","hiding","pinning","resizing","ordering","rowSelection","selectionMode","selectColumn","rowClickSelects","multiRowSelection","showSelectedBackground","highlightRow","pagination","grouping","readFeatureFlags","options","Pick","TData","enableRowSelection","enableSorting","enableColumnFilters","enableHiding","enableColumnPinning","enableColumnResizing","enableColumnOrdering","enableMultiRowSelection","enablePagination","manualPagination","enableGrouping","TMDataGridColumnCapabilities","canSort","canFilter","canHide","canPin","canResize","canReorder","canGroup","getColumnCapabilities","column","features","getCanSort","getCanFilter","getCanHide","getCanPin","getCanResize","getCanGroup","TMDataGridCapabilities","canSortAny","canFilterAny","canHideAny","canPinAny","canReorderAny","canGroupAny","canSelectRows","canPaginate","getGridCapabilities","table","columns","getAllLeafColumns","any","predicate","capabilities","some","c","Row","RowData","RowSelectionState","TMDataGridFeatureFlags","getGroupDataRows","TMDataGridFeatures","TMDataGridTable","getDisplayedRows","table","TData","features","Array","isPagingActive","getPaginatedRowModel","rows","getPrePaginatedRowModel","pagination","store","state","grouping","length","TMDataGridRowClickModifiers","toggle","extend","ResolveRowSelectionClickArgs","ReadonlyArray","rowId","anchorRowId","modifiers","selection","canReplaceSelection","ResolvedRowSelection","getSelectableRowIds","row","filter","dataRow","getCanSelect","map","id","resolveRowSelectionClick","index","findIndex","clickedRow","undefined","targets","getCanMultiSelect","only","untick","anchorIndex","from","Math","min","to","max","next","slice","allSelected","every","Checkbox","useSelector","ColumnDef","Row","RowData","useTMDataGridContext","getDisplayedRows","getSelectableRowIds","resolveRowSelectionClick","TMDataGridFeatures","TMDataGridTable","SELECT_COLUMN_ID","SelectAllCheckbox","t0","$","_c","table","t1","getIsAllRowsSelected","allSelected","store","t2","getIsSomeRowsSelected","someSelected","t3","t4","getToggleAllRowsSelectedHandler","t5","SelectAllHeader","features","multiRowSelection","SelectRowCheckbox","row","ui","isGroupRow","subRows","length","getIsAllSubRowsSelected","getIsSelected","selected","getIsSomeSelected","selectableIds","getCanMultiSelect","t6","t7","id","actions","state","selectionAnchorRowId","event","native","nativeEvent","isMouse","MouseEvent","resolved","rows","rowId","anchorRowId","modifiers","toggle","ctrlKey","metaKey","extend","shiftKey","selection","rowSelection","canReplaceSelection","setRowSelection","setSelectionAnchor","t8","_temp","event_0","stopPropagation","createSelectColumn","TData","meta","label","align","enableOrdering","size","minSize","maxSize","enableResizing","enableSorting","enableColumnFilter","enableGlobalFilter","enablePinning","header","cell","aggregatedCell","useCreateStore","aggregationFns","ColumnDef","columnFacetingFeature","columnFilteringFeature","columnGroupingFeature","columnOrderingFeature","columnPinningFeature","columnResizingFeature","columnSizingFeature","columnVisibilityFeature","createColumnHelper","createExpandedRowModel","createFacetedMinMaxValues","createFacetedRowModel","createFacetedUniqueValues","createFilteredRowModel","createGroupedRowModel","createPaginatedRowModel","createSortedRowModel","filterFns","globalFilteringFeature","metaHelper","RowData","rowExpandingFeature","rowPaginationFeature","rowSelectionFeature","rowSortingFeature","sortFns","Table","tableFeatures","TableOptions","TableState","useTable","Store","useEffect","useMemo","useRef","useState","TMDataGridColumnType","tmDataGridFilterFn","getDefaultOperator","hasPersistenceKeys","readPersistedState","TMDataGridPersistence","writePersistedState","readFeatureFlags","TMDataGridFeatureFlags","TMDataGridSelectionMode","createSelectColumn","SELECT_COLUMN_ID","createGroupColumn","GROUP_COLUMN_ID","PERSIST_DEBOUNCE_MS","TMDataGridColumnMeta","label","type","flex","align","enableOrdering","TMDataGridTableMeta","loading","noResultsLabel","rowHeight","totalRowCount","tmDataGridFeatures","filteredRowModel","groupedRowModel","sortedRowModel","expandedRowModel","paginatedRowModel","facetedRowModel","facetedMinMaxValues","facetedUniqueValues","tmDataGrid","tableMeta","columnMeta","TMDataGridFeatures","TMDataGridTable","TData","createTMDataGridColumnHelper","TMDataGridUiState","filterPanelOpen","columnsPanelOpen","filterPanelColumnId","draggedColumnId","highlightedRowId","selectionAnchorRowId","TMDataGridUiActions","openFilterPanel","columnId","closeFilterPanel","setColumnsPanelOpen","open","toggleColumnsPanel","startColumnDrag","endColumnDrag","setHighlightedRow","rowId","setSelectionAnchor","TMDataGridUiStore","TMDataGridApi","table","ui","features","UseTMDataGridOptions","Omit","persist","enableColumnOrdering","enablePagination","selectionMode","showSelectedBackground","defaultHighlightedRowId","onHighlightedRowChange","TMDataGridColumnDef","withTMDataGridDefaults","columns","ReadonlyArray","Array","map","column","isArray","filterFn","aggregationFn","undefined","aggregatedCell","useTMDataGrid","t0","$","_c","options","t1","t2","t3","t4","t5","pinningEnabled","enableColumnPinning","selectColumnEnabled","selectColumn","groupColumnEnabled","grouping","base","persistedState","initialState","initialGrouping","t6","columnVisibility","t7","length","t8","t9","t10","t11","columnPinning","left","filter","_temp","t12","right","t13","t14","pagination","t15","pageIndex","pageSize","t16","t17","columnResizeMode","enableSorting","enableColumnResizing","globalFilterFn","groupedColumnMode","t18","t19","previousGrouping","store","state","subscription","subscribe","setColumnVisibility","old","setColumnOrder","_temp2","unsubscribe","t20","t21","timeout","pending","flush","subscription_0","state_0","clearTimeout","setTimeout","t22","t23","_temp6","onHighlightedRowChangeRef","t24","t25","current","t26","t27","previous","subscription_1","state_1","t28","setState","prev","_temp3","prev_1","_temp4","columnId_0","prev_3","_temp5","prev_5","rowId_0","prev_6","prev_4","prev_2","prev_0","old_0","id","openColumnFilter","api","getColumn","getFilterValue","setFilterValue","operator","columnDef","meta","value","actions","Button","Pill","UnstyledButton","RowData","useSelector","classes","getColumnLabel","getColumnType","formatFilterLabel","isFilterActive","isTMDataGridFilterValue","TMDataGridSize","openColumnFilter","TMDataGridApi","TMDataGridFilterPillsProps","api","TData","size","showClearAll","onPillClick","columnId","className","TMDataGridFilterPills","t0","$","_c","t1","t2","undefined","table","columnFilters","store","_temp","T0","activeFilters","t3","t4","t5","t6","t7","t8","Symbol","for","bb0","filter","_temp2","length","t9","filterPills","Boolean","join","Group","t10","filter_0","column","getColumn","id","label","value","pill","setColumnFilters","other","tabIndex","pillLabel","type","map","t11","state","ActionIcon","Group","Select","Text","Tooltip","RowData","useSelector","ReactNode","classes","useTMDataGridContext","getGridCapabilities","isPagingActive","ChevronLeftIcon","ChevronRightIcon","TMDataGridTable","PAGING_SUSPENDED_HINT","TMDataGridPaginationApi","pageIndex","pageSize","pageCount","rowCount","canPreviousPage","canNextPage","setPageIndex","setPageSize","previousPage","nextPage","firstPage","lastPage","getTMDataGridPaginationApi","table","TData","store","state","pagination","getPageCount","getRowCount","getCanPreviousPage","getCanNextPage","index","size","TMDataGridFooterProps","pageSizeOptions","ReadonlyArray","api","TMDataGridFooter","t0","$","_c","t1","undefined","features","controlSize","canPaginate","t2","t3","footer","paging","total","from","to","Math","min","sizeOptions","includes","sort","_temp","t4","t5","t6","t7","map","String","t8","t9","value","Number","t10","t11","t12","getFilteredRowModel","rows","length","t13","t14","t15","t16","Symbol","for","t17","t18","t19","t20","t21","t22","t23","t24","a","b","Column","ColumnPinningState","TMDataGridRowData","isColumnReorderable","TMDataGridFeatures","TMDataGridTable","GridColumn","GridTable","TMDataGridColumnRegion","TMDataGridDropSide","getColumnRegion","columnPinning","columnId","left","includes","right","moveInList","ids","ReadonlyArray","movedId","targetId","side","Array","remaining","filter","id","targetIndex","indexOf","splice","MoveColumnArgs","table","moveColumn","store","state","region","leafIds","getAllLeafColumns","map","column","setColumnOrder","setColumnPinning","previous","getRegionColumns","getLeftVisibleLeafColumns","getRightVisibleLeafColumns","getCenterVisibleLeafColumns","ColumnStepArgs","direction","getStepTargetColumn","columns","index","findIndex","target","moveColumnByStep","ActionIcon","Menu","Tooltip","flexRender","Header","useSelector","shallow","DragEvent","ReactNode","useRef","useState","classes","sticky","TMDataGridRowData","useTMDataGridContext","TMDataGridColumnLayout","getColumnCapabilities","getGridCapabilities","getColumnRegion","getStepTargetColumn","moveColumn","moveColumnByStep","TMDataGridDropSide","getColumnAlign","getColumnLabel","isFilterActive","ArrowDownIcon","ArrowUpIcon","CollapseAllIcon","ColumnsIcon","DotsVerticalIcon","ExpandAllIcon","EyeOffIcon","FilterIcon","GroupIcon","MoveLeftIcon","MoveRightIcon","PinLeftIcon","PinOffIcon","PinRightIcon","UngroupIcon","GROUP_COLUMN_ID","SELECT_COLUMN_ID","TMDataGridFeatures","openColumnFilter","TMDataGridHeader","TMDataGridHeaderCell","t0","$","_c","header","layout","api","table","features","column","menuOpened","setMenuOpened","dropSide","setDropSide","cellRef","suppressSortRef","t1","Symbol","for","compare","sorting","columnFilters","resizingColumnId","columnPinning","grouping","store","_temp","draggedColumnId","ui","_temp2","isLeaf","subHeaders","length","t2","label","t3","align","t4","id","find","sort","desc","sortDirection","isSorted","undefined","t5","t6","filter","value","some","isFiltered","isResizing","pinnedAt","capabilities","canSort","canFilter","canHide","canPin","canResize","canReorder","canGroup","t7","canHideAny","canManageColumns","t8","includes","isGrouped","isGroupingActive","isDragged","t9","isDropTarget","t10","handleDragStart","event","dataTransfer","effectAllowed","setData","actions","startColumnDrag","t11","handleDragOver","event_0","preventDefault","dropEffect","bounds","current","getBoundingClientRect","clientX","left","width","t12","handleDragLeave","event_1","next","relatedTarget","Node","currentTarget","contains","t13","handleDrop","event_2","endColumnDrag","columnId","targetId","side","t14","handleDragEnd","t15","setPinned","position","state","columnSizing","setColumnSizing","prev","Math","round","pin","menuItems","t16","t17","toggleSorting","t18","t19","t20","push","menuItemActive","getToggleGroupingHandler","groupedId","groupedColumn","getColumn","toggleGrouping","toggleAllRowsExpanded","t21","t22","t23","t24","t25","direction","previous","next_0","t26","toggleVisibility","setColumnsPanelOpen","isDivider","at","pop","headerCellSortable","headerCellDragging","headerCellDropBefore","headerCellDropAfter","isBoundary","stickyLeft","stickyRight","headerCell","Boolean","cellClass","join","t27","t28","t29","t30","t31","t32","t33","offset","t34","t35","t36","t37","right","zIndex","t38","event_3","getToggleSortingHandler","t39","columnDef","isPlaceholder","headerTitle","getContext","t40","headerActions","headerAction","event_4","stopPropagation","event_5","_temp3","_temp4","t41","columnSeparatorResizable","t42","columnSeparatorActive","t43","columnSeparator","t44","t45","event_7","getResizeHandler","t46","t47","_temp5","t48","event_8","event_6","opened","state_0","columnResizing","isResizingColumn","columnOrder","node","type","Divider","Loader","Menu","MenuProps","Text","Cell","flexRender","Row","RowData","Table","useSelector","useVirtualizer","MouseEvent","ReactNode","useCallback","useEffect","useRef","useState","classes","sticky","TMDataGridRowData","useTMDataGridContext","TMDataGridFilterPanel","TMDataGridHeaderCell","getColumnAlign","getDisplayedRows","resolveRowSelectionClick","SearchIcon","SELECT_COLUMN_ID","TMDataGridFeatures","TMDataGridColumnLayout","pinnedAt","offset","isBoundary","UNPINNED_LAYOUT","renderCellContent","cell","getIsPlaceholder","getIsAggregated","column","columnDef","getContext","aggregatedCell","aggregationFn","undefined","TMDataGridBodyCell","t0","$","_c","rowHeight","layout","onContextMenu","t1","t2","id","t3","stickyLeft","t4","stickyRight","t5","bodyCell","filter","Boolean","t6","join","t7","t8","t9","t10","t11","minHeight","left","right","position","zIndex","t12","t13","cellContent","t14","TMDataGridBodyRowGroup","enabled","menuContent","menuProps","onClose","children","Symbol","for","display","rowGroup","opened","TMDataGridRowContextMenuArgs","table","TData","row","close","TMDataGridRowContextMenu","args","TMDataGridTableProps","onRowClick","rowContextMenu","rowContextMenuProps","Omit","TMDataGridTable","ui","features","controlSize","store","highlightedRowId","state","loading","noResultsLabel","options","meta","scrollContainerRef","HTMLDivElement","rows","pagination","pageCount","getPageCount","pageIndex","setPageIndex","virtualizer","count","length","getScrollElement","current","estimateSize","getItemKey","index","overscan","initialRect","height","width","virtualItems","getVirtualItems","paddingTop","start","paddingBottom","getTotalSize","at","end","leftLeafColumns","getLeftVisibleLeafColumns","rightLeafColumns","getRightVisibleLeafColumns","centerLeafColumns","getCenterVisibleLeafColumns","orderedColumns","centerHeaderGroups","getCenterHeaderGroups","leftHeaderGroups","getLeftHeaderGroups","rightHeaderGroups","getRightHeaderGroups","headerGroups","map","group","headers","columnSizing","columnTracks","isFixed","minSize","maxSize","isResized","isPinned","getIsPinned","minWidth","track","getSize","flex","gridTemplateColumns","c","gridMinWidth","reduce","sum","columnLayout","Map","widthOf","columnId","findIndex","leftOffset","set","rightOffset","reverse","layoutFor","get","isEmpty","selectsOnRowClick","rowClickSelects","rowIsInteractive","highlightRow","rowGesturesFor","getIsGrouped","handleRowActivate","modifiers","toggle","extend","getCanSelect","resolved","rowId","anchorRowId","selectionAnchorRowId","selection","rowSelection","canReplaceSelection","setRowSelection","actions","setSelectionAnchor","setHighlightedRow","contextMenuTarget","setContextMenuTarget","closeContextMenu","contextMenuRowRef","contextMenuColumnRef","handleContextMenu","contextMenuRow","find","contextMenuContent","getAllCells","handleScroll","tableWrapper","scrollContainer","grid","headerGroup","groupIndex","headerRow","header","gridColumn","virtualItem","isGroupRow","isInteractive","takesKeyboard","key","depth","getIsSelected","showSelectedBackground","bodyRow","cursor","event","shiftKey","preventDefault","ctrlKey","metaKey","target","currentTarget","getLeftVisibleCells","getCenterVisibleCells","getRightVisibleCells","messageRow","ActionIcon","Popover","Text","Tooltip","useSelector","ReactNode","classes","TMDataGridColumnsPanel","useTMDataGridContext","getGridCapabilities","isFilterActive","BurgerIcon","FilterIcon","openColumnFilter","TMDataGridToolbar","t0","$","_c","children","t1","toolbar","TMDataGridToolbarSpacer","Symbol","for","toolbarSpacer","TMDataGridSummaryCount","table","controlSize","store","undefined","getRowCount","shown","t2","options","meta","totalRowCount","getPreFilteredRowModel","rows","length","total","t3","TMDataGridColumnsButton","ui","features","opened","_temp","canHideAny","actions","toggleColumnsPanel","setColumnsPanelOpen","state","columnsPanelOpen","TMDataGridFilterButton","api","_temp2","columnFilters","_temp3","activeCount","filter","_temp4","canFilterAny","closeFilterPanel","firstFilterable","getAllLeafColumns","find","_temp5","id","openFilterPanel","t4","column","getCanFilter","value","state_0","filterPanelOpen","MantineSize","TMDataGridSize","DEFAULT_TMDATAGRID_SIZE","SIZE_ROW_HEIGHT","Record","xs","sm","md","lg","xl","SIZE_CONTROL_SIZE","RowData","CSSProperties","ReactNode","useMemo","classes","TMDataGridColumnsPanel","TMDataGridContextProvider","TMDataGridFilterPanel","TMDataGridFilterPills","TMDataGridFooter","TMDataGridTable","TMDataGridColumnsButton","TMDataGridFilterButton","TMDataGridSummaryCount","TMDataGridToolbar","TMDataGridToolbarSpacer","DEFAULT_TMDATAGRID_SIZE","SIZE_CONTROL_SIZE","SIZE_ROW_HEIGHT","TMDataGridSize","TMDataGridApi","TMDataGridProps","TData","children","size","className","style","Record","TMDataGridRoot","t0","$","_c","table","ui","features","t1","undefined","rowHeight","options","meta","t2","t3","controlSize","api","t4","root","filter","Boolean","t5","join","t6","t7","TMDataGrid","Object","assign","Toolbar","Spacer","SummaryCount","ColumnsButton","FilterButton","Table","Footer","FilterPanel","FilterPills","ColumnsPanel"],"sources":["../src/tmdatagrid/components/TMDataGrid.module.css","../src/tmdatagrid/components/TMDataGridColumnsPanel.module.css","../src/tmdatagrid/TMDataGridContext.ts","../src/tmdatagrid/core/columnUtils.ts","../src/tmdatagrid/components/TMDataGridGroupColumn.module.css","../src/tmdatagrid/core/grouping.ts","../src/tmdatagrid/components/TMDataGridGroupColumn.tsx","../src/tmdatagrid/components/TMDataGridColumnsPanel.tsx","../src/tmdatagrid/components/TMDataGridFilterPanel.module.css","../src/tmdatagrid/core/filterOperators.ts","../src/tmdatagrid/components/TMDataGridFilterPanel.tsx","../src/tmdatagrid/components/TMDataGridFilterPills.module.css","../src/tmdatagrid/core/persistence.ts","../src/tmdatagrid/core/capabilities.ts","../src/tmdatagrid/core/rowSelection.ts","../src/tmdatagrid/components/TMDataGridSelectColumn.tsx","../src/tmdatagrid/useTMDataGrid.tsx","../src/tmdatagrid/components/TMDataGridFilterPills.tsx","../src/tmdatagrid/components/TMDataGridFooter.module.css","../src/tmdatagrid/components/TMDataGridFooter.tsx","../src/tmdatagrid/components/TMDataGridTable.module.css","../src/tmdatagrid/components/sticky.module.css","../src/tmdatagrid/components/TMDataGridHeaderCell.module.css","../src/tmdatagrid/core/columnOrdering.ts","../src/tmdatagrid/components/TMDataGridHeaderCell.tsx","../src/tmdatagrid/components/TMDataGridTable.tsx","../src/tmdatagrid/components/TMDataGridToolbar.module.css","../src/tmdatagrid/components/TMDataGridToolbar.tsx","../src/tmdatagrid/core/sizes.ts","../src/tmdatagrid/components/TMDataGrid.tsx"],"sourcesContent":["/* The grid root: the size scale every other module reads, and the frame.\n Each component owns its own module; these variables cascade into all of\n them, and the pinned-column boundary shared by header and body cells lives\n in sticky.module.css. */\n\n/* Size scale. Row heights mirror SIZE_ROW_HEIGHT in core/sizes.ts — the\n virtualizer needs the number in JS, so the two have to agree. */\n.root[data-size=\"xs\"] {\n --dg-row-height: 34px;\n --dg-header-height: 32px;\n --dg-font-size: var(--mantine-font-size-xs);\n --dg-padding: 6px;\n}\n\n.root[data-size=\"sm\"] {\n --dg-row-height: 42px;\n --dg-header-height: 38px;\n --dg-font-size: var(--mantine-font-size-sm);\n --dg-padding: 8px;\n}\n\n.root[data-size=\"md\"] {\n --dg-row-height: 52px;\n --dg-header-height: 44px;\n --dg-font-size: var(--mantine-font-size-sm);\n --dg-padding: 10px;\n}\n\n.root[data-size=\"lg\"] {\n --dg-row-height: 62px;\n --dg-header-height: 52px;\n --dg-font-size: var(--mantine-font-size-md);\n --dg-padding: 14px;\n}\n\n.root[data-size=\"xl\"] {\n --dg-row-height: 72px;\n --dg-header-height: 60px;\n --dg-font-size: var(--mantine-font-size-lg);\n --dg-padding: 18px;\n}\n\n.root {\n /* Fallbacks, so the parts still work if rendered outside a sized root. */\n --dg-row-height: 52px;\n --dg-header-height: 44px;\n --dg-font-size: var(--mantine-font-size-sm);\n --dg-padding: 10px;\n /* Background of a selected row, when `showSelectedBackground` is on. Override\n it on the grid:\n <TMDataGrid style={{ \"--dg-row-selected-bg\": \"var(--mantine-color-blue-0)\" }} /> */\n --dg-row-selected-bg: var(--mantine-primary-color-light);\n /* Background of the highlighted row, under a selectionMode that has one.\n Stronger than the selected background by default, since under\n \"checkboxAndHighlight\" the two show up together. */\n --dg-row-highlight-bg: var(--mantine-primary-color-light-hover);\n /* Background of a group row. Transparent by default — the bold label and the\n chevron are enough, and with the tree collapsed every row on screen is a\n group row, so a tint would grey out the whole grid. Set it to give groups a\n band of their own. */\n --dg-row-group-bg: var(--mantine-color-body);\n\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n /* Header text is a stretched flex item, so an inherited `text-align: center`\n from the host page would centre headers away from their cell content. */\n text-align: left;\n border: 1px solid var(--mantine-color-default-border);\n border-radius: var(--mantine-radius-md);\n background-color: var(--mantine-color-body);\n}\n",".columnsPanel {\n width: 280px;\n display: flex;\n flex-direction: column;\n}\n\n.columnsPanelSearch {\n padding: var(--mantine-spacing-sm);\n}\n\n.columnsPanelList {\n display: flex;\n flex-direction: column;\n gap: var(--mantine-spacing-sm);\n padding: 0 var(--mantine-spacing-sm) var(--mantine-spacing-sm);\n}\n\n.columnsPanelFooter {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mantine-spacing-sm);\n padding: var(--mantine-spacing-sm);\n border-top: 1px solid var(--mantine-color-default-border);\n}\n","import { createContext, useContext } from \"react\";\nimport type { TMDataGridSize } from \"./core/sizes\";\nimport type { TMDataGridApi } from \"./useTMDataGrid\";\n\n/**\n * Row shape the chrome components work against. They only ever touch columns,\n * rows and cells generically, so the concrete row type is erased at the context\n * boundary — the same trick Mantine uses for its compound components.\n */\nexport type TMDataGridRowData = Record<string, unknown>;\n\nexport type TMDataGridContextValue = TMDataGridApi<TMDataGridRowData> & {\n size: TMDataGridSize;\n /** Row height in px, already resolved from `size` and `meta.rowHeight`. */\n rowHeight: number;\n /** Mantine control size that pairs with `size`. */\n controlSize: TMDataGridSize;\n};\n\nconst TMDataGridContext = createContext<unknown>(null);\n\nexport const TMDataGridContextProvider = TMDataGridContext.Provider;\n\nexport function useTMDataGridContext(): TMDataGridContextValue {\n const api = useContext(TMDataGridContext);\n if (!api) {\n throw new Error(\n \"TMDataGrid compound components must be rendered inside <TMDataGrid>\",\n );\n }\n return api as TMDataGridContextValue;\n}\n","import type { TMDataGridColumnType } from \"./filterOperators\";\nimport type { TMDataGridColumnMeta } from \"../useTMDataGrid\";\n\n/**\n * Structural shape of the column bits the chrome reads. Kept minimal so these\n * helpers work with any `Column`/`Header` instance without dragging generics\n * through every call site.\n */\ntype ColumnLike = {\n id: string;\n columnDef: { header?: unknown; meta?: TMDataGridColumnMeta };\n /** Set on a leaf that sits inside a header group. */\n parent?: unknown;\n};\n\n/** Menu- and panel-facing column name. */\nexport function getColumnLabel(column: ColumnLike): string {\n const label = column.columnDef.meta?.label;\n if (label) return label;\n const header = column.columnDef.header;\n return typeof header === \"string\" ? header : column.id;\n}\n\nexport function getColumnType(column: ColumnLike): TMDataGridColumnType {\n return column.columnDef.meta?.type ?? \"string\";\n}\n\nexport function getColumnAlign(column: ColumnLike): \"left\" | \"right\" | \"center\" {\n return column.columnDef.meta?.align ?? \"left\";\n}\n\n/**\n * Whether a column may be moved. Ordering is the one column feature TanStack\n * has no column option for, so the switch lives in `meta.enableOrdering`.\n *\n * A leaf inside a header group is never movable: `columnOrder` sequences leaf\n * columns, so moving one out of its group would leave the group header spanning\n * columns that no longer belong to it.\n */\nexport function isColumnReorderable(column: ColumnLike): boolean {\n if (column.columnDef.meta?.enableOrdering === false) return false;\n return column.parent === undefined;\n}\n","/* The tree lane. Fills its cell so the whole indented width is a hit target,\n which is what makes a deeply nested group as easy to click as a top-level\n one. */\n.groupToggle {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n min-width: 0;\n font-size: var(--dg-font-size);\n color: inherit;\n}\n\n.chevron {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n color: var(--mantine-color-dimmed);\n transition: transform 120ms ease;\n}\n\n.chevron[data-expanded=\"true\"] {\n transform: rotate(90deg);\n}\n\n/* One icon rotated rather than two swapped: the turn is what reads as the\n expand, and a swap would jump. */\n@media (prefers-reduced-motion: reduce) {\n .chevron {\n transition: none;\n }\n}\n\n.groupLabel {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-weight: 600;\n}\n\n/* Never squeezed out by a long group value — the count is the part that tells\n you whether the group is worth opening. */\n.groupCount {\n flex: 0 0 auto;\n color: var(--mantine-color-dimmed);\n font-variant-numeric: tabular-nums;\n}\n","import type { Row, RowData } from \"@tanstack/react-table\";\nimport type { TMDataGridFeatures } from \"../useTMDataGrid\";\n\n/**\n * The data rows under a group row, at any depth.\n *\n * Not `row.getLeafRows()`, despite the name: that flattens the whole subtree\n * and keeps the branches, so a group nested two deep reports its sub-groups\n * alongside the records. Grouping `city` then `name` would have Stockholm\n * counting four rows and three names as seven, and one tick on it selecting\n * ids that hold no record.\n *\n * A row with no subRows is a data row, which also makes this the identity on an\n * ungrouped grid.\n */\nexport function getGroupDataRows<TData extends RowData>(\n row: Row<TMDataGridFeatures, TData>,\n): Array<Row<TMDataGridFeatures, TData>> {\n if (row.subRows.length === 0) return [row];\n return row.getLeafRows().filter((leaf) => leaf.subRows.length === 0);\n}\n","import { UnstyledButton } from \"@mantine/core\";\nimport type { ColumnDef, Row, RowData } from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { shallow } from \"@tanstack/store\";\nimport classes from \"./TMDataGridGroupColumn.module.css\";\nimport { ChevronRightIcon } from \"./icons\";\nimport { getColumnLabel } from \"../core/columnUtils\";\nimport { getGroupDataRows } from \"../core/grouping\";\nimport type { TMDataGridFeatures, TMDataGridTable } from \"../useTMDataGrid\";\n\nexport const GROUP_COLUMN_ID = \"__group__\";\n\n/** Indent added per level of nesting, in px. */\nconst INDENT_STEP = 16;\n\n/** Shown for a group whose value is empty — `String(null)` would read as \"null\". */\nconst BLANK_GROUP_LABEL = \"(Blank)\";\n\n/**\n * How a grouping value is written into the tree cell.\n *\n * Deliberately not the grouped column's own `cell` renderer: that renderer is\n * written for a data row and is free to reach into `row.original`, which on a\n * group row is the first leaf's record rather than anything about the group.\n */\nexport function formatGroupValue(value: unknown): string {\n if (value === null || value === undefined || value === \"\") {\n return BLANK_GROUP_LABEL;\n }\n if (value instanceof Date) return value.toLocaleDateString();\n return String(value);\n}\n\n/**\n * The tree cell: chevron, group value and leaf count, indented by depth.\n *\n * Expansion is read through a subscription rather than from `row.getIsExpanded()`\n * in the component body for the same reason the select checkbox does it — the\n * `row` identity survives an expand, so the React Compiler would cache the call\n * along with it and the chevron would never turn. See TMDataGridSelectColumn.\n */\nfunction GroupCell<TData extends RowData>({\n row,\n}: {\n row: Row<TMDataGridFeatures, TData>;\n}) {\n const expanded = useSelector(row.table.store, () => row.getIsExpanded());\n\n // Leaf rows keep the lane empty: their values are in the data columns, and\n // the indent alone is what places them under their group.\n if (!row.getIsGrouped()) return null;\n\n const label = formatGroupValue(row.groupingValue);\n\n return (\n <UnstyledButton\n className={classes.groupToggle}\n // Padding rather than margin, so the whole indented width stays clickable.\n style={{ paddingInlineStart: row.depth * INDENT_STEP }}\n aria-expanded={expanded}\n aria-label={`${expanded ? \"Collapse\" : \"Expand\"} ${label}`}\n // The row underneath may select or highlight on click; expanding is its\n // own gesture and must not also trigger those.\n onClick={(event) => {\n event.stopPropagation();\n row.toggleExpanded();\n }}\n >\n <span className={classes.chevron} data-expanded={expanded}>\n <ChevronRightIcon size={16} stroke={1.6} />\n </span>\n <span className={classes.groupLabel}>{label}</span>\n {/* Data rows, not direct children and not `getLeafRows()`: a nested group\n counts the records under it, never the sub-groups in between. */}\n <span className={classes.groupCount}>\n ({getGroupDataRows(row).length})\n </span>\n </UnstyledButton>\n );\n}\n\n/**\n * Names the columns currently grouped on, so the lane says what it is showing\n * rather than a static \"Group\".\n */\nfunction GroupHeader<TData extends RowData>({\n table,\n}: {\n table: TMDataGridTable<TData>;\n}) {\n const grouping = useSelector(table.store, (state) => state.grouping, {\n compare: shallow,\n });\n\n if (grouping.length === 0) return \"Group\";\n return grouping\n .map((columnId) => {\n const column = table.getColumn(columnId);\n return column ? getColumnLabel(column) : columnId;\n })\n .join(\" / \");\n}\n\n/**\n * The generated tree column, prepended whenever grouping is enabled and hidden\n * again while `grouping` is empty — see the visibility effect in\n * `useTMDataGrid`.\n *\n * It exists because TanStack ships no auto group column: `groupedColumnMode:\n * \"remove\"` takes the grouped column out of the grid, so something has to hold\n * the tree. Modelled on the checkbox column, which is generated the same way.\n *\n * Not groupable itself, and nothing had to be written to make that true —\n * `column.getCanGroup()` requires an `accessorFn`, which a display column has\n * no reason to have.\n */\nexport function createGroupColumn<TData extends RowData>(): ColumnDef<\n TMDataGridFeatures,\n TData,\n unknown\n> {\n return {\n id: GROUP_COLUMN_ID,\n meta: {\n label: \"Group\",\n // Structurally the first column after the checkbox lane.\n enableOrdering: false,\n },\n size: 260,\n minSize: 180,\n enableSorting: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n // Keeps it out of the columns panel and out of the header menu: its\n // visibility is not the user's to set, it follows the grouping state.\n enableHiding: false,\n // Structurally pinned to the left; users shouldn't be able to move it.\n enablePinning: false,\n cell: ({ row }) => <GroupCell row={row} />,\n // A group row has subRows, so every cell on it that is not the grouped\n // column reports `getIsAggregated()` — this lane included. Without an\n // `aggregatedCell` the body would take that as \"nothing to summarise\" and\n // render the tree lane blank on exactly the rows it exists for.\n aggregatedCell: ({ row }) => <GroupCell row={row} />,\n header: ({ table }) => <GroupHeader table={table} />,\n };\n}\n","import { Button, Checkbox, ScrollArea, Text, TextInput } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { useState } from \"react\";\nimport classes from \"./TMDataGridColumnsPanel.module.css\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getColumnLabel } from \"../core/columnUtils\";\nimport { GROUP_COLUMN_ID } from \"./TMDataGridGroupColumn\";\nimport { SearchIcon } from \"./icons\";\n\n/**\n * The \"Manage columns\" surface. Reachable from every column header menu and\n * from the grid's burger menu, so it lives on its own and is rendered by\n * `TMDataGrid.ColumnsButton`.\n */\nexport function TMDataGridColumnsPanel() {\n const { table, controlSize } = useTMDataGridContext();\n const [search, setSearch] = useState(\"\");\n\n const columnVisibility = useSelector(\n table.store,\n (state) => state.columnVisibility,\n );\n\n // The tree column is left out rather than listed and disabled: its visibility\n // is not a setting at all, it follows the grouping state, so an unchecked box\n // that cannot be ticked would only invite the question.\n const columns = table\n .getAllLeafColumns()\n .filter((column) => column.id !== GROUP_COLUMN_ID);\n const needle = search.trim().toLowerCase();\n const visibleInPanel = needle\n ? columns.filter((column) =>\n getColumnLabel(column).toLowerCase().includes(needle),\n )\n : columns;\n\n const hideableColumns = columns.filter((column) => column.getCanHide());\n const shownCount = hideableColumns.filter(\n (column) => columnVisibility[column.id] !== false,\n ).length;\n\n return (\n <div className={classes.columnsPanel}>\n <div className={classes.columnsPanelSearch}>\n <TextInput\n value={search}\n onChange={(event) => setSearch(event.currentTarget.value)}\n placeholder=\"Search\"\n leftSection={<SearchIcon size={16} stroke={1.6} />}\n size={controlSize}\n data-autofocus\n />\n </div>\n\n <ScrollArea.Autosize mah={260} type=\"auto\">\n <div className={classes.columnsPanelList}>\n {visibleInPanel.map((column) => (\n <Checkbox\n key={column.id}\n size={controlSize}\n label={getColumnLabel(column)}\n disabled={!column.getCanHide()}\n checked={columnVisibility[column.id] !== false}\n onChange={(event) =>\n column.toggleVisibility(event.currentTarget.checked)\n }\n />\n ))}\n {visibleInPanel.length === 0 && (\n <Text size={controlSize} c=\"dimmed\">\n No columns match “{search}”\n </Text>\n )}\n </div>\n </ScrollArea.Autosize>\n\n <div className={classes.columnsPanelFooter}>\n <Checkbox\n size={controlSize}\n label=\"Show/Hide All\"\n checked={shownCount === hideableColumns.length}\n indeterminate={shownCount > 0 && shownCount < hideableColumns.length}\n onChange={(event) =>\n table.toggleAllColumnsVisible(event.currentTarget.checked)\n }\n />\n <Button\n variant=\"subtle\"\n size=\"compact-sm\"\n onClick={() => table.resetColumnVisibility()}\n >\n RESET\n </Button>\n </div>\n </div>\n );\n}\n","/* Floats over the first body rows, anchored to `.tableWrapper`. Sits just\n below the header row, so its offset follows the size scale rather than a\n fixed pixel count. */\n.filterPanel {\n position: absolute;\n top: calc(var(--dg-header-height) + 2px);\n left: var(--mantine-spacing-md);\n z-index: 5;\n padding: var(--mantine-spacing-sm);\n border-radius: var(--mantine-radius-md);\n border: 1px solid var(--mantine-color-default-border);\n background-color: var(--mantine-color-body);\n box-shadow: var(--mantine-shadow-md);\n}\n\n.filterRow {\n display: flex;\n align-items: flex-end;\n gap: var(--mantine-spacing-xs);\n}\n\n.filterPanelHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mantine-spacing-md);\n padding-bottom: var(--mantine-spacing-xs);\n}\n\n.filterPanelFooter {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mantine-spacing-md);\n}\n","import type { Row, RowData, TableFeatures } from \"@tanstack/react-table\";\n\n/**\n * The value shape stored in `columnFilters` for every TMDataGrid column.\n *\n * TanStack resolves `filterFn` statically per column, so the operator travels\n * inside the filter *value* instead. That keeps the whole filter model plain,\n * serialisable JSON — which is what makes it portable to a server-side\n * `manualFiltering` table (just forward `columnFilters` to the API).\n */\nexport type TMDataGridFilterValue = {\n operator: TMDataGridFilterOperator;\n value: string;\n};\n\nexport type TMDataGridColumnType = \"string\" | \"number\";\n\nexport type TMDataGridFilterOperator =\n | \"contains\"\n | \"equals\"\n | \"notEquals\"\n | \"startsWith\"\n | \"endsWith\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"isEmpty\"\n | \"isNotEmpty\";\n\nexport const FILTER_OPERATOR_LABELS: Record<TMDataGridFilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n notEquals: \"does not equal\",\n startsWith: \"starts with\",\n endsWith: \"ends with\",\n greaterThan: \"is greater than\",\n greaterThanOrEqual: \"is greater than or equal to\",\n lessThan: \"is less than\",\n lessThanOrEqual: \"is less than or equal to\",\n isEmpty: \"is empty\",\n isNotEmpty: \"is not empty\",\n};\n\nconst STRING_OPERATORS: readonly TMDataGridFilterOperator[] = [\n \"contains\",\n \"equals\",\n \"notEquals\",\n \"startsWith\",\n \"endsWith\",\n \"isEmpty\",\n \"isNotEmpty\",\n];\n\nconst NUMBER_OPERATORS: readonly TMDataGridFilterOperator[] = [\n \"equals\",\n \"notEquals\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"isEmpty\",\n \"isNotEmpty\",\n];\n\n/** Operators that ignore the value input (the input is disabled for these). */\nconst VALUELESS_OPERATORS: readonly TMDataGridFilterOperator[] = [\n \"isEmpty\",\n \"isNotEmpty\",\n];\n\nexport function getOperatorsForType(\n type: TMDataGridColumnType,\n): readonly TMDataGridFilterOperator[] {\n return type === \"number\" ? NUMBER_OPERATORS : STRING_OPERATORS;\n}\n\nexport function getDefaultOperator(\n type: TMDataGridColumnType,\n): TMDataGridFilterOperator {\n return type === \"number\" ? \"equals\" : \"contains\";\n}\n\nexport function operatorNeedsValue(operator: TMDataGridFilterOperator): boolean {\n return !VALUELESS_OPERATORS.includes(operator);\n}\n\nexport function isTMDataGridFilterValue(\n value: unknown,\n): value is TMDataGridFilterValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"operator\" in value &&\n typeof (value as TMDataGridFilterValue).operator === \"string\"\n );\n}\n\n/**\n * A filter only narrows the row set once it has something to compare against.\n * Half-typed filters stay in state (so the panel keeps rendering their row) but\n * are treated as inactive for the funnel indicator and for row matching.\n */\nexport function isFilterActive(value: unknown): boolean {\n if (!isTMDataGridFilterValue(value)) return false;\n return !operatorNeedsValue(value.operator) || value.value.trim() !== \"\";\n}\n\n/**\n * One-line description of a single filter, as shown on a filter pill.\n *\n * The type's default operator is left implicit — \"First name: Sofia\" reads the\n * way a person would say it — while any other operator is spelled out, since\n * that is the part a reader cannot guess.\n */\nexport function formatFilterLabel({\n label,\n type,\n filter,\n}: {\n label: string;\n type: TMDataGridColumnType;\n filter: TMDataGridFilterValue;\n}): string {\n const { operator, value } = filter;\n if (!operatorNeedsValue(operator)) {\n return `${label} ${FILTER_OPERATOR_LABELS[operator]}`;\n }\n const text = value.trim();\n if (operator === getDefaultOperator(type)) return `${label}: ${text}`;\n return `${label} ${FILTER_OPERATOR_LABELS[operator]} ${text}`;\n}\n\nexport function matchesFilter(\n cellValue: unknown,\n { operator, value }: TMDataGridFilterValue,\n): boolean {\n if (operator === \"isEmpty\") {\n return cellValue === null || cellValue === undefined || cellValue === \"\";\n }\n if (operator === \"isNotEmpty\") {\n return cellValue !== null && cellValue !== undefined && cellValue !== \"\";\n }\n\n const filterText = value.trim();\n if (filterText === \"\") return true;\n\n const numericCell = typeof cellValue === \"number\" ? cellValue : Number.NaN;\n const numericFilter = Number(filterText);\n const compareNumeric =\n !Number.isNaN(numericCell) && !Number.isNaN(numericFilter);\n\n switch (operator) {\n case \"greaterThan\":\n return compareNumeric && numericCell > numericFilter;\n case \"greaterThanOrEqual\":\n return compareNumeric && numericCell >= numericFilter;\n case \"lessThan\":\n return compareNumeric && numericCell < numericFilter;\n case \"lessThanOrEqual\":\n return compareNumeric && numericCell <= numericFilter;\n default:\n break;\n }\n\n const cellText = String(cellValue ?? \"\").toLowerCase();\n const needle = filterText.toLowerCase();\n\n switch (operator) {\n case \"contains\":\n return cellText.includes(needle);\n case \"equals\":\n return compareNumeric ? numericCell === numericFilter : cellText === needle;\n case \"notEquals\":\n return compareNumeric ? numericCell !== numericFilter : cellText !== needle;\n case \"startsWith\":\n return cellText.startsWith(needle);\n case \"endsWith\":\n return cellText.endsWith(needle);\n default:\n return true;\n }\n}\n\n/**\n * The single filter function every TMDataGrid column uses. It dispatches on the\n * operator carried by the filter value, which is what lets one column offer\n * \"contains\" / \"does not equal\" / \"is empty\" without redefining the column.\n */\nexport function tmDataGridFilterFn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(row: Row<TFeatures, TData>, columnId: string, filterValue: unknown): boolean {\n if (!isTMDataGridFilterValue(filterValue)) return true;\n return matchesFilter(row.getValue(columnId), filterValue);\n}\n","import { ActionIcon, Button, Select, Stack, Text, TextInput } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { useEffect, useRef } from \"react\";\nimport classes from \"./TMDataGridFilterPanel.module.css\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getColumnLabel, getColumnType } from \"../core/columnUtils\";\nimport {\n type TMDataGridFilterOperator,\n type TMDataGridFilterValue,\n FILTER_OPERATOR_LABELS,\n getDefaultOperator,\n getOperatorsForType,\n isTMDataGridFilterValue,\n operatorNeedsValue,\n} from \"../core/filterOperators\";\nimport { CloseIcon } from \"./icons\";\n\nconst FALLBACK_FILTER: TMDataGridFilterValue = { operator: \"contains\", value: \"\" };\n\nfunction asFilterValue(value: unknown): TMDataGridFilterValue {\n return isTMDataGridFilterValue(value) ? value : FALLBACK_FILTER;\n}\n\n/**\n * The MUI-style filter surface: one row per active column filter, each row a\n * column / operator / value triple. It only ever reads and writes the table's\n * `columnFilters` state, so a `manualFiltering` grid gets the same panel for\n * free — the state is forwarded to the server instead of a row model.\n */\nexport function TMDataGridFilterPanel() {\n const { table, ui, controlSize } = useTMDataGridContext();\n const opened = useSelector(ui, (state) => state.filterPanelOpen);\n const columnFilters = useSelector(\n table.store,\n (state) => state.columnFilters,\n );\n const panelRef = useRef<HTMLDivElement>(null);\n\n // Clicking away hides the panel, the way any floating surface behaves. On\n // pointerdown rather than click, so a press that starts outside dismisses it\n // even when the pointer is released somewhere else.\n useEffect(() => {\n if (!opened) return;\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (panelRef.current?.contains(target)) return;\n // The toolbar button toggles the panel itself. Closing from here first\n // would leave its click reopening what the user meant to close.\n if (target.closest(\"[data-dg-filter-toggle]\")) return;\n ui.actions.closeFilterPanel();\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [opened, ui]);\n\n if (!opened) return null;\n\n const filterableColumns = table\n .getAllLeafColumns()\n .filter((column) => column.getCanFilter());\n\n const columnOptions = filterableColumns.map((column) => ({\n value: column.id,\n label: getColumnLabel(column),\n }));\n\n function removeFilter(columnId: string) {\n const remaining = columnFilters.filter((filter) => filter.id !== columnId);\n table.setColumnFilters(remaining);\n if (remaining.length === 0) ui.actions.closeFilterPanel();\n }\n\n function changeFilterColumn(fromColumnId: string, toColumnId: string) {\n const current = asFilterValue(\n columnFilters.find((filter) => filter.id === fromColumnId)?.value,\n );\n const target = table.getColumn(toColumnId);\n table.setColumnFilters(\n columnFilters\n .filter((filter) => filter.id !== toColumnId)\n .map((filter) =>\n filter.id === fromColumnId\n ? {\n id: toColumnId,\n value: {\n operator: getDefaultOperator(\n target ? getColumnType(target) : \"string\",\n ),\n value: current.value,\n } satisfies TMDataGridFilterValue,\n }\n : filter,\n ),\n );\n ui.actions.openFilterPanel(toColumnId);\n }\n\n function patchFilter(columnId: string, patch: Partial<TMDataGridFilterValue>) {\n table.setColumnFilters(\n columnFilters.map((filter) =>\n filter.id === columnId\n ? { ...filter, value: { ...asFilterValue(filter.value), ...patch } }\n : filter,\n ),\n );\n }\n\n /** Clears every filter, including half-typed ones the pills never showed. */\n function clearAllFilters() {\n table.setColumnFilters([]);\n // Same exit as removing the last filter row by hand: an empty panel has\n // nothing to show but its own buttons.\n ui.actions.closeFilterPanel();\n }\n\n function addFilter() {\n const nextColumn = filterableColumns.find(\n (column) => !columnFilters.some((filter) => filter.id === column.id),\n );\n if (!nextColumn) return;\n table.setColumnFilters([\n ...columnFilters,\n {\n id: nextColumn.id,\n value: {\n operator: getDefaultOperator(getColumnType(nextColumn)),\n value: \"\",\n } satisfies TMDataGridFilterValue,\n },\n ]);\n }\n\n const canAddFilter = filterableColumns.some(\n (column) => !columnFilters.some((filter) => filter.id === column.id),\n );\n\n return (\n <div\n ref={panelRef}\n role=\"group\"\n aria-label=\"Filters\"\n className={classes.filterPanel}\n // Escape is what closes a floating surface, and every control that can\n // hold focus in here sits inside this element.\n onKeyDown={(event) => {\n if (event.key !== \"Escape\") return;\n event.stopPropagation();\n ui.actions.closeFilterPanel();\n }}\n >\n <div className={classes.filterPanelHeader}>\n <Text size={controlSize} fw={600}>\n Filters\n </Text>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"sm\"\n aria-label=\"Close filters\"\n onClick={ui.actions.closeFilterPanel}\n >\n <CloseIcon size={16} stroke={1.6} />\n </ActionIcon>\n </div>\n\n <Stack gap=\"xs\">\n {columnFilters.map((filter) => {\n const column = table.getColumn(filter.id);\n const value = asFilterValue(filter.value);\n const type = column ? getColumnType(column) : \"string\";\n const needsValue = operatorNeedsValue(value.operator);\n\n return (\n <div key={filter.id} className={classes.filterRow}>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"lg\"\n aria-label=\"Remove filter\"\n onClick={() => removeFilter(filter.id)}\n >\n <CloseIcon size={18} stroke={1.6} />\n </ActionIcon>\n\n <Select\n label=\"Column\"\n size={controlSize}\n w={160}\n allowDeselect={false}\n // Both dropdowns render inside the panel: a portalled one is\n // outside it in the DOM, and picking an option would read as a\n // click away and close the panel under the user.\n comboboxProps={{ withinPortal: false }}\n data={columnOptions}\n value={filter.id}\n onChange={(next) => next && changeFilterColumn(filter.id, next)}\n />\n\n <Select\n label=\"Operator\"\n size={controlSize}\n w={170}\n allowDeselect={false}\n comboboxProps={{ withinPortal: false }}\n data={getOperatorsForType(type).map((operator) => ({\n value: operator,\n label: FILTER_OPERATOR_LABELS[operator],\n }))}\n value={value.operator}\n onChange={(next) =>\n next &&\n patchFilter(filter.id, {\n operator: next as TMDataGridFilterOperator,\n })\n }\n />\n\n <TextInput\n label=\"Value\"\n size={controlSize}\n w={180}\n type={type === \"number\" && needsValue ? \"number\" : \"text\"}\n disabled={!needsValue}\n placeholder={needsValue ? \"Filter value\" : \"\"}\n value={needsValue ? value.value : \"\"}\n onChange={(event) =>\n patchFilter(filter.id, { value: event.currentTarget.value })\n }\n />\n </div>\n );\n })}\n\n <div className={classes.filterPanelFooter}>\n <Button\n variant=\"subtle\"\n size=\"compact-sm\"\n disabled={!canAddFilter}\n onClick={addFilter}\n >\n Add filter\n </Button>\n <Button\n variant=\"subtle\"\n color=\"gray\"\n size=\"compact-sm\"\n disabled={columnFilters.length === 0}\n onClick={clearAllFilters}\n >\n Clear all\n </Button>\n </div>\n </Stack>\n </div>\n );\n}\n","/* Wraps rather than scrolls: the pills are a summary, and a summary that goes\n off-screen is not one. */\n.filterPills {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--mantine-spacing-xs);\n}\n\n/* Mantine's dark-scheme pill is `dark-7` — the same colour as the body — so a\n pill sitting on the page rather than inside a `PillsInput` disappears. Both\n schemes are restated here so the two stay a pair, with a border to keep the\n shape readable against any surface. Scoped through `.filterPills` for the\n specificity to beat Mantine's own rule whichever stylesheet loads last. */\n.filterPills .pill {\n background-color: light-dark(\n var(--mantine-color-gray-1),\n var(--mantine-color-dark-5)\n );\n color: light-dark(var(--mantine-color-black), var(--mantine-color-dark-0));\n border: 1px solid\n light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-3));\n}\n\n/* The label is a button so a pill can be clicked back open, but it must read as\n part of the pill — Mantine's own label styles carry the font. */\n.pillLabel {\n font: inherit;\n color: inherit;\n cursor: pointer;\n}\n\n.pillLabel:hover {\n text-decoration: underline;\n}\n","import type { TableState } from \"@tanstack/react-table\";\nimport type { TMDataGridFeatures } from \"../useTMDataGrid\";\n\ntype GridState = TableState<TMDataGridFeatures>;\n\n/**\n * Persistence deliberately does not use Mantine's `useLocalStorage`.\n *\n * That hook owns a piece of state and returns `[value, setValue]`. Here the\n * table already owns the state and storage only mirrors it, so routing writes\n * through the hook would keep a second copy and trigger a React state update on\n * every change, including every pointer move during a column resize. Its\n * defaults also work against this use: `getInitialValueInEffect: true` delivers\n * the stored value after mount, while `initialState` is only read on the first\n * render, and `sync: true` would let two open tabs overwrite each other's\n * column layout.\n *\n * The option vocabulary follows Mantine's: `StorageType` is its type, and\n * `serialize` / `deserialize` behave as they do in `UseStorageOptions`.\n */\n\n/**\n * State slices describing what the user is looking at. Derived from the data,\n * so they can go stale as it changes.\n */\nexport const DATA_STATE_SLICES = [\n \"columnFilters\",\n \"globalFilter\",\n \"sorting\",\n \"pagination\",\n // Which groups are open. Keyed by group ids built from the values themselves\n // (`department:Design`), so a restored entry for a group the data no longer\n // produces is simply never looked up.\n \"expanded\",\n] as const satisfies ReadonlyArray<keyof GridState>;\n\n/**\n * State slices describing how the user configured the grid. Independent of the\n * data, and the ones users notice losing.\n */\nexport const SETTINGS_STATE_SLICES = [\n \"columnVisibility\",\n \"columnSizing\",\n \"columnOrder\",\n \"columnPinning\",\n // Which columns the rows are grouped by. A settings slice rather than a data\n // one: it names columns, not values, so it survives the data changing under\n // it the way the column layout does.\n \"grouping\",\n] as const satisfies ReadonlyArray<keyof GridState>;\n\nexport type TMDataGridDataSlice = (typeof DATA_STATE_SLICES)[number];\nexport type TMDataGridSettingsSlice = (typeof SETTINGS_STATE_SLICES)[number];\n\n/**\n * A storage key, optionally narrowed to a subset of its group's slices.\n *\n * - `\"employees.data\"` — persists every slice in the group.\n * - `[\"employees.data\", [\"sorting\"]]` — persists only the listed slices.\n */\nexport type TMDataGridPersistKey<TSlice extends string> =\n | string\n | readonly [key: string, slices: readonly TSlice[]];\n\n/** Same values as Mantine's `StorageType`, which the package does not re-export. */\nexport type TMDataGridStorageMode = \"localStorage\" | \"sessionStorage\";\n\nexport type TMDataGridPersistence = {\n /** Key for filters, global filter, sorting and pagination. */\n dataKey?: TMDataGridPersistKey<TMDataGridDataSlice>;\n /** Key for column visibility, sizing, order and pinning. */\n settingsKey?: TMDataGridPersistKey<TMDataGridSettingsSlice>;\n /** Which storage area to use. Defaults to `\"localStorage\"`. */\n storageMode?: TMDataGridStorageMode;\n /** Serializes a payload before it is stored. Defaults to `JSON.stringify`. */\n serialize?: (value: Partial<GridState>) => string;\n /** Parses a stored payload. Defaults to `JSON.parse`. */\n deserialize?: (value: string) => unknown;\n};\n\ntype ResolvedKey = { key: string; slices: ReadonlyArray<keyof GridState> };\n\nfunction resolveKey<TSlice extends string>(\n entry: TMDataGridPersistKey<TSlice> | undefined,\n defaultSlices: ReadonlyArray<keyof GridState>,\n): ResolvedKey | null {\n if (!entry) return null;\n if (typeof entry === \"string\") return { key: entry, slices: defaultSlices };\n\n const [key, slices] = entry;\n if (!key) return null;\n // An empty list means nothing was selected, which is not the same as \"all\".\n return { key, slices: slices as ReadonlyArray<keyof GridState> };\n}\n\nfunction resolveStorage(\n persistence: TMDataGridPersistence | undefined,\n): Storage | null {\n if (!persistence) return null;\n // Absent under SSR, and access throws outright in some privacy modes.\n try {\n if (typeof window === \"undefined\") return null;\n return persistence.storageMode === \"sessionStorage\"\n ? window.sessionStorage\n : window.localStorage;\n } catch {\n return null;\n }\n}\n\n/**\n * Shape guards for restored state.\n *\n * A stored payload outlives the code that wrote it: a slice can change shape\n * between releases, and nothing stops anyone from editing storage by hand. The\n * value goes straight into `initialState`, where a wrong shape surfaces as a\n * crash inside TanStack rather than as a bad read here. A slice that fails its\n * guard is dropped; the rest still restore.\n */\nfunction prop(value: unknown, key: string): unknown {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\n\nconst isFiniteNumber = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nfunction isArrayOf(\n value: unknown,\n isItem: (item: unknown) => boolean,\n): boolean {\n return Array.isArray(value) && value.every(isItem);\n}\n\nfunction isRecordOf(\n value: unknown,\n isItem: (item: unknown) => boolean,\n): boolean {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n return Object.values(value).every(isItem);\n}\n\nconst hasStringId = (entry: unknown): boolean => isString(prop(entry, \"id\"));\n\nconst SLICE_GUARDS: Record<\n TMDataGridDataSlice | TMDataGridSettingsSlice,\n (value: unknown) => boolean\n> = {\n columnFilters: (value) => isArrayOf(value, hasStringId),\n // TanStack leaves the global filter value untyped — the grid's own default\n // filters on a string, but a consumer may store anything here.\n globalFilter: () => true,\n sorting: (value) =>\n isArrayOf(\n value,\n (entry) => hasStringId(entry) && typeof prop(entry, \"desc\") === \"boolean\",\n ),\n pagination: (value) => {\n const pageIndex = prop(value, \"pageIndex\");\n const pageSize = prop(value, \"pageSize\");\n return (\n isFiniteNumber(pageIndex) &&\n pageIndex >= 0 &&\n isFiniteNumber(pageSize) &&\n pageSize > 0\n );\n },\n // `true` is a legal ExpandedState of its own, meaning every row is open.\n expanded: (value) =>\n value === true || isRecordOf(value, (entry) => typeof entry === \"boolean\"),\n columnVisibility: (value) =>\n isRecordOf(value, (entry) => typeof entry === \"boolean\"),\n columnSizing: (value) => isRecordOf(value, isFiniteNumber),\n columnOrder: (value) => isArrayOf(value, isString),\n columnPinning: (value) =>\n isArrayOf(prop(value, \"left\"), isString) &&\n isArrayOf(prop(value, \"right\"), isString),\n grouping: (value) => isArrayOf(value, isString),\n};\n\nfunction isValidSlice(slice: keyof GridState, value: unknown): boolean {\n const guard = SLICE_GUARDS[slice as keyof typeof SLICE_GUARDS];\n return guard === undefined || guard(value);\n}\n\nfunction readSlices(\n storage: Storage | null,\n resolved: ResolvedKey | null,\n deserialize: (value: string) => unknown,\n): Partial<GridState> {\n if (!storage || !resolved) return {};\n try {\n const raw = storage.getItem(resolved.key);\n if (!raw) return {};\n const parsed = deserialize(raw);\n if (typeof parsed !== \"object\" || parsed === null) return {};\n\n const record = parsed as Record<string, unknown>;\n const restored: Record<string, unknown> = {};\n // Only copy the selected slices. A payload written before the selection was\n // narrowed cannot reintroduce slices the caller has since opted out of.\n for (const slice of resolved.slices) {\n if (!(slice in record)) continue;\n if (!isValidSlice(slice, record[slice])) continue;\n restored[slice] = record[slice];\n }\n return restored as Partial<GridState>;\n } catch {\n return {};\n }\n}\n\nfunction writeSlices(\n storage: Storage | null,\n resolved: ResolvedKey | null,\n state: GridState,\n serialize: (value: Partial<GridState>) => string,\n): void {\n if (!storage || !resolved) return;\n const payload: Record<string, unknown> = {};\n for (const slice of resolved.slices) payload[slice] = state[slice];\n try {\n storage.setItem(resolved.key, serialize(payload as Partial<GridState>));\n } catch {\n // Quota exceeded or storage disabled. Persistence is best effort.\n }\n}\n\nfunction resolveKeys(persistence: TMDataGridPersistence | undefined) {\n return {\n data: resolveKey(persistence?.dataKey, DATA_STATE_SLICES),\n settings: resolveKey(persistence?.settingsKey, SETTINGS_STATE_SLICES),\n };\n}\n\n/** True when at least one key is configured. */\nexport function hasPersistenceKeys(\n persistence: TMDataGridPersistence | undefined,\n): boolean {\n const { data, settings } = resolveKeys(persistence);\n return data !== null || settings !== null;\n}\n\nconst defaultDeserialize = (value: string): unknown => JSON.parse(value);\nconst defaultSerialize = (value: Partial<GridState>): string =>\n JSON.stringify(value);\n\n/** State to merge into `initialState`, read once on mount. */\nexport function readPersistedState(\n persistence?: TMDataGridPersistence,\n): Partial<GridState> {\n const storage = resolveStorage(persistence);\n const { data, settings } = resolveKeys(persistence);\n const deserialize = persistence?.deserialize ?? defaultDeserialize;\n return {\n ...readSlices(storage, settings, deserialize),\n ...readSlices(storage, data, deserialize),\n };\n}\n\n/** Writes both payloads. Called on every table state change. */\nexport function writePersistedState(\n state: GridState,\n persistence?: TMDataGridPersistence,\n): void {\n const storage = resolveStorage(persistence);\n if (!storage) return;\n const { data, settings } = resolveKeys(persistence);\n const serialize = persistence?.serialize ?? defaultSerialize;\n writeSlices(storage, data, state, serialize);\n writeSlices(storage, settings, state, serialize);\n}\n","import type { Column, RowData } from \"@tanstack/react-table\";\nimport type { TMDataGridRowData } from \"../TMDataGridContext\";\nimport { isColumnReorderable } from \"./columnUtils\";\nimport type {\n TMDataGridFeatures,\n TMDataGridTable,\n UseTMDataGridOptions,\n} from \"../useTMDataGrid\";\n\n/**\n * Table-level feature switches, read straight off the options object.\n *\n * Why not just call `column.getCanSort()` everywhere? Because that is a method\n * call on a `column` whose identity survives an options change, so the React\n * Compiler caches the result and the chrome keeps rendering for a feature that\n * was switched off. Reading the options into a fresh object each render gives\n * every derived value something that actually changes to invalidate on.\n *\n * TanStack still decides: these flags are combined with `getCanX()`, which is\n * what applies the per-column overrides.\n */\n/**\n * How rows are selected — see `selectionMode` on {@link UseTMDataGridOptions}.\n *\n * One axis, because the two things a config could set independently — which\n * chrome selects, and what a bare row click does — cannot both be free: a click\n * can either toggle a multi-selection or move the highlight, never both. Folding\n * them into one value makes that conflict unrepresentable rather than something\n * to warn about.\n */\nexport type TMDataGridSelectionMode =\n /** Checkbox column, multi-select. Clicking a row elsewhere does nothing. */\n | \"checkbox\"\n /** No checkbox column; row click multi-selects, with Ctrl/Shift modifiers. */\n | \"row\"\n /** Checkbox column multi-selects, and a row click highlights one row. */\n | \"checkboxAndHighlight\"\n /** No selection at all — a row click only highlights. Master-detail. */\n | \"highlight\";\n\nexport type TMDataGridFeatureFlags = {\n sorting: boolean;\n filtering: boolean;\n hiding: boolean;\n pinning: boolean;\n resizing: boolean;\n ordering: boolean;\n /** Whether any row selection is possible. Off outright under `\"highlight\"`. */\n rowSelection: boolean;\n /** Defaults to `\"checkbox\"`. */\n selectionMode: TMDataGridSelectionMode;\n /** Whether the generated checkbox column is prepended. */\n selectColumn: boolean;\n /** Whether a bare row click toggles the selection. Only under `\"row\"`. */\n rowClickSelects: boolean;\n /**\n * Whether more than one row can be selected at once — TanStack's\n * `enableMultiRowSelection`. Off, the grid drops the select-all header\n * checkbox: TanStack's `toggleAllRowsSelected` only consults `getCanSelect`,\n * so that control would select every row and walk straight past the limit.\n *\n * A per-row predicate counts as on, since some rows may still multi-select.\n */\n multiRowSelection: boolean;\n /** Whether a selected row takes the highlight colour. Follows the mode. */\n showSelectedBackground: boolean;\n /**\n * The single highlighted row — clicking a row highlights it, for a detail\n * panel to follow. State of its own, not a slice of `rowSelection`, which is\n * what lets it coexist with a checkbox multi-selection.\n */\n highlightRow: boolean;\n /**\n * The one default-off flag: pagination must be asked for, either with the\n * grid's `enablePagination` or implicitly by declaring `manualPagination`.\n * Off, the grid renders every filtered row and relies on virtualization.\n */\n pagination: boolean;\n /**\n * Row grouping: the \"Group by\" items in the header menu and the generated\n * tree column. On unless `enableGrouping: false`, since an ungrouped grid\n * looks and behaves exactly as it did before — `grouping` starts empty, and\n * an empty grouping state passes straight through the row model.\n *\n * The exception is `manualPagination`, where the client holds one page rather\n * than the whole set: grouping that page would build groups out of an\n * arbitrary slice and quietly show wrong counts. A server-side grid that does\n * its own grouping can still say `enableGrouping: true` to override.\n */\n grouping: boolean;\n};\n\nexport function readFeatureFlags<TData extends RowData>(\n options: Pick<\n UseTMDataGridOptions<TData>,\n | \"enableSorting\"\n | \"enableColumnFilters\"\n | \"enableHiding\"\n | \"enableColumnPinning\"\n | \"enableColumnResizing\"\n | \"enableColumnOrdering\"\n | \"enableRowSelection\"\n | \"enableMultiRowSelection\"\n | \"selectionMode\"\n | \"showSelectedBackground\"\n | \"enablePagination\"\n | \"manualPagination\"\n | \"enableGrouping\"\n >,\n): TMDataGridFeatureFlags {\n const selectionMode = options.selectionMode ?? \"checkbox\";\n // `\"highlight\"` is the master-detail mode: no selection to speak of, so the\n // checkbox column and the click-to-select behaviour both fall away. Otherwise\n // `enableRowSelection` still has the final say, including its predicate form.\n const rowSelection =\n selectionMode !== \"highlight\" && options.enableRowSelection !== false;\n\n return {\n sorting: options.enableSorting !== false,\n filtering: options.enableColumnFilters !== false,\n hiding: options.enableHiding !== false,\n pinning: options.enableColumnPinning !== false,\n resizing: options.enableColumnResizing !== false,\n ordering: options.enableColumnOrdering !== false,\n rowSelection,\n selectionMode,\n selectColumn:\n rowSelection &&\n (selectionMode === \"checkbox\" || selectionMode === \"checkboxAndHighlight\"),\n rowClickSelects: rowSelection && selectionMode === \"row\",\n multiRowSelection: options.enableMultiRowSelection !== false,\n // In \"row\" mode the highlight *is* the feedback for a click, so it is on.\n // With checkboxes the box already says it, so it is off unless asked for.\n showSelectedBackground:\n options.showSelectedBackground ?? selectionMode === \"row\",\n highlightRow:\n selectionMode === \"checkboxAndHighlight\" || selectionMode === \"highlight\",\n pagination:\n options.enablePagination === true || options.manualPagination === true,\n grouping: options.enableGrouping ?? options.manualPagination !== true,\n };\n}\n\n/**\n * What one column's header may offer.\n *\n * | Affordance | Turned off by |\n * | ---------- | ------------- |\n * | Sort arrow, Sort ASC/DESC | `enableSorting` (table or column) |\n * | Filter item, panel entry | `enableColumnFilters` / `enableColumnFilter` |\n * | Hide column | `enableHiding` (table or column) |\n * | Pin to left / right | `enableColumnPinning` / `enablePinning` |\n * | Resize dragging | `enableColumnResizing` / `enableResizing` |\n * | Header dragging, Move left / right | `enableColumnOrdering` / `meta.enableOrdering` |\n * | Group by / Ungroup | `enableGrouping` (table or column) |\n */\nexport type TMDataGridColumnCapabilities = {\n canSort: boolean;\n canFilter: boolean;\n canHide: boolean;\n canPin: boolean;\n canResize: boolean;\n canReorder: boolean;\n canGroup: boolean;\n};\n\nexport function getColumnCapabilities(\n column: Column<TMDataGridFeatures, TMDataGridRowData, unknown>,\n features: TMDataGridFeatureFlags,\n): TMDataGridColumnCapabilities {\n return {\n canSort: features.sorting && column.getCanSort(),\n canFilter: features.filtering && column.getCanFilter(),\n canHide: features.hiding && column.getCanHide(),\n canPin: features.pinning && column.getCanPin(),\n canResize: features.resizing && column.getCanResize(),\n // Ordering has no TanStack capability method — see isColumnReorderable.\n canReorder: features.ordering && isColumnReorderable(column),\n // `getCanGroup()` also insists on an accessor, which is what keeps the\n // generated checkbox and tree columns from offering to group on themselves.\n canGroup: features.grouping && column.getCanGroup(),\n };\n}\n\n/** The same questions, asked of the whole grid — used to hide toolbar buttons. */\nexport type TMDataGridCapabilities = {\n canSortAny: boolean;\n canFilterAny: boolean;\n canHideAny: boolean;\n canPinAny: boolean;\n canReorderAny: boolean;\n canGroupAny: boolean;\n canSelectRows: boolean;\n canPaginate: boolean;\n};\n\nexport function getGridCapabilities(\n table: TMDataGridTable<TMDataGridRowData>,\n features: TMDataGridFeatureFlags,\n): TMDataGridCapabilities {\n const columns = table.getAllLeafColumns();\n const any = (predicate: (capabilities: TMDataGridColumnCapabilities) => boolean) =>\n columns.some((column) => predicate(getColumnCapabilities(column, features)));\n\n return {\n canSortAny: any((c) => c.canSort),\n canFilterAny: any((c) => c.canFilter),\n canHideAny: any((c) => c.canHide),\n canPinAny: any((c) => c.canPin),\n canReorderAny: any((c) => c.canReorder),\n canGroupAny: any((c) => c.canGroup),\n canSelectRows: features.rowSelection,\n canPaginate: features.pagination,\n };\n}\n","import type { Row, RowData, RowSelectionState } from \"@tanstack/react-table\";\nimport type { TMDataGridFeatureFlags } from \"./capabilities\";\nimport { getGroupDataRows } from \"./grouping\";\nimport type { TMDataGridFeatures, TMDataGridTable } from \"../useTMDataGrid\";\n\n/**\n * Rows in the order they are displayed, which is the order a shift-click range\n * is measured over — so a range follows the active sort and skips filtered-out\n * rows. Under pagination it is the current page, so a range cannot cross a page\n * boundary.\n *\n * Once a column is grouped this includes the group rows, and only the leaves of\n * groups that are open — and paging is suspended, so it is the whole tree. That\n * is the right list for a range: it is what the user can see, and a range that\n * swept collapsed rows would select things off screen. What a group row in the\n * range contributes is decided by {@link getSelectableRowIds}.\n */\nexport function getDisplayedRows<TData extends RowData>(\n table: TMDataGridTable<TData>,\n features: TMDataGridFeatureFlags,\n): Array<Row<TMDataGridFeatures, TData>> {\n return isPagingActive(table, features)\n ? table.getPaginatedRowModel().rows\n : table.getPrePaginatedRowModel().rows;\n}\n\n/**\n * Whether the built-in pager is actually slicing anything.\n *\n * Grouping suspends it. A page can only count one kind of thing, and once the\n * rows are a tree neither answer works: counting every row splits a group\n * across a page boundary and strands the rest of the tree on pages the user has\n * to go looking for, and counting only the top-level rows quietly redefines\n * \"rows per page\" as groups per page, so a page of 25 can hold thousands of\n * rows. Rather than pick, the grid renders the whole tree and leans on the\n * virtualizer — which is its default mode anyway, pagination being opt-in.\n *\n * `TMDataGrid.Footer` reads this too, and greys the pager out rather than\n * hiding it, so the pager going quiet is visible instead of mysterious.\n */\nexport function isPagingActive<TData extends RowData>(\n table: TMDataGridTable<TData>,\n features: TMDataGridFeatureFlags,\n): boolean {\n return features.pagination && table.store.state.grouping.length === 0;\n}\n\n/**\n * Which modifiers were held. Named for what they mean rather than for the keys,\n * because the keys differ per platform — `toggle` is Ctrl on Windows/Linux and\n * Cmd on macOS.\n */\nexport type TMDataGridRowClickModifiers = {\n toggle: boolean;\n extend: boolean;\n};\n\nexport type ResolveRowSelectionClickArgs<TData extends RowData> = {\n /** Displayed order — see {@link getDisplayedRows}. */\n rows: ReadonlyArray<Row<TMDataGridFeatures, TData>>;\n rowId: string;\n /** The pivot a shift-click extends from. */\n anchorRowId: string | null;\n modifiers: TMDataGridRowClickModifiers;\n selection: RowSelectionState;\n /**\n * Whether this gesture is allowed to clear rows it did not touch.\n *\n * `true` for a bare row click, where replacing is the whole point. `false` for\n * a checkbox, which is only ever additive — ticking one box has never cleared\n * the others, and shift-clicking one adds the range rather than becoming it.\n */\n canReplaceSelection: boolean;\n};\n\nexport type ResolvedRowSelection = {\n selection: RowSelectionState;\n anchorRowId: string | null;\n};\n\n/**\n * The row ids one gesture on this row selects.\n *\n * A group row is never selected itself: it holds no record, and TanStack\n * derives its checked state from its descendants. So ticking a group means\n * ticking every selectable leaf under it, which is also what makes the group's\n * own box light up.\n *\n * Leaves rather than direct children, so one click on a top-level group takes\n * the whole subtree however deeply it nests.\n */\nexport function getSelectableRowIds<TData extends RowData>(\n row: Row<TMDataGridFeatures, TData>,\n): Array<string> {\n return getGroupDataRows(row)\n .filter((dataRow) => dataRow.getCanSelect())\n .map((dataRow) => dataRow.id);\n}\n\n/**\n * Turns one click into the next selection, following the convention every\n * desktop list uses:\n *\n * | Gesture | Effect |\n * | ------- | ------ |\n * | Click | selection becomes only this row |\n * | Ctrl/Cmd + click | toggle this row, leave the rest |\n * | Shift + click | selection becomes the range anchor → this row |\n * | Ctrl/Cmd + Shift + click | add that range to the selection |\n *\n * The anchor is a *pivot*, not \"the last row touched\": only a plain or\n * Ctrl-click moves it, which is what lets a run of shift-clicks grow and shrink\n * the same range from a fixed point.\n *\n * Selection state is rebuilt here and handed to `setRowSelection` wholesale\n * rather than going through `row.toggleSelected()` per row, which would publish\n * one state update each. That skips TanStack's sub-row cascade, so the cascade\n * is done here instead: every row in the gesture is expanded through\n * {@link getSelectableRowIds} before it reaches the map. Under grouping that is\n * what makes one tick on a group select all of it.\n */\nexport function resolveRowSelectionClick<TData extends RowData>({\n rows,\n rowId,\n anchorRowId,\n modifiers,\n selection,\n canReplaceSelection,\n}: ResolveRowSelectionClickArgs<TData>): ResolvedRowSelection {\n const index = rows.findIndex((row) => row.id === rowId);\n const clickedRow = rows[index];\n // Clicked row is not in the displayed set — nothing sensible to resolve.\n if (index === -1 || clickedRow === undefined) return { selection, anchorRowId };\n\n const targets = getSelectableRowIds(clickedRow);\n // Nothing selectable under this gesture: a row the predicate refuses, or a\n // group whose every leaf refuses.\n if (targets.length === 0) return { selection, anchorRowId };\n\n // `enableMultiRowSelection: false`, or the per-row predicate saying no: one\n // row at a time, so the modifiers have nothing to build on and every gesture\n // collapses to a single id.\n //\n // This has to be enforced here. Rebuilding the map and handing it to\n // `setRowSelection` skips `mutateRowIsSelected`, which is where TanStack\n // clears the other rows — so without this, Ctrl and Shift would quietly\n // produce the multi-selection the option ruled out.\n if (!clickedRow.getCanMultiSelect()) {\n // A group stands for several rows, which single-select cannot express. The\n // checkbox column drops the box on those rows for the same reason.\n const only = targets.length === 1 ? targets[0] : undefined;\n if (only === undefined) return { selection, anchorRowId };\n // A checkbox must still be able to untick the one selected row; a row click\n // only ever sets, so re-clicking it cannot empty the selection.\n const untick = !canReplaceSelection && selection[only] === true;\n return {\n selection: untick ? {} : { [only]: true },\n anchorRowId: rowId,\n };\n }\n\n const anchorIndex =\n anchorRowId === null\n ? -1\n : rows.findIndex((row) => row.id === anchorRowId);\n\n // A range needs a pivot that is still on screen. When the anchor has been\n // filtered or paged away, fall through and treat this as a fresh click.\n if (modifiers.extend && anchorIndex !== -1) {\n const from = Math.min(anchorIndex, index);\n const to = Math.max(anchorIndex, index);\n // Ctrl+Shift adds to what is already selected; Shift alone becomes the\n // range — unless the gesture may not replace, in which case it also adds.\n const next: RowSelectionState =\n modifiers.toggle || !canReplaceSelection ? { ...selection } : {};\n for (const row of rows.slice(from, to + 1)) {\n // A group row inside the range brings its whole subtree, including leaves\n // that are collapsed out of `rows` — sweeping past a closed group selects\n // it entire, which is the only reading that matches what it displays.\n for (const id of getSelectableRowIds(row)) next[id] = true;\n }\n // The pivot deliberately stays put.\n return { selection: next, anchorRowId };\n }\n\n if (modifiers.toggle || !canReplaceSelection) {\n const next: RowSelectionState = { ...selection };\n // Asked of the targets rather than of `rowId`: a group row carries no id in\n // the map, so it counts as selected exactly when all of its leaves do —\n // which is also when its checkbox shows a tick rather than a dash.\n const allSelected = targets.every((id) => selection[id] === true);\n for (const id of targets) {\n if (allSelected) delete next[id];\n else next[id] = true;\n }\n return { selection: next, anchorRowId: rowId };\n }\n\n const next: RowSelectionState = {};\n for (const id of targets) next[id] = true;\n return { selection: next, anchorRowId: rowId };\n}\n","import { Checkbox } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport type { ColumnDef, Row, RowData } from \"@tanstack/react-table\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport {\n getDisplayedRows,\n getSelectableRowIds,\n resolveRowSelectionClick,\n} from \"../core/rowSelection\";\nimport type { TMDataGridFeatures, TMDataGridTable } from \"../useTMDataGrid\";\n\nexport const SELECT_COLUMN_ID = \"__select__\";\n\n/**\n * Both checkboxes subscribe to the table store themselves rather than reading\n * the selection off the render they were handed.\n *\n * A cell is rendered by `flexRender`, which mounts the cell function as its own\n * component — but the body cell above it keeps the same props across a\n * selection change (row, column and layout identities all survive it), so the\n * React Compiler reuses the memoized element and the subtree never re-renders.\n * The row highlight would update, from state `TMDataGridTable` subscribes to,\n * while the box below it stayed unchecked.\n *\n * Selection is derived inside the selector, not from a method call in the\n * component body, for the same reason: `table` and `row` identities survive the\n * change, so a call in the body would be cached along with them.\n */\nfunction SelectAllCheckbox<TData extends RowData>({\n table,\n}: {\n table: TMDataGridTable<TData>;\n}) {\n const allSelected = useSelector(table.store, () =>\n table.getIsAllRowsSelected(),\n );\n const someSelected = useSelector(table.store, () =>\n table.getIsSomeRowsSelected(),\n );\n\n return (\n <Checkbox\n size=\"xs\"\n aria-label=\"Select all rows\"\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={table.getToggleAllRowsSelectedHandler()}\n />\n );\n}\n\n/**\n * Drops the select-all box when only one row may be selected. Read from the\n * feature flags rather than `table.options.enableMultiRowSelection` directly:\n * the flags are re-derived from a fresh object every render, so the switch\n * cannot be cached along with a `table` identity that survives an options\n * change — the same reason the rest of the chrome reads them. See\n * readFeatureFlags.\n */\nfunction SelectAllHeader<TData extends RowData>({\n table,\n}: {\n table: TMDataGridTable<TData>;\n}) {\n const { features } = useTMDataGridContext();\n if (!features.multiRowSelection) return null;\n return <SelectAllCheckbox table={table} />;\n}\n\nfunction SelectRowCheckbox<TData extends RowData>({\n row,\n}: {\n row: Row<TMDataGridFeatures, TData>;\n}) {\n // Cells render inside the grid's provider, so the checkbox can reach the\n // chrome store — it needs the shift-click pivot, and the feature flags to know\n // which row model a range is measured over.\n const { ui, features } = useTMDataGridContext();\n const isGroupRow = row.subRows.length > 0;\n\n // A group row is never selected by id: `rowSelection` only ever holds the\n // leaves, and TanStack's `getIsSelected()` is a plain lookup in that map. So\n // a group asks about its descendants instead, which is also the honest\n // reading — the box means \"all of these\", and it goes indeterminate as soon\n // as that stops being true.\n const selected = useSelector(row.table.store, () =>\n isGroupRow ? row.getIsAllSubRowsSelected() : row.getIsSelected(),\n );\n const someSelected = useSelector(row.table.store, () =>\n row.getIsSomeSelected(),\n );\n\n // The resolver expands a tick back out to the descendant ids; all the group\n // case needs here is to know whether any of them may be selected at all.\n const selectableIds = getSelectableRowIds(row);\n\n // Single-select has no way to express \"this group\": one box for several rows\n // would either overrun the limit or lie about what it did.\n if (isGroupRow && !row.getCanMultiSelect()) return null;\n\n return (\n <Checkbox\n size=\"xs\"\n aria-label={isGroupRow ? \"Select group\" : \"Select row\"}\n checked={selected}\n disabled={selectableIds.length === 0}\n indeterminate={someSelected && !selected}\n // Every tick goes through the resolver, shift held or not — plain becomes\n // a toggle that moves the pivot, so a later shift-click extends from the\n // box the user last touched.\n //\n // All of it in `onChange`, not split with an `onClick`: React derives a\n // checkbox's change event from the click, so the modifier keys ride along\n // on the native event, and a `preventDefault()` in a click handler cannot\n // stop the change from firing anyway. Trying to do the range in `onClick`\n // silently loses the clicked row, which `onChange` then toggles back off.\n onChange={(event) => {\n const native = event.nativeEvent;\n const isMouse = native instanceof MouseEvent;\n const resolved = resolveRowSelectionClick({\n rows: getDisplayedRows(row.table, features),\n rowId: row.id,\n anchorRowId: ui.state.selectionAnchorRowId,\n modifiers: {\n toggle: isMouse && (native.ctrlKey || native.metaKey),\n extend: isMouse && native.shiftKey,\n },\n selection: row.table.store.state.rowSelection,\n // A checkbox is only ever additive — ticking one has never cleared\n // the others, so `canReplaceSelection` stays false whatever is held.\n canReplaceSelection: false,\n });\n row.table.setRowSelection(resolved.selection);\n ui.actions.setSelectionAnchor(resolved.anchorRowId);\n }}\n // A row can select on click too; the checkbox must not toggle twice.\n onClick={(event) => event.stopPropagation()}\n />\n );\n}\n\n/**\n * The generated checkbox column, prepended under\n * `selectionMode: \"checkbox\"` (the default) or `\"checkboxAndHighlight\"`.\n */\nexport function createSelectColumn<TData extends RowData>(): ColumnDef<\n TMDataGridFeatures,\n TData,\n unknown\n> {\n return {\n id: SELECT_COLUMN_ID,\n meta: {\n label: \"Checkbox selection\",\n align: \"center\",\n // Structurally the first column; it also anchors the left pinned lane, so\n // no other column can be moved in front of it.\n enableOrdering: false,\n },\n size: 48,\n minSize: 48,\n maxSize: 48,\n enableResizing: false,\n enableSorting: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n // Structurally pinned to the left; users shouldn't be able to move it.\n enablePinning: false,\n header: ({ table }) => <SelectAllHeader table={table} />,\n cell: ({ row }) => <SelectRowCheckbox row={row} />,\n // Every cell on a group row that is not the grouped column counts as\n // aggregated, this lane included, and an aggregated cell with nothing\n // declared renders blank. Without this the checkbox would disappear from\n // exactly the rows that select a whole group. See renderCellContent.\n aggregatedCell: ({ row }) => <SelectRowCheckbox row={row} />,\n };\n}\n","import { useCreateStore } from \"@tanstack/react-store\";\nimport {\n aggregationFns,\n type ColumnDef,\n columnFacetingFeature,\n columnFilteringFeature,\n columnGroupingFeature,\n columnOrderingFeature,\n columnPinningFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n createColumnHelper,\n createExpandedRowModel,\n createFacetedMinMaxValues,\n createFacetedRowModel,\n createFacetedUniqueValues,\n createFilteredRowModel,\n createGroupedRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFns,\n globalFilteringFeature,\n metaHelper,\n type RowData,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n sortFns,\n type Table,\n tableFeatures,\n type TableOptions,\n type TableState,\n useTable,\n} from \"@tanstack/react-table\";\nimport type { Store } from \"@tanstack/store\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n type TMDataGridColumnType,\n tmDataGridFilterFn,\n getDefaultOperator,\n} from \"./core/filterOperators\";\nimport {\n hasPersistenceKeys,\n readPersistedState,\n type TMDataGridPersistence,\n writePersistedState,\n} from \"./core/persistence\";\nimport {\n readFeatureFlags,\n type TMDataGridFeatureFlags,\n type TMDataGridSelectionMode,\n} from \"./core/capabilities\";\nimport {\n createSelectColumn,\n SELECT_COLUMN_ID,\n} from \"./components/TMDataGridSelectColumn\";\nimport {\n createGroupColumn,\n GROUP_COLUMN_ID,\n} from \"./components/TMDataGridGroupColumn\";\n\n/**\n * How long the grid waits after the last state change before writing to\n * storage. Long enough to collapse a resize drag into one write, short enough\n * that a reload right after a change still sees it.\n */\nconst PERSIST_DEBOUNCE_MS = 200;\n\n/** Per-column configuration the TMDataGrid chrome reads. */\nexport type TMDataGridColumnMeta = {\n /** Name shown in menus and the column manager. Falls back to a string header. */\n label?: string;\n /** Drives which filter operators are offered. Defaults to `\"string\"`. */\n type?: TMDataGridColumnType;\n /** Share of the leftover width this column claims. Defaults to `1`. */\n flex?: number;\n align?: \"left\" | \"right\" | \"center\";\n /**\n * `false` keeps the column where it is: no header dragging, no move items.\n * Column ordering is the one feature TanStack defines no column option for,\n * so its switch lives here rather than on the column definition.\n */\n enableOrdering?: boolean;\n};\n\n/** Grid-wide configuration passed through `options.meta`. */\nexport type TMDataGridTableMeta = {\n loading?: boolean;\n noResultsLabel?: string;\n /** Row height used by the virtualizer. Defaults to `52`. */\n rowHeight?: number;\n /**\n * Unfiltered row total. Only needed for server-driven grids, where the client\n * never holds the full data set — `TMDataGrid.SummaryCount` uses it as denominator.\n */\n totalRowCount?: number;\n};\n\n/**\n * Every feature the TMDataGrid chrome can drive. Defined at module scope so the\n * reference stays stable across renders (see the TanStack table-state skill).\n */\nexport const tmDataGridFeatures = tableFeatures({\n columnFilteringFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n columnPinningFeature,\n columnVisibilityFeature,\n columnOrderingFeature,\n columnSizingFeature,\n columnResizingFeature,\n columnFacetingFeature,\n columnGroupingFeature,\n // Registered for grouping's sake rather than for tree data: the grouped row\n // model builds the parent rows, and this is what flattens the expanded ones\n // back into the flat list the body virtualizes.\n rowExpandingFeature,\n\n filteredRowModel: createFilteredRowModel(),\n groupedRowModel: createGroupedRowModel(),\n sortedRowModel: createSortedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n facetedRowModel: createFacetedRowModel(),\n facetedMinMaxValues: createFacetedMinMaxValues(),\n facetedUniqueValues: createFacetedUniqueValues(),\n\n filterFns: { ...filterFns, tmDataGrid: tmDataGridFilterFn },\n sortFns,\n // The names `columnDef.aggregationFn` accepts. Only consulted for columns\n // that ask for one — a column with no `aggregationFn` reports `undefined` on\n // a group row, which is what keeps a plain \"group by\" free of aggregates.\n aggregationFns,\n\n tableMeta: metaHelper<TMDataGridTableMeta>(),\n columnMeta: metaHelper<TMDataGridColumnMeta>(),\n});\n\nexport type TMDataGridFeatures = typeof tmDataGridFeatures;\n\nexport type TMDataGridTable<TData extends RowData> = Table<\n TMDataGridFeatures,\n TData\n>;\n\nexport function createTMDataGridColumnHelper<TData extends RowData>() {\n return createColumnHelper<TMDataGridFeatures, TData>();\n}\n\n/**\n * Chrome state that is *not* table state: which panels are open, and which\n * column opened the filter panel. Kept in a TanStack Store so consumers can\n * subscribe to it the same way they subscribe to `table.store`.\n */\nexport type TMDataGridUiState = {\n filterPanelOpen: boolean;\n columnsPanelOpen: boolean;\n /** Column whose filter row should be focused when the panel opens. */\n filterPanelColumnId: string | null;\n /**\n * Column being dragged by its header, if any. Held here rather than read from\n * `dataTransfer`, which browsers keep unreadable until the drop.\n */\n draggedColumnId: string | null;\n /**\n * The single highlighted row — the one a detail panel would be showing. Its\n * own concept, not a slice of `rowSelection`: under\n * `selectionMode: \"checkboxAndHighlight\"` the two coexist, and TanStack's one\n * selection map cannot hold both.\n *\n * Not pruned when the row is filtered out, paged away or dropped from `data`,\n * matching how TanStack treats `rowSelection` — nothing there resets it\n * either. The row simply renders unhighlighted, and highlights again if it\n * comes back.\n */\n highlightedRowId: string | null;\n /** The pivot a shift-click extends from. See resolveRowSelectionClick. */\n selectionAnchorRowId: string | null;\n};\n\nexport type TMDataGridUiActions = {\n openFilterPanel: (columnId?: string | null) => void;\n closeFilterPanel: () => void;\n setColumnsPanelOpen: (open: boolean) => void;\n toggleColumnsPanel: () => void;\n startColumnDrag: (columnId: string) => void;\n endColumnDrag: () => void;\n /**\n * Moves the active row, or clears it with `null` — which is how a consumer\n * closing its detail panel puts the grid back in step.\n */\n setHighlightedRow: (rowId: string | null) => void;\n setSelectionAnchor: (rowId: string | null) => void;\n};\n\nexport type TMDataGridUiStore = Store<TMDataGridUiState, TMDataGridUiActions>;\n\n/** What `useTMDataGrid` returns — spread straight onto `<TMDataGrid />`. */\nexport type TMDataGridApi<TData extends RowData> = {\n table: TMDataGridTable<TData>;\n ui: TMDataGridUiStore;\n /** Table-level feature switches, re-read from options on every render. */\n features: TMDataGridFeatureFlags;\n};\n\nexport type UseTMDataGridOptions<TData extends RowData> = Omit<\n TableOptions<TMDataGridFeatures, TData>,\n \"features\"\n> & {\n /**\n * Restore and persist table state across mounts. Two keys, because the two\n * kinds of state have different lifetimes — see {@link TMDataGridPersistence}.\n *\n * Keep the object referentially stable (module scope or `useMemo`); it is a\n * dependency of the subscription that writes back.\n */\n persist?: TMDataGridPersistence;\n /**\n * Header drag-and-drop and the move items in the column menu. Defaults to\n * `true`.\n *\n * The one feature switch the grid defines itself: TanStack's\n * `columnOrderingFeature` ships state and APIs but no `enable` option, since\n * reordering is entirely a matter of interface.\n */\n enableColumnOrdering?: boolean;\n /**\n * Client-side pagination and the built-in `TMDataGrid.Footer` pager.\n * Defaults to `false`: the grid renders every filtered row and relies on\n * virtualization.\n *\n * The second grid-defined switch (TanStack defines no `enablePagination`\n * option). `manualPagination: true` implies it — a server-paged grid needs\n * no extra flag.\n */\n enablePagination?: boolean;\n /**\n * How rows are selected. Defaults to `\"checkbox\"`.\n *\n * | Mode | Checkbox column | Row click |\n * | ---- | --------------- | --------- |\n * | `\"checkbox\"` | yes, multi-select | nothing |\n * | `\"row\"` | no | multi-selects, Ctrl/Shift modifiers |\n * | `\"checkboxAndHighlight\"` | yes, multi-select | highlights one row |\n * | `\"highlight\"` | no | highlights one row, no selection at all |\n *\n * One option rather than two, so the combination that cannot work — a click\n * that both toggles a multi-selection and moves the highlight — is not\n * expressible.\n *\n * The first two write to TanStack's `rowSelection`. The highlight is separate\n * state, which is what lets `\"checkboxAndHighlight\"` run both at once: tick\n * rows for a bulk action, click one to open its detail panel. See\n * `defaultHighlightedRowId` / `onHighlightedRowChange`.\n *\n * `enableRowSelection` still gates the selection half, predicate form\n * included; under `\"highlight\"` there is nothing for it to gate.\n */\n selectionMode?: TMDataGridSelectionMode;\n /**\n * Give selected rows the highlight background. Defaults to `true` under\n * `selectionMode: \"row\"`, where the highlight is the only feedback a click\n * gives, and `false` under `\"checkbox\"`, where the box already shows it.\n *\n * The colour is the `--dg-row-selected-bg` CSS variable, so it can be changed\n * without turning the flag on or off:\n *\n * ```tsx\n * <TMDataGrid\n * {...grid}\n * style={{ \"--dg-row-selected-bg\": \"var(--mantine-color-blue-0)\" }}\n * />\n * ```\n */\n showSelectedBackground?: boolean;\n /**\n * The row that starts out highlighted, under a `selectionMode` that has a\n * highlight. Read once on mount, like `initialState`.\n *\n * The grid never persists the highlighted row. Pair this with\n * {@link onHighlightedRowChange} and keep it wherever it belongs — for a\n * detail panel that is usually the route, which gets you a shareable link and\n * a working back button as well as surviving a reload:\n *\n * ```tsx\n * const { rowId } = useParams();\n * useTMDataGrid({\n * selectionMode: \"highlight\",\n * defaultHighlightedRowId: rowId,\n * onHighlightedRowChange: (id) => navigate(id ? `/employees/${id}` : \"/employees\"),\n * });\n * ```\n */\n defaultHighlightedRowId?: string | null;\n /**\n * Called with the newly highlighted row id, or `null` when it is cleared.\n * Fires for `ui.actions.setHighlightedRow` too, not only for clicks.\n */\n onHighlightedRowChange?: (rowId: string | null) => void;\n};\n\ntype TMDataGridColumnDef<TData extends RowData> = ColumnDef<\n TMDataGridFeatures,\n TData,\n unknown\n>;\n\n/**\n * Point every column at the operator-dispatching filter function, and take\n * grouping's aggregation defaults back off, unless the column opted into its\n * own. Anything the consumer set wins — it is spread over these.\n *\n * The aggregation pair needs explaining. TanStack's grouping feature hands\n * every column `aggregationFn: \"auto\"` and an `aggregatedCell` that stringifies\n * whatever comes out, so merely registering the feature would have every\n * numeric column silently sum itself and every date column show a range the\n * moment anything is grouped. That is a summary table, and \"group by\" is not a\n * request for one. Cleared here, so a grouped grid is a tree until a column\n * says otherwise — `aggregationFn: \"sum\"` on the column that wants it.\n */\nfunction withTMDataGridDefaults<TData extends RowData>(\n columns: ReadonlyArray<TMDataGridColumnDef<TData>>,\n): Array<TMDataGridColumnDef<TData>> {\n return columns.map((column) => {\n if (\"columns\" in column && Array.isArray(column.columns)) {\n return {\n ...column,\n columns: withTMDataGridDefaults<TData>(column.columns),\n };\n }\n return {\n filterFn: \"tmDataGrid\",\n aggregationFn: undefined,\n aggregatedCell: undefined,\n ...column,\n } as TMDataGridColumnDef<TData>;\n });\n}\n\n/**\n * Builds a TMDataGrid table plus its chrome store.\n *\n * Every `TableOptions` field passes straight through, so a server-driven grid\n * only needs `manualPagination` / `manualFiltering` / `manualSorting`,\n * `rowCount` and the matching `onXChange` callbacks — the chrome reads\n * `getRowCount()` / `getPageCount()` / `getPaginatedRowModel()`, all of which\n * already respect manual mode. `manualPagination` also switches the pagination\n * flag on, so `<TMDataGrid.Footer />` renders its pager without further\n * options.\n */\nexport function useTMDataGrid<TData extends RowData>({\n persist,\n // Not TanStack options, so they are kept out of what `useTable` receives.\n enableColumnOrdering,\n enablePagination,\n selectionMode,\n showSelectedBackground,\n defaultHighlightedRowId,\n onHighlightedRowChange,\n ...options\n}: UseTMDataGridOptions<TData>): TMDataGridApi<TData> {\n // Derived up here, rather than just before the return, because the rest of the\n // hook needs `selectColumn` — one place decides what each mode means.\n //\n // Deliberately not memoized on `table`: the flags must re-derive whenever the\n // caller passes different options, and `table` keeps the same identity when\n // they do. See readFeatureFlags.\n const features = readFeatureFlags({\n ...options,\n enableColumnOrdering,\n enablePagination,\n selectionMode,\n showSelectedBackground,\n });\n\n const pinningEnabled = options.enableColumnPinning !== false;\n const selectColumnEnabled = features.selectColumn;\n const groupColumnEnabled = features.grouping;\n\n const columns = useMemo(() => {\n const base = withTMDataGridDefaults<TData>(\n options.columns as ReadonlyArray<TMDataGridColumnDef<TData>>,\n );\n // Both generated columns are always present when their feature is on, and\n // the tree column hides itself while nothing is grouped. Adding it to the\n // array only once a column is grouped would make the column list depend on\n // table state, which is the one thing that cannot be a `useMemo` dependency\n // here — the table is built from these columns.\n return [\n ...(selectColumnEnabled ? [createSelectColumn<TData>()] : []),\n ...(groupColumnEnabled ? [createGroupColumn<TData>()] : []),\n ...base,\n ];\n }, [options.columns, selectColumnEnabled, groupColumnEnabled]);\n\n // Read once on mount: `initialState` is only consumed on the first render,\n // and re-reading later would fight the user's live edits.\n const [persistedState] = useState(() => readPersistedState(persist));\n\n // Restored grouping decides whether the tree column starts out visible, so a\n // reload comes back to the tree the user left rather than to a hidden lane.\n const initialGrouping =\n persistedState.grouping ?? options.initialState?.grouping ?? [];\n\n const table = useTable({\n columnResizeMode: \"onChange\",\n enableSorting: true,\n enableColumnResizing: true,\n globalFilterFn: \"includesString\",\n // Grouping by a column takes it out of the grid, the way AG Grid does it:\n // its values have moved into the tree column, so leaving it in place would\n // show every row the same value it was grouped under. Overridable — pass\n // `\"reorder\"` to keep the column and have it moved to the front instead.\n groupedColumnMode: \"remove\",\n ...options,\n features: tmDataGridFeatures,\n columns: columns as TableOptions<TMDataGridFeatures, TData>[\"columns\"],\n initialState: {\n ...options.initialState,\n ...persistedState,\n columnVisibility: {\n ...options.initialState?.columnVisibility,\n ...persistedState.columnVisibility,\n // Last word, because the tree column's visibility is not a user setting\n // — it tracks the grouping state. See the effect below.\n ...(groupColumnEnabled\n ? { [GROUP_COLUMN_ID]: initialGrouping.length > 0 }\n : {}),\n },\n columnPinning: {\n // The generated columns are structurally pinned, so they are re-applied\n // on top of anything restored from storage.\n left: [\n ...(selectColumnEnabled && pinningEnabled ? [SELECT_COLUMN_ID] : []),\n ...(groupColumnEnabled && pinningEnabled ? [GROUP_COLUMN_ID] : []),\n ...(\n persistedState.columnPinning?.left ??\n options.initialState?.columnPinning?.left ??\n []\n ).filter((id) => id !== SELECT_COLUMN_ID && id !== GROUP_COLUMN_ID),\n ],\n right:\n persistedState.columnPinning?.right ??\n options.initialState?.columnPinning?.right ??\n [],\n },\n pagination: {\n pageIndex: 0,\n pageSize: 25,\n ...options.initialState?.pagination,\n ...persistedState.pagination,\n },\n },\n });\n\n // Two things have to happen whenever `grouping` changes.\n //\n // One: the tree column appears with the first grouped column and goes away\n // with the last, so an ungrouped grid looks exactly as it did before grouping\n // existed. Driven from a subscription rather than by rebuilding the column\n // array, because the array is what the table is built from — deriving it from\n // table state would close the loop. Visibility is the one column property\n // that can be changed after the fact without touching the definitions.\n //\n // Two, and this one is a workaround. In table-core 9.0.0-beta.21 the\n // per-region column APIs do not list `grouping` among their memo\n // dependencies, even though they all derive from `getAllLeafColumns()`, which\n // does:\n //\n // | API | Declares |\n // | --- | --- |\n // | `getLeft/Center/RightVisibleLeafColumns` | columns, columnPinning, columnVisibility, columnOrder |\n // | `getLeft/Center/RightHeaderGroups` | columnPinning, columnOrder |\n // | `row.getLeft/Center/RightVisibleCells` | columnPinning, columnVisibility |\n //\n // So grouping a *second* column leaves every one of them returning the\n // previous list: the column TanStack removed keeps its header and its grid\n // track, and the row cells no longer line up with them. The first grouping\n // appears to work only because the visibility write above happens to touch a\n // dependency they share.\n //\n // Re-publishing `columnVisibility` and `columnOrder` — same contents, new\n // identity — invalidates all three families. `columnOrder` is the only\n // dependency the header groups declare, and `columnVisibility` the only one\n // the cells do, so both are needed. Remove this once the deps are fixed\n // upstream; the test that fails without it groups two columns and asserts the\n // second one leaves the grid.\n //\n // Writing back into the store from its own subscriber is safe: the guard is\n // on `grouping`'s identity, and neither write touches it, so the callback\n // these writes trigger short-circuits.\n useEffect(() => {\n if (!groupColumnEnabled) return;\n let previousGrouping = table.store.state.grouping;\n\n const subscription = table.store.subscribe((state) => {\n if (state.grouping === previousGrouping) return;\n previousGrouping = state.grouping;\n\n table.setColumnVisibility((old) => ({\n ...old,\n [GROUP_COLUMN_ID]: state.grouping.length > 0,\n }));\n table.setColumnOrder((old) => [...old]);\n });\n\n return () => subscription.unsubscribe();\n }, [groupColumnEnabled, table]);\n\n // Mirror every state change back to storage. Subscribing (rather than writing\n // from an effect on a state snapshot) means nothing is missed, including\n // changes made straight through the table API by the consumer.\n //\n // Writes are debounced because `columnResizeMode: \"onChange\"` publishes a new\n // state on every pointer move of a resize drag, and `setItem` serialises\n // synchronously on the main thread. The trailing edge is enough: storage only\n // has to agree with the table once the user stops.\n useEffect(() => {\n if (!hasPersistenceKeys(persist)) return;\n writePersistedState(table.store.state, persist);\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let pending: TableState<TMDataGridFeatures> | null = null;\n\n const flush = () => {\n timeout = undefined;\n if (pending === null) return;\n writePersistedState(pending, persist);\n pending = null;\n };\n\n const subscription = table.store.subscribe((state) => {\n pending = state;\n if (timeout !== undefined) clearTimeout(timeout);\n timeout = setTimeout(flush, PERSIST_DEBOUNCE_MS);\n });\n\n return () => {\n subscription.unsubscribe();\n if (timeout !== undefined) clearTimeout(timeout);\n // An unmount mid-debounce would otherwise drop the last change.\n flush();\n };\n }, [persist, table]);\n\n const ui = useCreateStore<TMDataGridUiState, TMDataGridUiActions>(\n {\n filterPanelOpen: false,\n columnsPanelOpen: false,\n filterPanelColumnId: null,\n draggedColumnId: null,\n // `useCreateStore` builds the store once per mount, so this is a genuine\n // default rather than a value that would fight later clicks.\n highlightedRowId: defaultHighlightedRowId ?? null,\n selectionAnchorRowId: null,\n },\n ({ setState }) => ({\n openFilterPanel: (columnId = null) =>\n setState((prev) => ({\n ...prev,\n filterPanelOpen: true,\n filterPanelColumnId: columnId,\n })),\n closeFilterPanel: () =>\n setState((prev) => ({\n ...prev,\n filterPanelOpen: false,\n filterPanelColumnId: null,\n })),\n setColumnsPanelOpen: (open) =>\n setState((prev) => ({ ...prev, columnsPanelOpen: open })),\n toggleColumnsPanel: () =>\n setState((prev) => ({ ...prev, columnsPanelOpen: !prev.columnsPanelOpen })),\n startColumnDrag: (columnId) =>\n setState((prev) => ({ ...prev, draggedColumnId: columnId })),\n endColumnDrag: () =>\n setState((prev) => ({ ...prev, draggedColumnId: null })),\n setHighlightedRow: (rowId) =>\n setState((prev) => ({ ...prev, highlightedRowId: rowId })),\n setSelectionAnchor: (rowId) =>\n setState((prev) => ({ ...prev, selectionAnchorRowId: rowId })),\n }),\n );\n\n // `onHighlightedRowChange` is fired from a subscription rather than from the store\n // action, so it covers every route to a new active row — a row click, and a\n // consumer calling `setHighlightedRow` itself. Held in a ref because the store is\n // built once and its actions would otherwise close over the first render's\n // callback.\n const onHighlightedRowChangeRef = useRef(onHighlightedRowChange);\n useEffect(() => {\n onHighlightedRowChangeRef.current = onHighlightedRowChange;\n }, [onHighlightedRowChange]);\n\n useEffect(() => {\n // Seeded from the current value so mounting with a `defaultHighlightedRowId`\n // does not report a change that nothing made.\n let previous = ui.state.highlightedRowId;\n const subscription = ui.subscribe((state) => {\n if (state.highlightedRowId === previous) return;\n previous = state.highlightedRowId;\n onHighlightedRowChangeRef.current?.(state.highlightedRowId);\n });\n return () => subscription.unsubscribe();\n }, [ui]);\n\n return { table, ui, features };\n}\n\n/**\n * Opens the filter panel for a column, seeding an empty filter row when the\n * column has none yet — mirrors \"Filter\" in the column header menu.\n */\nexport function openColumnFilter<TData extends RowData>(\n api: TMDataGridApi<TData>,\n columnId: string,\n): void {\n const column = api.table.getColumn(columnId);\n if (column && column.getFilterValue() === undefined) {\n column.setFilterValue({\n operator: getDefaultOperator(column.columnDef.meta?.type ?? \"string\"),\n value: \"\",\n });\n }\n api.ui.actions.openFilterPanel(columnId);\n}\n","import { Button, Pill, UnstyledButton } from \"@mantine/core\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport classes from \"./TMDataGridFilterPills.module.css\";\nimport { getColumnLabel, getColumnType } from \"../core/columnUtils\";\nimport {\n formatFilterLabel,\n isFilterActive,\n isTMDataGridFilterValue,\n} from \"../core/filterOperators\";\nimport type { TMDataGridSize } from \"../core/sizes\";\nimport { openColumnFilter, type TMDataGridApi } from \"../useTMDataGrid\";\n\nexport type TMDataGridFilterPillsProps<TData extends RowData> = {\n /** The object returned by `useTMDataGrid`. */\n api: TMDataGridApi<TData>;\n /** Mantine size of the pills. Defaults to `\"sm\"`. */\n size?: TMDataGridSize;\n /** \"Clear all\" button, shown once two filters are active. Defaults to `true`. */\n showClearAll?: boolean;\n /**\n * Replaces what a click on a pill's label does. The default opens the grid's\n * filter panel on that column.\n */\n onPillClick?: (columnId: string) => void;\n className?: string;\n};\n\n/**\n * One pill per active filter — `First name: Sofia ✕` — with the ✕ clearing that\n * filter and a click on the label opening the filter panel on its column.\n *\n * The one grid component that takes the api as a prop instead of reading\n * context, so it can live anywhere: a page header, a card title, a breadcrumb\n * row. Renders nothing while no filter is active.\n *\n * ```tsx\n * const grid = useTMDataGrid({ data, columns });\n *\n * <Group>\n * <Title order={3}>Employees</Title>\n * <TMDataGridFilterPills api={grid} />\n * </Group>\n * ```\n *\n * Half-typed filters are left out: a filter that is not narrowing the rows yet\n * has nothing to report, which is the same rule the funnel indicator uses.\n */\nexport function TMDataGridFilterPills<TData extends RowData>({\n api,\n size = \"sm\",\n showClearAll = true,\n onPillClick,\n className,\n}: TMDataGridFilterPillsProps<TData>) {\n const { table } = api;\n const columnFilters = useSelector(\n table.store,\n (state) => state.columnFilters,\n );\n\n const activeFilters = columnFilters.filter((filter) =>\n isFilterActive(filter.value),\n );\n if (activeFilters.length === 0) return null;\n\n return (\n <div\n role=\"group\"\n aria-label=\"Active filters\"\n className={[classes.filterPills, className].filter(Boolean).join(\" \")}\n >\n <Pill.Group size={size}>\n {activeFilters.map((filter) => {\n const column = table.getColumn(filter.id);\n const label = column ? getColumnLabel(column) : filter.id;\n const value = filter.value;\n // isFilterActive already vouched for the shape; this narrows it.\n if (!isTMDataGridFilterValue(value)) return null;\n\n return (\n <Pill\n key={filter.id}\n size={size}\n className={classes.pill}\n withRemoveButton\n onRemove={() =>\n table.setColumnFilters(\n columnFilters.filter((other) => other.id !== filter.id),\n )\n }\n // Mantine hides its remove button from assistive tech and from\n // the tab order, because inside a `PillsInput` Backspace is the\n // way out. These pills stand on their own, so the ✕ has to be a\n // real button.\n removeButtonProps={{\n \"aria-label\": `Clear ${label} filter`,\n \"aria-hidden\": false,\n tabIndex: 0,\n }}\n >\n <UnstyledButton\n className={classes.pillLabel}\n onClick={() =>\n onPillClick\n ? onPillClick(filter.id)\n : openColumnFilter(api, filter.id)\n }\n >\n {formatFilterLabel({\n label,\n type: column ? getColumnType(column) : \"string\",\n filter: value,\n })}\n </UnstyledButton>\n </Pill>\n );\n })}\n </Pill.Group>\n\n {showClearAll && activeFilters.length > 1 && (\n // Below two pills their own ✕ is the shorter path, so the button would\n // only be a second way to do the same thing.\n <Button\n variant=\"subtle\"\n color=\"gray\"\n size=\"compact-xs\"\n onClick={() => table.setColumnFilters([])}\n >\n Clear all\n </Button>\n )}\n </div>\n );\n}\n",".footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--mantine-spacing-lg);\n padding: 4px var(--mantine-spacing-sm);\n min-height: 48px;\n flex-shrink: 0;\n border-top: 1px solid var(--mantine-color-default-border);\n}\n\n/* Grouping suspends paging. The pager stays put and fades rather than\n disappearing, so the footer reads as switched off rather than as having\n vanished — and the row it holds does not change height under the grid. Its\n controls carry their own `disabled`; this is the label half. */\n.footer[data-paging-suspended=\"true\"] {\n opacity: 0.55;\n}\n","import { ActionIcon, Group, Select, Text, Tooltip } from \"@mantine/core\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport type { ReactNode } from \"react\";\nimport classes from \"./TMDataGridFooter.module.css\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getGridCapabilities } from \"../core/capabilities\";\nimport { isPagingActive } from \"../core/rowSelection\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"./icons\";\nimport type { TMDataGridTable } from \"../useTMDataGrid\";\n\n/** Shown on the greyed-out pager, and the reason it is greyed out. */\nconst PAGING_SUSPENDED_HINT =\n \"Paging is off while the rows are grouped: the whole tree is rendered and virtualized. Ungroup to page again.\";\n\n/** Distilled pagination state and actions for building a custom pager. */\nexport type TMDataGridPaginationApi = {\n pageIndex: number;\n pageSize: number;\n /** `-1` when a manual grid declares `pageCount: -1` (unknown total). */\n pageCount: number;\n rowCount: number;\n canPreviousPage: boolean;\n canNextPage: boolean;\n setPageIndex: (pageIndex: number) => void;\n setPageSize: (pageSize: number) => void;\n previousPage: () => void;\n nextPage: () => void;\n firstPage: () => void;\n lastPage: () => void;\n};\n\n/**\n * Reads {@link TMDataGridPaginationApi} off a table. The Footer feeds it to the\n * `pagination` render prop; a pager living outside the Footer can call it with\n * the table from `useTMDataGrid` directly.\n */\nexport function getTMDataGridPaginationApi<TData extends RowData>(\n table: TMDataGridTable<TData>,\n): TMDataGridPaginationApi {\n const { pageIndex, pageSize } = table.store.state.pagination;\n return {\n pageIndex,\n pageSize,\n pageCount: table.getPageCount(),\n rowCount: table.getRowCount(),\n canPreviousPage: table.getCanPreviousPage(),\n canNextPage: table.getCanNextPage(),\n setPageIndex: (index) => table.setPageIndex(index),\n setPageSize: (size) => table.setPageSize(size),\n previousPage: () => table.previousPage(),\n nextPage: () => table.nextPage(),\n firstPage: () => table.firstPage(),\n lastPage: () => table.lastPage(),\n };\n}\n\nexport type TMDataGridFooterProps = {\n pageSizeOptions?: ReadonlyArray<number>;\n /** Replaces the built-in pager. Receives the distilled pagination API. */\n pagination?: (api: TMDataGridPaginationApi) => ReactNode;\n};\n\n/**\n * MUI-style pager: \"Rows per page · from–to of total · ‹ ›\".\n *\n * Renders nothing unless pagination is enabled (`enablePagination` or\n * `manualPagination`) — the footer is a pager; extra footer content belongs in\n * your own layout.\n *\n * Row totals come from `table.getRowCount()`, which prefers `options.rowCount`\n * — so a server-paged grid shows the server's total without changes here.\n */\nexport function TMDataGridFooter({\n pageSizeOptions = [10, 25, 50, 100],\n pagination,\n}: TMDataGridFooterProps) {\n const { table, features, controlSize } = useTMDataGridContext();\n useSelector(table.store);\n\n if (!getGridCapabilities(table, features).canPaginate) return null;\n\n if (pagination) {\n return (\n <div className={classes.footer}>\n {pagination(getTMDataGridPaginationApi(table))}\n </div>\n );\n }\n\n // Grouping suspends paging — see isPagingActive. The pager is greyed out\n // rather than dropped, so that a footer going quiet reads as a state the grid\n // is in rather than as something that broke.\n const paging = isPagingActive(table, features);\n const { pageIndex, pageSize } = table.store.state.pagination;\n const total = table.getRowCount();\n const from = total === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min(total, (pageIndex + 1) * pageSize);\n // A page size restored from storage, or set through `initialState`, need not\n // be one of the offered sizes. Without it in the list the Select renders\n // blank, so the current size is folded in rather than shown as nothing.\n const sizeOptions = pageSizeOptions.includes(pageSize)\n ? pageSizeOptions\n : [...pageSizeOptions, pageSize].sort((a, b) => a - b);\n\n return (\n <Tooltip\n label={PAGING_SUSPENDED_HINT}\n disabled={paging}\n withArrow\n multiline\n w={260}\n position=\"top\"\n >\n <div className={classes.footer} data-paging-suspended={!paging}>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <Text size={controlSize} c=\"dimmed\">\n Rows per page:\n </Text>\n <Select\n size={controlSize}\n w={78}\n allowDeselect={false}\n variant=\"unstyled\"\n disabled={!paging}\n data={sizeOptions.map(String)}\n value={String(pageSize)}\n onChange={(value) => {\n table.setPageSize(Number(value) || pageSizeOptions[0]);\n table.setPageIndex(0);\n }}\n />\n </Group>\n\n <Text size={controlSize} c=\"dimmed\">\n {paging ? (\n <>\n {from}–{to} of {total}\n </>\n ) : (\n // Not a range: nothing is being sliced, so a range would be a lie.\n // Counted before grouping too — `getRowCount()` would be counting\n // the tree, so a collapsed grid would claim to hold eight rows.\n <>Grouped · all {table.getFilteredRowModel().rows.length} rows</>\n )}\n </Text>\n\n <Group gap={4} wrap=\"nowrap\">\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n aria-label=\"Previous page\"\n disabled={!paging || !table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n >\n <ChevronLeftIcon size={18} stroke={1.6} />\n </ActionIcon>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n aria-label=\"Next page\"\n disabled={!paging || !table.getCanNextPage()}\n onClick={() => table.nextPage()}\n >\n <ChevronRightIcon size={18} stroke={1.6} />\n </ActionIcon>\n </Group>\n </div>\n </Tooltip>\n );\n}\n","/* Anchors the filter panel, which floats over the first body rows. */\n.tableWrapper {\n position: relative;\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.scrollContainer {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n\n/* Column tracks are set inline via gridTemplateColumns. */\n.grid {\n display: grid;\n}\n\n/* Rows are real layout boxes (not display: contents) so position: sticky works,\n and subgrid keeps their cells on the parent's column tracks. */\n.headerRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: subgrid;\n position: sticky;\n top: 0;\n z-index: 3;\n}\n\n.bodyRow {\n --row-bg: var(--mantine-color-body);\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: subgrid;\n align-items: stretch;\n}\n\n.bodyRow:hover {\n --row-bg: var(--mantine-color-default-hover);\n}\n\n/* A group row takes no background of its own. Collapsed, every row on screen is\n a group row, so a tint would grey out the whole grid and read as if\n everything were selected. The bold label and the chevron carry the\n distinction instead — and `--dg-row-group-bg` is there for a consumer who\n wants the tint back. Declared before the selection rules, so a selected or\n highlighted group still reads as one. */\n.bodyRow[data-grouped=\"true\"] {\n --row-bg: var(--dg-row-group-bg);\n}\n\n/* The row an open context menu is about. The pointer has usually left it by\n then, so without this the menu would be the only thing saying which row it\n acts on. Declared before the selection rules, which are the stronger\n statement and win at equal specificity. */\n.bodyRow[data-context-menu=\"true\"] {\n --row-bg: var(--mantine-color-default-hover);\n}\n\n/* Being selected and being painted for it are separate: a row is always\n `data-selected`, but only takes the background when `showSelectedBackground`\n is on — the default under `\"row\"`, off with checkboxes. */\n.bodyRow[data-selected-bg=\"true\"] {\n --row-bg: var(--dg-row-selected-bg);\n}\n\n/* The highlighted row wins over the selected background: under\n `\"checkboxAndHighlight\"` the two coexist, and the highlighted row is the one\n the detail panel is about, so it must stay distinguishable inside a\n selection. Declared after, so the later rule takes it at equal specificity. */\n.bodyRow[data-highlighted=\"true\"] {\n --row-bg: var(--dg-row-highlight-bg);\n}\n\n/* Row selection mode: the row is the control, so it takes focus and must not\n start a text selection on the click that toggles it. */\n.bodyRow[data-selects-on-click=\"true\"] {\n user-select: none;\n}\n\n.bodyRow:focus-visible {\n outline: 2px solid var(--mantine-primary-color-filled);\n outline-offset: -2px;\n}\n\n/* Clipping lives on .cellContent, not here — a pinned cell has to let its\n boundary gradient escape past its own right/left edge. */\n.bodyCell {\n display: flex;\n align-items: center;\n padding: 0 var(--dg-padding);\n border-bottom: 1px solid var(--mantine-color-default-border);\n /* Inherited from .bodyRow — sticky cells need an opaque background. */\n background-color: var(--row-bg);\n font-size: var(--dg-font-size);\n}\n\n/* The checkbox column is a fixed 48px track holding a control of a known width,\n not text that can ellipsize. Cell padding is sized for text and grows with\n the scale, so at `xl` its 18px a side left 12px for a 16px box and the\n checkbox was clipped. The lane centres its control instead. */\n.bodyCell[data-select-column=\"true\"] {\n padding: 0;\n}\n\n.cellContent {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.bodyCell[data-align=\"right\"] {\n justify-content: flex-end;\n}\n\n.bodyCell[data-align=\"center\"] {\n justify-content: center;\n}\n\n/* Only stretch to fill when left-aligned, so right/centre stay put. */\n.bodyCell[data-align=\"left\"] .cellContent {\n flex: 1 1 auto;\n}\n\n.messageRow {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--mantine-spacing-xs);\n padding: var(--mantine-spacing-xl);\n}\n","/* Boundary of a pinned column group. Shared, because the edge is cast by both\n the header cell and every body cell in the same column — the two have to\n draw an identical band or the seam shows at the header.\n\n A box-shadow is drawn per cell, and its blur fades in at each cell's own top\n and bottom edge — stacked down a column that reads as banding at every row\n seam. Instead: a crisp 1px border for the hard edge, plus a gradient pseudo\n element pinned to `top: 0; bottom: 0` so consecutive cells butt together into\n one unbroken band. Mantine sets `color-scheme` on the root, so light-dark()\n resolves without a second selector. */\n.stickyLeft {\n border-right: 1px solid var(--mantine-color-default-border);\n}\n\n.stickyRight {\n border-left: 1px solid var(--mantine-color-default-border);\n}\n\n.stickyLeft::after,\n.stickyRight::after {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: 4px;\n pointer-events: none;\n}\n\n.stickyLeft::after {\n left: 100%;\n background: linear-gradient(\n to right,\n light-dark(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.28)),\n transparent\n );\n}\n\n.stickyRight::after {\n right: 100%;\n background: linear-gradient(\n to left,\n light-dark(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.28)),\n transparent\n );\n}\n",".headerCell {\n position: relative;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 0 var(--dg-padding);\n min-width: 0;\n min-height: var(--dg-header-height);\n font-weight: 600;\n font-size: var(--dg-font-size);\n background-color: var(--mantine-color-body);\n border-bottom: 1px solid var(--mantine-color-default-border);\n user-select: none;\n}\n\n.headerCell[data-align=\"right\"] {\n justify-content: flex-end;\n}\n\n.headerCell[data-align=\"center\"] {\n justify-content: center;\n}\n\n/* Same as the body cells: the select-all box sits in a fixed 48px track, which\n the text padding would squeeze it out of at the larger sizes. */\n.headerCell[data-select-column=\"true\"] {\n padding: 0;\n}\n\n/* Sorted or filtered columns read as active, like the MUI data grid. */\n.headerCell[data-active=\"true\"] .headerTitle {\n color: var(--mantine-primary-color-filled);\n}\n\n.headerTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Right-aligned headers stay text so the ellipsis still works; centered ones\n hold a control (the select-all checkbox), so they become a flex box. */\n.headerCell[data-align=\"right\"] .headerTitle {\n text-align: right;\n}\n\n.headerCell[data-align=\"center\"] .headerTitle {\n display: flex;\n justify-content: center;\n}\n\n.headerActions {\n display: flex;\n align-items: center;\n gap: 0;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n/* Actions always reserve their width. On right-aligned columns they move to the\n leading edge so the header text stays flush with the cell values below it. */\n.headerCell[data-align=\"right\"] .headerActions {\n order: -1;\n margin-left: 0;\n margin-right: auto;\n}\n\n/* Idle actions are removed from layout, not just faded — reserving their width\n would truncate header text that otherwise fits. Indicators that must stay\n visible (active sort, active filter, open menu) set data-pinned-visible. */\n.headerAction {\n display: none;\n}\n\n.headerCell:hover .headerAction,\n.headerCell:focus-within .headerAction,\n.headerAction[data-pinned-visible=\"true\"] {\n display: flex;\n}\n\n.headerCellSortable {\n cursor: pointer;\n}\n\n/* Column reordering. The dragged header stays in place and dims — the browser\n already carries a snapshot of it under the pointer — while the header being\n dragged over draws a bar on the edge the column will land against. */\n.headerCellDragging {\n opacity: 0.4;\n}\n\n.headerCellDropBefore::before,\n.headerCellDropAfter::before {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background-color: var(--mantine-primary-color-filled);\n z-index: 5;\n pointer-events: none;\n}\n\n.headerCellDropBefore::before {\n left: 0;\n}\n\n.headerCellDropAfter::before {\n right: 0;\n}\n\n/* Doubles as the column divider seen between every header cell. */\n.columnSeparator {\n position: absolute;\n top: 25%;\n right: 0;\n height: 50%;\n width: 10px;\n transform: translateX(50%);\n display: flex;\n justify-content: center;\n z-index: 1;\n}\n\n.columnSeparatorResizable {\n cursor: col-resize;\n touch-action: none;\n}\n\n/* The divider is a hover affordance, not permanent chrome — it only appears on\n the header cell you are pointing at, or on the column being resized. */\n.columnSeparator::after {\n content: \"\";\n width: 1px;\n height: 100%;\n background-color: transparent;\n transition:\n background-color 120ms ease,\n width 120ms ease;\n}\n\n.headerCell:hover .columnSeparator::after,\n.headerCell:focus-within .columnSeparator::after {\n background-color: var(--mantine-color-default-border);\n}\n\n.columnSeparatorResizable:hover::after,\n.columnSeparatorActive::after {\n width: 2px;\n background-color: var(--mantine-primary-color-filled);\n}\n\n/* Marks the pin position a column is currently in. */\n.menuItemActive {\n background-color: var(--mantine-color-default-hover);\n font-weight: 600;\n}\n","import type { Column, ColumnPinningState } from \"@tanstack/react-table\";\nimport type { TMDataGridRowData } from \"../TMDataGridContext\";\nimport { isColumnReorderable } from \"./columnUtils\";\nimport type { TMDataGridFeatures, TMDataGridTable } from \"../useTMDataGrid\";\n\ntype GridColumn = Column<TMDataGridFeatures, TMDataGridRowData, unknown>;\ntype GridTable = TMDataGridTable<TMDataGridRowData>;\n\n/**\n * The lane a column renders in.\n *\n * Pinning splits the grid into three, and TanStack sequences them from two\n * different state slices: `columnPinning.left` / `.right` order the pinned\n * lanes, `columnOrder` orders the centre. A move therefore always stays inside\n * one lane — moving a column into another one would be a pin, not a reorder.\n */\nexport type TMDataGridColumnRegion = \"left\" | \"center\" | \"right\";\n\n/** Which edge of the column under the pointer a dragged column lands on. */\nexport type TMDataGridDropSide = \"before\" | \"after\";\n\nexport function getColumnRegion(\n columnPinning: ColumnPinningState,\n columnId: string,\n): TMDataGridColumnRegion {\n if (columnPinning.left.includes(columnId)) return \"left\";\n if (columnPinning.right.includes(columnId)) return \"right\";\n return \"center\";\n}\n\n/** Moves one id next to another, leaving every other id in place. */\nfunction moveInList(\n ids: ReadonlyArray<string>,\n movedId: string,\n targetId: string,\n side: TMDataGridDropSide,\n): Array<string> {\n const remaining = ids.filter((id) => id !== movedId);\n const targetIndex = remaining.indexOf(targetId);\n if (targetIndex === -1) return [...ids];\n remaining.splice(side === \"before\" ? targetIndex : targetIndex + 1, 0, movedId);\n return remaining;\n}\n\nexport type MoveColumnArgs = {\n table: GridTable;\n /** Column being moved. */\n columnId: string;\n /** Column it was dropped on. */\n targetId: string;\n side: TMDataGridDropSide;\n};\n\n/**\n * Moves a column next to another one. A no-op when the two are in different\n * pinned regions, or when either id is unknown.\n *\n * `columnOrder` is always written as the full leaf order, including hidden and\n * pinned columns, so a column keeps its place when it is later shown or\n * unpinned. Pinned lanes are read from `columnPinning`, so a move inside one\n * updates that array as well.\n */\nexport function moveColumn({\n table,\n columnId,\n targetId,\n side,\n}: MoveColumnArgs): void {\n if (columnId === targetId) return;\n\n const columnPinning = table.store.state.columnPinning;\n const region = getColumnRegion(columnPinning, columnId);\n if (region !== getColumnRegion(columnPinning, targetId)) return;\n\n const leafIds = table.getAllLeafColumns().map((column) => column.id);\n table.setColumnOrder(moveInList(leafIds, columnId, targetId, side));\n\n if (region !== \"center\") {\n table.setColumnPinning((previous) => ({\n ...previous,\n [region]: moveInList(previous[region], columnId, targetId, side),\n }));\n }\n}\n\n/** Visible leaf columns of one lane, in the order they render. */\nfunction getRegionColumns(\n table: GridTable,\n region: TMDataGridColumnRegion,\n): Array<GridColumn> {\n if (region === \"left\") return table.getLeftVisibleLeafColumns();\n if (region === \"right\") return table.getRightVisibleLeafColumns();\n return table.getCenterVisibleLeafColumns();\n}\n\nexport type ColumnStepArgs = {\n table: GridTable;\n columnId: string;\n /** `-1` moves towards the start of the lane, `1` towards its end. */\n direction: -1 | 1;\n};\n\n/**\n * The column a single step would swap with, or `null` when there is none.\n *\n * A neighbour that cannot be reordered acts as a wall rather than being skipped\n * — that is what keeps the checkbox column anchored at the start of the left\n * lane. Use it to enable or disable a \"move\" control.\n */\nexport function getStepTargetColumn({\n table,\n columnId,\n direction,\n}: ColumnStepArgs): GridColumn | null {\n const region = getColumnRegion(table.store.state.columnPinning, columnId);\n const columns = getRegionColumns(table, region);\n const index = columns.findIndex((column) => column.id === columnId);\n if (index === -1) return null;\n\n const target = columns[index + direction];\n if (!target || !isColumnReorderable(target)) return null;\n return target;\n}\n\n/** Moves a column one position within its lane. Hidden columns are stepped over. */\nexport function moveColumnByStep({\n table,\n columnId,\n direction,\n}: ColumnStepArgs): void {\n const target = getStepTargetColumn({ table, columnId, direction });\n if (!target) return;\n\n moveColumn({\n table,\n columnId,\n targetId: target.id,\n side: direction === -1 ? \"before\" : \"after\",\n });\n}\n","import { ActionIcon, Menu, Tooltip } from \"@mantine/core\";\nimport { flexRender, type Header } from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { shallow } from \"@tanstack/store\";\nimport { type DragEvent, type ReactNode, useRef, useState } from \"react\";\nimport classes from \"./TMDataGridHeaderCell.module.css\";\nimport sticky from \"./sticky.module.css\";\nimport {\n type TMDataGridRowData,\n useTMDataGridContext,\n} from \"../TMDataGridContext\";\nimport type { TMDataGridColumnLayout } from \"./TMDataGridTable\";\nimport { getColumnCapabilities, getGridCapabilities } from \"../core/capabilities\";\nimport {\n getColumnRegion,\n getStepTargetColumn,\n moveColumn,\n moveColumnByStep,\n type TMDataGridDropSide,\n} from \"../core/columnOrdering\";\nimport { getColumnAlign, getColumnLabel } from \"../core/columnUtils\";\nimport { isFilterActive } from \"../core/filterOperators\";\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n CollapseAllIcon,\n ColumnsIcon,\n DotsVerticalIcon,\n ExpandAllIcon,\n EyeOffIcon,\n FilterIcon,\n GroupIcon,\n MoveLeftIcon,\n MoveRightIcon,\n PinLeftIcon,\n PinOffIcon,\n PinRightIcon,\n UngroupIcon,\n} from \"./icons\";\nimport { GROUP_COLUMN_ID } from \"./TMDataGridGroupColumn\";\nimport { SELECT_COLUMN_ID } from \"./TMDataGridSelectColumn\";\nimport { type TMDataGridFeatures, openColumnFilter } from \"../useTMDataGrid\";\n\nexport type TMDataGridHeader = Header<\n TMDataGridFeatures,\n TMDataGridRowData,\n unknown\n>;\n\nexport function TMDataGridHeaderCell({\n header,\n layout,\n}: {\n header: TMDataGridHeader;\n layout: TMDataGridColumnLayout;\n}) {\n const api = useTMDataGridContext();\n const { table, features } = api;\n const column = header.column;\n const [menuOpened, setMenuOpened] = useState(false);\n const [dropSide, setDropSide] = useState<TMDataGridDropSide | null>(null);\n const cellRef = useRef<HTMLDivElement>(null);\n // A resize drag ends with a click that bubbles to the header — without this\n // every resize would also toggle the column's sort order.\n const suppressSortRef = useRef(false);\n\n // Subscribing to the slices this cell renders from keeps it live even when the\n // surrounding tree is memoized (React Compiler) or the table lives elsewhere.\n // `columnOrder` is in the list because the move menu items are derived from\n // the column's neighbours, which is exactly what an order change invalidates.\n const { sorting, columnFilters, resizingColumnId, columnPinning, grouping } =\n useSelector(\n table.store,\n (state) => ({\n sorting: state.sorting,\n columnFilters: state.columnFilters,\n resizingColumnId: state.columnResizing.isResizingColumn,\n columnPinning: state.columnPinning,\n columnOrder: state.columnOrder,\n grouping: state.grouping,\n }),\n { compare: shallow },\n );\n const draggedColumnId = useSelector(api.ui, (state) => state.draggedColumnId);\n\n const isLeaf = header.subHeaders.length === 0;\n const label = getColumnLabel(column);\n const align = getColumnAlign(column);\n const sortDirection = sorting.find((sort) => sort.id === column.id)?.desc;\n const isSorted = sortDirection !== undefined;\n const isFiltered = columnFilters.some(\n (filter) => filter.id === column.id && isFilterActive(filter.value),\n );\n const isResizing = resizingColumnId === column.id;\n const pinnedAt = layout.pinnedAt;\n\n // Every affordance below mirrors a TanStack capability check, so switching a\n // feature off through the table options removes the markup with it.\n const capabilities = getColumnCapabilities(column, features);\n const canSort = isLeaf && capabilities.canSort;\n const canFilter = isLeaf && capabilities.canFilter;\n const canHide = isLeaf && capabilities.canHide;\n const canPin = isLeaf && capabilities.canPin;\n const canResize = capabilities.canResize;\n const canReorder = isLeaf && capabilities.canReorder;\n const canGroup = isLeaf && capabilities.canGroup;\n const canManageColumns =\n isLeaf && getGridCapabilities(table, features).canHideAny;\n\n // Read off the subscribed slice, not from `column.getIsGrouped()`: that is a\n // call on a `column` whose identity survives a grouping change, so the React\n // Compiler would cache the answer and the menu would keep offering to group\n // a column that already is. Same reason the sort and filter flags above are\n // derived from state rather than from `getIsSorted()`.\n const isGrouped = grouping.includes(column.id);\n const isGroupingActive = grouping.length > 0;\n\n // A column only moves inside its own pinned lane, so a header in another one\n // never lights up as a target. See TMDataGridColumnRegion.\n const isDragged = draggedColumnId === column.id;\n const isDropTarget =\n canReorder &&\n draggedColumnId !== null &&\n !isDragged &&\n getColumnRegion(columnPinning, draggedColumnId) ===\n getColumnRegion(columnPinning, column.id);\n\n function handleDragStart(event: DragEvent<HTMLDivElement>) {\n event.dataTransfer.effectAllowed = \"move\";\n // Some browsers refuse to start a drag with an empty payload.\n event.dataTransfer.setData(\"text/plain\", column.id);\n api.ui.actions.startColumnDrag(column.id);\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>) {\n if (!isDropTarget) return;\n // Only a prevented dragover marks an element as a drop target.\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n const bounds = cellRef.current?.getBoundingClientRect();\n if (!bounds) return;\n setDropSide(\n event.clientX < bounds.left + bounds.width / 2 ? \"before\" : \"after\",\n );\n }\n\n function handleDragLeave(event: DragEvent<HTMLDivElement>) {\n // dragleave also fires when the pointer crosses into a child element.\n const next = event.relatedTarget;\n if (next instanceof Node && event.currentTarget.contains(next)) return;\n setDropSide(null);\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>) {\n event.preventDefault();\n setDropSide(null);\n api.ui.actions.endColumnDrag();\n if (!isDropTarget || !dropSide || !draggedColumnId) return;\n moveColumn({\n table,\n columnId: draggedColumnId,\n targetId: column.id,\n side: dropSide,\n });\n }\n\n function handleDragEnd() {\n setDropSide(null);\n api.ui.actions.endColumnDrag();\n }\n\n /**\n * Pinned columns are positioned with `getStart()` / `getAfter()`, which sum\n * `column.getSize()`. Fluid (`fr`) columns don't report their rendered width\n * there, so freeze the measured width into `columnSizing` as we pin — that\n * keeps the column looking the same and keeps the offsets exact.\n */\n function setPinned(position: \"left\" | \"right\" | false) {\n if (position && !(column.id in table.store.state.columnSizing)) {\n const width = cellRef.current?.getBoundingClientRect().width;\n if (width) {\n table.setColumnSizing((prev) => ({\n ...prev,\n [column.id]: Math.round(width),\n }));\n }\n }\n column.pin(position);\n }\n\n const menuItems: ReactNode[] = [];\n if (canSort) {\n menuItems.push(\n <Menu.Item\n key=\"sort-asc\"\n leftSection={<ArrowUpIcon size={16} stroke={1.6} />}\n onClick={() => column.toggleSorting(false)}\n >\n Sort by ASC\n </Menu.Item>,\n <Menu.Item\n key=\"sort-desc\"\n leftSection={<ArrowDownIcon size={16} stroke={1.6} />}\n onClick={() => column.toggleSorting(true)}\n >\n Sort by DESC\n </Menu.Item>,\n <Menu.Divider key=\"sort-divider\" />,\n );\n }\n if (canFilter) {\n menuItems.push(\n <Menu.Item\n key=\"filter\"\n leftSection={<FilterIcon size={16} stroke={1.6} />}\n onClick={() => openColumnFilter(api, column.id)}\n >\n Filter\n </Menu.Item>,\n <Menu.Divider key=\"filter-divider\" />,\n );\n }\n if (canGroup) {\n menuItems.push(\n <Menu.Item\n key=\"group\"\n className={isGrouped ? classes.menuItemActive : undefined}\n leftSection={\n isGrouped ? (\n <UngroupIcon size={16} stroke={1.6} />\n ) : (\n <GroupIcon size={16} stroke={1.6} />\n )\n }\n onClick={column.getToggleGroupingHandler()}\n >\n {isGrouped ? `Ungroup ${label}` : `Group by ${label}`}\n </Menu.Item>,\n );\n }\n if (isGroupingActive) {\n // Under the default `groupedColumnMode: \"remove\"` a grouped column is taken\n // out of the grid, so its own header — and the Ungroup item on it — is no\n // longer reachable. The tree column that replaced it carries them instead,\n // which is also where someone would look for them.\n if (column.id === GROUP_COLUMN_ID) {\n for (const groupedId of grouping) {\n const groupedColumn = table.getColumn(groupedId);\n if (!groupedColumn) continue;\n menuItems.push(\n <Menu.Item\n key={`ungroup-${groupedId}`}\n leftSection={<UngroupIcon size={16} stroke={1.6} />}\n onClick={() => groupedColumn.toggleGrouping()}\n >\n {`Ungroup ${getColumnLabel(groupedColumn)}`}\n </Menu.Item>,\n );\n }\n }\n menuItems.push(\n <Menu.Item\n key=\"expand-all\"\n leftSection={<ExpandAllIcon size={16} stroke={1.6} />}\n onClick={() => table.toggleAllRowsExpanded(true)}\n >\n Expand all groups\n </Menu.Item>,\n <Menu.Item\n key=\"collapse-all\"\n leftSection={<CollapseAllIcon size={16} stroke={1.6} />}\n onClick={() => table.toggleAllRowsExpanded(false)}\n >\n Collapse all groups\n </Menu.Item>,\n );\n }\n if (canGroup || isGroupingActive) {\n menuItems.push(<Menu.Divider key=\"group-divider\" />);\n }\n if (canPin) {\n menuItems.push(\n <Menu.Item\n key=\"pin-left\"\n className={pinnedAt === \"left\" ? classes.menuItemActive : undefined}\n leftSection={<PinLeftIcon size={16} stroke={1.6} />}\n onClick={() => setPinned(pinnedAt === \"left\" ? false : \"left\")}\n >\n Pin to left\n </Menu.Item>,\n <Menu.Item\n key=\"pin-right\"\n className={pinnedAt === \"right\" ? classes.menuItemActive : undefined}\n leftSection={<PinRightIcon size={16} stroke={1.6} />}\n onClick={() => setPinned(pinnedAt === \"right\" ? false : \"right\")}\n >\n Pin to right\n </Menu.Item>,\n );\n if (pinnedAt) {\n menuItems.push(\n <Menu.Item\n key=\"unpin\"\n leftSection={<PinOffIcon size={16} stroke={1.6} />}\n onClick={() => setPinned(false)}\n >\n Unpin\n </Menu.Item>,\n );\n }\n menuItems.push(<Menu.Divider key=\"pin-divider\" />);\n }\n if (canReorder) {\n // The keyboard path to reordering, and the discoverable one — a header you\n // can drag looks no different from one you cannot.\n const previous = getStepTargetColumn({\n table,\n columnId: column.id,\n direction: -1,\n });\n const next = getStepTargetColumn({\n table,\n columnId: column.id,\n direction: 1,\n });\n if (previous || next) {\n menuItems.push(\n <Menu.Item\n key=\"move-left\"\n disabled={!previous}\n leftSection={<MoveLeftIcon size={16} stroke={1.6} />}\n onClick={() =>\n moveColumnByStep({ table, columnId: column.id, direction: -1 })\n }\n >\n Move left\n </Menu.Item>,\n <Menu.Item\n key=\"move-right\"\n disabled={!next}\n leftSection={<MoveRightIcon size={16} stroke={1.6} />}\n onClick={() =>\n moveColumnByStep({ table, columnId: column.id, direction: 1 })\n }\n >\n Move right\n </Menu.Item>,\n <Menu.Divider key=\"move-divider\" />,\n );\n }\n }\n if (canHide) {\n menuItems.push(\n <Menu.Item\n key=\"hide\"\n leftSection={<EyeOffIcon size={16} stroke={1.6} />}\n onClick={() => column.toggleVisibility(false)}\n >\n Hide column\n </Menu.Item>,\n );\n }\n if (canManageColumns) {\n menuItems.push(\n <Menu.Item\n key=\"manage\"\n leftSection={<ColumnsIcon size={16} stroke={1.6} />}\n onClick={() => api.ui.actions.setColumnsPanelOpen(true)}\n >\n Manage columns\n </Menu.Item>,\n );\n }\n // A trailing divider reads as a dropped item — drop the divider instead.\n while (menuItems.length > 0 && isDivider(menuItems.at(-1))) {\n menuItems.pop();\n }\n\n const cellClass = [\n classes.headerCell,\n canSort ? classes.headerCellSortable : \"\",\n isDragged ? classes.headerCellDragging : \"\",\n dropSide === \"before\" ? classes.headerCellDropBefore : \"\",\n dropSide === \"after\" ? classes.headerCellDropAfter : \"\",\n layout.isBoundary && pinnedAt === \"left\" ? sticky.stickyLeft : \"\",\n layout.isBoundary && pinnedAt === \"right\" ? sticky.stickyRight : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={cellRef}\n role=\"columnheader\"\n data-testid={`dg-header-${column.id}`}\n data-active={isSorted || isFiltered}\n data-align={align}\n // The checkbox lane is a fixed track, so it cannot take the cell padding\n // the scale grows for text. See TMDataGridHeaderCell.module.css.\n data-select-column={column.id === SELECT_COLUMN_ID}\n // Only meaningful on a sortable column: \"none\" advertises that this\n // header sorts, which is a lie on one that doesn't.\n aria-sort={\n canSort\n ? isSorted\n ? sortDirection\n ? \"descending\"\n : \"ascending\"\n : \"none\"\n : undefined\n }\n className={cellClass}\n // Dropped while a resize is running, so that dragging the separator\n // resizes the column instead of starting to move it. The resize handler\n // records the column on mousedown, before the first pointer move.\n draggable={canReorder && !isResizing}\n onDragStart={canReorder ? handleDragStart : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n onDragOver={isDropTarget ? handleDragOver : undefined}\n onDragLeave={isDropTarget ? handleDragLeave : undefined}\n onDrop={isDropTarget ? handleDrop : undefined}\n style={{\n left: pinnedAt === \"left\" ? layout.offset : undefined,\n right: pinnedAt === \"right\" ? layout.offset : undefined,\n position: pinnedAt ? \"sticky\" : undefined,\n zIndex: pinnedAt ? 4 : undefined,\n }}\n onClick={\n canSort\n ? (event) => {\n if (suppressSortRef.current) {\n suppressSortRef.current = false;\n return;\n }\n column.getToggleSortingHandler()?.(event);\n }\n : undefined\n }\n >\n {header.isPlaceholder ? null : (\n <Tooltip label={label} openDelay={600} withinPortal disabled={!isLeaf}>\n <span className={classes.headerTitle}>\n {flexRender(column.columnDef.header, header.getContext())}\n </span>\n </Tooltip>\n )}\n\n {isLeaf && (\n <div className={classes.headerActions}>\n {isFiltered && (\n <ActionIcon\n className={classes.headerAction}\n data-pinned-visible=\"true\"\n variant=\"subtle\"\n color=\"gray\"\n size=\"xs\"\n aria-label={`Filter on ${label}`}\n onClick={(event) => {\n event.stopPropagation();\n openColumnFilter(api, column.id);\n }}\n >\n <FilterIcon size={14} stroke={1.6} />\n </ActionIcon>\n )}\n\n {canSort && (\n <ActionIcon\n className={classes.headerAction}\n data-pinned-visible={isSorted}\n variant=\"subtle\"\n color=\"gray\"\n size=\"xs\"\n aria-label={`Sort ${label}`}\n onClick={column.getToggleSortingHandler()}\n >\n {sortDirection ? (\n <ArrowDownIcon size={14} stroke={1.6} />\n ) : (\n <ArrowUpIcon size={14} stroke={1.6} />\n )}\n </ActionIcon>\n )}\n\n {menuItems.length > 0 && column.id !== SELECT_COLUMN_ID && (\n <Menu\n opened={menuOpened}\n onChange={setMenuOpened}\n position=\"bottom-start\"\n shadow=\"md\"\n width={220}\n withinPortal\n >\n <Menu.Target>\n <ActionIcon\n className={classes.headerAction}\n data-pinned-visible={menuOpened}\n variant=\"subtle\"\n color=\"gray\"\n size=\"xs\"\n aria-label={`${label} column menu`}\n onClick={(event) => {\n event.stopPropagation();\n setMenuOpened((opened) => !opened);\n }}\n >\n <DotsVerticalIcon size={14} stroke={1.6} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown onClick={(event) => event.stopPropagation()}>\n {menuItems}\n </Menu.Dropdown>\n </Menu>\n )}\n </div>\n )}\n\n <div\n className={[\n classes.columnSeparator,\n canResize ? classes.columnSeparatorResizable : \"\",\n isResizing ? classes.columnSeparatorActive : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n // Keeps a drag that starts on the separator from being picked up by the\n // draggable header around it.\n draggable={false}\n onMouseDown={\n canResize\n ? (event) => {\n suppressSortRef.current = true;\n header.getResizeHandler()(event);\n }\n : undefined\n }\n onTouchStart={canResize ? header.getResizeHandler() : undefined}\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n );\n}\n\nfunction isDivider(node: ReactNode): boolean {\n return (\n typeof node === \"object\" &&\n node !== null &&\n \"type\" in node &&\n node.type === Menu.Divider\n );\n}\n","import { Loader, Menu, type MenuProps, Text } from \"@mantine/core\";\nimport {\n type Cell,\n flexRender,\n type Row,\n type RowData,\n type Table,\n} from \"@tanstack/react-table\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport {\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport classes from \"./TMDataGridTable.module.css\";\nimport sticky from \"./sticky.module.css\";\nimport { type TMDataGridRowData, useTMDataGridContext } from \"../TMDataGridContext\";\nimport { TMDataGridFilterPanel } from \"./TMDataGridFilterPanel\";\nimport { TMDataGridHeaderCell } from \"./TMDataGridHeaderCell\";\nimport { getColumnAlign } from \"../core/columnUtils\";\nimport {\n getDisplayedRows,\n resolveRowSelectionClick,\n} from \"../core/rowSelection\";\nimport { SearchIcon } from \"./icons\";\nimport { SELECT_COLUMN_ID } from \"./TMDataGridSelectColumn\";\nimport type { TMDataGridFeatures } from \"../useTMDataGrid\";\n\n/** Where a column sits relative to the pinned regions, resolved once per render. */\nexport type TMDataGridColumnLayout = {\n pinnedAt: \"left\" | \"right\" | false;\n /** Distance in px from the grid's left or right edge. */\n offset: number;\n /** Last left-pinned / first right-pinned column — the one that casts the edge. */\n isBoundary: boolean;\n};\n\nconst UNPINNED_LAYOUT: TMDataGridColumnLayout = {\n pinnedAt: false,\n offset: 0,\n isBoundary: false,\n};\n\n/**\n * What a cell shows once grouping is in play.\n *\n * A group row carries a cell for every column, but only some of them have\n * anything to say:\n *\n * | Cell | Renders |\n * | ---- | ------- |\n * | On a data row | the column's `cell`, as always |\n * | Placeholder — a grouped column other than this row's own | nothing |\n * | Aggregated, column declares `aggregatedCell` | that |\n * | Aggregated, column declares an `aggregationFn` | the column's `cell`, over the aggregate |\n * | Aggregated, column declares neither | nothing |\n *\n * That last row is the one worth spelling out. Without an aggregation function\n * `getValue()` is `undefined` on a group row, so the column's own renderer\n * would be handed nothing — and a renderer that formats what it gets\n * (`value.toFixed(2)`) would throw. Blank is both the safe answer and the right\n * one: a plain \"group by\" is a tree, not a summary, and a column only joins in\n * once it has been told how.\n */\nfunction renderCellContent(\n cell: Cell<TMDataGridFeatures, TMDataGridRowData, unknown>,\n) {\n if (cell.getIsPlaceholder()) return null;\n if (!cell.getIsAggregated()) {\n return flexRender(cell.column.columnDef.cell, cell.getContext());\n }\n const { aggregatedCell, aggregationFn } = cell.column.columnDef;\n if (aggregatedCell !== undefined) {\n return flexRender(aggregatedCell, cell.getContext());\n }\n if (aggregationFn === undefined) return null;\n return flexRender(cell.column.columnDef.cell, cell.getContext());\n}\n\nfunction TMDataGridBodyCell({\n cell,\n rowHeight,\n layout,\n onContextMenu,\n}: {\n cell: Cell<TMDataGridFeatures, TMDataGridRowData, unknown>;\n rowHeight: number;\n layout: TMDataGridColumnLayout;\n onContextMenu?: (event: MouseEvent<HTMLDivElement>) => void;\n}) {\n return (\n <div\n role=\"cell\"\n data-align={getColumnAlign(cell.column)}\n // The checkbox lane is a fixed track, so it cannot take the cell padding\n // the scale grows for text. See TMDataGridTable.module.css.\n data-select-column={cell.column.id === SELECT_COLUMN_ID}\n onContextMenu={onContextMenu}\n className={[\n classes.bodyCell,\n layout.isBoundary && layout.pinnedAt === \"left\" ? sticky.stickyLeft : \"\",\n layout.isBoundary && layout.pinnedAt === \"right\"\n ? sticky.stickyRight\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n minHeight: rowHeight,\n left: layout.pinnedAt === \"left\" ? layout.offset : undefined,\n right: layout.pinnedAt === \"right\" ? layout.offset : undefined,\n position: layout.pinnedAt ? \"sticky\" : undefined,\n zIndex: layout.pinnedAt ? 2 : undefined,\n }}\n >\n <span className={classes.cellContent}>{renderCellContent(cell)}</span>\n </div>\n );\n}\n\n/**\n * The virtualized body rows, wrapped in the single Menu that serves all of them\n * when `rowContextMenu` is set.\n *\n * One instance for the whole body rather than one per row. A Mantine `Menu` is\n * a `Popover`, and a closed Popover still runs its hooks on every render — and\n * the body re-renders on every scroll frame, because that is how virtualization\n * works. Wrapping each of ~20 mounted rows measured a fifth onto a body render;\n * wrapping the group is the same behaviour for one instance.\n *\n * `display: contents` keeps the group out of the grid's layout while still\n * taking the right-click, carrying `Menu.ContextMenu`'s handlers, and passing\n * its inherited `user-select: none` down to the rows.\n */\nfunction TMDataGridBodyRowGroup({\n enabled,\n menuContent,\n menuProps,\n onContextMenu,\n onClose,\n children,\n}: {\n enabled: boolean;\n menuContent: ReactNode;\n menuProps?: Omit<MenuProps, \"opened\" | \"onChange\" | \"children\">;\n onContextMenu: () => void;\n onClose: () => void;\n children: ReactNode;\n}) {\n const rowGroup = (\n <div\n role=\"rowgroup\"\n style={{ display: \"contents\" }}\n // Runs before Mantine's own handler, which `Menu.ContextMenu` composes on\n // top of this one — so the row and cell are known by the time the\n // dropdown is built and opened at the pointer.\n onContextMenu={enabled ? onContextMenu : undefined}\n >\n {children}\n </div>\n );\n\n if (!enabled) return rowGroup;\n\n return (\n <Menu\n // Open only once the render prop has returned something: a row it answers\n // `null` for never opens an empty dropdown.\n opened={menuContent !== null}\n onChange={(opened) => {\n if (!opened) onClose();\n }}\n position=\"bottom-start\"\n shadow=\"md\"\n width={220}\n {...menuProps}\n >\n <Menu.ContextMenu>{rowGroup}</Menu.ContextMenu>\n <Menu.Dropdown>{menuContent}</Menu.Dropdown>\n </Menu>\n );\n}\n\n/** What a `rowContextMenu` render prop is handed for the right-clicked row. */\nexport type TMDataGridRowContextMenuArgs<TData extends RowData> = {\n table: Table<TMDataGridFeatures, TData>;\n row: Row<TMDataGridFeatures, TData>;\n /**\n * The cell under the pointer. `null` only when the right-click landed on the\n * row but on no cell — which a custom cell renderer that stops propagation\n * can cause.\n */\n cell: Cell<TMDataGridFeatures, TData, unknown> | null;\n /**\n * Closes the menu. `Menu.Item` already closes on click (Mantine's\n * `closeOnItemClick`), so this is for content that isn't a menu item.\n */\n close: () => void;\n};\n\n/**\n * Builds the contents of a row's context menu — `Menu.Item`, `Menu.Label`,\n * `Menu.Divider`, `Menu.Sub`, or any other node. The grid owns the `Menu` and\n * its `Menu.Dropdown`; this fills the dropdown.\n */\nexport type TMDataGridRowContextMenu<TData extends RowData> = (\n args: TMDataGridRowContextMenuArgs<TData>,\n) => ReactNode;\n\nexport type TMDataGridTableProps<TData extends RowData> = {\n /**\n * Called when a body row is clicked. Runs in addition to row selection under\n * `selectionMode: \"row\"`, not instead of it.\n */\n onRowClick?: (row: Row<TMDataGridFeatures, TData>) => void;\n /**\n * Contents of the menu a right-click on a row opens, at the pointer. Return\n * `null` to leave a row without one — the browser's own menu stays suppressed\n * either way.\n *\n * ```tsx\n * <TMDataGrid.Table<Employee>\n * rowContextMenu={({ row, close }) => (\n * <>\n * <Menu.Label>{row.original.firstName}</Menu.Label>\n * <Menu.Item onClick={() => open(row.original.id)}>Open</Menu.Item>\n * <Menu.Divider />\n * <Menu.Item color=\"red\" onClick={() => remove(row.original.id)}>\n * Delete\n * </Menu.Item>\n * </>\n * )}\n * />\n * ```\n *\n * Called during render, and only for the row whose menu is open — so it stays\n * a pure function of the row, and cost per row does not matter.\n */\n rowContextMenu?: TMDataGridRowContextMenu<TData>;\n /**\n * Passed to the Mantine `Menu` the grid wraps the row in — `width`, `shadow`,\n * `position`, `transitionProps` and the rest. Its open state is the grid's.\n */\n rowContextMenuProps?: Omit<MenuProps, \"opened\" | \"onChange\" | \"children\">;\n};\n\n/**\n * The scrollable grid surface. Always virtualized: only the rows inside the\n * viewport (plus overscan) are mounted — which is what makes the default\n * no-pagination mode viable at any row count. Pagination is opt-in via\n * `enablePagination` (or implied by `manualPagination`).\n */\nexport function TMDataGridTable<TData extends RowData = TMDataGridRowData>({\n onRowClick,\n rowContextMenu,\n rowContextMenuProps,\n}: TMDataGridTableProps<TData>) {\n const { table, ui, features, rowHeight, controlSize } =\n useTMDataGridContext();\n\n // The body depends on every state slice (sorting, filters, paging, sizing,\n // visibility, selection), so it subscribes to the whole table store.\n useSelector(table.store);\n // The active row lives in the chrome store, so it needs its own subscription.\n const highlightedRowId = useSelector(ui, (state) => state.highlightedRowId);\n\n const { loading, noResultsLabel = \"No rows match your filters\" } =\n table.options.meta ?? {};\n\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n // Pagination off (the default): every filtered+sorted row, virtualized.\n // Pagination on: the current page; under `manualPagination` TanStack returns\n // the rows as delivered, so the same branch serves server paging.\n const rows = getDisplayedRows(table, features);\n\n // A persisted pageIndex can outlive the data that produced it; TanStack only\n // auto-resets on live filter/sort/data changes, not on restored state. The\n // guard makes the dependency-free effect idempotent.\n useEffect(() => {\n if (!features.pagination) return;\n const pageCount = table.getPageCount();\n if (pageCount > 0 && table.store.state.pagination.pageIndex >= pageCount) {\n table.setPageIndex(pageCount - 1);\n }\n });\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: useCallback(() => rowHeight, [rowHeight]),\n getItemKey: useCallback((index: number) => rows[index]?.id ?? index, [rows]),\n overscan: 6,\n initialRect: { height: 600, width: 1200 },\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualizer.getTotalSize() - (virtualItems.at(-1)?.end ?? 0);\n\n // The *Visible* variants throughout: `getLeftLeafColumns()` and friends\n // include hidden columns, while the cells below come from\n // `row.getLeftVisibleCells()`, which does not. Mixing the two would lay down\n // a grid track for a column that renders no cell, shifting every column after\n // it out of its header. The tree column is hidden exactly this way while\n // nothing is grouped.\n const leftLeafColumns = table.getLeftVisibleLeafColumns();\n const rightLeafColumns = table.getRightVisibleLeafColumns();\n const centerLeafColumns = table.getCenterVisibleLeafColumns();\n\n const orderedColumns = [\n ...leftLeafColumns,\n ...centerLeafColumns,\n ...rightLeafColumns,\n ];\n\n // Headers and cells must follow the same left → center → right order as the\n // column tracks, otherwise pinning a column would shuffle it out of its lane.\n const centerHeaderGroups = table.getCenterHeaderGroups();\n const leftHeaderGroups = table.getLeftHeaderGroups();\n const rightHeaderGroups = table.getRightHeaderGroups();\n const headerGroups = centerHeaderGroups.map((group, index) => ({\n id: group.id,\n headers: [\n ...(leftHeaderGroups[index]?.headers ?? []),\n ...group.headers,\n ...(rightHeaderGroups[index]?.headers ?? []),\n ],\n }));\n // Unresized columns stay fluid (`minmax(min, flex fr)`) so the grid fills the\n // viewport; dragging a resize handle pins that column to an exact pixel width.\n // minWidth is the sum of those floors — anything wider and the grid would\n // force a horizontal scrollbar it doesn't need.\n //\n // Pinned columns are always exact: their sticky offsets come from\n // `getStart()` / `getAfter()`, which sum `getSize()` and cannot see an `fr`.\n const columnSizing = table.store.state.columnSizing;\n const columnTracks = orderedColumns.map((column) => {\n const isFixed = column.columnDef.minSize === column.columnDef.maxSize;\n const isResized = column.id in columnSizing;\n const isPinned = column.getIsPinned() !== false;\n const minWidth = column.columnDef.minSize ?? 80;\n if (isFixed || isResized || isPinned) {\n return { track: `${column.getSize()}px`, minWidth: column.getSize() };\n }\n return {\n track: `minmax(${minWidth}px, ${column.columnDef.meta?.flex ?? 1}fr)`,\n minWidth,\n };\n });\n const gridTemplateColumns = columnTracks.map((c) => c.track).join(\" \");\n const gridMinWidth = columnTracks.reduce((sum, c) => sum + c.minWidth, 0);\n\n /**\n * Sticky offsets are derived here, from state this component subscribes to,\n * and handed down as props.\n *\n * Deriving them inside the cell via `column.getIsPinned()` /\n * `column.getStart()` looks equivalent but isn't: those are plain calls on a\n * `column` object whose identity survives a pin, so the React Compiler caches\n * the result and the cell keeps rendering with stale pinning. Building the\n * offsets from the same widths as the grid tracks also guarantees the two\n * agree to the pixel.\n */\n const columnLayout = new Map<string, TMDataGridColumnLayout>();\n const widthOf = (columnId: string) =>\n columnTracks[orderedColumns.findIndex((c) => c.id === columnId)]?.minWidth ??\n 0;\n\n let leftOffset = 0;\n for (const column of leftLeafColumns) {\n columnLayout.set(column.id, {\n pinnedAt: \"left\",\n offset: leftOffset,\n isBoundary: column.id === leftLeafColumns.at(-1)?.id,\n });\n leftOffset += widthOf(column.id);\n }\n let rightOffset = 0;\n for (const column of [...rightLeafColumns].reverse()) {\n columnLayout.set(column.id, {\n pinnedAt: \"right\",\n offset: rightOffset,\n isBoundary: column.id === rightLeafColumns[0]?.id,\n });\n rightOffset += widthOf(column.id);\n }\n for (const column of centerLeafColumns) {\n columnLayout.set(column.id, {\n pinnedAt: false,\n offset: 0,\n isBoundary: false,\n });\n }\n const layoutFor = (columnId: string) =>\n columnLayout.get(columnId) ?? UNPINNED_LAYOUT;\n\n const isEmpty = rows.length === 0;\n\n // \"row\" mode: the row itself is the selection control, with the modifier\n // conventions of any desktop list — see resolveRowSelectionClick.\n const selectsOnRowClick = features.rowClickSelects;\n const rowIsInteractive =\n selectsOnRowClick || features.highlightRow || onRowClick !== undefined;\n\n /**\n * Group rows sit out every row-level gesture.\n *\n * Not squeamishness: TanStack builds a group row on top of its first leaf's\n * record (`constructRow(table, id, leafRows[0].original, …)`), so an\n * `onRowClick` firing here would hand a consumer a real-looking row that is\n * the wrong one — a detail panel would open on an arbitrary child. The same\n * goes for the highlight, which is what a detail panel follows.\n *\n * Selecting a group is still possible, through its checkbox, which resolves\n * to the descendants rather than to the group itself. See\n * getSelectableRowIds.\n */\n const rowGesturesFor = (row: Row<TMDataGridFeatures, TMDataGridRowData>) =>\n row.getIsGrouped() ? false : rowIsInteractive;\n\n const handleRowActivate = (\n row: Row<TMDataGridFeatures, TMDataGridRowData>,\n modifiers: { toggle: boolean; extend: boolean },\n ) => {\n if (selectsOnRowClick && row.getCanSelect()) {\n const resolved = resolveRowSelectionClick({\n rows,\n rowId: row.id,\n anchorRowId: ui.state.selectionAnchorRowId,\n modifiers,\n selection: table.store.state.rowSelection,\n canReplaceSelection: true,\n });\n table.setRowSelection(resolved.selection);\n ui.actions.setSelectionAnchor(resolved.anchorRowId);\n }\n // Set, never toggle: a second click on the highlighted row must not close\n // the detail panel showing it. Clearing is\n // `ui.actions.setHighlightedRow(null)`.\n if (features.highlightRow) ui.actions.setHighlightedRow(row.id);\n onRowClick?.(row as unknown as Row<TMDataGridFeatures, TData>);\n };\n\n // Which row's context menu is open, and which cell it was opened from.\n const [contextMenuTarget, setContextMenuTarget] = useState<{\n rowId: string;\n columnId: string | null;\n } | null>(null);\n const closeContextMenu = () => setContextMenuTarget(null);\n\n // Row and cell each record themselves on the way up, so that by the time the\n // rowgroup's handler opens the menu it knows what was hit. Refs rather than\n // state: written and read inside the same event, before the render it causes.\n const contextMenuRowRef = useRef<string | null>(null);\n const contextMenuColumnRef = useRef<string | null>(null);\n\n const handleContextMenu = () => {\n const rowId = contextMenuRowRef.current;\n const columnId = contextMenuColumnRef.current;\n contextMenuRowRef.current = null;\n contextMenuColumnRef.current = null;\n setContextMenuTarget(rowId === null ? null : { rowId, columnId });\n };\n\n const contextMenuRow =\n contextMenuTarget === null\n ? undefined\n : rows.find((row) => row.id === contextMenuTarget.rowId);\n\n /**\n * Built for the open row only, so a consumer's render prop is called once per\n * opened menu rather than once per mounted row. `null` back from it means\n * this row has no menu, which is also how the menu stays shut.\n *\n * The casts put back the concrete row type the context boundary erased — the\n * same crossing `onRowClick` makes.\n */\n const contextMenuContent =\n rowContextMenu && contextMenuTarget && contextMenuRow\n ? rowContextMenu({\n table: table as unknown as Table<TMDataGridFeatures, TData>,\n row: contextMenuRow as unknown as Row<TMDataGridFeatures, TData>,\n cell: (contextMenuRow\n .getAllCells()\n .find((cell) => cell.column.id === contextMenuTarget.columnId) ??\n null) as unknown as Cell<TMDataGridFeatures, TData, unknown> | null,\n close: closeContextMenu,\n }) ?? null\n : null;\n\n /**\n * The dropdown is anchored to a fixed viewport point, so it does not travel\n * with the row when the body scrolls — and under virtualization the row it\n * belongs to may unmount entirely. Closing is the honest answer, and matches\n * what every desktop context menu does.\n */\n const handleScroll = contextMenuTarget ? closeContextMenu : undefined;\n\n return (\n <div className={classes.tableWrapper}>\n <div\n ref={scrollContainerRef}\n className={classes.scrollContainer}\n onScroll={handleScroll}\n >\n <div\n role=\"table\"\n className={classes.grid}\n // Virtualization means most rows are not in the DOM, so the counts\n // have to be stated rather than inferred from what is rendered. Every\n // row carries its aria-rowindex for the same reason.\n aria-rowcount={rows.length + headerGroups.length}\n aria-colcount={orderedColumns.length}\n style={{ gridTemplateColumns, minWidth: gridMinWidth }}\n >\n <div role=\"rowgroup\" style={{ display: \"contents\" }}>\n {headerGroups.map((headerGroup, groupIndex) => (\n <div\n key={headerGroup.id}\n role=\"row\"\n aria-rowindex={groupIndex + 1}\n className={classes.headerRow}\n >\n {headerGroup.headers.map((header) => (\n <TMDataGridHeaderCell\n key={header.id}\n header={header}\n layout={layoutFor(header.column.id)}\n />\n ))}\n </div>\n ))}\n </div>\n\n {paddingTop > 0 && (\n <div aria-hidden style={{ gridColumn: \"1/-1\", height: paddingTop }} />\n )}\n\n <TMDataGridBodyRowGroup\n enabled={rowContextMenu !== undefined}\n menuContent={contextMenuContent}\n menuProps={rowContextMenuProps}\n onContextMenu={handleContextMenu}\n onClose={closeContextMenu}\n >\n {virtualItems.map((virtualItem) => {\n const row = rows[virtualItem.index];\n if (!row) return null;\n const isGroupRow = row.getIsGrouped();\n const isInteractive = rowGesturesFor(row);\n const takesKeyboard =\n !isGroupRow && (selectsOnRowClick || features.highlightRow);\n return (\n <div\n key={virtualItem.key}\n role=\"row\"\n aria-rowindex={virtualItem.index + headerGroups.length + 1}\n data-testid={`dg-row-${row.id}`}\n // The tree's own rows. `data-grouped` rather than a class, to\n // match how the rest of the row's state is published — and so\n // a consumer can restyle them without reaching into modules.\n data-grouped={isGroupRow}\n data-depth={row.depth}\n // Gated on the flag, not just on `getIsSelected()`: under\n // `\"highlight\"` there is no selection, but `rowSelection` may\n // still hold ids from before the mode changed — TanStack never\n // prunes it — and a row must not report itself selected in a\n // mode where selecting is not a thing.\n data-selected={features.rowSelection && row.getIsSelected()}\n // Being selected is state; painting it is a display choice, so\n // the two are separate attributes.\n data-selected-bg={\n features.rowSelection &&\n features.showSelectedBackground &&\n row.getIsSelected()\n }\n // The highlighted row is its own concept, so its own attribute\n // pair — `data-highlighted` / `aria-current` against\n // `data-selected` / `aria-selected` for selection. Under\n // `\"checkboxAndHighlight\"` a row can carry both.\n //\n // Not `data-active`: header cells already use that for\n // sorted-or-filtered, and Mantine puts it on its own controls,\n // so a consumer styling or querying rows by it would cast far\n // wider than they meant to.\n data-highlighted={\n features.highlightRow && row.id === highlightedRowId\n }\n // The menu is anchored to the rowgroup, so Mantine's own\n // `data-expanded` lands there rather than on a row. This is\n // what says which row the open menu is about.\n data-context-menu={\n contextMenuContent !== null &&\n contextMenuTarget?.rowId === row.id\n }\n data-selects-on-click={selectsOnRowClick && !isGroupRow}\n aria-selected={\n features.rowSelection ? row.getIsSelected() : undefined\n }\n aria-current={\n features.highlightRow && row.id === highlightedRowId\n ? true\n : undefined\n }\n className={classes.bodyRow}\n style={{\n minHeight: rowHeight,\n cursor: isInteractive ? \"pointer\" : undefined,\n }}\n // Keyboard parity with the checkbox the row replaces.\n tabIndex={takesKeyboard ? 0 : undefined}\n // Shift-click extends the browser's text selection across\n // every row it passes. `user-select: none` would fix it too,\n // but at the cost of ever copying a cell value, so the smear\n // is stopped at the one gesture that causes it.\n onMouseDown={\n selectsOnRowClick && !isGroupRow\n ? (event) => {\n if (event.shiftKey) event.preventDefault();\n }\n : undefined\n }\n onClick={\n isInteractive\n ? (event) =>\n handleRowActivate(row, {\n toggle: event.ctrlKey || event.metaKey,\n extend: event.shiftKey,\n })\n : undefined\n }\n onKeyDown={\n takesKeyboard\n ? (event) => {\n if (event.key !== \" \" && event.key !== \"Enter\") return;\n if (event.target !== event.currentTarget) return;\n event.preventDefault();\n // Space/Enter toggle rather than replace, so a\n // keyboard-only user can still build a selection.\n handleRowActivate(row, {\n toggle: true,\n extend: event.shiftKey,\n });\n }\n : undefined\n }\n // Bubbles to the rowgroup, where the menu opens — so the row\n // is recorded before the dropdown is built.\n //\n // Group rows record nothing, which leaves the ref null and the\n // menu shut. Same reason they sit out `onRowClick`: TanStack\n // builds a group row on its first child's record, so a render\n // prop reaching for `row.original` would be handed a real\n // employee that has nothing to do with the group. The browser\n // menu stays suppressed over them either way.\n onContextMenu={\n rowContextMenu && !isGroupRow\n ? () => {\n contextMenuRowRef.current = row.id;\n }\n : undefined\n }\n >\n {[\n ...row.getLeftVisibleCells(),\n ...row.getCenterVisibleCells(),\n ...row.getRightVisibleCells(),\n ].map((cell) => (\n <TMDataGridBodyCell\n key={cell.id}\n cell={cell}\n rowHeight={rowHeight}\n layout={layoutFor(cell.column.id)}\n onContextMenu={\n rowContextMenu\n ? () => {\n contextMenuColumnRef.current = cell.column.id;\n }\n : undefined\n }\n />\n ))}\n </div>\n );\n })}\n </TMDataGridBodyRowGroup>\n\n {isEmpty && loading === true && (\n <div role=\"row\" className={classes.messageRow}>\n <Loader size=\"lg\" />\n </div>\n )}\n\n {isEmpty && loading !== true && (\n <div role=\"row\" className={classes.messageRow}>\n <SearchIcon size={40} stroke={1.4} opacity={0.4} />\n <Text size={controlSize} c=\"dimmed\">\n {noResultsLabel}\n </Text>\n </div>\n )}\n\n {paddingBottom > 0 && (\n <div\n aria-hidden\n style={{ gridColumn: \"1/-1\", height: paddingBottom }}\n />\n )}\n </div>\n </div>\n\n <TMDataGridFilterPanel />\n </div>\n );\n}\n",".toolbar {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-xs);\n padding: 6px var(--mantine-spacing-xs);\n min-height: 42px;\n flex-shrink: 0;\n}\n\n.toolbarSpacer {\n flex: 1;\n}\n","import { ActionIcon, Popover, Text, Tooltip } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport type { ReactNode } from \"react\";\nimport classes from \"./TMDataGridToolbar.module.css\";\nimport { TMDataGridColumnsPanel } from \"./TMDataGridColumnsPanel\";\nimport { useTMDataGridContext } from \"../TMDataGridContext\";\nimport { getGridCapabilities } from \"../core/capabilities\";\nimport { isFilterActive } from \"../core/filterOperators\";\nimport { BurgerIcon, FilterIcon } from \"./icons\";\nimport { openColumnFilter } from \"../useTMDataGrid\";\n\n/** Row above the grid. Compose it from the pieces below, or anything else. */\nexport function TMDataGridToolbar({ children }: { children?: ReactNode }) {\n return <div className={classes.toolbar}>{children}</div>;\n}\n\n/** Pushes the following toolbar items to the right. */\nexport function TMDataGridToolbarSpacer() {\n return <div className={classes.toolbarSpacer} />;\n}\n\n/**\n * Visible rows over total rows. On a server-driven grid, set\n * `meta.totalRowCount` for the denominator — the client never sees every row.\n */\nexport function TMDataGridSummaryCount({ children }: { children?: ReactNode }) {\n const { table, controlSize } = useTMDataGridContext();\n useSelector(table.store);\n\n if (children !== undefined) {\n return (\n <Text size={controlSize} c=\"dimmed\">\n {children}\n </Text>\n );\n }\n\n const shown = table.getRowCount();\n const total =\n table.options.meta?.totalRowCount ??\n table.getPreFilteredRowModel().rows.length;\n\n return (\n <Text size={controlSize} c=\"dimmed\">\n {shown} / {total}\n </Text>\n );\n}\n\n/**\n * Burger menu in the grid's top-right corner — opens \"Manage columns\".\n * Renders nothing when no column can be hidden (`enableHiding: false`).\n */\nexport function TMDataGridColumnsButton() {\n const { table, ui, features, controlSize } = useTMDataGridContext();\n const opened = useSelector(ui, (state) => state.columnsPanelOpen);\n\n if (!getGridCapabilities(table, features).canHideAny) return null;\n\n return (\n <Popover\n opened={opened}\n onChange={ui.actions.setColumnsPanelOpen}\n position=\"bottom-end\"\n shadow=\"md\"\n radius=\"md\"\n withinPortal\n trapFocus\n >\n <Popover.Target>\n <Tooltip label=\"Manage columns\" openDelay={400}>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size={controlSize}\n aria-label=\"Manage columns\"\n onClick={ui.actions.toggleColumnsPanel}\n >\n <BurgerIcon size={18} stroke={1.6} />\n </ActionIcon>\n </Tooltip>\n </Popover.Target>\n <Popover.Dropdown p={0}>\n <TMDataGridColumnsPanel />\n </Popover.Dropdown>\n </Popover>\n );\n}\n\n/**\n * Toggles the filter panel, seeding a filter row on the first filterable column.\n * Renders nothing when no column can be filtered (`enableColumnFilters: false`).\n */\nexport function TMDataGridFilterButton() {\n const api = useTMDataGridContext();\n const { table, ui, features, controlSize } = api;\n const opened = useSelector(ui, (state) => state.filterPanelOpen);\n const columnFilters = useSelector(\n table.store,\n (state) => state.columnFilters,\n );\n const activeCount = columnFilters.filter((filter) =>\n isFilterActive(filter.value),\n ).length;\n\n if (!getGridCapabilities(table, features).canFilterAny) return null;\n\n return (\n <Tooltip label=\"Filters\" openDelay={400}>\n <ActionIcon\n variant={opened || activeCount > 0 ? \"light\" : \"subtle\"}\n color={activeCount > 0 ? undefined : \"gray\"}\n size={controlSize}\n aria-label=\"Filters\"\n // Marks this as the panel's own toggle, so the panel's click-away\n // handler leaves it alone and the button stays a toggle.\n data-dg-filter-toggle\n onClick={() => {\n if (opened) {\n ui.actions.closeFilterPanel();\n return;\n }\n const firstFilterable = table\n .getAllLeafColumns()\n .find((column) => column.getCanFilter());\n if (firstFilterable) openColumnFilter(api, firstFilterable.id);\n else ui.actions.openFilterPanel();\n }}\n >\n <FilterIcon size={16} stroke={1.6} />\n </ActionIcon>\n </Tooltip>\n );\n}\n","import type { MantineSize } from \"@mantine/core\";\n\nexport type TMDataGridSize = MantineSize;\n\nexport const DEFAULT_TMDATAGRID_SIZE: TMDataGridSize = \"md\";\n\n/**\n * Row height per size, in px.\n *\n * The virtualizer needs this as a number — it cannot read the CSS variable —\n * so the scale lives here and `TMDataGrid.module.css` mirrors it. `meta.rowHeight`\n * overrides it when a grid needs a height the scale doesn't offer.\n */\nexport const SIZE_ROW_HEIGHT: Record<TMDataGridSize, number> = {\n xs: 34,\n sm: 42,\n md: 52,\n lg: 62,\n xl: 72,\n};\n\n/** Size of the Mantine controls rendered inside the grid chrome. */\nexport const SIZE_CONTROL_SIZE: Record<TMDataGridSize, MantineSize> = {\n xs: \"xs\",\n sm: \"xs\",\n md: \"sm\",\n lg: \"sm\",\n xl: \"md\",\n};\n","import type { RowData } from \"@tanstack/react-table\";\nimport { type CSSProperties, type ReactNode, useMemo } from \"react\";\nimport classes from \"./TMDataGrid.module.css\";\nimport { TMDataGridColumnsPanel } from \"./TMDataGridColumnsPanel\";\nimport { TMDataGridContextProvider } from \"../TMDataGridContext\";\nimport { TMDataGridFilterPanel } from \"./TMDataGridFilterPanel\";\nimport { TMDataGridFilterPills } from \"./TMDataGridFilterPills\";\nimport { TMDataGridFooter } from \"./TMDataGridFooter\";\nimport { TMDataGridTable } from \"./TMDataGridTable\";\nimport {\n TMDataGridColumnsButton,\n TMDataGridFilterButton,\n TMDataGridSummaryCount,\n TMDataGridToolbar,\n TMDataGridToolbarSpacer,\n} from \"./TMDataGridToolbar\";\nimport {\n DEFAULT_TMDATAGRID_SIZE,\n SIZE_CONTROL_SIZE,\n SIZE_ROW_HEIGHT,\n type TMDataGridSize,\n} from \"../core/sizes\";\nimport type { TMDataGridApi } from \"../useTMDataGrid\";\n\nexport type TMDataGridProps<TData extends RowData> = TMDataGridApi<TData> & {\n children: ReactNode;\n /**\n * Mantine size scale. Drives row height, font size, cell padding and the\n * size of the controls in the chrome. `meta.rowHeight` still wins if set.\n */\n size?: TMDataGridSize;\n className?: string;\n /**\n * Inline styles. Widened to accept CSS variables, which is how the grid's\n * colours are themed — `--dg-row-selected-bg` for the selected row\n * background. Plain `CSSProperties` rejects `--*` keys.\n */\n style?: CSSProperties & Record<`--${string}`, string | number>;\n};\n\n/**\n * Root of the grid. Takes the object returned by `useTMDataGrid` — spread it —\n * and publishes it to the compound components below it:\n *\n * ```tsx\n * const grid = useTMDataGrid({ data, columns });\n *\n * <TMDataGrid {...grid}>\n * <TMDataGrid.Toolbar>\n * <TMDataGrid.SummaryCount />\n * <TMDataGrid.Spacer />\n * <TMDataGrid.ColumnsButton />\n * </TMDataGrid.Toolbar>\n * <TMDataGrid.Table />\n * <TMDataGrid.Footer />\n * </TMDataGrid>\n * ```\n */\nfunction TMDataGridRoot<TData extends RowData>({\n table,\n ui,\n features,\n size = DEFAULT_TMDATAGRID_SIZE,\n children,\n className,\n style,\n}: TMDataGridProps<TData>) {\n const rowHeight = table.options.meta?.rowHeight ?? SIZE_ROW_HEIGHT[size];\n\n const api = useMemo(\n () => ({\n table,\n ui,\n features,\n size,\n rowHeight,\n controlSize: SIZE_CONTROL_SIZE[size],\n }),\n [table, ui, features, size, rowHeight],\n );\n\n return (\n <TMDataGridContextProvider value={api}>\n <div\n data-size={size}\n className={[classes.root, className].filter(Boolean).join(\" \")}\n style={style}\n >\n {children}\n </div>\n </TMDataGridContextProvider>\n );\n}\n\nexport const TMDataGrid = Object.assign(TMDataGridRoot, {\n Toolbar: TMDataGridToolbar,\n Spacer: TMDataGridToolbarSpacer,\n SummaryCount: TMDataGridSummaryCount,\n ColumnsButton: TMDataGridColumnsButton,\n FilterButton: TMDataGridFilterButton,\n Table: TMDataGridTable,\n Footer: TMDataGridFooter,\n /** Rendered by `TMDataGrid.Table`; exported for custom layouts. */\n FilterPanel: TMDataGridFilterPanel,\n /**\n * Takes the grid as an `api` prop rather than from context, so it can be\n * rendered outside `<TMDataGrid>` — a page header, for instance.\n */\n FilterPills: TMDataGridFilterPills,\n /** Rendered by `TMDataGrid.ColumnsButton`; exported for custom layouts. */\n ColumnsPanel: TMDataGridColumnsPanel,\n});\n"],"mappings":"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"}