@jielga/tmdatagrid 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/dist/index.d.ts +592 -0
- package/dist/index.js +1590 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +2 -0
- package/package.json +111 -0
- package/skills/columns/SKILL.md +195 -0
- package/skills/features/SKILL.md +214 -0
- package/skills/getting-started/SKILL.md +209 -0
- package/skills/options/SKILL.md +208 -0
- package/skills/server-side/SKILL.md +150 -0
- package/src/tmdatagrid/TMDataGrid.module.css +410 -0
- package/src/tmdatagrid/TMDataGrid.tsx +101 -0
- package/src/tmdatagrid/TMDataGridColumnsPanel.tsx +91 -0
- package/src/tmdatagrid/TMDataGridContext.ts +32 -0
- package/src/tmdatagrid/TMDataGridFilterPanel.tsx +182 -0
- package/src/tmdatagrid/TMDataGridFooter.tsx +74 -0
- package/src/tmdatagrid/TMDataGridHeaderCell.tsx +466 -0
- package/src/tmdatagrid/TMDataGridTable.tsx +297 -0
- package/src/tmdatagrid/TMDataGridToolbar.tsx +131 -0
- package/src/tmdatagrid/capabilities.ts +117 -0
- package/src/tmdatagrid/columnOrdering.ts +140 -0
- package/src/tmdatagrid/columnUtils.ts +43 -0
- package/src/tmdatagrid/filterOperators.ts +171 -0
- package/src/tmdatagrid/icons.ts +25 -0
- package/src/tmdatagrid/index.ts +68 -0
- package/src/tmdatagrid/persistence.ts +187 -0
- package/src/tmdatagrid/sizes.ts +29 -0
- package/src/tmdatagrid/useTMDataGrid.tsx +378 -0
|
@@ -0,0 +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","ActionIcon","Group","Select","Text","useSelector","classes","useTMDataGridContext","ChevronLeftIcon","ChevronRightIcon","TMDataGridFooterProps","pageSizeOptions","ReadonlyArray","TMDataGridFooter","t0","$","_c","t1","t2","undefined","table","controlSize","store","pageIndex","pageSize","state","pagination","t3","getRowCount","total","from","to","Math","min","t4","t5","map","String","t6","t7","value","setPageSize","Number","setPageIndex","t8","t9","t10","t11","getCanPreviousPage","t12","t13","previousPage","t14","Symbol","for","t15","t16","getCanNextPage","t17","t18","nextPage","t19","t20","t21","t22","footer","Column","RowData","TMDataGridRowData","isColumnReorderable","TMDataGridFeatures","TMDataGridTable","UseTMDataGridOptions","TMDataGridFeatureFlags","sorting","filtering","hiding","pinning","resizing","ordering","rowSelection","readFeatureFlags","options","Pick","TData","enableSorting","enableColumnFilters","enableHiding","enableColumnPinning","enableColumnResizing","enableColumnOrdering","enableRowSelection","TMDataGridColumnCapabilities","canSort","canFilter","canHide","canPin","canResize","canReorder","getColumnCapabilities","column","features","getCanSort","getCanFilter","getCanHide","getCanPin","getCanResize","TMDataGridCapabilities","canSortAny","canFilterAny","canHideAny","canPinAny","canReorderAny","canSelectRows","getGridCapabilities","table","columns","getAllLeafColumns","any","predicate","capabilities","some","c","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","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","readSlices","storage","resolved","raw","getItem","parsed","record","Record","restored","slice","writeSlices","state","payload","setItem","resolveKeys","data","settings","hasPersistenceKeys","defaultDeserialize","JSON","parse","defaultSerialize","stringify","readPersistedState","writePersistedState","Checkbox","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","useTable","Store","useEffect","useMemo","useState","TMDataGridColumnType","tmDataGridFilterFn","getDefaultOperator","hasPersistenceKeys","readPersistedState","TMDataGridPersistence","writePersistedState","readFeatureFlags","TMDataGridFeatureFlags","SELECT_COLUMN_ID","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","TMDataGridColumnDef","withTMDataGridDefaults","columns","ReadonlyArray","Array","map","column","isArray","filterFn","createSelectColumn","id","meta","size","minSize","maxSize","enableResizing","enableSorting","enableColumnFilter","enableGlobalFilter","enablePinning","header","getIsAllRowsSelected","getIsSomeRowsSelected","getToggleAllRowsSelectedHandler","cell","row","getIsSelected","getCanSelect","getIsSomeSelected","getToggleSelectedHandler","event","stopPropagation","useTMDataGrid","t0","$","_c","options","selectionEnabled","enableRowSelection","pinningEnabled","enableColumnPinning","t1","base","t2","persistedState","t3","t4","t5","initialState","columnPinning","left","filter","_temp","t6","right","t7","t8","pagination","t9","pageIndex","pageSize","t10","t11","columnResizeMode","enableColumnResizing","globalFilterFn","t12","t13","store","state","subscription","subscribe","unsubscribe","t14","Symbol","for","_temp5","t15","t16","setState","undefined","prev","_temp2","prev_1","_temp3","columnId_0","prev_3","_temp4","prev_4","prev_2","prev_0","openColumnFilter","api","getColumn","getFilterValue","setFilterValue","operator","columnDef","value","actions","ActionIcon","Menu","Tooltip","flexRender","Header","useSelector","shallow","DragEvent","ReactNode","useRef","useState","classes","TMDataGridRowData","useTMDataGridContext","TMDataGridColumnLayout","getColumnCapabilities","getGridCapabilities","getColumnRegion","getStepTargetColumn","moveColumn","moveColumnByStep","TMDataGridDropSide","getColumnAlign","getColumnLabel","isFilterActive","ArrowDownIcon","ArrowUpIcon","ColumnsIcon","DotsVerticalIcon","EyeOffIcon","FilterIcon","MoveLeftIcon","MoveRightIcon","PinLeftIcon","PinOffIcon","PinRightIcon","TMDataGridFeatures","openColumnFilter","SELECT_COLUMN_ID","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","offset","t31","t32","t33","t34","right","zIndex","t35","event_3","getToggleSortingHandler","t36","columnDef","isPlaceholder","headerTitle","getContext","t37","headerActions","headerAction","event_4","stopPropagation","event_5","_temp3","_temp4","t38","columnSeparatorResizable","t39","columnSeparatorActive","t40","columnSeparator","t41","t42","event_7","getResizeHandler","t43","t44","_temp5","t45","event_8","event_6","opened","state_0","columnResizing","isResizingColumn","columnOrder","node","type","Divider","Loader","Text","Cell","flexRender","Row","RowData","useSelector","useVirtualizer","useCallback","useRef","classes","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","controlSize","store","loading","noResultsLabel","options","meta","scrollContainerRef","HTMLDivElement","rows","getPaginatedRowModel","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","state","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","tableWrapper","scrollContainer","grid","display","headerGroup","headerRow","header","gridColumn","virtualItem","key","getIsSelected","bodyRow","cursor","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","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/TMDataGrid.module.css","../src/tmdatagrid/TMDataGridContext.ts","../src/tmdatagrid/columnUtils.ts","../src/tmdatagrid/TMDataGridColumnsPanel.tsx","../src/tmdatagrid/filterOperators.ts","../src/tmdatagrid/TMDataGridFilterPanel.tsx","../src/tmdatagrid/TMDataGridFooter.tsx","../src/tmdatagrid/capabilities.ts","../src/tmdatagrid/columnOrdering.ts","../src/tmdatagrid/persistence.ts","../src/tmdatagrid/useTMDataGrid.tsx","../src/tmdatagrid/TMDataGridHeaderCell.tsx","../src/tmdatagrid/TMDataGridTable.tsx","../src/tmdatagrid/TMDataGridToolbar.tsx","../src/tmdatagrid/sizes.ts","../src/tmdatagrid/TMDataGrid.tsx"],"sourcesContent":["/* Size scale. Row heights mirror SIZE_ROW_HEIGHT in sizes.ts — the virtualizer\n 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\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\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\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.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.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.bodyRow[data-selected=\"true\"] {\n --row-bg: var(--mantine-primary-color-light);\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/* Boundary of a pinned column group.\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\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\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.filterPanel {\n position: absolute;\n top: 46px;\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/* 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\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 \"./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 \"./TMDataGrid.module.css\";\nimport { useTMDataGridContext } from \"./TMDataGridContext\";\nimport { getColumnLabel } from \"./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","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 \"./TMDataGrid.module.css\";\nimport { useTMDataGridContext } from \"./TMDataGridContext\";\nimport { getColumnLabel, getColumnType } from \"./columnUtils\";\nimport {\n type TMDataGridFilterOperator,\n type TMDataGridFilterValue,\n FILTER_OPERATOR_LABELS,\n getDefaultOperator,\n getOperatorsForType,\n isTMDataGridFilterValue,\n operatorNeedsValue,\n} from \"./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","import { ActionIcon, Group, Select, Text } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport classes from \"./TMDataGrid.module.css\";\nimport { useTMDataGridContext } from \"./TMDataGridContext\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"./icons\";\n\nexport type TMDataGridFooterProps = {\n pageSizeOptions?: ReadonlyArray<number>;\n};\n\n/**\n * MUI-style pager: \"Rows per page · from–to of total · ‹ ›\".\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}: TMDataGridFooterProps) {\n const { table, controlSize } = useTMDataGridContext();\n useSelector(table.store);\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\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={pageSizeOptions.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","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 */\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};\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 >,\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 };\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};\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 };\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 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\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) 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 { Checkbox } from \"@mantine/core\";\nimport { 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 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 \"./filterOperators\";\nimport {\n hasPersistenceKeys,\n readPersistedState,\n type TMDataGridPersistence,\n writePersistedState,\n} from \"./persistence\";\nimport { readFeatureFlags, type TMDataGridFeatureFlags } from \"./capabilities\";\n\nexport const SELECT_COLUMN_ID = \"__select__\";\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\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\nfunction createSelectColumn<TData extends RowData>(): TMDataGridColumnDef<TData> {\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 }) => (\n <Checkbox\n size=\"xs\"\n aria-label=\"Select all rows\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler()}\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n size=\"xs\"\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n indeterminate={row.getIsSomeSelected()}\n onChange={row.getToggleSelectedHandler()}\n onClick={(event) => event.stopPropagation()}\n />\n ),\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.\n */\nexport function useTMDataGrid<TData extends RowData>({\n persist,\n // Not a TanStack option, so it is kept out of what `useTable` receives.\n enableColumnOrdering,\n ...options\n}: UseTMDataGridOptions<TData>): TMDataGridApi<TData> {\n const selectionEnabled = options.enableRowSelection !== false;\n const pinningEnabled = options.enableColumnPinning !== false;\n\n const columns = useMemo(() => {\n const base = withTMDataGridDefaults<TData>(\n options.columns as ReadonlyArray<TMDataGridColumnDef<TData>>,\n );\n return selectionEnabled ? [createSelectColumn<TData>(), ...base] : base;\n }, [options.columns, selectionEnabled]);\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 ...(selectionEnabled && 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 useEffect(() => {\n if (!hasPersistenceKeys(persist)) return;\n writePersistedState(table.store.state, persist);\n const subscription = table.store.subscribe((state) => {\n writePersistedState(state, persist);\n });\n return () => subscription.unsubscribe();\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({ ...options, enableColumnOrdering });\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 \"./TMDataGrid.module.css\";\nimport {\n type TMDataGridRowData,\n useTMDataGridContext,\n} from \"./TMDataGridContext\";\nimport type { TMDataGridColumnLayout } from \"./TMDataGridTable\";\nimport { getColumnCapabilities, getGridCapabilities } from \"./capabilities\";\nimport {\n getColumnRegion,\n getStepTargetColumn,\n moveColumn,\n moveColumnByStep,\n type TMDataGridDropSide,\n} from \"./columnOrdering\";\nimport { getColumnAlign, getColumnLabel } from \"./columnUtils\";\nimport { isFilterActive } from \"./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 {\n type TMDataGridFeatures,\n openColumnFilter,\n SELECT_COLUMN_ID,\n} 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\" ? classes.stickyLeft : \"\",\n layout.isBoundary && pinnedAt === \"right\" ? classes.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 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, useRef } from \"react\";\nimport classes from \"./TMDataGrid.module.css\";\nimport { type TMDataGridRowData, useTMDataGridContext } from \"./TMDataGridContext\";\nimport { TMDataGridFilterPanel } from \"./TMDataGridFilterPanel\";\nimport { TMDataGridHeaderCell } from \"./TMDataGridHeaderCell\";\nimport { getColumnAlign } from \"./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\" ? classes.stickyLeft : \"\",\n layout.isBoundary && layout.pinnedAt === \"right\"\n ? classes.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 /** Called when a body row is clicked. */\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, regardless of page size.\n */\nexport function TMDataGridTable<TData extends RowData = TMDataGridRowData>({\n onRowClick,\n}: TMDataGridTableProps<TData>) {\n const { table, 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 // Respects `manualPagination`: server-paged grids get the rows as delivered.\n const rows = table.getPaginatedRowModel().rows;\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 return (\n <div className={classes.tableWrapper}>\n <div ref={scrollContainerRef} className={classes.scrollContainer}>\n <div\n role=\"table\"\n className={classes.grid}\n style={{ gridTemplateColumns, minWidth: gridMinWidth }}\n >\n <div role=\"rowgroup\" style={{ display: \"contents\" }}>\n {headerGroups.map((headerGroup) => (\n <div key={headerGroup.id} role=\"row\" className={classes.headerRow}>\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 data-testid={`dg-row-${row.id}`}\n data-selected={row.getIsSelected()}\n className={classes.bodyRow}\n style={{\n minHeight: rowHeight,\n cursor: onRowClick ? \"pointer\" : undefined,\n }}\n onClick={\n onRowClick\n ? () =>\n onRowClick(\n row as unknown as Row<TMDataGridFeatures, TData>,\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","import { ActionIcon, Popover, Text, Tooltip } from \"@mantine/core\";\nimport { useSelector } from \"@tanstack/react-store\";\nimport type { ReactNode } from \"react\";\nimport classes from \"./TMDataGrid.module.css\";\nimport { TMDataGridColumnsPanel } from \"./TMDataGridColumnsPanel\";\nimport { useTMDataGridContext } from \"./TMDataGridContext\";\nimport { getGridCapabilities } from \"./capabilities\";\nimport { isFilterActive } from \"./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 \"./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 style?: CSSProperties;\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":"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"}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
._root_pt0ni_3[data-size=xs]{--dg-row-height:34px;--dg-header-height:32px;--dg-font-size:var(--mantine-font-size-xs);--dg-padding:6px}._root_pt0ni_3[data-size=sm]{--dg-row-height:42px;--dg-header-height:38px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:8px}._root_pt0ni_3[data-size=md]{--dg-row-height:52px;--dg-header-height:44px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:10px}._root_pt0ni_3[data-size=lg]{--dg-row-height:62px;--dg-header-height:52px;--dg-font-size:var(--mantine-font-size-md);--dg-padding:14px}._root_pt0ni_3[data-size=xl]{--dg-row-height:72px;--dg-header-height:60px;--dg-font-size:var(--mantine-font-size-lg);--dg-padding:18px}._root_pt0ni_3{--dg-row-height:52px;--dg-header-height:44px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:10px;text-align:left;border:1px solid var(--mantine-color-default-border);border-radius:var(--mantine-radius-md);background-color:var(--mantine-color-body);flex-direction:column;min-height:0;display:flex;overflow:hidden}._toolbar_pt0ni_57{align-items:center;gap:var(--mantine-spacing-xs);padding:6px var(--mantine-spacing-xs);flex-shrink:0;min-height:42px;display:flex}._toolbarSpacer_pt0ni_66{flex:1}._tableWrapper_pt0ni_71{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}._scrollContainer_pt0ni_79{flex:1;min-height:0;position:relative;overflow:auto}._grid_pt0ni_87{display:grid}._headerRow_pt0ni_93{grid-column:1/-1;grid-template-columns:subgrid;z-index:3;display:grid;position:sticky;top:0}._headerCell_pt0ni_102{padding:0 var(--dg-padding);min-width:0;min-height:var(--dg-header-height);font-weight:600;font-size:var(--dg-font-size);background-color:var(--mantine-color-body);border-bottom:1px solid var(--mantine-color-default-border);-webkit-user-select:none;user-select:none;align-items:center;gap:2px;display:flex;position:relative}._headerCell_pt0ni_102[data-align=right]{justify-content:flex-end}._headerCell_pt0ni_102[data-align=center]{justify-content:center}._headerCell_pt0ni_102[data-active=true] ._headerTitle_pt0ni_126{color:var(--mantine-primary-color-filled)}._headerTitle_pt0ni_126{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._headerCell_pt0ni_102[data-align=right] ._headerTitle_pt0ni_126{text-align:right}._headerCell_pt0ni_102[data-align=center] ._headerTitle_pt0ni_126{justify-content:center;display:flex}._headerActions_pt0ni_149{flex-shrink:0;align-items:center;gap:0;margin-left:auto;display:flex}._headerCell_pt0ni_102[data-align=right] ._headerActions_pt0ni_149{order:-1;margin-left:0;margin-right:auto}._headerAction_pt0ni_149{display:none}._headerCell_pt0ni_102:hover ._headerAction_pt0ni_149,._headerCell_pt0ni_102:focus-within ._headerAction_pt0ni_149,._headerAction_pt0ni_149[data-pinned-visible=true]{display:flex}._headerCellSortable_pt0ni_178{cursor:pointer}._headerCellDragging_pt0ni_185{opacity:.4}._headerCellDropBefore_pt0ni_189:before,._headerCellDropAfter_pt0ni_190:before{content:"";background-color:var(--mantine-primary-color-filled);z-index:5;pointer-events:none;width:2px;position:absolute;top:0;bottom:0}._headerCellDropBefore_pt0ni_189:before{left:0}._headerCellDropAfter_pt0ni_190:before{right:0}._columnSeparator_pt0ni_210{z-index:1;justify-content:center;width:10px;height:50%;display:flex;position:absolute;top:25%;right:0;transform:translate(50%)}._columnSeparatorResizable_pt0ni_222{cursor:col-resize;touch-action:none}._columnSeparator_pt0ni_210:after{content:"";background-color:#0000;width:1px;height:100%;transition:background-color .12s,width .12s}._headerCell_pt0ni_102:hover ._columnSeparator_pt0ni_210:after,._headerCell_pt0ni_102:focus-within ._columnSeparator_pt0ni_210:after{background-color:var(--mantine-color-default-border)}._columnSeparatorResizable_pt0ni_222:hover:after,._columnSeparatorActive_pt0ni_245:after{background-color:var(--mantine-primary-color-filled);width:2px}._bodyRow_pt0ni_250{--row-bg:var(--mantine-color-body);grid-column:1/-1;grid-template-columns:subgrid;align-items:stretch;display:grid}._bodyRow_pt0ni_250:hover{--row-bg:var(--mantine-color-default-hover)}._bodyRow_pt0ni_250[data-selected=true]{--row-bg:var(--mantine-primary-color-light)}._bodyCell_pt0ni_268{padding:0 var(--dg-padding);border-bottom:1px solid var(--mantine-color-default-border);background-color:var(--row-bg);font-size:var(--dg-font-size);align-items:center;display:flex}._cellContent_pt0ni_266{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}._bodyCell_pt0ni_268[data-align=right]{justify-content:flex-end}._bodyCell_pt0ni_268[data-align=center]{justify-content:center}._bodyCell_pt0ni_268[data-align=left] ._cellContent_pt0ni_266{flex:auto}._stickyLeft_pt0ni_305{border-right:1px solid var(--mantine-color-default-border)}._stickyRight_pt0ni_309{border-left:1px solid var(--mantine-color-default-border)}._stickyLeft_pt0ni_305:after,._stickyRight_pt0ni_309:after{content:"";pointer-events:none;width:4px;position:absolute;top:0;bottom:0}._stickyLeft_pt0ni_305:after{background:linear-gradient(90deg,var(--lightningcss-light,#00000014)var(--lightningcss-dark,#00000047),#0000);left:100%}._stickyRight_pt0ni_309:after{background:linear-gradient(270deg,var(--lightningcss-light,#00000014)var(--lightningcss-dark,#00000047),#0000);right:100%}._messageRow_pt0ni_341{justify-content:center;align-items:center;gap:var(--mantine-spacing-xs);padding:var(--mantine-spacing-xl);flex-direction:column;grid-column:1/-1;display:flex}._footer_pt0ni_351{justify-content:flex-end;align-items:center;gap:var(--mantine-spacing-lg);padding:4px var(--mantine-spacing-sm);border-top:1px solid var(--mantine-color-default-border);flex-shrink:0;min-height:48px;display:flex}._filterPanel_pt0ni_362{top:46px;left:var(--mantine-spacing-md);z-index:5;padding:var(--mantine-spacing-sm);border-radius:var(--mantine-radius-md);border:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);box-shadow:var(--mantine-shadow-md);position:absolute}._filterRow_pt0ni_374{align-items:flex-end;gap:var(--mantine-spacing-xs);display:flex}._menuItemActive_pt0ni_381{background-color:var(--mantine-color-default-hover);font-weight:600}._columnsPanel_pt0ni_386{flex-direction:column;width:280px;display:flex}._columnsPanelSearch_pt0ni_392{padding:var(--mantine-spacing-sm)}._columnsPanelList_pt0ni_396{gap:var(--mantine-spacing-sm);padding:0 var(--mantine-spacing-sm) var(--mantine-spacing-sm);flex-direction:column;display:flex}._columnsPanelFooter_pt0ni_403{justify-content:space-between;align-items:center;gap:var(--mantine-spacing-sm);padding:var(--mantine-spacing-sm);border-top:1px solid var(--mantine-color-default-border);display:flex}
|
|
2
|
+
/*$vite$:1*/
|
package/package.json
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jielga/tmdatagrid",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A React data grid built on TanStack Table v9 and Mantine — always virtualized, with resizable, reorderable, sortable, filterable, hideable and pinnable columns.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": [
|
|
8
|
+
"**/*.css"
|
|
9
|
+
],
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/Jielga/TMDataGrid.git"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/Jielga/TMDataGrid#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/Jielga/TMDataGrid/issues"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"react",
|
|
20
|
+
"datagrid",
|
|
21
|
+
"data-grid",
|
|
22
|
+
"table",
|
|
23
|
+
"mantine",
|
|
24
|
+
"tanstack-table",
|
|
25
|
+
"virtualized",
|
|
26
|
+
"tanstack-intent"
|
|
27
|
+
],
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"intent": {
|
|
32
|
+
"docs": "src/docs/",
|
|
33
|
+
"skills": [
|
|
34
|
+
"@tanstack/react-table",
|
|
35
|
+
"@tanstack/table-core",
|
|
36
|
+
"@tanstack/router-core"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"src/tmdatagrid",
|
|
42
|
+
"skills",
|
|
43
|
+
"!skills/_artifacts"
|
|
44
|
+
],
|
|
45
|
+
"main": "./dist/index.js",
|
|
46
|
+
"module": "./dist/index.js",
|
|
47
|
+
"types": "./dist/index.d.ts",
|
|
48
|
+
"exports": {
|
|
49
|
+
".": {
|
|
50
|
+
"types": "./dist/index.d.ts",
|
|
51
|
+
"import": "./dist/index.js"
|
|
52
|
+
},
|
|
53
|
+
"./styles.css": "./dist/styles.css",
|
|
54
|
+
"./package.json": "./package.json"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"dev": "vite",
|
|
58
|
+
"build": "tsc -b && vite build",
|
|
59
|
+
"build:lib": "vite build --config vite.lib.config.ts && tsc -p tsconfig.lib.json && rollup -c rollup.dts.config.mjs",
|
|
60
|
+
"lint": "oxlint",
|
|
61
|
+
"preview": "vite preview",
|
|
62
|
+
"changeset": "changeset",
|
|
63
|
+
"version-packages": "changeset version && node scripts/sync-skill-version.mjs",
|
|
64
|
+
"release": "changeset publish",
|
|
65
|
+
"prepublishOnly": "npm run lint && npm run build:lib",
|
|
66
|
+
"prepare": "husky"
|
|
67
|
+
},
|
|
68
|
+
"peerDependencies": {
|
|
69
|
+
"@mantine/core": "^9.4.0",
|
|
70
|
+
"@tabler/icons-react": "^3.46.0",
|
|
71
|
+
"@tanstack/react-store": "^0.11.0",
|
|
72
|
+
"@tanstack/react-table": "^9.0.0-beta.21",
|
|
73
|
+
"@tanstack/react-virtual": "^3.14.4",
|
|
74
|
+
"@tanstack/store": "^0.11.0",
|
|
75
|
+
"@tanstack/table-core": "^9.0.0-beta.21",
|
|
76
|
+
"react": "^19.1.0",
|
|
77
|
+
"react-dom": "^19.1.0"
|
|
78
|
+
},
|
|
79
|
+
"devDependencies": {
|
|
80
|
+
"@babel/core": "^7.29.7",
|
|
81
|
+
"@changesets/changelog-github": "^0.7.0",
|
|
82
|
+
"@changesets/cli": "^2.31.1",
|
|
83
|
+
"@mantine/core": "^9.4.0",
|
|
84
|
+
"@rolldown/plugin-babel": "^0.2.3",
|
|
85
|
+
"@tabler/icons-react": "^3.46.0",
|
|
86
|
+
"@tanstack/intent": "0.3.6",
|
|
87
|
+
"@tanstack/react-router": "^1.170.17",
|
|
88
|
+
"@tanstack/react-router-devtools": "^1.167.0",
|
|
89
|
+
"@tanstack/react-store": "^0.11.0",
|
|
90
|
+
"@tanstack/react-table": "^9.0.0-beta.21",
|
|
91
|
+
"@tanstack/react-virtual": "^3.14.4",
|
|
92
|
+
"@tanstack/store": "^0.11.0",
|
|
93
|
+
"@tanstack/table-core": "^9.0.0-beta.21",
|
|
94
|
+
"@types/babel__core": "^7.20.5",
|
|
95
|
+
"@types/node": "^24.13.2",
|
|
96
|
+
"@types/react": "^19.2.17",
|
|
97
|
+
"@types/react-dom": "^19.2.3",
|
|
98
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
99
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
100
|
+
"husky": "^9.1.7",
|
|
101
|
+
"oxlint": "^1.69.0",
|
|
102
|
+
"react": "^19.2.7",
|
|
103
|
+
"react-dom": "^19.2.7",
|
|
104
|
+
"react-markdown": "^10.1.0",
|
|
105
|
+
"remark-gfm": "^4.0.1",
|
|
106
|
+
"rollup": "^4.62.3",
|
|
107
|
+
"rollup-plugin-dts": "^6.4.1",
|
|
108
|
+
"typescript": "~6.0.2",
|
|
109
|
+
"vite": "^8.1.0"
|
|
110
|
+
}
|
|
111
|
+
}
|