{"version":3,"file":"useRowPinningUrlState-DSifLlGx.cjs","names":["isDev","proc","globalThis","process","env","NODE_ENV","seen","Set","devWarn","message","has","add","console","warn","resetDevWarnings","clear","devWarn","defaultConfirm","message","onConfirm","native","globalThis","confirm","resolveDisabledReason","reason","undefined","runRowAction","action","row","cancelLabel","onClick","title","confirmLabel","danger","useCallback","useState","bulkActionErrorMessage","error","Error","message","String","JSON","stringify","useBulkActionRunner","confirm","cancelLabel","onComplete","pending","setPending","setError","run","action","ids","context","length","scope","allMatching","total","fire","key","onClick","status","error_","title","confirmLabel","danger","onConfirm","fold","text","normalize","replace","toLowerCase","searchable","item","haystack","label","filterCommands","commands","query","needle","trim","map","filter","includes","tableCommands","options","labels","onPrint","push","key","print","onSelect","onExport","exportCsv","onClearFilters","clearAll","disabled","hasFilters","useEffect","DEFAULT_SHORTCUTS","chord","command","parseChord","parts","toLowerCase","split","key","at","mod","includes","ctrl","meta","alt","shift","matches","event","metaKey","ctrlKey","altKey","shiftKey","inTextEntry","target","HTMLElement","tag","tagName","isContentEditable","useShortcuts","options","$","_c","enabled","onCommand","shortcuts","getTarget","t0","t1","length","parsed","map","_temp","node","document","onKeyDown","KeyboardEvent","bare","preventDefault","addEventListener","removeEventListener","shortcut","getPath","asText","value","String","Date","toISOString","slice","undefined","columnText","column","row","formatValue","rendersOwnCell","Boolean","accessor","Cell","candidates","exportValue","sortValue","key","candidate","text","humanizeKey","key","segment","split","at","words","replaceAll","trim","map","w","charAt","toUpperCase","slice","join","normalizeLocaleTag","locale","trim","replaceAll","toLowerCase","resolveLocaleTag","available","target","tags","exact","find","tag","undefined","primary","split","humanizeKey","resolveLocaleTag","getPath","pathCell","value","String","localizedColumnPath","column","locale","i18n","key","tag","Object","keys","undefined","resolveColumns","columns","map","needsHeader","header","needsAccessor","accessor","Cell","path","row","FILTER_OP_SUFFIX","filterOpKey","key","isFilterOpKey","endsWith","length","TEXT_OPS","NUMBER_OPS","DATE_OPS","TEXT_OP_SET","Set","NUMBER_OP_SET","DATE_OP_SET","isValuelessFilterOp","op","isListFilterOp","isBetweenFilterOp","TEXT_OP_LABEL_KEYS","eq","neq","contains","notContains","startsWith","empty","notEmpty","NUMBER_OP_LABEL_KEYS","gt","gte","lt","lte","between","in","notIn","DATE_OP_LABEL_KEYS","before","after","on","relative","parseTextOp","raw","has","parseNumberOp","undefined","parseDateOp","readFilterOp","extra","isEmptyRowValue","value","trim","Date","Number","isNaN","getTime","parseListOperand","Array","isArray","map","entry","String","filter","Boolean","split","parseNumberList","out","token","n","isFinite","push","formatFilterChip","fieldLabel","opWord","DAY_MS","END_OF_DAY_MS","RELATIVE_NAMED","NAMED","Set","startOfDay","now","Date","getFullYear","getMonth","getDate","endOfDay","day","getTime","addDays","days","startOfIsoWeek","weekday","getDay","mondayOffset","parseRelativeToken","raw","undefined","has","counted","exec","n","Number","isInteger","isRelativeDateToken","namedRange","token","today","startMs","endMs","start","end","resolveRelativeRange","instant","startsWith","slice","countedRelativeToken","kind","count","isFinite","Math","floor","NAMED_LABEL_KEYS","yesterday","tomorrow","thisWeek","thisMonth","previousMonth","RELATIVE_PRESETS","RELATIVE_PRESET_LABEL_KEYS","last","next","splitRelativeToken","preset","joinRelativeToken","relativeTokenLabel","labels","relLastN","replace","relNextN","localizedColumnPath","defaultLabels","devWarn","humanizeKey","getPath","DATE_OP_LABEL_KEYS","DATE_OPS","filterOpKey","formatFilterChip","isEmptyRowValue","NUMBER_OP_LABEL_KEYS","NUMBER_OPS","parseDateOp","parseNumberList","parseNumberOp","parseTextOp","TEXT_OP_LABEL_KEYS","TEXT_OPS","relativeTokenLabel","resolveRelativeRange","FILTER_TYPES","AUTO_OPTIONS_LIMIT","RANGE_SUFFIXES","dateRange","start","end","numberRange","filterStateKeys","def","registry","spec","get","type","stateKeys","key","coerceBooleanValue","value","token","trim","toLowerCase","undefined","Boolean","booleanChoiceOn","resolveFilterDefs","columns","filters","locale","standalone","standaloneKeys","Set","map","d","fromColumns","column","filter","base","has","path","push","label","header","getValue","row","filterLabel","extra","v","Array","isArray","length","valueText","String","DATE_ONLY_RE","END_OF_DAY_MS","dateValueToEpochMs","Date","getTime","Number","NaN","text","test","year","month","day","split","numericRowValue","textMatch","rowValue","term","includes","textRowMatches","op","needle","startsWith","endsWith","dateUpperBoundMs","bound","dateOnMatch","time","dateInclusiveBounds","fromKey","toKey","dateRowMatches","isNaN","range","startMs","endMs","numberRowMatches","n","minKey","maxKey","listKey","min","max","textFilterActive","dateFilterActive","numberFilterActive","asConditionScalar","asConditionList","one","asConditionPair","a","b","rangeConditionToExtra","condition","flavour","opKey","suffixes","lowKey","highKey","list","scalarConditionToExtra","listConditionToExtra","textStateKeys","rangeStateKeys","s","pair","textSpec","widget","ops","defaultOp","match","chips","textChipLabel","emptyOpChip","conditionToExtra","selectSpec","optionLabel","listSpec","urlArray","selected","booleanSpec","boolTrue","boolFalse","rangeSpec","isDate","urlNumberKeys","low","high","flavourName","rangeChipLabel","createBuiltInFilterSpecs","filterPredicate","options","find","o","opWord","labels","field","side","raw","opEmpty","opNotEmpty","buildFilterRuntime","defs","arrayExtraKeys","numberExtraKeys","filterLabels","predicates","Object","assign","filterFn","every","p","clearedFilterExtras","out","materializeAutoOptions","rows","seen","add","size","sort","localeCompare","slice","DATE_OP_LABEL_KEYS","filterOpKey","isListFilterOp","isValuelessFilterOp","NUMBER_OP_LABEL_KEYS","parseDateOp","parseListOperand","parseNumberOp","isRelativeDateToken","RANGE_OPS","text","value","String","asOpValue","raw","undefined","readStoredRangeOp","extra","stored","lowKey","highKey","listKey","op","a","join","b","low","high","inferRangeFromPair","flavour","readRangeWidget","opKey","writeRangeWidget","writeRangeFilter","key","entries","length","pair","active","RANGE_OP_LABEL_KEYS","number","date","eq","useState","filterLabel","RANGE_SUFFIXES","DATE_OP_LABEL_KEYS","DATE_OPS","filterOpKey","isBetweenFilterOp","isListFilterOp","isValuelessFilterOp","NUMBER_OP_LABEL_KEYS","NUMBER_OPS","parseTextOp","TEXT_OP_LABEL_KEYS","TEXT_OPS","readRangeWidget","writeRangeFilter","isRelativeDateToken","scalarFilterText","value","String","listFilterValues","Array","isArray","rangeArity","op","rangeInputType","flavour","arity","useRangeFilterWidget","def","source","$","_c","extra","setExtras","t0","label","type","suffixes","lowKey","key","start","highKey","end","t1","opKey","ops","t2","eq","opLabelKeys","t3","setOp","t4","derived","a","b","t5","inputType","t6","nextOp","nextA","nextB","seededB","seededA","write","t7","useTextFilterWidget","storedOp","localOp","setLocalOp","needsValue","nextValue","valueless","undefined","next","t8","filterOpLabel","labels","parseBooleanChoice","useBooleanFilterWidget","setExtra","choice","useMemo","useState","getPath","listFilterValues","CHECKLIST_VIRTUALIZE_AT","CHECKLIST_ITEM_HEIGHT","CHECKLIST_LIST_HEIGHT","valueText","value","String","optionLabel","options","Array","isArray","list","find","item","label","rowValue","def","row","getValue","key","collectChecklistValues","rows","selected","counts","Map","text","set","get","has","entries","sort","a","b","localeCompare","map","count","selectedList","useChecklistFilter","source","$","_c","fromFacets","facets","allFilteredRows","available","undefined","raw","extra","t0","t1","bb0","t2","items","query","setQuery","trim","toLowerCase","needle","t3","bb1","t4","t5","includes","filter","visible","next","setExtra","length","write","t6","next_0","Set","item_0","add","t7","t8","on","item_1","t9","virtualize","selectAllVisible","clear","toggle","collectChecklistValues","listFilterValues","rowsExcludingFilter","rows","extra","key","filterFn","cleared","undefined","filter","row","computeFilterFacets","defs","registry","out","def","widget","get","type","subset","devWarn","MapRegistry","constructor","specs","get","type","has","types","keys","register","spec","next","Map","set","extend","patch","current","emptyFilterRegistry","createFilterRegistry","map","filterTypeSpec","registry","filterWidgetKind","def","widget","filterTypeOps","ops","filterTypeDefaultOp","defaultOp","renderRegisteredFilter","source","labels","className","render","createBuiltInFilterSpecs","createFilterRegistry","builtInFilterSpecs","defaultFilterRegistry","resolveFilterRegistry","extras","length","reduce","registry","spec","register","resolveFilterMode","mode","headerFilters","toolbarShowsFilters","hasForm","hasFilterTree","showSimpleFilterFields","headerFiltersOn","filterFields","ColumnSpacer","t0","$","_c","width","side","as","t1","undefined","Cell","t2","t3","minWidth","padding","border","t4","useCallback","useEffect","useRef","useEventCallback","callback","$","_c","latest","t0","current","t1","Symbol","for","t2","args","useEffect","useState","useEventCallback","devWarn","EMPTY","useFilterOptions","def","$","_c","source","options","isLoader","loaded","setLoaded","loading","setLoading","t0","key","loader","alive","then","startLoad","t1","t2","isLeftoverAuto","t3","t4","Array","isArray","t5","t6","Symbol","for","ColumnSpacer","defaultFilterRegistry","filterLabel","listFilterValues","useBooleanFilterWidget","useRangeFilterWidget","useTextFilterWidget","renderRegisteredFilter","useFilterOptions","headerFilterStickTop","sticky","base","top","stickyExtras","filterDefForColumn","defs","key","find","def","column","Pad","t0","$","_c","part","style","stickyAttr","className","t1","TextCell","source","labels","slots","widget","Search","value","write","op","t2","search","label","SelectCell","options","extra","selected","t3","values","setExtra","length","undefined","Select","t4","t5","t6","boolAny","t7","map","_temp","t8","t9","option","CompactMultiCell","menuClassName","summary","first","groupCount","Multi","_temp2","checked","filter","item","option_0","BooleanCell","boolTrue","boolFalse","choice","RangeCell","Range","b","a","inputType","arity","value_0","FilterHeaderCell","registry","spec","get","type","custom","FilterHeaderControlChrome","FilterHeaderChrome","enabled","columns","expandable","showReorder","selection","showActions","columnSpacers","cellStyle","pinSide","padStyle","classNames","headerCell","Boolean","join","pad","t10","filterHeaderRow","t11","headerFilters","t12","expandHeader","t13","reorderHeader","t14","selectionHeader","t15","start","t16","filterHeaderCell","filterHeaderInput","filterHeaderMenu","t17","end","t18","actionsHeader","t19","devWarn","isFilterGroup","node","REQUIRES","groupBy","expandedIds","aggregates","filterTree","facets","cursor","REMEDY","grouping","tree","applyQuerySupport","extensions","support","warn","allowed","field","value","Object","entries","undefined","capability","assign","isFilterGroup","defaultFilterRegistry","filterPredicate","isActiveFilterTree","filterOpKey","FILTER_TREE_PARAM","FILTER_TREE_VERSION","parseFilterTree","serializeFilterTree","asScalar","value","undefined","String","conditionToExtra","def","condition","registry","spec","get","type","key","op","matchCondition","row","defs","find","item","evaluateFilterTree","tree","results","conditions","map","node","combinator","every","Boolean","some","isFilterGroup","emptyFilterTree","combinator","conditions","cloneGroup","group","atGroup","tree","path","current","index","child","undefined","replaceChild","next","length","splice","head","rest","updated","setFilterTreeCombinator","parentPath","slice","at","appendFilterTreeChild","root","addFilterTreeCondition","condition","addFilterTreeGroup","replaceFilterTreeNode","removeFilterTreeNode","walkFilterTreeConditions","out","forEach","node","childPath","push","useMemo","filterLabel","filterOpLabel","removeFilterTreeNode","walkFilterTreeConditions","DATE_OP_LABEL_KEYS","formatFilterChip","NUMBER_OP_LABEL_KEYS","TEXT_OP_LABEL_KEYS","relativeTokenLabel","conditionValueText","condition","labels","value","op","Array","isArray","parts","map","item","String","filter","Boolean","length","join","undefined","conditionOpWord","def","type","filterTreeChipLabel","defs","find","key","field","useFilterTreeChips","options","$","_c","tree","setFilterTree","t0","bb0","t1","Symbol","for","t2","path","label","onRemove","columnText","findMatches","options","query","rows","columns","firstRowIndex","needle","trim","toLowerCase","matches","forEach","row","index","column","col","includes","push","matchKey","cell","matchKeySet","Set","map","stepMatch","total","step","clamp","value","max","stepGridFocus","from","move","bounds","lastRow","Math","rowCount","lastCol","colCount","step","pageSize","row","col","moveGridFocus","covered","landed","current","next","sameGridCell","gridFocusMoveForKey","press","dir","toEnd","Boolean","ctrlKey","metaKey","rtl","key","a","b","sameGridCell","cellRangeBounds","range","fromRow","Math","min","anchor","row","head","toRow","max","fromCol","col","toCol","isInCellRange","cell","b","cellRangeSize","singleCellRange","extendCellRange","fallbackAnchor","isSingleCell","cellRangeIndices","rows","cols","r","push","c","useCallback","useEffect","useMemo","useState","singleCellRange","findMatches","matchKeySet","stepMatch","useFindInTable","options","$","_c","enabled","rows","columns","firstRowIndex","t0","undefined","open","setOpen","query","setQuery","index","setIndex","t1","matches","t2","matchKeys","t3","Symbol","for","next","trim","writeQuery","t4","next_0","writeOpen","t5","length","by","current","step","t6","openBar","t7","next_1","t8","previous","safeIndex","Math","min","max","t9","t10","t11","t12","useFindFocus","focusCell","selectRange","batchEditHandler","batch","onCellEdit","undefined","edits","edit","row","columnKey","value","buildExportTable","cellRangeIndices","escapeCell","text","test","replaceAll","cellText","value","String","clipboardRangeText","options","range","rows","columns","firstRowIndex","headers","indices","cols","flatMap","index","column","length","selected","row","undefined","table","lines","map","join","writeClipboardText","clipboard","globalThis","navigator","writeText","readClipboardText","readText","getPath","isCustomEditor","editor","type","isBooleanEditor","isMultiSelectEditor","isSelectEditor","editorInputType","booleanDraft","checked","isDraftChecked","draft","normalizeEditorOptions","options","map","option","value","label","hasEditableColumns","columns","some","column","editable","undefined","isCellEditable","row","flag","resolveCellEditor","readEditableCellValue","seed","readSeed","trimToEditor","editValue","sortValue","stringifyEditSeed","key","slice","at","indexOf","String","Array","isArray","formatMultiDraft","Date","Number","isNaN","getTime","localDateTimeParts","pad","n","padStart","date","getFullYear","getMonth","getDate","getHours","getMinutes","parseCellEditValue","parseNumberDraft","parseMultiDraft","trimmed","trim","isFinite","split","MULTI_SEPARATOR","values","join","readMultiDraft","stepEditableCell","rows","rowKey","from","direction","editableCols","filter","c","length","rowIndex","findIndex","r","rowId","colIndex","columnKey","total","step","flat","nextRow","Math","floor","nextCol","nextEditableCell","resolveCommitValue","find","commit","parseValue","applyCellEditCommit","resolved","onCellEdit","isCellEditable","readEditableCellValue","cellRangeBounds","fillDirection","source","to","bounds","below","row","toRow","above","fromRow","after","col","toCol","before","fromCol","vertical","Math","max","horizontal","fillTargetRange","direction","anchor","head","continueSeries","seed","step","delta","arithmeticStep","length","String","Number","at","numbers","map","value","trim","NaN","every","isFinite","constant","i","previous","undefined","fillAxis","b","forward","along","span","reverse","edgeRow","edgeCol","lanes","edge","distance","abs","lane","position","fillRangeEdits","options","rows","columns","firstRowIndex","axis","edits","flatMap","readCell","n","cell","column","raw","push","columnKey","key","parseValue","from","Array","_","isCellEditable","batchEditHandler","cellRangeBounds","parseClipboardTable","text","rows","row","field","i","length","ch","quoted","readQuotedField","value","next","push","start","pasteRangeEdits","options","range","columns","firstRowIndex","grid","edits","forEach","line","r","fromRow","undefined","raw","c","column","fromCol","columnKey","key","parseValue","cellPasteHandler","onCellPaste","onCellEdit","cellFillHandler","onCellFill","buildExportTable","cellRangeIndices","cellRangeSize","numeric","value","Number","isFinite","trim","parsed","selectionStats","options","enabled","range","rows","columns","firstRowIndex","indices","cols","flatMap","index","column","length","selected","row","undefined","table","numbers","cells","sum","average","min","max","reduce","total","Math","useCallback","useEffect","useMemo","useRef","useState","columnText","useEventCallback","cellRangeBounds","cellRangeSize","extendCellRange","isInCellRange","isSingleCell","singleCellRange","clipboardRangeText","readClipboardText","writeClipboardText","fillRangeEdits","fillTargetRange","gridFocusMoveForKey","moveGridFocus","sameGridCell","pasteRangeEdits","GRID_CELL_ATTR","gridCellAttr","cell","row","col","useGridFocus","options","enabled","headerCheckbox","rowCount","columns","rows","firstRowIndex","pageSize","dir","labels","scrollToRow","onActivate","onRangeChange","onCut","onPaste","onFill","onUndo","onRedo","onFind","matchKeys","currentMatch","isCoveredCell","active","setActive","range","setRange","pending","container","announcement","setAnnouncement","dragging","filling","fillTo","fillPreviewTo","setFillPreviewTo","lastLoadedRow","Math","max","length","bounds","colCount","announce","column","header","key","value","undefined","position","gridCellPosition","defaultPosition","selectRange","next","b","gridRangeSelection","defaultRangeSelection","fromRow","toRow","fromColumn","fromCol","toColumn","toCol","cells","fillPreview","commitFill","to","edits","source","gridRangeFilled","defaultRangeFilled","focusCell","current","target","element","querySelector","focus","copyCells","cut","selection","anchor","head","copySelection","text","then","ok","gridRangeCopied","defaultRangeCopied","gridRangeCopyFailed","fillDown","pasteInto","gridRangePasteFailed","gridRangePasted","defaultRangePasted","handleHistoryKey","event","redo","shiftKey","undo","run","say","editRedone","defaultRedone","editUndone","defaultUndone","editNothingToUndo","handleClipboardKey","from","ctrlKey","metaKey","preventDefault","isSingleRowRange","onKeyDown","move","moved","end","window","addEventListener","removeEventListener","getGridProps","role","ref","node","getCellProps","isActive","firstEver","selected","matched","has","tabIndex","onMouseDown","onMouseEnter","onMouseUp","onFocus","selectColumn","extend","top","bottom","isColumnSelected","toggleColumn","getColumnHeaderProps","onClick","modified","sortable","fillHandleCell","getFillHandleProps","stopPropagation","getRowProps","rowIndex","getCellPropsAt","windowIndex","getRowPropsAt","columnCheckbox","fillHandleLabel","gridFillHandle","total","useCallback","useEffect","useState","canFullscreen","document","fullscreenEnabled","useFullscreen","element","$","_c","active","setActive","t0","Symbol","for","supported","t1","t2","sync","fullscreenElement","addEventListener","removeEventListener","exit","_temp","t3","exitFullscreen","requestFullscreen","catch","_temp2","toggle","t4","undefined","t5","container","useCallback","useSyncExternalStore","mqlCacheByImpl","WeakMap","cachedMatchMedia","query","impl","globalThis","matchMedia","cache","get","Map","set","mql","useMediaQuery","t0","$","_c","defaultValue","undefined","t1","onChange","_temp","addEventListener","removeEventListener","subscribe","t2","mql_0","matches","getSnapshot","t3","getServerSnapshot","useMediaQuery","REDUCED_MOTION_QUERY","usePrefersReducedMotion","stableKey","input","JSON","stringify","normalize","value","undefined","Array","isArray","map","entry","source","keys","Object","sort","a","b","localeCompare","out","key","normalized","MOBILE_BREAKPOINT_PX","DEFAULT_LIMIT","PAGE_SIZE_OPTIONS","pageSizeOptions","limit","sizes","extras","filter","n","i","all","includes","indexOf","length","SEARCH_DEBOUNCE_MS","DEFAULT_ROW_SIZE_PX","DEFAULT_CARD_SIZE_PX","VIRTUAL_OVERSCAN","MOBILE_BREAKPOINT_PX","useMediaQuery","MOBILE_MEDIA_QUERY","mobileMediaQuery","px","String","useIsMobile","t0","$","_c","undefined","t1","resolvePaginationMode","mode","isMobile","useCallback","useEffect","useMemo","useSyncExternalStore","DEFAULT_LIMIT","devWarn","useResolvedAdapter","FILTER_PREFIX","isEmptyFilterValue","MAX_LIMIT","PARAM_GROUP_BY","PARAM_LIMIT","PARAM_PAGE","PARAM_SEARCH","PARAM_SORT_BY","PARAM_SORT_DIR","readExtra","readFilterTreeParam","readLimit","readPage","readSortDir","readSortLevels","writeExtra","writeFilterTreeParam","writeSortLevels","nsRegistry","WeakMap","NO_KEYS","useTableUrlState","t0","$","_c","t1","undefined","options","urlAdapter","urlSync","defaults","t2","numberExtraKeys","t3","arrayExtraKeys","t4","urlKey","t5","ns","backend","syncToUrl","resolved","t6","t7","onChange","subscribe","getSearch","t8","search","t9","URLSearchParams","params","t10","t11","counts","get","Map","set","next","remaining","delete","initialLimit","limit","initialPage","page","t12","t13","t14","t15","trim","searchTerm","t16","sortByRaw","sortBy","sortDirFallback","sortDir","t17","t18","groupByRaw","groupBy","t19","sortLevels","t20","extra","p","urlBag","out","key","value","Object","entries","mergeDefaultExtra","t21","t22","filterTree","t23","mutate","next_0","setSearch","toString","commit","t24","p_0","bag","key_0","keys","writeExtraWithDefaults","t25","p_1","readEffectiveExtra","t26","p_2","resetPage","t27","next_1","p_3","String","setPage","t28","next_2","p_4","clamped","Math","min","max","round","setLimit","t29","next_3","p_5","trimmed","t30","key_1","t31","dir","p_6","setSort","key_2","p_7","setGroupBy","t32","key_3","p_8","levels","index","findIndex","l","push","splice","length","toggleSortLevel","t33","key_4","value_0","p_9","setExtra","t34","updates","p_10","setExtras","t35","tree","p_11","setFilterTree","t36","p_12","clearExtras","t37","p_13","clearAll","t38","defaultLimit","useEffect","useMemo","useRef","useState","useEventCallback","resolvePaginationMode","useIsMobile","useTableUrlState","devWarn","stableKey","applyQuerySupport","useServerData","options","rows","total","nextCursor","loading","error","paginationMode","forceMobile","supports","expandedIds","facetKeys","facets","onQueryChange","urlOptions","mediaMobile","isMobile","resolvedMode","paged","state","page","limit","search","sortBy","sortDir","groupBy","sortLevels","extra","cursorMode","cursor","cursors","setCursors","undefined","query","filters","filterTree","queryKey","generation","setGeneration","controllerRef","emitQuery","current","abort","controller","AbortController","signal","rowsPresent","length","sawLoadingRef","firstLoadDoneRef","isLoading","setPage","lastPage","Math","max","ceil","prev","next","slice","baseKey","stash","setStash","appending","key","appendPending","prevProp","cursorBaseRef","displayRows","moreToLoad","hasNextPage","setPageSafely","fetchNextPage","defaultLimit","isFetching","isFetchingNextPage","setLimit","setSort","setGroupBy","toggleSortLevel","setSearch","setExtra","setExtras","setFilterTree","clearExtras","clearAll","refetch","g","getPath","resolveGroupValue","row","groupBy","column","sortValue","path","key","groupValueKey","value","String","Date","toISOString","JSON","stringify","Object","prototype","toString","call","formatGroupLabel","blankLabel","makeGroupRowKey","keys","valueKeys","k","join","v","groupingKeys","filter","length","partitionGroupedRows","rows","columns","partitionLevel","level","order","buckets","bucketBy","map","valueKey","bucket","get","children","undefined","flattenGroupPartitions","partitions","options","getRowId","collapsedGroupIds","aggregates","footers","sort","groupPageSize","rowPageSize","paging","flat","leafIndex","walk","levelPartitions","nodes","flatMap","part","node","label","leafRows","a","b","compareGroups","groupLimit","pageLimit","groups","shown","slice","hiddenGroups","here","groupKey","collapsed","has","aggregateCells","push","kind","leafIds","emitLeaves","from","limit","moreEntry","buildGroupedFlatModel","localeCompare","index","hidden","Math","max","total","pageSize","revealed","min","find","c","Map","set","scope","remaining","pathKey","aggregate","resolveAggregateValue","toAggregateNumber","createIncrementalAggregate","spec","rows","options","columns","Map","map","column","key","bindings","fn","Object","entries","kind","builtInName","push","acc","sum","numericCount","presentCount","min","undefined","max","dirty","state","row","addAggregateRow","applyValue","valueOf","removeAggregateRow","replaceAggregateRow","prev","next","readIncrementalAggregate","some","binding","rescan","out","format","result","cellOf","get","value","sign","n","Math","groupingKeys","groupValueKey","resolveGroupValue","rowGroupPath","row","keys","columns","map","key","column","find","item","value","valueKey","incrementalGroupTree","partitions","groupBy","roots","toMutable","rootMap","mapOf","snapshotPartitions","tree","toFrozen","addGroupedRow","path","sortedIndex","getRowId","siblings","siblingMap","step","node","get","rows","children","childMap","Map","at","firstSeenInsertAt","splice","set","insertLeaf","rebalance","removeGroupedRow","id","chain","push","i","length","list","removeLeaf","indexOf","delete","moveGroupedRow","prev","next","prevPath","nextPath","samePath","every","replaceAlongPath","sortSiblings","sort","a","b","firstLeafIndex","first","Number","POSITIVE_INFINITY","incoming","findIndex","sibling","existing","part","nodes","insertRow","row","at","type","updateRow","id","changes","upsertRow","removeRow","alreadyApplied","Object","keys","every","key","is","insertIndex","length","undefined","resolved","Math","min","max","indexOfId","list","getRowId","findIndex","PATCH_LOGS","WeakMap","rowPatchLog","rows","get","rememberLog","log","events","set","applyOne","patch","index","splice","push","prev","next","existing","applyRowPatches","patches","applyRowPatchesWithLog","working","event","aggregate","flattenGroupPartitions","groupingKeys","makeGroupRowKey","partitionGroupedRows","compareSortEntries","compareSortLevel","sortedInsertIndex","sortRows","sortRowsMulti","stableKey","addAggregateRow","createIncrementalAggregate","readIncrementalAggregate","removeAggregateRow","replaceAggregateRow","addGroupedRow","incrementalGroupTree","moveGroupedRow","removeGroupedRow","rowGroupPath","snapshotPartitions","applyRowPatchesWithLog","rowPatchLog","STATES","WeakMap","VIEWS","incrementalViewOf","rows","get","attachIncrementalView","view","set","incrementalViewConfig","getState","config","configureIncrementalView","patch","state","Error","merged","definedConfigPatch","queryChanged","queryConfigFingerprint","derivedChanged","derivedConfigFingerprint","createIncrementalView","republishDerived","incrementalSearchText","row","Object","values","map","value","JSON","stringify","String","join","getId","getRowId","filtered","hasFilter","filter","rowMatches","sorted","hasSort","fullSort","keys","groupBy","columns","partitions","length","tree","undefined","groups","groupFlattenOptions","summary","aggregateSpec","aggregateOptions","aggregates","readSummary","searchText","Map","sortValues","filteredSourceIndex","sourceIndices","filteredPos","indexMap","sortedPos","summaryDirty","groupCells","dirtyGroups","Set","warmCaches","cacheGroupCells","publish","applyRowPatchesToView","patches","applyRowPatchLogToView","log","events","needsDerived","slice","source","event","applySourceEvent","delta","applyFilterEvent","applySortEvent","applyGroupEvent","applySummaryEvent","paintGroups","defined","key","assign","search","extra","filterTree","sortBy","sortDir","sortLevels","level","dir","columnKeys","column","hasFilterFn","filterFn","hasFilterTreeFn","filterTreeFn","hasGetSortValue","getSortValue","groupFooters","Boolean","collapsed","collapsedGroupIds","sort","a","b","localeCompare","groupPageSize","rowPageSize","paging","blankLabel","hasGroupAggregates","groupAggregates","hasGroupSort","groupSort","hasGroupFilter","groupFilter","hasSummaryRow","summaryRow","hasAggregateSpec","searchTerm","trim","toLowerCase","cachedText","term","projector","getSearchText","text","includes","levels","resolveSortValue","find","item","sortValue","toSortable","accessor","id","sortKeyOf","type","splice","index","next","_","sourceDelta","filterInsert","filterRemove","filterUpdate","kind","prev","at","firstIndexAtLeast","i","rememberSearch","findIndex","forgetRow","matches","insertAt","insertSorted","removeSorted","replaceSorted","compareCached","delete","_prev","prevKey","nextKey","sameSortKey","target","itemId","targetId","itemIndex","targetIndex","itemKeys","targetKeys","entries","decided","every","is","path","markDirtyPath","prevPath","nextPath","valueKeys","step","valueKey","add","skipAggregates","footers","seen","entry","aggregateCells","cellsForGroup","groupKey","has","clear","cells","groupCellsFrom","leafRows","indices","useCallback","useMemo","useRef","resolvePaginationMode","useIsMobile","applyRowPatchLogToView","attachIncrementalView","createIncrementalView","incrementalSearchText","incrementalViewConfig","incrementalViewOf","rowPatchLog","useTableUrlState","devWarn","stableKey","toSortable","value","warnUnresolvableSort","sortBy","column","rows","getSortValue","first","sortValue","undefined","accessor","defaultSearchText","row","defaultFrontendRowId","id","String","useFrontendData","options","data","getRowId","getSearchText","columns","filterFn","filterTreeFn","paginationMode","error","refetch","isFetching","isLoading","forceMobile","urlOptions","mediaMobile","isMobile","resolvedMode","paged","state","page","limit","search","sortDir","groupBy","sortLevels","getSearchTextRef","current","getRowIdRef","searchCacheRef","Map","projectSearchText","cached","get","text","set","fingerprint","extra","filterTree","hasFilterFn","hasFilterTreeFn","hasGetSortValue","hookConfig","viewRef","dataRef","fingerprintRef","view","syncFrontendView","hookViewFingerprint","searchCache","length","find","key","filtered","sorted","searched","term","trim","toLowerCase","filter","includes","total","lastPage","Math","max","ceil","safePage","min","start","slice","hasNextPage","fetchNextPage","setPage","allFilteredRows","allSearchedRows","isFetchingNextPage","defaultLimit","setLimit","setSort","setGroupBy","toggleSortLevel","setSearch","setExtra","setExtras","setFilterTree","clearExtras","clearAll","map","level","dir","columnKeys","args","latest","previousData","previousFingerprint","configChanged","log","canPatch","logBelongsToPrevious","forgetPatchedSearch","adoptHookRefs","next","dataChanged","clear","created","mergeHookConfig","previous","groupAggregates","groupSort","groupFilter","groupFooters","collapsedGroupIds","blankLabel","groupPageSize","rowPageSize","paging","summaryRow","aggregateSpec","aggregateOptions","cache","event","events","type","delete","working","index","splice","prev","useEffect","useMemo","useRef","useState","resolveColumns","computeFilterFacets","resolveFilterRegistry","buildFilterRuntime","materializeAutoOptions","resolveFilterDefs","evaluateFilterTree","devWarn","stableKey","useFrontendData","useServerData","resolveTier","source","mode","onQueryChange","warnTierMisuse","data","useQueryNotification","handler","page","limit","search","sortBy","sortDir","sortLevels","extra","query","filters","queryKey","handlerRef","current","queryRef","lastKeyRef","controllerRef","notify","abort","controller","AbortController","signal","isDeclarativeFilters","Array","isArray","useTableData","options","total","loading","error","columns","filterTypes","filterFn","paginationMode","getSearchText","getSortValue","locale","supports","facetKeys","facets","serverFacets","urlOptions","declaredFilters","undefined","loaderCacheRef","Map","awaitedRef","Set","loadedOptions","setLoadedOptions","runtime","materialized","withAsync","map","def","loaded","key","cached","get","original","inFlight","set","alive","defs","has","add","then","prev","tier","combinedFilterFn","row","resolvedColumns","frontend","urlSync","filterTreeFn","tree","registry","arrayExtraKeys","numberExtraKeys","isLoading","derivedFacetKeys","filter","type","widget","server","rows","resolved","allSearchedRows","filterTree","sourced","COLUMN_GROUP_STUB_WIDTH","COLUMN_GROUP_ID_SEP","COLUMN_GROUP_STUB_PREFIX","COLUMN_GROUP_RENDER_PREFIX","isColumnGroupStubKey","key","startsWith","isColumnGroupRenderKey","isColumnGroupSummaryKey","groupedHeaderChildRule","hairline","borderBottom","backgroundImage","backgroundPosition","backgroundRepeat","backgroundSize","columnGroupStubStyle","width","minWidth","maxWidth","paddingInline","overflow","boxSizing","groupedHeaderAlign","align","groupedHeaderLabelStyle","display","alignItems","gap","whiteSpace","verticalAlign","groupedHeaderCellStyle","cell","textAlign","rowSpan","hideLabel","columnGroupPath","column","group","undefined","columnGroupId","path","join","toggleCollapsedColumnGroup","collapsedIds","id","includes","filter","one","headerGroupRows","columns","collapsible","groups","paths","map","maxDepth","reduce","max","Math","length","collapsed","Set","rows","depth","push","headerGroupRowAt","cells","index","label","slice","last","at","stub","span","collapsedHere","has","get","headerGroupRow","columnGroupHeaderCaption","htmlGroupedHeaderPlan","groupRows","totalRows","needsChildHeaderRow","plan","Array","from","fillGroupLevels","fillChildHeaderRow","some","level","col","fillGapLeaves","summary","spanIsSummaryOnly","kind","colSpan","start","step","pathLen","columnIndex","COLUMN_GROUP_ID_SEP","COLUMN_GROUP_RENDER_PREFIX","COLUMN_GROUP_STUB_PREFIX","COLUMN_GROUP_STUB_WIDTH","columnGroupId","columnGroupPath","isColumnGroupRenderKey","isColumnGroupStubKey","isColumnGroup","column","Array","isArray","children","flattenColumnTree","columns","leaves","groups","Map","walk","leaf","path","depth","length","id","slice","get","childKeys","push","key","frozen","record","set","applyCollapsedColumnGroups","collapsedIds","collapsed","Set","keep","map","shouldKeepLeaf","inserted","out","index","clear","appendCollapsedChrome","marriedOrderHolds","nextOrder","values","marryChildren","hits","has","first","last","at","nodes","node","nextPath","header","label","collapsedKey","collapsedRender","headerTooltip","align","group","inheritedGroup","pass","collapsedAncestors","groupHasKeptLeaf","add","split","renderColumn","stubColumn","ids","ancestors","show","resolveGroupShow","groupShow","undefined","some","String","width","minWidth","maxWidth","accessor","hideOnMobile","sortable","render","row","FALLBACK_PIN_WIDTH","parsePxWidth","width","test","trim","Number","parseFloat","undefined","resolveColumnWidth","column","widths","override","key","tableMinWidth","columns","options","total","reduce","sum","extra","pinnedColumnWidth","useCallback","useMemo","useRef","useState","applyCollapsedColumnGroups","marriedOrderHolds","FALLBACK_PIN_WIDTH","parsePxWidth","toggleCollapsedColumnGroup","EMPTY_COLUMN_LAYOUT","hidden","order","pinned","widths","PIN_Z","body","rowPinned","rowPinnedColumn","header","headerPinned","insetProp","side","pinnedCellStyle","offset","zIndex","leads","undefined","lead","position","inset","edgePinStyle","active","applyColumnOrder","columns","length","byKey","Map","map","c","key","ordered","col","get","push","delete","has","useColumnLayout","layout","onLayoutChange","defaultColumnLayout","collapsibleColumnGroups","columnGroups","internal","setInternal","state","stateRef","current","commit","next","isHidden","includes","setHidden","nextHidden","filter","k","toggleVisible","setPinned","setWidth","width","visibleColumns","collapsedGroups","toggleColumnGroup","id","nextIds","move","toIndex","latest","from","indexOf","clamped","Math","max","min","splice","reset","pinInsets","resolveWidth","column","override","insets","samePinned","reverse","set","pinOffset","applyColumnOrder","columnMenuLabel","column","header","mobileLabel","key","nextPinSide","current","undefined","pinActionLabel","labels","pinStart","unpin","ACTIONS_COLUMN_KEY","REORDER_COLUMN_KEY","columnMenuRows","allColumns","layout","state","order","map","index","name","hidden","isHidden","pinned","canMove","lockPosition","canHide","lockVisibility","canPin","lockPin","canResize","lockWidth","canSort","sortable","canFilter","filter","filterColumnMenuRows","rows","query","needle","trim","toLowerCase","row","includes","showAllColumns","setHidden","hideAllColumns","unpinAllColumns","setPinned","resetColumnLayout","setWidth","columnMenuActions","ctx","actions","onSortColumn","push","id","label","sortAscending","disabled","sortBy","sortDir","run","sortDescending","pinEnd","showColumn","hideColumn","toggleVisible","onAutoSizeColumn","autoSizeColumn","onFilterColumn","filterColumn","resetColumn","resolveColumnWidth","ASSUMED_COLUMN_WIDTH","budgetWidth","column","widths","dropOrder","columns","map","index","filter","entry","responsivePriority","undefined","sort","a","b","byPriority","responsiveColumns","available","extra","droppable","length","dropped","width","reduce","sum","push","key","gone","Set","has","useMemo","useEventCallback","devWarn","observeEdit","handler","event","error","detail","Error","message","String","useObservedEdit","$","_c","t0","stable","undefined","useEditLifecycle","props","onEditStart","onEditCancel","onEditCommit","onValidationFail","onEditError","useCallback","useMemo","useRef","useState","useEventCallback","parseCellEditValue","readEditableCellValue","resolveCellEditor","observeEdit","useBatchEditing","options","$","_c","enabled","t0","Symbol","for","pending","setPending","t1","pendingRef","t2","next","current","write","t3","columns","onEditStart","row","rowId","columnKey","value","column","find","entry","key","stored","drafts","wasPending","undefined","next_0","Object","keys","length","previousValue","unit","setDraft","t4","current_0","edits","rowId_0","entry_0","entries","row_0","patch","columnKey_0","draft","column_0","one","parseValue","push","onBatchEdit","edit","onEditCommit","saveAll","t5","onEditCancel","rowId_1","entry_1","cancelAll","t6","rowId_2","entry_2","next_1","cancelRow","t7","rowId_3","isPending","t8","rowId_4","columnKey_1","isChanged","t9","row_1","rowId_5","columnKey_2","draft_0","column_1","entry_3","draftFor","t10","map","_temp2","signature","join","t11","count","t12","t13","rowId_6","entry_4","_temp","value_0","useCallback","useMemo","useState","useEventCallback","cellKey","rowId","columnKey","useDirtyCells","t0","$","_c","t1","undefined","options","enabled","dirty","setDirty","_temp","t2","current","key","has","Set","add","mark","t3","Symbol","for","rowId_0","columnKey_0","current_0","key_0","next","delete","confirm","t4","rowId_1","current_1","prefix","next_0","filter","key_1","startsWith","size","confirmRow","t5","_temp2","confirmAll","t6","rowId_2","columnKey_1","isDirty","t7","rowId_3","prefix_0","key_2","isRowDirty","t8","signature","join","t9","count","current_2","useCallback","useMemo","useRef","useState","useEventCallback","devWarn","readEditableCellValue","liveRowChanged","input","rowVersion","undefined","String","opened","current","column","resolveConflictChoice","handler","conflict","policy","choice","error","detail","Error","message","useEditConflict","$","_c","setCurrent","seen","keepLive","_temp","takeLive","_temp2","pending","t0","Symbol","for","clear","t1","row","keep","t2","conflict_0","incomingValue","take","t3","conflict_1","applyChoice","t4","active","openedRow","live","rows","find","rowKey","rowId","columns","item","key","columnKey","previousValue","token","conflict_2","previous","draft","onEditConflict","reconcile","t5","isConflict","t6","useCallback","useMemo","useRef","useState","useEventCallback","parseCellEditValue","readEditableCellValue","resolveCellEditor","observeEdit","editableColumns","columns","row","filter","column","editable","undefined","useRowEditing","options","enabled","activeRowId","setActiveRowId","drafts","setDrafts","draftsRef","opened","begin","rowId","seeds","key","current","onEditStart","columnKey","value","previousValue","unit","setDraft","close","kind","open","onEditCancel","save","patch","draft","parseValue","Object","keys","length","onRowEdit","onEditCommit","isDirty","entries","some","isEditing","draftFor","signature","map","join","cancel","useCallback","useMemo","useRef","useState","useEventCallback","observeEdit","cellKey","rowId","columnKey","defaultFormatError","error","Error","message","isThenable","value","then","useCellSaveState","options","saving","setSaving","Set","failures","setFailures","Map","tokens","markSaving","key","busy","current","has","next","add","delete","setFailure","failure","undefined","set","track","input","previous","attempted","previousValue","result","token","get","formatError","onEditError","row","unit","rollback","onRollback","clear","signature","entries","map","f","join","statusFor","failureFor","canRollback","useCallback","useMemo","useRef","useState","isCellEditable","readEditableCellValue","stepEditableCell","observeEdit","useCellEditing","options","active","setActive","draft","setDraft","activeRef","draftRef","current","openedRef","writeDraft","value","writeActive","next","isActive","rowId","columnKey","fireCancel","opened","row","onEditCancel","previousValue","initial","unit","clearOpened","begin","initialValue","typed","undefined","onEditStart","commit","result","cancel","close","discardIfRowMissing","rows","rowKey","some","openedRow","keepLive","takeLive","handleKeyDown","event","navigation","key","preventDefault","action","advanceTarget","columns","from","direction","shiftKey","beginCellEdit","editing","column","useCallback","useMemo","useRef","useState","useEventCallback","cellKey","rowId","columnKey","useEditValidation","options","cellErrors","setCellErrors","Map","rowErrors","setRowErrors","validating","setValidating","Set","tokens","setCellError","key","message","current","get","undefined","next","delete","set","setRowError","markValidating","busy","has","add","check","input","target","value","row","validateCell","validateRow","applyEdit","shallowApplyEdit","allowed","token","cellMessage","error","edited","rowVerdict","settleRowVerdict","verdict","clear","clearAll","signature","entries","flat","join","errorFor","rowErrorFor","isValidating","rowHasError","prefix","keys","startsWith","hasRowValidator","Object","firstKey","useMemo","mergeFilterChips","filterChips","extraChips","length","resolveActiveFilterCount","override","chipCount","pushChip","chips","key","entry","label","onRemove","push","useActiveFilterChips","t0","$","_c","values","labels","onChange","value","Object","entries","resolve","hasOwn","undefined","Array","isArray","remaining","filter","v","text","String","parseGroupBy","value","undefined","list","split","map","key","trim","filter","length","formatGroupBy","keys","join","useCallback","useMemo","useState","useEventCallback","useGroupCollapse","controlled","$","_c","controlledIds","collapsedGroupIds","isControlled","undefined","uncontrolled","setUncontrolled","_temp","t0","Set","t1","next","onCollapsedGroupIdsChange","commit","t2","groupKey","has","isCollapsed","t3","groupKey_0","next_0","delete","add","toggle","t4","expandAll","t5","groupKeys","collapseAll","t6","depth","groups","filter","group","level","map","_temp2","collapseToDepth","t7","g","key","useCallback","useMemo","useState","useGroupPaging","$","_c","t0","Symbol","for","paging","setPaging","t1","pageSize","groupKey","current","undefined","groups","rows","showMore","t2","reset","t3","useEffect","useRef","useEventCallback","useInfiniteScroll","options","$","_c","hasNextPage","isFetchingNextPage","fetchNextPage","enabled","t0","rootMargin","t1","itemCount","undefined","ref","t2","onSentinelVisible","t3","el","current","IntersectionObserver","observer","entries","isIntersecting","observe","disconnect","t4","useEffect","useRef","useScrollToTableTop","t0","$","_c","ref","deps","enabled","t1","offset","t2","gap","t3","behavior","t4","undefined","t5","map","String","join","depsKey","lastDepsKeyRef","t6","t7","current","queueMicrotask","node","top","getBoundingClientRect","window","scrollBy","useEffect","useState","useElementWidth","ref","$","_c","width","setWidth","undefined","t0","t1","node","current","ResizeObserver","measure","clientWidth","observer","observe","disconnect","resolveRowHeight","rowHeight","row","index","undefined","resolveRowStyle","rowStyle","style","height","rowStyleSignature","JSON","stringify","rowStyleArmed","estimateFromRowHeight","fallback","rowAt","found","PIN_Z","resolveRowStyle","isExtraEntry","entry","kind","extraRowsArmed","extraRows","Boolean","length","toEntry","extra","key","render","insertExtraRows","entries","dataKey","before","Map","append","beforeRowId","undefined","push","bucket","get","set","result","id","waiting","delete","extraRowsForSection","rowIds","appendUntargeted","next","filter","has","insertExtrasBeforeRows","rows","getRowId","ids","Set","map","row","EXTRA_OVER_SPAN_ROW_STYLE","position","zIndex","rowPinned","EXTRA_OVER_SPAN_STYLE","textAlign","paddingBlock","paddingInline","extraHostFillStyle","extraKey","rowStyle","find","item","index","findIndex","visual","fill","backgroundColor","background","Object","keys","EXTRA_ROW_PARTS","separator","cell","fullWidth","extraCountBeforeRowIds","size","count","inflateBodyCellRowSpans","cellsByRow","visualIds","indexOf","cells","origin","changed","updated","rowSpan","extraCount","slice","visualBodySlots","buckets","list","slots","beforeId","visualSlotIndexes","extraIndexes","rowSlotIndex","slot","coverContinuingSpans","leadingCells","covered","start","addSpanCoverage","end","extraIndex","offset","colSpan","add","columnIndex","extraCoveredTableSlots","options","extraUncoveredColSpans","columnSpan","coveredSlots","spans","span","useMemo","useEventCallback","DUPLICATE_ROW_ACTION_KEY","DELETE_ROW_ACTION_KEY","useRowMutations","options","$","_c","onDuplicateRow","onDeleteRow","confirmDeleteRow","labels","t0","onAddRow","addRow","t1","row","duplicate","t2","row_0","remove","canAdd","undefined","canDuplicate","canDelete","confirmDelete","duplicateRow","deleteRow","deleteRowConfirm","built","t3","key","label","onClick","push","title","message","confirmLabel","danger","t4","color","confirm","actions","useCallback","useMemo","useRef","useState","useEventCallback","EMPTY_ROW_PIN_STATE","top","bottom","PIN_TOP_ACTION_KEY","PIN_BOTTOM_ACTION_KEY","UNPIN_ROW_ACTION_KEY","partitionPinnedRows","rows","state","getRowId","topSet","Set","bottomSet","byId","Map","row","set","id","get","undefined","push","scroll","has","rowPinSignature","pinning","rowId","sideOf","withoutId","ids","filter","withId","includes","applyRowPin","side","sameLists","a","b","length","every","index","sameState","useRowPinning","options","enabled","labels","controlledValue","pinnedRowIds","onChange","onPinnedRowIdsChange","internal","setInternal","controlled","modeRef","current","commit","next","live","pin","unpin","actions","key","label","pinToTop","isHidden","onClick","pinToBottom","unpinRow","useCallback","useMemo","useState","useEventCallback","isRtlElement","ROW_DND_MIME","REORDER_COLUMN_KEY","REORDER_COLUMN_WIDTH","rowReorderDropStyle","attrs","undefined","edge","offset","opacity","boxShadow","applyRowReorder","rows","from","to","length","slice","next","item","splice","datasetIndex","localIndex","windowStart","rowReorderSignature","reorder","rowId","lifted","isLifted","targeted","overIndex","isRtl","grip","useRowReorder","options","$","_c","enabled","labels","hostReorder","onRowReorder","t0","row","rowAt","setLifted","setOverIndex","announcement","setAnnouncement","t1","Symbol","for","reset","t2","fromLocal","toLocal","row_0","from_0","to_0","rowMoved","commit","t3","draggable","onDragStart","event","preventDefault","dataTransfer","setData","String","effectAllowed","onDragEnd","dragProps","t4","localIndex_0","row_1","windowStart_0","onDragOver","event_0","dropEffect","onDrop","event_1","payload","getData","sep","lastIndexOf","fromLocal_0","Number","isFinite","dragged","dropProps","t5","event_2","rowId_0","localIndex_1","row_2","windowStart_1","rowCount","key","rowReorderCancelled","to_1","rowLifted","rtl","currentTarget","down","up","Math","min","max","handleKeyDown","t6","localIndex_2","delta","row_3","windowStart_2","rowCount_0","to_2","moveBy","t7","rowId_1","t8","rowId_2","localIndex_3","dragging","from_1","isTarget","dropSide","rowAttrs","t9","t10","useCallback","useMemo","useState","useRowExpansion","defaultExpandedIds","$","_c","t0","Set","expandedIds","setExpandedIds","t1","id","has","isExpanded","t2","Symbol","for","id_0","prev","next","delete","add","toggle","t3","formatGroupLabel","groupValueKey","makeGroupRowKey","serverGroupEntries","options","groups","groupBy","collapsedGroupIds","getRowId","blankLabel","footers","flat","leafIndex","walk","nodes","level","path","key","at","node","here","value","groupKey","slice","collapsed","has","rows","label","push","kind","leafRows","leafIds","map","row","serverCount","count","aggregateCells","renderableAggregates","aggregates","length","index","undefined","cells","Object","entries","JSON","stringify","fillSlot","slot","state","tableErrorState","source","error","undefined","refetch","retry","retrying","isFetching","exportableValue","value","Date","Number","isNaN","getTime","undefined","isFinite","exportableRecord","cells","out","key","Object","entries","next","keys","length","nextIsNestedGroup","index","level","j","kind","skipHiddenLeaf","entry","skipUntilLevel","appendLeaves","rows","row","push","role","groupHeaderEntry","label","labelKey","groupBy","values","aggregateCells","groupFooterEntry","groupTotal","viewFromGroupedEntries","includeHiddenLeaves","dataLevel","i","leafRows","viewFromTreeEntries","map","isStructure","markKeptGroups","view","keep","footerGroupIndex","footerAt","prev","markKeptFooters","groupAt","Boolean","filterExportView","scopedIds","getRowId","has","filter","_","exportViewFromChrome","options","tree","allEntries","grouping","summaryExportValues","ACTIONS_COLUMN_KEY","REORDER_COLUMN_KEY","cellRangeIndices","devWarn","exportViewFromChrome","filterExportView","summaryExportValues","buildExportTable","csvWriter","defaultExportFilename","downloadExportFile","EXPORT_FETCH_ALL_MAX_ROWS","fetchAllExportRows","source","config","limit","pageSize","maxRows","base","exportQueryOf","out","reachedEnd","page","length","batch","fetchPage","push","rows","Math","min","onCapped","slice","resolveExportCsv","value","exportAllFallsBackToPage","exportCsv","options","Boolean","scope","allFilteredRows","undefined","request","fetchAll","exportableColumns","columns","filter","column","key","resolveExportColumns","visible","all","keys","pool","byKey","Map","map","flatMap","get","rowsInRange","range","firstRowIndex","index","row","resolveExportRows","context","selectedIds","getRowId","searchable","has","resolveExport","columnsInRange","columnScope","allColumns","cols","exportTableOptions","includeHiddenLeaves","fullView","grouping","tree","groupTotal","view","Set","getCellSpan","summary","summaryRow","buildTableCsv","build","table","filename","escapeFormulas","text","downloadTableCsv","writer","decision","onBeforeExport","file","onAfterExport","csv","makeExportCsvHandler","format","extension","query","serverAll","paged","search","sortBy","sortDir","filters","extra","groupBy","exportAllFallsBackToPage","collectFeatureNotices","input","labels","notices","virtualize","paginationMode","push","kind","appearance","message","noticeVirtualizePaged","groupByKeys","length","allFilteredRows","undefined","serverGroups","noticeGroupingUnavailable","rowPinningRequested","nestedArmed","noticePinNested","rowReorderRequested","noticeReorderNested","exportCsv","noticeExportAllPage","editMissingWriter","hasEditableColumn","onCellEdit","rowEditing","onRowEdit","batchEditing","onBatchEdit","noticeEditWithoutWriter","DEFAULT_LABEL","nestedTableDefaults","label","parent","urlSync","searchable","density","labels","tableLabel","nestedTableDetail","options","nestedTable","renderRowDetail","renderNestedDetail","row","nested","own","undefined","NestedTableRegion","t0","$","_c","t1","table","t2","buildTreeEntries","options","rows","getRowId","expandedIds","loadingIds","getChildren","getParentId","hasChildren","childrenOf","childrenFromParentIds","roots","filter","row","parent","undefined","some","r","entries","descendantsOf","ids","child","push","walk","list","level","path","key","children","expandable","length","expanded","has","descendantIds","loading","byParent","Map","siblings","get","set","filterTreeRows","withChildren","match","flatMap","kept","treeIndentStyle","paddingInlineStart","treeCardStyle","marginInlineStart","treeColumnKey","columns","declared","bodyRowEntries","tree","map","entry","position","index","treeEntry","sourceIndex","useCallback","useEffect","useRef","useState","useEventCallback","useLazyChildren","options","loadingIds","setLoadingIds","Set","failedIds","setFailedIds","asked","alive","current","settle","id","failed","next","delete","add","loadIfNeeded","row","onLoadChildren","hasLoadedChildren","getRowId","has","Promise","resolve","then","useCallback","useMemo","useState","useEventCallback","useTreeExpansion","controlled","$","_c","controlledIds","expandedIds","isControlled","undefined","uncontrolled","setUncontrolled","_temp","t0","Set","t1","next","onExpandedIdsChange","commit","t2","id","has","isExpanded","t3","id_0","next_0","delete","add","toggle","t4","id_1","expand","t5","ids","expandAll","t6","collapseAll","t7","columnGroupStubStyle","isColumnGroupStubKey","columnFlexShares","options","columns","fitColumns","widths","flexible","filter","column","key","undefined","width","flex","total","reduce","sum","shares","columnSizeStyle","userWidth","share","minWidth","maxWidth","fittedTableStyle","tableLayout","visibleColumns","columns","layout","mobileIdentityColumns","filter","c","hideOnDesktop","alwaysShow","Set","hideOnMobile","slice","Math","max","map","key","has","useCallback","useMemo","useActiveFilterChips","useExtraChips","t0","$","_c","extra","setExtra","labels","out","key","Object","keys","v","Array","isArray","length","values","t1","key_0","next","onChange","t2","computePagination","input","limit","Number","isFinite","Math","max","total","page","totalPages","ceil","safePage","min","fromIndex","toIndex","range","start","end","out","n","push","paginationSlots","siblings","nextSide","paginationItems","map","item","key","String","floor","current","boundaries","maxSlots","left","right","groupSelectionState","leafIds","selectedIds","length","selected","id","has","nextGroupSelection","state","action","ids","applyGroupLeafSelection","next","Set","add","delete","useCallback","useEffect","useMemo","useRef","useState","applyGroupLeafSelection","useSelection","options","rows","getId","resetKey","controlledValue","selectedIds","onChange","onSelectionChange","internal","setInternal","Set","allMatching","setAllMatching","controlled","undefined","modeRef","current","commit","compute","live","prev","selectAllMatching","liveRef","size","lastResetKeyRef","Object","is","visibleIds","map","selectedVisible","reduce","n","id","has","headerState","length","isSelected","toggle","next","delete","add","toggleGroupLeaves","leafIds","toggleAll","allSelected","every","clear","selectedCount","nextSort","current","key","dir","undefined","deriveSortByOptions","columns","options","column","sortable","label","header","mobileLabel","undefined","push","value","key","isEventHandler","key","value","test","mergeProps","base","overrides","out","Object","entries","existing","args","useEffect","useState","useDebounce","value","t0","$","_c","delay","undefined","debounced","setDebounced","t1","t2","id","setTimeout","clearTimeout","useEffect","useRef","useState","useDebounce","useSearchInput","search","setSearch","t0","$","_c","debounceMs","undefined","value","setValue","debounced","committedRef","t1","t2","current","t3","t4","trimmed","trim","t5","createElement","useCallback","useEffect","useMemo","columnFlexShares","columnSizeStyle","resolveColumns","visibleColumns","SEARCH_DEBOUNCE_MS","useExtraChips","resolveLabels","computePagination","useSelection","nextSort","deriveSortByOptions","devWarn","mergeProps","stableKey","useSearchInput","EMPTY_LABELS","textAlign","align","chainLevel","levels","key","find","l","sortIndexAttr","index","findIndex","undefined","ariaSort","column","sortBy","sortDir","sortable","useDataTable","options","$","_c","source","columns","declaredColumns","rowKey","tableLabel","labels","labelOverrides","dir","t0","forceMobile","t1","mobileIdentityColumns","t2","searchDebounceMs","t3","bulkActions","selectionGetId","selectedIds","onSelectedIdsChange","filterLabels","t4","multiSort","t5","locale","fitColumns","t6","columnWidths","isMobile","t7","t8","allColumns","t10","t9","seen","Set","has","add","t11","t12","t13","widths","flexShares","t14","sortByOptions","value","searchValue","setValue","setSearchValue","search","setSearch","t15","extra","setExtra","filterChips","activeFilterCount","length","t16","limit","page","total","pagination","hasBulk","getId","t17","t18","selectionResetKey","groupBy","t19","rows","resetKey","onSelectionChange","selectionState","selection","t20","next","setSort","toggleSort","t21","table","props","role","getTableProps","getHeaderRowProps","_temp","t22","sortLevels","column_0","props_1","style","getHeaderCellProps","t23","column_1","props_2","type","disabled","onClick","event","shiftKey","toggleSortLevel","header","getSortButtonProps","t24","row","props_3","id","selected","isSelected","getRowProps","getCellContent","_temp2","t25","column_3","props_4","getCellProps","t26","searchPlaceholder","props_5","placeholder","onChange","event_0","currentTarget","getSearchInputProps","t27","isLoading","t28","isEmpty","getRowKey","column_2","row_0","rowIndex","Cell","accessor","props_0","defaultLabels","useCallback","useEffect","useMemo","useRef","useRowPairMeasurer","virtualizer","enabled","$","_c","t0","Symbol","for","Map","pairs","observer","t1","owners","t2","index","pair","current","get","row","rowHeight","getBoundingClientRect","height","detailHeight","detail","total","resizeItem","report","t3","t4","ResizeObserver","seen","instance","entries","touched","Set","entry","index_0","target","undefined","add","index_1","element","keys","observe","disconnect","t5","index_2","half","node","pair_0","previous","unobserve","delete","set","attach","t6","index_3","index_4","useVirtualizer","useWindowVirtualizer","useCallback","useEffect","useMemo","useRef","VIRTUAL_OVERSCAN","useRowPairMeasurer","asSizeEstimator","estimateSize","rowSourceIndex","entry","sourceIndex","index","resolveVirtualRows","rows","rowKey","rowEntries","map","row","key","virtualColumnSpan","columnCount","hasSelection","hasActions","hasExpansion","hasReorder","useTableVirtualization","enabled","overscan","scrollMargin","getScrollElement","onEndReached","expandable","elementMode","undefined","rowKeyRef","current","getItemKey","String","windowVirtualizer","count","length","elementVirtualizer","virtualizer","virtualItems","getVirtualItems","active","measureRowPair","materializedRows","flatMap","virtualItem","notifiedAtCount","last","at","atEnd","paddingTop","paddingBottom","first","resolvedScrollMargin","options","start","getTotalSize","end","Math","max","measureElement","useKeyedVirtualization","keys","sizeOf","indices","_","item","windowGroupedEntries","entries","useCallback","useLayoutEffect","useRef","useState","documentOffsetTop","el","Math","max","round","getBoundingClientRect","top","window","scrollY","LIST_SELECTOR","virtualListElement","root","querySelector","measureWindowScrollMargin","list","useMeasuredWindowScrollMargin","enabled","fallbackRoot","scrollMargin","setScrollMargin","nodeRef","read","next","current","prev","observe","node","ResizeObserver","ro","observed","document","documentElement","addEventListener","disconnect","removeEventListener","useCallback","useEffect","useMemo","useRef","defaultConfirm","ACTIONS_COLUMN_KEY","REORDER_COLUMN_KEY","flattenColumnTree","resolveColumns","responsiveColumns","useColumnLayout","DEFAULT_CARD_SIZE_PX","DEFAULT_ROW_SIZE_PX","useBatchEditing","useDirtyCells","useEditConflict","useEditLifecycle","useRowEditing","useCellSaveState","useCellEditing","useEditValidation","mergeFilterChips","resolveActiveFilterCount","useFilterTreeChips","formatGroupBy","parseGroupBy","buildGroupedFlatModel","useGroupCollapse","useGroupPaging","useEventCallback","useInfiniteScroll","useIsMobile","useScrollToTableTop","useElementWidth","insertExtraRows","configureIncrementalView","incrementalViewOf","useRowMutations","partitionPinnedRows","useRowPinning","useRowReorder","estimateFromRowHeight","useRowExpansion","serverGroupEntries","tableErrorState","collectFeatureNotices","nestedTableDetail","buildTreeEntries","treeColumnKey","useLazyChildren","useTreeExpansion","useDataTable","devWarn","useKeyedVirtualization","useTableVirtualization","windowGroupedEntries","useMeasuredWindowScrollMargin","viewControlsToolbar","props","fullscreen","densityChooser","density","onDensityChange","supported","onToggleFullscreen","toggle","isFullscreen","active","undoRedoToolbar","wanted","history","labels","enabled","onUndo","undo","onRedo","redo","canUndo","canRedo","undoLabel","undoEdit","redoLabel","redoEdit","printToolbar","onPrint","undefined","printLabel","print","useTableChrome","$","_c","source","columns","rowKey","tableLabel","dir","forceMobile","mobileBreakpoint","mobileIdentityColumns","onRowsChange","bulkActions","selectionGetId","selectedIds","selectedIdsProp","onSelectionChange","filterLabels","onClearFilters","extraChips","activeFilterCount","activeFilterCountProp","confirm","confirmProp","columnLayout","columnLayoutProp","onColumnLayoutChange","defaultColumnLayout","groupAggregates","groupFooters","groupSort","groupFilter","groupPageSize","groupRowPageSize","onGroupLoadMore","extraRows","autoMobile","isMobile","t0","flattened","t1","leaves","locale","resolvedColumns","rootRef","rootWidth","t2","collapsibleColumnGroups","t3","groups","layout","onLayoutChange","columnGroups","requestedGroupBy","groupBy","t4","groupByKeys","serverGroups","groupingArmed","Boolean","length","allFilteredRows","t5","bb0","all","t6","Math","max","t7","rows","page","limit","total","hasNextPage","isFetchingNextPage","viewSource","state","widths","visibleColumns","available","responsive","fitColumns","multiSort","searchDebounceMs","onSelectedIdsChange","columnWidths","table","t8","t9","controlledSelection","selection","t10","ids","notifySelectionChange","t11","t12","t13","filterDefs","t14","filterTree","setFilterTree","tree","defs","treeChips","t15","filterChips","mergedChips","isPaged","paginationMode","t16","errorState","body","isLoading","isEmpty","emptyVariant","search","isRefreshing","isFetching","t17","clearExtras","clearFilters","expansionState","defaultExpandedRowIds","nestedTable","hostLabels","hostRenderRowDetail","renderRowDetail","t18","parent","t19","render","expansion","detail","t20","onEditCancel","onEditCommit","onEditError","onEditStart","onValidationFail","lifecycle","t21","cellEditingState","conflict","onCellEdit","t22","applyEdit","validateRow","validation","t23","formatEditError","onEditRollback","onRollback","formatError","saving","t24","dirtyIndicators","t25","dirty","rowModeArmed","rowEditing","onRowEdit","t26","batchArmed","batchEditing","onBatchEdit","t27","batch","editingArmed","t28","editConflict","keepMine","takeTheirs","theirsValue","conflictLabels","message","editing","t29","some","_temp","hasEditableColumn","t30","t31","t32","collapsedGroupIds","onCollapsedGroupIdsChange","groupCollapse","t33","t34","onGroupByChange","setGroupBy","sourceSetGroupBy","t35","key","getRowId","groupPaging","t36","confirmDeleteRow","onAddRow","onDeleteRow","onDuplicateRow","rowMutations","mutationActions","actions","hasRowActions","rowActions","actionsHidden","isHidden","hostRowActions","t37","bb1","t38","t39","expandedIds","onExpandedIdsChange","treeExpansion","treeShaped","getChildren","getParentId","row","hasLoadedChildren","t40","onLoadChildren","lazyChildren","t41","loadingIds","hasChildren","treeEntries","t42","Set","flatMap","_temp2","treeExportEntries","t43","bb2","t44","id","entry_0","find","candidate","entry","expanded","loadIfNeeded","t45","t46","t47","failedIds","t48","treeColumn","t49","entries","allEntries","columnKey","bb3","openGroups","incremental","view","rowPageSize","paging","footers","aggregates","sort","filter","_temp3","_temp4","withExtras","entry_3","size","scope","showMore","groupKey","collapseToDepth","depth","collapsed","expandAll","collapseAll","grouping","bb4","entry_4","kind","push","editingRows","requestedReorder","onRowReorder","reorderBlocked","hasRowReorder","reorderHidden","rowReorderEnabled","hostRowReorder","moveRowDown","moveRowUp","reorderRow","rowLifted","rowMoved","rowReorderCancelled","t50","index","t51","rowAt","rowReorderState","rowReorder","t52","pinnedRowIds","onPinnedRowIdsChange","t53","t54","row_0","t55","pinToBottom","pinToTop","unpinRow","t56","requested","blocked","rowPinning","useChromeRowPinning","t57","t58","editConflictPolicy","onEditConflict","rowVersion","discardIfRowMissing","row_1","reconcile","openedRow","draft","policy","keep","row_2","keepLive","take","row_3","value","takeLive","showFooter","error","t59","t60","t61","t62","exportCsv","virtualize","rowPinningRequested","rowReorderRequested","nestedArmed","featureNotices","t63","el","current","value_0","map","_temp5","join","dataset","adapttableNotices","hasAnyActions","t64","bb5","t65","pins","t66","t67","visibleRowActions","dropped","droppedColumns","allColumns","notice","entry_2","entry_1","level","descendantIds","column","editable","useChromeBodyData","chrome","fetchNextPage","fetchNext","scrollBoxRef","inScrollBox","maxHeight","measureWindowOffset","virtualScrollMargin","scrollMargin","measuredScrollMargin","observe","observeWindowList","node","virtualScrollRef","isBodyEligible","bodyEligible","entryKeys","groupKeys","treeArmed","treeKeys","pinState","Symbol","for","top","scroll","bottom","partitioned","estimateBodyItemSize","estimateSize","virtualOverscan","overscan","getScrollElement","onEndReached","scrollOpts","keys","groupVirtualization","treeVirtualization","expandable","virtualization","indices","groupingEntries","resolveBodyVirtualization","resolvedVirtualization","boxVirtual","canLoadMore","bodySentinelCount","itemCount","loadMoreRef","Map","forEach","set","sourceIndexById","sourceIndex","get","pinnedVirtualization","pinnedTopRows","pinnedBottomRows","nested","scrollRows","fallback","estimateCardSize","estimateRowSize","rowHeight","keyed","paddingTop","paddingBottom","measureElement","useChromeScrollReset","ref","pageDep","sortBy","sortDir","scrollToTopOnChange","scrollTopGap","stickyTop","deps","offset","gap","options","useFilterTriggerToggle","open","setOpen","wasOpenAtPointerDown","closedByKit","_temp6","onPointerDown","onClick","humanizeKey","columnHeaderLabel","column","header","key","columnHeaderController","extras","label","sortDir","sortIndex","toggleSort","undefined","resolveColumnHeader","controller","renderHeader","ctx","resolveColumnFooter","value","renderFooter","columnsHaveFooter","columns","some","useCallback","useState","isRtlElement","COLUMN_DND_MIME","columnRowDragProps","key","draggable","onDragStart","event","target","closest","preventDefault","dataTransfer","setData","effectAllowed","isRtl","grip","columnReorderKeyProps","index","move","label","role","tabIndex","onKeyDown","horizontal","vertical","startKey","currentTarget","towardStart","columnDropProps","onDragOver","types","includes","dropEffect","onDrop","getData","useColumnDragState","$","_c","drag","setDrag","overIndex","setOverIndex","t0","Symbol","for","reset","t1","base","defaultPrevented","from","onDragEnd","rowDragProps","t2","index_0","base_0","event_0","event_1","dropProps","t3","key_0","index_1","rowAttrs","t4","t5","draggingKey","useCallback","useRef","useState","useHorizontalOverflow","$","_c","overflowing","setOverflowing","observerRef","t0","Symbol","for","node","current","disconnect","ResizeObserver","measure","scrollWidth","clientWidth","observer","observe","firstElementChild","ref","t1","useCallback","useEffect","useState","PIN_Z","resolveVirtualRows","PINNED_TOP_PART","PINNED_BOTTOM_PART","pinnedRowPart","side","undefined","pinnedRowSticky","sticky","headerOffsetPx","offset","pinnedRowStickyStyle","position","top","zIndex","rowPinned","bottom","pinnedRowCellStyle","columnPinned","edge","rowPinnedColumn","useOffsetHeight","$","_c","node","setNode","height","setHeight","t0","Symbol","for","next","getBoundingClientRect","ref","t1","t2","ResizeObserver","observer","observe","disconnect","t3","orderedCardEntries","rows","getRowId","rowEntries","pinnedTop","pinnedBottom","length","pinnedIds","Set","row","add","indexById","Map","forEach","index","set","asEntry","key","sourceIndex","get","scroll","filter","entry","has","map","isCellEditable","isMultiSelectEditor","isSelectEditor","normalizeEditorOptions","readEditableCellValue","resolveCellEditor","resolveCommitValue","observeEdit","beginCellEdit","beginEdit","editableCellController","options","editing","row","column","rowId","rows","columns","rowKey","idle","mode","validating","isDirty","canRollback","rollback","undefined","dismissFailure","editor","selectOptions","draft","begin","setDraft","commit","cancel","onEditorKeyDown","commitOnBlur","keepConflict","takeConflict","onCellEdit","state","validation","saving","dirty","isEditing","isActive","key","validateCell","asCellValidator","gated","hasRowValidator","sendToHost","resolved","result","value","columnKey","lifecycle","onEditCommit","previousValue","unit","mark","track","previous","attempted","then","saved","confirm","commitNow","commitValidated","verdict","check","target","allowed","error","onValidationFail","close","beginNext","nextRow","find","r","nextCol","c","liveConflict","conflict","isConflict","current","validationError","errorFor","rowErrorFor","conflictLabels","message","isValidating","saveStatus","statusFor","saveFailure","failureFor","clear","pending","event","preventDefault","outcome","handleKeyDown","action","advance","advanceTarget","committed","keep","take","validate","stopCellEditKeyboard","stopPropagation","focusEditorOnMount","node","focus","rowIsDirty","isRowDirty","rowEditingSignature","active","marked","rowHasError","busy","save","signature","rowSave","includes","marks","rowMarks","rowMode","rowEditing","rowDrafts","activeRowId","batchAll","batch","batchRow","split","entry","startsWith","live","conflictMark","incomingValue","base","isCustomEditor","normalizeEditorOptions","resolveCellEditor","focusEditorOnMount","RowEditCell","t0","$","_c","rowEditing","column","display","editLabel","takesFocus","renderEditor","t1","t2","Symbol","for","bb0","editor","focusRef","_temp","t3","key","value","setDraft","t4","event","preventDefault","save","cancel","ctrl","draft","draftFor","onEditorKeyDown","commitOnBlur","_temp2","selectOptions","selectOptionsFor","validating","errorId","render","commit","onKeyDown","onBlur","label","type","options","rowEditControls","row","rowId","labels","editing","isEditing","begin","editRow","saveLabel","saveRow","cancelLabel","dirty","isDirty","RowEditActionsChrome","buttonClassName","className","slots","controls","Button","stopPropagation","gap","event_0","t5","event_1","t6","t7","BatchEditCell","batch","_temp3","_temp4","_temp5","cancelRow","_temp6","isChanged","undefined","BatchEditBarChrome","pending","pendingRows","defaultPendingRows","count","alignItems","saveAll","cancelAll","t8","t9","String","useLayoutEffect","useRef","booleanDraft","formatMultiDraft","isCustomEditor","editableCellController","focusEditorOnMount","stopCellEditKeyboard","BatchEditCell","RowEditCell","isFirstEditableColumn","columns","key","first","find","column","editable","undefined","editorValidationProps","ctrl","error","errorId","validating","conflict","editorBusyProps","describedBy","ConflictNotice","props","errorClassName","slots","Button","conflictLabels","holdFocus","event","preventDefault","message","theirsValue","incomingValue","keepMine","stopPropagation","keepConflict","takeTheirs","takeConflict","commitBooleanDraft","checked","setDraft","commitOnBlur","multiDraftFromSelect","select","selectedOptions","map","option","value","EditableCellGate","activateRef","restoreFocusRef","editing","row","rowId","rows","rowKey","current","mode","focus","batch","display","editLabel","renderEditor","rowEditing","isEditing","onEditorKeyDown","editor","custom","render","draft","commit","cancel","onKeyDown","onBlur","focusRef","label","selectOptions","kitRendersError","Activate","activateClassName","saveStatus","isDirty","node","begin","saveFailure","saveErrorClassName","canRollback","undoLabel","rollbackClassName","rollback","useCallback","useMemo","useRef","useState","getPath","readCellValue","row","column","editValue","sortValue","key","DEFAULT_DEPTH","useEditHistory","options","$","_c","enabled","depth","t0","columns","onCellEdit","undefined","t1","Symbol","for","past","t2","future","t3","counts","setCounts","t4","current","length","sync","t5","find","columnFor","t6","edits","undo","flatMap","edit","column_0","columnKey","value","redo","slice","record","t7","edits_0","edit_0","replay","t8","entry","at","undo_0","t9","entry_0","t10","clear","t11","t12","t13","canUndo","canRedo","useTableEditHistory","props","editHistory","history","nextValue","recording","asGesture","apply","useCallback","useMemo","useState","useSyncExternalStore","EMPTY_ROW_PIN_STATE","useResolvedAdapter","readRowPins","writeRowPins","useRowPinningUrlState","t0","$","_c","t1","undefined","options","urlAdapter","urlSync","urlKey","ns","resolved","t2","t3","onChange","subscribe","getSearch","t4","search","pending","setPending","t5","bb0","t6","URLSearchParams","pinnedRowIds","next","params","setSearch","toString","onPinnedRowIdsChange","t7"],"sources":["../src/utils/devWarn.ts","../src/actions/confirm.ts","../src/actions/useBulkActionRunner.ts","../src/actions/commandRegistry.ts","../src/actions/useShortcuts.ts","../src/columns/columnText.ts","../src/utils/humanizeKey.ts","../src/utils/localeTag.ts","../src/columns/resolveColumns.ts","../src/filters/operators.ts","../src/filters/relativeDates.ts","../src/filters/filterDefs.ts","../src/filters/rangeWidget.ts","../src/filters/filterForm.ts","../src/filters/checklist.ts","../src/filters/facets.ts","../src/filters/filterRegistry.ts","../src/filters/filterBuiltins.ts","../src/filters/filterChrome.ts","../src/virtual/ColumnSpacer.tsx","../src/hooks/useEventCallback.ts","../src/filters/useFilterOptions.ts","../src/filters/FilterHeaderRow.tsx","../src/source/queryContract.ts","../src/filters/filterTree.ts","../src/filters/filterTreeMutations.ts","../src/filters/useFilterTreeChips.ts","../src/find/findMatches.ts","../src/focus/gridFocus.ts","../src/focus/cellRange.ts","../src/find/useFindInTable.ts","../src/focus/cellEdits.ts","../src/focus/clipboardRange.ts","../src/editing/cellEditing.ts","../src/focus/fillRange.ts","../src/focus/pasteRange.ts","../src/focus/selectionStats.ts","../src/focus/useGridFocus.ts","../src/layout/useFullscreen.ts","../src/hooks/useMediaQuery.ts","../src/hooks/usePrefersReducedMotion.ts","../src/utils/stableKey.ts","../src/constants.ts","../src/hooks/useIsMobile.ts","../src/url/useTableUrlState.ts","../src/source/useServerData.ts","../src/grouping/groupRows.ts","../src/rows/incrementalAggregate.ts","../src/rows/incrementalGroup.ts","../src/rows/patch.ts","../src/rows/incremental.ts","../src/source/useFrontendData.ts","../src/source/useTableData.ts","../src/columns/headerGroups.ts","../src/columns/columnTree.ts","../src/columns/columnWidths.ts","../src/columns/useColumnLayout.ts","../src/columns/columnMenuModel.ts","../src/columns/responsiveColumns.ts","../src/editing/editingEvents.ts","../src/editing/batchEditing.ts","../src/editing/dirtyCells.ts","../src/editing/editConflict.ts","../src/editing/rowEditing.ts","../src/editing/saveState.ts","../src/editing/useCellEditing.ts","../src/editing/validation.ts","../src/filters/useActiveFilterChips.ts","../src/grouping/groupKeys.ts","../src/grouping/useGroupCollapse.ts","../src/grouping/useGroupPaging.ts","../src/hooks/useInfiniteScroll.ts","../src/hooks/useScrollToTableTop.ts","../src/layout/useElementWidth.ts","../src/rows/rowStyle.ts","../src/rows/extraRows.ts","../src/rows/rowMutations.ts","../src/rows/rowPinning.ts","../src/rows/rowReorder.ts","../src/rows/useRowExpansion.ts","../src/source/queryGroups.ts","../src/state/errorState.ts","../src/export/exportView.ts","../src/export/tableCsv.ts","../src/state/featureNotices.ts","../src/tree/nestedTable.tsx","../src/tree/treeRows.ts","../src/tree/useLazyChildren.ts","../src/tree/useTreeExpansion.ts","../src/columns/columnSizing.ts","../src/columns/visibleColumns.ts","../src/filters/useExtraChips.ts","../src/pagination/paginationMath.ts","../src/grouping/groupSelection.ts","../src/selection/useSelection.ts","../src/sort/cycleSort.ts","../src/sort/sortByOptions.ts","../src/utils/mergeProps.ts","../src/hooks/useDebounce.ts","../src/useDataTable/useSearchInput.ts","../src/useDataTable/useDataTable.ts","../src/virtual/measureRowPair.ts","../src/virtual/useTableVirtualization.ts","../src/virtual/windowScrollMargin.ts","../src/useTableChrome.ts","../src/columns/columnHeader.ts","../src/columns/columnReorder.ts","../src/layout/useHorizontalOverflow.ts","../src/rows/pinnedRowChrome.ts","../src/editing/editableCellController.ts","../src/editing/RowEditGate.tsx","../src/editing/EditableCellGate.tsx","../src/editing/editHistory.ts","../src/url/useRowPinningUrlState.ts"],"sourcesContent":["/** Minimal shape of a Node-style `process` global, typed locally so the\n * package needs no Node type dependency. */\ninterface ProcessLike {\n  env?: Record<string, string | undefined>;\n}\n\n/** True outside production builds. Bundlers inline `NODE_ENV` and drop the\n * dev-only branches; without a bundler (plain browser) this stays on. */\nfunction isDev(): boolean {\n  const proc = (globalThis as { process?: ProcessLike }).process;\n  return proc?.env?.NODE_ENV !== \"production\";\n}\n\nconst seen = new Set<string>();\n\n/**\n * Log a development-only warning once per unique message. Silent in\n * production builds, never throws — safe to call from render paths via\n * effects. Used for misconfiguration that would otherwise fail silently\n * (a sort that cannot resolve, duplicate column keys, …).\n */\nexport function devWarn(message: string): void {\n  if (!isDev() || seen.has(message)) return;\n  seen.add(message);\n  console.warn(`[adapttable] ${message}`);\n}\n\n/** Test-only seam: forget which warnings have fired. */\nexport function resetDevWarnings(): void {\n  seen.clear();\n}\n","import type { RowAction } from \"../types\";\nimport { devWarn } from \"../utils/devWarn\";\n\n/** A confirmation request raised by a row or bulk action. */\nexport interface ConfirmRequest {\n  /** Dialog title. */\n  title: string;\n  /** Dialog message. */\n  message: string;\n  /** Confirm button label. */\n  confirmLabel: string;\n  /** Cancel button label. */\n  cancelLabel: string;\n  /** Marks the action destructive. */\n  danger?: boolean;\n  /** Runs when the user accepts. */\n  onConfirm: () => void;\n}\n\n/** Shows a confirmation, then runs `onConfirm` if accepted. */\nexport type ConfirmHandler = (request: ConfirmRequest) => void;\n\n/**\n * The default confirmation handler — a dependency-free `window.confirm`.\n * Adapters pass a styled handler when they have one.\n *\n * When no dialog exists at all (SSR, jsdom, some embedded webviews) the\n * action is DENIED: an environment that cannot ask must never approve a\n * destructive action on the user's behalf. Integrators in dialogless\n * environments pass their own `confirm` handler.\n */\nexport const defaultConfirm: ConfirmHandler = ({ message, onConfirm }) => {\n  const native = (globalThis as { confirm?: (m?: string) => boolean }).confirm;\n  if (typeof native !== \"function\") {\n    devWarn(\n      \"no confirm dialog is available in this environment — the action was NOT run. Pass a `confirm` handler to support dialogless environments.\"\n    );\n    return;\n  }\n  if (native(message)) onConfirm();\n};\n\n/**\n * Normalize a `disabledReason` result. Per the action contract only a\n * *non-empty* string disables, so an empty string maps to `undefined` —\n * letting every adapter treat \"disabled\" as simply \"reason is defined\" and\n * fall back to the action label for tooltips. (A plain `|| undefined` would\n * trip `prefer-nullish-coalescing`; this keeps the falsy-empty intent.)\n */\nexport function resolveDisabledReason(\n  reason: string | undefined\n): string | undefined {\n  return reason !== undefined && reason !== \"\" ? reason : undefined;\n}\n\n/**\n * Run a row action, routing through `confirm` first when the action\n * declares a `confirm` block.\n *\n * @typeParam TRow - The row type.\n * @param action - The action to run.\n * @param row - The row it was triggered on.\n * @param confirm - The confirmation handler.\n * @param cancelLabel - Cancel label for the dialog.\n */\nexport function runRowAction<TRow>(\n  action: RowAction<TRow>,\n  row: TRow,\n  confirm: ConfirmHandler,\n  cancelLabel: string\n): void {\n  if (!action.confirm) {\n    action.onClick(row);\n    return;\n  }\n  confirm({\n    title: action.confirm.title,\n    message: action.confirm.message(row),\n    confirmLabel: action.confirm.confirmLabel,\n    cancelLabel,\n    danger: action.confirm.danger,\n    onConfirm: () => action.onClick(row),\n  });\n}\n","import { useCallback, useState } from \"react\";\n\nimport type { BulkAction, BulkActionContext } from \"../types\";\nimport type { ConfirmHandler } from \"./confirm\";\n\n/** A bulk-action rejection as display text, or `null` when there is none. */\nexport function bulkActionErrorMessage(error: unknown): string | null {\n  if (error == null) return null;\n  if (error instanceof Error) return error.message;\n  if (typeof error === \"string\") return error;\n  if (\n    typeof error === \"number\" ||\n    typeof error === \"boolean\" ||\n    typeof error === \"bigint\"\n  ) {\n    return String(error);\n  }\n  try {\n    return JSON.stringify(error) ?? \"Unknown error\";\n  } catch {\n    return \"Unknown error\";\n  }\n}\n\n/** How a bulk-action run ended — passed to `onComplete` on every run. */\nexport type BulkActionOutcome =\n  | { status: \"success\" }\n  | { status: \"error\"; error: unknown };\n\n/** Options for {@link useBulkActionRunner}. */\nexport interface UseBulkActionRunnerOptions {\n  /** Confirmation handler for actions that declare a `confirm` block. */\n  confirm: ConfirmHandler;\n  /** Cancel label for confirm dialogs. */\n  cancelLabel: string;\n  /**\n   * Called after EVERY run with its outcome — success or failure — so a\n   * host can clear the selection on success and report failures. (Earlier\n   * versions only called this on success, with no argument.)\n   */\n  onComplete?: (outcome: BulkActionOutcome) => void;\n}\n\n/** The runner returned by {@link useBulkActionRunner}. */\nexport interface BulkActionRunner {\n  /** Key of the action currently running, or `null`. */\n  pending: string | null;\n  /**\n   * The value the last run rejected with, or `null`. Cleared when the\n   * next run starts.\n   */\n  error: unknown;\n  /**\n   * Run a bulk action against the given ids (confirming first if needed).\n   * Omit `context` for the plain page-selection scope.\n   */\n  run: (action: BulkAction, ids: string[], context?: BulkActionContext) => void;\n}\n\n/**\n * Headless runner for bulk actions: tracks the in-flight action key,\n * routes through the confirmation handler, catches rejections (exposed as\n * `error`, never an unhandled rejection), and calls `onComplete` with the\n * outcome of every run. Adapters render the buttons and call `run`.\n *\n * @param options - See {@link UseBulkActionRunnerOptions}.\n * @returns The {@link BulkActionRunner}.\n */\nexport function useBulkActionRunner({\n  confirm,\n  cancelLabel,\n  onComplete,\n}: UseBulkActionRunnerOptions): BulkActionRunner {\n  const [pending, setPending] = useState<string | null>(null);\n  const [error, setError] = useState<unknown>(null);\n\n  const run = useCallback(\n    (action: BulkAction, ids: string[], context?: BulkActionContext) => {\n      if (ids.length === 0) return;\n      const scope: BulkActionContext = context ?? {\n        allMatching: false,\n        total: ids.length,\n      };\n      const fire = async () => {\n        try {\n          setPending(action.key);\n          setError(null);\n          await action.onClick(ids, scope);\n          onComplete?.({ status: \"success\" });\n        } catch (error_) {\n          setError(error_);\n          onComplete?.({ status: \"error\", error: error_ });\n        } finally {\n          setPending(null);\n        }\n      };\n      if (action.confirm) {\n        confirm({\n          title: action.confirm.title,\n          // The confirm count reflects the SCOPE: the whole matching set\n          // when \"select all matching\" is active, the page ids otherwise.\n          message: action.confirm.message(scope.total),\n          confirmLabel: action.confirm.confirmLabel,\n          cancelLabel,\n          danger: action.confirm.danger,\n          onConfirm: () => void fire(),\n        });\n      } else {\n        void fire();\n      }\n    },\n    [confirm, cancelLabel, onComplete]\n  );\n\n  return { pending, error, run };\n}\n","/**\n * Every action the table can perform, in one list.\n *\n * A command palette that keeps its own list of commands is a second place\n * for an action to exist, and the two drift: an action gains a condition in\n * the menu and not in the palette, or is renamed in one and not the other,\n * and the palette quietly offers something that no longer works. So there\n * is no palette-shaped command type here. A command IS a\n * {@link ContextMenuItem} — the same object the context menus already\n * render — and the palette is another way of showing the same list.\n *\n * What a palette adds is reach. A context menu is scoped to what was\n * right-clicked; a palette is scoped to the table, so it carries the\n * actions that have no particular target — print, export, clear the\n * filters — alongside the ones a menu would offer for the current\n * selection.\n *\n * Filtering is a plain substring match, case- and accent-insensitive.\n * Fuzzy matching is a good default for a file switcher with thousands of\n * paths and a poor one for a list of a dozen actions, where it mostly\n * finds the wrong entry with a high score.\n */\nimport type { ContextMenuItem } from \"./contextMenuModel\";\n\n/** A command, which is exactly a menu entry. */\nexport type Command = ContextMenuItem;\n\n/** One command, with the text a search matches against. */\ninterface Searchable {\n  item: Command;\n  haystack: string;\n}\n\n/**\n * Fold accents and case so a search for \"resume\" finds \"Résumé\".\n *\n * Someone typing into a palette is typing quickly, from memory, in\n * whatever keyboard layout they have. Making them reproduce diacritics is\n * a way of hiding an action from them.\n */\nfunction fold(text: string): string {\n  return text\n    .normalize(\"NFD\")\n    .replace(/\\p{Diacritic}/gu, \"\")\n    .toLowerCase();\n}\n\nfunction searchable(item: Command): Searchable {\n  return { item, haystack: fold(item.label) };\n}\n\n/**\n * The commands matching a query, in the order they were registered.\n *\n * Registration order is deliberate: it is the order the host chose, which\n * is more meaningful than alphabetical and does not move under the user as\n * they type. An empty query lists everything.\n *\n * @param commands - Every command available right now.\n * @param query - What the user has typed.\n * @returns The matches.\n */\nexport function filterCommands(\n  commands: readonly Command[],\n  query: string\n): Command[] {\n  const needle = fold(query.trim());\n  if (needle === \"\") return [...commands];\n  return commands\n    .map(searchable)\n    .filter(({ haystack }) => haystack.includes(needle))\n    .map(({ item }) => item);\n}\n\n/** What {@link tableCommands} needs to build the table-wide actions. */\nexport interface TableCommandOptions {\n  /** Labels for the built-in commands. */\n  labels: {\n    print?: string;\n    exportCsv?: string;\n    clearAll?: string;\n  };\n  /** Open the print dialog on the current view. */\n  onPrint?: () => void;\n  /** Run the export the toolbar button runs. */\n  onExport?: () => void;\n  /** Clear every active filter. */\n  onClearFilters?: () => void;\n  /** Whether there is anything to clear, so the entry can say so. */\n  hasFilters?: boolean;\n}\n\n/**\n * The commands that belong to the table rather than to a target.\n *\n * Each appears only when its handler is wired, on the same rule the\n * context menus follow: an action the host has not connected is not\n * offered, because a palette entry that does nothing is worse than one\n * that is missing.\n *\n * @param options - The handlers and their labels.\n * @returns The table-wide commands, in display order.\n */\nexport function tableCommands(options: TableCommandOptions): Command[] {\n  const { labels } = options;\n  const commands: Command[] = [];\n  if (options.onPrint) {\n    commands.push({\n      key: \"print\",\n      label: labels.print ?? \"Print\",\n      onSelect: options.onPrint,\n    });\n  }\n  if (options.onExport) {\n    commands.push({\n      key: \"export\",\n      label: labels.exportCsv ?? \"Export CSV\",\n      onSelect: options.onExport,\n    });\n  }\n  if (options.onClearFilters) {\n    commands.push({\n      key: \"clear-filters\",\n      label: labels.clearAll ?? \"Clear all\",\n      disabled: options.hasFilters !== true,\n      onSelect: options.onClearFilters,\n    });\n  }\n  return commands;\n}\n","/**\n * Keyboard shortcuts, as a list the host can read and change.\n *\n * A shortcut hard-coded in a key handler is a shortcut nobody can remap,\n * and remapping is not a preference — it is the difference between a table\n * that works inside an application and one that fights it. The host's app\n * may already own Ctrl+K. Its users may be on a layout where the default\n * is awkward, or using software that has claimed the chord.\n *\n * So a shortcut is data: a chord, and the command key it runs. The\n * defaults are the ones people already know, and any of them can be\n * replaced or removed by passing a different list.\n *\n * Matching deliberately ignores the physical key's layout — `event.key` is\n * the character the user's layout produces, which is what they typed and\n * what the shortcut was written as. It is compared case-insensitively,\n * because Shift is part of the chord rather than part of the letter.\n */\nimport { useEffect } from \"react\";\n\n/** One shortcut: the chord, and what it runs. */\nexport interface Shortcut {\n  /**\n   * The chord, as `\"mod+k\"`. `mod` is Cmd on a Mac and Ctrl elsewhere,\n   * which is the only way to write one shortcut that is right on both.\n   * Also accepts `ctrl`, `meta`, `alt` and `shift`.\n   */\n  chord: string;\n  /** The key of the command it runs. */\n  command: string;\n}\n\n/** The shortcuts a table has unless the host says otherwise. */\nexport const DEFAULT_SHORTCUTS: readonly Shortcut[] = [\n  { chord: \"mod+k\", command: \"command-palette\" },\n];\n\ninterface Chord {\n  key: string;\n  mod: boolean;\n  ctrl: boolean;\n  meta: boolean;\n  alt: boolean;\n  shift: boolean;\n}\n\nfunction parseChord(chord: string): Chord {\n  const parts = chord.toLowerCase().split(\"+\");\n  const key = parts.at(-1) ?? \"\";\n  return {\n    key,\n    mod: parts.includes(\"mod\"),\n    ctrl: parts.includes(\"ctrl\"),\n    meta: parts.includes(\"meta\"),\n    alt: parts.includes(\"alt\"),\n    shift: parts.includes(\"shift\"),\n  };\n}\n\n/** Whether an event is this chord. */\nfunction matches(chord: Chord, event: KeyboardEvent): boolean {\n  if (event.key.toLowerCase() !== chord.key) return false;\n  // `mod` is satisfied by either, so one chord is right on every platform\n  // without the host writing two.\n  const mod = event.metaKey || event.ctrlKey;\n  if (chord.mod ? !mod : false) return false;\n  if (chord.ctrl && !event.ctrlKey) return false;\n  if (chord.meta && !event.metaKey) return false;\n  if (chord.alt !== event.altKey) return false;\n  if (chord.shift !== event.shiftKey) return false;\n  // A chord with no modifier must not fire while a modifier is held, or\n  // \"e\" would trigger inside Ctrl+E.\n  return chord.mod || chord.ctrl || chord.meta ? true : !mod;\n}\n\n/**\n * True while the event came from somewhere text is being typed.\n *\n * A single-key shortcut must not fire while someone is filling in the\n * search box or a cell editor. Chords with a modifier still work there,\n * because that is what a modifier is for.\n */\nfunction inTextEntry(target: EventTarget | null): boolean {\n  if (!(target instanceof HTMLElement)) return false;\n  const tag = target.tagName;\n  return (\n    tag === \"INPUT\" ||\n    tag === \"TEXTAREA\" ||\n    tag === \"SELECT\" ||\n    target.isContentEditable\n  );\n}\n\n/** What {@link useShortcuts} needs. */\nexport interface UseShortcutsOptions {\n  /** Off unless the host armed it; nothing is bound when false. */\n  enabled: boolean;\n  /** The shortcuts. Defaults to {@link DEFAULT_SHORTCUTS}. */\n  shortcuts?: readonly Shortcut[];\n  /** Run a command by key. Returning nothing is fine. */\n  onCommand: (command: string) => void;\n  /**\n   * Where to listen. Defaults to the document, which is what a\n   * table-scoped palette wants: the shortcut has to work when focus is on\n   * the table, in its toolbar, or nowhere in particular.\n   */\n  target?: () => EventTarget | null;\n}\n\n/**\n * Bind a table's shortcuts.\n *\n * @param options - The shortcuts and what to do when one fires.\n */\nexport function useShortcuts(options: UseShortcutsOptions): void {\n  const { enabled, onCommand } = options;\n  const shortcuts = options.shortcuts ?? DEFAULT_SHORTCUTS;\n  const getTarget = options.target;\n  useEffect(() => {\n    if (!enabled || shortcuts.length === 0) return;\n    const parsed = shortcuts.map((shortcut) => ({\n      chord: parseChord(shortcut.chord),\n      command: shortcut.command,\n    }));\n    const node = getTarget?.() ?? document;\n    const onKeyDown = (event: Event) => {\n      if (!(event instanceof KeyboardEvent)) return;\n      for (const { chord, command } of parsed) {\n        const bare = !chord.mod && !chord.ctrl && !chord.meta;\n        if (bare && inTextEntry(event.target)) continue;\n        if (!matches(chord, event)) continue;\n        event.preventDefault();\n        onCommand(command);\n        return;\n      }\n    };\n    node.addEventListener(\"keydown\", onKeyDown);\n    return () => {\n      node.removeEventListener(\"keydown\", onKeyDown);\n    };\n  }, [enabled, shortcuts, onCommand, getTarget]);\n}\n","/**\n * A column's cell as plain text.\n *\n * Everything that is not the rendered cell needs this and cannot use\n * `accessor`, because `accessor` returns a `ReactNode`: a status badge is a\n * React element, an avatar cell is a component, and neither is a word. So a\n * screen-reader announcement, an `aria-label`, a tooltip, or a clipboard copy\n * has nothing to read — which is exactly the hole that showed up the moment\n * the grid focus model had to say a cell out loud.\n *\n * Text is always available here. The order goes from most deliberate to most\n * inferred:\n *\n * 1. `formatValue` — the column stating its own text.\n * 2. `exportValue` — already the underlying value, minus the formatting.\n * 3. `sortValue` — a primitive by definition.\n * 4. `accessor` — used only when it happens to return a primitive.\n * 5. the key's data path — but ONLY for a column that renders no cell of its\n *    own, because that is the only case where the path is what is on screen.\n *\n * That last restriction is the whole accessibility point. A column with\n * `accessor: () => null` renders an empty cell; reading its data path would\n * announce a value the user cannot see, which is worse than announcing\n * nothing. Such a column gets `\"\"` — and the fix is to give it a\n * `formatValue`, which is exactly what the field is for.\n */\nimport type { ColumnDef } from \"../types\";\nimport { getPath } from \"../utils/path\";\n\n/** Primitives read as themselves; a date reads as its ISO day. */\nfunction asText(value: unknown): string | undefined {\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  if (value instanceof Date) return value.toISOString().slice(0, 10);\n  return undefined;\n}\n\n/**\n * The text for one cell — never `undefined`, so a caller never has to decide\n * what to say when a column declines to answer.\n *\n * @typeParam TRow - The row type.\n * @param column - The column being read.\n * @param row - The row being read.\n * @returns The cell as text, or `\"\"` when the column holds nothing readable.\n */\nexport function columnText<TRow>(column: ColumnDef<TRow>, row: TRow): string {\n  if (column.formatValue) return column.formatValue(row);\n\n  // A column that renders its own cell does not get the data path as a\n  // fallback: the path is not what is on screen. `resolveColumns` generates an\n  // accessor FROM the path for a bare `{ key }` column, so that case is\n  // already covered by the accessor branch.\n  const rendersOwnCell = Boolean(column.accessor ?? column.Cell);\n  const candidates = [\n    column.exportValue?.(row),\n    column.sortValue?.(row),\n    column.accessor?.(row),\n    rendersOwnCell ? undefined : getPath(row, column.key),\n  ];\n  for (const candidate of candidates) {\n    const text = asText(candidate);\n    // An empty string is a real answer — a column that says \"nothing here\"\n    // must not fall through to a data path that says something else.\n    if (text !== undefined) return text;\n  }\n  return \"\";\n}\n","/**\n * Default column-header text from a key: the last dot-path segment, split on\n * camelCase / snake_case / kebab-case boundaries and title-cased.\n * `\"hiredAt\"` → `\"Hired At\"`, `\"department.name\"` → `\"Name\"`,\n * `\"first_name\"` → `\"First Name\"`. An empty/undefined `key` returns `\"\"` so a\n * transiently-malformed column key can never crash a render.\n */\nexport function humanizeKey(key: string): string {\n  if (!key) return \"\";\n  // `split` always yields at least one element, so the last one exists.\n  const segment = key.split(\".\").at(-1)!;\n  const words = segment\n    .replaceAll(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n    .replaceAll(/[_-]+/g, \" \")\n    .trim()\n    .split(/\\s+/);\n  return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n}\n","/**\n * ONE locale-tag resolution for everything locale-shaped: label presets\n * (`@adapttable/i18n`) and per-column `i18n` data paths resolve through\n * the same rules, so `locale=\"ar_EG\"` can never pick Arabic labels while\n * missing the Arabic column paths.\n */\n\n/** Normalize a BCP-47-ish tag: trim, `_` → `-`, lower-case. */\nexport function normalizeLocaleTag(locale: string): string {\n  return locale.trim().replaceAll(\"_\", \"-\").toLowerCase();\n}\n\n/**\n * Resolve a locale against a set of available tags: the exact tag first\n * (case- and separator-insensitive), then its primary subtag. Returns the\n * ORIGINAL available tag so callers can index their own maps with it.\n */\nexport function resolveLocaleTag(\n  available: Iterable<string>,\n  locale: string\n): string | undefined {\n  const target = normalizeLocaleTag(locale);\n  const tags = [...available];\n  const exact = tags.find((tag) => normalizeLocaleTag(tag) === target);\n  if (exact !== undefined) return exact;\n  const primary = target.split(\"-\", 1)[0]!;\n  return tags.find((tag) => normalizeLocaleTag(tag) === primary);\n}\n","import type { ColumnDef } from \"../types\";\nimport { humanizeKey } from \"../utils/humanizeKey\";\nimport { resolveLocaleTag } from \"../utils/localeTag\";\nimport { getPath } from \"../utils/path\";\n\n/** Cell content from a dot-path value: primitives render, anything else does not. */\nfunction pathCell(value: unknown): string | null {\n  switch (typeof value) {\n    case \"string\":\n      return value;\n    case \"number\":\n    case \"boolean\":\n    case \"bigint\":\n      return String(value);\n    default:\n      return null;\n  }\n}\n\n/**\n * The data path a column reads for the active locale: the exact locale tag\n * first (`\"ar-EG\"`), then its primary subtag (`\"ar\"`), then the key itself.\n * Works for flat per-language fields and nested objects alike — both are\n * just paths.\n */\nexport function localizedColumnPath(\n  column: Pick<ColumnDef<unknown>, \"key\" | \"i18n\">,\n  locale: string | undefined\n): string {\n  if (!column.i18n || !locale) return column.key;\n  // The SAME resolution the label presets use (case- and separator-\n  // insensitive, exact tag then primary subtag) — `\"ar_EG\"` must not get\n  // Arabic labels while missing the Arabic data paths.\n  const tag = resolveLocaleTag(Object.keys(column.i18n), locale);\n  return (tag !== undefined ? column.i18n[tag] : undefined) ?? column.key;\n}\n\n/**\n * Fill a column's declarative defaults: a missing `header` is humanized from\n * the key, and a column without `accessor`/`Cell` reads the row by its\n * locale-resolved data path (`i18n` map, else `key` — dot paths reach nested\n * values). Client-side sorting follows the generated accessor, so localized\n * columns sort by the localized text. Already-complete columns pass through\n * untouched, so the resolution is idempotent and cheap to repeat.\n */\nexport function resolveColumns<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  locale?: string\n): ColumnDef<TRow>[] {\n  return columns.map((column) => {\n    const needsHeader = column.header === undefined;\n    const needsAccessor = !column.accessor && !column.Cell;\n    if (!needsHeader && !needsAccessor) return column;\n    const path = localizedColumnPath(column, locale);\n    return {\n      ...column,\n      header: needsHeader ? humanizeKey(column.key) : column.header,\n      accessor: needsAccessor\n        ? (row: TRow) => pathCell(getPath(row, path))\n        : column.accessor,\n    };\n  });\n}\n","/**\n * Filter-operator registry. Each built-in type declares the operators it\n * understands; the token written to `f_<key>Op` is the stable URL / Saved\n * Views / query-contract id. Omitting the param keeps the historical\n * default so existing links keep matching.\n */\nimport type { ExtraFilters, FilterValue, TableLabels } from \"../types\";\n\n/** Suffix on the filter key that stores the operator token (`name` → `nameOp`). */\nexport const FILTER_OP_SUFFIX = \"Op\";\n\n/** The extra-bag / `f_` key that holds one definition's operator. */\nexport function filterOpKey(key: string): string {\n  return key + FILTER_OP_SUFFIX;\n}\n\n/** True when `key` is an operator slot (`nameOp`), not a value slot. */\nexport function isFilterOpKey(key: string): boolean {\n  return key.endsWith(FILTER_OP_SUFFIX) && key.length > FILTER_OP_SUFFIX.length;\n}\n\n/** Text comparison operators. Default when `f_<key>Op` is absent: `contains`. */\nexport const TEXT_OPS = [\n  \"eq\",\n  \"neq\",\n  \"contains\",\n  \"notContains\",\n  \"startsWith\",\n  \"endsWith\",\n  \"empty\",\n  \"notEmpty\",\n] as const;\n\n/** Number comparison operators. Absent `Op` infers from the Min/Max pair. */\nexport const NUMBER_OPS = [\n  \"eq\",\n  \"neq\",\n  \"gt\",\n  \"gte\",\n  \"lt\",\n  \"lte\",\n  \"between\",\n  \"in\",\n  \"notIn\",\n] as const;\n\n/**\n * Date comparison operators. `on` / `gte` / `lte` keep the inclusive-day\n * behaviour existing links already encode; `before` / `after` are exclusive.\n */\nexport const DATE_OPS = [\n  \"before\",\n  \"after\",\n  \"on\",\n  \"gte\",\n  \"lte\",\n  \"between\",\n  \"relative\",\n  \"empty\",\n] as const;\n\n/** One text operator token. */\nexport type TextOp = (typeof TEXT_OPS)[number];\n/** One number operator token. */\nexport type NumberOp = (typeof NUMBER_OPS)[number];\n/** One date operator token. */\nexport type DateOp = (typeof DATE_OPS)[number];\n/** Any built-in operator token. */\nexport type FilterOp = TextOp | NumberOp | DateOp;\n\nconst TEXT_OP_SET = new Set<string>(TEXT_OPS);\nconst NUMBER_OP_SET = new Set<string>(NUMBER_OPS);\nconst DATE_OP_SET = new Set<string>(DATE_OPS);\n\n/** True for operators that take no operand (`empty` / `notEmpty`). */\nexport function isValuelessFilterOp(op: string): boolean {\n  return op === \"empty\" || op === \"notEmpty\";\n}\n\n/** True for operators that take a comma-separated list (`in` / `notIn`). */\nexport function isListFilterOp(op: string): boolean {\n  return op === \"in\" || op === \"notIn\";\n}\n\n/** True for the two-bound `between` operator. */\nexport function isBetweenFilterOp(op: string): boolean {\n  return op === \"between\";\n}\n\n/** `TableLabels` key for each text operator (widget + chip wording). */\nexport const TEXT_OP_LABEL_KEYS = {\n  eq: \"opEqual\",\n  neq: \"opNotEqual\",\n  contains: \"opContains\",\n  notContains: \"opNotContains\",\n  startsWith: \"opStartsWith\",\n  endsWith: \"opEndsWith\",\n  empty: \"opEmpty\",\n  notEmpty: \"opNotEmpty\",\n} as const satisfies Record<TextOp, keyof TableLabels>;\n\n/** `TableLabels` key for each number operator. */\nexport const NUMBER_OP_LABEL_KEYS = {\n  eq: \"opEqual\",\n  neq: \"opNotEqual\",\n  gt: \"opGreater\",\n  gte: \"opAtLeast\",\n  lt: \"opLess\",\n  lte: \"opAtMost\",\n  between: \"opBetween\",\n  in: \"opIn\",\n  notIn: \"opNotIn\",\n} as const satisfies Record<NumberOp, keyof TableLabels>;\n\n/** `TableLabels` key for each date operator. */\nexport const DATE_OP_LABEL_KEYS = {\n  before: \"opBefore\",\n  after: \"opAfter\",\n  on: \"opOn\",\n  gte: \"opOnOrAfter\",\n  lte: \"opOnOrBefore\",\n  between: \"opBetween\",\n  relative: \"opRelative\",\n  empty: \"opEmpty\",\n} as const satisfies Record<DateOp, keyof TableLabels>;\n\n/** Parse a text operator; unknown / missing → `contains` (historical default). */\nexport function parseTextOp(raw: FilterValue | undefined): TextOp {\n  if (typeof raw === \"string\" && TEXT_OP_SET.has(raw)) return raw as TextOp;\n  return \"contains\";\n}\n\n/** Parse a number operator, or `undefined` when the token is absent/unknown. */\nexport function parseNumberOp(\n  raw: FilterValue | undefined\n): NumberOp | undefined {\n  if (typeof raw === \"string\" && NUMBER_OP_SET.has(raw)) {\n    return raw as NumberOp;\n  }\n  return undefined;\n}\n\n/** Parse a date operator, accepting `eq` as the historical spelling of `on`. */\nexport function parseDateOp(raw: FilterValue | undefined): DateOp | undefined {\n  if (raw === \"eq\") return \"on\";\n  if (typeof raw === \"string\" && DATE_OP_SET.has(raw)) return raw as DateOp;\n  return undefined;\n}\n\n/** Read the operator token stored beside a filter key. */\nexport function readFilterOp(\n  extra: ExtraFilters,\n  key: string\n): FilterValue | undefined {\n  return extra[filterOpKey(key)];\n}\n\n/** True when a row value counts as empty for `empty` / `notEmpty`. */\nexport function isEmptyRowValue(value: unknown): boolean {\n  if (value == null) return true;\n  if (typeof value === \"string\") return value.trim() === \"\";\n  if (value instanceof Date) return Number.isNaN(value.getTime());\n  return false;\n}\n\n/** Split a list operand (`in` / `notIn`) into trimmed, non-empty tokens. */\nexport function parseListOperand(value: FilterValue | undefined): string[] {\n  if (Array.isArray(value)) {\n    return value.map((entry) => String(entry).trim()).filter(Boolean);\n  }\n  if (value == null || value === \"\") return [];\n  return String(value)\n    .split(\",\")\n    .map((entry) => entry.trim())\n    .filter(Boolean);\n}\n\n/** Parse a list operand as finite numbers (unknown tokens dropped). */\nexport function parseNumberList(value: FilterValue | undefined): number[] {\n  const out: number[] = [];\n  for (const token of parseListOperand(value)) {\n    const n = Number(token);\n    if (Number.isFinite(n)) out.push(n);\n  }\n  return out;\n}\n\n/**\n * Chip text: `Name contains Ada`, or `Name is empty` when there is no\n * operand. The operator word is already localized by the caller.\n */\nexport function formatFilterChip(\n  fieldLabel: string,\n  opWord: string,\n  value?: string\n): string {\n  if (value == null || value === \"\") return `${fieldLabel} ${opWord}`;\n  return `${fieldLabel} ${opWord} ${value}`;\n}\n","/**\n * Relative date tokens. The URL and Saved Views store the token, never a\n * resolved calendar day — \"last 7 days\" stays the last 7 days tomorrow.\n * {@link resolveRelativeRange} is the only place a token becomes a window.\n */\n\nconst DAY_MS = 86_400_000;\nconst END_OF_DAY_MS = DAY_MS - 1;\n\n/** Named windows that need no extra number. */\nexport const RELATIVE_NAMED = [\n  \"today\",\n  \"yesterday\",\n  \"tomorrow\",\n  \"thisWeek\",\n  \"thisMonth\",\n  \"previousMonth\",\n] as const;\n\n/** A stored relative-date token (`last:7`, `today`, …). */\nexport type RelativeDateToken =\n  | (typeof RELATIVE_NAMED)[number]\n  | `last:${number}`\n  | `next:${number}`;\n\n/** Inclusive local-time window a token resolves to. */\nexport interface RelativeDateRange {\n  startMs: number;\n  endMs: number;\n}\n\nconst NAMED = new Set<string>(RELATIVE_NAMED);\n\nfunction startOfDay(now: Date): Date {\n  return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n}\n\nfunction endOfDay(day: Date): number {\n  return day.getTime() + END_OF_DAY_MS;\n}\n\nfunction addDays(day: Date, days: number): Date {\n  return new Date(day.getFullYear(), day.getMonth(), day.getDate() + days);\n}\n\n/** Monday 00:00 of the week that contains `now` (ISO week). */\nfunction startOfIsoWeek(now: Date): Date {\n  const day = startOfDay(now);\n  const weekday = day.getDay();\n  const mondayOffset = weekday === 0 ? -6 : 1 - weekday;\n  return addDays(day, mondayOffset);\n}\n\n/**\n * Parse a stored token. Unknown strings (including ISO dates) return\n * `undefined` so a historical absolute bound is never treated as relative.\n */\nexport function parseRelativeToken(\n  raw: string | undefined\n): RelativeDateToken | undefined {\n  if (raw == null || raw === \"\") return undefined;\n  if (NAMED.has(raw)) return raw as RelativeDateToken;\n  const counted = /^(last|next):(\\d+)$/.exec(raw);\n  if (!counted) return undefined;\n  const n = Number(counted[2]);\n  if (!Number.isInteger(n) || n < 1) return undefined;\n  return `${counted[1] as \"last\" | \"next\"}:${n}`;\n}\n\n/** True when `raw` is a relative token, not an absolute date. */\nexport function isRelativeDateToken(raw: string | undefined): boolean {\n  return parseRelativeToken(raw) !== undefined;\n}\n\nfunction namedRange(\n  token: (typeof RELATIVE_NAMED)[number],\n  now: Date\n): RelativeDateRange {\n  const today = startOfDay(now);\n  if (token === \"today\") {\n    return { startMs: today.getTime(), endMs: endOfDay(today) };\n  }\n  if (token === \"yesterday\") {\n    const day = addDays(today, -1);\n    return { startMs: day.getTime(), endMs: endOfDay(day) };\n  }\n  if (token === \"tomorrow\") {\n    const day = addDays(today, 1);\n    return { startMs: day.getTime(), endMs: endOfDay(day) };\n  }\n  if (token === \"thisWeek\") {\n    const start = startOfIsoWeek(now);\n    return { startMs: start.getTime(), endMs: endOfDay(addDays(start, 6)) };\n  }\n  if (token === \"thisMonth\") {\n    const start = new Date(now.getFullYear(), now.getMonth(), 1);\n    const end = new Date(now.getFullYear(), now.getMonth() + 1, 0);\n    return { startMs: start.getTime(), endMs: endOfDay(end) };\n  }\n  const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);\n  const end = new Date(now.getFullYear(), now.getMonth(), 0);\n  return { startMs: start.getTime(), endMs: endOfDay(end) };\n}\n\n/**\n * Resolve a token against `now` (defaults to the current instant). The\n * frontend predicate and the server query path must both call this so a\n * shared link and a live table agree.\n */\nexport function resolveRelativeRange(\n  raw: string | undefined,\n  now: number | Date = Date.now()\n): RelativeDateRange | undefined {\n  const token = parseRelativeToken(raw);\n  if (!token) return undefined;\n  const instant = now instanceof Date ? now : new Date(now);\n  if (token.startsWith(\"last:\")) {\n    const n = Number(token.slice(5));\n    const today = startOfDay(instant);\n    const start = addDays(today, -(n - 1));\n    return { startMs: start.getTime(), endMs: endOfDay(today) };\n  }\n  if (token.startsWith(\"next:\")) {\n    const n = Number(token.slice(5));\n    const today = startOfDay(instant);\n    const end = addDays(today, n - 1);\n    return { startMs: today.getTime(), endMs: endOfDay(end) };\n  }\n  return namedRange(token as (typeof RELATIVE_NAMED)[number], instant);\n}\n\n/** Build a counted token (`last:7`). `n` below 1 becomes 1. */\nexport function countedRelativeToken(\n  kind: \"last\" | \"next\",\n  n: number\n): RelativeDateToken {\n  const count = Number.isFinite(n) && n >= 1 ? Math.floor(n) : 1;\n  return `${kind}:${count}`;\n}\n\nconst NAMED_LABEL_KEYS = {\n  today: \"relToday\",\n  yesterday: \"relYesterday\",\n  tomorrow: \"relTomorrow\",\n  thisWeek: \"relThisWeek\",\n  thisMonth: \"relThisMonth\",\n  previousMonth: \"relPreviousMonth\",\n} as const;\n\n/** Named window or a counted last/next kind (the N lives beside the select). */\nexport type RelativePreset = (typeof RELATIVE_NAMED)[number] | \"last\" | \"next\";\n\n/** Presets offered by the relative-date widget, in display order. */\nexport const RELATIVE_PRESETS: readonly RelativePreset[] = [\n  ...RELATIVE_NAMED,\n  \"last\",\n  \"next\",\n];\n\n/** `TableLabels` key for each relative preset. */\nexport const RELATIVE_PRESET_LABEL_KEYS = {\n  today: \"relToday\",\n  yesterday: \"relYesterday\",\n  tomorrow: \"relTomorrow\",\n  thisWeek: \"relThisWeek\",\n  thisMonth: \"relThisMonth\",\n  previousMonth: \"relPreviousMonth\",\n  last: \"relLastN\",\n  next: \"relNextN\",\n} as const;\n\n/** Split a stored token into the widget's preset + N (N defaults to 7). */\nexport function splitRelativeToken(raw: string): {\n  preset: RelativePreset;\n  n: number;\n} {\n  const token = parseRelativeToken(raw);\n  if (token?.startsWith(\"last:\")) {\n    return { preset: \"last\", n: Number(token.slice(5)) };\n  }\n  if (token?.startsWith(\"next:\")) {\n    return { preset: \"next\", n: Number(token.slice(5)) };\n  }\n  if (token && NAMED.has(token)) {\n    return { preset: token as (typeof RELATIVE_NAMED)[number], n: 7 };\n  }\n  return { preset: \"today\", n: 7 };\n}\n\n/** Join a widget preset + N back into the stored token. */\nexport function joinRelativeToken(\n  preset: RelativePreset,\n  n: number\n): RelativeDateToken {\n  if (preset === \"last\" || preset === \"next\") {\n    return countedRelativeToken(preset, n);\n  }\n  return preset;\n}\n\n/** Chip / select wording for a stored token. */\nexport function relativeTokenLabel(\n  raw: string,\n  labels: {\n    relToday: string;\n    relYesterday: string;\n    relTomorrow: string;\n    relThisWeek: string;\n    relThisMonth: string;\n    relPreviousMonth: string;\n    relLastN: string;\n    relNextN: string;\n  }\n): string {\n  const token = parseRelativeToken(raw);\n  if (!token) return raw;\n  if (token.startsWith(\"last:\")) {\n    return labels.relLastN.replace(/\\bN\\b/, token.slice(5));\n  }\n  if (token.startsWith(\"next:\")) {\n    return labels.relNextN.replace(/\\bN\\b/, token.slice(5));\n  }\n  return labels[NAMED_LABEL_KEYS[token as keyof typeof NAMED_LABEL_KEYS]];\n}\n","/**\n * Declarative filters. One definition per filter drives everything the four\n * hand-wired pieces used to: the widget an adapter renders, the URL parsing\n * (array/number keys self-register), the chip labels, and the client-side\n * predicate. Definitions come from two places — a column's `filter` shorthand\n * and the table-level `filters` array — merged by {@link resolveFilterDefs}.\n */\nimport { localizedColumnPath } from \"../columns/resolveColumns\";\nimport { defaultLabels } from \"../labels\";\nimport type { QueryCondition } from \"../source/queryContract\";\nimport type {\n  ColumnDef,\n  ExtraFilters,\n  FilterValue,\n  TableLabels,\n} from \"../types\";\nimport { devWarn } from \"../utils/devWarn\";\nimport { humanizeKey } from \"../utils/humanizeKey\";\nimport { getPath } from \"../utils/path\";\nimport type { FilterTypeRegistry, FilterTypeSpec } from \"./filterRegistry\";\nimport {\n  DATE_OP_LABEL_KEYS,\n  DATE_OPS,\n  type DateOp,\n  filterOpKey,\n  formatFilterChip,\n  isEmptyRowValue,\n  NUMBER_OP_LABEL_KEYS,\n  NUMBER_OPS,\n  type NumberOp,\n  parseDateOp,\n  parseNumberList,\n  parseNumberOp,\n  parseTextOp,\n  TEXT_OP_LABEL_KEYS,\n  TEXT_OPS,\n} from \"./operators\";\nimport { relativeTokenLabel, resolveRelativeRange } from \"./relativeDates\";\nimport type { ChipLabelResolver } from \"./useActiveFilterChips\";\n\n/** Every built-in filter shape, exported so consumers never hand-type them. */\nexport const FILTER_TYPES = [\n  \"text\",\n  \"select\",\n  \"multiSelect\",\n  \"checklist\",\n  \"boolean\",\n  \"dateRange\",\n  \"numberRange\",\n] as const;\n\n/** A built-in filter shape. */\nexport type FilterType = (typeof FILTER_TYPES)[number];\n\n/** One choice in a `select` / `multiSelect` filter. */\nexport interface FilterOption {\n  value: string;\n  label: string;\n}\n\n/**\n * Where a select/multiSelect gets its choices: a static array, `\"auto\"`\n * (distinct values derived from the data — frontend tier; capped and\n * sorted), or an async loader resolved lazily when the form first renders.\n */\nexport type FilterOptionsSource =\n  | readonly FilterOption[]\n  | \"auto\"\n  | (() => Promise<readonly FilterOption[]>);\n\n/** Most distinct values `\"auto\"` will derive before truncating. */\nexport const AUTO_OPTIONS_LIMIT = 50;\n\n/** A full, standalone filter definition (the `filters` array form). */\nexport interface FilterDef<TRow = unknown> {\n  /**\n   * State key in the filter bag (and the `f_<key>` URL param). Doubles as\n   * the row's data path for the client-side predicate — dot paths reach\n   * nested values (`\"department.name\"`) — unless `getValue` overrides it.\n   */\n  key: string;\n  /**\n   * Column key the header filter row places this widget under.\n   * Defaults to {@link key} when the filter bag and the column share a\n   * name; set it when they differ (`key: \"name\"` under `column: \"person\"`).\n   */\n  column?: string;\n  /**\n   * The widget shape. Built-ins are {@link FilterType}; any other string\n   * is a custom type that must be registered on `filterTypes`.\n   */\n  type: string;\n  /** Widget + chip label. Defaults to a humanized `key` (\"hiredAt\" → \"Hired At\"). */\n  label?: string;\n  /** Choices for `select` / `multiSelect` — see {@link FilterOptionsSource}. */\n  options?: FilterOptionsSource;\n  /** Row-value extractor for the client-side predicate; defaults to `key` as a path. */\n  getValue?: (row: TRow) => unknown;\n  /** Placeholder for text-like inputs. */\n  placeholder?: string;\n}\n\n/**\n * The column-level shorthand: a bare type, or a definition without `key` /\n * `label` (both inherited from the column).\n */\nexport type ColumnFilter<TRow = unknown> =\n  | FilterType\n  | (Omit<FilterDef<TRow>, \"key\" | \"label\"> & { label?: string });\n\n/** Suffix pair used by the two-field range types. */\nexport const RANGE_SUFFIXES = {\n  dateRange: { start: \"From\", end: \"To\" },\n  numberRange: { start: \"Min\", end: \"Max\" },\n} as const;\n\n/** The state keys a definition reads/writes in the filter bag. */\nexport function filterStateKeys(\n  def: Pick<FilterDef, \"key\" | \"type\">,\n  registry?: FilterTypeRegistry\n): string[] {\n  const spec = registry?.get(def.type);\n  if (spec) return spec.stateKeys(def);\n  return [def.key];\n}\n\n/** Coerce a row value to a boolean, or `undefined` when it has no truth. */\nexport function coerceBooleanValue(value: unknown): boolean | undefined {\n  if (typeof value === \"boolean\") return value;\n  if (value === 1 || value === \"1\") return true;\n  if (value === 0 || value === \"0\") return false;\n  if (typeof value === \"string\") {\n    const token = value.trim().toLowerCase();\n    if (token === \"true\" || token === \"yes\") return true;\n    if (token === \"false\" || token === \"no\") return false;\n    if (token === \"\") return undefined;\n  }\n  if (value == null) return undefined;\n  return Boolean(value);\n}\n\nfunction booleanChoiceOn(value: FilterValue): boolean {\n  return value === \"true\" || value === 1;\n}\n\n/**\n * Merge column-declared filters with the standalone `filters` array into the\n * final ordered definition list: column filters first (in column order), then\n * standalone definitions. A standalone definition with the same `key` as a\n * column filter WINS — documented override semantics, with a development\n * warning so accidental duplication is visible.\n */\nexport function resolveFilterDefs<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  filters: readonly FilterDef<TRow>[] | undefined,\n  locale?: string\n): FilterDef<TRow>[] {\n  const standalone = filters ?? [];\n  const standaloneKeys = new Set(standalone.map((d) => d.key));\n  const fromColumns: FilterDef<TRow>[] = [];\n  for (const column of columns) {\n    if (!column.filter) continue;\n    const base =\n      typeof column.filter === \"string\"\n        ? { type: column.filter }\n        : column.filter;\n    if (standaloneKeys.has(column.key)) {\n      devWarn(\n        `column \"${column.key}\" declares a filter but \\`filters\\` also defines that key — using the \\`filters\\` definition. Remove one to silence this.`\n      );\n      continue;\n    }\n    // A localized column's filter matches against the same locale-resolved\n    // path the cell shows (unless the shorthand brings its own getValue).\n    const path = localizedColumnPath(column, locale);\n    fromColumns.push({\n      key: column.key,\n      label:\n        base.label ??\n        (typeof column.header === \"string\" ? column.header : undefined),\n      ...(path === column.key\n        ? {}\n        : { getValue: (row: TRow) => getPath(row, path) }),\n      ...base,\n    });\n  }\n  return [...fromColumns, ...standalone];\n}\n\n/** Resolved label for a definition (explicit, else humanized key). */\nexport function filterLabel(def: Pick<FilterDef, \"key\" | \"label\">): string {\n  return def.label ?? humanizeKey(def.key);\n}\n\nconst has = (extra: ExtraFilters, key: string): boolean => {\n  const v = extra[key];\n  if (v == null || v === \"\") return false;\n  return !Array.isArray(v) || v.length > 0;\n};\n\n/** A row value as comparable text; non-primitives never match anything. */\nfunction valueText(value: unknown): string {\n  switch (typeof value) {\n    case \"string\":\n      return value;\n    case \"number\":\n    case \"boolean\":\n    case \"bigint\":\n      return String(value);\n    default:\n      return \"\";\n  }\n}\n\nconst DATE_ONLY_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst END_OF_DAY_MS = 86_399_999;\n\n/**\n * One coercion path for everything `dateRange` compares — row values and\n * bounds alike. The timezone rule: a date-only string (`\"2026-01-31\"`,\n * what date pickers and the URL carry) means that day in the USER'S LOCAL\n * timezone; a `Date`, an epoch-milliseconds number, or a datetime string\n * is an absolute instant. Comparing local day windows against absolute\n * row instants keeps boundary days stable in every timezone.\n *\n * @returns Epoch milliseconds, or `NaN` for anything unparseable.\n */\nfunction dateValueToEpochMs(value: unknown): number {\n  if (value instanceof Date) return value.getTime();\n  if (typeof value === \"number\") return value;\n  if (typeof value !== \"string\") return Number.NaN;\n  const text = value.trim();\n  if (text === \"\") return Number.NaN;\n  if (DATE_ONLY_RE.test(text)) {\n    const [year = 0, month = 1, day = 1] = text.split(\"-\").map(Number);\n    return new Date(year, month - 1, day).getTime();\n  }\n  return new Date(text).getTime();\n}\n\n/**\n * A row value as a number for range filtering, or `NaN` when the row has\n * no numeric value. `Number(null)` and `Number(\"\")` are `0`, which would\n * silently include no-value rows in any range spanning zero — so only\n * real numbers and non-empty numeric strings qualify.\n */\nfunction numericRowValue(value: unknown): number {\n  if (typeof value === \"number\") return value;\n  if (typeof value === \"string\" && value.trim() !== \"\") return Number(value);\n  return Number.NaN;\n}\n\nfunction textMatch(rowValue: unknown, term: string): boolean {\n  const text = valueText(rowValue).toLowerCase();\n  return text !== \"\" && text.includes(term.toLowerCase());\n}\n\nfunction textRowMatches(\n  op: ReturnType<typeof parseTextOp>,\n  rowValue: unknown,\n  term: string\n): boolean {\n  if (op === \"empty\") return isEmptyRowValue(rowValue);\n  if (op === \"notEmpty\") return !isEmptyRowValue(rowValue);\n  const text = valueText(rowValue).toLowerCase();\n  const needle = term.toLowerCase();\n  switch (op) {\n    case \"eq\":\n      return text === needle;\n    case \"neq\":\n      return text !== needle;\n    case \"contains\":\n      return textMatch(rowValue, term);\n    case \"notContains\":\n      return !text.includes(needle);\n    case \"startsWith\":\n      return text !== \"\" && text.startsWith(needle);\n    case \"endsWith\":\n      return text !== \"\" && text.endsWith(needle);\n  }\n}\n\nfunction dateUpperBoundMs(bound: FilterValue): number {\n  return (\n    dateValueToEpochMs(bound) +\n    (typeof bound === \"string\" && DATE_ONLY_RE.test(bound.trim())\n      ? END_OF_DAY_MS\n      : 0)\n  );\n}\n\nfunction dateOnMatch(time: number, day: FilterValue | undefined): boolean {\n  if (day == null || day === \"\") return true;\n  const start = dateValueToEpochMs(day);\n  return time >= start && time <= dateUpperBoundMs(day);\n}\n\nfunction dateInclusiveBounds(\n  time: number,\n  extra: ExtraFilters,\n  fromKey: string,\n  toKey: string\n): boolean {\n  if (has(extra, fromKey) && time < dateValueToEpochMs(extra[fromKey])) {\n    return false;\n  }\n  if (has(extra, toKey) && time > dateUpperBoundMs(extra[toKey])) {\n    return false;\n  }\n  return true;\n}\n\nfunction dateRowMatches(\n  op: DateOp | undefined,\n  time: number,\n  extra: ExtraFilters,\n  fromKey: string,\n  toKey: string\n): boolean {\n  if (op === \"empty\") return Number.isNaN(time);\n  if (op === \"relative\") {\n    const range = resolveRelativeRange(String(extra[fromKey] ?? \"\"));\n    if (!range) return true;\n    return time >= range.startMs && time <= range.endMs;\n  }\n  if (Number.isNaN(time)) return false;\n  if (op === \"before\" && has(extra, toKey)) {\n    return time < dateValueToEpochMs(extra[toKey]);\n  }\n  if (op === \"after\" && has(extra, fromKey)) {\n    return time > dateUpperBoundMs(extra[fromKey]);\n  }\n  if (op === \"on\") {\n    const day = has(extra, fromKey) ? extra[fromKey] : extra[toKey];\n    return dateOnMatch(time, day);\n  }\n  return dateInclusiveBounds(time, extra, fromKey, toKey);\n}\n\nfunction numberRowMatches(\n  op: NumberOp | undefined,\n  n: number,\n  extra: ExtraFilters,\n  minKey: string,\n  maxKey: string,\n  listKey: string\n): boolean {\n  if (Number.isNaN(n)) return false;\n  if (op === \"in\") return parseNumberList(extra[listKey]).includes(n);\n  if (op === \"notIn\") return !parseNumberList(extra[listKey]).includes(n);\n  const min = has(extra, minKey) ? Number(extra[minKey]) : Number.NaN;\n  const max = has(extra, maxKey) ? Number(extra[maxKey]) : Number.NaN;\n  switch (op) {\n    case \"eq\":\n      return !Number.isNaN(min) && n === min;\n    case \"neq\":\n      return !Number.isNaN(min) && n !== min;\n    case \"gt\":\n      return !Number.isNaN(min) && n > min;\n    case \"gte\":\n      return !Number.isNaN(min) && n >= min;\n    case \"lt\":\n      return !Number.isNaN(max) && n < max;\n    case \"lte\":\n      return !Number.isNaN(max) && n <= max;\n    default:\n      if (!Number.isNaN(min) && n < min) return false;\n      return Number.isNaN(max) || n <= max;\n  }\n}\n\nfunction textFilterActive(extra: ExtraFilters, key: string): boolean {\n  const op = parseTextOp(extra[filterOpKey(key)]);\n  if (op === \"empty\" || op === \"notEmpty\") return true;\n  return has(extra, key);\n}\n\nfunction dateFilterActive(\n  extra: ExtraFilters,\n  key: string,\n  fromKey: string,\n  toKey: string\n): boolean {\n  const op = parseDateOp(extra[filterOpKey(key)]);\n  if (op === \"empty\") return true;\n  if (op === \"relative\") return has(extra, fromKey);\n  return has(extra, fromKey) || has(extra, toKey);\n}\n\nfunction numberFilterActive(\n  extra: ExtraFilters,\n  key: string,\n  minKey: string,\n  maxKey: string\n): boolean {\n  const op = parseNumberOp(extra[filterOpKey(key)]);\n  if (op === \"in\" || op === \"notIn\") return has(extra, key);\n  return has(extra, minKey) || has(extra, maxKey);\n}\n\nfunction rowValue<TRow>(def: FilterDef<TRow>, row: TRow): unknown {\n  return def.getValue ? def.getValue(row) : getPath(row, def.key);\n}\n\nfunction asConditionScalar(value: unknown): string | undefined {\n  if (value == null) return undefined;\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  return undefined;\n}\n\nfunction asConditionList(value: unknown): string[] {\n  if (Array.isArray(value)) return value.map(String);\n  const one = asConditionScalar(value);\n  return one == null ? [] : [one];\n}\n\nfunction asConditionPair(value: unknown): {\n  a: string | undefined;\n  b: string | undefined;\n} {\n  if (Array.isArray(value)) {\n    return { a: asConditionScalar(value[0]), b: asConditionScalar(value[1]) };\n  }\n  return { a: asConditionScalar(value), b: undefined };\n}\n\nfunction rangeConditionToExtra<TRow>(\n  def: FilterDef<TRow>,\n  condition: QueryCondition,\n  flavour: \"dateRange\" | \"numberRange\"\n): ExtraFilters {\n  const opKey = filterOpKey(def.key);\n  const op = condition.op;\n  const suffixes = RANGE_SUFFIXES[flavour];\n  const lowKey = def.key + suffixes.start;\n  const highKey = def.key + suffixes.end;\n  if (op === \"empty\" || op === \"notEmpty\") return { [opKey]: op };\n  if (op === \"in\" || op === \"notIn\") {\n    const list = asConditionList(condition.value);\n    return { [def.key]: list.length > 0 ? list : undefined, [opKey]: op };\n  }\n  if (op === \"between\") {\n    const { a, b } = asConditionPair(condition.value);\n    return { [lowKey]: a, [highKey]: b, [opKey]: op };\n  }\n  if (op === \"before\" || op === \"lte\" || op === \"lt\") {\n    return { [highKey]: asConditionScalar(condition.value), [opKey]: op };\n  }\n  return { [lowKey]: asConditionScalar(condition.value), [opKey]: op };\n}\n\nfunction scalarConditionToExtra<TRow>(\n  def: FilterDef<TRow>,\n  condition: QueryCondition\n): ExtraFilters {\n  return {\n    [def.key]: asConditionScalar(condition.value),\n    [filterOpKey(def.key)]: condition.op,\n  };\n}\n\nfunction listConditionToExtra<TRow>(\n  def: FilterDef<TRow>,\n  condition: QueryCondition\n): ExtraFilters {\n  const list = asConditionList(condition.value);\n  return { [def.key]: list.length > 0 ? list : undefined };\n}\n\nfunction textStateKeys(def: Pick<FilterDef, \"key\">): string[] {\n  return [def.key, filterOpKey(def.key)];\n}\n\nfunction rangeStateKeys(\n  def: Pick<FilterDef, \"key\">,\n  flavour: \"dateRange\" | \"numberRange\"\n): string[] {\n  const s = RANGE_SUFFIXES[flavour];\n  const pair = [def.key + s.start, def.key + s.end, filterOpKey(def.key)];\n  return flavour === \"numberRange\" ? [def.key, ...pair] : pair;\n}\n\nfunction textSpec(): FilterTypeSpec {\n  return {\n    type: \"text\",\n    widget: \"text\",\n    ops: TEXT_OPS,\n    defaultOp: \"contains\",\n    stateKeys: textStateKeys,\n    match: (def, extra, row) => {\n      if (!textFilterActive(extra, def.key)) return true;\n      return textRowMatches(\n        parseTextOp(extra[filterOpKey(def.key)]),\n        rowValue(def, row),\n        String(extra[def.key] ?? \"\")\n      );\n    },\n    chips: (def) => {\n      const label = filterLabel(def);\n      return {\n        [def.key]: (v: string, extra?: ExtraFilters) =>\n          textChipLabel(label, v, extra, def.key),\n        [filterOpKey(def.key)]: (v: string) => emptyOpChip(label, v),\n      };\n    },\n    conditionToExtra: scalarConditionToExtra,\n  };\n}\n\nfunction selectSpec(type: \"select\"): FilterTypeSpec {\n  return {\n    type,\n    widget: type,\n    ops: [\"eq\"],\n    defaultOp: \"eq\",\n    stateKeys: (def) => [def.key],\n    match: (def, extra, row) =>\n      !has(extra, def.key) ||\n      valueText(rowValue(def, row)) === String(extra[def.key]),\n    chips: (def) => ({\n      [def.key]: (v: string) => `${filterLabel(def)}: ${optionLabel(def, v)}`,\n    }),\n    conditionToExtra: scalarConditionToExtra,\n  };\n}\n\nfunction listSpec(type: \"multiSelect\" | \"checklist\"): FilterTypeSpec {\n  return {\n    type,\n    widget: type,\n    ops: [\"in\"],\n    defaultOp: \"in\",\n    urlArray: true,\n    stateKeys: (def) => [def.key],\n    match: (def, extra, row) => {\n      if (!has(extra, def.key)) return true;\n      const selected = extra[def.key];\n      const list = Array.isArray(selected) ? selected : [String(selected)];\n      return list.includes(valueText(rowValue(def, row)));\n    },\n    chips: (def) => ({\n      [def.key]: (v: string) => `${filterLabel(def)}: ${optionLabel(def, v)}`,\n    }),\n    conditionToExtra: listConditionToExtra,\n  };\n}\n\nfunction booleanSpec(): FilterTypeSpec {\n  return {\n    type: \"boolean\",\n    widget: \"boolean\",\n    ops: [\"eq\"],\n    defaultOp: \"eq\",\n    stateKeys: (def) => [def.key],\n    match: (def, extra, row) => {\n      if (!has(extra, def.key)) return true;\n      return (\n        coerceBooleanValue(rowValue(def, row)) ===\n        booleanChoiceOn(extra[def.key])\n      );\n    },\n    chips: (def) => ({\n      [def.key]: (v: string) =>\n        `${filterLabel(def)}: ${\n          booleanChoiceOn(v) ? defaultLabels.boolTrue : defaultLabels.boolFalse\n        }`,\n    }),\n    conditionToExtra: scalarConditionToExtra,\n  };\n}\n\nfunction rangeSpec(flavour: \"dateRange\" | \"numberRange\"): FilterTypeSpec {\n  const isDate = flavour === \"dateRange\";\n  return {\n    type: flavour,\n    widget: flavour,\n    ops: isDate ? DATE_OPS : NUMBER_OPS,\n    defaultOp: isDate ? \"on\" : \"gte\",\n    urlArray: !isDate,\n    urlNumberKeys: !isDate,\n    stateKeys: (def) => rangeStateKeys(def, flavour),\n    match: (def, extra, row) => {\n      const low = def.key + RANGE_SUFFIXES[flavour].start;\n      const high = def.key + RANGE_SUFFIXES[flavour].end;\n      if (isDate) {\n        if (!dateFilterActive(extra, def.key, low, high)) return true;\n        return dateRowMatches(\n          parseDateOp(extra[filterOpKey(def.key)]),\n          dateValueToEpochMs(rowValue(def, row)),\n          extra,\n          low,\n          high\n        );\n      }\n      if (!numberFilterActive(extra, def.key, low, high)) return true;\n      return numberRowMatches(\n        parseNumberOp(extra[filterOpKey(def.key)]),\n        numericRowValue(rowValue(def, row)),\n        extra,\n        low,\n        high,\n        def.key\n      );\n    },\n    chips: (def) => {\n      const label = filterLabel(def);\n      const low = def.key + RANGE_SUFFIXES[flavour].start;\n      const high = def.key + RANGE_SUFFIXES[flavour].end;\n      const flavourName = isDate ? \"date\" : \"number\";\n      const chips: Record<string, ChipLabelResolver> = {\n        [low]: (v, extra) =>\n          rangeChipLabel(label, v, extra, def.key, \"low\", flavourName),\n        [high]: (v, extra) =>\n          rangeChipLabel(label, v, extra, def.key, \"high\", flavourName),\n        [filterOpKey(def.key)]: (v) => emptyOpChip(label, v),\n      };\n      if (!isDate) {\n        chips[def.key] = (v, extra) =>\n          rangeChipLabel(label, v, extra, def.key, \"low\", \"number\");\n      }\n      return chips;\n    },\n    conditionToExtra: (def, condition) =>\n      rangeConditionToExtra(def, condition, flavour),\n  };\n}\n\n/** Built-in types — the registry's first consumers. */\n/** Built-in specs — imported only by {@link defaultFilterRegistry}. */\nexport function createBuiltInFilterSpecs(): FilterTypeSpec[] {\n  return [\n    textSpec(),\n    selectSpec(\"select\"),\n    listSpec(\"multiSelect\"),\n    listSpec(\"checklist\"),\n    booleanSpec(),\n    rangeSpec(\"dateRange\"),\n    rangeSpec(\"numberRange\"),\n  ];\n}\n\n/** Build one definition's client-side predicate (true = row matches). */\nexport function filterPredicate<TRow>(\n  def: FilterDef<TRow>,\n  registry: FilterTypeRegistry\n): (row: TRow, extra: ExtraFilters) => boolean {\n  const spec = registry.get(def.type);\n  if (!spec) {\n    devWarn(`Unknown filter type \"${def.type}\"`);\n    return () => true;\n  }\n  return (row, extra) => spec.match(def, extra, row);\n}\n\n/** Everything the table engine derives from the resolved definitions. */\nexport interface FilterRuntime<TRow> {\n  /** The merged, ordered definitions (drives the auto-built form). */\n  defs: readonly FilterDef<TRow>[];\n  /** Keys whose URL values parse as comma-separated arrays. */\n  arrayExtraKeys: string[];\n  /** Keys whose URL values parse as numbers. */\n  numberExtraKeys: string[];\n  /** Chip label resolvers, one per state key. */\n  filterLabels: Record<string, ChipLabelResolver>;\n  /** AND-composed client-side predicate across every definition. */\n  filterFn: (row: TRow, extra: ExtraFilters) => boolean;\n  /** Type registry used to derive this runtime. */\n  registry: FilterTypeRegistry;\n}\n\nconst optionLabel = (\n  def: Pick<FilterDef, \"options\">,\n  value: string\n): string => {\n  // Only materialized arrays can map values to labels; `\"auto\"` is\n  // materialized before the runtime builds, and async options label their\n  // chips with the raw value until loaded.\n  if (!Array.isArray(def.options)) return value;\n  const options: readonly FilterOption[] = def.options;\n  return options.find((o) => o.value === value)?.label ?? value;\n};\n\nfunction opWord(labels: Required<TableLabels>, key: keyof TableLabels): string {\n  const value = labels[key];\n  return typeof value === \"string\" ? value : key;\n}\n\nfunction textChipLabel(\n  field: string,\n  value: string,\n  extra: ExtraFilters | undefined,\n  key: string\n): string {\n  const op = parseTextOp(extra?.[filterOpKey(key)]);\n  return formatFilterChip(\n    field,\n    opWord(defaultLabels, TEXT_OP_LABEL_KEYS[op]),\n    value\n  );\n}\n\nfunction rangeChipLabel(\n  field: string,\n  value: string,\n  extra: ExtraFilters | undefined,\n  key: string,\n  side: \"low\" | \"high\",\n  flavour: \"number\" | \"date\"\n): string {\n  const raw = extra?.[filterOpKey(key)];\n  if (flavour === \"number\") {\n    const op = parseNumberOp(raw);\n    if (op && op !== \"between\") {\n      return formatFilterChip(\n        field,\n        opWord(defaultLabels, NUMBER_OP_LABEL_KEYS[op]),\n        value\n      );\n    }\n  } else {\n    const op = parseDateOp(raw);\n    if (op === \"relative\") {\n      return formatFilterChip(field, relativeTokenLabel(value, defaultLabels));\n    }\n    if (op && op !== \"between\") {\n      return formatFilterChip(\n        field,\n        opWord(defaultLabels, DATE_OP_LABEL_KEYS[op]),\n        value\n      );\n    }\n  }\n  return side === \"low\" ? `${field} ≥ ${value}` : `${field} ≤ ${value}`;\n}\n\nfunction emptyOpChip(field: string, token: string): string {\n  if (token === \"empty\") {\n    return formatFilterChip(field, defaultLabels.opEmpty);\n  }\n  if (token === \"notEmpty\") {\n    return formatFilterChip(field, defaultLabels.opNotEmpty);\n  }\n  return \"\";\n}\n\n/** Derive the full runtime (URL keys, chips, predicate) from definitions. */\nexport function buildFilterRuntime<TRow>(\n  defs: readonly FilterDef<TRow>[],\n  registry: FilterTypeRegistry\n): FilterRuntime<TRow> {\n  const arrayExtraKeys: string[] = [];\n  const numberExtraKeys: string[] = [];\n  const filterLabels: Record<string, ChipLabelResolver> = {};\n  const predicates = defs.map((def) => filterPredicate(def, registry));\n\n  for (const def of defs) {\n    const spec = registry.get(def.type);\n    if (!spec) continue;\n    if (spec.urlArray) arrayExtraKeys.push(def.key);\n    if (spec.urlNumberKeys) {\n      const s = RANGE_SUFFIXES.numberRange;\n      numberExtraKeys.push(def.key + s.start, def.key + s.end);\n    }\n    Object.assign(filterLabels, spec.chips(def));\n  }\n\n  return {\n    defs,\n    arrayExtraKeys,\n    numberExtraKeys,\n    filterLabels,\n    filterFn: (row, extra) => predicates.every((p) => p(row, extra)),\n    registry,\n  };\n}\n\n/** The cleared state for every key a definition list owns. */\nexport function clearedFilterExtras<TRow>(\n  defs: readonly FilterDef<TRow>[],\n  registry?: FilterTypeRegistry\n): ExtraFilters {\n  const out: Record<string, FilterValue> = {};\n  for (const def of defs) {\n    for (const key of filterStateKeys(def, registry)) out[key] = undefined;\n  }\n  return out;\n}\n\n/**\n * Materialize `\"auto\"` option sources from the data: the distinct values of\n * each such definition's row projection, sorted, capped at\n * {@link AUTO_OPTIONS_LIMIT}. Static arrays and async loaders pass through\n * untouched. Run BEFORE {@link buildFilterRuntime} so chips can label the\n * derived values.\n */\nexport function materializeAutoOptions<TRow>(\n  defs: readonly FilterDef<TRow>[],\n  rows: readonly TRow[]\n): FilterDef<TRow>[] {\n  return defs.map((def) => {\n    if (def.options !== \"auto\") return def;\n    const seen = new Set<string>();\n    for (const row of rows) {\n      const text = valueText(\n        def.getValue ? def.getValue(row) : getPath(row, def.key)\n      );\n      if (text !== \"\") seen.add(text);\n      if (seen.size > AUTO_OPTIONS_LIMIT) break;\n    }\n    const options = [...seen]\n      .sort((a, b) => a.localeCompare(b))\n      .slice(0, AUTO_OPTIONS_LIMIT)\n      .map((value) => ({ value, label: value }));\n    return { ...def, options };\n  });\n}\n","import type { ExtraFilters, FilterValue } from \"../types\";\nimport {\n  DATE_OP_LABEL_KEYS,\n  type DateOp,\n  filterOpKey,\n  isListFilterOp,\n  isValuelessFilterOp,\n  NUMBER_OP_LABEL_KEYS,\n  type NumberOp,\n  parseDateOp,\n  parseListOperand,\n  parseNumberOp,\n} from \"./operators\";\nimport { isRelativeDateToken } from \"./relativeDates\";\n\n/**\n * Historical four-operator set. New code should use {@link NUMBER_OPS} /\n * {@link DATE_OPS}; this list stays exported so existing imports keep\n * type-checking while the widgets read the flavour-specific lists.\n */\nexport const RANGE_OPS = [\"eq\", \"gte\", \"lte\", \"between\"] as const;\n\n/** One range-widget comparison operator (number or date). */\nexport type RangeOp = NumberOp | DateOp;\n\n/** The widget's view of a range: an operator plus its bound(s). */\nexport interface RangeWidgetState {\n  /** Selected comparison, or `undefined` while nothing is chosen. */\n  op: RangeOp | undefined;\n  /** The single value, the lower bound (`between`), or the list text. */\n  a: string;\n  /** The upper bound (`between` only). */\n  b: string;\n}\n\nconst text = (value: FilterValue | undefined): string =>\n  value == null ? \"\" : String(value);\n\nconst asOpValue = (raw: string): FilterValue => (raw === \"\" ? undefined : raw);\n\nfunction readStoredRangeOp(\n  extra: ExtraFilters,\n  stored: RangeOp,\n  lowKey: string,\n  highKey: string,\n  listKey?: string\n): RangeWidgetState {\n  if (stored === \"in\" || stored === \"notIn\") {\n    return {\n      op: stored,\n      a: parseListOperand(listKey ? extra[listKey] : undefined).join(\", \"),\n      b: \"\",\n    };\n  }\n  if (stored === \"empty\") {\n    return { op: stored, a: \"\", b: \"\" };\n  }\n  const low = text(extra[lowKey]);\n  const high = text(extra[highKey]);\n  if (stored === \"lte\" || stored === \"lt\" || stored === \"before\") {\n    return { op: stored, a: high || low, b: \"\" };\n  }\n  if (stored === \"between\") {\n    return { op: stored, a: low, b: high };\n  }\n  return { op: stored, a: low || high, b: \"\" };\n}\n\nfunction inferRangeFromPair(\n  extra: ExtraFilters,\n  lowKey: string,\n  highKey: string,\n  flavour?: \"number\" | \"date\"\n): RangeWidgetState {\n  const low = text(extra[lowKey]);\n  const high = text(extra[highKey]);\n  if (low !== \"\" && high !== \"\") {\n    return low === high\n      ? { op: flavour === \"date\" ? \"on\" : \"eq\", a: low, b: \"\" }\n      : { op: \"between\", a: low, b: high };\n  }\n  if (low !== \"\" && flavour === \"date\" && isRelativeDateToken(low)) {\n    return { op: \"relative\", a: low, b: \"\" };\n  }\n  if (low !== \"\") return { op: \"gte\", a: low, b: \"\" };\n  if (high !== \"\") return { op: \"lte\", a: high, b: \"\" };\n  return { op: undefined, a: \"\", b: \"\" };\n}\n\n/**\n * Derive the widget state. A stored `f_<key>Op` wins; without it the\n * inclusive pair still infers `eq` / `gte` / `lte` / `between` so links\n * written before operators were persisted keep opening on the right\n * comparison.\n */\nexport function readRangeWidget(\n  extra: ExtraFilters,\n  lowKey: string,\n  highKey: string,\n  opKey?: string,\n  listKey?: string,\n  flavour?: \"number\" | \"date\"\n): RangeWidgetState {\n  const stored = opKey\n    ? (parseNumberOp(extra[opKey]) ?? parseDateOp(extra[opKey]))\n    : undefined;\n  if (stored) {\n    return readStoredRangeOp(extra, stored, lowKey, highKey, listKey);\n  }\n  return inferRangeFromPair(extra, lowKey, highKey, flavour);\n}\n\n/**\n * Convert a widget interaction back to the persisted pair. Empty values\n * clear their keys, so half-filled widgets never leak stale bounds.\n */\nexport function writeRangeWidget(\n  op: RangeOp | undefined,\n  a: string,\n  b: string,\n  lowKey: string,\n  highKey: string\n): ExtraFilters {\n  switch (op) {\n    case \"eq\":\n    case \"on\":\n      return { [lowKey]: asOpValue(a), [highKey]: asOpValue(a) };\n    case \"gte\":\n    case \"gt\":\n    case \"after\":\n    case \"neq\":\n    case \"relative\":\n      return { [lowKey]: asOpValue(a), [highKey]: undefined };\n    case \"lte\":\n    case \"lt\":\n    case \"before\":\n      return { [lowKey]: undefined, [highKey]: asOpValue(a) };\n    case \"between\":\n      return { [lowKey]: asOpValue(a), [highKey]: asOpValue(b) };\n    default:\n      return { [lowKey]: undefined, [highKey]: undefined };\n  }\n}\n\n/**\n * Persist an operator-first range (or list) filter: the inclusive pair,\n * the list key for `in` / `notIn`, and the readable `f_<key>Op` token.\n */\nexport function writeRangeFilter(\n  op: RangeOp | undefined,\n  a: string,\n  b: string,\n  lowKey: string,\n  highKey: string,\n  key: string\n): ExtraFilters {\n  const opKey = filterOpKey(key);\n  if (!op) {\n    return {\n      ...writeRangeWidget(undefined, \"\", \"\", lowKey, highKey),\n      [opKey]: undefined,\n    };\n  }\n  if (isValuelessFilterOp(op)) {\n    return {\n      ...writeRangeWidget(undefined, \"\", \"\", lowKey, highKey),\n      [key]: undefined,\n      [opKey]: op,\n    };\n  }\n  if (isListFilterOp(op)) {\n    const entries = parseListOperand(a);\n    return {\n      ...writeRangeWidget(undefined, \"\", \"\", lowKey, highKey),\n      [key]: entries.length > 0 ? entries : undefined,\n      [opKey]: entries.length > 0 ? op : undefined,\n    };\n  }\n  const pair = writeRangeWidget(op, a, b, lowKey, highKey);\n  const active = a !== \"\" || (op === \"between\" && b !== \"\");\n  return {\n    ...pair,\n    [opKey]: active ? op : undefined,\n  };\n}\n\n/** Label keys for each operator, per widget flavour (numbers vs dates). */\nexport const RANGE_OP_LABEL_KEYS = {\n  number: NUMBER_OP_LABEL_KEYS,\n  /** `eq` stays as the historical spelling of `on` for existing widgets. */\n  date: { ...DATE_OP_LABEL_KEYS, eq: \"opOn\" },\n} as const;\n","import { useState } from \"react\";\n\nimport type { TableSource } from \"../source/TableSource\";\nimport type { FilterValue, TableLabels } from \"../types\";\nimport { type FilterDef, filterLabel, RANGE_SUFFIXES } from \"./filterDefs\";\nimport {\n  DATE_OP_LABEL_KEYS,\n  DATE_OPS,\n  filterOpKey,\n  isBetweenFilterOp,\n  isListFilterOp,\n  isValuelessFilterOp,\n  NUMBER_OP_LABEL_KEYS,\n  NUMBER_OPS,\n  parseTextOp,\n  TEXT_OP_LABEL_KEYS,\n  TEXT_OPS,\n  type TextOp,\n} from \"./operators\";\nimport { type RangeOp, readRangeWidget, writeRangeFilter } from \"./rangeWidget\";\nimport { isRelativeDateToken } from \"./relativeDates\";\n\n/** Operand shape for a selected range operator. */\nexport type RangeOpArity = \"none\" | \"one\" | \"two\" | \"list\";\n\n/**\n * The slice of the table source the auto-built filter form reads and writes:\n * the extra-filter bag and its single/bulk setters. Every batteries-included\n * adapter renders its own kit controls over this same contract.\n */\nexport type FilterFormSource<TRow> = Pick<\n  TableSource<TRow>,\n  \"extra\" | \"setExtra\" | \"setExtras\" | \"allFilteredRows\" | \"facets\"\n>;\n\n/** A scalar filter value as input text (\"\" when unset; numbers stringify). */\nexport function scalarFilterText(value: FilterValue): string {\n  return value == null ? \"\" : String(value);\n}\n\n/** A multi-select value as a list — tolerating a scalar from the URL. */\nexport function listFilterValues(value: FilterValue): string[] {\n  if (Array.isArray(value)) return [...value];\n  return value == null || value === \"\" ? [] : [String(value)];\n}\n\nfunction rangeArity(op: RangeOp | undefined): RangeOpArity {\n  if (!op) return \"one\";\n  if (isValuelessFilterOp(op)) return \"none\";\n  if (isListFilterOp(op)) return \"list\";\n  if (isBetweenFilterOp(op)) return \"two\";\n  return \"one\";\n}\n\nfunction rangeInputType(\n  flavour: \"number\" | \"date\",\n  arity: RangeOpArity,\n  op: RangeOp | undefined\n): \"date\" | \"number\" | \"text\" {\n  if (op === \"relative\") return \"text\";\n  if (flavour === \"date\") return \"date\";\n  if (arity === \"list\") return \"text\";\n  return \"number\";\n}\n\n/** Per-operator label keys for one widget flavour (numbers or dates). */\nexport type RangeOpLabelKeys =\n  | typeof NUMBER_OP_LABEL_KEYS\n  | (typeof DATE_OP_LABEL_KEYS & { readonly eq: \"opOn\" });\n\n/** Computed state + writers driving an operator-first range field. */\nexport interface RangeFieldWidget {\n  /** The field's display label. */\n  label: string;\n  /** Operators offered for this flavour, in display order. */\n  ops: readonly RangeOp[];\n  /** Per-operator label keys for the current flavour (number vs date). */\n  opLabelKeys: RangeOpLabelKeys;\n  /** Native input `type` for the bound inputs (`text` for `in` / `notIn`). */\n  inputType: \"date\" | \"number\" | \"text\";\n  /** Operand shape for the selected operator. */\n  arity: RangeOpArity;\n  /** The selected operator, or `undefined` until one is chosen. */\n  op: RangeOp | undefined;\n  /** Set the operator (UI state, re-seeded from the persisted pair). */\n  setOp: (op: RangeOp | undefined) => void;\n  /** The single / lower bound / list as input text. */\n  a: string;\n  /** The upper bound as input text (`between` only). */\n  b: string;\n  /** Persist an operator + bound(s) back to the bag, including `f_<key>Op`. */\n  write: (nextOp: RangeOp | undefined, nextA: string, nextB: string) => void;\n}\n\n/**\n * The shared, kit-agnostic logic behind an auto-built range filter\n * (`numberRange` / `dateRange`): it seeds the operator from the persisted\n * `Op` token (or infers it from the Min/Max pair), derives the visible\n * bound(s), and writes interactions back so the operator survives the URL.\n *\n * @typeParam TRow - The row type.\n * @param def - The range filter definition.\n * @param source - The filter-bag slice (extra + setters).\n * @returns The {@link RangeFieldWidget} state and writers.\n */\nexport function useRangeFilterWidget<TRow>(\n  def: FilterDef<TRow>,\n  source: FilterFormSource<TRow>\n): RangeFieldWidget {\n  const { extra, setExtras } = source;\n  const label = filterLabel(def);\n  const flavour = def.type === \"dateRange\" ? \"date\" : \"number\";\n  const suffixes =\n    RANGE_SUFFIXES[flavour === \"date\" ? \"dateRange\" : \"numberRange\"];\n  const lowKey = def.key + suffixes.start;\n  const highKey = def.key + suffixes.end;\n  const opKey = filterOpKey(def.key);\n  const ops: readonly RangeOp[] = flavour === \"date\" ? DATE_OPS : NUMBER_OPS;\n  const opLabelKeys =\n    flavour === \"date\"\n      ? { ...DATE_OP_LABEL_KEYS, eq: \"opOn\" as const }\n      : NUMBER_OP_LABEL_KEYS;\n  const [op, setOp] = useState<RangeOp | undefined>(\n    () => readRangeWidget(extra, lowKey, highKey, opKey, def.key, flavour).op\n  );\n  const derived = readRangeWidget(\n    extra,\n    lowKey,\n    highKey,\n    opKey,\n    def.key,\n    flavour\n  );\n  const a = derived.a;\n  const b = derived.b;\n  const arity = rangeArity(op);\n  const inputType = rangeInputType(flavour, arity, op);\n  const write = (nextOp: RangeOp | undefined, nextA: string, nextB: string) => {\n    // Switching into `between` from a single-value comparison copies the\n    // current value into both bounds so the pair is never half-empty.\n    const seededB =\n      nextOp === \"between\" && nextB === \"\" && nextA !== \"\" && op !== \"between\"\n        ? nextA\n        : nextB;\n    // Relative stores a token, never a calendar day. Entering the op seeds\n    // `today`; leaving it drops a leftover token so a date input stays empty.\n    let seededA = nextA;\n    if (nextOp === \"relative\" && !isRelativeDateToken(nextA)) {\n      seededA = \"today\";\n    } else if (nextOp !== \"relative\" && isRelativeDateToken(nextA)) {\n      seededA = \"\";\n    }\n    setExtras(\n      writeRangeFilter(nextOp, seededA, seededB, lowKey, highKey, def.key)\n    );\n  };\n  return {\n    label,\n    ops,\n    opLabelKeys,\n    inputType,\n    arity,\n    op,\n    setOp,\n    a,\n    b,\n    write,\n  };\n}\n\n/** Computed state + writers driving an operator-first text field. */\nexport interface TextFieldWidget {\n  /** The field's display label. */\n  label: string;\n  /** Operators offered for text filters. */\n  ops: readonly TextOp[];\n  /** Per-operator `TableLabels` keys. */\n  opLabelKeys: typeof TEXT_OP_LABEL_KEYS;\n  /** The selected operator (defaults to `contains`). */\n  op: TextOp;\n  /** Set the operator and persist it. */\n  setOp: (op: TextOp) => void;\n  /** The comparison term (unused for `empty` / `notEmpty`). */\n  value: string;\n  /** Whether the operator needs a value input. */\n  needsValue: boolean;\n  /** Persist the operator + term (clears the term for valueless ops). */\n  write: (nextOp: TextOp, nextValue: string) => void;\n}\n\n/**\n * Kit-agnostic logic for a `text` filter: operator-first, persisted as\n * `f_<key>` plus `f_<key>Op` so the comparison survives the URL.\n *\n * @typeParam TRow - The row type.\n * @param def - The text filter definition.\n * @param source - The filter-bag slice (extra + setters).\n * @returns The {@link TextFieldWidget} state and writers.\n */\nexport function useTextFilterWidget<TRow>(\n  def: FilterDef<TRow>,\n  source: FilterFormSource<TRow>\n): TextFieldWidget {\n  const { extra, setExtras } = source;\n  const label = filterLabel(def);\n  const opKey = filterOpKey(def.key);\n  const storedOp = parseTextOp(extra[opKey]);\n  const [localOp, setLocalOp] = useState<TextOp>(storedOp);\n  const op = extra[opKey] != null ? storedOp : localOp;\n  const value = scalarFilterText(extra[def.key]);\n  const needsValue = !isValuelessFilterOp(op);\n  const write = (nextOp: TextOp, nextValue: string) => {\n    const valueless = isValuelessFilterOp(nextOp);\n    setLocalOp(nextOp);\n    setExtras({\n      [def.key]: valueless || nextValue === \"\" ? undefined : nextValue,\n      [opKey]: valueless || nextValue !== \"\" ? nextOp : undefined,\n    });\n  };\n  const setOp = (next: TextOp) => write(next, value);\n  return {\n    label,\n    ops: TEXT_OPS,\n    opLabelKeys: TEXT_OP_LABEL_KEYS,\n    op,\n    setOp,\n    value,\n    needsValue,\n    write,\n  };\n}\n\n/** Resolve a `TableLabels` key to the string the widget should show. */\nexport function filterOpLabel(\n  labels: Required<TableLabels>,\n  key: keyof TableLabels\n): string {\n  const value = labels[key];\n  return typeof value === \"string\" ? value : String(key);\n}\n\nexport type { DateOp, NumberOp, TextOp } from \"./operators\";\n\n/** One choice in a tri-state boolean filter (`\"\"` = any). */\nexport type BooleanChoice = \"\" | \"true\" | \"false\";\n\n/** Read a boolean filter slot as a tri-state choice. */\nexport function parseBooleanChoice(value: FilterValue): BooleanChoice {\n  if (value === \"true\" || value === 1) return \"true\";\n  if (value === \"false\" || value === 0) return \"false\";\n  return \"\";\n}\n\n/** Computed state + writer driving a tri-state boolean field. */\nexport interface BooleanFieldWidget {\n  /** The field's display label. */\n  label: string;\n  /** Selected choice (`\"\"` means any / don't care). */\n  choice: BooleanChoice;\n  /** Persist the choice (`\"\"` clears the key). */\n  write: (next: BooleanChoice) => void;\n}\n\n/**\n * Kit-agnostic logic for a `boolean` filter: any / true / false, never a\n * checkbox. The token is stored as `f_<key>=true|false`; omitting it is any.\n */\nexport function useBooleanFilterWidget<TRow>(\n  def: FilterDef<TRow>,\n  source: FilterFormSource<TRow>\n): BooleanFieldWidget {\n  const { extra, setExtra } = source;\n  return {\n    label: filterLabel(def),\n    choice: parseBooleanChoice(extra[def.key]),\n    write: (next) => setExtra(def.key, next === \"\" ? undefined : next),\n  };\n}\n","/**\n * Excel-style checklist filter — distinct values, counts, search,\n * select-all. Prefers {@link TableSource.facets} (own-filter excluded);\n * falls back to {@link TableSource.allFilteredRows}. A server page that\n * omits both does not offer the widget.\n */\nimport { useMemo, useState } from \"react\";\n\nimport type { TableSource } from \"../source/TableSource\";\nimport type { FilterValue } from \"../types\";\nimport { getPath } from \"../utils/path\";\nimport type { FilterDef, FilterOption } from \"./filterDefs\";\nimport { listFilterValues } from \"./filterForm\";\n\n/** Window the list once it is long enough that a full render would hitch. */\nexport const CHECKLIST_VIRTUALIZE_AT = 40;\n\n/** Fixed row height the virtual window measures against, in px. */\nexport const CHECKLIST_ITEM_HEIGHT = 28;\n\n/** Visible viewport of a virtualized list, in px. */\nexport const CHECKLIST_LIST_HEIGHT = 240;\n\n/** One distinct value in a checklist, with its count in the current set. */\nexport interface ChecklistValue {\n  value: string;\n  label: string;\n  count: number;\n}\n\n/** Kit-agnostic state behind {@link useChecklistFilter}. */\nexport interface ChecklistFilterState {\n  /** False when the source has no full filtered set — do not render. */\n  available: boolean;\n  /** Distinct values, selected-but-missing ones included at count 0. */\n  items: readonly ChecklistValue[];\n  /** `items` narrowed by the search box. */\n  visible: readonly ChecklistValue[];\n  /** Current search box text. */\n  query: string;\n  setQuery: (next: string) => void;\n  /** Currently checked values. */\n  selected: readonly string[];\n  /** True when `visible` is long enough to window. */\n  virtualize: boolean;\n  selectAllVisible: () => void;\n  clear: () => void;\n  toggle: (value: string, on: boolean) => void;\n}\n\nfunction valueText(value: unknown): string {\n  switch (typeof value) {\n    case \"string\":\n      return value;\n    case \"number\":\n    case \"boolean\":\n    case \"bigint\":\n      return String(value);\n    default:\n      return \"\";\n  }\n}\n\nfunction optionLabel(options: FilterDef[\"options\"], value: string): string {\n  if (!Array.isArray(options)) return value;\n  const list: readonly FilterOption[] = options;\n  return list.find((item) => item.value === value)?.label ?? value;\n}\n\nfunction rowValue<TRow>(def: FilterDef<TRow>, row: TRow): string {\n  return valueText(def.getValue ? def.getValue(row) : getPath(row, def.key));\n}\n\n/**\n * Distinct values + counts from a row set. Static `options` only supply\n * labels — the values themselves always come from the rows.\n */\nexport function collectChecklistValues<TRow>(\n  def: FilterDef<TRow>,\n  rows: readonly TRow[],\n  selected: readonly string[] = []\n): ChecklistValue[] {\n  const counts = new Map<string, number>();\n  for (const row of rows) {\n    const text = rowValue(def, row);\n    if (text === \"\") continue;\n    counts.set(text, (counts.get(text) ?? 0) + 1);\n  }\n  for (const value of selected) {\n    if (value !== \"\" && !counts.has(value)) counts.set(value, 0);\n  }\n  return [...counts.entries()]\n    .sort((a, b) => a[0].localeCompare(b[0]))\n    .map(([value, count]) => ({\n      value,\n      label: optionLabel(def.options, value),\n      count,\n    }));\n}\n\nfunction selectedList(value: FilterValue): string[] {\n  return listFilterValues(value);\n}\n\n/**\n * Derive the checklist from `source.facets` or `source.allFilteredRows`.\n * Returns `available: false` when both are missing so a server page\n * never pretends it can count a set it does not hold.\n */\nexport function useChecklistFilter<TRow>(\n  def: FilterDef<TRow>,\n  source: Pick<\n    TableSource<TRow>,\n    \"allFilteredRows\" | \"extra\" | \"setExtra\" | \"facets\"\n  >\n): ChecklistFilterState {\n  const fromFacets = source.facets?.[def.key];\n  const rows = source.allFilteredRows;\n  const available = fromFacets !== undefined || rows !== undefined;\n  const raw = source.extra[def.key];\n  const selected = selectedList(raw);\n  const items = useMemo(() => {\n    if (fromFacets) return [...fromFacets];\n    return rows ? collectChecklistValues(def, rows, selectedList(raw)) : [];\n  }, [def, rows, raw, fromFacets]);\n  const [query, setQuery] = useState(\"\");\n  const needle = query.trim().toLowerCase();\n  const visible = useMemo(() => {\n    if (needle === \"\") return items;\n    return items.filter((item) => {\n      return (\n        item.label.toLowerCase().includes(needle) ||\n        item.value.toLowerCase().includes(needle)\n      );\n    });\n  }, [items, needle]);\n\n  const write = (next: readonly string[]) => {\n    source.setExtra(def.key, next.length > 0 ? [...next] : undefined);\n  };\n\n  return {\n    available,\n    items,\n    visible,\n    query,\n    setQuery,\n    selected,\n    virtualize: visible.length >= CHECKLIST_VIRTUALIZE_AT,\n    selectAllVisible: () => {\n      const next = new Set(selected);\n      for (const item of visible) next.add(item.value);\n      write([...next]);\n    },\n    clear: () => write([]),\n    toggle: (value, on) => {\n      if (on) {\n        write(selected.includes(value) ? selected : [...selected, value]);\n        return;\n      }\n      write(selected.filter((item) => item !== value));\n    },\n  };\n}\n","/**\n * Facet counts — what selecting a value WOULD give, which is the\n * filtered set with this facet's own filter removed (#281).\n */\nimport type { ExtraFilters } from \"../types\";\nimport { type ChecklistValue, collectChecklistValues } from \"./checklist\";\nimport type { FilterDef } from \"./filterDefs\";\nimport { listFilterValues } from \"./filterForm\";\nimport type { FilterTypeRegistry } from \"./filterRegistry\";\n\n/** Distinct values + counts for one filter key. */\nexport type FacetCounts = readonly ChecklistValue[];\n\n/** Facet counts keyed by filter key. */\nexport type FacetMap = Readonly<Record<string, FacetCounts>>;\n\n/**\n * Rows that still match after every filter except `key`. The count on\n * each remaining value is \"how many rows you would keep if you picked\n * it\", not \"how many remain after you already picked it\".\n */\nexport function rowsExcludingFilter<TRow>(\n  rows: readonly TRow[],\n  extra: ExtraFilters,\n  key: string,\n  filterFn: (row: TRow, extra: ExtraFilters) => boolean\n): readonly TRow[] {\n  const cleared: ExtraFilters = { ...extra, [key]: undefined };\n  return rows.filter((row) => filterFn(row, cleared));\n}\n\n/**\n * Facet counts for every `checklist` definition. Other types are\n * ignored — they do not show per-value counts.\n */\nexport function computeFilterFacets<TRow>(\n  defs: readonly FilterDef<TRow>[],\n  rows: readonly TRow[],\n  extra: ExtraFilters,\n  filterFn: (row: TRow, extra: ExtraFilters) => boolean,\n  registry?: FilterTypeRegistry\n): FacetMap {\n  const out: Record<string, ChecklistValue[]> = {};\n  for (const def of defs) {\n    const widget = registry?.get(def.type)?.widget ?? def.type;\n    if (widget !== \"checklist\") continue;\n    const subset = rowsExcludingFilter(rows, extra, def.key, filterFn);\n    out[def.key] = collectChecklistValues(\n      def,\n      subset,\n      listFilterValues(extra[def.key])\n    );\n  }\n  return out;\n}\n","/**\n * Public filter-type registry (#283). A type supplies widget kind, operators,\n * predicate, chips and tree serialization. Built-ins are the first consumers —\n * every former `switch (def.type)` looks up a spec instead.\n */\nimport type { ReactElement } from \"react\";\n\nimport type { QueryCondition } from \"../source/queryContract\";\nimport type { ExtraFilters, TableLabels } from \"../types\";\nimport { devWarn } from \"../utils/devWarn\";\nimport type { FilterDef, FilterType } from \"./filterDefs\";\nimport type { FilterFormSource } from \"./filterForm\";\nimport type { ChipLabelResolver } from \"./useActiveFilterChips\";\n\n/** Built-in widget a kit AutoFilterForm / header row already knows how to draw. */\nexport type FilterWidgetKind = FilterType;\n\n/** Props a custom `render` function receives. */\nexport interface FilterWidgetRenderProps<TRow = unknown> {\n  readonly def: FilterDef<TRow>;\n  readonly source: FilterFormSource<TRow>;\n  readonly labels: Required<TableLabels>;\n  readonly className?: string;\n}\n\n/**\n * One registered filter type: widget + operators + predicate + chips +\n * tree projection. Register a new `type` string, or {@link FilterTypeRegistry.extend}\n * a built-in to add operators without forking the table.\n */\nexport interface FilterTypeSpec {\n  readonly type: string;\n  /** Which built-in kit widget to draw. Ignored when {@link render} is set. */\n  readonly widget: FilterWidgetKind;\n  readonly ops: readonly string[];\n  readonly defaultOp: string;\n  /** Persist this key as a comma-separated array in the URL. */\n  readonly urlArray?: boolean;\n  /** Persist this type's range bounds as numbers in the URL. */\n  readonly urlNumberKeys?: boolean;\n  stateKeys(def: Pick<FilterDef, \"key\" | \"type\">): string[];\n  match<TRow>(def: FilterDef<TRow>, extra: ExtraFilters, row: TRow): boolean;\n  chips<TRow>(def: FilterDef<TRow>): Record<string, ChipLabelResolver>;\n  conditionToExtra<TRow>(\n    def: FilterDef<TRow>,\n    condition: QueryCondition\n  ): ExtraFilters;\n  /** Native renderer — header row and AutoFilterForm use this when set. */\n  render?<TRow>(props: FilterWidgetRenderProps<TRow>): ReactElement;\n}\n\n/** Immutable registry of {@link FilterTypeSpec}s. */\nexport interface FilterTypeRegistry {\n  get(type: string): FilterTypeSpec | undefined;\n  has(type: string): boolean;\n  types(): readonly string[];\n  register(spec: FilterTypeSpec): FilterTypeRegistry;\n  extend(type: string, patch: Partial<FilterTypeSpec>): FilterTypeRegistry;\n}\n\nclass MapRegistry implements FilterTypeRegistry {\n  constructor(private readonly specs: ReadonlyMap<string, FilterTypeSpec>) {}\n\n  get(type: string): FilterTypeSpec | undefined {\n    return this.specs.get(type);\n  }\n\n  has(type: string): boolean {\n    return this.specs.has(type);\n  }\n\n  types(): readonly string[] {\n    return [...this.specs.keys()];\n  }\n\n  register(spec: FilterTypeSpec): FilterTypeRegistry {\n    const next = new Map(this.specs);\n    next.set(spec.type, spec);\n    return new MapRegistry(next);\n  }\n\n  extend(type: string, patch: Partial<FilterTypeSpec>): FilterTypeRegistry {\n    const current = this.specs.get(type);\n    if (!current) {\n      devWarn(`extendFilterType: unknown type \"${type}\"`);\n      return this;\n    }\n    return this.register({ ...current, ...patch, type });\n  }\n}\n\n/** Empty registry — used to seed {@link createFilterRegistry}. */\nexport function emptyFilterRegistry(): FilterTypeRegistry {\n  return new MapRegistry(new Map());\n}\n\n/** Registry from an explicit spec list (last write wins on a repeated type). */\nexport function createFilterRegistry(\n  specs: readonly FilterTypeSpec[]\n): FilterTypeRegistry {\n  const map = new Map<string, FilterTypeSpec>();\n  for (const spec of specs) map.set(spec.type, spec);\n  return new MapRegistry(map);\n}\n\n/** Look up a spec, or `undefined` for an unknown type. */\nexport function filterTypeSpec(\n  type: string,\n  registry: FilterTypeRegistry\n): FilterTypeSpec | undefined {\n  return registry.get(type);\n}\n\n/** Widget kind a kit should draw for this def. */\nexport function filterWidgetKind(\n  def: Pick<FilterDef, \"type\">,\n  registry: FilterTypeRegistry\n): FilterWidgetKind | undefined {\n  return registry.get(def.type)?.widget;\n}\n\n/** Operators the tree builder offers for this def. */\nexport function filterTypeOps(\n  def: Pick<FilterDef, \"type\">,\n  registry: FilterTypeRegistry\n): readonly string[] {\n  return registry.get(def.type)?.ops ?? [\"eq\"];\n}\n\n/** Default operator when a tree condition is first added. */\nexport function filterTypeDefaultOp(\n  def: Pick<FilterDef, \"type\">,\n  registry: FilterTypeRegistry\n): string {\n  return registry.get(def.type)?.defaultOp ?? \"eq\";\n}\n\n/** Custom `render` for this def, or `undefined` to use the kit widget. */\nexport function renderRegisteredFilter<TRow>(\n  def: FilterDef<TRow>,\n  source: FilterFormSource<TRow>,\n  labels: Required<TableLabels>,\n  registry: FilterTypeRegistry,\n  className?: string\n): ReactElement | undefined {\n  return registry.get(def.type)?.render?.({ def, source, labels, className });\n}\n","/**\n * Built-in filter types. Kept off `filterDefs` so a table that only\n * imports `filterLabel` / `useFrontendData` does not pay for every\n * predicate, chip and operator.\n */\nimport { createBuiltInFilterSpecs } from \"./filterDefs\";\nimport {\n  createFilterRegistry,\n  type FilterTypeRegistry,\n  type FilterTypeSpec,\n} from \"./filterRegistry\";\n\n/** Built-in types — the registry's first consumers. */\nexport const builtInFilterSpecs: readonly FilterTypeSpec[] =\n  // PURE: a table that never imports the registry must not evaluate this.\n  /*#__PURE__*/ createBuiltInFilterSpecs();\n\n/**\n * Default registry: every built-in type, nothing else.\n *\n * It builds its own specs rather than reading {@link builtInFilterSpecs}.\n * Both are pure so a plain table shakes them out, and a pure binding is free\n * to land in a different chunk from the one that reads it — which happened\n * the moment a new entry point changed the chunk layout, and handed this an\n * empty spec list. With no cross-binding there is no order to get wrong.\n */\nexport const defaultFilterRegistry: FilterTypeRegistry =\n  /*#__PURE__*/ createFilterRegistry(/*#__PURE__*/ createBuiltInFilterSpecs());\n\n/** Merge host `filterTypes` onto the built-ins (same `type` replaces). */\nexport function resolveFilterRegistry(\n  extras?: readonly FilterTypeSpec[]\n): FilterTypeRegistry {\n  if (!extras || extras.length === 0) return defaultFilterRegistry;\n  return extras.reduce(\n    (registry, spec) => registry.register(spec),\n    defaultFilterRegistry\n  );\n}\n","/** How the table presents filters — one container, never stacked. */\nexport type FilterChromeMode = \"popover\" | \"drawer\" | \"header\";\n\n/**\n * Resolve the single filter chrome. `headerFilters` is an alias for\n * `\"header\"`. Header mode wins when both are passed so a host cannot\n * mount the toolbar overlay and the header row at once.\n */\nexport function resolveFilterMode(\n  mode?: FilterChromeMode,\n  headerFilters?: boolean\n): FilterChromeMode {\n  if (headerFilters === true || mode === \"header\") return \"header\";\n  if (mode === \"drawer\") return \"drawer\";\n  return \"popover\";\n}\n\n/**\n * Whether the toolbar still shows Filters. Header mode hides that button\n * for the simple form (the icons own those fields) but keeps it when the\n * AND/OR tree is on — the tree has no column of its own.\n */\nexport function toolbarShowsFilters(\n  mode: FilterChromeMode,\n  hasForm: boolean,\n  hasFilterTree: boolean\n): boolean {\n  if (!hasForm) return false;\n  return mode !== \"header\" || hasFilterTree;\n}\n\n/**\n * Whether the per-field form mounts inside Filters. Header icons own those\n * fields; `filterFields={false}` keeps only the AND/OR tree.\n */\nexport function showSimpleFilterFields(\n  headerFiltersOn: boolean,\n  filterFields?: boolean\n): boolean {\n  if (headerFiltersOn) return false;\n  return filterFields !== false;\n}\n","/**\n * The cell that holds open the columns outside the horizontal window.\n *\n * It is one empty cell per side, sized to everything the window skipped, so\n * the table's scroll width matches the columns it claims to have. Aria-hidden\n * because it is scaffolding, not data — a screen reader walking the row would\n * otherwise meet two blank cells whose only job is width.\n */\nimport type { ReactElement } from \"react\";\n\n/** Props for {@link ColumnSpacer}. */\nexport interface ColumnSpacerProps {\n  /** Pixel width of the columns this cell stands in for. */\n  width: number;\n  /** Which side of the window it sits on, for the part name. */\n  side: \"start\" | \"end\";\n  /** The element to render — a kit's own cell component, or `\"td\"`. */\n  as?: \"td\" | \"th\";\n}\n\n/** Renders the spacer, or nothing when there is nothing to hold open. */\nexport function ColumnSpacer({\n  width,\n  side,\n  as = \"td\",\n}: Readonly<ColumnSpacerProps>): ReactElement | null {\n  if (width <= 0) return null;\n  const Cell = as;\n  return (\n    <Cell\n      aria-hidden=\"true\"\n      data-adapttable-part={`column-spacer-${side}`}\n      style={{ width, minWidth: width, padding: 0, border: 0 }}\n    />\n  );\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\n/**\n * Wrap a callback in a stable identity that always invokes the latest\n * render's version — the ref-latch pattern (a ref updated in an effect,\n * read inside the callback). Effects can call fresh props and state\n * through it without re-running when the caller passes a new closure\n * every render.\n *\n * Works across the full declared React peer range (`^18 || ^19`), unlike\n * `useEffectEvent`, which is only stable from React 19.2. The latch\n * updates in a passive effect, so the returned function is only safe to\n * call from effects that run after it — never during render.\n *\n * @typeParam TArgs - The callback's argument tuple.\n * @typeParam TReturn - The callback's return type.\n * @param callback - The callback to latch; may be a fresh closure each render.\n * @returns A stable function that always calls the latest `callback`.\n */\nexport function useEventCallback<TArgs extends readonly unknown[], TReturn>(\n  callback: (...args: TArgs) => TReturn\n): (...args: TArgs) => TReturn {\n  const latest = useRef(callback);\n  useEffect(() => {\n    latest.current = callback;\n  });\n  return useCallback((...args: TArgs) => latest.current(...args), []);\n}\n","import { useEffect, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport { devWarn } from \"../utils/devWarn\";\nimport type { FilterDef, FilterOption } from \"./filterDefs\";\n\n/** Resolved choices for a select/multiSelect control. */\nexport interface ResolvedFilterOptions {\n  /** The choices to render (empty while an async loader is in flight). */\n  options: readonly FilterOption[];\n  /** True while an async loader is fetching. */\n  loading: boolean;\n}\n\nconst EMPTY: readonly FilterOption[] = [];\n\n/**\n * Resolve a definition's option source for the auto-built form: arrays are\n * used as-is, async loaders run once on mount (kit forms show their native\n * loading affordance meanwhile), and a leftover `\"auto\"` — possible only on\n * the server/source tiers, where there is no full dataset to derive from —\n * resolves to no options with a development warning.\n */\nexport function useFilterOptions<TRow>(\n  def: Pick<FilterDef<TRow>, \"key\" | \"options\">\n): ResolvedFilterOptions {\n  const source = def.options;\n  const isLoader = typeof source === \"function\";\n  const [loaded, setLoaded] = useState<readonly FilterOption[] | null>(null);\n  const [loading, setLoading] = useState(isLoader);\n\n  // The load reads the LATEST loader (callers routinely pass it inline, a\n  // fresh identity every render) without restarting — only a key change\n  // re-runs the effect.\n  const startLoad = useEventCallback(() => {\n    const loader = source;\n    if (typeof loader !== \"function\") return undefined;\n    let alive = true;\n    setLoading(true);\n    void loader().then(\n      (options) => {\n        if (!alive) return;\n        setLoaded(options);\n        setLoading(false);\n      },\n      () => {\n        if (!alive) return;\n        devWarn(`async options for filter \"${def.key}\" failed to load.`);\n        setLoaded(EMPTY);\n        setLoading(false);\n      }\n    );\n    return () => {\n      alive = false;\n    };\n  });\n\n  useEffect(() => startLoad(), [isLoader, def.key, startLoad]);\n\n  // Warn from an effect, not the render path (render stays pure; devWarn\n  // already dedupes, this just keeps StrictMode double-renders silent too).\n  const isLeftoverAuto = source === \"auto\";\n  useEffect(() => {\n    if (!isLeftoverAuto) return;\n    devWarn(\n      `filter \"${def.key}\" uses options: \"auto\" on a tier with no full dataset — provide an options array or loader.`\n    );\n  }, [isLeftoverAuto, def.key]);\n\n  if (Array.isArray(source)) return { options: source, loading: false };\n  if (isLoader) return { options: loaded ?? EMPTY, loading };\n  return { options: EMPTY, loading: false };\n}\n","/**\n * Compact per-column filter row under the header. Structure only —\n * adapters pass the Search, Select, range inputs and multi menu the\n * end user clicks. Same defs and extra bag the panel uses (#282).\n */\nimport type { CSSProperties, ReactElement, ReactNode } from \"react\";\n\nimport type { ColumnDef, TableLabels } from \"../types\";\nimport { ColumnSpacer } from \"../virtual/ColumnSpacer\";\nimport { defaultFilterRegistry } from \"./filterBuiltins\";\nimport { type FilterDef, filterLabel } from \"./filterDefs\";\nimport {\n  type FilterFormSource,\n  listFilterValues,\n  useBooleanFilterWidget,\n  useRangeFilterWidget,\n  useTextFilterWidget,\n} from \"./filterForm\";\nimport {\n  type FilterTypeRegistry,\n  renderRegisteredFilter,\n} from \"./filterRegistry\";\nimport { useFilterOptions } from \"./useFilterOptions\";\n\n/** Class hooks the unstyled adapter maps onto `DataTableClassNames`. */\nexport interface FilterHeaderClassNames {\n  filterHeaderRow?: string;\n  filterHeaderCell?: string;\n  filterHeaderInput?: string;\n  filterHeaderMenu?: string;\n  headerCell?: string;\n  expandHeader?: string;\n  reorderHeader?: string;\n  selectionHeader?: string;\n  actionsHeader?: string;\n}\n\n/** Overlay a sticky `top` on a cell or pad style. */\nexport function headerFilterStickTop(\n  sticky: boolean,\n  base: CSSProperties | undefined,\n  top: number,\n  stickyExtras?: CSSProperties\n): CSSProperties | undefined {\n  if (!sticky) return base;\n  return { ...stickyExtras, ...base, top };\n}\n\n/** Props for an adapter {@link FilterHeaderRow} — no slots on the public API. */\nexport interface FilterHeaderRowProps<TRow> {\n  /** When false the row does not render, even if defs exist. */\n  readonly enabled?: boolean;\n  readonly columns: readonly ColumnDef<TRow>[];\n  readonly defs: readonly FilterDef<TRow>[];\n  readonly source: FilterFormSource<TRow>;\n  readonly registry?: FilterTypeRegistry;\n  readonly labels: Required<TableLabels>;\n  readonly expandable?: boolean;\n  readonly showReorder?: boolean;\n  readonly selection?: boolean;\n  readonly showActions?: boolean;\n  readonly columnSpacers?: { start: number; end: number };\n  readonly cellStyle?: (column: ColumnDef<TRow>) => CSSProperties | undefined;\n  readonly pinSide?: (key: string) => \"start\" | \"end\" | undefined;\n  readonly padStyle?: CSSProperties;\n  readonly stickyAttr?: true;\n  readonly classNames?: FilterHeaderClassNames;\n}\n\n/** Props for an adapter {@link FilterHeaderControl} — no slots on the public API. */\nexport interface FilterHeaderControlProps<TRow> {\n  readonly def: FilterDef<TRow>;\n  readonly source: FilterFormSource<TRow>;\n  readonly labels: Required<TableLabels>;\n  readonly className?: string;\n  readonly registry?: FilterTypeRegistry;\n  /**\n   * Dismiss the overlay after a finished single-control write. Default off.\n   * Wired from the table's `closeHeaderFilterOnSelect`.\n   */\n  readonly closeOnSelect?: boolean;\n}\n\n/** One option in a header Select or multi menu. */\nexport interface FilterHeaderOption {\n  readonly value: string;\n  readonly label: string;\n}\n\n/** Kit search field a text header cell calls. */\nexport interface FilterHeaderSearchProps {\n  readonly label: string;\n  readonly placeholder: string;\n  readonly value: string;\n  readonly className?: string;\n  readonly onChange: (value: string) => void;\n}\n\n/** Kit Select a select/boolean header cell calls. */\nexport interface FilterHeaderSelectProps {\n  readonly label: string;\n  readonly value: string;\n  readonly options: readonly FilterHeaderOption[];\n  readonly className?: string;\n  readonly onChange: (value: string) => void;\n}\n\n/** Kit number/date field a range header cell calls. */\nexport interface FilterHeaderRangeProps {\n  readonly label: string;\n  readonly type: \"text\" | \"number\" | \"date\";\n  readonly value: string;\n  readonly onChange: (value: string) => void;\n}\n\n/** Kit compact multi menu a checklist/multiSelect header cell calls. */\nexport interface FilterHeaderMultiProps {\n  readonly label: string;\n  readonly summary: string;\n  readonly options: readonly FilterHeaderOption[];\n  readonly selected: readonly string[];\n  readonly className?: string;\n  readonly menuClassName?: string;\n  readonly onToggle: (value: string, checked: boolean) => void;\n}\n\n/** Adapter-supplied controls for {@link FilterHeaderChrome}. */\nexport interface FilterHeaderSlots {\n  readonly Search: (props: FilterHeaderSearchProps) => ReactNode;\n  readonly Select: (props: FilterHeaderSelectProps) => ReactNode;\n  readonly Range: (props: FilterHeaderRangeProps) => ReactNode;\n  readonly Multi: (props: FilterHeaderMultiProps) => ReactNode;\n}\n\n/** Props for {@link FilterHeaderChrome}. */\nexport interface FilterHeaderChromeProps<\n  TRow,\n> extends FilterHeaderRowProps<TRow> {\n  readonly slots: FilterHeaderSlots;\n}\n\n/** Props for {@link FilterHeaderControlChrome}. */\nexport interface FilterHeaderControlChromeProps<\n  TRow,\n> extends FilterHeaderControlProps<TRow> {\n  readonly slots: FilterHeaderSlots;\n}\n\n/** The definition that drives a column's header filter, if any. */\nexport function filterDefForColumn<TRow>(\n  defs: readonly FilterDef<TRow>[],\n  key: string\n): FilterDef<TRow> | undefined {\n  return defs.find((def) => (def.column ?? def.key) === key);\n}\n\nfunction Pad({\n  part,\n  style,\n  stickyAttr,\n  className,\n}: Readonly<{\n  part: string;\n  style?: CSSProperties;\n  stickyAttr?: true;\n  className?: string;\n}>): ReactElement {\n  return (\n    <td\n      data-adapttable-part={part}\n      data-sticky={stickyAttr}\n      style={style}\n      className={className}\n    />\n  );\n}\n\nfunction TextCell<TRow>({\n  def,\n  source,\n  labels,\n  className,\n  slots,\n}: Readonly<{\n  def: FilterDef<TRow>;\n  source: FilterFormSource<TRow>;\n  labels: Required<TableLabels>;\n  className?: string;\n  slots: FilterHeaderSlots;\n}>): ReactElement {\n  const widget = useTextFilterWidget(def, source);\n  const Search = slots.Search;\n  return (\n    <Search\n      label={widget.label}\n      placeholder={labels.search}\n      value={widget.value}\n      className={className}\n      onChange={(value) => widget.write(widget.op, value)}\n    />\n  );\n}\n\nfunction SelectCell<TRow>({\n  def,\n  source,\n  labels,\n  className,\n  slots,\n}: Readonly<{\n  def: FilterDef<TRow>;\n  source: FilterFormSource<TRow>;\n  labels: Required<TableLabels>;\n  className?: string;\n  slots: FilterHeaderSlots;\n}>): ReactElement {\n  const { options } = useFilterOptions(def);\n  const selected = listFilterValues(source.extra[def.key]);\n  const write = (values: readonly string[]) => {\n    source.setExtra(def.key, values.length > 0 ? [...values] : undefined);\n  };\n  const Select = slots.Select;\n  return (\n    <Select\n      label={filterLabel(def)}\n      value={selected[0] ?? \"\"}\n      className={className}\n      options={[\n        { value: \"\", label: labels.boolAny },\n        ...options.map((option) => ({\n          value: option.value,\n          label: option.label,\n        })),\n      ]}\n      onChange={(value) => {\n        write(value === \"\" ? [] : [value]);\n      }}\n    />\n  );\n}\n\nfunction CompactMultiCell<TRow>({\n  def,\n  source,\n  labels,\n  className,\n  menuClassName,\n  slots,\n}: Readonly<{\n  def: FilterDef<TRow>;\n  source: FilterFormSource<TRow>;\n  labels: Required<TableLabels>;\n  className?: string;\n  menuClassName?: string;\n  slots: FilterHeaderSlots;\n}>): ReactElement {\n  const { options } = useFilterOptions(def);\n  const selected = listFilterValues(source.extra[def.key]);\n  const write = (values: readonly string[]) => {\n    source.setExtra(def.key, values.length > 0 ? [...values] : undefined);\n  };\n  const first = options.find((option) => option.value === selected[0]);\n  let summary = labels.boolAny;\n  if (selected.length === 1) summary = first?.label ?? selected[0] ?? summary;\n  if (selected.length > 1) summary = labels.groupCount(selected.length);\n  const Multi = slots.Multi;\n  return (\n    <Multi\n      label={filterLabel(def)}\n      summary={summary}\n      options={options.map((option) => ({\n        value: option.value,\n        label: option.label,\n      }))}\n      selected={selected}\n      className={className}\n      menuClassName={menuClassName}\n      onToggle={(value, checked) => {\n        write(\n          checked\n            ? [...selected, value]\n            : selected.filter((item) => item !== value)\n        );\n      }}\n    />\n  );\n}\n\nfunction BooleanCell<TRow>({\n  def,\n  source,\n  labels,\n  className,\n  slots,\n}: Readonly<{\n  def: FilterDef<TRow>;\n  source: FilterFormSource<TRow>;\n  labels: Required<TableLabels>;\n  className?: string;\n  slots: FilterHeaderSlots;\n}>): ReactElement {\n  const widget = useBooleanFilterWidget(def, source);\n  const Select = slots.Select;\n  return (\n    <Select\n      label={widget.label}\n      value={widget.choice}\n      className={className}\n      options={[\n        { value: \"\", label: labels.boolAny },\n        { value: \"true\", label: labels.boolTrue },\n        { value: \"false\", label: labels.boolFalse },\n      ]}\n      onChange={(value) => widget.write(value as typeof widget.choice)}\n    />\n  );\n}\n\nfunction RangeCell<TRow>({\n  def,\n  source,\n  className,\n  slots,\n}: Readonly<{\n  def: FilterDef<TRow>;\n  source: FilterFormSource<TRow>;\n  className?: string;\n  slots: FilterHeaderSlots;\n}>): ReactElement {\n  const widget = useRangeFilterWidget(def, source);\n  // Compact header has no operator picker. An unset op would wipe the\n  // value on write; `gte` is the same inference a lone lower bound uses.\n  const op = widget.op ?? \"gte\";\n  const Range = slots.Range;\n  return (\n    <span data-adapttable-part=\"filter-header-input\" className={className}>\n      <Range\n        label={widget.label}\n        type={widget.inputType}\n        value={widget.a}\n        onChange={(value) => widget.write(op, value, widget.b)}\n      />\n      {widget.arity === \"two\" ? (\n        <Range\n          label={widget.label}\n          type={widget.inputType}\n          value={widget.b}\n          onChange={(value) => widget.write(op, widget.a, value)}\n        />\n      ) : null}\n    </span>\n  );\n}\n\nfunction FilterHeaderCell<TRow>({\n  def,\n  source,\n  labels,\n  className,\n  menuClassName,\n  registry = defaultFilterRegistry,\n  slots,\n}: Readonly<{\n  def: FilterDef<TRow>;\n  source: FilterFormSource<TRow>;\n  labels: Required<TableLabels>;\n  className?: string;\n  menuClassName?: string;\n  registry?: FilterTypeRegistry;\n  slots: FilterHeaderSlots;\n}>): ReactElement | null {\n  const spec = registry.get(def.type);\n  const custom = renderRegisteredFilter(\n    def,\n    source,\n    labels,\n    registry,\n    className\n  );\n  if (custom) return custom;\n  switch (spec?.widget ?? def.type) {\n    case \"text\":\n      return (\n        <TextCell\n          def={def}\n          source={source}\n          labels={labels}\n          className={className}\n          slots={slots}\n        />\n      );\n    case \"select\":\n      return (\n        <SelectCell\n          def={def}\n          source={source}\n          labels={labels}\n          className={className}\n          slots={slots}\n        />\n      );\n    case \"multiSelect\":\n    case \"checklist\":\n      return (\n        <CompactMultiCell\n          def={def}\n          source={source}\n          labels={labels}\n          className={className}\n          menuClassName={menuClassName}\n          slots={slots}\n        />\n      );\n    case \"boolean\":\n      return (\n        <BooleanCell\n          def={def}\n          source={source}\n          labels={labels}\n          className={className}\n          slots={slots}\n        />\n      );\n    case \"numberRange\":\n    case \"dateRange\":\n      return (\n        <RangeCell\n          def={def}\n          source={source}\n          className={className}\n          slots={slots}\n        />\n      );\n    default:\n      return null;\n  }\n}\n\n/** Compact control for one filter definition — used in the header row and antd titles. */\nexport function FilterHeaderControlChrome<TRow>({\n  def,\n  source,\n  labels,\n  className,\n  registry = defaultFilterRegistry,\n  slots,\n}: Readonly<FilterHeaderControlChromeProps<TRow>>): ReactElement {\n  return (\n    <FilterHeaderCell\n      def={def}\n      source={source}\n      labels={labels}\n      className={className}\n      registry={registry}\n      slots={slots}\n    />\n  );\n}\n\n/**\n * Second header row of per-column quick filters. Pads and spacers match\n * the leaf header so sticky, pin offsets, and column windowing stay aligned.\n */\nexport function FilterHeaderChrome<TRow>({\n  enabled = true,\n  columns,\n  defs,\n  source,\n  labels,\n  expandable = false,\n  showReorder = false,\n  selection = false,\n  showActions = false,\n  columnSpacers,\n  cellStyle,\n  pinSide,\n  padStyle,\n  stickyAttr,\n  classNames = {},\n  registry = defaultFilterRegistry,\n  slots,\n}: Readonly<FilterHeaderChromeProps<TRow>>): ReactElement | null {\n  if (!enabled || defs.length === 0) return null;\n  const pad = (part: string, extra?: string) => (\n    <Pad\n      part={part}\n      style={padStyle}\n      stickyAttr={stickyAttr}\n      className={[classNames.headerCell, extra].filter(Boolean).join(\" \")}\n    />\n  );\n  return (\n    <tr\n      data-adapttable-part=\"filter-header-row\"\n      className={classNames.filterHeaderRow}\n      aria-label={labels.headerFilters}\n    >\n      {expandable ? pad(\"expand-header\", classNames.expandHeader) : null}\n      {showReorder ? pad(\"reorder-header\", classNames.reorderHeader) : null}\n      {selection ? pad(\"selection-header\", classNames.selectionHeader) : null}\n      {columnSpacers ? (\n        <ColumnSpacer width={columnSpacers.start} side=\"start\" as=\"th\" />\n      ) : null}\n      {columns.map((column) => {\n        const def = filterDefForColumn(defs, column.key);\n        return (\n          <th\n            key={column.key}\n            data-adapttable-part=\"filter-header-cell\"\n            data-sticky={stickyAttr}\n            data-pinned={pinSide?.(column.key)}\n            style={cellStyle?.(column)}\n            className={\n              [classNames.headerCell, classNames.filterHeaderCell]\n                .filter(Boolean)\n                .join(\" \") || undefined\n            }\n            data-column-key={column.key}\n          >\n            {def ? (\n              <FilterHeaderCell\n                def={def}\n                source={source}\n                labels={labels}\n                className={classNames.filterHeaderInput}\n                menuClassName={classNames.filterHeaderMenu}\n                registry={registry}\n                slots={slots}\n              />\n            ) : null}\n          </th>\n        );\n      })}\n      {columnSpacers ? (\n        <ColumnSpacer width={columnSpacers.end} side=\"end\" as=\"th\" />\n      ) : null}\n      {showActions ? pad(\"actions-header\", classNames.actionsHeader) : null}\n    </tr>\n  );\n}\n","/**\n * The query contract — the shape of everything the table can ask a server for,\n * defined once so the features that arrive later never have to change it.\n *\n * Every field here is optional, on both sides of the wire. A server that\n * ignores all of them behaves exactly as it does today; a table whose source\n * declares no support asks for nothing new. That is the whole design: adding\n * grouping, aggregates, filter trees, facets or cursors to this contract can\n * never break an integration that predates them.\n *\n * A source declares what it can answer through {@link QuerySupport}. The table\n * checks that before it asks, and says so in development when the UI wants\n * something the source did not sign up for — silence there would look like a\n * bug in the table rather than a gap in the integration.\n */\nimport { devWarn } from \"../utils/devWarn\";\n\n/**\n * What a server source can answer, beyond the baseline every source handles\n * (page, limit, search, sort, filters).\n *\n * Omit the whole object — or any field — and the table treats that capability\n * as unavailable: it keeps the work on the frontend where it can, and warns in\n * development where it cannot.\n */\nexport interface QuerySupport {\n  /** Grouping keys reach the server, which returns group rows. */\n  grouping?: boolean;\n  /**\n   * The open tree nodes reach the server, which returns the rows of the\n   * hierarchy that are visible — the roots, plus the children of every node\n   * the reader has opened. The only correct place for a large tree: a browser\n   * holding one page cannot know what is under a branch it has never seen.\n   */\n  tree?: boolean;\n  /** Aggregate requests reach the server, which computes the values. */\n  aggregates?: boolean;\n  /** The nested AND/OR condition tree reaches the server. */\n  filterTree?: boolean;\n  /** Distinct-value counts per column reach the server. */\n  facets?: boolean;\n  /** Pagination is by opaque cursor rather than page number. */\n  cursor?: boolean;\n}\n\n/** The aggregate functions every implementation is expected to understand. */\nexport type AggregateFn = \"sum\" | \"avg\" | \"count\" | \"min\" | \"max\";\n\n/**\n * One aggregate the table wants computed for a column.\n *\n * `fn` accepts any string so a backend can expose its own aggregations\n * (`\"median\"`, `\"p95\"`) without waiting for this type to name them, while the\n * five standard ones still autocomplete.\n */\nexport interface QueryAggregate {\n  /** Column key to aggregate. */\n  key: string;\n  /** Aggregate function name. */\n  fn: AggregateFn | (string & {});\n}\n\n/** A single condition in a filter tree: one column, one operator, one value. */\nexport interface QueryCondition {\n  /** Column or filter key. */\n  key: string;\n  /**\n   * Operator id — `\"eq\"`, `\"contains\"`, `\"between\"`, … The operator set is\n   * owned by the filtering work; this contract only carries it.\n   */\n  op: string;\n  /** Operand, if the operator takes one. `\"empty\"` and friends do not. */\n  value?: unknown;\n}\n\n/**\n * A node in the filter tree: conditions combined with one operator, nestable\n * so `(a AND b) OR c` is expressible.\n */\nexport interface QueryFilterGroup {\n  /** How this group's children combine. */\n  combinator: \"and\" | \"or\";\n  /** Conditions and nested groups, in the order the user built them. */\n  conditions: readonly (QueryCondition | QueryFilterGroup)[];\n}\n\n/** Narrows a filter-tree child to a nested group. */\nexport function isFilterGroup(\n  node: QueryCondition | QueryFilterGroup\n): node is QueryFilterGroup {\n  return \"combinator\" in node;\n}\n\n/**\n * Everything the table can additionally ask for, all optional. These ride on\n * {@link TableQuery} — see that type for the baseline fields.\n */\nexport interface QueryExtensions {\n  /**\n   * Grouping column keys, outermost first. A single-level grouping sends one\n   * key; the field is an array so multi-level grouping needs no new field.\n   */\n  groupBy?: readonly string[];\n  /** Aggregates to compute — per group when grouping, else over the result set. */\n  aggregates?: readonly QueryAggregate[];\n  /**\n   * The nested condition tree, when the UI has built one. The flat `filters`\n   * bag stays populated alongside it for servers that only read that.\n   */\n  filterTree?: QueryFilterGroup;\n  /** Column keys needing distinct-value counts for their filter UI. */\n  facets?: readonly string[];\n  /** Opaque cursor from the previous response, when paginating by cursor. */\n  cursor?: string;\n  /**\n   * The ids of the tree nodes the reader has open, so the server can return\n   * their children with the page. Empty means a folded tree — the roots and\n   * nothing else.\n   */\n  expandedIds?: readonly string[];\n}\n\n/** The capability each extension field needs before the table will send it. */\nconst REQUIRES: Record<keyof QueryExtensions, keyof QuerySupport> = {\n  groupBy: \"grouping\",\n  expandedIds: \"tree\",\n  aggregates: \"aggregates\",\n  filterTree: \"filterTree\",\n  facets: \"facets\",\n  cursor: \"cursor\",\n};\n\n/** Human-readable reason, so a warning tells the reader what to do next. */\nconst REMEDY: Record<keyof QuerySupport, string> = {\n  grouping: \"return group rows for `query.groupBy`\",\n  tree: \"return the children of every node in `query.expandedIds`\",\n  aggregates: \"compute `query.aggregates`\",\n  filterTree: \"evaluate `query.filterTree`\",\n  facets: \"return counts for `query.facets`\",\n  cursor: \"page by `query.cursor` instead of `query.page`\",\n};\n\n/**\n * Keep only the extensions the source declared support for, and say something\n * in development about the ones dropped.\n *\n * The table asks for what the UI is showing; the source decides what it can\n * answer. Where those disagree the field is omitted rather than sent and\n * ignored — a server should never receive a field it never agreed to read.\n */\nexport function applyQuerySupport(\n  extensions: QueryExtensions,\n  support: QuerySupport | undefined,\n  { warn = true }: { warn?: boolean } = {}\n): QueryExtensions {\n  const allowed: QueryExtensions = {};\n  for (const [field, value] of Object.entries(extensions) as [\n    keyof QueryExtensions,\n    QueryExtensions[keyof QueryExtensions],\n  ][]) {\n    if (value === undefined) continue;\n    const capability = REQUIRES[field];\n    if (support?.[capability]) {\n      Object.assign(allowed, { [field]: value });\n    } else if (warn) {\n      // devWarn dedupes by message, so this fires once per capability per\n      // session however often the query changes.\n      devWarn(\n        `The table wants to send \\`${field}\\`, but this source does not declare ` +\n          `\\`supports.${capability}\\`. The field is omitted. Set it once your ` +\n          `endpoint can ${REMEDY[capability]}.`\n      );\n    }\n  }\n  return allowed;\n}\n","/**\n * AND/OR filter tree — the engine behind advanced filters (#278).\n * The URL and Saved Views store a versioned encoding; the frontend\n * predicate and the server query both read the same {@link QueryFilterGroup}.\n * The builder UI is #279; this file is the evaluator.\n */\nimport type { QueryCondition, QueryFilterGroup } from \"../source/queryContract\";\nimport { isFilterGroup } from \"../source/queryContract\";\nimport type { ExtraFilters } from \"../types\";\nimport { defaultFilterRegistry } from \"./filterBuiltins\";\nimport { type FilterDef, filterPredicate } from \"./filterDefs\";\nimport type { FilterTypeRegistry } from \"./filterRegistry\";\nimport { isActiveFilterTree } from \"./filterTreeCodec\";\nimport { filterOpKey } from \"./operators\";\n\nexport {\n  FILTER_TREE_PARAM,\n  FILTER_TREE_VERSION,\n  isActiveFilterTree,\n  parseFilterTree,\n  serializeFilterTree,\n} from \"./filterTreeCodec\";\n\nfunction asScalar(value: unknown): string | undefined {\n  if (value == null) return undefined;\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  return undefined;\n}\n\n/**\n * Project one tree condition onto the extra-filter bag the existing\n * per-def predicate already understands.\n */\nexport function conditionToExtra<TRow>(\n  def: FilterDef<TRow>,\n  condition: QueryCondition,\n  registry: FilterTypeRegistry = defaultFilterRegistry\n): ExtraFilters {\n  const spec = registry.get(def.type);\n  if (spec) return spec.conditionToExtra(def, condition);\n  return {\n    [def.key]: asScalar(condition.value),\n    [filterOpKey(def.key)]: condition.op,\n  };\n}\n\nfunction matchCondition<TRow>(\n  row: TRow,\n  condition: QueryCondition,\n  defs: readonly FilterDef<TRow>[],\n  registry: FilterTypeRegistry\n): boolean {\n  const def = defs.find((item) => item.key === condition.key);\n  if (!def) return true;\n  return filterPredicate(def, registry)(\n    row,\n    conditionToExtra(def, condition, registry)\n  );\n}\n\n/**\n * Evaluate a tree against one row. An empty / missing tree matches\n * every row. Unknown condition keys match (stale links do not hide data).\n */\nexport function evaluateFilterTree<TRow>(\n  tree: QueryFilterGroup | undefined,\n  row: TRow,\n  defs: readonly FilterDef<TRow>[],\n  registry: FilterTypeRegistry = defaultFilterRegistry\n): boolean {\n  if (!isActiveFilterTree(tree)) return true;\n  const results = tree.conditions.map((node) =>\n    isFilterGroup(node)\n      ? evaluateFilterTree(node, row, defs, registry)\n      : matchCondition(row, node, defs, registry)\n  );\n  return tree.combinator === \"and\"\n    ? results.every(Boolean)\n    : results.some(Boolean);\n}\n","/**\n * Immutable updates for an AND/OR filter tree. Paths are child indexes\n * from the root (`[]` is the root group).\n */\nimport type { QueryCondition, QueryFilterGroup } from \"../source/queryContract\";\nimport { isFilterGroup } from \"../source/queryContract\";\n\nexport type FilterTreeNode = QueryCondition | QueryFilterGroup;\n\n/** An empty AND group — the tree a first \"Add condition\" starts from. */\nexport function emptyFilterTree(): QueryFilterGroup {\n  return { combinator: \"and\", conditions: [] };\n}\n\nfunction cloneGroup(group: QueryFilterGroup): QueryFilterGroup {\n  return { combinator: group.combinator, conditions: [...group.conditions] };\n}\n\nfunction atGroup(\n  tree: QueryFilterGroup,\n  path: readonly number[]\n): QueryFilterGroup | undefined {\n  let current = tree;\n  for (const index of path) {\n    const child = current.conditions[index];\n    if (!child || !isFilterGroup(child)) return undefined;\n    current = child;\n  }\n  return current;\n}\n\nfunction replaceChild(\n  tree: QueryFilterGroup,\n  path: readonly number[],\n  index: number,\n  next: FilterTreeNode | undefined\n): QueryFilterGroup {\n  if (path.length === 0) {\n    const group = cloneGroup(tree);\n    const conditions = [...group.conditions];\n    if (next === undefined) conditions.splice(index, 1);\n    else conditions[index] = next;\n    return { ...group, conditions };\n  }\n  const [head, ...rest] = path;\n  const child = tree.conditions[head!];\n  if (!child || !isFilterGroup(child)) return tree;\n  const updated = replaceChild(child, rest, index, next);\n  return replaceChild(tree, [], head!, updated);\n}\n\n/** Set the combinator on the group at `path`. */\nexport function setFilterTreeCombinator(\n  tree: QueryFilterGroup,\n  path: readonly number[],\n  combinator: QueryFilterGroup[\"combinator\"]\n): QueryFilterGroup {\n  const group = atGroup(tree, path);\n  if (!group) return tree;\n  if (path.length === 0) return { ...tree, combinator };\n  const parentPath = path.slice(0, -1);\n  const index = path.at(-1)!;\n  return replaceChild(tree, parentPath, index, { ...group, combinator });\n}\n\n/** Append a child to the group at `path`. */\nexport function appendFilterTreeChild(\n  tree: QueryFilterGroup | undefined,\n  path: readonly number[],\n  child: FilterTreeNode\n): QueryFilterGroup {\n  const root = tree ?? emptyFilterTree();\n  const group = atGroup(root, path);\n  if (!group) return root;\n  const next: QueryFilterGroup = {\n    ...group,\n    conditions: [...group.conditions, child],\n  };\n  if (path.length === 0) return next;\n  const parentPath = path.slice(0, -1);\n  const index = path.at(-1)!;\n  return replaceChild(root, parentPath, index, next);\n}\n\n/** Append a condition to the group at `path`. */\nexport function addFilterTreeCondition(\n  tree: QueryFilterGroup | undefined,\n  path: readonly number[],\n  condition: QueryCondition\n): QueryFilterGroup {\n  return appendFilterTreeChild(tree, path, condition);\n}\n\n/** Append a nested AND group to the group at `path`. */\nexport function addFilterTreeGroup(\n  tree: QueryFilterGroup | undefined,\n  path: readonly number[]\n): QueryFilterGroup {\n  return appendFilterTreeChild(tree, path, emptyFilterTree());\n}\n\n/** Replace the node at `path` (path must name a child, not the root). */\nexport function replaceFilterTreeNode(\n  tree: QueryFilterGroup,\n  path: readonly number[],\n  next: FilterTreeNode\n): QueryFilterGroup {\n  if (path.length === 0) {\n    return isFilterGroup(next) ? next : tree;\n  }\n  const parentPath = path.slice(0, -1);\n  const index = path.at(-1)!;\n  return replaceChild(tree, parentPath, index, next);\n}\n\n/**\n * Remove the node at `path`. Removing the last root child returns\n * `undefined` so the URL drops `ft`.\n */\nexport function removeFilterTreeNode(\n  tree: QueryFilterGroup,\n  path: readonly number[]\n): QueryFilterGroup | undefined {\n  if (path.length === 0) return undefined;\n  const parentPath = path.slice(0, -1);\n  const index = path.at(-1)!;\n  const next = replaceChild(tree, parentPath, index, undefined);\n  if (next.conditions.length === 0) return undefined;\n  return next;\n}\n\n/** Walk every leaf, with the path to that leaf. */\nexport function walkFilterTreeConditions(\n  tree: QueryFilterGroup | undefined,\n  path: readonly number[] = []\n): { condition: QueryCondition; path: readonly number[] }[] {\n  if (!tree) return [];\n  const out: { condition: QueryCondition; path: readonly number[] }[] = [];\n  tree.conditions.forEach((node, index) => {\n    const childPath = [...path, index];\n    if (isFilterGroup(node)) {\n      out.push(...walkFilterTreeConditions(node, childPath));\n      return;\n    }\n    out.push({ condition: node, path: childPath });\n  });\n  return out;\n}\n","/**\n * Removable chips for every leaf in the AND/OR filter tree.\n */\nimport { useMemo } from \"react\";\n\nimport type { QueryCondition, QueryFilterGroup } from \"../source/queryContract\";\nimport type { TableLabels } from \"../types\";\nimport { type FilterDef, filterLabel } from \"./filterDefs\";\nimport { filterOpLabel } from \"./filterForm\";\nimport {\n  removeFilterTreeNode,\n  walkFilterTreeConditions,\n} from \"./filterTreeMutations\";\nimport {\n  DATE_OP_LABEL_KEYS,\n  type DateOp,\n  formatFilterChip,\n  NUMBER_OP_LABEL_KEYS,\n  type NumberOp,\n  TEXT_OP_LABEL_KEYS,\n  type TextOp,\n} from \"./operators\";\nimport { relativeTokenLabel } from \"./relativeDates\";\nimport type { ActiveFilterChip } from \"./useActiveFilterChips\";\n\nfunction conditionValueText(\n  condition: QueryCondition,\n  labels: Required<TableLabels>\n): string | undefined {\n  const value = condition.value;\n  if (condition.op === \"relative\" && typeof value === \"string\") {\n    return relativeTokenLabel(value, labels);\n  }\n  if (Array.isArray(value)) {\n    const parts = value\n      .map((item) =>\n        typeof item === \"string\" ||\n        typeof item === \"number\" ||\n        typeof item === \"boolean\"\n          ? String(item)\n          : \"\"\n      )\n      .filter(Boolean);\n    return parts.length > 0 ? parts.join(\", \") : undefined;\n  }\n  if (value == null || value === \"\") return undefined;\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  return undefined;\n}\n\nfunction conditionOpWord<TRow>(\n  def: FilterDef<TRow> | undefined,\n  op: string,\n  labels: Required<TableLabels>\n): string {\n  if (def?.type === \"text\" && op in TEXT_OP_LABEL_KEYS) {\n    return filterOpLabel(labels, TEXT_OP_LABEL_KEYS[op as TextOp]);\n  }\n  if (def?.type === \"numberRange\" && op in NUMBER_OP_LABEL_KEYS) {\n    return filterOpLabel(labels, NUMBER_OP_LABEL_KEYS[op as NumberOp]);\n  }\n  if (def?.type === \"dateRange\" && op in DATE_OP_LABEL_KEYS) {\n    return filterOpLabel(labels, DATE_OP_LABEL_KEYS[op as DateOp]);\n  }\n  return op;\n}\n\n/** Build one chip label for a tree leaf. */\nexport function filterTreeChipLabel<TRow>(\n  condition: QueryCondition,\n  defs: readonly FilterDef<TRow>[],\n  labels: Required<TableLabels>\n): string {\n  const def = defs.find((item) => item.key === condition.key);\n  const field = def ? filterLabel(def) : condition.key;\n  return formatFilterChip(\n    field,\n    conditionOpWord(def, condition.op, labels),\n    conditionValueText(condition, labels)\n  );\n}\n\n/** Options for {@link useFilterTreeChips}. */\nexport interface UseFilterTreeChipsOptions<TRow> {\n  readonly tree: QueryFilterGroup | undefined;\n  readonly defs: readonly FilterDef<TRow>[];\n  readonly labels: Required<TableLabels>;\n  readonly setFilterTree?: (tree: QueryFilterGroup | undefined) => void;\n}\n\n/** Flatten the tree into removable chips. */\nexport function useFilterTreeChips<TRow>(\n  options: UseFilterTreeChipsOptions<TRow>\n): readonly ActiveFilterChip[] {\n  const { tree, defs, labels, setFilterTree } = options;\n  return useMemo(() => {\n    if (!tree || !setFilterTree) return [];\n    return walkFilterTreeConditions(tree).map(({ condition, path }) => ({\n      key: `ft:${path.join(\".\")}:${condition.key}:${condition.op}`,\n      label: filterTreeChipLabel(condition, defs, labels),\n      onRemove: () => setFilterTree(removeFilterTreeNode(tree, path)),\n    }));\n  }, [defs, labels, setFilterTree, tree]);\n}\n","/**\n * Find in table — locating text without filtering it away.\n *\n * Search and find are different questions. The search box asks \"show me only\n * the rows that match\", and on a server tier it asks the server. Find asks\n * \"where does this appear in what I am looking at\", leaves every row where it\n * is, and walks the hits — which is what people mean when they press Ctrl+F.\n *\n * Matching reads what the cell SHOWS (`columnText`, the same resolution the\n * screen-reader announcements use), so a column that renders a formatted date\n * is searched by that date rather than by the ISO string underneath. Nothing\n * else would match what a person can see on screen.\n */\nimport { columnText } from \"../columns/columnText\";\nimport type { GridCell } from \"../focus/gridFocus\";\nimport type { ColumnDef } from \"../types\";\n\n/** What a find needs to know. */\nexport interface FindMatchesOptions<TRow> {\n  /** What to look for. An empty or blank query matches nothing. */\n  query: string;\n  /** The rows the browser holds, in table order. */\n  rows: readonly TRow[];\n  /** The columns as rendered — matches are addressed by their index. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Where the rendered window starts in the dataset. Zero unless paged. */\n  firstRowIndex?: number;\n}\n\n/**\n * Every cell whose text contains the query, in reading order.\n *\n * Case-insensitive, because nobody types the case of what they are looking\n * for. Only the LOADED rows are searched: a find cannot honestly claim a hit\n * in a row the browser has never seen, and saying \"3 of 17\" about rows that\n * are not there would be worse than saying nothing.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link FindMatchesOptions}.\n * @returns The matching cells, in absolute addresses.\n */\nexport function findMatches<TRow>(\n  options: FindMatchesOptions<TRow>\n): GridCell[] {\n  const { query, rows, columns, firstRowIndex = 0 } = options;\n  const needle = query.trim().toLowerCase();\n  if (needle === \"\") return [];\n\n  const matches: GridCell[] = [];\n  rows.forEach((row, index) => {\n    columns.forEach((column, col) => {\n      if (columnText(column, row).toLowerCase().includes(needle)) {\n        matches.push({ row: firstRowIndex + index, col });\n      }\n    });\n  });\n  return matches;\n}\n\n/** A cell address as a string, for set membership without a nested scan. */\nexport function matchKey(cell: GridCell): string {\n  return `${cell.row}:${cell.col}`;\n}\n\n/**\n * The match keys as a set, so a cell can ask \"am I a match\" in constant time.\n *\n * A table of 500 rows × 12 columns asks that question 6,000 times per render;\n * scanning an array each time is the difference between a find that feels\n * instant and one that stutters.\n *\n * @param matches - The matches, from {@link findMatches}.\n * @returns Their keys.\n */\nexport function matchKeySet(matches: readonly GridCell[]): ReadonlySet<string> {\n  return new Set(matches.map(matchKey));\n}\n\n/**\n * Step through the matches, wrapping at both ends.\n *\n * Wrapping is what a find does — reaching the last hit and pressing next\n * returns to the first, which is why a browser's find bar says \"1 of 17\"\n * again rather than stopping.\n *\n * @param index - Where the walk is now.\n * @param total - How many matches there are.\n * @param step - `1` for next, `-1` for previous.\n * @returns The next index, or `-1` when there is nothing to step through.\n */\nexport function stepMatch(index: number, total: number, step: number): number {\n  if (total === 0) return -1;\n  return (((index + step) % total) + total) % total;\n}\n","/**\n * Where the keyboard is, in a grid of cells — the pure part.\n *\n * A table is one tab stop, not hundreds. The focused cell carries\n * `tabIndex=0` and every other cell `-1`, so Tab enters and leaves the table\n * while the arrow keys move inside it. That is the roving-tabindex pattern the\n * ARIA grid practice asks for, and it is the only reason a 10,000-row table is\n * navigable at all.\n *\n * This file is the arithmetic: given where focus is and which key was pressed,\n * where does it go. No React, no DOM — which is what makes every edge testable\n * without rendering anything. {@link useGridFocus} owns the state and the\n * scrolling, and the adapters own none of it.\n */\nimport type { Direction } from \"../types\";\n\n/** A cell address in the grid: both indices absolute, both zero-based. */\nexport interface GridCell {\n  /** Row index within the whole dataset, not within the rendered window. */\n  row: number;\n  /** Column index within the visible column set. */\n  col: number;\n}\n\n/** The grid's shape, as the mover needs to see it. */\nexport interface GridBounds {\n  /** Total rows the user can reach — the dataset, not the rendered slice. */\n  rowCount: number;\n  /** Total columns the user can reach. */\n  colCount: number;\n  /**\n   * Rows a PageUp/PageDown travels. The viewport's worth, so paging feels like\n   * paging rather than an arbitrary jump.\n   */\n  pageSize: number;\n}\n\n/**\n * What a key press means. Named rather than passed as raw keys so the mapping\n * is testable on its own and an adapter can bind a kit's own control to the\n * same intent.\n */\nexport type GridFocusMove =\n  | \"up\"\n  | \"down\"\n  | \"left\"\n  | \"right\"\n  | \"rowStart\"\n  | \"rowEnd\"\n  | \"gridStart\"\n  | \"gridEnd\"\n  | \"pageUp\"\n  | \"pageDown\";\n\n/** Clamp to the grid; a move that would leave it stops at the edge instead. */\nfunction clamp(value: number, max: number): number {\n  if (value < 0) return 0;\n  if (value > max) return max;\n  return value;\n}\n\n/**\n * Where a move lands, clamped to the grid.\n *\n * Edges stop rather than wrap. Wrapping a right-arrow from the last column to\n * the first cell of the next row is a spreadsheet convention, and in a table\n * it silently moves the user to a different record — so this holds still and\n * lets the screen reader stay quiet.\n *\n * @param from - Where focus is now.\n * @param move - The intent, from {@link gridFocusMoveForKey}.\n * @param bounds - The grid's shape.\n * @returns The new address, which may equal `from` at an edge.\n */\nfunction stepGridFocus(\n  from: GridCell,\n  move: GridFocusMove,\n  bounds: GridBounds\n): GridCell {\n  const lastRow = Math.max(0, bounds.rowCount - 1);\n  const lastCol = Math.max(0, bounds.colCount - 1);\n  const step = Math.max(1, bounds.pageSize);\n\n  switch (move) {\n    case \"up\":\n      return { row: clamp(from.row - 1, lastRow), col: from.col };\n    case \"down\":\n      return { row: clamp(from.row + 1, lastRow), col: from.col };\n    case \"left\":\n      return { row: from.row, col: clamp(from.col - 1, lastCol) };\n    case \"right\":\n      return { row: from.row, col: clamp(from.col + 1, lastCol) };\n    case \"rowStart\":\n      return { row: from.row, col: 0 };\n    case \"rowEnd\":\n      return { row: from.row, col: lastCol };\n    case \"gridStart\":\n      return { row: 0, col: 0 };\n    case \"gridEnd\":\n      return { row: lastRow, col: lastCol };\n    case \"pageUp\":\n      return { row: clamp(from.row - step, lastRow), col: from.col };\n    case \"pageDown\":\n      return { row: clamp(from.row + step, lastRow), col: from.col };\n  }\n}\n\n/**\n * Where a move lands, clamped to the grid.\n *\n * Edges stop rather than wrap. Wrapping a right-arrow from the last column to\n * the first cell of the next row is a spreadsheet convention, and in a table\n * it silently moves the user to a different record — so this holds still and\n * lets the screen reader stay quiet.\n *\n * A covered cell (inside someone else's row/col span) is skipped in the\n * same direction; if every remaining cell is covered, focus stays put.\n *\n * @param from - Where focus is now.\n * @param move - The intent, from {@link gridFocusMoveForKey}.\n * @param bounds - The grid's shape.\n * @param covered - True for a cell that must not receive focus.\n * @returns The new address, which may equal `from` at an edge.\n */\nexport function moveGridFocus(\n  from: GridCell,\n  move: GridFocusMove,\n  bounds: GridBounds,\n  covered?: (cell: GridCell) => boolean\n): GridCell {\n  const landed = stepGridFocus(from, move, bounds);\n  if (!covered?.(landed)) return landed;\n  let current = landed;\n  // Edges stop rather than wrap, so this always hits `sameGridCell` before\n  // it could cycle. A trip-count would never run.\n  for (;;) {\n    const next = stepGridFocus(current, move, bounds);\n    if (sameGridCell(next, current)) return from;\n    if (!covered(next)) return next;\n    current = next;\n  }\n}\n\n/** The key press, as much of it as the mapping needs. */\nexport interface GridKeyPress {\n  key: string;\n  /** Ctrl or Cmd — either one means \"to the end of the grid\". */\n  ctrlKey?: boolean;\n  metaKey?: boolean;\n}\n\n/**\n * Turn a key press into a move, or `null` when the grid should not react.\n *\n * Left and Right swap under `dir=\"rtl\"`, because the arrow keys describe the\n * screen and not the data: in a mirrored table the visually-next column is the\n * previous one. Nothing else flips — Home is still the start of the row, which\n * in RTL is its right-hand end, and that is what a user pressing Home wants.\n *\n * @param press - The key event, narrowed to what matters.\n * @param dir - The table's text direction.\n * @returns The intended move, or `null` to let the event through untouched.\n */\nexport function gridFocusMoveForKey(\n  press: GridKeyPress,\n  dir: Direction = \"ltr\"\n): GridFocusMove | null {\n  const toEnd =\n    Boolean(press.ctrlKey ?? false) || Boolean(press.metaKey ?? false);\n  const rtl = dir === \"rtl\";\n\n  switch (press.key) {\n    case \"ArrowUp\":\n      return \"up\";\n    case \"ArrowDown\":\n      return \"down\";\n    case \"ArrowLeft\":\n      return rtl ? \"right\" : \"left\";\n    case \"ArrowRight\":\n      return rtl ? \"left\" : \"right\";\n    case \"Home\":\n      return toEnd ? \"gridStart\" : \"rowStart\";\n    case \"End\":\n      return toEnd ? \"gridEnd\" : \"rowEnd\";\n    case \"PageUp\":\n      return \"pageUp\";\n    case \"PageDown\":\n      return \"pageDown\";\n    default:\n      return null;\n  }\n}\n\n/** Are two addresses the same cell? */\nexport function sameGridCell(a: GridCell | null, b: GridCell | null): boolean {\n  if (!a || !b) return a === b;\n  return a.row === b.row && a.col === b.col;\n}\n","/**\n * A rectangle of selected cells — the pure part.\n *\n * Range selection is two addresses, not a list: an **anchor** where the\n * selection started and a **head** where it currently reaches. Every cell\n * between them is selected, which is why extending a range never has to\n * enumerate anything and a 10,000-row selection costs two numbers.\n *\n * Keeping the anchor is the whole reason this is a model rather than a set.\n * Shift+Down twice then Shift+Up must shrink the range back, not start a new\n * one downward — and it only does that if the origin is remembered.\n */\nimport { type GridCell, sameGridCell } from \"./gridFocus\";\n\n/** A rectangle of cells, stored as the two corners that made it. */\nexport interface CellRange {\n  /** Where the selection began — fixed while the head moves. */\n  anchor: GridCell;\n  /** Where it currently reaches — the moving corner. */\n  head: GridCell;\n}\n\n/** The rectangle's edges, normalized so `from` is always the top-left. */\nexport interface CellRangeBounds {\n  fromRow: number;\n  toRow: number;\n  fromCol: number;\n  toCol: number;\n}\n\n/**\n * The rectangle a range covers, with the corners sorted.\n *\n * A range dragged upward has an anchor below its head, so every consumer would\n * otherwise repeat the same min/max dance and one of them would forget.\n */\nexport function cellRangeBounds(range: CellRange): CellRangeBounds {\n  return {\n    fromRow: Math.min(range.anchor.row, range.head.row),\n    toRow: Math.max(range.anchor.row, range.head.row),\n    fromCol: Math.min(range.anchor.col, range.head.col),\n    toCol: Math.max(range.anchor.col, range.head.col),\n  };\n}\n\n/** Is this cell inside the range? */\nexport function isInCellRange(\n  range: CellRange | null,\n  cell: GridCell\n): boolean {\n  if (!range) return false;\n  const b = cellRangeBounds(range);\n  return (\n    cell.row >= b.fromRow &&\n    cell.row <= b.toRow &&\n    cell.col >= b.fromCol &&\n    cell.col <= b.toCol\n  );\n}\n\n/** How many cells the range covers — rows × columns, never enumerated. */\nexport function cellRangeSize(range: CellRange | null): number {\n  if (!range) return 0;\n  const b = cellRangeBounds(range);\n  return (b.toRow - b.fromRow + 1) * (b.toCol - b.fromCol + 1);\n}\n\n/** A single cell selected on its own. */\nexport function singleCellRange(cell: GridCell): CellRange {\n  return { anchor: cell, head: cell };\n}\n\n/**\n * Move the head, keeping the anchor — what Shift+arrow and Shift+click do.\n *\n * Starting from nothing anchors at the cell that had focus, so the first\n * Shift+Down selects two cells rather than one.\n */\nexport function extendCellRange(\n  range: CellRange | null,\n  head: GridCell,\n  fallbackAnchor: GridCell\n): CellRange {\n  return { anchor: range?.anchor ?? fallbackAnchor, head };\n}\n\n/** Is the range a single cell? Useful for deciding whether to show chrome. */\nexport function isSingleCell(range: CellRange | null): boolean {\n  return range !== null && sameGridCell(range.anchor, range.head);\n}\n\n/**\n * The rows and columns a range covers, as index lists.\n *\n * This is the one place that does enumerate, because an exporter has to walk\n * them — and it is a deliberate boundary: the model stays two corners, and\n * anything that needs the cells asks for them explicitly.\n */\nexport function cellRangeIndices(range: CellRange): {\n  rows: number[];\n  cols: number[];\n} {\n  const b = cellRangeBounds(range);\n  const rows: number[] = [];\n  const cols: number[] = [];\n  for (let r = b.fromRow; r <= b.toRow; r++) rows.push(r);\n  for (let c = b.fromCol; c <= b.toCol; c++) cols.push(c);\n  return { rows, cols };\n}\n","/**\n * The find bar's state: the query, the hits, and which one you are on.\n *\n * It knows nothing about focus. The shell moves focus to the current match\n * through the grid it already has, which keeps this hook pure enough to test\n * without a DOM and stops two pieces of code owning \"where the table is\n * looking\".\n */\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport type { CellRange } from \"../focus/cellRange\";\nimport { singleCellRange } from \"../focus/cellRange\";\nimport type { GridCell } from \"../focus/gridFocus\";\nimport type { ColumnDef } from \"../types\";\nimport { findMatches, matchKeySet, stepMatch } from \"./findMatches\";\n\n/** What {@link useFindInTable} needs. */\nexport interface UseFindInTableOptions<TRow> {\n  /** Off unless the host asked for it; when false nothing is searched. */\n  enabled: boolean;\n  /** The rows the browser holds, in table order. */\n  rows: readonly TRow[];\n  /** The columns as rendered. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Where the rendered window starts in the dataset. Zero unless paged. */\n  firstRowIndex?: number;\n}\n\n/** What {@link useFindInTable} returns. */\nexport interface FindInTableState {\n  /** Whether the bar is showing. */\n  open: boolean;\n  /** Show or hide the bar. Hiding clears the query, as a find bar does. */\n  setOpen: (open: boolean) => void;\n  /** The current query. */\n  query: string;\n  /** Type into the find bar. Resets the walk to the first hit. */\n  setQuery: (query: string) => void;\n  /** Every matching cell, in reading order. */\n  matches: readonly GridCell[];\n  /** Their keys, for marking cells as this render walks them. */\n  matchKeys: ReadonlySet<string>;\n  /** Which match the walk is on, from zero; `-1` when there are none. */\n  index: number;\n  /** The cell the walk is on, or `null`. */\n  current: GridCell | null;\n  /** Step to the next hit, wrapping at the end. */\n  next: () => void;\n  /** Step to the previous hit, wrapping at the start. */\n  previous: () => void;\n  /**\n   * Open the bar — what Ctrl/Cmd+F and a host's own button call. `undefined`\n   * when the feature is off, so the shortcut stays the BROWSER'S rather than\n   * being swallowed by a table that has no bar to show.\n   */\n  openBar?: () => void;\n}\n\n/**\n * Find state over the loaded rows.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseFindInTableOptions}.\n * @returns The state; inert with `enabled` false.\n */\nexport function useFindInTable<TRow>(\n  options: UseFindInTableOptions<TRow>\n): FindInTableState {\n  const { enabled, rows, columns, firstRowIndex = 0 } = options;\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState(\"\");\n  const [index, setIndex] = useState(-1);\n\n  const matches = useMemo(\n    () =>\n      enabled && open\n        ? findMatches({ query, rows, columns, firstRowIndex })\n        : [],\n    [enabled, open, query, rows, columns, firstRowIndex]\n  );\n  const matchKeys = useMemo(() => matchKeySet(matches), [matches]);\n\n  const writeQuery = useCallback((next: string) => {\n    setQuery(next);\n    // A new query starts the walk again: staying on hit 9 of the last search\n    // would land the user somewhere unrelated.\n    setIndex(next.trim() === \"\" ? -1 : 0);\n  }, []);\n\n  const writeOpen = useCallback(\n    (next: boolean) => {\n      setOpen(next);\n      // Closing clears the query, so reopening starts clean and no cell stays\n      // marked behind a bar that is no longer on screen.\n      if (!next) writeQuery(\"\");\n    },\n    [writeQuery]\n  );\n\n  const step = useCallback(\n    (by: number) => {\n      setIndex((current) => stepMatch(current, matches.length, by));\n    },\n    [matches.length]\n  );\n  const openBar = useCallback(() => {\n    writeOpen(true);\n  }, [writeOpen]);\n  const next = useCallback(() => {\n    step(1);\n  }, [step]);\n  const previous = useCallback(() => {\n    step(-1);\n  }, [step]);\n\n  // The walk can outlive its target: typing narrows the hits, and a row can\n  // leave the window on the next page. Clamp rather than pointing at nothing.\n  const safeIndex =\n    matches.length === 0\n      ? -1\n      : Math.min(Math.max(index, 0), matches.length - 1);\n\n  return useMemo(\n    () => ({\n      open: enabled && open,\n      setOpen: writeOpen,\n      query,\n      setQuery: writeQuery,\n      matches,\n      matchKeys,\n      index: safeIndex,\n      current: safeIndex === -1 ? null : (matches[safeIndex] ?? null),\n      next,\n      previous,\n      openBar: enabled ? openBar : undefined,\n    }),\n    [\n      enabled,\n      open,\n      writeOpen,\n      query,\n      writeQuery,\n      matches,\n      matchKeys,\n      safeIndex,\n      next,\n      previous,\n      openBar,\n    ]\n  );\n}\n\n/**\n * Take the table's focus to whichever match the walk is on.\n *\n * Highlighting alone is not finding: with 500 rows rendered, the hit is\n * usually off-screen, so the walk moves focus — which scrolls the cell into\n * view, announces it, and leaves it selected. Both the shell and the antd\n * adapter wire find this way, and this is the one place that rule lives.\n *\n * @param current - The match the walk is on, or `null`.\n * @param focusCell - The grid's `focusCell`.\n * @param selectRange - The grid's `selectRange`.\n */\nexport function useFindFocus(\n  current: GridCell | null,\n  focusCell: (cell: GridCell) => void,\n  selectRange: (range: CellRange | null) => void\n): void {\n  useEffect(() => {\n    if (!current) return;\n    focusCell(current);\n    selectRange(singleCellRange(current));\n  }, [current, focusCell, selectRange]);\n}\n","/**\n * What a batch gesture commits, and who receives it.\n *\n * Paste and fill both write many cells at once, and both do it as ORDINARY\n * edits: the same shape an inline commit produces, through the same handler.\n * That is deliberate — anything later wrapped around single-cell editing\n * (validation, async saves, conflict handling) covers a batch without the\n * batch knowing it exists, and there is never a second half-maintained\n * editing route to keep in step.\n */\n/** One cell written — exactly what an inline commit writes. */\nexport interface CellEdit<TRow> {\n  /** The row being written. */\n  row: TRow;\n  /** Which column, by key. */\n  columnKey: string;\n  /** The value to commit, already through the column's `parseValue`. */\n  value: unknown;\n}\n\n/**\n * Resolve who receives a batch of edits.\n *\n * A table that can already be edited can already be pasted into and filled:\n * with no batch handler, each edit goes through `onCellEdit`, the exact call\n * an inline commit makes. The batch handler exists for hosts that want the\n * whole set at once — one server round trip, one undo entry — and takes\n * precedence when given.\n *\n * @typeParam TRow - The row type.\n * @param batch - The host's batch handler, when it has one.\n * @param onCellEdit - The ordinary inline-edit channel.\n * @returns The handler, or `undefined` when the table takes no edits at all —\n *   which leaves the gesture's key or drag to the browser.\n */\nexport function batchEditHandler<TRow>(\n  batch: ((edits: CellEdit<TRow>[]) => void) | undefined,\n  onCellEdit: ((row: TRow, key: string, nextValue: unknown) => void) | undefined\n): ((edits: CellEdit<TRow>[]) => void) | undefined {\n  if (batch) return batch;\n  if (!onCellEdit) return undefined;\n  return (edits) => {\n    for (const edit of edits) onCellEdit(edit.row, edit.columnKey, edit.value);\n  };\n}\n","/**\n * The selected rectangle, as a spreadsheet reads it.\n *\n * Excel, Google Sheets, Numbers and LibreOffice all put tab-separated text on\n * the clipboard and all parse it back, so TSV — not CSV, not JSON — is what\n * makes copy and paste work between a table and the thing people actually use.\n * A cell containing a tab or a newline is quoted the way those applications\n * quote it, which is RFC-4180's rule applied to a tab delimiter.\n *\n * Values come from the same resolution the exports use, so what lands in a\n * spreadsheet from a copy and from a downloaded file cannot disagree.\n */\nimport { buildExportTable } from \"../export/exportWriter\";\nimport type { ColumnDef } from \"../types\";\nimport { type CellRange, cellRangeIndices } from \"./cellRange\";\n\n/** What a copy needs to know: the rectangle, and the data under it. */\nexport interface ClipboardRangeOptions<TRow> {\n  /** The selected rectangle, in absolute addresses. */\n  range: CellRange;\n  /** The rows the browser holds, in table order. */\n  rows: readonly TRow[];\n  /** The columns as rendered — a range's column indices address these. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Where the rendered window starts in the dataset. Zero unless paged. */\n  firstRowIndex?: number;\n  /** Include a header row naming each column. Defaults to `false`. */\n  headers?: boolean;\n}\n\n/** A tab or a newline inside a cell would end the field or the row. */\nfunction escapeCell(text: string): string {\n  return /[\\t\\n\\r\"]/.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n\n/** A value as clipboard text — primitives stringify, anything else is empty. */\nfunction cellText(value: unknown): string {\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  return \"\";\n}\n\n/**\n * The selected rectangle as tab-separated text, ready for the clipboard.\n *\n * Rows outside what the browser holds are skipped rather than written blank: a\n * range can only cover loaded rows, and inventing empty ones would paste holes\n * into someone's spreadsheet.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link ClipboardRangeOptions}.\n * @returns TSV text; an empty string when the range covers nothing loaded.\n */\nexport function clipboardRangeText<TRow>(\n  options: ClipboardRangeOptions<TRow>\n): string {\n  const { range, rows, columns, firstRowIndex = 0, headers = false } = options;\n  const indices = cellRangeIndices(range);\n  const cols = indices.cols.flatMap((index) => {\n    const column = columns[index];\n    return column ? [column] : [];\n  });\n  if (cols.length === 0) return \"\";\n\n  const selected = indices.rows.flatMap((index) => {\n    const row = rows[index - firstRowIndex];\n    return row === undefined ? [] : [row];\n  });\n  const table = buildExportTable(selected, cols);\n\n  const lines = table.rows.map((row) =>\n    row.map(cellText).map(escapeCell).join(\"\\t\")\n  );\n  return headers\n    ? [table.headers.map(escapeCell).join(\"\\t\"), ...lines].join(\"\\n\")\n    : lines.join(\"\\n\");\n}\n\n/**\n * Write text to the clipboard, reporting whether it landed.\n *\n * The async Clipboard API is unavailable outside a secure context and can be\n * refused by permission, so this answers with a boolean rather than throwing:\n * a copy that silently did nothing is the thing worth avoiding, and the caller\n * needs to know in order to say so.\n *\n * @param text - What to write.\n * @returns Whether the clipboard accepted it.\n */\nexport async function writeClipboardText(text: string): Promise<boolean> {\n  const clipboard = globalThis.navigator?.clipboard;\n  if (!clipboard?.writeText) return false;\n  try {\n    await clipboard.writeText(text);\n    return true;\n  } catch {\n    // A refused permission is not an error to propagate — it is an answer.\n    return false;\n  }\n}\n\n/**\n * Read text from the clipboard, or `null` when the browser will not give it.\n *\n * Reading is the more restricted half: Safari and Firefox gate `readText`\n * behind a permission or refuse it outside a user gesture. `null` says \"no\n * text\", never \"empty paste\", so a caller can tell the difference and say so.\n *\n * @returns The clipboard's text, or `null` when it is unavailable.\n */\nexport async function readClipboardText(): Promise<string | null> {\n  const clipboard = globalThis.navigator?.clipboard;\n  if (!clipboard?.readText) return null;\n  try {\n    return await clipboard.readText();\n  } catch {\n    return null;\n  }\n}\n","import type { ReactElement } from \"react\";\n\nimport type { SortableValue } from \"../types\";\nimport { getPath } from \"../utils/path\";\n\n/** One choice in a select cell editor. */\nexport interface CellEditorOption {\n  value: string;\n  label: string;\n}\n\n/**\n * Editor descriptor for an editable column — mirrors the declarative\n * `filter` shorthand: a bare type, or a select with options (objects or\n * plain value strings).\n */\nexport type CellEditor =\n  | \"text\"\n  | \"number\"\n  /** A checkbox. Commits `true` / `false`, never a string. */\n  | \"boolean\"\n  /** A date. Commits `YYYY-MM-DD`, the value a date input holds. */\n  | \"date\"\n  /** A date and a time. Commits `YYYY-MM-DDTHH:mm`. */\n  | \"datetime\"\n  /** A time of day. Commits `HH:mm`. */\n  | \"time\"\n  | {\n      type: \"select\";\n      options: readonly CellEditorOption[] | readonly string[];\n    }\n  | {\n      /** Several of a fixed set. Commits an array of the chosen values. */\n      type: \"multi-select\";\n      options: readonly CellEditorOption[] | readonly string[];\n    }\n  | {\n      /**\n       * Your own React editor. The table still owns activation, focus, the\n       * keyboard flow, validation and the commit — the component owns what the\n       * reader looks at and types into.\n       */\n      type: \"custom\";\n      render: CustomCellEditorRender;\n    };\n\n/**\n * A bring-your-own editor.\n *\n * Everything the table already does stays the table's: double-click / Enter /\n * F2 activates, focus returns to the cell afterwards, Enter commits, Escape\n * cancels, Tab moves on, validators gate the commit. What arrives here is the\n * draft and the two calls that change it — so an autocomplete, a rich-text\n * field or a colour picker becomes an editor without reimplementing any of that.\n */\nexport type CustomCellEditorRender = (\n  ctrl: CustomCellEditorCtrl\n) => ReactElement;\n\n/** What a custom editor is handed. */\nexport interface CustomCellEditorCtrl {\n  /** The draft, as the table holds it. */\n  draft: string;\n  /** Replace the draft. Does not commit. */\n  setDraft: (value: string) => void;\n  /**\n   * Commit now, without waiting for Enter or a blur — what a picker calls when\n   * the reader chooses something, since a choice IS the gesture.\n   */\n  commit: () => void;\n  /** Abandon the draft, exactly as Escape does. */\n  cancel: () => void;\n  /**\n   * Wire to the editor's own `onKeyDown` to keep Enter / Escape / Tab working.\n   * An editor that swallows them (a combobox using Enter to choose) simply does\n   * not call this for the keys it owns.\n   */\n  onKeyDown: (event: {\n    key: string;\n    preventDefault: () => void;\n    shiftKey?: boolean;\n  }) => void;\n  /** Commit on click-away. Wire to `onBlur` unless the editor is a popover. */\n  onBlur: () => void;\n  /** Attach to the element that should take focus when the cell opens. */\n  focusRef: (node: { focus: () => void } | null) => void;\n  /** Accessible name for the control — the column's header, resolved. */\n  label: string;\n  /** A validator's message for this cell, if the last commit was rejected. */\n  error?: string;\n  /** Whether an async validator is still deciding. */\n  validating: boolean;\n  /** `id` of the message element, for `aria-describedby`. */\n  errorId: string;\n}\n\n/**\n * Minimal column surface the editing helpers need. {@link ColumnDef}\n * satisfies this; using a narrow shape avoids `ColumnDef<T>` variance\n * issues when Tab-navigation crosses generic boundaries.\n *\n * `editable` uses a bivariant callback (same pattern as React's event\n * handlers) so `ColumnDef<Person>` is assignable to `EditableColumnLike`.\n */\nexport interface EditableColumnLike<TRow = unknown> {\n  key: string;\n  editable?: boolean | { bivarianceHack(row: TRow): boolean }[\"bivarianceHack\"];\n  editor?: CellEditor;\n  editValue?: { bivarianceHack(row: TRow): string }[\"bivarianceHack\"];\n  parseValue?: {\n    bivarianceHack(draft: string, row: TRow): unknown;\n  }[\"bivarianceHack\"];\n  validate?: {\n    bivarianceHack(\n      value: unknown,\n      row: TRow\n    ): string | undefined | Promise<string | undefined>;\n  }[\"bivarianceHack\"];\n  sortValue?: { bivarianceHack(row: TRow): SortableValue }[\"bivarianceHack\"];\n}\n\n/** The active cell being edited. */\nexport interface CellEditTarget {\n  rowId: string;\n  columnKey: string;\n}\n\n/** Result of a successful commit (host applies via `onCellEdit`). */\nexport interface CellEditCommit {\n  rowId: string;\n  columnKey: string;\n  /** Raw draft string from the editor. */\n  draft: string;\n}\n\n/** Whether this editor is the host's own component. */\nexport function isCustomEditor(\n  editor: CellEditor | null\n): editor is { type: \"custom\"; render: CustomCellEditorRender } {\n  return (\n    editor !== null && typeof editor === \"object\" && editor.type === \"custom\"\n  );\n}\n\n/** Whether this editor is a checkbox. */\nexport function isBooleanEditor(editor: CellEditor | null): boolean {\n  return editor === \"boolean\";\n}\n\n/** Whether this editor chooses several of a fixed set. */\nexport function isMultiSelectEditor(\n  editor: CellEditor | null\n): editor is { type: \"multi-select\"; options: readonly CellEditorOption[] } {\n  return (\n    editor !== null &&\n    typeof editor === \"object\" &&\n    editor.type === \"multi-select\"\n  );\n}\n\n/** Whether this editor chooses one of a fixed set. */\nexport function isSelectEditor(\n  editor: CellEditor | null\n): editor is { type: \"select\"; options: readonly CellEditorOption[] } {\n  return (\n    editor !== null && typeof editor === \"object\" && editor.type === \"select\"\n  );\n}\n\n/**\n * The native `type` an editor's input takes.\n *\n * One mapping for nine kits: every one of them renders a real `<input>`\n * underneath, and the browser's own date and time controls are\n * keyboard-complete and localized by the platform — a better answer than nine\n * hand-built pickers.\n *\n * A checkbox is not among these: a boolean editor renders its own control, and\n * several kits' text fields reject `type=\"checkbox\"` outright.\n *\n * @param editor - The column's editor descriptor.\n * @returns The `type` attribute for the editor's input.\n */\nexport function editorInputType(\n  editor: CellEditor | null\n): \"text\" | \"number\" | \"date\" | \"datetime-local\" | \"time\" {\n  if (editor === \"number\") return \"number\";\n  if (editor === \"date\") return \"date\";\n  if (editor === \"datetime\") return \"datetime-local\";\n  if (editor === \"time\") return \"time\";\n  return \"text\";\n}\n\n/** The draft string a checkbox holds. */\nexport function booleanDraft(checked: boolean): string {\n  return checked ? \"true\" : \"false\";\n}\n\n/** Whether a boolean editor's draft is on. */\nexport function isDraftChecked(draft: string): boolean {\n  return draft === \"true\";\n}\n\n/** Normalize select options to `{ value, label }` pairs. */\nexport function normalizeEditorOptions(\n  options: readonly CellEditorOption[] | readonly string[]\n): CellEditorOption[] {\n  return options.map((option) =>\n    typeof option === \"string\" ? { value: option, label: option } : option\n  );\n}\n\n/** Whether any column opts into editing (ignores per-row predicates). */\nexport function hasEditableColumns(\n  columns: readonly EditableColumnLike[]\n): boolean {\n  return columns.some(\n    (column) => column.editable !== undefined && column.editable !== false\n  );\n}\n\n/** Whether a column is editable for a given row. */\nexport function isCellEditable<TRow>(\n  column: EditableColumnLike<TRow>,\n  row: TRow\n): boolean {\n  const flag = column.editable;\n  if (flag === undefined || flag === false) return false;\n  if (flag === true) return true;\n  return flag(row);\n}\n\n/**\n * Resolve the editor for a column that opts into editing.\n * Returns `null` when the column is not editable — adapters must not\n * render an editor affordance without a non-null result AND a table-level\n * `onCellEdit` handler.\n */\nexport function resolveCellEditor(\n  column: EditableColumnLike\n): CellEditor | null {\n  if (column.editable === undefined || column.editable === false) return null;\n  return column.editor ?? \"text\";\n}\n\n/**\n * Stringify a cell's current value for the editor draft.\n * Prefers `editValue`, then `sortValue`, then `getPath(row, key)`.\n * Non-primitive path values yield `\"\"` so we never seed `[object Object]`.\n */\nexport function readEditableCellValue<TRow>(\n  row: TRow,\n  column: EditableColumnLike<TRow>\n): string {\n  const seed = readSeed(row, column);\n  // A date editor holds a day, a time editor holds a time of day: trim the\n  // stored value to the part its own input can hold, or the browser rejects it\n  // and the editor opens empty.\n  return trimToEditor(seed, resolveCellEditor(column));\n}\n\n/** The raw seed, before the editor's own shape is applied. */\nfunction readSeed<TRow>(row: TRow, column: EditableColumnLike<TRow>): string {\n  if (column.editValue) return column.editValue(row);\n  if (column.sortValue) return stringifyEditSeed(column.sortValue(row));\n  return stringifyEditSeed(getPath(row, column.key));\n}\n\n/** Cut a `YYYY-MM-DDTHH:mm` seed down to what a date or time input holds. */\nfunction trimToEditor(seed: string, editor: CellEditor | null): string {\n  if (editor === \"date\") return seed.slice(0, 10);\n  if (editor === \"time\") {\n    const at = seed.indexOf(\"T\");\n    return at === -1 ? seed.slice(0, 5) : seed.slice(at + 1, at + 6);\n  }\n  return seed;\n}\n\nfunction stringifyEditSeed(value: unknown): string {\n  if (value === null || value === undefined) return \"\";\n  if (\n    typeof value === \"string\" ||\n    typeof value === \"number\" ||\n    typeof value === \"boolean\"\n  ) {\n    return String(value);\n  }\n  // A multi-select's stored value is the array it commits, so it seeds its own\n  // editor without the host writing an `editValue` for the round trip.\n  if (Array.isArray(value)) {\n    return formatMultiDraft(value.map(String));\n  }\n  // A Date seeds the date editors in the shape their inputs hold. Local parts,\n  // not the ISO string: `toISOString` shifts to UTC, which moves the day for\n  // most of the world.\n  if (value instanceof Date && !Number.isNaN(value.getTime())) {\n    return localDateTimeParts(value);\n  }\n  return \"\";\n}\n\n/** `YYYY-MM-DDTHH:mm` in local time — a `datetime` input's own format. */\nfunction localDateTimeParts(value: Date): string {\n  const pad = (n: number) => String(n).padStart(2, \"0\");\n  const date = `${String(value.getFullYear())}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}`;\n  return `${date}T${pad(value.getHours())}:${pad(value.getMinutes())}`;\n}\n\n/**\n * Parse a draft string into the value passed to `onCellEdit`.\n * Number editors yield `number | null` (empty / invalid → `null`);\n * select and text stay strings.\n */\nexport function parseCellEditValue(editor: CellEditor, draft: string): unknown {\n  if (editor === \"number\") return parseNumberDraft(draft);\n  if (editor === \"boolean\") return draft === \"true\";\n  if (typeof editor === \"object\" && editor.type === \"multi-select\") {\n    return parseMultiDraft(draft);\n  }\n  // A date, datetime or time editor commits the string its input holds —\n  // `YYYY-MM-DD`, `YYYY-MM-DDTHH:mm`, `HH:mm`. A `Date` would be worse: it\n  // carries a timezone the reader never chose, and \"the 3rd\" is not an instant.\n  return draft;\n}\n\n/** An empty number field is nothing, not zero. */\nfunction parseNumberDraft(draft: string): number | null {\n  const trimmed = draft.trim();\n  if (trimmed === \"\") return null;\n  const n = Number(trimmed);\n  return Number.isFinite(n) ? n : null;\n}\n\n/**\n * A multi-select's draft is its chosen values joined by the unit separator.\n *\n * A control character rather than a comma: an option's own label may contain\n * one, and a separator that can appear inside a value is not a separator.\n */\nfunction parseMultiDraft(draft: string): string[] {\n  return draft === \"\" ? [] : draft.split(MULTI_SEPARATOR);\n}\n\n/** The separator {@link formatMultiDraft} joins a multi-select's values with. */\nexport const MULTI_SEPARATOR = \"\\u001f\";\n\n/**\n * The draft string for a set of chosen values — the inverse of the parse above.\n *\n * @param values - The chosen values.\n * @returns The draft the editing state holds.\n */\nexport function formatMultiDraft(values: readonly string[]): string {\n  return values.join(MULTI_SEPARATOR);\n}\n\n/**\n * The chosen values inside a multi-select draft.\n *\n * @param draft - The draft the editing state holds.\n * @returns The chosen values, in the order they were joined.\n */\nexport function readMultiDraft(draft: string): string[] {\n  return parseMultiDraft(draft);\n}\n\n/**\n * Find the next (or previous) editable cell in row-major order (wraps).\n * Returns `null` when no other editable cell exists.\n */\nexport function stepEditableCell<TRow>(options: {\n  rows: readonly TRow[];\n  columns: readonly EditableColumnLike<TRow>[];\n  rowKey: (row: TRow) => string;\n  from: CellEditTarget;\n  /** `1` advances (Tab); `-1` goes previous (Shift+Tab). */\n  direction?: 1 | -1;\n}): CellEditTarget | null {\n  const { rows, columns, rowKey, from, direction = 1 } = options;\n  const editableCols = columns.filter(\n    (c) => c.editable !== undefined && c.editable !== false\n  );\n  if (editableCols.length === 0 || rows.length === 0) return null;\n\n  const rowIndex = rows.findIndex((r) => rowKey(r) === from.rowId);\n  const colIndex = editableCols.findIndex((c) => c.key === from.columnKey);\n  if (rowIndex < 0 || colIndex < 0) return null;\n\n  const total = rows.length * editableCols.length;\n  for (let step = 1; step < total; step++) {\n    const flat =\n      (((rowIndex * editableCols.length + colIndex + direction * step) %\n        total) +\n        total) %\n      total;\n    const nextRow = Math.floor(flat / editableCols.length);\n    const nextCol = flat % editableCols.length;\n    const row = rows[nextRow]!;\n    const column = editableCols[nextCol]!;\n    if (isCellEditable(column, row)) {\n      return { rowId: rowKey(row), columnKey: column.key };\n    }\n  }\n  return null;\n}\n\n/** Tab-advance form of {@link stepEditableCell}, fixed to `direction: 1`. */\nexport function nextEditableCell<TRow>(options: {\n  rows: readonly TRow[];\n  columns: readonly EditableColumnLike<TRow>[];\n  rowKey: (row: TRow) => string;\n  from: CellEditTarget;\n}): CellEditTarget | null {\n  return stepEditableCell({ ...options, direction: 1 });\n}\n\n/**\n * The row, the column and the parsed value a commit resolves to.\n *\n * Separate from applying it, because validation has to see the value BEFORE the\n * host does — the whole point of a validator is to stop the call.\n *\n * @typeParam TRow - The row type.\n * @param options - The commit and the page it addresses.\n * @returns The resolved triple, or `null` for a stale commit whose row or\n * column has since left the page.\n */\nexport function resolveCommitValue<TRow>(options: {\n  commit: CellEditCommit;\n  rows: readonly TRow[];\n  columns: readonly EditableColumnLike<TRow>[];\n  rowKey: (row: TRow) => string;\n}): { row: TRow; column: EditableColumnLike<TRow>; value: unknown } | null {\n  const row = options.rows.find(\n    (r) => options.rowKey(r) === options.commit.rowId\n  );\n  const column = options.columns.find(\n    (c) => c.key === options.commit.columnKey\n  );\n  if (!row || !column) return null;\n  const editor = resolveCellEditor(column) ?? \"text\";\n  // A column that states how to read its own drafts owns the conversion; the\n  // editor's built-in parsing is the fallback, not an extra step on top.\n  const value = column.parseValue\n    ? column.parseValue(options.commit.draft, row)\n    : parseCellEditValue(editor, options.commit.draft);\n  return { row, column, value };\n}\n\n/**\n * Apply a commit through the host channel: resolve the row, parse the draft\n * with the column's editor, call `onCellEdit`. Returns `false` when the row\n * or column is missing (stale commit after a filter/page change).\n */\nexport function applyCellEditCommit<TRow>(options: {\n  commit: CellEditCommit;\n  rows: readonly TRow[];\n  columns: readonly EditableColumnLike<TRow>[];\n  rowKey: (row: TRow) => string;\n  onCellEdit: (row: TRow, key: string, nextValue: unknown) => void;\n}): boolean {\n  const resolved = resolveCommitValue(options);\n  if (!resolved) return false;\n  options.onCellEdit(resolved.row, resolved.column.key, resolved.value);\n  return true;\n}\n","/**\n * The fill handle — dragging a selection's corner to carry its values on.\n *\n * The gesture is a spreadsheet's, and so is the behaviour people expect from\n * it: two numbers one apart continue counting, anything else repeats. What it\n * produces is not special, though — the same ordinary cell edits a paste or an\n * inline commit produces, so a host wires nothing extra to receive a fill.\n *\n * Values are read the way the EDITOR reads them (`readEditableCellValue`) and\n * written back through the column's `parseValue`, which makes a fill exactly\n * equivalent to retyping the source cell into each target cell — never a\n * separate notion of what a cell contains.\n */\nimport { isCellEditable, readEditableCellValue } from \"../editing/cellEditing\";\nimport type { ColumnDef } from \"../types\";\nimport type { CellEdit } from \"./cellEdits\";\nimport { type CellRange, cellRangeBounds } from \"./cellRange\";\nimport type { GridCell } from \"./gridFocus\";\n\n/** Which way a fill runs. Fills are one-axis, as in every spreadsheet. */\nexport type FillDirection = \"down\" | \"up\" | \"right\" | \"left\";\n\n/**\n * Which way a drag from the selection's corner to `to` is filling.\n *\n * A pointer wanders, so the axis is decided by the LARGER overflow rather than\n * by whichever edge was crossed first — otherwise a drag two rows down and one\n * column across would fill sideways because of a stray pixel.\n *\n * @param source - The selected rectangle the fill starts from.\n * @param to - The cell the pointer has reached.\n * @returns The direction, or `null` when `to` is still inside the selection.\n */\nexport function fillDirection(\n  source: CellRange,\n  to: GridCell\n): FillDirection | null {\n  const bounds = cellRangeBounds(source);\n  const below = to.row - bounds.toRow;\n  const above = bounds.fromRow - to.row;\n  const after = to.col - bounds.toCol;\n  const before = bounds.fromCol - to.col;\n  const vertical = Math.max(below, above);\n  const horizontal = Math.max(after, before);\n  if (vertical <= 0 && horizontal <= 0) return null;\n  if (vertical >= horizontal) return below > 0 ? \"down\" : \"up\";\n  return after > 0 ? \"right\" : \"left\";\n}\n\n/**\n * The rectangle a fill would cover — the selection plus what the drag reached.\n *\n * This is what gets highlighted while dragging, so the preview and the commit\n * can never disagree about which cells are involved.\n *\n * @param source - The selected rectangle.\n * @param to - The cell the pointer has reached.\n * @returns The union rectangle, or the source itself when nothing is added.\n */\nexport function fillTargetRange(source: CellRange, to: GridCell): CellRange {\n  const bounds = cellRangeBounds(source);\n  const direction = fillDirection(source, to);\n  if (direction === null) return source;\n  const vertical = direction === \"down\" || direction === \"up\";\n  return {\n    anchor: {\n      row: vertical && direction === \"up\" ? to.row : bounds.fromRow,\n      col: !vertical && direction === \"left\" ? to.col : bounds.fromCol,\n    },\n    head: {\n      row: vertical && direction === \"down\" ? to.row : bounds.toRow,\n      col: !vertical && direction === \"right\" ? to.col : bounds.toCol,\n    },\n  };\n}\n\n/** What a fill needs to know to become edits. */\nexport interface FillRangeOptions<TRow> {\n  /** The selected rectangle the values come from. */\n  source: CellRange;\n  /** The cell the drag reached, or the far end of a keyboard fill. */\n  to: GridCell;\n  /** The rows the browser holds, in table order. */\n  rows: readonly TRow[];\n  /** The columns as rendered — a range's column indices address these. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Where the rendered window starts in the dataset. Zero unless paged. */\n  firstRowIndex?: number;\n}\n\n/**\n * Continue a run of values, the way a spreadsheet continues one.\n *\n * Two or more numbers separated by a constant step are a series and count on\n * (1, 2 → 3, 4); everything else repeats in order (Mon, Tue → Mon, Tue). A\n * single number repeats rather than counting, because one value carries no\n * step — guessing `+1` there is the behaviour spreadsheets are cursed for.\n *\n * @param seed - The source values, in fill order.\n * @param step - How far past the seed this value sits, from 1.\n * @returns The value for that position, as the string an editor would hold.\n */\nfunction continueSeries(seed: readonly string[], step: number): string {\n  const delta = arithmeticStep(seed);\n  if (delta === null) return seed[(step - 1) % seed.length] ?? \"\";\n  return String(Number(seed.at(-1)) + delta * step);\n}\n\n/**\n * The constant step of a run of numbers, or `null` when it is not one.\n *\n * @param seed - The source values.\n * @returns The step between consecutive values, or `null`.\n */\nfunction arithmeticStep(seed: readonly string[]): number | null {\n  if (seed.length < 2) return null;\n  const numbers = seed.map((value) =>\n    value.trim() === \"\" ? Number.NaN : Number(value)\n  );\n  if (!numbers.every((value) => Number.isFinite(value))) return null;\n  const step = numbers[1]! - numbers[0]!;\n  const constant = numbers.every((value, i) => {\n    const previous = numbers[i - 1];\n    return previous === undefined || value - previous === step;\n  });\n  return constant ? step : null;\n}\n\n/**\n * A fill in one coordinate system, whichever way it actually runs.\n *\n * Down, up, right and left are one operation seen from four angles, and\n * writing it four times is where the bugs live. So a fill is described as\n * LANES (the rows or columns the fill runs along, side by side) and POSITIONS\n * (how far along each lane), with `at` the only place that knows whether a\n * position is a row or a column.\n */\ninterface FillAxis {\n  /** The perpendicular indices — one seed run and one output run each. */\n  lanes: number[];\n  /** Positions of the source cells, in the order the fill reads them. */\n  seed: number[];\n  /** The position the fill grows from — the selection's leading edge. */\n  edge: number;\n  /** +1 for a fill that runs forwards, -1 for one that runs back. */\n  step: number;\n  /** How many cells past the edge the gesture reached. */\n  distance: number;\n  /** A lane and a position, as a cell address. */\n  at: (lane: number, position: number) => GridCell;\n}\n\n/** Describe the fill in lane/position terms, whichever way it runs. */\nfunction fillAxis(\n  direction: FillDirection,\n  source: CellRange,\n  to: GridCell\n): FillAxis {\n  const b = cellRangeBounds(source);\n  const vertical = direction === \"down\" || direction === \"up\";\n  const forward = direction === \"down\" || direction === \"right\";\n  const step = forward ? 1 : -1;\n  const along = vertical ? span(b.fromRow, b.toRow) : span(b.fromCol, b.toCol);\n  // A backwards fill continues from the near edge, so its seed runs the other\n  // way: \"1, 2\" dragged upwards continues 0, -1 rather than 3, 4.\n  const seed = forward ? along : [...along].reverse();\n  const edgeRow = forward ? b.toRow : b.fromRow;\n  const edgeCol = forward ? b.toCol : b.fromCol;\n  return {\n    lanes: vertical ? span(b.fromCol, b.toCol) : span(b.fromRow, b.toRow),\n    seed,\n    edge: vertical ? edgeRow : edgeCol,\n    step,\n    distance: Math.abs(vertical ? to.row - edgeRow : to.col - edgeCol),\n    at: (lane, position) =>\n      vertical ? { row: position, col: lane } : { row: lane, col: position },\n  };\n}\n\n/**\n * Turn a fill gesture into the edits it implies.\n *\n * Only cells OUTSIDE the selection are written: the source is what is being\n * carried, not something to overwrite with itself. Cells beyond the loaded rows\n * or the rendered columns are dropped rather than invented, and a column that\n * is not editable is skipped.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link FillRangeOptions}.\n * @returns The edits, in reading order.\n */\nexport function fillRangeEdits<TRow>(\n  options: FillRangeOptions<TRow>\n): CellEdit<TRow>[] {\n  const { source, to, rows, columns, firstRowIndex = 0 } = options;\n  const direction = fillDirection(source, to);\n  if (direction === null) return [];\n  const axis = fillAxis(direction, source, to);\n  const edits: CellEdit<TRow>[] = [];\n\n  for (const lane of axis.lanes) {\n    const seed = axis.seed.flatMap((position) =>\n      readCell(axis.at(lane, position), options)\n    );\n    if (seed.length === 0) continue;\n\n    for (let n = 1; n <= axis.distance; n++) {\n      const cell = axis.at(lane, axis.edge + n * axis.step);\n      const row = rows[cell.row - firstRowIndex];\n      const column = columns[cell.col];\n      if (row === undefined || !column || !isCellEditable(column, row)) {\n        continue;\n      }\n      const raw = continueSeries(seed, n);\n      edits.push({\n        row,\n        columnKey: column.key,\n        // The column's own parser, so a fill commits what retyping would.\n        value: column.parseValue ? column.parseValue(raw, row) : raw,\n      });\n    }\n  }\n  return edits;\n}\n\n/**\n * One source cell as the editor would read it, or nothing when the cell is not\n * there — an unloaded row or a column the table does not render.\n */\nfunction readCell<TRow>(\n  cell: GridCell,\n  options: FillRangeOptions<TRow>\n): string[] {\n  const { rows, columns, firstRowIndex = 0 } = options;\n  const row = rows[cell.row - firstRowIndex];\n  const column = columns[cell.col];\n  if (row === undefined || !column) return [];\n  return [readEditableCellValue(row, column)];\n}\n\n/** Inclusive integer span — the indices between two edges. */\nfunction span(from: number, to: number): number[] {\n  return Array.from({ length: to - from + 1 }, (_, i) => from + i);\n}\n","/**\n * Clipboard text, turned into ordinary cell edits.\n *\n * Paste is deliberately NOT its own commit path. It parses what a spreadsheet\n * put on the clipboard, maps it onto the selection, and hands back the same\n * edits an inline edit produces — same `parseValue`, same shape, same host\n * handler. Anything later added to that path (validation, async save states,\n * conflict handling) applies to a paste without paste knowing it exists, which\n * is what stops this becoming a second half-maintained editing route.\n *\n * The parsing follows what Excel, Google Sheets, Numbers and LibreOffice write:\n * tab-separated fields, newline-separated rows, and RFC-4180 quoting when a\n * field carries a tab, a newline or a quote.\n */\nimport { isCellEditable } from \"../editing/cellEditing\";\nimport type { ColumnDef } from \"../types\";\nimport { batchEditHandler, type CellEdit } from \"./cellEdits\";\nimport { type CellRange, cellRangeBounds } from \"./cellRange\";\n\n/**\n * Parse clipboard text into a grid of raw strings.\n *\n * Quoted fields keep their tabs and newlines: a spreadsheet writes `\"a\\tb\"` for\n * a cell containing a tab, and splitting naively would turn one cell into two\n * and shift every column after it.\n *\n * @param text - The clipboard's text.\n * @returns Rows of raw cell strings; empty when there is nothing to paste.\n */\nexport function parseClipboardTable(text: string): string[][] {\n  if (text === \"\") return [];\n  const rows: string[][] = [];\n  let row: string[] = [];\n  let field = \"\";\n  let i = 0;\n\n  while (i < text.length) {\n    const ch = text[i];\n    if (ch === '\"' && field === \"\") {\n      const quoted = readQuotedField(text, i + 1);\n      field = quoted.value;\n      i = quoted.next;\n    } else if (ch === \"\\t\") {\n      row.push(field);\n      field = \"\";\n      i++;\n    } else if (ch === \"\\n\" || ch === \"\\r\") {\n      row.push(field);\n      rows.push(row);\n      row = [];\n      field = \"\";\n      // CRLF is one break, not two: counting it twice pastes a blank row.\n      i += ch === \"\\r\" && text[i + 1] === \"\\n\" ? 2 : 1;\n    } else {\n      field += ch;\n      i++;\n    }\n  }\n  if (field !== \"\" || row.length > 0) {\n    row.push(field);\n    rows.push(row);\n  }\n  return rows;\n}\n\n/**\n * Read one quoted field, starting just past its opening quote.\n *\n * @param text - The whole clipboard text.\n * @param start - Index of the first character inside the quotes.\n * @returns The field's value and the index just past its closing quote.\n */\nfunction readQuotedField(\n  text: string,\n  start: number\n): { value: string; next: number } {\n  let value = \"\";\n  let i = start;\n  while (i < text.length) {\n    if (text[i] !== '\"') {\n      value += text[i];\n      i++;\n    } else if (text[i + 1] === '\"') {\n      // A doubled quote is one literal quote; a lone one closes the field.\n      value += '\"';\n      i += 2;\n    } else return { value, next: i + 1 };\n  }\n  // Unterminated — a truncated clipboard is still worth what it carries.\n  return { value, next: i };\n}\n\n/** What a paste needs to know to become edits. */\nexport interface PasteRangeOptions<TRow> {\n  /** The clipboard's text. */\n  text: string;\n  /** Where the paste starts — its top-left cell is the anchor. */\n  range: CellRange;\n  /** The rows the browser holds, in table order. */\n  rows: readonly TRow[];\n  /** The columns as rendered — a range's column indices address these. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Where the rendered window starts in the dataset. Zero unless paged. */\n  firstRowIndex?: number;\n}\n\n/**\n * Turn clipboard text into the edits it implies, starting at the selection's\n * top-left cell.\n *\n * The clipboard's shape wins over the selection's: pasting a 3×2 block into a\n * single selected cell writes 3×2, which is what every spreadsheet does. Cells\n * falling outside the loaded rows or the rendered columns are dropped rather\n * than invented — a paste must never write into a row the browser has not got.\n *\n * A column that is not editable is skipped: paste is an edit, and an edit into a\n * read-only column is not one.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link PasteRangeOptions}.\n * @returns The edits, in row-major order.\n */\nexport function pasteRangeEdits<TRow>(\n  options: PasteRangeOptions<TRow>\n): CellEdit<TRow>[] {\n  const { text, range, rows, columns, firstRowIndex = 0 } = options;\n  const grid = parseClipboardTable(text);\n  if (grid.length === 0) return [];\n\n  const start = cellRangeBounds(range);\n  const edits: CellEdit<TRow>[] = [];\n\n  grid.forEach((line, r) => {\n    const row = rows[start.fromRow + r - firstRowIndex];\n    if (row === undefined) return;\n    line.forEach((raw, c) => {\n      const column = columns[start.fromCol + c];\n      if (!column || !isCellEditable(column, row)) return;\n      edits.push({\n        row,\n        columnKey: column.key,\n        // The column's own parser, so a paste commits what typing would.\n        value: column.parseValue ? column.parseValue(raw, row) : raw,\n      });\n    });\n  });\n  return edits;\n}\n\n/** The two ways a table can receive a paste. */\nexport interface CellPasteHandlerOptions<TRow> {\n  /** Takes the batch whole — one transaction, one undo entry. */\n  onCellPaste?: (edits: CellEdit<TRow>[]) => void;\n  /** The ordinary inline-edit channel, used one edit at a time. */\n  onCellEdit?: (row: TRow, key: string, nextValue: unknown) => void;\n}\n\n/**\n * Resolve who receives a paste — `onCellPaste`, or `onCellEdit` one cell at a\n * time. See {@link batchEditHandler} for why the default is the edit channel.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link CellPasteHandlerOptions}.\n * @returns The handler, or `undefined` when the table takes no edits at all —\n *   which leaves Ctrl/Cmd+V to the browser.\n */\nexport function cellPasteHandler<TRow>(\n  options: CellPasteHandlerOptions<TRow>\n): ((edits: CellEdit<TRow>[]) => void) | undefined {\n  return batchEditHandler(options.onCellPaste, options.onCellEdit);\n}\n\n/** The two ways a table can receive a fill. */\nexport interface CellFillHandlerOptions<TRow> {\n  /** Takes the batch whole — one transaction, one undo entry. */\n  onCellFill?: (edits: CellEdit<TRow>[]) => void;\n  /** The ordinary inline-edit channel, used one edit at a time. */\n  onCellEdit?: (row: TRow, key: string, nextValue: unknown) => void;\n}\n\n/**\n * Resolve who receives a fill — `onCellFill`, or `onCellEdit` one cell at a\n * time. See {@link batchEditHandler} for why the default is the edit channel.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link CellFillHandlerOptions}.\n * @returns The handler, or `undefined` when the table takes no edits at all —\n *   which is also when the fill handle is not rendered.\n */\nexport function cellFillHandler<TRow>(\n  options: CellFillHandlerOptions<TRow>\n): ((edits: CellEdit<TRow>[]) => void) | undefined {\n  return batchEditHandler(options.onCellFill, options.onCellEdit);\n}\n","/**\n * What the selected cells add up to.\n *\n * Selecting a block of numbers and wanting their sum is the oldest reason\n * anyone selects a block, and a table that can copy a rectangle already knows\n * everything needed to answer it. The values come from the same resolution\n * copy and export use, so the sum shown here and the sum a spreadsheet\n * computes from a paste of the same cells cannot disagree.\n *\n * The count is every selected cell; the arithmetic covers only the numeric\n * ones. A rectangle spanning a name column and a budget column still has a\n * meaningful sum, and refusing to give one because a string is in the way is\n * the behaviour nobody wants.\n */\nimport { buildExportTable } from \"../export/exportWriter\";\nimport type { ColumnDef } from \"../types\";\nimport { type CellRange, cellRangeIndices, cellRangeSize } from \"./cellRange\";\n\n/** The numbers behind a selection. */\nexport interface SelectionStats {\n  /** Every selected cell, numeric or not. */\n  cells: number;\n  /** How many of them held a number. */\n  numeric: number;\n  /** Total of the numeric cells; `null` when there are none. */\n  sum: number | null;\n  /** Mean of the numeric cells; `null` when there are none. */\n  average: number | null;\n  /** Smallest numeric value; `null` when there are none. */\n  min: number | null;\n  /** Largest numeric value; `null` when there are none. */\n  max: number | null;\n}\n\n/** What the statistics need: the rectangle, and the data under it. */\nexport interface SelectionStatsOptions<TRow> {\n  /**\n   * Off unless the host asked for it. Passed rather than checked at the call\n   * site so the two tables that compute this read identically.\n   */\n  enabled?: boolean;\n  /** The selected rectangle, in absolute addresses. */\n  range: CellRange | null;\n  /** The rows the browser holds, in table order. */\n  rows: readonly TRow[];\n  /** The columns as rendered — a range's column indices address these. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Where the rendered window starts in the dataset. Zero unless paged. */\n  firstRowIndex?: number;\n}\n\n/**\n * A value as a number, or `null` when it is not one.\n *\n * Booleans are not numbers here even though JavaScript will happily add them:\n * summing a column of ticks to 3 says something the table was never asked.\n */\nfunction numeric(value: unknown): number | null {\n  if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n  if (typeof value === \"string\" && value.trim() !== \"\") {\n    const parsed = Number(value);\n    return Number.isFinite(parsed) ? parsed : null;\n  }\n  return null;\n}\n\n/**\n * Count, sum, average, min and max over the selected cells.\n *\n * Rows outside what the browser holds are skipped rather than counted as\n * empty: a column selection over 500 loaded rows of 100,000 describes the 500,\n * and inventing the rest would put a wrong total on screen.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link SelectionStatsOptions}.\n * @returns The statistics, or `null` when nothing is selected.\n */\nexport function selectionStats<TRow>(\n  options: SelectionStatsOptions<TRow>\n): SelectionStats | null {\n  const { enabled = true, range, rows, columns, firstRowIndex = 0 } = options;\n  if (!enabled || !range) return null;\n  const indices = cellRangeIndices(range);\n  const cols = indices.cols.flatMap((index) => {\n    const column = columns[index];\n    return column ? [column] : [];\n  });\n  if (cols.length === 0) return null;\n\n  const selected = indices.rows.flatMap((index) => {\n    const row = rows[index - firstRowIndex];\n    return row === undefined ? [] : [row];\n  });\n  const table = buildExportTable(selected, cols);\n\n  const numbers = table.rows.flatMap((row) =>\n    row.flatMap((value) => {\n      const parsed = numeric(value);\n      return parsed === null ? [] : [parsed];\n    })\n  );\n  if (numbers.length === 0) {\n    return {\n      cells: cellRangeSize(range),\n      numeric: 0,\n      sum: null,\n      average: null,\n      min: null,\n      max: null,\n    };\n  }\n  const sum = numbers.reduce((total, value) => total + value, 0);\n  return {\n    cells: cellRangeSize(range),\n    numeric: numbers.length,\n    sum,\n    average: sum / numbers.length,\n    min: Math.min(...numbers),\n    max: Math.max(...numbers),\n  };\n}\n","/**\n * Keyboard navigation over table cells — the stateful half.\n *\n * Opt-in: without `cellNavigation` this hook is never called, and the table\n * renders exactly the markup it always did. With it, the table becomes one tab\n * stop whose interior is reachable by arrow keys, which is the difference\n * between a 10,000-row table being usable from a keyboard and being a trap.\n *\n * Three things here are easy to get wrong and are the reason this lives in core\n * rather than in eight adapters:\n *\n * **The ARIA indices are absolute.** `aria-rowindex` counts within the dataset,\n * not within the rendered window. Virtualization mounts 24 rows out of 100,000,\n * so a naive implementation numbers them 1-24 and every assistive technology\n * reports \"row 3 of 24\" while the user is at row 40,000. `aria-rowcount` and\n * `aria-colcount` carry the totals for the same reason.\n *\n * **A cell the virtualizer has not mounted still has to be reachable.**\n * Ctrl+End on a 100,000-row table asks for a cell that does not exist in the\n * DOM. Moving focus there means scrolling it into existence first, then\n * focusing it once it mounts — which is asynchronous, so the hook holds a\n * pending address and focuses on the render that produces the element.\n *\n * **Focus lives in state, but the DOM has to follow it.** Setting\n * `tabIndex` alone moves nothing; something must call `.focus()`. That happens\n * in an effect keyed on the active address, addressing cells by their\n * `data-grid-cell` attribute so the mechanism does not need a ref per cell —\n * with 100,000 rows, a ref map is a leak with extra steps.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { columnText } from \"../columns/columnText\";\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport type { ColumnDef, Direction, TableLabels } from \"../types\";\nimport type { CellEdit } from \"./cellEdits\";\nimport {\n  type CellRange,\n  cellRangeBounds,\n  cellRangeSize,\n  extendCellRange,\n  isInCellRange,\n  isSingleCell,\n  singleCellRange,\n} from \"./cellRange\";\nimport {\n  clipboardRangeText,\n  readClipboardText,\n  writeClipboardText,\n} from \"./clipboardRange\";\nimport { fillRangeEdits, fillTargetRange } from \"./fillRange\";\nimport {\n  type GridBounds,\n  type GridCell,\n  gridFocusMoveForKey,\n  moveGridFocus,\n  sameGridCell,\n} from \"./gridFocus\";\nimport { pasteRangeEdits } from \"./pasteRange\";\n\n/** The attribute a focusable cell carries, so focus can find it in the DOM. */\nexport const GRID_CELL_ATTR = \"data-grid-cell\";\n\n/** `data-grid-cell` value for one address — `\"row:col\"`, both absolute. */\nexport function gridCellAttr(cell: GridCell): string {\n  return `${cell.row}:${cell.col}`;\n}\n\n/** Options for {@link useGridFocus}. */\nexport interface UseGridFocusOptions<TRow> {\n  /** Off unless the host asked for it; when false the hook does nothing. */\n  enabled: boolean;\n  /**\n   * Offer a checkbox in every column header that selects that column.\n   *\n   * Ctrl/Cmd+click is the gesture for a keyboard and a mouse, and a touch\n   * device has neither — there is no Ctrl key to hold. This is the same\n   * state reached by a control a finger can hit, and the same state a\n   * screen reader can name. Off unless asked for.\n   */\n  headerCheckbox?: boolean;\n  /**\n   * Rows in the whole dataset. This is the ARIA number — `aria-rowcount` — and\n   * deliberately NOT what movement is clamped to; see the note on navigable\n   * bounds below.\n   */\n  rowCount: number;\n  /** Columns in the order they are rendered. */\n  columns: readonly ColumnDef<TRow>[];\n  /** The rendered rows, for reading a cell's text when focus lands. */\n  rows: readonly TRow[];\n  /**\n   * Where the rendered window starts in the dataset. Zero without\n   * virtualization; with it, `rows[i]` is dataset row `firstRowIndex + i`.\n   */\n  firstRowIndex?: number;\n  /** Rows a PageUp/PageDown travels. Defaults to the rendered row count. */\n  pageSize?: number;\n  /** Text direction — flips the left/right arrows. */\n  dir?: Direction;\n  /** Announcement strings; falls back to the built-in English. */\n  labels?: TableLabels;\n  /**\n   * Bring a dataset row into view. Supplied by the virtualizer; without it a\n   * move to an unmounted row cannot be completed and is left alone rather than\n   * silently dropping focus.\n   */\n  scrollToRow?: (rowIndex: number) => void;\n  /** Enter or F2 on a cell — the editing model's entry point. */\n  onActivate?: (cell: GridCell) => void;\n  /**\n   * True for a cell covered by someone else's span. Arrow keys skip it\n   * rather than landing inside a cell that is not in the DOM.\n   */\n  isCoveredCell?: (cell: GridCell) => boolean;\n  /**\n   * Fired whenever the selected range changes, including when it collapses to\n   * a single cell. `null` means nothing is selected.\n   */\n  onRangeChange?: (range: CellRange | null) => void;\n  /**\n   * Ctrl/Cmd+X after the copy succeeded. The table never clears data itself —\n   * what \"cut\" removes is the host's decision, and a cut that emptied cells\n   * before the clipboard accepted them would lose them outright.\n   */\n  onCut?: (range: CellRange) => void;\n  /**\n   * Ctrl/Cmd+V, with the clipboard already parsed into ordinary cell edits.\n   *\n   * Paste is not a second commit path: these are the same edits an inline edit\n   * produces, so validation or async saving added to that path covers a paste\n   * without paste knowing. Applying them stays the host's job — the table never\n   * writes to data it does not own.\n   */\n  onPaste?: (edits: CellEdit<TRow>[]) => void;\n  /**\n   * A fill — the handle dragged from the selection's corner, or Ctrl/Cmd+D —\n   * already turned into ordinary cell edits. Same shape and same contract as\n   * {@link UseGridFocusOptions.onPaste}: the table proposes, the host writes.\n   */\n  onFill?: (edits: CellEdit<TRow>[]) => void;\n  /**\n   * Ctrl/Cmd+Z. Returns how many cells came back, so the grid can say — zero\n   * means the history was empty, which is worth announcing rather than\n   * swallowing.\n   */\n  onUndo?: () => number;\n  /** Ctrl/Cmd+Shift+Z and Ctrl+Y. Returns how many cells were rewritten. */\n  onRedo?: () => number;\n  /** Ctrl/Cmd+F — open the find bar instead of the browser's own. */\n  onFind?: () => void;\n  /**\n   * Cells the find bar matched, keyed `\"row:col\"`. They carry\n   * `data-cell-match`, and the one the walk is on carries\n   * `data-cell-match-current`, so each kit paints the hits its own way.\n   */\n  matchKeys?: ReadonlySet<string>;\n  /** The match the walk is on, for the stronger mark. */\n  currentMatch?: GridCell | null;\n}\n\n/** What {@link useGridFocus} returns. */\nexport interface GridFocusState {\n  /**\n   * Whether cell navigation is on. Consumers render the live region only when\n   * it is: an `aria-live` region that appears at the same moment as its text is\n   * frequently missed by screen readers, so it has to exist beforehand — and\n   * must not exist at all when the feature is off.\n   */\n  enabled: boolean;\n  /** The focused cell, or `null` before the grid has been entered. */\n  active: GridCell | null;\n  /** Props for the grid container: role, dimensions, key handling. */\n  getGridProps: () => Record<string, unknown>;\n  /** Props for one cell — roving `tabIndex`, absolute indices, the hook. */\n  getCellProps: (cell: GridCell) => Record<string, unknown>;\n  /** Props for one row: its absolute `aria-rowindex`. */\n  getRowProps: (rowIndex: number) => Record<string, unknown>;\n  /**\n   * Props for a cell addressed by its position in the RENDERED window — which\n   * is the index an adapter already has, whether it is mapping `source.rows` or\n   * a virtual entry.\n   *\n   * The conversion to an absolute address lives here rather than in eight\n   * adapters, because getting it wrong is invisible: the table looks right and\n   * only a screen reader announces the wrong row.\n   */\n  getCellPropsAt: (windowIndex: number, col: number) => Record<string, unknown>;\n  /** Props for a row addressed by its position in the rendered window. */\n  getRowPropsAt: (windowIndex: number) => Record<string, unknown>;\n  /** Live-region text naming where focus is. Empty until focus moves. */\n  announcement: string;\n  /** The selected rectangle, or `null` when nothing is selected. */\n  range: CellRange | null;\n  /** Select a rectangle programmatically — what a Select-all would call. */\n  selectRange: (range: CellRange | null) => void;\n  /**\n   * Props for a column header that selects its whole column on click, with\n   * Ctrl/Cmd+click extending the current selection instead of replacing it.\n   */\n  getColumnHeaderProps: (\n    col: number,\n    options?: { sortable?: boolean }\n  ) => Record<string, unknown>;\n  /**\n   * Select a whole column by index — the loaded rows of it, since a column of\n   * 100,000 rows cannot be selected while 500 are in hand.\n   */\n  selectColumn: (col: number, extend?: boolean) => void;\n  /**\n   * Whether an adapter should draw the per-column header checkbox: the host\n   * asked for it AND cell navigation is on, resolved here so a header cell\n   * renders on one boolean instead of checking two.\n   */\n  columnCheckbox: boolean;\n  /**\n   * Whether the selection is exactly this column, over every loaded row.\n   *\n   * Exactly — a column inside a wider rectangle reads as unchecked, because a\n   * checkbox that ticks while its neighbours are also selected says the\n   * selection is one column when it is four.\n   */\n  isColumnSelected: (col: number) => boolean;\n  /**\n   * What the header checkbox does: select this column alone, or clear the\n   * selection when it is already the only thing selected.\n   */\n  toggleColumn: (col: number) => void;\n  /** Move focus programmatically — the fill handle and clipboard will need it. */\n  focusCell: (cell: GridCell) => void;\n  /**\n   * The cell carrying the fill handle — the selection's bottom inline-end\n   * corner — or `null` when there is nothing to fill from or no host to\n   * receive it.\n   */\n  fillHandleCell: GridCell | null;\n  /** Props for the adapter-owned fill handle element. */\n  getFillHandleProps: () => Record<string, unknown>;\n  /** The handle's accessible name, already localized. */\n  fillHandleLabel: string;\n  /**\n   * What a fill in progress would cover, for a kit that wants to draw the\n   * preview its own way. `null` unless a fill is being dragged.\n   */\n  fillPreview: CellRange | null;\n  /**\n   * Copy or cut without the keyboard.\n   *\n   * Ctrl+C always has a focused range. A context menu does not — a\n   * right-click on a cell with nothing selected has to copy that cell — so\n   * an explicit cell wins and the selection is the fallback.\n   */\n  copyCells: (cell?: GridCell, cut?: boolean) => void;\n}\n\n/**\n * Keyboard focus over the cell grid.\n *\n * @typeParam TRow - The row type.\n */\nexport function useGridFocus<TRow>(\n  options: UseGridFocusOptions<TRow>\n): GridFocusState {\n  const {\n    enabled,\n    headerCheckbox = false,\n    rowCount,\n    columns,\n    rows,\n    firstRowIndex = 0,\n    pageSize,\n    dir = \"ltr\",\n    labels,\n    scrollToRow,\n    onActivate,\n    onRangeChange,\n    onCut,\n    onPaste,\n    onFill,\n    onUndo,\n    onRedo,\n    onFind,\n    matchKeys,\n    currentMatch,\n    isCoveredCell,\n  } = options;\n\n  const [active, setActive] = useState<GridCell | null>(null);\n  const [range, setRange] = useState<CellRange | null>(null);\n  // A move can outrun the DOM: the target row may not be mounted yet. This\n  // holds the address until a render produces its element.\n  const pending = useRef<GridCell | null>(null);\n  const container = useRef<HTMLElement | null>(null);\n  const [announcement, setAnnouncement] = useState(\"\");\n  // A drag in progress. Held in a ref rather than state because it changes on\n  // every pointer move and must not re-render the grid to be read.\n  const dragging = useRef(false);\n  // A fill drag is a different gesture from a selection drag — it carries the\n  // selection's values rather than growing it — so it has its own flag. Where\n  // it has reached IS state: the preview has to render.\n  const filling = useRef(false);\n  // Where the fill drag has reached, twice over: a ref the release reads\n  // synchronously, and state the preview renders from. The release cannot read\n  // it from state — running the commit inside a state updater would run it\n  // during render, which React rightly warns about and StrictMode runs twice.\n  const fillTo = useRef<GridCell | null>(null);\n  const [fillPreviewTo, setFillPreviewTo] = useState<GridCell | null>(null);\n\n  // Movement is clamped to the LOADED window, not the dataset.\n  //\n  // `aria-rowcount` says 100,000 because that is true and a screen reader needs\n  // it. But Ctrl+End must not move to row 100,000 when only rows 1-25 are\n  // loaded: on a paged table that row is on another page, and on a virtualized\n  // one it may not be fetched. Moving there announces a cell the user cannot see\n  // and strands DOM focus behind — exactly what the Ant Design demo did in a\n  // browser before this existed. Virtualization still reaches every loaded row,\n  // because `scrollToRow` mounts it and the window grows as more arrives.\n  const lastLoadedRow = firstRowIndex + Math.max(0, rows.length - 1);\n  const bounds = useMemo<GridBounds>(\n    () => ({\n      rowCount: lastLoadedRow + 1,\n      colCount: columns.length,\n      pageSize: pageSize ?? Math.max(1, rows.length),\n    }),\n    [lastLoadedRow, columns.length, pageSize, rows.length]\n  );\n\n  /** Say where focus landed: the column, then the cell, then the position. */\n  const announce = useCallback(\n    (cell: GridCell) => {\n      const column = columns[cell.col];\n      if (!column) return;\n      const row = rows[cell.row - firstRowIndex];\n      const header =\n        typeof column.header === \"string\" ? column.header : column.key;\n      const value = row === undefined ? \"\" : columnText(column, row);\n      const position = (labels?.gridCellPosition ?? defaultPosition)(\n        cell.row + 1,\n        rowCount\n      );\n      setAnnouncement(\n        value ? `${header}, ${value}, ${position}` : `${header}, ${position}`\n      );\n    },\n    [columns, rows, firstRowIndex, labels, rowCount]\n  );\n\n  const selectRange = useCallback(\n    (next: CellRange | null) => {\n      setRange(next);\n      onRangeChange?.(next);\n      // Say what was selected, not just where focus is. A single cell says\n      // nothing: its own announcement already names it, and repeating \"1 cell\"\n      // on every arrow press turns navigation into noise.\n      if (!next || isSingleCell(next)) return;\n      const b = cellRangeBounds(next);\n      setAnnouncement(\n        (labels?.gridRangeSelection ?? defaultRangeSelection)({\n          fromRow: b.fromRow + 1,\n          toRow: b.toRow + 1,\n          fromColumn: b.fromCol + 1,\n          toColumn: b.toCol + 1,\n          cells: cellRangeSize(next),\n        })\n      );\n    },\n    [onRangeChange, labels]\n  );\n\n  // What a fill in progress would cover: the selection plus the cells the drag\n  // has reached. Rendering it as selected is the preview — one highlight, one\n  // meaning, and it cannot disagree with what gets written because both come\n  // from the same rectangle.\n  const fillPreview = useMemo(\n    () =>\n      range && fillPreviewTo ? fillTargetRange(range, fillPreviewTo) : null,\n    [range, fillPreviewTo]\n  );\n\n  const commitFill = useEventCallback((to: GridCell) => {\n    if (!range || !onFill) return;\n    const edits = fillRangeEdits({\n      source: range,\n      to,\n      rows,\n      columns,\n      firstRowIndex,\n    });\n    if (edits.length === 0) return;\n    onFill(edits);\n    // The filled rectangle stays selected, as it does in a spreadsheet: the\n    // next fill continues from what was just written.\n    setRange(fillTargetRange(range, to));\n    setAnnouncement(\n      (labels?.gridRangeFilled ?? defaultRangeFilled)(edits.length)\n    );\n  });\n\n  const focusCell = useCallback(\n    (cell: GridCell) => {\n      setActive(cell);\n      pending.current = cell;\n      // Ask the virtualizer for the row before trying to focus it; if it is\n      // already mounted this is a no-op and the effect below focuses at once.\n      scrollToRow?.(cell.row);\n      announce(cell);\n    },\n    [scrollToRow, announce]\n  );\n\n  // Move the DOM to wherever state says focus is. Keyed on the address AND on\n  // the rendered rows, so a cell that arrives from a scroll gets focused on the\n  // render that mounts it rather than being lost.\n  useEffect(() => {\n    if (!enabled) return;\n    const target = pending.current;\n    if (!target || !container.current) return;\n    const element = container.current.querySelector<HTMLElement>(\n      `[${GRID_CELL_ATTR}=\"${gridCellAttr(target)}\"]`\n    );\n    if (!element) return;\n    pending.current = null;\n    element.focus();\n  }, [enabled, active, rows, firstRowIndex]);\n\n  /**\n   * Copy or cut, for a caller that is not the keyboard.\n   *\n   * The key handler always has a focused range to work from. A context\n   * menu does not: a right-click on a cell with nothing selected should\n   * copy THAT cell, so an explicit one wins and the selection is the\n   * fallback rather than the requirement.\n   */\n  const copyCells = useEventCallback((cell?: GridCell, cut?: boolean) => {\n    const selection: CellRange | null = cell\n      ? { anchor: cell, head: cell }\n      : range;\n    if (!selection) return;\n    copySelection(selection, cut === true);\n  });\n\n  /** Ctrl/Cmd+C and Ctrl/Cmd+X — the rectangle, as a spreadsheet reads it. */\n  const copySelection = useEventCallback(\n    (selection: CellRange, cut: boolean) => {\n      const text = clipboardRangeText({\n        range: selection,\n        rows,\n        columns,\n        firstRowIndex,\n      });\n      void writeClipboardText(text).then((ok) => {\n        setAnnouncement(\n          ok\n            ? (labels?.gridRangeCopied ?? defaultRangeCopied)(\n                cellRangeSize(selection)\n              )\n            : (labels?.gridRangeCopyFailed ?? \"Copy failed\")\n        );\n        // A cut only tells the host once the clipboard has the data: clearing\n        // cells the clipboard never took would lose them outright.\n        if (ok && cut) onCut?.(selection);\n      });\n    }\n  );\n\n  /** Ctrl/Cmd+D — the selection's top row carries into the rest of it. */\n  const fillDown = useEventCallback((selection: CellRange) => {\n    const b = cellRangeBounds(selection);\n    const edits = fillRangeEdits({\n      source: {\n        anchor: { row: b.fromRow, col: b.fromCol },\n        head: { row: b.fromRow, col: b.toCol },\n      },\n      to: { row: b.toRow, col: b.toCol },\n      rows,\n      columns,\n      firstRowIndex,\n    });\n    onFill?.(edits);\n    setAnnouncement(\n      (labels?.gridRangeFilled ?? defaultRangeFilled)(edits.length)\n    );\n  });\n\n  /** Ctrl/Cmd+V — the clipboard, mapped onto the selection's top-left cell. */\n  const pasteInto = useEventCallback((target: CellRange) => {\n    void readClipboardText().then((text) => {\n      if (text === null) {\n        setAnnouncement(labels?.gridRangePasteFailed ?? \"Paste failed\");\n        return;\n      }\n      const edits = pasteRangeEdits({\n        text,\n        range: target,\n        rows,\n        columns,\n        firstRowIndex,\n      });\n      onPaste?.(edits);\n      setAnnouncement(\n        (labels?.gridRangePasted ?? defaultRangePasted)(edits.length)\n      );\n    });\n  });\n\n  /**\n   * The Ctrl/Cmd gestures: copy, cut, fill down, paste.\n   *\n   * They live together and run before movement, so a modifier never doubles as\n   * a navigation key. Each stays the BROWSER'S own when the table has nothing\n   * to do with it — no selection, no host handler — which is what `false` says.\n   *\n   * @returns Whether the table took the key.\n   */\n  /** Ctrl/Cmd+Z and its two redo spellings, announced either way. */\n  const handleHistoryKey = useEventCallback(\n    (event: { key: string; shiftKey?: boolean }): boolean => {\n      const redo =\n        (event.key === \"z\" && event.shiftKey === true) || event.key === \"y\";\n      const undo = event.key === \"z\" && event.shiftKey !== true;\n      if (!undo && !redo) return false;\n      const run = redo ? onRedo : onUndo;\n      if (!run) return false;\n      const cells = run();\n      const say = redo\n        ? (labels?.editRedone ?? defaultRedone)\n        : (labels?.editUndone ?? defaultUndone);\n      setAnnouncement(\n        cells === 0\n          ? (labels?.editNothingToUndo ?? \"Nothing to undo\")\n          : say(cells)\n      );\n      return true;\n    }\n  );\n\n  const handleClipboardKey = useEventCallback(\n    (\n      event: {\n        key: string;\n        ctrlKey?: boolean;\n        metaKey?: boolean;\n        shiftKey?: boolean;\n        preventDefault: () => void;\n      },\n      from: GridCell\n    ): boolean => {\n      if (event.ctrlKey !== true && event.metaKey !== true) return false;\n      if (handleHistoryKey(event)) {\n        event.preventDefault();\n        return true;\n      }\n      // Ctrl/Cmd+F belongs to the table only when the table has a find bar to\n      // open; otherwise the browser's own find is the right answer.\n      if (event.key === \"f\" && onFind) {\n        event.preventDefault();\n        onFind();\n        return true;\n      }\n      if ((event.key === \"c\" || event.key === \"x\") && range) {\n        event.preventDefault();\n        copySelection(range, event.key === \"x\");\n        return true;\n      }\n      // Nothing to carry into a one-row selection, so the key stays the\n      // browser's there.\n      if (event.key === \"d\" && onFill && range && !isSingleRowRange(range)) {\n        event.preventDefault();\n        fillDown(range);\n        return true;\n      }\n      // Paste needs a destination, not a rectangle: a spreadsheet pastes into\n      // the focused cell and lets the clipboard's own shape decide the rest, so\n      // this takes the same `from` the movement keys take rather than demanding\n      // a selection first.\n      if (event.key === \"v\" && onPaste) {\n        event.preventDefault();\n        pasteInto(range ?? singleCellRange(from));\n        return true;\n      }\n      return false;\n    }\n  );\n\n  const onKeyDown = useEventCallback(\n    (event: {\n      key: string;\n      ctrlKey?: boolean;\n      metaKey?: boolean;\n      shiftKey?: boolean;\n      preventDefault: () => void;\n    }) => {\n      if (!enabled) return;\n      const from = active ?? { row: firstRowIndex, col: 0 };\n      if (handleClipboardKey(event, from)) return;\n\n      // Enter and F2 belong to whatever is inside the cell — `EditableCellGate`\n      // handles both on the element focus just landed on. This only fires when\n      // a host asked for its own activation, and stays out of the way otherwise\n      // so the two never race for one key press.\n      if (event.key === \"Enter\" || event.key === \"F2\") {\n        if (onActivate) {\n          event.preventDefault();\n          onActivate(from);\n        }\n        return;\n      }\n\n      const move = gridFocusMoveForKey(event, dir);\n      if (!move) return;\n      const moved = moveGridFocus(from, move, bounds, isCoveredCell);\n      // The window may not start at row 0 (page 3 of a paged table) and the\n      // mover clamps at zero, so hold that floor here too.\n      const next = { row: Math.max(moved.row, firstRowIndex), col: moved.col };\n      // An edge move resolves to the same cell: swallow the key so the page\n      // does not scroll, but say nothing — nothing changed.\n      event.preventDefault();\n      if (sameGridCell(next, active)) return;\n\n      // Focus first, then the selection: both write the live region, and for a\n      // Shift move the RANGE is the news while for a plain move the cell is.\n      // Whichever runs last wins, so the order encodes which one matters.\n      focusCell(next);\n      if (event.shiftKey === true) {\n        // Shift extends from wherever the selection began, so pressing\n        // Shift+Down twice then Shift+Up shrinks the range rather than starting\n        // a new one upward. `from` is the fallback anchor for the first press.\n        selectRange(extendCellRange(range, next, from));\n      } else {\n        // A plain move collapses any selection to the cell landed on, which is\n        // what every grid does and what stops a stale rectangle lingering.\n        selectRange(singleCellRange(next));\n      }\n    }\n  );\n\n  // A pointer released outside the table would otherwise leave the drag armed,\n  // so the next hover over any cell would extend a selection nobody started.\n  useEffect(() => {\n    if (!enabled) return undefined;\n    const end = () => {\n      dragging.current = false;\n      if (!filling.current) return;\n      filling.current = false;\n      const to = fillTo.current;\n      fillTo.current = null;\n      setFillPreviewTo(null);\n      // A fill that never left the selection writes nothing, which `commitFill`\n      // decides.\n      if (to) commitFill(to);\n    };\n    window.addEventListener(\"mouseup\", end);\n    return () => window.removeEventListener(\"mouseup\", end);\n  }, [enabled, commitFill]);\n\n  const getGridProps = useCallback(() => {\n    if (!enabled) return {};\n    return {\n      role: \"grid\",\n      \"aria-rowcount\": rowCount,\n      \"aria-colcount\": columns.length,\n      onKeyDown,\n      ref: (node: HTMLElement | null) => {\n        container.current = node;\n      },\n    };\n  }, [enabled, rowCount, columns.length, onKeyDown]);\n\n  const getCellProps = useCallback(\n    (cell: GridCell) => {\n      if (!enabled) return {};\n      const isActive = sameGridCell(cell, active);\n      // Exactly one cell is tabbable. Before the grid has ever been entered\n      // that is its first cell, so Tab reaches the table at all.\n      const firstEver =\n        active === null && cell.row === firstRowIndex && cell.col === 0;\n      // While a fill is being dragged the highlight shows what it would write.\n      const selected = isInCellRange(fillPreview ?? range, cell);\n      const key = gridCellAttr(cell);\n      const matched = matchKeys?.has(key) === true;\n      return {\n        [GRID_CELL_ATTR]: gridCellAttr(cell),\n        tabIndex: isActive || firstEver ? 0 : -1,\n        \"aria-colindex\": cell.col + 1,\n        // Only meaningful once a real rectangle exists: marking every focused\n        // cell as selected would tell a screen reader the table is in selection\n        // mode when the user has merely arrowed around.\n        \"aria-selected\": range && !isSingleCell(range) ? selected : undefined,\n        \"data-cell-selected\": selected ? \"\" : undefined,\n        \"data-cell-match\": matched ? \"\" : undefined,\n        \"data-cell-match-current\":\n          matched && sameGridCell(cell, currentMatch ?? null) ? \"\" : undefined,\n        onMouseDown: (event: { shiftKey?: boolean }) => {\n          if (event.shiftKey === true) {\n            selectRange(extendCellRange(range, cell, active ?? cell));\n          } else {\n            // A press with no modifier starts a drag AND collapses to this\n            // cell: dragging away extends from here, releasing without moving\n            // leaves the single-cell selection a plain click should give.\n            dragging.current = true;\n            selectRange(singleCellRange(cell));\n          }\n        },\n        onMouseEnter: () => {\n          // Extending on ENTER rather than on move means one update per cell\n          // crossed instead of one per pixel.\n          if (filling.current) {\n            fillTo.current = cell;\n            setFillPreviewTo(cell);\n            return;\n          }\n          if (!dragging.current) return;\n          selectRange(extendCellRange(range, cell, active ?? cell));\n        },\n        onMouseUp: () => {\n          dragging.current = false;\n        },\n        onFocus: () => {\n          // A mouse click or a screen reader can move focus without a key\n          // press; keep state in step rather than fighting it.\n          if (!sameGridCell(cell, active)) setActive(cell);\n        },\n      };\n    },\n    [\n      enabled,\n      active,\n      firstRowIndex,\n      range,\n      fillPreview,\n      matchKeys,\n      currentMatch,\n      selectRange,\n    ]\n  );\n\n  /**\n   * Select an entire column — what a header click and Ctrl/Cmd+click do.\n   *\n   * The rectangle spans the LOADED rows, the same bound movement obeys: a column\n   * of 100,000 rows cannot be selected when only 500 are in hand, and claiming\n   * otherwise would export or copy rows the browser has never seen.\n   */\n  const selectColumn = useCallback(\n    (col: number, extend = false) => {\n      const top = { row: firstRowIndex, col };\n      const bottom = { row: lastLoadedRow, col };\n      selectRange(\n        extend && range\n          ? extendCellRange(range, bottom, range.anchor)\n          : { anchor: top, head: bottom }\n      );\n      focusCell(top);\n    },\n    [firstRowIndex, lastLoadedRow, range, selectRange, focusCell]\n  );\n\n  /**\n   * Whether the selection is exactly this column.\n   *\n   * Both bounds are checked, not just the columns: a rectangle three rows tall\n   * inside one column is not that column selected, and a checkbox claiming it\n   * is would be wrong in the direction that matters — the reader would think a\n   * copy or an export covers rows it does not.\n   */\n  const isColumnSelected = useCallback(\n    (col: number) => {\n      if (!enabled || !range) return false;\n      const bounds = cellRangeBounds(range);\n      return (\n        bounds.fromCol === col &&\n        bounds.toCol === col &&\n        bounds.fromRow === firstRowIndex &&\n        bounds.toRow === lastLoadedRow\n      );\n    },\n    [enabled, range, firstRowIndex, lastLoadedRow]\n  );\n\n  /**\n   * What the header checkbox does.\n   *\n   * Ticking selects the column alone — the same rectangle a plain click makes.\n   * Unticking clears, because nothing selected is the only state one checkbox\n   * can return to: a rectangle cannot lose a column out of its middle.\n   */\n  const toggleColumn = useCallback(\n    (col: number) => {\n      if (isColumnSelected(col)) {\n        selectRange(null);\n        return;\n      }\n      selectColumn(col);\n    },\n    [isColumnSelected, selectRange, selectColumn]\n  );\n\n  /** Props for a column header that selects its column when clicked. */\n  const getColumnHeaderProps = useCallback(\n    (col: number, options?: { sortable?: boolean }) => {\n      if (!enabled) return {};\n      return {\n        onClick: (event: { ctrlKey?: boolean; metaKey?: boolean }) => {\n          const modified = event.ctrlKey === true || event.metaKey === true;\n          // A sortable header's plain click already sorts, and the two cannot\n          // share it without one breaking. Ctrl/Cmd+click selects anywhere; a\n          // plain click selects only where nothing else claims it.\n          if (!modified && options?.sortable === true) return;\n          selectColumn(col, modified);\n        },\n      };\n    },\n    [enabled, selectColumn]\n  );\n\n  // The handle sits on the selection's bottom inline-end corner — the last row\n  // and last column of the rectangle. Only when a host can receive a fill:\n  // an affordance for a gesture nothing listens to is a lie.\n  const fillHandleCell = useMemo(() => {\n    if (!enabled || !range || !onFill) return null;\n    const b = cellRangeBounds(range);\n    return { row: b.toRow, col: b.toCol };\n  }, [enabled, range, onFill]);\n\n  const getFillHandleProps = useCallback(\n    () => ({\n      onMouseDown: (event: {\n        preventDefault: () => void;\n        stopPropagation: () => void;\n      }) => {\n        // Stop the cell's own press: that one collapses the selection to a\n        // single cell, which is the opposite of what a fill starts from.\n        event.preventDefault();\n        event.stopPropagation();\n        filling.current = true;\n      },\n    }),\n    []\n  );\n\n  const getRowProps = useCallback(\n    (rowIndex: number) => (enabled ? { \"aria-rowindex\": rowIndex + 1 } : {}),\n    [enabled]\n  );\n\n  const getCellPropsAt = useCallback(\n    (windowIndex: number, col: number) =>\n      getCellProps({ row: firstRowIndex + windowIndex, col }),\n    [getCellProps, firstRowIndex]\n  );\n\n  const getRowPropsAt = useCallback(\n    (windowIndex: number) => getRowProps(firstRowIndex + windowIndex),\n    [getRowProps, firstRowIndex]\n  );\n\n  // Memoized as a whole. A fresh object each render is not a cosmetic problem:\n  // an adapter that memoizes on this state — antd derives its `components.table`\n  // from it — would rebuild that derivation every render, remount the table, and\n  // destroy the focus this hook just placed. Found exactly that way in a browser.\n  return useMemo(\n    () => ({\n      enabled,\n      active: enabled ? active : null,\n      getGridProps,\n      getCellProps,\n      getRowProps,\n      getCellPropsAt,\n      getRowPropsAt,\n      announcement: enabled ? announcement : \"\",\n      range: enabled ? range : null,\n      selectRange,\n      selectColumn,\n      columnCheckbox: enabled && headerCheckbox,\n      isColumnSelected,\n      toggleColumn,\n      getColumnHeaderProps,\n      focusCell,\n      fillHandleCell,\n      getFillHandleProps,\n      fillHandleLabel: labels?.gridFillHandle ?? \"Fill from selection\",\n      fillPreview: enabled ? fillPreview : null,\n      copyCells,\n    }),\n    [\n      enabled,\n      active,\n      getGridProps,\n      getCellProps,\n      getRowProps,\n      getCellPropsAt,\n      getRowPropsAt,\n      announcement,\n      range,\n      selectRange,\n      selectColumn,\n      headerCheckbox,\n      isColumnSelected,\n      toggleColumn,\n      getColumnHeaderProps,\n      focusCell,\n      fillHandleCell,\n      getFillHandleProps,\n      labels,\n      fillPreview,\n      copyCells,\n    ]\n  );\n}\n\n/** \"selected rows 3 to 7, columns 2 to 4, 15 cells\" — replaceable via labels. */\nfunction defaultRangeSelection({\n  fromRow,\n  toRow,\n  fromColumn,\n  toColumn,\n  cells,\n}: {\n  fromRow: number;\n  toRow: number;\n  fromColumn: number;\n  toColumn: number;\n  cells: number;\n}): string {\n  return `selected rows ${fromRow} to ${toRow}, columns ${fromColumn} to ${toColumn}, ${cells} cells`;\n}\n\n/** Whether a rectangle is one row tall — there is nothing to fill down into. */\nfunction isSingleRowRange(range: CellRange): boolean {\n  const bounds = cellRangeBounds(range);\n  return bounds.fromRow === bounds.toRow;\n}\n\n/** \"12 cells restored\" — replaceable through `labels.editUndone`. */\nfunction defaultUndone(cells: number): string {\n  return `${cells} ${cells === 1 ? \"cell\" : \"cells\"} restored`;\n}\n\n/** \"12 cells redone\" — replaceable through `labels.editRedone`. */\nfunction defaultRedone(cells: number): string {\n  return `${cells} ${cells === 1 ? \"cell\" : \"cells\"} redone`;\n}\n\n/** \"12 cells copied\" — replaceable through `labels.gridRangeCopied`. */\nfunction defaultRangeCopied(cells: number): string {\n  return `${cells} ${cells === 1 ? \"cell\" : \"cells\"} copied`;\n}\n\n/** \"12 cells filled\" — replaceable through `labels.gridRangeFilled`. */\nfunction defaultRangeFilled(cells: number): string {\n  return `${cells} ${cells === 1 ? \"cell\" : \"cells\"} filled`;\n}\n\n/** \"12 cells pasted\" — replaceable through `labels.gridRangePasted`. */\nfunction defaultRangePasted(cells: number): string {\n  return `${cells} ${cells === 1 ? \"cell\" : \"cells\"} pasted`;\n}\n\n/** \"row 41 of 10,000\" — replaceable through `labels.gridCellPosition`. */\nfunction defaultPosition(row: number, total: number): string {\n  return `row ${row} of ${total}`;\n}\n","/**\n * Fullscreen, and the thing that breaks when you add it.\n *\n * The Fullscreen API promotes one element and hides everything else in the\n * document. That is exactly what a table wants — and it is why every\n * overlay the table owns stops working the moment it is used, because a\n * menu, a popover or a dialog is portalled to `document.body`, and\n * `document.body` is now one of the things being hidden. The overlay is\n * still in the DOM, still focused, still announced, and completely\n * invisible.\n *\n * There is no way to fix that from inside the overlay. The only fix is for\n * the portal to land INSIDE the promoted element, so this hook's real job\n * is not toggling fullscreen — it is telling every kit where to portal\n * while fullscreen is on. `container` is that answer: the fullscreen\n * element, or `undefined` for \"wherever you normally would\".\n *\n * The state is read from the document rather than remembered, because\n * fullscreen can end without going through this hook at all: Escape, the\n * browser's own control, another element being promoted. A remembered flag\n * would say \"on\" while the page had already left.\n */\nimport { useCallback, useEffect, useState } from \"react\";\n\n/** What {@link useFullscreen} returns. */\nexport interface FullscreenState {\n  /** Whether the table is the fullscreen element right now. */\n  active: boolean;\n  /** Whether the browser will allow it at all. */\n  supported: boolean;\n  /** Go fullscreen, or leave. */\n  toggle: () => void;\n  /** Leave, if it is on. */\n  exit: () => void;\n  /**\n   * Where overlays must portal while fullscreen is on, and `undefined`\n   * otherwise. Hand this to each kit's portal target — Mantine's\n   * `portalProps`, MUI's `container`, antd's `getPopupContainer` — or the\n   * kit's menus will render into a document nobody can see.\n   */\n  container: HTMLElement | undefined;\n}\n\n/** Whether this document can do fullscreen at all. */\nfunction canFullscreen(): boolean {\n  return typeof document !== \"undefined\" && document.fullscreenEnabled;\n}\n\n/**\n * Promote a table to fullscreen, and say where overlays should go.\n *\n * @param element - The table's root. Nothing happens without one.\n * @returns The state, the toggle, and the portal container.\n */\nexport function useFullscreen(element: HTMLElement | null): FullscreenState {\n  const [active, setActive] = useState(false);\n  const supported = canFullscreen();\n\n  useEffect(() => {\n    if (!supported) return;\n    // The document is the source of truth. Escape and the browser's own\n    // control both leave fullscreen without telling this hook, and a\n    // remembered flag would go on claiming the table was promoted.\n    const sync = () => {\n      setActive(element !== null && document.fullscreenElement === element);\n    };\n    sync();\n    document.addEventListener(\"fullscreenchange\", sync);\n    return () => {\n      document.removeEventListener(\"fullscreenchange\", sync);\n    };\n  }, [element, supported]);\n\n  const exit = useCallback(() => {\n    if (document.fullscreenElement) void document.exitFullscreen();\n  }, []);\n\n  const toggle = useCallback(() => {\n    if (!supported || !element) return;\n    if (document.fullscreenElement === element) {\n      void document.exitFullscreen();\n      return;\n    }\n    // A rejection here is ordinary: a browser refuses fullscreen that was\n    // not asked for by a real gesture, and that is not an error worth\n    // throwing at the host.\n    void element.requestFullscreen().catch(() => undefined);\n  }, [element, supported]);\n\n  return {\n    active,\n    supported,\n    toggle,\n    exit,\n    container: active && element ? element : undefined,\n  };\n}\n","import { useCallback, useSyncExternalStore } from \"react\";\n\n/**\n * One `MediaQueryList` per (matchMedia implementation, query) pair.\n * `getSnapshot` runs on EVERY render of every subscriber, and\n * `matchMedia(query)` constructs a fresh list each call — caching turns\n * that hot path into a map lookup. Keyed by the implementation (WeakMap)\n * so tests that stub `matchMedia` never read a stale cache.\n */\nconst mqlCacheByImpl = new WeakMap<\n  typeof globalThis.matchMedia,\n  Map<string, MediaQueryList>\n>();\n\nfunction cachedMatchMedia(query: string): MediaQueryList | null {\n  const impl = globalThis.matchMedia as\n    | typeof globalThis.matchMedia\n    | undefined;\n  if (typeof impl !== \"function\") return null;\n  let cache = mqlCacheByImpl.get(impl);\n  if (!cache) {\n    cache = new Map();\n    mqlCacheByImpl.set(impl, cache);\n  }\n  let mql = cache.get(query);\n  if (!mql) {\n    mql = impl(query);\n    cache.set(query, mql);\n  }\n  return mql;\n}\n\n/**\n * SSR-safe `matchMedia` hook built on `useSyncExternalStore`. Returns\n * `false` on the server and before hydration, then the live match.\n *\n * @param query - A CSS media query string, e.g. `\"(max-width: 768px)\"`.\n * @param defaultValue - Value used when `matchMedia` is unavailable (SSR).\n * @returns Whether the query currently matches.\n */\nexport function useMediaQuery(query: string, defaultValue = false): boolean {\n  const subscribe = useCallback(\n    (onChange: () => void) => {\n      const mql = cachedMatchMedia(query);\n      if (!mql) return () => undefined;\n      mql.addEventListener(\"change\", onChange);\n      return () => mql.removeEventListener(\"change\", onChange);\n    },\n    [query]\n  );\n\n  const getSnapshot = useCallback(() => {\n    const mql = cachedMatchMedia(query);\n    return mql ? mql.matches : defaultValue;\n  }, [query, defaultValue]);\n\n  const getServerSnapshot = useCallback(() => defaultValue, [defaultValue]);\n\n  return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","import { useMediaQuery } from \"./useMediaQuery\";\n\n/** The media query that matches when the user prefers reduced motion. */\nexport const REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/**\n * Whether the user has requested reduced motion. Animation hooks gate on\n * this so AdaptTable never animates against an accessibility preference.\n *\n * @returns `true` when the user prefers reduced motion.\n */\nexport function usePrefersReducedMotion(): boolean {\n  return useMediaQuery(REDUCED_MOTION_QUERY);\n}\n","/**\n * Produce a deterministic string from any JSON-serialisable value so it\n * can be embedded in a query cache key (e.g. TanStack Query) without\n * changing identity on every render.\n *\n * Guarantees:\n * - Object keys are sorted, so `{ a, b }` and `{ b, a }` serialise\n *   identically.\n * - Nested objects are normalised recursively.\n * - Array order is preserved (order is meaningful for lists).\n * - `undefined` values are dropped, mirroring how query strings and\n *   `JSON.stringify` already treat them.\n *\n * @param input - Any value. Functions/symbols are not supported and will\n *   serialise the way `JSON.stringify` handles them.\n * @returns A stable JSON string for the normalised input.\n *\n * @example\n * ```ts\n * stableKey({ b: 1, a: 2 }) === stableKey({ a: 2, b: 1 }); // true\n * ```\n */\nexport function stableKey(input: unknown): string {\n  return JSON.stringify(normalize(input));\n}\n\nfunction normalize(value: unknown): unknown {\n  if (value === null || typeof value !== \"object\") {\n    return value === undefined ? undefined : value;\n  }\n\n  if (Array.isArray(value)) {\n    return value.map((entry) => normalize(entry));\n  }\n\n  const source = value as Record<string, unknown>;\n  // Locale-pinned sort keeps the key identical across user locales while\n  // staying lexicographic on UTF-16 code units.\n  const keys = Object.keys(source).sort((a, b) => a.localeCompare(b, \"en\"));\n  const out: Record<string, unknown> = {};\n  for (const key of keys) {\n    const normalized = normalize(source[key]);\n    if (normalized !== undefined) {\n      out[key] = normalized;\n    }\n  }\n  return out;\n}\n","/**\n * Package-local defaults. Adapters may override per-table via props; these\n * are the headless fallbacks.\n */\n\n/** Viewport width (px) below which `\"auto\"` pagination flips to infinite. */\nexport const MOBILE_BREAKPOINT_PX = 768;\n\n/** Default rows-per-page. */\nexport const DEFAULT_LIMIT = 25;\n\n/** Page-size options offered by adapter pagination controls. */\nexport const PAGE_SIZE_OPTIONS = [10, 25, 50, 100] as const;\n\n/**\n * Page-size options to render in a rows-per-page selector, guaranteeing every\n * given size is present. Pass the active `limit` alone, or `[limit,\n * defaultLimit]` so a host default (scale's 500, a shared-URL 15) stays\n * listed after the user picks 10 / 25 / 50 / 100 — otherwise it vanishes\n * and cannot be selected again.\n *\n * Off-list values are prepended in the order given, de-duplicated.\n *\n * @param limit - The currently-active page size, or several sizes that must\n *   stay listed (active + the table's default page size).\n * @param sizes - The standard options to offer (defaults to {@link PAGE_SIZE_OPTIONS}).\n * @returns The options to render, with every given size guaranteed present.\n */\nexport function pageSizeOptions(\n  limit: number | readonly number[],\n  sizes: readonly number[] = PAGE_SIZE_OPTIONS\n): readonly number[] {\n  const extras = (typeof limit === \"number\" ? [limit] : limit).filter(\n    (n, i, all) => !sizes.includes(n) && all.indexOf(n) === i\n  );\n  return extras.length > 0 ? [...extras, ...sizes] : sizes;\n}\n\n/** Default debounce (ms) for the search input before it commits to state. */\nexport const SEARCH_DEBOUNCE_MS = 300;\n\n/** Default row-height estimate (px) for virtualized desktop tables. */\nexport const DEFAULT_ROW_SIZE_PX = 56;\n\n/** Default card-height estimate (px) for virtualized mobile layouts. */\nexport const DEFAULT_CARD_SIZE_PX = 132;\n\n/** Default extra rows/cards rendered above and below the virtual window. */\nexport const VIRTUAL_OVERSCAN = 8;\n","import { MOBILE_BREAKPOINT_PX } from \"../constants\";\nimport type { PaginationMode, ResolvedPaginationMode } from \"../types\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\n/** The media query that matches the mobile layout at the default width. */\nexport const MOBILE_MEDIA_QUERY = `(max-width: ${MOBILE_BREAKPOINT_PX}px)`;\n\n/**\n * The media query for a given mobile breakpoint.\n *\n * @param px - The width at or below which the card layout takes over.\n * @returns The query string.\n */\nexport function mobileMediaQuery(px: number): string {\n  return px === MOBILE_BREAKPOINT_PX\n    ? MOBILE_MEDIA_QUERY\n    : `(max-width: ${String(px)}px)`;\n}\n\n/**\n * Whether the viewport is at or below the mobile breakpoint.\n *\n * The default is 768px — a phone in portrait. Raise it when the table lives\n * in a sidebar or a split pane, where the viewport says \"desktop\" but the\n * table has a phone's width to work with; lower it when the table is the\n * whole page and the columns are narrow enough to survive.\n *\n * @param px - The breakpoint in pixels. Defaults to 768.\n * @returns `true` on viewports at or below it.\n */\nexport function useIsMobile(px: number = MOBILE_BREAKPOINT_PX): boolean {\n  return useMediaQuery(mobileMediaQuery(px));\n}\n\n/**\n * Resolve `\"auto\"` to a concrete pagination mode (mobile → infinite,\n * desktop → paged). A non-auto mode is returned unchanged.\n *\n * @param mode - The requested pagination mode.\n * @param isMobile - Whether the table is in its mobile layout.\n * @returns The resolved mode.\n */\nexport function resolvePaginationMode(\n  mode: PaginationMode,\n  isMobile: boolean\n): ResolvedPaginationMode {\n  if (mode !== \"auto\") return mode;\n  return isMobile ? \"infinite\" : \"paged\";\n}\n","import { useCallback, useEffect, useMemo, useSyncExternalStore } from \"react\";\n\nimport { DEFAULT_LIMIT } from \"../constants\";\nimport type { QueryFilterGroup } from \"../source/queryContract\";\nimport type { TableStateMutators } from \"../tableStateMutators\";\nimport type {\n  ExtraFilters,\n  FilterValue,\n  SortDirection,\n  TableQueryParams,\n} from \"../types\";\nimport { devWarn } from \"../utils/devWarn\";\nimport { type UrlStateAdapter, useResolvedAdapter } from \"./adapter\";\nimport {\n  FILTER_PREFIX,\n  isEmptyFilterValue,\n  MAX_LIMIT,\n  PARAM_GROUP_BY,\n  PARAM_LIMIT,\n  PARAM_PAGE,\n  PARAM_SEARCH,\n  PARAM_SORT_BY,\n  PARAM_SORT_DIR,\n  readExtra,\n  readFilterTreeParam,\n  readLimit,\n  readPage,\n  readSortDir,\n  readSortLevels,\n  writeExtra,\n  writeFilterTreeParam,\n  writeSortLevels,\n} from \"./serialize\";\n\n/** Options for {@link useTableUrlState}. */\nexport interface UseTableUrlStateOptions {\n  /**\n   * URL-state backend. Defaults to the browser History API. Supply a\n   * router-specific adapter (react-router / Next.js) to integrate with an\n   * existing navigation stack.\n   */\n  urlAdapter?: UrlStateAdapter;\n  /**\n   * When `false`, state is kept in a component-local memory store instead\n   * of the URL — the table still works fully, it just isn't shareable.\n   * Defaults to `true`.\n   */\n  urlSync?: boolean;\n  /** Initial values applied when the URL has no value for a key. */\n  defaults?: Partial<TableQueryParams> & { extra?: ExtraFilters };\n  /** Extra-filter keys whose values are parsed as numbers. */\n  numberExtraKeys?: readonly string[];\n  /** Extra-filter keys whose values are comma-separated arrays. */\n  arrayExtraKeys?: readonly string[];\n  /**\n   * Namespace for this table's URL params, so multiple tables can share one\n   * URL without colliding. With `urlKey=\"left\"` the params become\n   * `left.q`, `left.page`, `left.f_status`, … Omit for the bare keys.\n   */\n  urlKey?: string;\n}\n\n/** State + setters returned by {@link useTableUrlState}. */\nexport interface UseTableUrlStateResult extends TableStateMutators {\n  /** Current 1-based page. */\n  page: number;\n  /** Current page size. */\n  limit: number;\n  /**\n   * Page size applied when the URL has no `limit` param (`defaults.limit`,\n   * or 25). Stable across `setLimit` so the rows-per-page list can keep it.\n   */\n  defaultLimit: number;\n  /** Current committed search term. */\n  search: string;\n  /** Active sort column key, if any. */\n  sortBy: string | undefined;\n  /** Active sort direction, if any. */\n  sortDir: SortDirection | undefined;\n  /** Active single-level row-grouping column key, if any. */\n  groupBy: string | undefined;\n  /** The extra-filter bag. */\n  extra: ExtraFilters;\n  /** Nested AND/OR filter tree, when one is in the URL. */\n  filterTree: QueryFilterGroup | undefined;\n}\n\n/** Mounted namespaces per adapter, for the duplicate-urlKey dev warning. */\nconst nsRegistry = new WeakMap<UrlStateAdapter, Map<string, number>>();\n\n/**\n * Stable default for the key registries. Destructuring defaults (`= []`)\n * would mint a fresh array per render, invalidating the `extra` memo and\n * re-running the host's whole filter/sort pipeline on EVERY re-render.\n */\nconst NO_KEYS: readonly string[] = [];\n\n/**\n * Headless URL-synced table state. Keeps page / limit / search / sort and\n * an arbitrary `extra` filter bag in the query string (or a local store\n * when disabled), so reloads, shared links, and back/forward all restore\n * the exact slice. Decoupled from any router via {@link UrlStateAdapter}.\n *\n * `defaults` apply only while the URL is silent about a key. When the user\n * explicitly clears a defaulted value (clearing the search, removing a\n * filter chip, clear-all), the hook records the clearing as an EMPTY-valued\n * param (`q=`, `sortBy=`, `f_status=`) so the default does not instantly\n * resurrect. Without a default for the key the param is simply deleted, so\n * URLs stay clean in the common case.\n *\n * @param options - See {@link UseTableUrlStateOptions}.\n * @returns The current state and its setters.\n */\nexport function useTableUrlState(\n  options: UseTableUrlStateOptions = {}\n): UseTableUrlStateResult {\n  const {\n    urlAdapter,\n    urlSync,\n    defaults = {},\n    numberExtraKeys = NO_KEYS,\n    arrayExtraKeys = NO_KEYS,\n    urlKey,\n  } = options;\n  // Per-table namespace, e.g. \"left.\" → left.q / left.page / left.f_status.\n  const ns = urlKey ? `${urlKey}.` : \"\";\n\n  const backend = urlAdapter;\n  const syncToUrl = urlSync ?? true;\n  const resolved = useResolvedAdapter(backend, syncToUrl);\n  // Server snapshot: with the default (history) adapter the server rendered\n  // from an empty memory store, so hydration must read \"\" too — the real URL\n  // applies right after hydration. An EXPLICIT adapter is assumed to be\n  // SSR-consistent (e.g. a router adapter that knows the request URL).\n  const search = useSyncExternalStore(\n    (onChange) => resolved.subscribe(onChange),\n    () => resolved.getSearch(),\n    () => (backend ? backend.getSearch() : \"\")\n  );\n  const params = useMemo(() => new URLSearchParams(search), [search]);\n\n  // Two tables on one adapter without distinct urlKeys silently clobber each\n  // other's params — catch it in development.\n  useEffect(() => {\n    const counts = nsRegistry.get(resolved) ?? new Map<string, number>();\n    nsRegistry.set(resolved, counts);\n    const next = (counts.get(ns) ?? 0) + 1;\n    counts.set(ns, next);\n    if (next > 1) {\n      devWarn(\n        `two tables share the URL namespace \"${ns || \"(bare)\"}\" — give each table a distinct \\`urlKey\\` or their state will clobber each other.`\n      );\n    }\n    return () => {\n      // The registration above guarantees an entry; drop it at zero so the\n      // registry never grows.\n      const remaining = counts.get(ns)! - 1;\n      if (remaining === 0) counts.delete(ns);\n      else counts.set(ns, remaining);\n    };\n  }, [resolved, ns]);\n\n  const initialLimit = defaults.limit ?? DEFAULT_LIMIT;\n  const initialPage = defaults.page ?? 1;\n  const page = readPage(params, initialPage, ns);\n  const limit = readLimit(params, initialLimit, ns);\n  // An empty-valued param is an explicit \"cleared\" marker (see the hook\n  // docs): the URL overrides the default with nothing.\n  const searchTerm = (\n    params.get(ns + PARAM_SEARCH) ??\n    defaults.search ??\n    \"\"\n  ).trim();\n  const sortByRaw = params.get(ns + PARAM_SORT_BY);\n  const sortBy = sortByRaw === null ? defaults.sortBy : sortByRaw || undefined;\n  // A defaulted sort adopts the defaulted direction — else ascending, so\n  // `defaults: { sortBy }` alone still yields a real sort (data actually\n  // ordered, aria-sort truthful, first header click cycles to descending\n  // instead of clearing). An explicit URL sort with no direction falls\n  // back to ascending too.\n  const sortDirFallback =\n    sortByRaw === null ? (defaults.sortDir ?? \"asc\") : \"asc\";\n  const sortDir =\n    sortBy === undefined\n      ? undefined\n      : (readSortDir(params, ns) ?? sortDirFallback);\n  const groupByRaw = params.get(ns + PARAM_GROUP_BY);\n  const groupBy =\n    groupByRaw === null ? defaults.groupBy : groupByRaw || undefined;\n  const sortLevels = useMemo(() => readSortLevels(params, ns), [params, ns]);\n\n  /** Merge `defaults.extra` under the URL bag, honouring cleared markers. */\n  const mergeDefaultExtra = useCallback(\n    (p: URLSearchParams, urlBag: ExtraFilters): ExtraFilters => {\n      if (!defaults.extra) return urlBag;\n      const out: ExtraFilters = {};\n      for (const [key, value] of Object.entries(defaults.extra)) {\n        // A present-but-empty param means the user cleared this default.\n        if (p.get(ns + FILTER_PREFIX + key) === null) out[key] = value;\n      }\n      return { ...out, ...urlBag };\n    },\n    [defaults.extra, ns]\n  );\n\n  const extra = useMemo<ExtraFilters>(\n    () =>\n      mergeDefaultExtra(\n        params,\n        readExtra(params, numberExtraKeys, arrayExtraKeys, ns)\n      ),\n    [mergeDefaultExtra, params, numberExtraKeys, arrayExtraKeys, ns]\n  );\n\n  const filterTree = useMemo(\n    () => readFilterTreeParam(params, ns),\n    [params, ns]\n  );\n\n  const commit = useCallback(\n    (mutate: (next: URLSearchParams) => void) => {\n      const next = new URLSearchParams(resolved.getSearch());\n      mutate(next);\n      resolved.setSearch(next.toString());\n    },\n    [resolved]\n  );\n\n  /**\n   * Write the full extra bag, then stamp a cleared marker for every\n   * defaulted key the bag no longer carries — deleting the param instead\n   * would resurrect the default on the next read.\n   */\n  const writeExtraWithDefaults = useCallback(\n    (p: URLSearchParams, bag: ExtraFilters) => {\n      writeExtra(p, bag, ns);\n      for (const key of Object.keys(defaults.extra ?? {})) {\n        if (isEmptyFilterValue(bag[key])) p.set(ns + FILTER_PREFIX + key, \"\");\n      }\n    },\n    [defaults.extra, ns]\n  );\n\n  /** The current effective extra bag read fresh from a params snapshot. */\n  const readEffectiveExtra = useCallback(\n    (p: URLSearchParams): ExtraFilters =>\n      mergeDefaultExtra(p, readExtra(p, numberExtraKeys, arrayExtraKeys, ns)),\n    [mergeDefaultExtra, numberExtraKeys, arrayExtraKeys, ns]\n  );\n\n  /** Reset to page 1 — as a marker when a non-1 default would resurface. */\n  const resetPage = useCallback(\n    (p: URLSearchParams) => {\n      if (initialPage > 1) p.set(ns + PARAM_PAGE, \"1\");\n      else p.delete(ns + PARAM_PAGE);\n    },\n    [initialPage, ns]\n  );\n\n  const setPage = useCallback(\n    (next: number) =>\n      commit((p) => {\n        if (next <= 1) resetPage(p);\n        else p.set(ns + PARAM_PAGE, String(next));\n      }),\n    [commit, ns, resetPage]\n  );\n\n  const setLimit = useCallback(\n    (next: number) =>\n      commit((p) => {\n        // Keep the written value inside the range the read side accepts\n        // so URL and table state never diverge.\n        const clamped = Math.min(Math.max(1, Math.round(next)), MAX_LIMIT);\n        if (clamped === initialLimit) p.delete(ns + PARAM_LIMIT);\n        else p.set(ns + PARAM_LIMIT, String(clamped));\n        resetPage(p);\n      }),\n    [commit, initialLimit, ns, resetPage]\n  );\n\n  const setSearch = useCallback(\n    (next: string) =>\n      commit((p) => {\n        const trimmed = next.trim();\n        if (trimmed !== \"\") p.set(ns + PARAM_SEARCH, trimmed);\n        else if (defaults.search) p.set(ns + PARAM_SEARCH, \"\");\n        else p.delete(ns + PARAM_SEARCH);\n        resetPage(p);\n      }),\n    [commit, defaults.search, ns, resetPage]\n  );\n\n  const setSort = useCallback(\n    (key: string | undefined, dir: SortDirection = \"asc\") =>\n      commit((p) => {\n        // A plain (single) sort RESETS any multi-sort chain — otherwise the\n        // chain keeps superseding it and the click appears dead.\n        writeSortLevels(p, [], ns);\n        if (key) {\n          p.set(ns + PARAM_SORT_BY, key);\n          p.set(ns + PARAM_SORT_DIR, dir);\n        } else {\n          if (defaults.sortBy) p.set(ns + PARAM_SORT_BY, \"\");\n          else p.delete(ns + PARAM_SORT_BY);\n          p.delete(ns + PARAM_SORT_DIR);\n        }\n        resetPage(p);\n      }),\n    [commit, defaults.sortBy, ns, resetPage]\n  );\n\n  const setGroupBy = useCallback(\n    (key: string | undefined) =>\n      commit((p) => {\n        if (key) p.set(ns + PARAM_GROUP_BY, key);\n        else if (defaults.groupBy) p.set(ns + PARAM_GROUP_BY, \"\");\n        else p.delete(ns + PARAM_GROUP_BY);\n        resetPage(p);\n      }),\n    [commit, defaults.groupBy, ns, resetPage]\n  );\n\n  const toggleSortLevel = useCallback(\n    (key: string) =>\n      commit((p) => {\n        const levels = [...readSortLevels(p, ns)];\n        const index = levels.findIndex((l) => l.key === key);\n        if (index === -1) levels.push({ key, dir: \"asc\" });\n        else if (levels[index]!.dir === \"asc\")\n          levels[index] = { key, dir: \"desc\" };\n        else levels.splice(index, 1);\n        writeSortLevels(p, levels, ns);\n        // The chain supersedes the single-sort params while present.\n        if (levels.length > 0) {\n          p.delete(ns + PARAM_SORT_BY);\n          p.delete(ns + PARAM_SORT_DIR);\n        }\n        resetPage(p);\n      }),\n    [commit, ns, resetPage]\n  );\n\n  const setExtra = useCallback(\n    (key: string, value: FilterValue) =>\n      commit((p) => {\n        writeExtraWithDefaults(p, { ...readEffectiveExtra(p), [key]: value });\n        resetPage(p);\n      }),\n    [commit, readEffectiveExtra, resetPage, writeExtraWithDefaults]\n  );\n\n  const setExtras = useCallback(\n    (updates: ExtraFilters) =>\n      commit((p) => {\n        writeExtraWithDefaults(p, { ...readEffectiveExtra(p), ...updates });\n        resetPage(p);\n      }),\n    [commit, readEffectiveExtra, resetPage, writeExtraWithDefaults]\n  );\n\n  const setFilterTree = useCallback(\n    (tree: QueryFilterGroup | undefined) =>\n      commit((p) => {\n        writeFilterTreeParam(p, tree, ns);\n        resetPage(p);\n      }),\n    [commit, ns, resetPage]\n  );\n\n  const clearExtras = useCallback(\n    () =>\n      commit((p) => {\n        writeExtraWithDefaults(p, {});\n        resetPage(p);\n      }),\n    [commit, resetPage, writeExtraWithDefaults]\n  );\n\n  const clearAll = useCallback(\n    () =>\n      commit((p) => {\n        if (defaults.search) p.set(ns + PARAM_SEARCH, \"\");\n        else p.delete(ns + PARAM_SEARCH);\n        // The multi-sort chain supersedes the single-sort params, so \"clear\n        // all\" must drop it too or the rows visibly stay sorted.\n        writeSortLevels(p, [], ns);\n        if (defaults.sortBy) p.set(ns + PARAM_SORT_BY, \"\");\n        else p.delete(ns + PARAM_SORT_BY);\n        p.delete(ns + PARAM_SORT_DIR);\n        if (defaults.groupBy) p.set(ns + PARAM_GROUP_BY, \"\");\n        else p.delete(ns + PARAM_GROUP_BY);\n        resetPage(p);\n        writeExtraWithDefaults(p, {});\n        writeFilterTreeParam(p, undefined, ns);\n      }),\n    [\n      commit,\n      defaults.search,\n      defaults.sortBy,\n      defaults.groupBy,\n      ns,\n      resetPage,\n      writeExtraWithDefaults,\n    ]\n  );\n\n  return {\n    page,\n    limit,\n    defaultLimit: initialLimit,\n    search: searchTerm,\n    sortBy,\n    sortDir,\n    groupBy,\n    extra,\n    filterTree,\n    setPage,\n    setLimit,\n    setSort,\n    setGroupBy,\n    sortLevels,\n    toggleSortLevel,\n    setSearch,\n    setExtra,\n    setExtras,\n    setFilterTree,\n    clearExtras,\n    clearAll,\n  };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport type { FacetMap } from \"../filters/facets\";\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport { resolvePaginationMode, useIsMobile } from \"../hooks/useIsMobile\";\nimport type { SortLevel } from \"../sort/compare\";\nimport type { ExtraFilters, PaginationMode, SortDirection } from \"../types\";\nimport {\n  useTableUrlState,\n  type UseTableUrlStateOptions,\n} from \"../url/useTableUrlState\";\nimport { devWarn } from \"../utils/devWarn\";\nimport { stableKey } from \"../utils/stableKey\";\nimport {\n  applyQuerySupport,\n  type QueryExtensions,\n  type QuerySupport,\n} from \"./queryContract\";\nimport type { TableSource } from \"./TableSource\";\n\n/**\n * One consolidated snapshot of everything a server query needs.\n *\n * The fields below the baseline come from {@link QueryExtensions} and are all\n * optional: a source receives one only after declaring it can answer it\n * (`supports`), so an endpoint written before a capability existed keeps\n * receiving exactly the query it was written against.\n */\nexport interface TableQuery extends QueryExtensions {\n  /** 1-based page. */\n  page: number;\n  /** Page size. */\n  limit: number;\n  /** Committed (debounced) search term. */\n  search: string;\n  /** Active sort column key, if any. */\n  sortBy: string | undefined;\n  /** Active sort direction, if any. */\n  sortDir: SortDirection | undefined;\n  /** The multi-sort chain (empty unless multi-sort is in use). */\n  sortLevels: readonly SortLevel[];\n  /** The active filter values. */\n  filters: ExtraFilters;\n}\n\n/** Options for {@link useServerData}. */\nexport interface UseServerDataOptions<TRow> extends Pick<\n  UseTableUrlStateOptions,\n  | \"urlAdapter\"\n  | \"urlSync\"\n  | \"defaults\"\n  | \"numberExtraKeys\"\n  | \"arrayExtraKeys\"\n  | \"urlKey\"\n> {\n  /** The current page of rows, exactly as the server returned them. */\n  rows: readonly TRow[];\n  /** Total row count across all pages (drives the pager). */\n  total: number;\n  /**\n   * Cursor pagination: the token the last response returned for the page\n   * after the one on screen, or `null` when that was the last page.\n   *\n   * Only read when the source declares `supports.cursor`. With it, position\n   * comes from the token rather than an offset, so rows that shift while the\n   * user reads never duplicate or skip an entry — the failure mode\n   * offset-based paging cannot avoid.\n   *\n   * A cursor is opaque, so the table only ever hands back one the server\n   * gave it. That makes \"next\" always possible, \"back\" possible for pages\n   * already visited, and a jump to an arbitrary unvisited page impossible —\n   * the honest shape of cursor pagination, not a limitation to work around.\n   */\n  nextCursor?: string | null;\n  /** Whether a request is currently in flight. */\n  loading?: boolean;\n  /** Forwarded error to display. */\n  error?: Error | null;\n  /** Pagination mode. Defaults to `\"auto\"` (mobile → infinite). */\n  paginationMode?: PaginationMode;\n  /** Force the resolved mobile state instead of a media query (test/SSR seam). */\n  forceMobile?: boolean;\n  /**\n   * What this endpoint can answer beyond the baseline query. Declare a\n   * capability and the matching field starts arriving in `onQueryChange`;\n   * leave it out and the field is never sent, with a development warning if\n   * the UI wanted it. See {@link QuerySupport}.\n   */\n  supports?: QuerySupport;\n  /**\n   * The tree nodes the reader has open, when the hierarchy lives on the server.\n   * Sent as `query.expandedIds` only if the source declares\n   * `supports: { tree: true }`, so the response can carry the children of every\n   * open branch alongside the page. Hold the same array in the table's\n   * `expandedIds` and one piece of state drives both.\n   */\n  expandedIds?: readonly string[];\n  /**\n   * Filter keys to ask the server for distinct-value counts. Sent as\n   * `query.facets` only when `supports.facets` is set.\n   */\n  facetKeys?: readonly string[];\n  /**\n   * Distinct-value counts from the last fetch. Surfaces on the source\n   * so a checklist can render without holding the full result set.\n   */\n  facets?: FacetMap;\n  /**\n   * Fired with the consolidated {@link TableQuery} whenever it changes —\n   * including once on mount with the URL-restored values. The previous\n   * call's `signal` is aborted when a newer query supersedes it; forward it\n   * to `fetch` and out-of-order responses die at the source.\n   */\n  onQueryChange?: (\n    query: TableQuery,\n    info: { signal: AbortSignal }\n  ) => void | Promise<void>;\n}\n\n/**\n * The hand-rolled-fetch server tier: the table owns the query state (URL,\n * widgets, chips, debounce) and emits ONE consolidated event per real\n * change; the caller's only job is to run the request and hand back\n * `rows` + `total`. No query library required — and the full\n * `useQuerySource` tier remains for callers who want one.\n *\n * Implements the shared source contract: `isLoading` covers the first\n * load only, `isFetching` any in-flight request, and in infinite mode\n * `fetchNextPage` APPENDS the next page's rows to those on screen\n * (accumulating across `onQueryChange` round-trips) instead of replacing\n * them.\n *\n * @typeParam TRow - The row type.\n */\nexport function useServerData<TRow>(\n  options: UseServerDataOptions<TRow>\n): TableSource<TRow> {\n  const {\n    rows,\n    total,\n    nextCursor = null,\n    loading = false,\n    error = null,\n    paginationMode = \"auto\",\n    forceMobile,\n    supports,\n    expandedIds,\n    facetKeys,\n    facets,\n    onQueryChange,\n    ...urlOptions\n  } = options;\n  const mediaMobile = useIsMobile();\n  const isMobile = forceMobile ?? mediaMobile;\n  const resolvedMode = resolvePaginationMode(paginationMode, isMobile);\n  const paged = resolvedMode === \"paged\";\n\n  const state = useTableUrlState(urlOptions);\n  const { page, limit, search, sortBy, sortDir, groupBy, sortLevels, extra } =\n    state;\n\n  // Cursor mode keeps every token the server has handed out, indexed by the\n  // page it opens: `cursors[0]` is always `undefined` (page 1 needs no token)\n  // and `cursors[n]` is the token for page n+1. Keeping the trail rather than\n  // just the latest token is what lets the user page back through what they\n  // have already seen, which a single \"next cursor\" cannot do.\n  const cursorMode = supports?.cursor === true;\n  const [cursors, setCursors] = useState<readonly (string | undefined)[]>([\n    undefined,\n  ]);\n  const cursor = cursorMode ? cursors[page - 1] : undefined;\n\n  const query = useMemo<TableQuery>(\n    () => ({\n      page,\n      limit,\n      search,\n      sortBy,\n      sortDir,\n      sortLevels,\n      filters: extra,\n      // Everything past the baseline is gated on what the source declared —\n      // an undeclared capability is dropped here, never sent and ignored.\n      ...applyQuerySupport(\n        {\n          groupBy: groupBy ? [groupBy] : undefined,\n          cursor,\n          expandedIds,\n          filterTree: state.filterTree,\n          facets: facetKeys,\n        },\n        supports\n      ),\n    }),\n    [\n      page,\n      limit,\n      search,\n      sortBy,\n      sortDir,\n      sortLevels,\n      extra,\n      groupBy,\n      cursor,\n      supports,\n      expandedIds,\n      state.filterTree,\n      facetKeys,\n    ]\n  );\n  // Value-keyed, so re-renders and StrictMode double-mounts never re-fire\n  // an identical query; `refetch` bumps the generation to force one.\n  const queryKey = stableKey(query);\n  const [generation, setGeneration] = useState(0);\n\n  const controllerRef = useRef<AbortController | null>(null);\n\n  // Emits the LATEST query / handler when the value-keyed query changes,\n  // without re-subscribing on every render.\n  const emitQuery = useEventCallback(() => {\n    if (!onQueryChange) return undefined;\n    controllerRef.current?.abort();\n    const controller = new AbortController();\n    controllerRef.current = controller;\n    void onQueryChange(query, { signal: controller.signal });\n    // Abort the in-flight request when the table unmounts.\n    return () => controller.abort();\n  });\n\n  useEffect(() => emitQuery(), [queryKey, generation, emitQuery]);\n\n  // `isLoading` covers the FIRST load only — TanStack's reference\n  // semantics: fetching with no data yet. Once rows have ever been present\n  // or one load has completed (loading transitions true → false), later\n  // refreshes never re-raise it — even a refresh that empties `rows`.\n  // Latched in an idempotent effect body so StrictMode's simulated remount\n  // cannot mark it early.\n  const rowsPresent = rows.length > 0;\n  const sawLoadingRef = useRef(false);\n  const firstLoadDoneRef = useRef(false);\n  useEffect(() => {\n    if (rowsPresent) firstLoadDoneRef.current = true;\n    if (loading) sawLoadingRef.current = true;\n    else if (sawLoadingRef.current) firstLoadDoneRef.current = true;\n  }, [loading, rowsPresent]);\n  const isLoading = loading && !rowsPresent && !firstLoadDoneRef.current;\n\n  // Clamp out-of-range pages (hand-edited / stale shared links) once the\n  // total is known and nothing is in flight — mirrors useQuerySource, so a\n  // ?page=999 deep link self-heals to the last real page (and the URL is\n  // rewritten) instead of showing an empty state the pager disagrees with.\n  const { setPage } = state;\n  useEffect(() => {\n    // Cursor mode has no offset arithmetic to clamp against — a page is\n    // reachable only if its token is already in hand, which the trail below\n    // enforces directly.\n    if (cursorMode || loading || total <= 0) return;\n    const lastPage = Math.max(1, Math.ceil(total / Math.max(limit, 1)));\n    if (page > lastPage) setPage(lastPage);\n  }, [cursorMode, loading, total, limit, page, setPage]);\n\n  // Record the token for the page after the one on screen, so \"next\" has\n  // something to send and a later \"back\" can retrace the trail.\n  useEffect(() => {\n    if (!cursorMode || loading || nextCursor === null) return;\n    setCursors((prev) => {\n      if (prev[page] === nextCursor) return prev;\n      const next = prev.slice();\n      next[page] = nextCursor;\n      return next;\n    });\n  }, [cursorMode, loading, nextCursor, page]);\n\n  // Infinite-append accumulation: `fetchNextPage` stashes the rows already\n  // on screen (plus the CURRENT `rows` prop identity) and advances the\n  // page; the stashed rows alone stay on screen until the caller hands\n  // back a NEW `rows` array for the advanced page, which is then appended.\n  // Any base-query change (sort/filter/search/limit), a direct page jump,\n  // or an error invalidates the stash, falling back to replacement.\n  const baseKey = stableKey({\n    limit,\n    search,\n    sortBy,\n    sortDir,\n    sortLevels,\n    filters: extra,\n  });\n  const [stash, setStash] = useState<{\n    key: string;\n    page: number;\n    rows: readonly TRow[];\n    prevProp: readonly TRow[];\n  } | null>(null);\n  const appending =\n    stash !== null && stash.key === baseKey && stash.page === page;\n  // The advanced page's response hasn't landed while the caller still\n  // passes the identical `rows` array the append started from.\n  const appendPending = appending && rows === stash.prevProp;\n  useEffect(() => {\n    // Memory hygiene + failure recovery: a stash for a superseded base\n    // query can never apply, and an errored append stops accumulating.\n    if (stash !== null && (stash.key !== baseKey || error !== null)) {\n      setStash(null);\n    }\n  }, [stash, baseKey, error]);\n\n  // A new sort, filter, search or page size makes every token the server\n  // issued meaningless — they describe a position in a result set that no\n  // longer exists. Drop the trail and start again from page 1.\n  const cursorBaseRef = useRef(baseKey);\n  useEffect(() => {\n    if (!cursorMode || cursorBaseRef.current === baseKey) return;\n    cursorBaseRef.current = baseKey;\n    setCursors([undefined]);\n    setPage(1);\n  }, [cursorMode, baseKey, setPage]);\n\n  const displayRows = useMemo<readonly TRow[]>(() => {\n    if (!appending) return rows;\n    return appendPending ? stash.rows : [...stash.rows, ...rows];\n  }, [appending, appendPending, stash, rows]);\n\n  // Offset mode knows the end from the count; cursor mode only knows there\n  // is more because the server said so by returning another token.\n  const moreToLoad = cursorMode\n    ? cursors[page] !== undefined\n    : page * limit < total;\n  const hasNextPage = !paged && moreToLoad;\n  // Without a token a page cannot be requested at all, so in cursor mode\n  // navigation is limited to pages already visited plus the next one. A pager\n  // click beyond that is ignored rather than silently re-serving page 1,\n  // which is what sending an absent cursor would do.\n  const setPageSafely = useEventCallback((next: number) => {\n    if (cursorMode && next > cursors.length) return;\n    setPage(next);\n  });\n\n  const fetchNextPage = useEventCallback(() => {\n    if (paged || loading || appendPending || !hasNextPage) return;\n    setStash({\n      key: baseKey,\n      page: page + 1,\n      rows: displayRows,\n      prevProp: rows,\n    });\n    setPage(page + 1);\n  });\n\n  return {\n    rows: displayRows,\n    total,\n    page,\n    limit,\n    defaultLimit: state.defaultLimit,\n    search,\n    sortBy,\n    sortDir,\n    groupBy,\n    extra,\n    facets,\n    filterTree: state.filterTree,\n    isLoading,\n    isFetching: loading,\n    isFetchingNextPage: appendPending,\n    hasNextPage,\n    error,\n    paginationMode: resolvedMode,\n    setPage: setPageSafely,\n    setLimit: state.setLimit,\n    setSort: state.setSort,\n    setGroupBy: state.setGroupBy,\n    sortLevels: state.sortLevels,\n    toggleSortLevel: state.toggleSortLevel,\n    setSearch: state.setSearch,\n    setExtra: state.setExtra,\n    setExtras: state.setExtras,\n    setFilterTree: state.setFilterTree,\n    clearExtras: state.clearExtras,\n    clearAll: state.clearAll,\n    fetchNextPage,\n    refetch: () => {\n      // Re-emitting the query IS this tier's fetch mechanism — the caller\n      // runs the request. Without a handler there is nothing to re-run.\n      if (!onQueryChange) {\n        devWarn(\n          \"refetch() has nothing to re-run without an `onQueryChange` handler.\"\n        );\n        return;\n      }\n      setGeneration((g) => g + 1);\n    },\n  };\n}\n","import type { ReactNode } from \"react\";\n\nimport type { ExtraEntry } from \"../rows/extraRows\";\nimport type { ColumnDef } from \"../types\";\nimport { getPath } from \"../utils/path\";\n\n/**\n * One visual row in a single-level grouped body: a group header, or a leaf\n * data row belonging to a group. Adapters switch on `kind`.\n */\nexport type GroupedFlatEntry<TRow> =\n  | {\n      kind: \"group\";\n      /** Stable id: `group:${keys}:${valueKeys}`, unique down the whole tree. */\n      key: string;\n      /** Raw group value (from sortValue / path). */\n      value: unknown;\n      /** Display label for the header (stringified value, or \"(blank)\"). */\n      label: string;\n      /**\n       * Depth from zero. With one grouping key every header is level 0; with\n       * `[\"team\", \"status\"]` the status headers are level 1, and adapters\n       * indent by it.\n       */\n      level: number;\n      /** Which column this level groups by. */\n      groupBy: string;\n      /** The value keys from the root down to here — the node's address. */\n      path: readonly string[];\n      /**\n       * EVERY leaf beneath this header, not just its direct children: a\n       * parent's count, its aggregates and its selection state all describe\n       * the whole subtree, which is what a person reading a nested group\n       * expects a number beside it to mean.\n       */\n      leafRows: readonly TRow[];\n      leafIds: readonly string[];\n      /**\n       * How many leaves the SERVER says are in this group, when the grouping\n       * was computed there. A server-grouped table holds a page of a group of\n       * 4,000 and must still say 4,000; local grouping leaves this unset and\n       * the count comes from `leafIds`.\n       */\n      serverCount?: number;\n      /** Present when the host passed `groupAggregates`. */\n      aggregateCells?: Partial<Record<string, ReactNode>>;\n      collapsed: boolean;\n    }\n  | {\n      /**\n       * The closing row of a group, carrying the same aggregates its header\n       * carries. Emitted only when the host asks for footers, and never for a\n       * collapsed group — there is nothing between a closed header and its\n       * footer to total.\n       */\n      kind: \"groupFooter\";\n      /** Stable id: the group's key with a `:footer` suffix. */\n      key: string;\n      /** The group this closes. */\n      groupKey: string;\n      /** Depth of the group it closes. */\n      level: number;\n      /** Which column that group is grouped by. */\n      groupBy: string;\n      /** The group's display label, for a \"Core total\" caption. */\n      label: string;\n      leafRows: readonly TRow[];\n      leafIds: readonly string[];\n      aggregateCells?: Partial<Record<string, ReactNode>>;\n    }\n  | {\n      /**\n       * \"There are more\" — a row offering the rest of a page of groups, or the\n       * rest of a group's leaves. Emitted only when the host set a page size,\n       * and only while something is still hidden.\n       */\n      kind: \"groupMore\";\n      /** Stable id. */\n      key: string;\n      /** Which group's leaves are being paged, or absent for top-level groups. */\n      groupKey?: string;\n      /** Depth the row sits at, so it indents with what it belongs to. */\n      level: number;\n      /** Whether this offers more groups or more rows inside one. */\n      scope: \"groups\" | \"rows\";\n      /** How many are still hidden. */\n      remaining: number;\n      /**\n       * Empty, and present so every group-shaped entry has the same fields:\n       * one adapter component renders headers, footers and this row, and a\n       * missing field there is a conditional in eight kits.\n       */\n      leafRows: readonly TRow[];\n      leafIds: readonly string[];\n      label: string;\n    }\n  | {\n      kind: \"row\";\n      key: string;\n      row: TRow;\n      /** Index among leaves in the flat model (stable for selection chrome). */\n      index: number;\n      groupKey: string;\n    }\n  | ExtraEntry;\n\n/**\n * One group, as sorting and filtering see it — before it becomes a row.\n *\n * The leaves are here because every aggregate is a function of them: sorting\n * groups \"by their total\" is `sum(b.leafRows) - sum(a.leafRows)`, computed from\n * the same rows the aggregate mapper reads. Comparing rendered aggregate cells\n * instead would mean comparing ReactNodes, which is not an ordering.\n */\nexport interface GroupNode<TRow> {\n  /** The raw bucket value. */\n  value: unknown;\n  /** Its display label. */\n  label: string;\n  /** Depth from zero. */\n  level: number;\n  /** Which column this level groups by. */\n  groupBy: string;\n  /** Every leaf beneath it, including through nested levels. */\n  leafRows: readonly TRow[];\n}\n\n/** How to order groups within their parent. */\nexport type GroupSort<TRow> =\n  | \"label\"\n  | \"label-desc\"\n  | \"count\"\n  | \"count-desc\"\n  | ((a: GroupNode<TRow>, b: GroupNode<TRow>) => number);\n\n/** Same mapper signature as `summaryRow` — one API for page footer + groups. */\nexport type GroupAggregatesFn<TRow> = (\n  rows: readonly TRow[]\n) => Partial<Record<string, ReactNode>>;\n\nexport interface BuildGroupedFlatModelOptions<TRow> {\n  /** Leaf rows to partition (frontend: prefer `allFilteredRows`). */\n  rows: readonly TRow[];\n  /**\n   * Column key to group by, or an ordered list for nested grouping —\n   * `[\"team\", \"status\"]` puts each status inside its team.\n   */\n  groupBy: string | readonly string[];\n  columns: readonly ColumnDef<TRow>[];\n  getRowId: (row: TRow) => string;\n  /** Collapsed group keys (from {@link useGroupCollapse}). */\n  collapsedGroupIds: ReadonlySet<string>;\n  /** Optional per-group cells — same shape as `summaryRow`. */\n  aggregates?: GroupAggregatesFn<TRow>;\n  /** Override blank-group label (default `\"(blank)\"`). */\n  blankLabel?: string;\n  /**\n   * Close every group with a footer row carrying its aggregates. Off by\n   * default, and pointless without `aggregates` — a footer with nothing to\n   * total is a blank row.\n   */\n  footers?: boolean;\n  /**\n   * Order groups within their parent. Without it they keep first-seen order,\n   * which is the order the source's own sort produced.\n   */\n  sort?: GroupSort<TRow>;\n  /** Keep only the groups this answers true for, at every level. */\n  filter?: (group: GroupNode<TRow>) => boolean;\n  /**\n   * Show at most this many top-level groups at a time. A table grouped by\n   * customer can have ten thousand groups, and rendering all of them to show\n   * the first screen is the same mistake as rendering ten thousand rows.\n   */\n  groupPageSize?: number;\n  /** Show at most this many leaves inside each group. */\n  rowPageSize?: number;\n  /** How many are currently revealed, from {@link GroupPaging}. */\n  paging?: GroupPaging;\n}\n\n/** How much of a paged group model the reader has asked to see. */\nexport interface GroupPaging {\n  /** Extra top-level groups revealed beyond the first page. */\n  groups?: number;\n  /** Extra leaves revealed per group key. */\n  rows?: Readonly<Record<string, number>>;\n}\n\n/**\n * Resolve the value used to bucket a row for `groupBy`. Prefers the column's\n * `sortValue` (same primitive as client sort), then a path lookup on the\n * column key — never the JSX accessor.\n */\nexport function resolveGroupValue<TRow>(\n  row: TRow,\n  groupBy: string,\n  column: ColumnDef<TRow> | undefined\n): unknown {\n  if (column?.sortValue) return column.sortValue(row);\n  const path = column?.key ?? groupBy;\n  return getPath(row, path);\n}\n\n/**\n * Stable string key for a group bucket. Type-tagged so distinct values\n * never share a bucket across types — number `5` vs string `\"5\"`, boolean\n * `true` vs string `\"true\"`, a Date vs its own ISO string. Null-ish and\n * empty-string values deliberately share the one blank bucket (they all\n * render the same blank label; splitting them would show several\n * identical \"(blank)\" groups).\n */\nexport function groupValueKey(value: unknown): string {\n  if (value == null || value === \"\") return \"\";\n  if (typeof value === \"string\") return `s:${value}`;\n  if (typeof value === \"number\" || typeof value === \"bigint\") {\n    return `n:${String(value)}`;\n  }\n  if (typeof value === \"boolean\") return `b:${String(value)}`;\n  if (value instanceof Date) return `d:${value.toISOString()}`;\n  try {\n    return `j:${JSON.stringify(value)}`;\n  } catch {\n    return `o:${Object.prototype.toString.call(value)}`;\n  }\n}\n\nexport function formatGroupLabel(\n  value: unknown,\n  blankLabel = \"(blank)\"\n): string {\n  if (value == null || value === \"\") return blankLabel;\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  if (value instanceof Date) return value.toISOString();\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return Object.prototype.toString.call(value);\n  }\n}\n\n/**\n * A group node's stable id.\n *\n * Both halves carry the whole path, so \"Core > blocked\" and \"Web > blocked\"\n * are different nodes — collapse one and the other stays open, which a key of\n * just the value could never express.\n *\n * @param keys - The grouping keys from the root down to this level.\n * @param valueKeys - The value keys down to this node.\n * @returns The id.\n */\nexport function makeGroupRowKey(\n  keys: string | readonly string[],\n  valueKeys: string | readonly string[]\n): string {\n  const k = typeof keys === \"string\" ? keys : keys.join(\">\");\n  const v = typeof valueKeys === \"string\" ? valueKeys : valueKeys.join(\">\");\n  return `group:${k}:${v}`;\n}\n\n/**\n * One bucket in a grouped partition tree, before it becomes a rendered row.\n *\n * Incremental re-evaluation keeps this tree up to date and hands it to\n * {@link flattenGroupPartitions} so a patched row does not re-hash every\n * other row's group key.\n */\nexport interface GroupPartition<TRow> {\n  /** The raw bucket value. */\n  value: unknown;\n  /** {@link groupValueKey} of `value`. */\n  valueKey: string;\n  /** Every leaf beneath this node, in source (sorted) order. */\n  rows: readonly TRow[];\n  /** Nested buckets, when another grouping key remains. */\n  children?: readonly GroupPartition<TRow>[];\n}\n\n/**\n * The grouping keys {@link buildGroupedFlatModel} will actually use — blank\n * entries dropped, so `[\"\", \"team\"]` is just `\"team\"`.\n *\n * @param groupBy - A single key or an ordered list.\n * @returns The non-empty keys, outermost first.\n */\nexport function groupingKeys(groupBy: string | readonly string[]): string[] {\n  return (typeof groupBy === \"string\" ? [groupBy] : groupBy).filter(\n    (key) => key.length > 0\n  );\n}\n\n/**\n * Partition rows into the nested bucket tree grouping walks.\n *\n * Order is first-seen at each level, which preserves whatever sort the\n * source already applied.\n *\n * @typeParam TRow - The row type.\n * @param rows - The rows to partition.\n * @param groupBy - Column key, or an ordered list for nested grouping.\n * @param columns - The columns, for each key's `sortValue`.\n * @returns The top-level buckets, or an empty list when there is no key.\n */\nexport function partitionGroupedRows<TRow>(\n  rows: readonly TRow[],\n  groupBy: string | readonly string[],\n  columns: readonly ColumnDef<TRow>[]\n): GroupPartition<TRow>[] {\n  const keys = groupingKeys(groupBy);\n  if (keys.length === 0) return [];\n  return partitionLevel(rows, keys, 0, columns);\n}\n\nfunction partitionLevel<TRow>(\n  rows: readonly TRow[],\n  keys: readonly string[],\n  level: number,\n  columns: readonly ColumnDef<TRow>[]\n): GroupPartition<TRow>[] {\n  const { order, buckets } = bucketBy(rows, keys[level]!, columns);\n  return order.map((valueKey) => {\n    const bucket = buckets.get(valueKey)!;\n    return {\n      value: bucket.value,\n      valueKey,\n      rows: bucket.rows,\n      children:\n        level + 1 < keys.length\n          ? partitionLevel(bucket.rows, keys, level + 1, columns)\n          : undefined,\n    };\n  });\n}\n\n/**\n * Turn a partition tree into the flat model adapters render.\n *\n * This is the emit half of {@link buildGroupedFlatModel}: filtering, ordering,\n * paging, collapse, footers. Incremental grouping updates the tree, then\n * calls this instead of re-bucketing the world.\n *\n * @typeParam TRow - The row type.\n * @param partitions - The tree {@link partitionGroupedRows} (or an\n *   incremental update) produced.\n * @param options - The same options as the full builder, minus `rows`.\n * @returns The entries, in render order.\n */\nexport function flattenGroupPartitions<TRow>(\n  partitions: readonly GroupPartition<TRow>[],\n  options: Omit<BuildGroupedFlatModelOptions<TRow>, \"rows\">\n): GroupedFlatEntry<TRow>[] {\n  const keys = groupingKeys(options.groupBy);\n  if (keys.length === 0 || partitions.length === 0) return [];\n\n  const {\n    getRowId,\n    collapsedGroupIds,\n    aggregates,\n    blankLabel,\n    footers = false,\n    sort,\n    filter,\n    groupPageSize,\n    rowPageSize,\n    paging,\n  } = options;\n  const flat: GroupedFlatEntry<TRow>[] = [];\n  let leafIndex = 0;\n\n  const walk = (\n    levelPartitions: readonly GroupPartition<TRow>[],\n    level: number,\n    path: readonly string[]\n  ): void => {\n    const key = keys[level]!;\n\n    // Filtering and ordering happen on the whole level at once, before any of\n    // it is emitted: a group dropped here takes its leaves with it, and one\n    // moved here moves its whole subtree.\n    const nodes = levelPartitions.flatMap((part) => {\n      const node: GroupNode<TRow> = {\n        value: part.value,\n        label: formatGroupLabel(part.value, blankLabel),\n        level,\n        groupBy: key,\n        leafRows: part.rows,\n      };\n      return filter && !filter(node)\n        ? []\n        : [{ part, valueKey: part.valueKey, node }];\n    });\n    if (sort) nodes.sort((a, b) => compareGroups(a.node, b.node, sort));\n\n    // Only the top level pages: a nested level is already inside a group the\n    // reader chose to open, and hiding part of what they opened would be a\n    // second \"more\" to hunt for.\n    const groupLimit = pageLimit(\n      nodes.length,\n      level === 0 ? groupPageSize : undefined,\n      paging?.groups\n    );\n    const shown = nodes.slice(0, groupLimit);\n    const hiddenGroups = nodes.length - shown.length;\n\n    for (const { part, valueKey, node } of shown) {\n      const here = [...path, valueKey];\n      const groupKey = makeGroupRowKey(keys.slice(0, level + 1), here);\n      const collapsed = collapsedGroupIds.has(groupKey);\n      const aggregateCells = aggregates?.(part.rows);\n      const label = node.label;\n\n      flat.push({\n        kind: \"group\",\n        key: groupKey,\n        value: part.value,\n        label,\n        level,\n        groupBy: key,\n        path: here,\n        leafRows: part.rows,\n        leafIds: part.rows.map((row) => getRowId(row)),\n        aggregateCells,\n        collapsed,\n      });\n      if (collapsed) continue;\n\n      if (level + 1 < keys.length) {\n        walk(part.children ?? [], level + 1, here);\n      } else {\n        leafIndex = emitLeaves(flat, part.rows, {\n          groupKey,\n          level,\n          getRowId,\n          from: leafIndex,\n          limit: pageLimit(\n            part.rows.length,\n            rowPageSize,\n            paging?.rows?.[groupKey]\n          ),\n        });\n      }\n\n      // The footer closes the group AFTER everything inside it, including any\n      // nested groups and their own footers — innermost totals first, exactly\n      // as the indentation reads.\n      if (footers) {\n        flat.push({\n          kind: \"groupFooter\",\n          key: `${groupKey}:footer`,\n          groupKey,\n          level,\n          groupBy: key,\n          label,\n          leafRows: part.rows,\n          leafIds: part.rows.map((row) => getRowId(row)),\n          aggregateCells,\n        });\n      }\n    }\n\n    if (hiddenGroups > 0) {\n      flat.push(\n        moreEntry(\"groups\", hiddenGroups, level, undefined, path.join(\">\"))\n      );\n    }\n  };\n\n  walk(partitions, 0, []);\n  return flat;\n}\n\n/**\n * Partition leaf rows into the flat model adapters render: a group header,\n * then whatever sits under it — nested headers first when there is more than\n * one grouping key, then the leaves.\n *\n * Flat rather than nested on purpose: a windowing virtualizer can only measure\n * and slice a list, so the tree is expressed as depth on each entry instead of\n * as children. Group order follows first-seen value order within each parent,\n * which keeps the sort the source already applied.\n *\n * A collapsed header emits nothing beneath it — not its child headers and not\n * their leaves — so collapsing a top-level group hides the whole subtree in\n * one step.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link BuildGroupedFlatModelOptions}.\n * @returns The entries, in render order.\n */\nexport function buildGroupedFlatModel<TRow>(\n  options: BuildGroupedFlatModelOptions<TRow>\n): GroupedFlatEntry<TRow>[] {\n  return flattenGroupPartitions(\n    partitionGroupedRows(options.rows, options.groupBy, options.columns),\n    options\n  );\n}\n\n/**\n * Order two groups by a {@link GroupSort}.\n *\n * Labels compare with `localeCompare`, so \"Ärger\" lands where a reader expects\n * rather than after \"Zulu\"; counts compare numerically.\n *\n * @typeParam TRow - The row type.\n * @param a - The first group.\n * @param b - The second group.\n * @param sort - The ordering asked for.\n * @returns Negative, zero or positive, as a comparator does.\n */\nfunction compareGroups<TRow>(\n  a: GroupNode<TRow>,\n  b: GroupNode<TRow>,\n  sort: GroupSort<TRow>\n): number {\n  if (typeof sort === \"function\") return sort(a, b);\n  if (sort === \"label\") return a.label.localeCompare(b.label);\n  if (sort === \"label-desc\") return b.label.localeCompare(a.label);\n  if (sort === \"count\") return a.leafRows.length - b.leafRows.length;\n  return b.leafRows.length - a.leafRows.length;\n}\n\n/**\n * Emit one group's leaf rows, plus the offer for any it is holding back.\n *\n * @typeParam TRow - The row type.\n * @param flat - The entry list being built, appended to in place.\n * @param rows - The group's leaves.\n * @param options - Where they belong and how many to show.\n * @returns The next leaf index, so numbering continues across groups.\n */\nfunction emitLeaves<TRow>(\n  flat: GroupedFlatEntry<TRow>[],\n  rows: readonly TRow[],\n  options: {\n    groupKey: string;\n    level: number;\n    getRowId: (row: TRow) => string;\n    from: number;\n    limit: number;\n  }\n): number {\n  const { groupKey, level, getRowId, from, limit } = options;\n  let index = from;\n  for (const row of rows.slice(0, limit)) {\n    flat.push({\n      kind: \"row\",\n      key: getRowId(row),\n      row,\n      index: index++,\n      groupKey,\n    });\n  }\n  const hidden = Math.max(0, rows.length - limit);\n  if (hidden > 0) flat.push(moreEntry(\"rows\", hidden, level + 1, groupKey));\n  return index;\n}\n\n/**\n * How many of something to show: everything without a page size, and one page\n * plus whatever has been revealed with one.\n *\n * @param total - How many there are.\n * @param pageSize - The page size, when the host set one.\n * @param revealed - How many extra have been asked for.\n * @returns The count to render.\n */\nfunction pageLimit(\n  total: number,\n  pageSize: number | undefined,\n  revealed: number | undefined\n): number {\n  if (!pageSize) return total;\n  return Math.min(total, pageSize + (revealed ?? 0));\n}\n\n/**\n * Partition rows into ordered buckets for one grouping key.\n *\n * Order is first-seen, which preserves whatever sort the source applied — the\n * rows arrive sorted and the groups come out in the order those rows named\n * them.\n *\n * @typeParam TRow - The row type.\n * @param rows - The rows to partition.\n * @param key - The grouping key for this level.\n * @param columns - The columns, for the key's `sortValue`.\n * @returns The bucket keys in order, and the buckets themselves.\n */\nfunction bucketBy<TRow>(\n  rows: readonly TRow[],\n  key: string,\n  columns: readonly ColumnDef<TRow>[]\n): {\n  order: string[];\n  buckets: Map<string, { value: unknown; rows: TRow[] }>;\n} {\n  const column = columns.find((c) => c.key === key);\n  const order: string[] = [];\n  const buckets = new Map<string, { value: unknown; rows: TRow[] }>();\n  for (const row of rows) {\n    const value = resolveGroupValue(row, key, column);\n    const valueKey = groupValueKey(value);\n    let bucket = buckets.get(valueKey);\n    if (!bucket) {\n      bucket = { value, rows: [] };\n      buckets.set(valueKey, bucket);\n      order.push(valueKey);\n    }\n    bucket.rows.push(row);\n  }\n  return { order, buckets };\n}\n\n/**\n * The \"there are more\" row, for either scope.\n *\n * @typeParam TRow - The row type.\n * @param scope - Whether more groups or more rows are hidden.\n * @param remaining - How many.\n * @param level - The depth the row sits at.\n * @param groupKey - The group whose rows are hidden, for a `\"rows\"` offer.\n * @param pathKey - The path, so a nested level's offer has its own id.\n * @returns The entry.\n */\nfunction moreEntry<TRow>(\n  scope: \"groups\" | \"rows\",\n  remaining: number,\n  level: number,\n  groupKey?: string,\n  pathKey = \"\"\n): GroupedFlatEntry<TRow> {\n  return {\n    kind: \"groupMore\",\n    key: groupKey ? `${groupKey}:more` : `group-more:${level}:${pathKey}`,\n    groupKey,\n    level,\n    scope,\n    remaining,\n    leafRows: [],\n    leafIds: [],\n    label: \"\",\n  };\n}\n","/**\n * Incremental built-in aggregates — the same numbers {@link aggregate}\n * would compute, updated from the rows a patch touched instead of a full\n * walk of the set.\n *\n * Custom aggregators and a dirty min/max (the old extremum left the set)\n * fall back to a rescan of the rows the total describes. That is still\n * the group or the filtered set, not the unfiltered source.\n */\nimport type { ReactNode } from \"react\";\n\nimport {\n  aggregate,\n  type AggregateName,\n  type AggregateOptions,\n  type AggregateSpec,\n  resolveAggregateValue,\n  toAggregateNumber,\n} from \"../aggregate/aggregate\";\nimport type { ColumnDef, SortableValue } from \"../types\";\n\ninterface ColumnAcc {\n  kind: AggregateName | \"custom\";\n  sum: number;\n  numericCount: number;\n  presentCount: number;\n  min: number | undefined;\n  max: number | undefined;\n  /** The old min or max left; `read` must rescan. */\n  dirty: boolean;\n}\n\ninterface ColumnBinding {\n  key: string;\n  acc: ColumnAcc;\n}\n\n/**\n * Running totals for one {@link AggregateSpec} over a changing row set.\n *\n * @typeParam TRow - The row type.\n */\nexport interface IncrementalAggregate<TRow> {\n  spec: AggregateSpec;\n  options: AggregateOptions<TRow>;\n  columns: ReadonlyMap<string, ColumnDef<TRow>>;\n  bindings: ColumnBinding[];\n}\n\n/**\n * Start a running total from the rows already in the set.\n *\n * @typeParam TRow - The row type.\n * @param spec - The same declaration {@link aggregate} takes.\n * @param rows - The rows the total currently describes.\n * @param options - Column resolvers and an optional formatter.\n */\nexport function createIncrementalAggregate<TRow>(\n  spec: AggregateSpec,\n  rows: readonly TRow[],\n  options: AggregateOptions<TRow> = {}\n): IncrementalAggregate<TRow> {\n  const columns = new Map(\n    options.columns?.map((column) => [column.key, column])\n  );\n  const bindings: ColumnBinding[] = [];\n  for (const [key, fn] of Object.entries(spec)) {\n    if (!fn) continue;\n    const kind = builtInName(fn);\n    bindings.push({\n      key,\n      acc: {\n        kind: kind ?? \"custom\",\n        sum: 0,\n        numericCount: 0,\n        presentCount: 0,\n        min: undefined,\n        max: undefined,\n        dirty: kind === undefined,\n      },\n    });\n  }\n  const state: IncrementalAggregate<TRow> = {\n    spec,\n    options,\n    columns,\n    bindings,\n  };\n  for (const row of rows) addAggregateRow(state, row);\n  return state;\n}\n\n/**\n * Fold one row into the running total.\n *\n * @typeParam TRow - The row type.\n * @param state - The running total.\n * @param row - The row that entered the set.\n */\nexport function addAggregateRow<TRow>(\n  state: IncrementalAggregate<TRow>,\n  row: TRow\n): void {\n  for (const { key, acc } of state.bindings) {\n    applyValue(acc, valueOf(state, row, key), 1);\n  }\n}\n\n/**\n * Fold one row out of the running total.\n *\n * @typeParam TRow - The row type.\n * @param state - The running total.\n * @param row - The row that left the set.\n */\nexport function removeAggregateRow<TRow>(\n  state: IncrementalAggregate<TRow>,\n  row: TRow\n): void {\n  for (const { key, acc } of state.bindings) {\n    applyValue(acc, valueOf(state, row, key), -1);\n  }\n}\n\n/**\n * Replace one row's contribution with another's.\n *\n * @typeParam TRow - The row type.\n * @param state - The running total.\n * @param prev - The row that left.\n * @param next - The row that entered.\n */\nexport function replaceAggregateRow<TRow>(\n  state: IncrementalAggregate<TRow>,\n  prev: TRow,\n  next: TRow\n): void {\n  removeAggregateRow(state, prev);\n  addAggregateRow(state, next);\n}\n\n/**\n * Read the current cells. When a built-in is dirty or a custom aggregator\n * is in play, rescans `rows` so the answer still matches {@link aggregate}.\n *\n * @typeParam TRow - The row type.\n * @param state - The running total.\n * @param rows - The rows the total describes, for a rescan.\n */\nexport function readIncrementalAggregate<TRow>(\n  state: IncrementalAggregate<TRow>,\n  rows: readonly TRow[]\n): Partial<Record<string, ReactNode>> {\n  if (state.bindings.some((binding) => binding.acc.kind === \"custom\")) {\n    return aggregate(state.spec, state.options)(rows);\n  }\n  if (state.bindings.some((binding) => binding.acc.dirty)) {\n    rescan(state, rows);\n  }\n  const out: Partial<Record<string, ReactNode>> = {};\n  const format = state.options.format;\n  for (const { key, acc } of state.bindings) {\n    const result = cellOf(acc);\n    out[key] = format ? format(result, key) : result;\n  }\n  return out;\n}\n\nfunction builtInName(fn: unknown): AggregateName | undefined {\n  if (\n    fn === \"sum\" ||\n    fn === \"avg\" ||\n    fn === \"count\" ||\n    fn === \"min\" ||\n    fn === \"max\"\n  ) {\n    return fn;\n  }\n  return undefined;\n}\n\nfunction valueOf<TRow>(\n  state: IncrementalAggregate<TRow>,\n  row: TRow,\n  key: string\n): SortableValue {\n  return resolveAggregateValue(row, key, state.columns.get(key));\n}\n\nfunction applyValue(acc: ColumnAcc, value: SortableValue, sign: 1 | -1): void {\n  if (acc.kind === \"custom\") {\n    acc.dirty = true;\n    return;\n  }\n  if (value === undefined || value === null) return;\n  acc.presentCount += sign;\n  const n = toAggregateNumber(value);\n  if (n === undefined) return;\n  acc.sum += sign * n;\n  acc.numericCount += sign;\n  if (sign === 1) {\n    acc.min = acc.min === undefined ? n : Math.min(acc.min, n);\n    acc.max = acc.max === undefined ? n : Math.max(acc.max, n);\n    return;\n  }\n  if (acc.numericCount <= 0) {\n    acc.sum = 0;\n    acc.numericCount = 0;\n    acc.min = undefined;\n    acc.max = undefined;\n    acc.dirty = false;\n    return;\n  }\n  if (n === acc.min || n === acc.max) acc.dirty = true;\n}\n\nfunction rescan<TRow>(\n  state: IncrementalAggregate<TRow>,\n  rows: readonly TRow[]\n): void {\n  for (const { acc } of state.bindings) {\n    acc.sum = 0;\n    acc.numericCount = 0;\n    acc.presentCount = 0;\n    acc.min = undefined;\n    acc.max = undefined;\n    acc.dirty = false;\n  }\n  for (const row of rows) addAggregateRow(state, row);\n}\n\nfunction cellOf(acc: ColumnAcc): number | undefined {\n  if (acc.kind === \"sum\") return acc.sum;\n  if (acc.kind === \"count\") return acc.presentCount;\n  if (acc.kind === \"avg\") {\n    return acc.numericCount ? acc.sum / acc.numericCount : undefined;\n  }\n  if (acc.kind === \"min\") return acc.min;\n  return acc.max;\n}\n","/**\n * Incremental grouping — keep the partition tree {@link buildGroupedFlatModel}\n * walks, and only re-bucket the rows a patch touched.\n *\n * Flattening still goes through {@link flattenGroupPartitions} so collapse,\n * paging, group sort and group filter stay one implementation.\n */\nimport {\n  groupingKeys,\n  type GroupPartition,\n  groupValueKey,\n  resolveGroupValue,\n} from \"../grouping/groupRows\";\nimport type { ColumnDef } from \"../types\";\n\n/** One mutable bucket; `childMap` is the same nodes as `children`. */\nexport interface MutablePartition<TRow> {\n  value: unknown;\n  valueKey: string;\n  rows: TRow[];\n  children?: MutablePartition<TRow>[];\n  childMap: Map<string, MutablePartition<TRow>>;\n}\n\n/** The grouping keys and the live tree incremental updates mutate. */\nexport interface IncrementalGroupTree<TRow> {\n  keys: readonly string[];\n  columns: readonly ColumnDef<TRow>[];\n  roots: MutablePartition<TRow>[];\n  rootMap: Map<string, MutablePartition<TRow>>;\n}\n\n/**\n * The value-key path a row takes through the grouping keys.\n *\n * @typeParam TRow - The row type.\n * @param row - The row to place.\n * @param keys - Grouping keys, outermost first.\n * @param columns - Columns, for each key's `sortValue`.\n */\nexport function rowGroupPath<TRow>(\n  row: TRow,\n  keys: readonly string[],\n  columns: readonly ColumnDef<TRow>[]\n): { value: unknown; valueKey: string }[] {\n  return keys.map((key) => {\n    const column = columns.find((item) => item.key === key);\n    const value = resolveGroupValue(row, key, column);\n    return { value, valueKey: groupValueKey(value) };\n  });\n}\n\n/**\n * Build a live tree from a frozen partition list (the full-eval path).\n *\n * @typeParam TRow - The row type.\n * @param partitions - The buckets {@link partitionGroupedRows} produced.\n * @param groupBy - The grouping keys those buckets used.\n * @param columns - Columns, kept so later patches resolve the same way.\n */\nexport function incrementalGroupTree<TRow>(\n  partitions: readonly GroupPartition<TRow>[],\n  groupBy: string | readonly string[],\n  columns: readonly ColumnDef<TRow>[]\n): IncrementalGroupTree<TRow> {\n  const roots = partitions.map(toMutable);\n  return {\n    keys: groupingKeys(groupBy),\n    columns,\n    roots,\n    rootMap: mapOf(roots),\n  };\n}\n\n/**\n * A readonly view of the live tree for {@link flattenGroupPartitions}.\n *\n * @typeParam TRow - The row type.\n * @param tree - The live tree.\n */\nexport function snapshotPartitions<TRow>(\n  tree: IncrementalGroupTree<TRow>\n): GroupPartition<TRow>[] {\n  return tree.roots.map(toFrozen);\n}\n\n/**\n * Insert a row along its group path, creating buckets that do not exist\n * yet. Sibling order is first-seen: a new group lands where its first\n * leaf sits in the sorted list.\n *\n * @typeParam TRow - The row type.\n * @param tree - The live tree.\n * @param row - The row that entered the sorted set.\n * @param path - {@link rowGroupPath} of `row`.\n * @param sortedIndex - Current index of each id in the sorted list.\n * @param getRowId - How a row's id is derived.\n */\nexport function addGroupedRow<TRow>(\n  tree: IncrementalGroupTree<TRow>,\n  row: TRow,\n  path: readonly { value: unknown; valueKey: string }[],\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): void {\n  let siblings = tree.roots;\n  let siblingMap = tree.rootMap;\n  for (const step of path) {\n    let node = siblingMap.get(step.valueKey);\n    if (!node) {\n      node = {\n        value: step.value,\n        valueKey: step.valueKey,\n        rows: [],\n        children: [],\n        childMap: new Map(),\n      };\n      const at = firstSeenInsertAt(siblings, row, sortedIndex, getRowId);\n      siblings.splice(at, 0, node);\n      siblingMap.set(step.valueKey, node);\n    }\n    insertLeaf(node.rows, row, sortedIndex, getRowId);\n    siblings = node.children ?? (node.children = []);\n    siblingMap = node.childMap;\n  }\n  rebalance(tree, path, sortedIndex, getRowId);\n}\n\n/**\n * Remove a row along a path it used to sit on. Empty buckets drop, so a\n * group that just lost its last leaf disappears the way a full rebuild\n * would drop it.\n *\n * @typeParam TRow - The row type.\n * @param tree - The live tree.\n * @param id - The row id to drop.\n * @param path - The path the row was on.\n * @param sortedIndex - Current sorted indices, so remaining groups keep\n *   first-seen order.\n * @param getRowId - How a row's id is derived.\n */\nexport function removeGroupedRow<TRow>(\n  tree: IncrementalGroupTree<TRow>,\n  id: string,\n  path: readonly { valueKey: string }[],\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): void {\n  const chain: {\n    node: MutablePartition<TRow>;\n    siblings: MutablePartition<TRow>[];\n    siblingMap: Map<string, MutablePartition<TRow>>;\n  }[] = [];\n  let siblings = tree.roots;\n  let siblingMap = tree.rootMap;\n  for (const step of path) {\n    const node = siblingMap.get(step.valueKey);\n    if (!node) return;\n    chain.push({ node, siblings, siblingMap });\n    siblings = node.children ?? [];\n    siblingMap = node.childMap;\n  }\n  for (let i = chain.length - 1; i >= 0; i--) {\n    const { node, siblings: list, siblingMap: map } = chain[i]!;\n    removeLeaf(node.rows, id, getRowId);\n    if (node.rows.length > 0) continue;\n    const at = list.indexOf(node);\n    if (at !== -1) list.splice(at, 1);\n    map.delete(node.valueKey);\n  }\n  rebalance(tree, path, sortedIndex, getRowId);\n}\n\n/**\n * Move a row from one path to another, or reposition it inside the same\n * path when only its sort index changed.\n *\n * @typeParam TRow - The row type.\n * @param tree - The live tree.\n * @param prev - The row that left.\n * @param next - The row that entered.\n * @param prevPath - Path of `prev`.\n * @param nextPath - Path of `next`.\n * @param sortedIndex - Current sorted indices.\n * @param getRowId - How a row's id is derived.\n */\nexport function moveGroupedRow<TRow>(\n  tree: IncrementalGroupTree<TRow>,\n  prev: TRow,\n  next: TRow,\n  prevPath: readonly { value: unknown; valueKey: string }[],\n  nextPath: readonly { value: unknown; valueKey: string }[],\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): void {\n  const samePath =\n    prevPath.length === nextPath.length &&\n    prevPath.every((step, i) => step.valueKey === nextPath[i]?.valueKey);\n  if (samePath) {\n    replaceAlongPath(tree, next, nextPath, sortedIndex, getRowId);\n    return;\n  }\n  removeGroupedRow(tree, getRowId(prev), prevPath, sortedIndex, getRowId);\n  addGroupedRow(tree, next, nextPath, sortedIndex, getRowId);\n}\n\nfunction replaceAlongPath<TRow>(\n  tree: IncrementalGroupTree<TRow>,\n  row: TRow,\n  path: readonly { valueKey: string }[],\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): void {\n  let siblingMap = tree.rootMap;\n  const id = getRowId(row);\n  for (const step of path) {\n    const node = siblingMap.get(step.valueKey);\n    if (!node) return;\n    removeLeaf(node.rows, id, getRowId);\n    insertLeaf(node.rows, row, sortedIndex, getRowId);\n    siblingMap = node.childMap;\n  }\n  rebalance(tree, path, sortedIndex, getRowId);\n}\n\nfunction rebalance<TRow>(\n  tree: IncrementalGroupTree<TRow>,\n  path: readonly { valueKey: string }[],\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): void {\n  sortSiblings(tree.roots, sortedIndex, getRowId);\n  let map = tree.rootMap;\n  for (const step of path) {\n    const node = map.get(step.valueKey);\n    if (!node?.children) break;\n    sortSiblings(node.children, sortedIndex, getRowId);\n    map = node.childMap;\n  }\n}\n\nfunction sortSiblings<TRow>(\n  siblings: MutablePartition<TRow>[],\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): void {\n  siblings.sort((a, b) => {\n    return (\n      firstLeafIndex(a, sortedIndex, getRowId) -\n      firstLeafIndex(b, sortedIndex, getRowId)\n    );\n  });\n}\n\nfunction firstLeafIndex<TRow>(\n  node: MutablePartition<TRow>,\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): number {\n  const first = node.rows[0];\n  if (!first) return Number.POSITIVE_INFINITY;\n  return sortedIndex.get(getRowId(first)) ?? Number.POSITIVE_INFINITY;\n}\n\nfunction firstSeenInsertAt<TRow>(\n  siblings: readonly MutablePartition<TRow>[],\n  row: TRow,\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): number {\n  const incoming = sortedIndex.get(getRowId(row)) ?? Number.POSITIVE_INFINITY;\n  const at = siblings.findIndex((sibling) => {\n    const first = sibling.rows[0];\n    if (!first) return true;\n    return (\n      (sortedIndex.get(getRowId(first)) ?? Number.POSITIVE_INFINITY) > incoming\n    );\n  });\n  return at === -1 ? siblings.length : at;\n}\n\nfunction insertLeaf<TRow>(\n  rows: TRow[],\n  row: TRow,\n  sortedIndex: ReadonlyMap<string, number>,\n  getRowId: (row: TRow) => string\n): void {\n  const incoming = sortedIndex.get(getRowId(row)) ?? Number.POSITIVE_INFINITY;\n  const at = rows.findIndex((existing) => {\n    return (\n      (sortedIndex.get(getRowId(existing)) ?? Number.POSITIVE_INFINITY) >\n      incoming\n    );\n  });\n  rows.splice(at === -1 ? rows.length : at, 0, row);\n}\n\nfunction removeLeaf<TRow>(\n  rows: TRow[],\n  id: string,\n  getRowId: (row: TRow) => string\n): void {\n  const at = rows.findIndex((row) => getRowId(row) === id);\n  if (at !== -1) rows.splice(at, 1);\n}\n\nfunction toMutable<TRow>(part: GroupPartition<TRow>): MutablePartition<TRow> {\n  const children = part.children?.map(toMutable);\n  return {\n    value: part.value,\n    valueKey: part.valueKey,\n    rows: [...part.rows],\n    children,\n    childMap: mapOf(children ?? []),\n  };\n}\n\nfunction toFrozen<TRow>(part: MutablePartition<TRow>): GroupPartition<TRow> {\n  return {\n    value: part.value,\n    valueKey: part.valueKey,\n    rows: part.rows,\n    children: part.children?.map(toFrozen),\n  };\n}\n\nfunction mapOf<TRow>(\n  nodes: readonly MutablePartition<TRow>[]\n): Map<string, MutablePartition<TRow>> {\n  return new Map(nodes.map((node) => [node.valueKey, node]));\n}\n","/**\n * Row patches — changing the data you already have, without refetching it.\n *\n * A save returns the updated record, a socket pushes a new one, a delete\n * succeeds. Refetching the page to reflect that costs a round trip and, worse,\n * throws away everything the user had going: the scroll position, which rows\n * were open, sometimes the selection.\n *\n * ```ts\n * const [rows, setRows] = useState(initial);\n * const onSaved = (row: Person) =>\n *   setRows((current) => applyRowPatches(current, [updateRow(row.id, row)], byId));\n * ```\n *\n * Two properties make that safe, and both are tested:\n *\n * - **Untouched rows keep their object identity.** React reconciles them as\n *   unchanged, and anything memoized per row — a `computed` column's cache,\n *   a `memo`'d cell — stays valid instead of recomputing for the whole page.\n * - **A patch that changes nothing returns the very same array.** Applying an\n *   update whose values already match, or removing an id that is not there,\n *   hands back the original reference, so a `setState` with it does not\n *   re-render.\n *\n * Selection and expansion survive because both are keyed by row id, and a\n * patch never changes the id of a row it did not touch.\n *\n * This is a pure function over an array. The table never owns your data and\n * this does not make it start: you hold the rows, you apply the patch.\n */\n\n/** Insert a row. Without `at`, it goes on the end. */\nexport interface InsertPatch<TRow> {\n  type: \"insert\";\n  row: TRow;\n  /** Zero-based position. Clamped into range; negative counts from the end. */\n  at?: number;\n}\n\n/** Merge changes into the row with this id. Absent id: nothing happens. */\nexport interface UpdatePatch<TRow> {\n  type: \"update\";\n  id: string;\n  changes: Partial<TRow>;\n}\n\n/** Replace the row with this id, or append it when it is not there yet. */\nexport interface UpsertPatch<TRow> {\n  type: \"upsert\";\n  row: TRow;\n}\n\n/** Drop the row with this id. Absent id: nothing happens. */\nexport interface RemovePatch {\n  type: \"remove\";\n  id: string;\n}\n\n/** One change to a row set. */\nexport type RowPatch<TRow> =\n  | InsertPatch<TRow>\n  | UpdatePatch<TRow>\n  | UpsertPatch<TRow>\n  | RemovePatch;\n\n/** Insert a row, optionally at a position. */\nexport function insertRow<TRow>(row: TRow, at?: number): InsertPatch<TRow> {\n  return { type: \"insert\", row, at };\n}\n\n/** Merge changes into one row. */\nexport function updateRow<TRow>(\n  id: string,\n  changes: Partial<TRow>\n): UpdatePatch<TRow> {\n  return { type: \"update\", id, changes };\n}\n\n/** Replace a row, or add it if it is new. */\nexport function upsertRow<TRow>(row: TRow): UpsertPatch<TRow> {\n  return { type: \"upsert\", row };\n}\n\n/** Remove a row by id. */\nexport function removeRow(id: string): RemovePatch {\n  return { type: \"remove\", id };\n}\n\n/** Is every own key of `changes` already equal on `row`? */\nfunction alreadyApplied<TRow>(row: TRow, changes: Partial<TRow>): boolean {\n  return (Object.keys(changes) as (keyof TRow)[]).every((key) =>\n    Object.is(row[key], changes[key])\n  );\n}\n\n/** Clamp an insert position, letting a negative index count from the end. */\nfunction insertIndex(at: number | undefined, length: number): number {\n  if (at === undefined) return length;\n  const resolved = at < 0 ? length + at : at;\n  return Math.min(Math.max(resolved, 0), length);\n}\n\n/** Where a row with this id sits, or -1. */\nfunction indexOfId<TRow>(\n  list: readonly TRow[],\n  id: string,\n  getRowId: (row: TRow) => string\n): number {\n  return list.findIndex((row) => getRowId(row) === id);\n}\n\n/**\n * One mutation {@link applyRowPatchesWithLog} actually performed.\n *\n * Incremental re-evaluation walks this list instead of scanning the row set\n * to find what changed. Indices are taken at the moment the event ran, so a\n * later event sees the array the earlier one left behind.\n */\nexport type RowPatchEvent<TRow> =\n  | { type: \"insert\"; id: string; row: TRow; index: number }\n  | { type: \"remove\"; id: string; row: TRow; index: number }\n  | { type: \"update\"; id: string; prev: TRow; next: TRow; index: number };\n\n/**\n * The result of applying patches, plus the events an incremental view needs\n * so it does not have to diff two 20k-row arrays to find one update.\n */\nexport interface RowPatchLog<TRow> {\n  /** The row set after the patches — same contract as {@link applyRowPatches}. */\n  rows: readonly TRow[];\n  /** Empty when nothing changed; the original array is then on `rows`. */\n  events: readonly RowPatchEvent<TRow>[];\n}\n\nconst PATCH_LOGS = new WeakMap<WeakKey, RowPatchLog<unknown>>();\n\n/**\n * The log {@link applyRowPatches} attached to a result array, when the\n * patches actually changed something. A host that already called\n * `applyRowPatches` (the Scale demo, a socket handler) can hand this to\n * the incremental view instead of applying the same patches twice.\n *\n * Spreading the result (`[...applyRowPatches(...)]`) drops the log — the\n * copy is a different array.\n *\n * @typeParam TRow - The row type.\n * @param rows - An array returned by {@link applyRowPatches}.\n * @returns The log, or `undefined` when this array was not produced by a\n *   changing patch (or was copied).\n */\nexport function rowPatchLog<TRow>(\n  rows: readonly TRow[]\n): RowPatchLog<TRow> | undefined {\n  return PATCH_LOGS.get(rows) as RowPatchLog<TRow> | undefined;\n}\n\nfunction rememberLog<TRow>(log: RowPatchLog<TRow>): void {\n  if (log.events.length === 0) return;\n  PATCH_LOGS.set(log.rows, log);\n}\n\n/** Apply one patch to a working copy. Returns the event when something changed. */\nfunction applyOne<TRow>(\n  list: TRow[],\n  patch: RowPatch<TRow>,\n  getRowId: (row: TRow) => string\n): RowPatchEvent<TRow> | undefined {\n  if (patch.type === \"insert\") {\n    const index = insertIndex(patch.at, list.length);\n    list.splice(index, 0, patch.row);\n    return { type: \"insert\", id: getRowId(patch.row), row: patch.row, index };\n  }\n\n  if (patch.type === \"remove\") {\n    const index = indexOfId(list, patch.id, getRowId);\n    if (index === -1) return undefined;\n    const row = list[index]!;\n    list.splice(index, 1);\n    return { type: \"remove\", id: patch.id, row, index };\n  }\n\n  if (patch.type === \"upsert\") {\n    const id = getRowId(patch.row);\n    const index = indexOfId(list, id, getRowId);\n    if (index === -1) {\n      list.push(patch.row);\n      return { type: \"insert\", id, row: patch.row, index: list.length - 1 };\n    }\n    // Re-upserting the row already in place is not a change, and replacing it\n    // with itself would invalidate every per-row memo for nothing.\n    const prev = list[index]!;\n    if (prev === patch.row) return undefined;\n    list[index] = patch.row;\n    return { type: \"update\", id, prev, next: patch.row, index };\n  }\n\n  const index = indexOfId(list, patch.id, getRowId);\n  const existing = list[index];\n  if (!existing) return undefined;\n  // An update that changes nothing must not replace the row object, or every\n  // per-row memo downstream would be invalidated for no reason.\n  if (alreadyApplied(existing, patch.changes)) return undefined;\n  const next = { ...existing, ...patch.changes };\n  list[index] = next;\n  return { type: \"update\", id: patch.id, prev: existing, next, index };\n}\n\n/**\n * Apply patches to a row set, in order, and return the result.\n *\n * Returns the original array — the same reference — when no patch changed\n * anything. Rows that no patch touched keep their object identity.\n *\n * @typeParam TRow - The row type.\n * @param rows - The current rows.\n * @param patches - The changes to apply, in order.\n * @param getRowId - How a row's id is derived; the table's own `rowKey`.\n */\nexport function applyRowPatches<TRow>(\n  rows: readonly TRow[],\n  patches: readonly RowPatch<TRow>[],\n  getRowId: (row: TRow) => string\n): readonly TRow[] {\n  return applyRowPatchesWithLog(rows, patches, getRowId).rows;\n}\n\n/**\n * Apply patches and return the events each real mutation produced.\n *\n * {@link applyRowPatches} is this without the log. Incremental re-evaluation\n * sits on the log so a 200-update burst does not walk 20k rows looking for\n * what changed.\n *\n * @typeParam TRow - The row type.\n * @param rows - The current rows.\n * @param patches - The changes to apply, in order.\n * @param getRowId - How a row's id is derived; the table's own `rowKey`.\n */\nexport function applyRowPatchesWithLog<TRow>(\n  rows: readonly TRow[],\n  patches: readonly RowPatch<TRow>[],\n  getRowId: (row: TRow) => string\n): RowPatchLog<TRow> {\n  const working = [...rows];\n  const events: RowPatchEvent<TRow>[] = [];\n  for (const patch of patches) {\n    // Every patch runs, so a later one acts on what an earlier one did.\n    const event = applyOne(working, patch, getRowId);\n    if (event) events.push(event);\n  }\n  const log: RowPatchLog<TRow> = {\n    rows: events.length > 0 ? working : rows,\n    events,\n  };\n  rememberLog(log);\n  return log;\n}\n","/**\n * Incremental re-evaluation of a patched row set.\n *\n * {@link applyRowPatches} is the data path — it still owns the rows. This\n * module sits on the patch log and re-runs search, filters, sort, grouping\n * and aggregates for the rows a patch touched, instead of walking the\n * whole set again.\n *\n * Build a snapshot with {@link createIncrementalView}, then feed patches\n * through {@link applyRowPatchesToView}. A host that already called\n * `applyRowPatches` can pass {@link rowPatchLog} into\n * {@link applyRowPatchLogToView} so the same patches are not applied twice.\n */\nimport type { ReactNode } from \"react\";\n\nimport {\n  aggregate,\n  type AggregateOptions,\n  type AggregateSpec,\n} from \"../aggregate/aggregate\";\nimport {\n  type BuildGroupedFlatModelOptions,\n  flattenGroupPartitions,\n  type GroupAggregatesFn,\n  type GroupedFlatEntry,\n  groupingKeys,\n  type GroupNode,\n  type GroupPaging,\n  type GroupSort,\n  makeGroupRowKey,\n  partitionGroupedRows,\n} from \"../grouping/groupRows\";\nimport {\n  compareSortEntries,\n  compareSortLevel,\n  sortedInsertIndex,\n  type SortLevel,\n  sortRows,\n  sortRowsMulti,\n} from \"../sort/compare\";\nimport type { QueryFilterGroup } from \"../source/queryContract\";\nimport type {\n  ColumnDef,\n  ExtraFilters,\n  SortableValue,\n  SortDirection,\n} from \"../types\";\nimport { stableKey } from \"../utils/stableKey\";\nimport {\n  addAggregateRow,\n  createIncrementalAggregate,\n  type IncrementalAggregate,\n  readIncrementalAggregate,\n  removeAggregateRow,\n  replaceAggregateRow,\n} from \"./incrementalAggregate\";\nimport {\n  addGroupedRow,\n  type IncrementalGroupTree,\n  incrementalGroupTree,\n  moveGroupedRow,\n  removeGroupedRow,\n  rowGroupPath,\n  snapshotPartitions,\n} from \"./incrementalGroup\";\nimport {\n  applyRowPatchesWithLog,\n  type RowPatch,\n  type RowPatchEvent,\n  type RowPatchLog,\n} from \"./patch\";\n\nexport { rowPatchLog } from \"./patch\";\n\n/** How the table turns a row set into a filtered, sorted, grouped view. */\nexport interface IncrementalViewConfig<TRow> {\n  /** How a row's id is derived; the table's own `rowKey`. */\n  getRowId: (row: TRow) => string;\n  /**\n   * Project a row to its searchable text. Defaults to a flatten of the\n   * row's own values — the same default `useFrontendData` uses.\n   */\n  getSearchText?: (row: TRow) => string;\n  /** Active search term. Empty / omitted means no search. */\n  search?: string;\n  /** Client-side extra-filter predicate. */\n  filterFn?: (row: TRow, extra: ExtraFilters) => boolean;\n  /** The extra-filter bag `filterFn` reads. */\n  extra?: ExtraFilters;\n  /**\n   * Evaluate the AND/OR filter tree against a row. Omit and the tree is\n   * stored but not applied — same seam as `useFrontendData`.\n   */\n  filterTreeFn?: (row: TRow, tree: QueryFilterGroup) => boolean;\n  /** The active filter tree, when there is one. */\n  filterTree?: QueryFilterGroup;\n  /** Columns — sort and group values resolve through these. */\n  columns?: readonly ColumnDef<TRow>[];\n  /** Override a column's sort value. */\n  getSortValue?: (row: TRow, columnKey: string) => SortableValue;\n  /** Single-column sort. Ignored when `sortLevels` is non-empty. */\n  sortBy?: string;\n  /** Single-column sort direction. */\n  sortDir?: SortDirection;\n  /** Multi-column sort chain. Supersedes `sortBy` / `sortDir`. */\n  sortLevels?: readonly SortLevel[];\n  /** Group by one key, or several for a nested grouping. */\n  groupBy?: string | readonly string[];\n  /** Per-group cells — same signature as `summaryRow`. */\n  groupAggregates?: GroupAggregatesFn<TRow>;\n  /** Order groups within their parent. */\n  groupSort?: GroupSort<TRow>;\n  /** Keep only the groups this answers true for. */\n  groupFilter?: (group: GroupNode<TRow>) => boolean;\n  /** Close every group with a footer row. */\n  groupFooters?: boolean;\n  /** Collapsed group keys. */\n  collapsedGroupIds?: ReadonlySet<string>;\n  /** Override the blank-group label. */\n  blankLabel?: string;\n  /** Page size for top-level groups. */\n  groupPageSize?: number;\n  /** Page size for leaves inside a group. */\n  rowPageSize?: number;\n  /** How many extra groups / rows are currently revealed. */\n  paging?: GroupPaging;\n  /** Grand-total mapper over the sorted (filtered) set. */\n  summaryRow?: (rows: readonly TRow[]) => Partial<Record<string, ReactNode>>;\n  /**\n   * Built-in aggregate spec for incremental totals. Used for the grand\n   * total when `summaryRow` is omitted, and for group cells when\n   * `groupAggregates` is omitted.\n   */\n  aggregateSpec?: AggregateSpec;\n  /** Options for {@link IncrementalViewConfig.aggregateSpec}. */\n  aggregateOptions?: AggregateOptions<TRow>;\n}\n\n/**\n * A derived snapshot of a row set. The latest snapshot is the only one\n * {@link applyRowPatchesToView} may be called on — applying to a stale\n * snapshot rebuilds from its `rows` instead of continuing incrementally.\n */\nexport interface IncrementalView<TRow> {\n  /** Source rows after patches — same contract as {@link applyRowPatches}. */\n  readonly rows: readonly TRow[];\n  /** After search, extra filters and the filter tree. */\n  readonly filtered: readonly TRow[];\n  /** After sort, or `filtered` when unsorted. */\n  readonly sorted: readonly TRow[];\n  /** Grouped flat model, when grouping is configured. */\n  readonly groups: readonly GroupedFlatEntry<TRow>[] | undefined;\n  /** Grand-total cells over `sorted`. */\n  readonly aggregates: Partial<Record<string, ReactNode>> | undefined;\n}\n\ninterface ViewState<TRow> {\n  config: IncrementalViewConfig<TRow>;\n  searchText: Map<string, string>;\n  sortValues: Map<string, readonly SortableValue[]>;\n  filtered: TRow[];\n  filteredSourceIndex: number[];\n  filteredPos: Map<string, number>;\n  sorted: TRow[];\n  sortedPos: Map<string, number>;\n  tree: IncrementalGroupTree<TRow> | undefined;\n  summary: IncrementalAggregate<TRow> | undefined;\n  summaryDirty: boolean;\n  groupCells: Map<string, Partial<Record<string, ReactNode>>>;\n  dirtyGroups: Set<string>;\n}\n\ntype FilterDelta<TRow> =\n  | { kind: \"none\" }\n  | { kind: \"enter\"; id: string; row: TRow }\n  | { kind: \"leave\"; id: string; row: TRow }\n  | { kind: \"replace\"; id: string; prev: TRow; next: TRow };\n\nconst STATES = new WeakMap<IncrementalView<unknown>, ViewState<unknown>>();\nconst VIEWS = new WeakMap<readonly unknown[], IncrementalView<unknown>>();\n\n/**\n * The snapshot {@link createIncrementalView} attached to a derived row\n * array (`rows` / `filtered` / `sorted`, or a page slice the host\n * attached). Spreading that array drops the link, same as\n * {@link rowPatchLog}.\n */\nexport function incrementalViewOf<TRow>(\n  rows: readonly TRow[]\n): IncrementalView<TRow> | undefined {\n  return VIEWS.get(rows) as IncrementalView<TRow> | undefined;\n}\n\n/**\n * Point a derived array (a page slice) at the snapshot it came from, so\n * {@link incrementalViewOf} can find aggregates / groups without a\n * second argument.\n */\nexport function attachIncrementalView<TRow>(\n  rows: readonly TRow[],\n  view: IncrementalView<TRow>\n): void {\n  VIEWS.set(rows, view);\n}\n\n/** The config the snapshot was last built or reconfigured with. */\nexport function incrementalViewConfig<TRow>(\n  view: IncrementalView<TRow>\n): IncrementalViewConfig<TRow> | undefined {\n  return getState(view)?.config;\n}\n\n/**\n * Merge new settings into a snapshot without walking the row set when\n * only grouping / summary extras changed.\n *\n * Filter, sort and search changes rebuild the derived arrays. Grouping\n * and summary extras rebuild only those stages and keep `filtered` /\n * `sorted` identity. A patch that only replaces a callback or a\n * `columns` array with the same keys returns the same view object —\n * hosts rebuild those every render, and a new view identity must not\n * ripple into the page slice.\n *\n * @typeParam TRow - The row type.\n * @param view - The latest snapshot.\n * @param patch - Fields to merge. `undefined` entries are ignored.\n */\nexport function configureIncrementalView<TRow>(\n  view: IncrementalView<TRow>,\n  patch: Partial<IncrementalViewConfig<TRow>>\n): IncrementalView<TRow> {\n  const state = getState(view);\n  if (!state) {\n    throw new Error(\n      \"configureIncrementalView needs a snapshot from createIncrementalView\"\n    );\n  }\n  const merged: IncrementalViewConfig<TRow> = {\n    ...state.config,\n    ...definedConfigPatch(patch),\n  };\n  const queryChanged =\n    queryConfigFingerprint(state.config) !== queryConfigFingerprint(merged);\n  const derivedChanged =\n    derivedConfigFingerprint(state.config) !== derivedConfigFingerprint(merged);\n  state.config = merged;\n  if (!queryChanged && !derivedChanged) return view;\n  if (queryChanged) return createIncrementalView(view.rows, merged);\n  return republishDerived(view, state, merged);\n}\n\n/**\n * Default searchable-text projector: flatten a row's own values. Kept\n * here so this module does not import the React hook that publishes the\n * same helper on `useFrontendData`.\n */\nexport function incrementalSearchText<TRow>(row: TRow): string {\n  if (row && typeof row === \"object\") {\n    return Object.values(row)\n      .map((value) => {\n        if (value == null) return \"\";\n        if (typeof value === \"object\") return JSON.stringify(value);\n        return String(value as string | number | boolean);\n      })\n      .join(\" \");\n  }\n  return String(row ?? \"\");\n}\n\n/**\n * Build a snapshot by fully evaluating `rows`. Patches after this go\n * through {@link applyRowPatchesToView} so only touched rows are\n * re-evaluated.\n *\n * @typeParam TRow - The row type.\n * @param rows - The current source rows.\n * @param config - Filter / sort / group / aggregate settings.\n */\nexport function createIncrementalView<TRow>(\n  rows: readonly TRow[],\n  config: IncrementalViewConfig<TRow>\n): IncrementalView<TRow> {\n  const getId = config.getRowId;\n  const filtered = hasFilter(config)\n    ? rows.filter((row) => rowMatches(row, config))\n    : [...rows];\n  const sorted = hasSort(config) ? fullSort(filtered, config) : filtered;\n  const keys = groupingKeys(config.groupBy ?? []);\n  const columns = config.columns ?? [];\n  const partitions =\n    keys.length > 0 ? partitionGroupedRows(sorted, keys, columns) : [];\n  const tree =\n    keys.length > 0\n      ? incrementalGroupTree(partitions, keys, columns)\n      : undefined;\n  const groups =\n    keys.length > 0\n      ? flattenGroupPartitions(partitions, groupFlattenOptions(config))\n      : undefined;\n  const summary = config.aggregateSpec\n    ? createIncrementalAggregate(\n        config.aggregateSpec,\n        sorted,\n        config.aggregateOptions\n      )\n    : undefined;\n  const aggregates = readSummary(sorted, config, summary);\n  const state: ViewState<TRow> = {\n    config,\n    searchText: new Map(),\n    sortValues: new Map(),\n    filtered: filtered,\n    filteredSourceIndex: sourceIndices(filtered, rows, getId),\n    filteredPos: indexMap(filtered, getId),\n    sorted: sorted,\n    sortedPos: indexMap(sorted, getId),\n    tree,\n    summary,\n    summaryDirty: false,\n    groupCells: new Map(),\n    dirtyGroups: new Set(),\n  };\n  warmCaches(state, filtered, config);\n  if (groups) cacheGroupCells(state, groups);\n  return publish(rows, filtered, sorted, groups, aggregates, state);\n}\n\n/**\n * Apply patches to a snapshot: {@link applyRowPatches} for the rows, then\n * incremental re-evaluation of every derived stage.\n *\n * @typeParam TRow - The row type.\n * @param view - The latest snapshot.\n * @param patches - The changes to apply, in order.\n */\nexport function applyRowPatchesToView<TRow>(\n  view: IncrementalView<TRow>,\n  patches: readonly RowPatch<TRow>[]\n): IncrementalView<TRow> {\n  const state = getState(view);\n  if (!state) {\n    throw new Error(\n      \"applyRowPatchesToView needs a snapshot from createIncrementalView\"\n    );\n  }\n  return applyRowPatchLogToView(\n    view,\n    applyRowPatchesWithLog(view.rows, patches, state.config.getRowId)\n  );\n}\n\n/**\n * Continue a snapshot from a log {@link applyRowPatches} already produced.\n * Use this when the host applied the patches itself and the incremental\n * view must not apply them a second time.\n *\n * @typeParam TRow - The row type.\n * @param view - The snapshot taken against the pre-patch rows.\n * @param log - The log attached to the post-patch array.\n */\nexport function applyRowPatchLogToView<TRow>(\n  view: IncrementalView<TRow>,\n  log: RowPatchLog<TRow>\n): IncrementalView<TRow> {\n  const state = getState(view);\n  if (!state) {\n    throw new Error(\n      \"applyRowPatchLogToView needs a snapshot from createIncrementalView\"\n    );\n  }\n  if (log.events.length === 0) return view;\n  const config = state.config;\n  if (!needsDerived(config)) {\n    return publish(log.rows, log.rows, log.rows, undefined, undefined, state);\n  }\n\n  state.filtered = state.filtered.slice();\n  state.filteredSourceIndex = state.filteredSourceIndex.slice();\n  state.sorted = state.sorted.slice();\n\n  const source = [...view.rows];\n  for (const event of log.events) {\n    applySourceEvent(source, event);\n    const delta = applyFilterEvent(state, event, source, config);\n    applySortEvent(state, delta, config);\n    applyGroupEvent(state, delta, config);\n    applySummaryEvent(state, delta, config);\n  }\n\n  const filtered = hasFilter(config) ? state.filtered : log.rows;\n  const sorted = hasSort(config) ? state.sorted : filtered;\n  state.filtered = filtered as TRow[];\n  state.sorted = sorted as TRow[];\n  state.filteredPos = indexMap(filtered, config.getRowId);\n  state.sortedPos = indexMap(sorted, config.getRowId);\n\n  const groups = state.tree\n    ? paintGroups(\n        flattenGroupPartitions(\n          snapshotPartitions(state.tree),\n          groupFlattenOptions(config, true)\n        ),\n        state,\n        config\n      )\n    : undefined;\n  const aggregates = readSummary(sorted, config, state.summary);\n  state.summaryDirty = false;\n  return publish(log.rows, filtered, sorted, groups, aggregates, state);\n}\n\nfunction getState<TRow>(\n  view: IncrementalView<TRow>\n): ViewState<TRow> | undefined {\n  return STATES.get(view) as ViewState<TRow> | undefined;\n}\n\nfunction publish<TRow>(\n  rows: readonly TRow[],\n  filtered: readonly TRow[],\n  sorted: readonly TRow[],\n  groups: readonly GroupedFlatEntry<TRow>[] | undefined,\n  aggregates: Partial<Record<string, ReactNode>> | undefined,\n  state: ViewState<TRow>\n): IncrementalView<TRow> {\n  const view: IncrementalView<TRow> = {\n    rows,\n    filtered,\n    sorted,\n    groups,\n    aggregates,\n  };\n  STATES.set(view, state as ViewState<unknown>);\n  VIEWS.set(rows, view);\n  VIEWS.set(filtered, view);\n  VIEWS.set(sorted, view);\n  return view;\n}\n\nfunction republishDerived<TRow>(\n  view: IncrementalView<TRow>,\n  state: ViewState<TRow>,\n  config: IncrementalViewConfig<TRow>\n): IncrementalView<TRow> {\n  const keys = groupingKeys(config.groupBy ?? []);\n  const columns = config.columns ?? [];\n  const partitions =\n    keys.length > 0 ? partitionGroupedRows(state.sorted, keys, columns) : [];\n  state.tree =\n    keys.length > 0\n      ? incrementalGroupTree(partitions, keys, columns)\n      : undefined;\n  state.groupCells = new Map();\n  state.dirtyGroups = new Set();\n  const groups =\n    keys.length > 0\n      ? flattenGroupPartitions(partitions, groupFlattenOptions(config))\n      : undefined;\n  if (groups) cacheGroupCells(state, groups);\n  state.summary = config.aggregateSpec\n    ? createIncrementalAggregate(\n        config.aggregateSpec,\n        state.sorted,\n        config.aggregateOptions\n      )\n    : undefined;\n  state.summaryDirty = false;\n  return publish(\n    view.rows,\n    view.filtered,\n    view.sorted,\n    groups,\n    readSummary(state.sorted, config, state.summary),\n    state\n  );\n}\n\nfunction definedConfigPatch<TRow>(\n  patch: Partial<IncrementalViewConfig<TRow>>\n): Partial<IncrementalViewConfig<TRow>> {\n  const defined: Partial<IncrementalViewConfig<TRow>> = {};\n  for (const key of Object.keys(\n    patch\n  ) as (keyof IncrementalViewConfig<TRow>)[]) {\n    const value = patch[key];\n    if (value !== undefined) Object.assign(defined, { [key]: value });\n  }\n  return defined;\n}\n\nfunction queryConfigFingerprint<TRow>(\n  config: IncrementalViewConfig<TRow>\n): string {\n  return stableKey({\n    search: config.search ?? \"\",\n    extra: config.extra ?? {},\n    filterTree: config.filterTree ?? null,\n    sortBy: config.sortBy ?? null,\n    sortDir: config.sortDir ?? null,\n    sortLevels: (config.sortLevels ?? []).map((level) => ({\n      key: level.key,\n      dir: level.dir,\n    })),\n    columnKeys: (config.columns ?? []).map((column) => column.key),\n    hasFilterFn: config.filterFn !== undefined,\n    hasFilterTreeFn: config.filterTreeFn !== undefined,\n    hasGetSortValue: config.getSortValue !== undefined,\n  });\n}\n\nfunction derivedConfigFingerprint<TRow>(\n  config: IncrementalViewConfig<TRow>\n): string {\n  return stableKey({\n    groupBy: groupingKeys(config.groupBy ?? []),\n    groupFooters: Boolean(config.groupFooters),\n    collapsed: config.collapsedGroupIds\n      ? [...config.collapsedGroupIds].sort((a, b) => a.localeCompare(b))\n      : [],\n    groupPageSize: config.groupPageSize ?? null,\n    rowPageSize: config.rowPageSize ?? null,\n    paging: config.paging ?? null,\n    blankLabel: config.blankLabel ?? null,\n    hasGroupAggregates: config.groupAggregates !== undefined,\n    hasGroupSort: config.groupSort !== undefined,\n    hasGroupFilter: config.groupFilter !== undefined,\n    hasSummaryRow: config.summaryRow !== undefined,\n    hasAggregateSpec: config.aggregateSpec !== undefined,\n  });\n}\n\nfunction needsDerived<TRow>(config: IncrementalViewConfig<TRow>): boolean {\n  return (\n    hasFilter(config) ||\n    hasSort(config) ||\n    groupingKeys(config.groupBy ?? []).length > 0 ||\n    config.summaryRow !== undefined ||\n    config.aggregateSpec !== undefined\n  );\n}\n\nfunction hasFilter<TRow>(config: IncrementalViewConfig<TRow>): boolean {\n  return (\n    Boolean(searchTerm(config)) ||\n    config.filterFn !== undefined ||\n    (config.filterTree !== undefined && config.filterTreeFn !== undefined)\n  );\n}\n\nfunction hasSort<TRow>(config: IncrementalViewConfig<TRow>): boolean {\n  if (config.sortLevels && config.sortLevels.length > 0) return true;\n  return Boolean(config.sortBy && config.sortDir);\n}\n\nfunction searchTerm<TRow>(config: IncrementalViewConfig<TRow>): string {\n  return config.search?.trim().toLowerCase() ?? \"\";\n}\n\nfunction rowMatches<TRow>(\n  row: TRow,\n  config: IncrementalViewConfig<TRow>,\n  cachedText?: string\n): boolean {\n  const term = searchTerm(config);\n  if (term) {\n    const projector = config.getSearchText ?? incrementalSearchText;\n    const text = (cachedText ?? projector(row)).toLowerCase();\n    if (!text.includes(term)) return false;\n  }\n  if (config.filterFn && !config.filterFn(row, config.extra ?? {})) {\n    return false;\n  }\n  if (\n    config.filterTree &&\n    config.filterTreeFn &&\n    !config.filterTreeFn(row, config.filterTree)\n  ) {\n    return false;\n  }\n  return true;\n}\n\nfunction fullSort<TRow>(\n  rows: readonly TRow[],\n  config: IncrementalViewConfig<TRow>\n): TRow[] {\n  const levels = config.sortLevels;\n  if (levels && levels.length > 0) {\n    return sortRowsMulti(rows, levels, (row, key) =>\n      resolveSortValue(row, key, config)\n    );\n  }\n  return sortRows(\n    rows,\n    (row) => resolveSortValue(row, config.sortBy!, config),\n    config.sortDir!\n  );\n}\n\nfunction resolveSortValue<TRow>(\n  row: TRow,\n  key: string,\n  config: IncrementalViewConfig<TRow>\n): SortableValue {\n  if (config.getSortValue) return config.getSortValue(row, key);\n  const column = config.columns?.find((item) => item.key === key);\n  // A column that declares `sortValue` owns its whole ordering, including the\n  // rows it answers `null` for — that answer means \"this one has no place in\n  // the order\", and the comparator groups those at the end. Reading the\n  // accessor for those rows instead would order one column by two different\n  // extractors at once: some rows by their value, the rest by their rendered\n  // text, with nothing on screen to say which row got which.\n  if (column?.sortValue) return column.sortValue(row);\n  return toSortable(column?.accessor?.(row));\n}\n\nfunction toSortable(value: unknown): SortableValue {\n  return typeof value === \"string\" ||\n    typeof value === \"number\" ||\n    typeof value === \"boolean\"\n    ? value\n    : null;\n}\n\nfunction warmCaches<TRow>(\n  state: ViewState<TRow>,\n  filtered: readonly TRow[],\n  config: IncrementalViewConfig<TRow>\n): void {\n  const getId = config.getRowId;\n  const term = searchTerm(config);\n  const projector = config.getSearchText ?? incrementalSearchText;\n  for (const row of filtered) {\n    const id = getId(row);\n    if (term) state.searchText.set(id, projector(row));\n    if (hasSort(config)) state.sortValues.set(id, sortKeyOf(row, config));\n  }\n}\n\nfunction sortKeyOf<TRow>(\n  row: TRow,\n  config: IncrementalViewConfig<TRow>\n): SortableValue[] {\n  const levels = config.sortLevels;\n  if (levels && levels.length > 0) {\n    return levels.map((level) => resolveSortValue(row, level.key, config));\n  }\n  return [resolveSortValue(row, config.sortBy!, config)];\n}\n\nfunction applySourceEvent<TRow>(\n  source: TRow[],\n  event: RowPatchEvent<TRow>\n): void {\n  if (event.type === \"insert\") {\n    source.splice(event.index, 0, event.row);\n    return;\n  }\n  if (event.type === \"remove\") {\n    source.splice(event.index, 1);\n    return;\n  }\n  source[event.index] = event.next;\n}\n\nfunction applyFilterEvent<TRow>(\n  state: ViewState<TRow>,\n  event: RowPatchEvent<TRow>,\n  source: readonly TRow[],\n  config: IncrementalViewConfig<TRow>\n): FilterDelta<TRow> {\n  if (!hasFilter(config)) {\n    state.filtered = source as TRow[];\n    state.filteredSourceIndex = source.map((_, index) => index);\n    return sourceDelta(event);\n  }\n  if (event.type === \"insert\") return filterInsert(state, event, config);\n  if (event.type === \"remove\") return filterRemove(state, event, config);\n  return filterUpdate(state, event, config);\n}\n\nfunction sourceDelta<TRow>(event: RowPatchEvent<TRow>): FilterDelta<TRow> {\n  if (event.type === \"insert\") {\n    return { kind: \"enter\", id: event.id, row: event.row };\n  }\n  if (event.type === \"remove\") {\n    return { kind: \"leave\", id: event.id, row: event.row };\n  }\n  return { kind: \"replace\", id: event.id, prev: event.prev, next: event.next };\n}\n\nfunction filterInsert<TRow>(\n  state: ViewState<TRow>,\n  event: Extract<RowPatchEvent<TRow>, { type: \"insert\" }>,\n  config: IncrementalViewConfig<TRow>\n): FilterDelta<TRow> {\n  const at = firstIndexAtLeast(state.filteredSourceIndex, event.index);\n  for (let i = at; i < state.filteredSourceIndex.length; i++) {\n    state.filteredSourceIndex[i]! += 1;\n  }\n  rememberSearch(state, event.id, event.row, config);\n  if (!rowMatches(event.row, config, state.searchText.get(event.id))) {\n    return { kind: \"none\" };\n  }\n  state.filtered.splice(at, 0, event.row);\n  state.filteredSourceIndex.splice(at, 0, event.index);\n  return { kind: \"enter\", id: event.id, row: event.row };\n}\n\nfunction filterRemove<TRow>(\n  state: ViewState<TRow>,\n  event: Extract<RowPatchEvent<TRow>, { type: \"remove\" }>,\n  config: IncrementalViewConfig<TRow>\n): FilterDelta<TRow> {\n  const at = state.filtered.findIndex(\n    (row) => config.getRowId(row) === event.id\n  );\n  forgetRow(state, event.id);\n  for (let i = 0; i < state.filteredSourceIndex.length; i++) {\n    if (state.filteredSourceIndex[i]! > event.index) {\n      state.filteredSourceIndex[i]! -= 1;\n    }\n  }\n  if (at === -1) return { kind: \"none\" };\n  state.filtered.splice(at, 1);\n  state.filteredSourceIndex.splice(at, 1);\n  return { kind: \"leave\", id: event.id, row: event.row };\n}\n\nfunction filterUpdate<TRow>(\n  state: ViewState<TRow>,\n  event: Extract<RowPatchEvent<TRow>, { type: \"update\" }>,\n  config: IncrementalViewConfig<TRow>\n): FilterDelta<TRow> {\n  const at = state.filtered.findIndex(\n    (row) => config.getRowId(row) === event.id\n  );\n  rememberSearch(state, event.id, event.next, config);\n  const matches = rowMatches(\n    event.next,\n    config,\n    state.searchText.get(event.id)\n  );\n  if (at !== -1 && matches) {\n    state.filtered[at] = event.next;\n    return {\n      kind: \"replace\",\n      id: event.id,\n      prev: event.prev,\n      next: event.next,\n    };\n  }\n  if (at !== -1 && !matches) {\n    state.filtered.splice(at, 1);\n    state.filteredSourceIndex.splice(at, 1);\n    return { kind: \"leave\", id: event.id, row: event.prev };\n  }\n  if (at === -1 && matches) {\n    const insertAt = firstIndexAtLeast(state.filteredSourceIndex, event.index);\n    state.filtered.splice(insertAt, 0, event.next);\n    state.filteredSourceIndex.splice(insertAt, 0, event.index);\n    return { kind: \"enter\", id: event.id, row: event.next };\n  }\n  return { kind: \"none\" };\n}\n\nfunction applySortEvent<TRow>(\n  state: ViewState<TRow>,\n  delta: FilterDelta<TRow>,\n  config: IncrementalViewConfig<TRow>\n): void {\n  if (!hasSort(config)) {\n    state.sorted = state.filtered;\n    state.sortedPos = indexMap(state.filtered, config.getRowId);\n    return;\n  }\n  if (delta.kind === \"none\") return;\n  state.filteredPos = indexMap(state.filtered, config.getRowId);\n  if (delta.kind === \"enter\") {\n    insertSorted(state, delta.row, config);\n  } else if (delta.kind === \"leave\") {\n    removeSorted(state, delta.id, config);\n  } else {\n    replaceSorted(state, delta.prev, delta.next, config);\n  }\n  state.sortedPos = indexMap(state.sorted, config.getRowId);\n}\n\nfunction insertSorted<TRow>(\n  state: ViewState<TRow>,\n  row: TRow,\n  config: IncrementalViewConfig<TRow>\n): void {\n  const key = sortKeyOf(row, config);\n  state.sortValues.set(config.getRowId(row), key);\n  const at = sortedInsertIndex(state.sorted, (item) =>\n    compareCached(item, row, state, config)\n  );\n  state.sorted.splice(at, 0, row);\n}\n\nfunction removeSorted<TRow>(\n  state: ViewState<TRow>,\n  id: string,\n  config: IncrementalViewConfig<TRow>\n): void {\n  const at = state.sorted.findIndex((row) => config.getRowId(row) === id);\n  if (at !== -1) state.sorted.splice(at, 1);\n  state.sortValues.delete(id);\n}\n\nfunction replaceSorted<TRow>(\n  state: ViewState<TRow>,\n  _prev: TRow,\n  next: TRow,\n  config: IncrementalViewConfig<TRow>\n): void {\n  const id = config.getRowId(next);\n  const prevKey = state.sortValues.get(id);\n  const nextKey = sortKeyOf(next, config);\n  state.sortValues.set(id, nextKey);\n  if (sameSortKey(prevKey, nextKey)) {\n    const at = state.sorted.findIndex((row) => config.getRowId(row) === id);\n    if (at !== -1) state.sorted[at] = next;\n    return;\n  }\n  removeSorted(state, id, config);\n  state.sortValues.set(id, nextKey);\n  insertSorted(state, next, config);\n}\n\nfunction compareCached<TRow>(\n  item: TRow,\n  target: TRow,\n  state: ViewState<TRow>,\n  config: IncrementalViewConfig<TRow>\n): number {\n  const getId = config.getRowId;\n  const itemId = getId(item);\n  const targetId = getId(target);\n  const itemIndex = state.filteredPos.get(itemId) ?? 0;\n  const targetIndex = state.filteredPos.get(targetId) ?? 0;\n  const itemKeys = state.sortValues.get(itemId) ?? sortKeyOf(item, config);\n  const targetKeys =\n    state.sortValues.get(targetId) ?? sortKeyOf(target, config);\n  const levels = config.sortLevels;\n  if (levels && levels.length > 0) {\n    for (const [i, level] of levels.entries()) {\n      const decided = compareSortLevel(itemKeys[i], targetKeys[i], level.dir);\n      if (decided !== undefined) return decided;\n    }\n    return itemIndex - targetIndex;\n  }\n  return compareSortEntries(\n    { value: itemKeys[0], index: itemIndex },\n    { value: targetKeys[0], index: targetIndex },\n    config.sortDir!\n  );\n}\n\nfunction sameSortKey(\n  prev: readonly SortableValue[] | undefined,\n  next: readonly SortableValue[]\n): boolean {\n  return (\n    prev?.length === next.length &&\n    prev.every((value, i) => Object.is(value, next[i]))\n  );\n}\n\nfunction applyGroupEvent<TRow>(\n  state: ViewState<TRow>,\n  delta: FilterDelta<TRow>,\n  config: IncrementalViewConfig<TRow>\n): void {\n  const tree = state.tree;\n  if (!tree || delta.kind === \"none\") return;\n  const getId = config.getRowId;\n  if (delta.kind === \"enter\") {\n    const path = rowGroupPath(delta.row, tree.keys, tree.columns);\n    addGroupedRow(tree, delta.row, path, state.sortedPos, getId);\n    markDirtyPath(state, tree.keys, path);\n    return;\n  }\n  if (delta.kind === \"leave\") {\n    const path = rowGroupPath(delta.row, tree.keys, tree.columns);\n    removeGroupedRow(tree, delta.id, path, state.sortedPos, getId);\n    markDirtyPath(state, tree.keys, path);\n    return;\n  }\n  const prevPath = rowGroupPath(delta.prev, tree.keys, tree.columns);\n  const nextPath = rowGroupPath(delta.next, tree.keys, tree.columns);\n  moveGroupedRow(\n    tree,\n    delta.prev,\n    delta.next,\n    prevPath,\n    nextPath,\n    state.sortedPos,\n    getId\n  );\n  markDirtyPath(state, tree.keys, prevPath);\n  markDirtyPath(state, tree.keys, nextPath);\n}\n\nfunction markDirtyPath<TRow>(\n  state: ViewState<TRow>,\n  keys: readonly string[],\n  path: readonly { valueKey: string }[]\n): void {\n  const valueKeys = path.map((step) => step.valueKey);\n  for (let i = 0; i < path.length; i++) {\n    state.dirtyGroups.add(\n      makeGroupRowKey(keys.slice(0, i + 1), valueKeys.slice(0, i + 1))\n    );\n  }\n}\n\nfunction applySummaryEvent<TRow>(\n  state: ViewState<TRow>,\n  delta: FilterDelta<TRow>,\n  config: IncrementalViewConfig<TRow>\n): void {\n  if (delta.kind === \"none\") return;\n  if (config.summaryRow && !config.aggregateSpec) {\n    state.summaryDirty = true;\n    return;\n  }\n  if (!state.summary) return;\n  if (delta.kind === \"enter\") addAggregateRow(state.summary, delta.row);\n  else if (delta.kind === \"leave\") removeAggregateRow(state.summary, delta.row);\n  else replaceAggregateRow(state.summary, delta.prev, delta.next);\n}\n\nfunction readSummary<TRow>(\n  rows: readonly TRow[],\n  config: IncrementalViewConfig<TRow>,\n  summary: IncrementalAggregate<TRow> | undefined\n): Partial<Record<string, ReactNode>> | undefined {\n  if (config.summaryRow) return config.summaryRow(rows);\n  if (summary) return readIncrementalAggregate(summary, rows);\n  return undefined;\n}\n\nfunction groupFlattenOptions<TRow>(\n  config: IncrementalViewConfig<TRow>,\n  skipAggregates = false\n): Omit<BuildGroupedFlatModelOptions<TRow>, \"rows\"> {\n  return {\n    groupBy: config.groupBy ?? [],\n    columns: config.columns ?? [],\n    getRowId: config.getRowId,\n    collapsedGroupIds: config.collapsedGroupIds ?? new Set(),\n    aggregates: skipAggregates ? undefined : config.groupAggregates,\n    blankLabel: config.blankLabel,\n    footers: config.groupFooters === true,\n    sort: config.groupSort,\n    filter: config.groupFilter,\n    groupPageSize: config.groupPageSize,\n    rowPageSize: config.rowPageSize,\n    paging: config.paging,\n  };\n}\n\nfunction paintGroups<TRow>(\n  entries: GroupedFlatEntry<TRow>[],\n  state: ViewState<TRow>,\n  config: IncrementalViewConfig<TRow>\n): GroupedFlatEntry<TRow>[] {\n  const seen = new Set<string>();\n  for (const entry of entries) {\n    if (entry.kind === \"group\") {\n      entry.aggregateCells = cellsForGroup(state, config, entry);\n      seen.add(entry.key);\n    } else if (entry.kind === \"groupFooter\") {\n      entry.aggregateCells = state.groupCells.get(entry.groupKey);\n    }\n  }\n  for (const key of state.groupCells.keys()) {\n    if (!seen.has(key)) state.groupCells.delete(key);\n  }\n  state.dirtyGroups.clear();\n  return entries;\n}\n\nfunction cellsForGroup<TRow>(\n  state: ViewState<TRow>,\n  config: IncrementalViewConfig<TRow>,\n  entry: Extract<GroupedFlatEntry<TRow>, { kind: \"group\" }>\n): Partial<Record<string, ReactNode>> | undefined {\n  if (!state.dirtyGroups.has(entry.key) && state.groupCells.has(entry.key)) {\n    return state.groupCells.get(entry.key);\n  }\n  const cells = groupCellsFrom(config, entry.leafRows);\n  if (cells) state.groupCells.set(entry.key, cells);\n  return cells;\n}\n\nfunction groupCellsFrom<TRow>(\n  config: IncrementalViewConfig<TRow>,\n  rows: readonly TRow[]\n): Partial<Record<string, ReactNode>> | undefined {\n  if (config.groupAggregates) return config.groupAggregates(rows);\n  if (config.aggregateSpec) {\n    return aggregate(config.aggregateSpec, config.aggregateOptions)(rows);\n  }\n  return undefined;\n}\n\nfunction cacheGroupCells<TRow>(\n  state: ViewState<TRow>,\n  groups: readonly GroupedFlatEntry<TRow>[]\n): void {\n  for (const entry of groups) {\n    if (entry.kind === \"group\" && entry.aggregateCells) {\n      state.groupCells.set(entry.key, entry.aggregateCells);\n    }\n  }\n}\n\nfunction rememberSearch<TRow>(\n  state: ViewState<TRow>,\n  id: string,\n  row: TRow,\n  config: IncrementalViewConfig<TRow>\n): void {\n  if (!searchTerm(config)) return;\n  const projector = config.getSearchText ?? incrementalSearchText;\n  state.searchText.set(id, projector(row));\n}\n\nfunction forgetRow<TRow>(state: ViewState<TRow>, id: string): void {\n  state.searchText.delete(id);\n  state.sortValues.delete(id);\n}\n\nfunction sourceIndices<TRow>(\n  filtered: readonly TRow[],\n  rows: readonly TRow[],\n  getId: (row: TRow) => string\n): number[] {\n  const index = new Map(rows.map((row, i) => [getId(row), i]));\n  return filtered.map((row) => index.get(getId(row)) ?? -1);\n}\n\nfunction indexMap<TRow>(\n  rows: readonly TRow[],\n  getId: (row: TRow) => string\n): Map<string, number> {\n  const map = new Map<string, number>();\n  for (let i = 0; i < rows.length; i++) map.set(getId(rows[i]!), i);\n  return map;\n}\n\nfunction firstIndexAtLeast(indices: readonly number[], value: number): number {\n  const at = indices.findIndex((index) => index >= value);\n  return at === -1 ? indices.length : at;\n}\n","import { useCallback, useMemo, useRef } from \"react\";\n\nimport { resolvePaginationMode, useIsMobile } from \"../hooks/useIsMobile\";\nimport {\n  applyRowPatchLogToView,\n  attachIncrementalView,\n  createIncrementalView,\n  incrementalSearchText,\n  type IncrementalView,\n  type IncrementalViewConfig,\n  incrementalViewConfig,\n  incrementalViewOf,\n} from \"../rows/incremental\";\nimport { type RowPatchLog, rowPatchLog } from \"../rows/patch\";\nimport type { SortLevel } from \"../sort/compare\";\nimport type {\n  ColumnDef,\n  ExtraFilters,\n  PaginationMode,\n  SortableValue,\n  SortDirection,\n} from \"../types\";\nimport {\n  useTableUrlState,\n  type UseTableUrlStateOptions,\n} from \"../url/useTableUrlState\";\nimport { devWarn } from \"../utils/devWarn\";\nimport { stableKey } from \"../utils/stableKey\";\nimport type { QueryFilterGroup } from \"./queryContract\";\nimport type { TableSource } from \"./TableSource\";\n\n/** Narrows an accessor's `ReactNode` to a sortable primitive, else `null`. */\nconst toSortable = (value: unknown): SortableValue =>\n  typeof value === \"string\" ||\n  typeof value === \"number\" ||\n  typeof value === \"boolean\"\n    ? value\n    : null;\n\n/**\n * Dev-only: surface a sort that cannot resolve values (a silent no-op).\n * The most common cause is forgetting to pass `columns` to the hook.\n */\nfunction warnUnresolvableSort<TRow>(\n  sortBy: string,\n  column: ColumnDef<TRow> | undefined,\n  rows: readonly TRow[],\n  getSortValue?: (row: TRow, columnKey: string) => SortableValue\n): void {\n  if (getSortValue) return;\n  if (!column) {\n    devWarn(\n      `sortBy \"${sortBy}\" matches no column — pass \\`columns\\` (or \\`getSortValue\\`) to useFrontendData so client-side sorting can resolve values.`\n    );\n    return;\n  }\n  const first = rows[0];\n  if (\n    !column.sortValue &&\n    first !== undefined &&\n    toSortable(column.accessor?.(first)) === null\n  ) {\n    devWarn(\n      `column \"${sortBy}\" has no sortable value — its accessor returns a non-primitive; add a \\`sortValue\\` extractor to the column.`\n    );\n  }\n}\n\n/** Options for {@link useFrontendData}. */\nexport interface UseFrontendDataOptions<TRow> extends Pick<\n  UseTableUrlStateOptions,\n  | \"urlAdapter\"\n  | \"urlSync\"\n  | \"defaults\"\n  | \"numberExtraKeys\"\n  | \"arrayExtraKeys\"\n  | \"urlKey\"\n> {\n  /** The source array. Filtered / sorted / sliced internally by state. */\n  data: readonly TRow[];\n  /**\n   * How a row's id is derived — the same function {@link applyRowPatches}\n   * used. Defaults to `String(row.id)` when the row has an `id`.\n   */\n  getRowId?: (row: TRow) => string;\n  /**\n   * Project a row to its searchable text. Defaults to a flatten of the\n   * row's own values; override to reach nested fields.\n   */\n  getSearchText?: (row: TRow) => string;\n  /**\n   * Resolve a row's sort value for a column key. Falls back to the\n   * matching column's `sortValue`.\n   */\n  getSortValue?: (row: TRow, columnKey: string) => SortableValue;\n  /** Columns — read for per-column `sortValue` when sorting. */\n  columns?: readonly ColumnDef<TRow>[];\n  /**\n   * Client-side filter predicate applied after search. Receives the active\n   * `extra` filter bag (driven by the filter drawer's `setExtra` calls), so a\n   * filter UI filters the rows with no extra wiring. Omit for no filtering.\n   */\n  filterFn?: (row: TRow, extra: ExtraFilters) => boolean;\n  /**\n   * Evaluate the URL's AND/OR filter tree against a row. Omit and the\n   * tree is stored but not applied (server tiers send it instead).\n   */\n  filterTreeFn?: (row: TRow, tree: QueryFilterGroup) => boolean;\n  /** Pagination mode. Defaults to `\"auto\"` (mobile → infinite). */\n  paginationMode?: PaginationMode;\n  /** Forwarded error to display (e.g. from a query that produced `data`). */\n  error?: Error | null;\n  /** Forwarded refetch. */\n  refetch?: () => Promise<unknown> | void;\n  /** Forwarded fetching flag. */\n  isFetching?: boolean;\n  /** Forwarded loading flag. */\n  isLoading?: boolean;\n  /**\n   * Force the resolved mobile state instead of using a media query.\n   * Primarily a testing/SSR seam.\n   */\n  forceMobile?: boolean;\n}\n\n/** Default searchable-text projector: flatten a row's own values. */\nexport function defaultSearchText<TRow>(row: TRow): string {\n  return incrementalSearchText(row);\n}\n\n/** Default row id: `String(row.id)` when the row has a string/number id. */\nexport function defaultFrontendRowId<TRow>(row: TRow): string {\n  if (row && typeof row === \"object\" && \"id\" in row) {\n    const id = row.id;\n    if (typeof id === \"string\" || typeof id === \"number\") return String(id);\n  }\n  if (typeof row === \"string\" || typeof row === \"number\") return String(row);\n  return \"\";\n}\n\n/**\n * In-memory {@link TableSource}: reads URL/local state and filters, sorts,\n * and slices a caller-supplied array. The mirror of `useQuerySource` —\n * the table cannot tell which produced it.\n *\n * A {@link rowPatchLog} on `data` continues the live {@link IncrementalView}\n * so only touched rows re-run search, filters and sort. Spreading the\n * patched array drops the log and falls back to a full rebuild.\n *\n * @typeParam TRow - The row item type.\n * @param options - See {@link UseFrontendDataOptions}.\n * @returns A {@link TableSource} over the in-memory data.\n */\nexport function useFrontendData<TRow>(\n  options: UseFrontendDataOptions<TRow>\n): TableSource<TRow> {\n  const {\n    data,\n    getRowId = defaultFrontendRowId,\n    getSearchText = defaultSearchText,\n    getSortValue,\n    columns,\n    filterFn,\n    filterTreeFn,\n    paginationMode = \"auto\",\n    error = null,\n    refetch,\n    isFetching = false,\n    isLoading = false,\n    forceMobile,\n    ...urlOptions\n  } = options;\n\n  const mediaMobile = useIsMobile();\n  const isMobile = forceMobile ?? mediaMobile;\n  const resolvedMode = resolvePaginationMode(paginationMode, isMobile);\n  const paged = resolvedMode === \"paged\";\n\n  const state = useTableUrlState(urlOptions);\n  const { page, limit, search, sortBy, sortDir, groupBy } = state;\n  const sortLevels = state.sortLevels;\n\n  const getSearchTextRef = useRef(getSearchText);\n  getSearchTextRef.current = getSearchText;\n  const getRowIdRef = useRef(getRowId);\n  getRowIdRef.current = getRowId;\n  const searchCacheRef = useRef<Map<string, string>>(new Map());\n  const projectSearchText = useCallback((row: TRow) => {\n    const id = getRowIdRef.current(row);\n    const cached = searchCacheRef.current.get(id);\n    if (cached !== undefined) return cached;\n    const text = getSearchTextRef.current(row);\n    searchCacheRef.current.set(id, text);\n    return text;\n  }, []);\n\n  const fingerprint: FrontendViewFingerprint<TRow> = {\n    extra: state.extra,\n    filterTree: state.filterTree,\n    columns,\n    search,\n    sortBy,\n    sortDir,\n    sortLevels,\n    groupBy,\n    hasFilterFn: filterFn !== undefined,\n    hasFilterTreeFn: filterTreeFn !== undefined,\n    hasGetSortValue: getSortValue !== undefined,\n  };\n  const hookConfig: IncrementalViewConfig<TRow> = {\n    getRowId,\n    getSearchText: projectSearchText,\n    filterFn,\n    extra: state.extra,\n    filterTreeFn,\n    filterTree: state.filterTree,\n    columns,\n    getSortValue,\n    sortBy,\n    sortDir,\n    sortLevels,\n    search,\n    groupBy,\n  };\n\n  const viewRef = useRef<IncrementalView<TRow> | undefined>(undefined);\n  const dataRef = useRef(data);\n  const fingerprintRef = useRef<string | undefined>(undefined);\n  const view = syncFrontendView({\n    data,\n    hookConfig,\n    fingerprint: hookViewFingerprint(fingerprint),\n    viewRef,\n    dataRef,\n    fingerprintRef,\n    searchCache: searchCacheRef.current,\n  });\n\n  if (sortLevels.length === 0 && sortBy && sortDir) {\n    warnUnresolvableSort(\n      sortBy,\n      columns?.find((column) => column.key === sortBy),\n      view.filtered,\n      getSortValue\n    );\n  }\n\n  const sorted = view.sorted;\n  attachIncrementalView(sorted, view);\n\n  // Facets read allSearchedRows: after search, BEFORE extra filters.\n  // view.filtered already applied filterFn, so a selected checklist\n  // would hide every other value if we published that here.\n  const searched = useMemo(() => {\n    const term = search.trim().toLowerCase();\n    if (!term) return data;\n    return data.filter((row) =>\n      projectSearchText(row).toLowerCase().includes(term)\n    );\n  }, [data, search, projectSearchText]);\n  const total = sorted.length;\n  const lastPage = Math.max(1, Math.ceil(total / Math.max(limit, 1)));\n  const safePage = Math.min(Math.max(page, 1), lastPage);\n\n  // The view object is NOT a dependency: hosts rebuild extra/columns\n  // (and useTableData's filterTreeFn) every render. A new view identity\n  // must not mint a new page slice or radix/base-ui findInTable loops.\n  const rows = useMemo<readonly TRow[]>(() => {\n    if (paged) {\n      const start = (safePage - 1) * limit;\n      return sorted.slice(start, start + limit);\n    }\n    return sorted.slice(0, safePage * limit);\n  }, [sorted, paged, safePage, limit]);\n  attachIncrementalView(rows, view);\n\n  const hasNextPage = !paged && safePage * limit < total;\n\n  const fetchNextPage = useCallback(() => {\n    if (paged || safePage * limit >= total) return;\n    state.setPage(safePage + 1);\n  }, [paged, safePage, limit, total, state]);\n\n  return {\n    rows,\n    allFilteredRows: sorted,\n    allSearchedRows: searched,\n    total,\n    isLoading,\n    isFetching,\n    isFetchingNextPage: false,\n    hasNextPage,\n    fetchNextPage,\n    error,\n    refetch,\n    paginationMode: resolvedMode,\n    page: safePage,\n    limit,\n    defaultLimit: state.defaultLimit,\n    search,\n    sortBy,\n    sortDir,\n    groupBy,\n    extra: state.extra,\n    filterTree: state.filterTree,\n    setPage: state.setPage,\n    setLimit: state.setLimit,\n    setSort: state.setSort,\n    setGroupBy: state.setGroupBy,\n    sortLevels: state.sortLevels,\n    toggleSortLevel: state.toggleSortLevel,\n    setSearch: state.setSearch,\n    setExtra: state.setExtra,\n    setExtras: state.setExtras,\n    setFilterTree: state.setFilterTree,\n    clearExtras: state.clearExtras,\n    clearAll: state.clearAll,\n  };\n}\n\n/** Value-only hook inputs. Callback / array identity is ignored. */\ninterface FrontendViewFingerprint<TRow> {\n  extra: ExtraFilters;\n  filterTree: QueryFilterGroup | undefined;\n  columns: readonly ColumnDef<TRow>[] | undefined;\n  search: string;\n  sortBy: string | undefined;\n  sortDir: SortDirection | undefined;\n  sortLevels: readonly SortLevel[];\n  groupBy: string | undefined;\n  hasFilterFn: boolean;\n  hasFilterTreeFn: boolean;\n  hasGetSortValue: boolean;\n}\n\nfunction hookViewFingerprint<TRow>(\n  fingerprint: FrontendViewFingerprint<TRow>\n): string {\n  return stableKey({\n    extra: fingerprint.extra,\n    filterTree: fingerprint.filterTree ?? null,\n    search: fingerprint.search,\n    sortBy: fingerprint.sortBy ?? null,\n    sortDir: fingerprint.sortDir ?? null,\n    sortLevels: fingerprint.sortLevels.map((level) => ({\n      key: level.key,\n      dir: level.dir,\n    })),\n    groupBy: fingerprint.groupBy ?? null,\n    columnKeys: (fingerprint.columns ?? []).map((column) => column.key),\n    hasFilterFn: fingerprint.hasFilterFn,\n    hasFilterTreeFn: fingerprint.hasFilterTreeFn,\n    hasGetSortValue: fingerprint.hasGetSortValue,\n  });\n}\n\nfunction syncFrontendView<TRow>(args: {\n  data: readonly TRow[];\n  hookConfig: IncrementalViewConfig<TRow>;\n  fingerprint: string;\n  viewRef: { current: IncrementalView<TRow> | undefined };\n  dataRef: { current: readonly TRow[] };\n  fingerprintRef: { current: string | undefined };\n  searchCache: Map<string, string>;\n}): IncrementalView<TRow> {\n  // Only follow a chrome reconfigure of THIS hook's snapshot. Looking\n  // up `data` on first mount would steal another table's view — hosts\n  // (and tests) reuse the same source array.\n  if (args.viewRef.current) {\n    const latest = incrementalViewOf(args.data);\n    if (latest) args.viewRef.current = latest;\n  }\n\n  const previousData = args.dataRef.current;\n  const previousFingerprint = args.fingerprintRef.current;\n  const configChanged =\n    previousFingerprint !== undefined &&\n    previousFingerprint !== args.fingerprint;\n\n  const log = args.data === previousData ? undefined : rowPatchLog(args.data);\n  const canPatch =\n    !configChanged &&\n    args.viewRef.current !== undefined &&\n    log !== undefined &&\n    args.viewRef.current.rows === previousData &&\n    logBelongsToPrevious(log, previousData);\n\n  if (canPatch && log) {\n    forgetPatchedSearch(args.searchCache, log);\n    adoptHookRefs(args.viewRef.current!, args.hookConfig);\n    const next = applyRowPatchLogToView(args.viewRef.current!, log);\n    args.viewRef.current = next;\n    args.dataRef.current = args.data;\n    args.fingerprintRef.current = args.fingerprint;\n    return next;\n  }\n\n  const dataChanged = args.data !== previousData;\n  const first = args.viewRef.current === undefined;\n  if (!first && !configChanged && !dataChanged) {\n    adoptHookRefs(args.viewRef.current!, args.hookConfig);\n    return args.viewRef.current!;\n  }\n\n  if (dataChanged && !canPatch) args.searchCache.clear();\n  const created = createIncrementalView(\n    args.data,\n    mergeHookConfig(args.hookConfig, args.viewRef.current)\n  );\n  args.viewRef.current = created;\n  args.dataRef.current = args.data;\n  args.fingerprintRef.current = args.fingerprint;\n  return created;\n}\n\nfunction adoptHookRefs<TRow>(\n  view: IncrementalView<TRow>,\n  hookConfig: IncrementalViewConfig<TRow>\n): void {\n  const current = incrementalViewConfig(view);\n  if (!current) return;\n  current.getRowId = hookConfig.getRowId;\n  current.getSearchText = hookConfig.getSearchText;\n  current.filterFn = hookConfig.filterFn;\n  current.filterTreeFn = hookConfig.filterTreeFn;\n  current.columns = hookConfig.columns;\n  current.getSortValue = hookConfig.getSortValue;\n}\n\nfunction mergeHookConfig<TRow>(\n  hookConfig: IncrementalViewConfig<TRow>,\n  current: IncrementalView<TRow> | undefined\n): IncrementalViewConfig<TRow> {\n  const previous = current ? incrementalViewConfig(current) : undefined;\n  if (!previous) return hookConfig;\n  return {\n    ...hookConfig,\n    groupAggregates: previous.groupAggregates,\n    groupSort: previous.groupSort,\n    groupFilter: previous.groupFilter,\n    groupFooters: previous.groupFooters,\n    collapsedGroupIds: previous.collapsedGroupIds,\n    blankLabel: previous.blankLabel,\n    groupPageSize: previous.groupPageSize,\n    rowPageSize: previous.rowPageSize,\n    paging: previous.paging,\n    summaryRow: previous.summaryRow,\n    aggregateSpec: previous.aggregateSpec,\n    aggregateOptions: previous.aggregateOptions,\n    groupBy: hookConfig.groupBy ?? previous.groupBy,\n  };\n}\n\nfunction forgetPatchedSearch<TRow>(\n  cache: Map<string, string>,\n  log: RowPatchLog<TRow>\n): void {\n  for (const event of log.events) {\n    if (event.type !== \"insert\") cache.delete(event.id);\n  }\n}\n\n/**\n * Did this log come from applying patches to `previous`? A copied array\n * (`[...applyRowPatches(...)]`) has no log; a log from a different source\n * fails the replay.\n */\nfunction logBelongsToPrevious<TRow>(\n  log: RowPatchLog<TRow>,\n  previous: readonly TRow[]\n): boolean {\n  if (log.events.length === 0) return false;\n  const working = previous.slice();\n  for (const event of log.events) {\n    if (event.type === \"insert\") {\n      if (event.index < 0 || event.index > working.length) return false;\n      working.splice(event.index, 0, event.row);\n    } else if (event.type === \"remove\") {\n      if (working[event.index] !== event.row) return false;\n      working.splice(event.index, 1);\n    } else if (working[event.index] !== event.prev) {\n      return false;\n    } else {\n      working[event.index] = event.next;\n    }\n  }\n  return working.length === log.rows.length;\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { resolveColumns } from \"../columns/resolveColumns\";\nimport { computeFilterFacets, type FacetMap } from \"../filters/facets\";\nimport { resolveFilterRegistry } from \"../filters/filterBuiltins\";\nimport {\n  buildFilterRuntime,\n  type FilterDef,\n  type FilterOption,\n  type FilterRuntime,\n  materializeAutoOptions,\n  resolveFilterDefs,\n} from \"../filters/filterDefs\";\nimport type { FilterTypeSpec } from \"../filters/filterRegistry\";\nimport { evaluateFilterTree } from \"../filters/filterTree\";\nimport type {\n  ColumnDef,\n  ExtraFilters,\n  PaginationMode,\n  SortableValue,\n} from \"../types\";\nimport type { UseTableUrlStateOptions } from \"../url/useTableUrlState\";\nimport { devWarn } from \"../utils/devWarn\";\nimport { stableKey } from \"../utils/stableKey\";\nimport type { QuerySupport } from \"./queryContract\";\nimport type { TableSource } from \"./TableSource\";\nimport { useFrontendData } from \"./useFrontendData\";\nimport {\n  type TableQuery,\n  useServerData,\n  type UseServerDataOptions,\n} from \"./useServerData\";\n\n/** Options for {@link useTableData}. */\nexport interface UseTableDataOptions<TRow> extends Pick<\n  UseTableUrlStateOptions,\n  \"urlAdapter\" | \"urlSync\" | \"defaults\" | \"urlKey\"\n> {\n  /** Full-control tier: a prebuilt source (e.g. `useQuerySource`). */\n  source?: TableSource<TRow>;\n  /** Frontend tier: the raw rows; the table filters/sorts/pages them. */\n  data?: readonly TRow[];\n  /** Server tier: total row count across all pages. */\n  total?: number;\n  /** Server tier: request in flight. */\n  loading?: boolean;\n  /** Forwarded error. */\n  error?: Error | null;\n  /**\n   * Explicit data mode. `\"server\"` makes `onQueryChange` the data\n   * contract (the caller fetches); `\"frontend\"` keeps the table's own\n   * data processing and turns `onQueryChange` into a pure notification.\n   * Absent, the tier is inferred exactly as before: `data` alone →\n   * frontend; `data` + `onQueryChange` → server; `source` → source tier.\n   */\n  mode?: \"frontend\" | \"server\";\n  /** Server tier: see {@link UseServerDataOptions.onQueryChange}. */\n  onQueryChange?: NonNullable<\n    Parameters<typeof useServerData<TRow>>[0][\"onQueryChange\"]\n  >;\n  /** Columns — their `filter` shorthands feed the runtime. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Table-level filters: declarative array, or JSX for a hand-drawn form. */\n  filters?: readonly FilterDef<TRow>[] | ReactNode;\n  /**\n   * Extra or replacement filter types merged onto the built-in registry.\n   * A spec whose `type` matches a built-in replaces it.\n   */\n  filterTypes?: readonly FilterTypeSpec[];\n  /** Extra client-side predicate AND-ed with the declarative ones. */\n  filterFn?: (row: TRow, extra: ExtraFilters) => boolean;\n  /** Frontend tier: pagination mode (defaults to `\"auto\"`). */\n  paginationMode?: PaginationMode;\n  /** Frontend tier: searchable-text projector. */\n  getSearchText?: (row: TRow) => string;\n  /** Frontend tier: sort-value resolver. */\n  getSortValue?: (row: TRow, columnKey: string) => SortableValue;\n  /** Active locale — drives per-column `i18n` path resolution. */\n  locale?: string;\n  /**\n   * Server tier: what this endpoint can answer. `supports.facets`\n   * unlocks `query.facets` (checklist keys, or {@link facetKeys}).\n   */\n  supports?: QuerySupport;\n  /**\n   * Server tier: keys to send as `query.facets`. Defaults to every\n   * `checklist` definition when omitted.\n   */\n  facetKeys?: readonly string[];\n  /** Server tier: distinct-value counts from the last fetch. */\n  facets?: FacetMap;\n}\n\n/** Result of {@link useTableData}. */\nexport interface UseTableDataResult<TRow> {\n  /** The resolved source, whichever tier provided it. */\n  source: TableSource<TRow>;\n  /** The merged declarative-filter runtime (defs, chips, URL keys, predicate). */\n  runtime: FilterRuntime<TRow>;\n}\n\ntype DataTier = \"source\" | \"server\" | \"frontend\";\n\n/**\n * The public `mode` prop surface, shared by every batteries-included\n * `<DataTable>`: a discriminated union so `mode=\"server\"` REQUIRES\n * `onQueryChange` at compile time, while `mode=\"frontend\"` (or no mode\n * at all) keeps it optional — as a pure notification and as the v1-style\n * inference trigger respectively.\n *\n * @typeParam TRow - The row type.\n */\nexport type DataModeProps<TRow> =\n  | {\n      /** The table owns the query state; the CALLER fetches. */\n      mode: \"server\";\n      /** The data contract: run the request, hand back `data` + `total`. */\n      onQueryChange: NonNullable<UseServerDataOptions<TRow>[\"onQueryChange\"]>;\n    }\n  | {\n      /**\n       * The table processes `data` itself. Omit `mode` for the inferred\n       * tiers (`data` + `onQueryChange` still means server).\n       */\n      mode?: \"frontend\";\n      /**\n       * With `mode=\"frontend\"`: a pure notification, fired on every\n       * committed sort / filter / page / search change and never on\n       * mount. Without `mode`: providing it selects the server tier.\n       */\n      onQueryChange?: NonNullable<UseServerDataOptions<TRow>[\"onQueryChange\"]>;\n    };\n\nfunction resolveTier(\n  source: unknown,\n  mode: \"frontend\" | \"server\" | undefined,\n  onQueryChange: unknown\n): DataTier {\n  if (source) return \"source\";\n  if (mode) return mode;\n  return onQueryChange ? \"server\" : \"frontend\";\n}\n\nfunction warnTierMisuse(\n  source: unknown,\n  mode: \"frontend\" | \"server\" | undefined,\n  data: unknown,\n  onQueryChange: unknown\n): void {\n  if (source && mode) {\n    devWarn(\n      \"`mode` is ignored when `source` is provided — the prebuilt source wins. Pass one data tier.\"\n    );\n  }\n  if (source && (data || onQueryChange)) {\n    devWarn(\n      \"both `source` and `data`/`onQueryChange` were provided — using `source`. Pass one data tier.\"\n    );\n  }\n  if (!source && !data) {\n    devWarn(\n      \"no data tier provided — pass `data` (frontend), `data` + `onQueryChange` (server) or `source`.\"\n    );\n  }\n}\n\n/**\n * Notify-only `onQueryChange` for the explicit frontend mode: fires with\n * the consolidated {@link TableQuery} on every COMMITTED state change —\n * sort, filter, page, page size, search — and never on mount. The\n * previous call's signal aborts when a newer notification supersedes it,\n * mirroring the server tier's contract.\n */\nfunction useQueryNotification<TRow>(\n  source: TableSource<TRow>,\n  handler: NonNullable<UseServerDataOptions<TRow>[\"onQueryChange\"]> | undefined\n): void {\n  const { page, limit, search, sortBy, sortDir, sortLevels, extra } = source;\n  const query = useMemo<TableQuery>(\n    () => ({\n      page,\n      limit,\n      search,\n      sortBy,\n      sortDir,\n      sortLevels: sortLevels ?? [],\n      filters: extra,\n    }),\n    [page, limit, search, sortBy, sortDir, sortLevels, extra]\n  );\n  const queryKey = stableKey(query);\n  const handlerRef = useRef(handler);\n  handlerRef.current = handler;\n  const queryRef = useRef(query);\n  queryRef.current = query;\n  // Primed with the mount key, so the first firing needs a REAL change.\n  const lastKeyRef = useRef(queryKey);\n  const controllerRef = useRef<AbortController | null>(null);\n  useEffect(() => {\n    if (lastKeyRef.current === queryKey) return;\n    lastKeyRef.current = queryKey;\n    const notify = handlerRef.current;\n    if (!notify) return;\n    controllerRef.current?.abort();\n    const controller = new AbortController();\n    controllerRef.current = controller;\n    void notify(queryRef.current, { signal: controller.signal });\n    return () => controller.abort();\n  }, [queryKey]);\n}\n\n/** True when the `filters` prop is the declarative array form. */\nexport function isDeclarativeFilters<TRow>(\n  filters: readonly FilterDef<TRow>[] | ReactNode\n): filters is readonly FilterDef<TRow>[] {\n  return Array.isArray(filters);\n}\n\n/**\n * Resolve the table's data tier from what the caller passed:\n *\n * - `source` — full control (query-library integration), used as-is;\n * - `data` + `onQueryChange` — server mode: the table owns the query state\n *   and emits consolidated change events; the caller fetches;\n * - `data` alone — frontend mode: filtering/sorting/paging are automatic,\n *   with the declarative filters' predicate already applied.\n *\n * All three run through the same declarative-filter runtime, so column\n * `filter` shorthands and the `filters` array drive chips and URL parsing\n * regardless of tier.\n *\n * @typeParam TRow - The row type.\n */\nexport function useTableData<TRow>(\n  options: UseTableDataOptions<TRow>\n): UseTableDataResult<TRow> {\n  const {\n    source,\n    data,\n    total = 0,\n    loading,\n    error,\n    mode,\n    onQueryChange,\n    columns,\n    filters,\n    filterTypes,\n    filterFn,\n    paginationMode,\n    getSearchText,\n    getSortValue,\n    locale,\n    supports,\n    facetKeys,\n    facets: serverFacets,\n    ...urlOptions\n  } = options;\n\n  const declaredFilters = isDeclarativeFilters(filters) ? filters : undefined;\n\n  // Async option loaders: ONE cached promise serves both the chip labels\n  // (here) and the form's `useFilterOptions` (same function identity), so\n  // nothing fetches twice — and once resolved, the defs carry the ARRAY,\n  // which re-labels active chips and makes the form instant.\n  const loaderCacheRef = useRef(\n    new Map<string, () => Promise<readonly FilterOption[]>>()\n  );\n  const awaitedRef = useRef(new Set<string>());\n  const [loadedOptions, setLoadedOptions] = useState<\n    Record<string, readonly FilterOption[]>\n  >({});\n\n  const runtime = useMemo(() => {\n    const materialized = materializeAutoOptions(\n      resolveFilterDefs(columns, declaredFilters, locale),\n      // `\"auto\"` derives from the full frontend dataset; other tiers\n      // only ever see the current page (useFilterOptions dev-warns).\n      data ?? []\n    );\n    const withAsync = materialized.map((def) => {\n      if (typeof def.options !== \"function\") return def;\n      const loaded = loadedOptions[def.key];\n      if (loaded) return { ...def, options: loaded };\n      let cached = loaderCacheRef.current.get(def.key);\n      if (!cached) {\n        const original = def.options;\n        let inFlight: Promise<readonly FilterOption[]> | null = null;\n        cached = () => (inFlight ??= original());\n        loaderCacheRef.current.set(def.key, cached);\n      }\n      return { ...def, options: cached };\n    });\n    return buildFilterRuntime(withAsync, resolveFilterRegistry(filterTypes));\n  }, [columns, declaredFilters, locale, data, loadedOptions, filterTypes]);\n\n  useEffect(() => {\n    let alive = true;\n    for (const def of runtime.defs) {\n      if (typeof def.options !== \"function\") continue;\n      if (awaitedRef.current.has(def.key)) continue;\n      awaitedRef.current.add(def.key);\n      const key = def.key;\n      void def.options().then(\n        (options) => {\n          if (alive) {\n            setLoadedOptions((prev) => ({ ...prev, [key]: options }));\n          }\n        },\n        () => {\n          // The form's useFilterOptions surfaces the failure dev warning;\n          // chips simply keep labeling with raw values.\n        }\n      );\n    }\n    return () => {\n      alive = false;\n    };\n  }, [runtime.defs]);\n\n  const tier = resolveTier(source, mode, onQueryChange);\n  warnTierMisuse(source, mode, data, onQueryChange);\n\n  const combinedFilterFn = useMemo(\n    () =>\n      filterFn\n        ? (row: TRow, extra: ExtraFilters) =>\n            runtime.filterFn(row, extra) && filterFn(row, extra)\n        : runtime.filterFn,\n    [runtime, filterFn]\n  );\n\n  // Hooks must run unconditionally; the inactive tiers run disabled (memory\n  // URL store, empty data, no emitter) and cost nothing.\n  const resolvedColumns = useMemo(\n    () => resolveColumns(columns, locale),\n    [columns, locale]\n  );\n  const frontend = useFrontendData<TRow>({\n    ...urlOptions,\n    urlSync: tier === \"frontend\" ? urlOptions.urlSync : false,\n    data: tier === \"frontend\" ? (data ?? []) : [],\n    columns: resolvedColumns,\n    filterFn: combinedFilterFn,\n    filterTreeFn: (row, tree) =>\n      evaluateFilterTree(tree, row, runtime.defs, runtime.registry),\n    arrayExtraKeys: runtime.arrayExtraKeys,\n    numberExtraKeys: runtime.numberExtraKeys,\n    paginationMode,\n    getSearchText,\n    getSortValue,\n    error,\n    isLoading: mode === \"frontend\" ? loading : undefined,\n  });\n  const derivedFacetKeys = useMemo(() => {\n    if (facetKeys) return facetKeys;\n    return runtime.defs\n      .filter(\n        (def) =>\n          (runtime.registry.get(def.type)?.widget ?? def.type) === \"checklist\"\n      )\n      .map((def) => def.key);\n  }, [facetKeys, runtime.defs, runtime.registry]);\n\n  const server = useServerData<TRow>({\n    ...urlOptions,\n    urlSync: tier === \"server\" ? urlOptions.urlSync : false,\n    rows: tier === \"server\" ? (data ?? []) : [],\n    total,\n    loading,\n    error,\n    paginationMode,\n    onQueryChange: tier === \"server\" ? onQueryChange : undefined,\n    arrayExtraKeys: runtime.arrayExtraKeys,\n    numberExtraKeys: runtime.numberExtraKeys,\n    supports: tier === \"server\" ? supports : undefined,\n    facetKeys: tier === \"server\" ? derivedFacetKeys : undefined,\n    facets: tier === \"server\" ? serverFacets : undefined,\n  });\n\n  // Explicit frontend mode turns `onQueryChange` into a pure notification\n  // over the frontend source's committed state.\n  useQueryNotification(\n    frontend,\n    tier === \"frontend\" && mode === \"frontend\" ? onQueryChange : undefined\n  );\n\n  let resolved: TableSource<TRow>;\n  if (source) resolved = source;\n  else if (tier === \"server\") resolved = server;\n  else resolved = frontend;\n\n  const facets = useMemo(() => {\n    if (resolved.facets) return resolved.facets;\n    const rows = resolved.allSearchedRows;\n    if (!rows) return undefined;\n    return computeFilterFacets(\n      runtime.defs,\n      rows,\n      resolved.extra,\n      (row, extra) => {\n        if (!combinedFilterFn(row, extra)) return false;\n        if (!resolved.filterTree) return true;\n        return evaluateFilterTree(\n          resolved.filterTree,\n          row,\n          runtime.defs,\n          runtime.registry\n        );\n      },\n      runtime.registry\n    );\n  }, [resolved, runtime.defs, runtime.registry, combinedFilterFn]);\n\n  const sourced = useMemo(\n    () => (facets ? { ...resolved, facets } : resolved),\n    [resolved, facets]\n  );\n\n  return { source: sourced, runtime };\n}\n","import type { CSSProperties } from \"react\";\n\nimport type { ColumnDef } from \"../types\";\n\n/** Pixel lock for a collapsed arrow stub — chevron only, no leftover strip. */\nexport const COLUMN_GROUP_STUB_WIDTH = 36;\n\n/** Path separator inside a column-group id — labels may contain `/`. */\nexport const COLUMN_GROUP_ID_SEP = \"\\u001f\";\n\n/** Synthetic leaf shown when a collapsed group has no summary column. */\nexport const COLUMN_GROUP_STUB_PREFIX = \"__groupStub:\";\n\n/** Synthetic leaf shown when a collapsed group uses `collapsedRender`. */\nexport const COLUMN_GROUP_RENDER_PREFIX = \"__groupRender:\";\n\n/** True when this key is a collapsed-group arrow stub. */\nexport function isColumnGroupStubKey(key: string): boolean {\n  return key.startsWith(COLUMN_GROUP_STUB_PREFIX);\n}\n\n/** True when this key is a collapsed-group `collapsedRender` column. */\nexport function isColumnGroupRenderKey(key: string): boolean {\n  return key.startsWith(COLUMN_GROUP_RENDER_PREFIX);\n}\n\n/** True when this key is a stub or `collapsedRender` summary leaf. */\nexport function isColumnGroupSummaryKey(key: string): boolean {\n  return isColumnGroupStubKey(key) || isColumnGroupRenderKey(key);\n}\n\n/**\n * Inset hairline under a group title that still has child headers below.\n * Stops Assignment and Delivery sharing one stroke across the gap.\n */\nexport function groupedHeaderChildRule(hairline: string): {\n  readonly borderBottom: string;\n  readonly backgroundImage: string;\n  readonly backgroundPosition: string;\n  readonly backgroundRepeat: string;\n  readonly backgroundSize: string;\n} {\n  return {\n    borderBottom: \"none\",\n    backgroundImage: `linear-gradient(${hairline}, ${hairline})`,\n    backgroundPosition: \"center bottom\",\n    backgroundRepeat: \"no-repeat\",\n    backgroundSize: \"calc(100% - 12px) 1px\",\n  };\n}\n\n/** One cell of a group header row. */\nexport interface HeaderGroupCell {\n  /** Stable key for React lists. */\n  key: string;\n  /** Group label, or `null` for the gap over ungrouped columns. */\n  label: string | null;\n  /** How many leaf columns this cell spans. */\n  span: number;\n  /**\n   * Stable id of this group (`path.join(COLUMN_GROUP_ID_SEP)`).\n   * `null` on a gap cell.\n   */\n  id: string | null;\n  /** True when this group is collapsed. */\n  collapsed: boolean;\n  /** True when the host armed collapse and this cell is a real group. */\n  collapsible: boolean;\n  /**\n   * Hide the visible caption (collapsed arrow stub). The name stays on\n   * the toggle's accessible label.\n   */\n  hideLabel: boolean;\n  /**\n   * Header alignment. Omit and {@link groupedHeaderAlign} uses `\"center\"`,\n   * the previous hardcoded value.\n   */\n  align?: GroupedHeaderAlign;\n}\n\n/** Alignment of a spanning group header. */\nexport type GroupedHeaderAlign = \"start\" | \"center\" | \"end\";\n\n/**\n * Size lock for a collapsed arrow-stub column. `width` alone is a hint in\n * auto table layout; min + max stop the table from stretching the blank\n * strip to a data-column width.\n */\nexport function columnGroupStubStyle(): CSSProperties {\n  return {\n    width: COLUMN_GROUP_STUB_WIDTH,\n    minWidth: COLUMN_GROUP_STUB_WIDTH,\n    maxWidth: COLUMN_GROUP_STUB_WIDTH,\n    paddingInline: 0,\n    overflow: \"hidden\",\n    boxSizing: \"border-box\",\n  };\n}\n\n/**\n * Alignment for a group header. Omit / unknown → `\"center\"`, so existing\n * tables keep the hardcoded look; pass `\"start\"` or `\"end\"` to opt out.\n */\nexport function groupedHeaderAlign(\n  align?: GroupedHeaderAlign\n): GroupedHeaderAlign {\n  if (align === \"start\" || align === \"end\") return align;\n  return \"center\";\n}\n\n/**\n * Cluster for the collapse chevron + group title. A one-child group is only\n * as wide as that leaf, so without this the button wraps onto the line above\n * the caption — worst when every neighbor is also collapsed.\n */\nexport function groupedHeaderLabelStyle(): CSSProperties {\n  return {\n    display: \"inline-flex\",\n    alignItems: \"center\",\n    gap: \"0.2em\",\n    whiteSpace: \"nowrap\",\n    verticalAlign: \"middle\",\n    maxWidth: \"100%\",\n  };\n}\n\n/**\n * Style on one HTML group header cell: inset hairline while children sit\n * below, and the stub lock when the caption is hidden.\n */\nexport function groupedHeaderCellStyle(\n  cell: Readonly<{ rowSpan: number; cell: HeaderGroupCell }>,\n  hairline: string\n): CSSProperties {\n  return {\n    textAlign: groupedHeaderAlign(cell.cell.align),\n    whiteSpace: \"nowrap\",\n    ...(cell.rowSpan > 1 ? {} : groupedHeaderChildRule(hairline)),\n    ...(cell.cell.hideLabel\n      ? columnGroupStubStyle()\n      : { minWidth: \"max-content\" }),\n  };\n}\n\n/** `column.group` as a root-to-leaf path. A string is one level. */\nexport function columnGroupPath<TRow>(\n  column: Pick<ColumnDef<TRow>, \"group\">\n): readonly string[] {\n  if (column.group === undefined) return [];\n  return typeof column.group === \"string\" ? [column.group] : column.group;\n}\n\n/** Stable id for a group path. */\nexport function columnGroupId(path: readonly string[]): string {\n  return path.join(COLUMN_GROUP_ID_SEP);\n}\n\n/** Add or drop a group id in the collapsed set. */\nexport function toggleCollapsedColumnGroup(\n  collapsedIds: readonly string[],\n  id: string\n): string[] {\n  return collapsedIds.includes(id)\n    ? collapsedIds.filter((one) => one !== id)\n    : [...collapsedIds, id];\n}\n\n/**\n * Every group-header row, top level first. Returns `null` when no visible\n * column declares a group. Contiguous same-path cells merge; a reorder that\n * breaks adjacency splits the group rather than teleporting it.\n */\nexport function headerGroupRows<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  collapsedIds: readonly string[] = [],\n  collapsible = false,\n  groups?: ReadonlyMap<string, { readonly align?: GroupedHeaderAlign }>\n): HeaderGroupCell[][] | null {\n  const paths = columns.map((column) => columnGroupPath(column));\n  const maxDepth = paths.reduce((max, path) => Math.max(max, path.length), 0);\n  if (maxDepth === 0) return null;\n  const collapsed = new Set(collapsedIds);\n  const rows: HeaderGroupCell[][] = [];\n  for (let depth = 0; depth < maxDepth; depth += 1) {\n    rows.push(\n      headerGroupRowAt(columns, paths, collapsed, collapsible, depth, groups)\n    );\n  }\n  return rows;\n}\n\nfunction headerGroupRowAt<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  paths: readonly (readonly string[])[],\n  collapsed: ReadonlySet<string>,\n  collapsible: boolean,\n  depth: number,\n  groups?: ReadonlyMap<string, { readonly align?: GroupedHeaderAlign }>\n): HeaderGroupCell[] {\n  const cells: HeaderGroupCell[] = [];\n  for (let index = 0; index < columns.length; index += 1) {\n    const path = paths[index] ?? [];\n    const label = path[depth] ?? null;\n    const id = label === null ? null : columnGroupId(path.slice(0, depth + 1));\n    const last = cells.at(-1);\n    const stub = isColumnGroupStubKey(columns[index]?.key ?? \"\");\n    if (last?.label === label && last.id === id) {\n      last.span += 1;\n      if (!stub) last.hideLabel = false;\n      continue;\n    }\n    const collapsedHere = id !== null && collapsed.has(id);\n    cells.push({\n      key: `${id ?? \"gap\"}-${depth}-${cells.length}`,\n      label,\n      span: 1,\n      id,\n      collapsed: collapsedHere,\n      collapsible: collapsible && id !== null,\n      hideLabel: collapsedHere && stub,\n      align: id === null ? undefined : groups?.get(id)?.align,\n    });\n  }\n  return cells;\n}\n\n/**\n * The top group-header row. `null` when no visible column declares a group.\n * Groups are adjacency-based — if the user reorders columns apart, the\n * group SPLITS rather than lying about the layout.\n */\nexport function headerGroupRow<TRow>(\n  columns: readonly ColumnDef<TRow>[]\n): HeaderGroupCell[] | null {\n  return headerGroupRows(columns)?.[0] ?? null;\n}\n\n/** Visible group caption; `null` when the collapsed stub hides the name. */\nexport function columnGroupHeaderCaption(cell: HeaderGroupCell): string | null {\n  if (cell.hideLabel) return null;\n  return cell.label;\n}\n\n/**\n * One cell in {@link htmlGroupedHeaderPlan}. Group cells span children\n * horizontally; leaf cells rowspan through the group band so an ungrouped\n * Person sits beside Delivery and its children — Ant's nested header, on\n * an HTML table. A collapsed `collapsedRender` / stub group rowspans the\n * same way: no second header row, no line under the title. `collapsedKey`\n * keeps the child header, so that group stays two rows.\n */\nexport type HtmlGroupedHeaderCell =\n  | {\n      readonly kind: \"group\";\n      readonly key: string;\n      readonly colSpan: number;\n      readonly rowSpan: number;\n      readonly cell: HeaderGroupCell;\n    }\n  | {\n      readonly kind: \"leaf\";\n      readonly key: string;\n      readonly columnIndex: number;\n      readonly rowSpan: number;\n    };\n\n/**\n * Header rows for HTML-table kits. `null` when no column declares a group.\n * Ant folds the same model into native `children`; this plan is that tree\n * flattened into `rowSpan` / `colSpan` so Mantine, MUI, and the rest match.\n */\nexport function htmlGroupedHeaderPlan<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  collapsedIds: readonly string[] = [],\n  collapsible = false,\n  groups?: ReadonlyMap<string, { readonly align?: GroupedHeaderAlign }>\n): HtmlGroupedHeaderCell[][] | null {\n  const groupRows = headerGroupRows(columns, collapsedIds, collapsible, groups);\n  if (!groupRows) return null;\n  const depth = groupRows.length;\n  const paths = columns.map((column) => columnGroupPath(column));\n  const totalRows =\n    depth + (needsChildHeaderRow(columns, paths, depth) ? 1 : 0);\n  const plan: HtmlGroupedHeaderCell[][] = Array.from(\n    { length: totalRows },\n    () => []\n  );\n  fillGroupLevels(plan, groupRows, columns, paths, totalRows, depth);\n  if (totalRows > depth) fillChildHeaderRow(plan, columns, paths, depth);\n  return plan;\n}\n\nfunction needsChildHeaderRow<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  paths: readonly (readonly string[])[],\n  depth: number\n): boolean {\n  return columns.some((column, index) => {\n    if ((paths[index]?.length ?? 0) !== depth) return false;\n    return !isColumnGroupSummaryKey(column.key);\n  });\n}\n\nfunction fillGroupLevels<TRow>(\n  plan: HtmlGroupedHeaderCell[][],\n  groupRows: HeaderGroupCell[][],\n  columns: readonly ColumnDef<TRow>[],\n  paths: readonly (readonly string[])[],\n  totalRows: number,\n  depth: number\n): void {\n  for (let level = 0; level < depth; level += 1) {\n    let col = 0;\n    for (const cell of groupRows[level] ?? []) {\n      if (cell.label === null) {\n        col = fillGapLeaves(\n          plan,\n          columns,\n          paths,\n          col,\n          cell.span,\n          level,\n          totalRows\n        );\n        continue;\n      }\n      const summary = spanIsSummaryOnly(columns, col, cell.span);\n      plan[level]?.push({\n        kind: \"group\",\n        key: cell.key,\n        colSpan: cell.span,\n        rowSpan: summary ? totalRows - level : 1,\n        cell,\n      });\n      col += cell.span;\n    }\n  }\n}\n\nfunction fillGapLeaves<TRow>(\n  plan: HtmlGroupedHeaderCell[][],\n  columns: readonly ColumnDef<TRow>[],\n  paths: readonly (readonly string[])[],\n  start: number,\n  span: number,\n  level: number,\n  totalRows: number\n): number {\n  let col = start;\n  for (let step = 0; step < span; step += 1) {\n    const pathLen = paths[col]?.length ?? 0;\n    const column = columns[col];\n    if (pathLen === level && column) {\n      plan[level]?.push({\n        kind: \"leaf\",\n        key: column.key,\n        columnIndex: col,\n        rowSpan: totalRows - level,\n      });\n    }\n    col += 1;\n  }\n  return col;\n}\n\nfunction fillChildHeaderRow<TRow>(\n  plan: HtmlGroupedHeaderCell[][],\n  columns: readonly ColumnDef<TRow>[],\n  paths: readonly (readonly string[])[],\n  depth: number\n): void {\n  for (let index = 0; index < columns.length; index += 1) {\n    const column = columns[index];\n    if (!column) continue;\n    if ((paths[index]?.length ?? 0) !== depth) continue;\n    if (isColumnGroupSummaryKey(column.key)) continue;\n    plan[depth]?.push({\n      kind: \"leaf\",\n      key: column.key,\n      columnIndex: index,\n      rowSpan: 1,\n    });\n  }\n}\n\nfunction spanIsSummaryOnly<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  start: number,\n  span: number\n): boolean {\n  if (span <= 0) return false;\n  for (let step = 0; step < span; step += 1) {\n    const column = columns[start + step];\n    if (!column || !isColumnGroupSummaryKey(column.key)) return false;\n  }\n  return true;\n}\n","import type { ReactNode } from \"react\";\n\nimport type { ColumnDef, ColumnGroupShow } from \"../types\";\nimport {\n  COLUMN_GROUP_ID_SEP,\n  COLUMN_GROUP_RENDER_PREFIX,\n  COLUMN_GROUP_STUB_PREFIX,\n  COLUMN_GROUP_STUB_WIDTH,\n  columnGroupId,\n  columnGroupPath,\n  type GroupedHeaderAlign,\n  isColumnGroupRenderKey,\n  isColumnGroupStubKey,\n} from \"./headerGroups\";\n\n/**\n * A parent header with its own children. Collapse options live here, not\n * on the table: each group decides whether a collapsed state is an arrow\n * stub, a kept child, or a cell the host draws.\n */\nexport interface ColumnGroupDef<TRow> {\n  /** Caption on the spanning header cell, and the group's id. */\n  readonly header: string;\n  /** Nested groups or leaf columns. */\n  readonly children: readonly ColumnInput<TRow>[];\n  /**\n   * Leaf `key` to keep when this group is collapsed. Omit with\n   * {@link ColumnGroupDef.collapsedRender} omitted for an arrow stub.\n   */\n  readonly collapsedKey?: string;\n  /**\n   * Cell shown for every row while this group is collapsed. Takes\n   * precedence over {@link ColumnGroupDef.collapsedKey}.\n   */\n  readonly collapsedRender?: (row: TRow) => ReactNode;\n  /**\n   * Keep these children adjacent through reorder. Default `true` for a\n   * tree group; the flat `column.group` shortcut still splits on drag.\n   */\n  readonly marryChildren?: boolean;\n  /** Native tooltip on the group header, when set. */\n  readonly headerTooltip?: string;\n  /**\n   * Alignment of this group's spanning header. Default `\"center\"` — the\n   * value adapters used when this was hardcoded. Pass `\"start\"` or `\"end\"`\n   * to opt out.\n   */\n  readonly align?: GroupedHeaderAlign;\n}\n\n/** A leaf {@link ColumnDef} or a {@link ColumnGroupDef} parent. */\nexport type ColumnInput<TRow> = ColumnDef<TRow> | ColumnGroupDef<TRow>;\n\n/** Collapse policy recorded for one parent while flattening a tree. */\nexport interface ColumnGroupRecord<TRow> {\n  readonly id: string;\n  readonly label: string;\n  readonly collapsedKey?: string;\n  readonly collapsedRender?: (row: TRow) => ReactNode;\n  readonly marryChildren: boolean;\n  readonly headerTooltip?: string;\n  readonly align?: GroupedHeaderAlign;\n  readonly childKeys: readonly string[];\n}\n\n/** True when this column input is a parent with children. */\nexport function isColumnGroup<TRow>(\n  column: ColumnInput<TRow>\n): column is ColumnGroupDef<TRow> {\n  return \"children\" in column && Array.isArray(column.children);\n}\n\n/**\n * Flatten a mixed column tree into leaves. Tree parents become `group`\n * paths on those leaves; collapse options are in {@link FlattenedColumns.groups}.\n */\nexport function flattenColumnTree<TRow>(\n  columns: readonly ColumnInput<TRow>[]\n): FlattenedColumns<TRow> {\n  const leaves: ColumnDef<TRow>[] = [];\n  const groups = new Map<string, MutableGroup<TRow>>();\n  walk(columns, [], leaves, groups);\n  for (const leaf of leaves) {\n    const path = columnGroupPath(leaf);\n    for (let depth = 1; depth <= path.length; depth += 1) {\n      const id = columnGroupId(path.slice(0, depth));\n      groups.get(id)?.childKeys.push(leaf.key);\n    }\n  }\n  const frozen = new Map<string, ColumnGroupRecord<TRow>>();\n  for (const [id, record] of groups) {\n    frozen.set(id, { ...record, childKeys: [...record.childKeys] });\n  }\n  return { leaves, groups: frozen };\n}\n\n/** Leaves plus the parent records {@link flattenColumnTree} collected. */\nexport interface FlattenedColumns<TRow> {\n  readonly leaves: ColumnDef<TRow>[];\n  readonly groups: ReadonlyMap<string, ColumnGroupRecord<TRow>>;\n}\n\n/**\n * Hide leaves under collapsed groups according to each parent's options.\n *\n * Default (no `collapsedKey`, no `collapsedRender`, no `groupShow: \"closed\"`\n * child): a thin stub column. `collapsedRender` wins over `collapsedKey`.\n */\nexport function applyCollapsedColumnGroups<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  collapsedIds: readonly string[],\n  groups: ReadonlyMap<string, ColumnGroupRecord<TRow>> = new Map()\n): readonly ColumnDef<TRow>[] {\n  if (collapsedIds.length === 0) return columns;\n  const collapsed = new Set(collapsedIds);\n  const keep = columns.map((column) =>\n    shouldKeepLeaf(column, collapsed, groups)\n  );\n  const inserted = new Set<string>();\n  const out: ColumnDef<TRow>[] = [];\n  for (let index = 0; index < columns.length; index += 1) {\n    const column = columns[index]!;\n    if (keep[index] === true) {\n      out.push(column);\n      // A later contiguous run of the same group (flat `group:` split by\n      // reorder) gets its own stub rather than vanishing with no chrome.\n      inserted.clear();\n      continue;\n    }\n    appendCollapsedChrome(column, index, {\n      columns,\n      keep,\n      collapsed,\n      groups,\n      inserted,\n      out,\n    });\n  }\n  return out;\n}\n\n/**\n * True when `nextOrder` still keeps every married group's children in one\n * contiguous block. Used to reject a reorder that would split a tree group.\n */\nexport function marriedOrderHolds<TRow>(\n  nextOrder: readonly string[],\n  groups: ReadonlyMap<string, ColumnGroupRecord<TRow>>\n): boolean {\n  for (const record of groups.values()) {\n    if (!record.marryChildren) continue;\n    const childKeys = new Set(record.childKeys);\n    const hits: number[] = [];\n    for (let index = 0; index < nextOrder.length; index += 1) {\n      if (childKeys.has(nextOrder[index]!)) hits.push(index);\n    }\n    if (hits.length <= 1) continue;\n    const first = hits[0]!;\n    const last = hits.at(-1)!;\n    if (last - first !== hits.length - 1) return false;\n  }\n  return true;\n}\n\ninterface MutableGroup<TRow> {\n  id: string;\n  label: string;\n  collapsedKey?: string;\n  collapsedRender?: (row: TRow) => ReactNode;\n  marryChildren: boolean;\n  headerTooltip?: string;\n  align?: GroupedHeaderAlign;\n  childKeys: string[];\n}\n\nfunction walk<TRow>(\n  nodes: readonly ColumnInput<TRow>[],\n  path: readonly string[],\n  leaves: ColumnDef<TRow>[],\n  groups: Map<string, MutableGroup<TRow>>\n): void {\n  for (const node of nodes) {\n    if (isColumnGroup(node)) {\n      const nextPath = [...path, node.header];\n      const id = columnGroupId(nextPath);\n      groups.set(id, {\n        id,\n        label: node.header,\n        collapsedKey: node.collapsedKey,\n        collapsedRender: node.collapsedRender,\n        marryChildren: node.marryChildren ?? true,\n        headerTooltip: node.headerTooltip,\n        align: node.align,\n        childKeys: [],\n      });\n      walk(node.children, nextPath, leaves, groups);\n      continue;\n    }\n    leaves.push({\n      ...node,\n      group: inheritedGroup(node, path),\n    });\n  }\n}\n\nfunction inheritedGroup<TRow>(\n  node: ColumnDef<TRow>,\n  path: readonly string[]\n): ColumnDef<TRow>[\"group\"] {\n  let group: ColumnDef<TRow>[\"group\"] = node.group;\n  if (path.length === 1) {\n    group = path[0];\n  } else if (path.length > 1) {\n    group = path;\n  }\n  return group;\n}\n\nfunction appendCollapsedChrome<TRow>(\n  column: ColumnDef<TRow>,\n  index: number,\n  pass: {\n    columns: readonly ColumnDef<TRow>[];\n    keep: readonly boolean[];\n    collapsed: ReadonlySet<string>;\n    groups: ReadonlyMap<string, ColumnGroupRecord<TRow>>;\n    inserted: Set<string>;\n    out: ColumnDef<TRow>[];\n  }\n): void {\n  for (const id of collapsedAncestors(column, pass.collapsed)) {\n    if (pass.inserted.has(id)) continue;\n    if (groupHasKeptLeaf(id, pass.columns, pass.keep)) {\n      pass.inserted.add(id);\n      continue;\n    }\n    const record = pass.groups.get(id);\n    const path = id.split(COLUMN_GROUP_ID_SEP);\n    pass.out.push(\n      record?.collapsedRender\n        ? renderColumn(id, path, record, index)\n        : stubColumn(id, path, record, index)\n    );\n    pass.inserted.add(id);\n  }\n}\n\nfunction collapsedAncestors<TRow>(\n  column: ColumnDef<TRow>,\n  collapsed: ReadonlySet<string>\n): string[] {\n  const path = columnGroupPath(column);\n  const ids: string[] = [];\n  for (let depth = 1; depth <= path.length; depth += 1) {\n    const id = columnGroupId(path.slice(0, depth));\n    if (collapsed.has(id)) ids.push(id);\n  }\n  return ids;\n}\n\nfunction shouldKeepLeaf<TRow>(\n  column: ColumnDef<TRow>,\n  collapsed: ReadonlySet<string>,\n  groups: ReadonlyMap<string, ColumnGroupRecord<TRow>>\n): boolean {\n  if (isColumnGroupStubKey(column.key) || isColumnGroupRenderKey(column.key)) {\n    return false;\n  }\n  const ancestors = collapsedAncestors(column, collapsed);\n  if (ancestors.length === 0) return true;\n  for (const id of ancestors) {\n    const show = resolveGroupShow(column, groups.get(id));\n    if (show === \"always\") continue;\n    if (show === \"closed\") continue;\n    return false;\n  }\n  return true;\n}\n\nfunction resolveGroupShow<TRow>(\n  column: ColumnDef<TRow>,\n  record: ColumnGroupRecord<TRow> | undefined\n): ColumnGroupShow {\n  if (column.groupShow !== undefined) return column.groupShow;\n  if (record?.collapsedRender) return \"open\";\n  if (record?.collapsedKey === column.key) return \"closed\";\n  return \"open\";\n}\n\nfunction groupHasKeptLeaf<TRow>(\n  id: string,\n  columns: readonly ColumnDef<TRow>[],\n  keep: readonly boolean[]\n): boolean {\n  return columns.some((column, index) => {\n    if (keep[index] !== true) return false;\n    return collapsedAncestors(column, new Set([id])).length > 0;\n  });\n}\n\nfunction stubColumn<TRow>(\n  id: string,\n  path: readonly string[],\n  record: ColumnGroupRecord<TRow> | undefined,\n  index: number\n): ColumnDef<TRow> {\n  return {\n    key: `${COLUMN_GROUP_STUB_PREFIX}${id}:${String(index)}`,\n    header: \"\",\n    headerTooltip: record?.headerTooltip,\n    width: COLUMN_GROUP_STUB_WIDTH,\n    minWidth: COLUMN_GROUP_STUB_WIDTH,\n    maxWidth: COLUMN_GROUP_STUB_WIDTH,\n    accessor: () => null,\n    group: path.length === 1 ? path[0] : path,\n    hideOnMobile: true,\n    sortable: false,\n  };\n}\n\nfunction renderColumn<TRow>(\n  id: string,\n  path: readonly string[],\n  record: ColumnGroupRecord<TRow>,\n  index: number\n): ColumnDef<TRow> {\n  const render = record.collapsedRender;\n  return {\n    key: `${COLUMN_GROUP_RENDER_PREFIX}${id}:${String(index)}`,\n    header: \"\",\n    headerTooltip: record.headerTooltip,\n    width: 180,\n    accessor: render ? (row) => render(row) : () => null,\n    group: path.length === 1 ? path[0] : path,\n    sortable: false,\n  };\n}\n","import type { ColumnDef } from \"../types\";\n\n/** A column identity for width resolution — just its key and declared width. */\ntype WidthColumn = Pick<ColumnDef<unknown>, \"key\" | \"width\">;\n\n/** Fallback width (px) for a pinned column with no resolvable declared width. */\nexport const FALLBACK_PIN_WIDTH = 150;\n\n/**\n * Parse a declared column width to pixels, or `undefined` when it carries no\n * pixel value (relative units like `%`, `rem`, `fr` have no px here, so\n * `parseInt(\"50%\")` → 50 would silently corrupt a sticky inset / min-width).\n */\nexport function parsePxWidth(\n  width: number | string | undefined\n): number | undefined {\n  if (typeof width === \"number\") return width;\n  if (\n    typeof width === \"string\" &&\n    /^\\d+(?:\\.\\d+)?(?:px)?$/.test(width.trim())\n  ) {\n    return Number.parseFloat(width);\n  }\n  return undefined;\n}\n\n/**\n * A column's effective pixel width: a resize override (from the layout\n * `widths` map) wins over the declared width. `undefined` when neither\n * resolves to pixels.\n */\nexport function resolveColumnWidth(\n  column: WidthColumn,\n  widths?: Readonly<Record<string, number>>\n): number | undefined {\n  const override = widths?.[column.key];\n  if (typeof override === \"number\") return override;\n  return parsePxWidth(column.width);\n}\n\n/**\n * Total pixel width of the fixed-width columns, plus any extra leading/trailing\n * fixed columns (selection checkbox, actions). Columns without a px width\n * contribute nothing, so a table with no declared widths returns `0` and is\n * never forced to a min-width. Adapters apply the result as the table's\n * `min-width` so a fixed-width table scrolls horizontally instead of squishing\n * its columns below their declared sizes.\n *\n * @typeParam TRow - The row type.\n * @param columns - The visible columns.\n * @param options - `widths` resize overrides; `extra` px for non-data columns.\n * @returns The min table width in px, or `0` when no column declares a width.\n */\nexport function tableMinWidth<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  options: { widths?: Readonly<Record<string, number>>; extra?: number } = {}\n): number {\n  const total = columns.reduce(\n    (sum, column) => sum + (resolveColumnWidth(column, options.widths) ?? 0),\n    0\n  );\n  return total > 0 ? total + (options.extra ?? 0) : 0;\n}\n\n/**\n * The pixel width to RENDER a pinned column at: its resolved width, else\n * {@link FALLBACK_PIN_WIDTH}. Pin insets are summed from these same numbers\n * (see `pinOffset`), so applying this width to pinned header cells keeps\n * stacked pins flush — a natural-width pinned column would otherwise render\n * narrower or wider than the inset math assumed.\n *\n * @param column - The pinned column.\n * @param widths - Resize overrides from the column layout.\n */\nexport function pinnedColumnWidth(\n  column: WidthColumn,\n  widths?: Readonly<Record<string, number>>\n): number {\n  return resolveColumnWidth(column, widths) ?? FALLBACK_PIN_WIDTH;\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport type { ColumnDef } from \"../types\";\nimport {\n  applyCollapsedColumnGroups,\n  type ColumnGroupRecord,\n  marriedOrderHolds,\n} from \"./columnTree\";\nimport { FALLBACK_PIN_WIDTH, parsePxWidth } from \"./columnWidths\";\nimport { toggleCollapsedColumnGroup } from \"./headerGroups\";\n\n/** Edge a column can be pinned to — logical, so it follows the writing\n *  direction (`\"start\"` is the right edge under `dir=\"rtl\"`). */\nexport type PinSide = \"start\" | \"end\";\n\n/**\n * User-driven column layout: which columns are hidden, their order, pinning,\n * and widths. Keyed by column `key`. Empty `order` means \"declared order\".\n */\nexport interface ColumnLayoutState {\n  /** Column keys hidden by the user. */\n  hidden: readonly string[];\n  /** Explicit column order by key; empty falls back to declared order. */\n  order: readonly string[];\n  /** Per-column edge pinning. */\n  pinned: Readonly<Record<string, PinSide>>;\n  /** Per-column pixel widths. */\n  widths: Readonly<Record<string, number>>;\n  /** Collapsed column-group ids. Omit or empty — every group is open. */\n  collapsedGroups?: readonly string[];\n}\n\n/** An empty layout — declared order, nothing hidden/pinned/resized. */\nexport const EMPTY_COLUMN_LAYOUT: ColumnLayoutState = {\n  hidden: [],\n  order: [],\n  pinned: {},\n  widths: {},\n};\n\n/** Options for {@link useColumnLayout}. */\nexport interface UseColumnLayoutOptions<TRow> {\n  /** All declared columns (already filtered for the current device layout). */\n  columns: readonly ColumnDef<TRow>[];\n  /** Controlled layout state. Omit for uncontrolled (internal) state. */\n  layout?: ColumnLayoutState;\n  /** Change handler; required for the controlled mode to update. */\n  onLayoutChange?: (next: ColumnLayoutState) => void;\n  /** Initial layout for the uncontrolled mode. */\n  defaultColumnLayout?: Partial<ColumnLayoutState>;\n  /**\n   * When true, `visibleColumns` hides leaves under a collapsed group\n   * according to that group's collapse options. Omit and collapse is inert.\n   */\n  collapsibleColumnGroups?: boolean;\n  /** Tree-group collapse options from {@link flattenColumnTree}. */\n  columnGroups?: ReadonlyMap<string, ColumnGroupRecord<TRow>>;\n}\n\n/** Result of {@link useColumnLayout}. */\nexport interface UseColumnLayoutResult<TRow> {\n  /** The current layout state (controlled value or internal). */\n  state: ColumnLayoutState;\n  /** Declared columns reordered then filtered by the user's hidden set. */\n  visibleColumns: ColumnDef<TRow>[];\n  /** Whether a column key is currently hidden. */\n  isHidden: (key: string) => boolean;\n  /** Show/hide a single column. */\n  setHidden: (key: string, hidden: boolean) => void;\n  /** Toggle a single column's visibility. */\n  toggleVisible: (key: string) => void;\n  /** Pin a column to an edge, or unpin it with `undefined`. */\n  setPinned: (key: string, side: PinSide | undefined) => void;\n  /** Move a column to a new index among the visible columns. */\n  move: (key: string, toIndex: number) => void;\n  /** Set (or clear, with `undefined`) a column's pixel width. */\n  setWidth: (key: string, width: number | undefined) => void;\n  /** Sticky inset (px) for a pinned column, by side. `undefined` if unpinned. */\n  pinOffset: (key: string) => PinOffset | undefined;\n  /** Restore the empty layout (all visible, declared order). */\n  reset: () => void;\n  /** Collapse or expand a column group by id. No-op unless collapse is armed. */\n  toggleColumnGroup: (id: string) => void;\n}\n\n/** A pinned column's side plus its sticky inset in px. */\nexport interface PinOffset {\n  side: PinSide;\n  inset: number;\n}\n\n/**\n * Minimal sticky-positioning style for a pinned cell, from a pin offset.\n * Uses logical inset properties so pinning follows the writing direction:\n * a `\"start\"`-pinned column sticks to the inline START (the right edge under\n * `dir=\"rtl\"`), matching antd's native `fixed` behaviour.\n */\nexport interface PinnedCellStyle {\n  position: \"sticky\";\n  insetInlineStart?: number;\n  insetInlineEnd?: number;\n  zIndex: number;\n}\n\n/**\n * Stacking order for sticky table cells, lowest → highest. A pinned body cell\n * must sit above plain scrolled cells; a sticky header above all body cells;\n * and a pinned header (the corner) above everything — otherwise a pinned\n * column's body cells paint over the sticky header on vertical scroll, and\n * later headers paint over a pinned header on horizontal scroll.\n */\nexport const PIN_Z = {\n  body: 1,\n  /** Sticky pinned rows — above scrolled body, below the header. */\n  rowPinned: 2,\n  /** A pinned column cell inside a pinned row. */\n  rowPinnedColumn: 3,\n  header: 4,\n  headerPinned: 5,\n} as const;\n\n/**\n * Extra inset (px) the leading selection column / trailing actions column add\n * in front of the pinned data columns, so a start-pinned column sits just after\n * a pinned checkbox and an end-pinned column just before pinned actions.\n */\nexport interface PinLeads {\n  start?: number;\n  end?: number;\n}\n\n/** Map a pin side to its logical inset property. */\nfunction insetProp(side: PinSide): \"insetInlineStart\" | \"insetInlineEnd\" {\n  return side === \"start\" ? \"insetInlineStart\" : \"insetInlineEnd\";\n}\n\n/**\n * Build the sticky style for a pinned header/body cell from its pin offset.\n * Adapters spread this onto the cell and add their own opaque background.\n * `leads` shifts the cell past a pinned selection/actions edge column. Returns\n * undefined for an unpinned cell. The inset is logical (`insetInlineStart` /\n * `insetInlineEnd`), so the same style pins to the correct edge in RTL.\n */\nexport function pinnedCellStyle(\n  offset: PinOffset | undefined,\n  zIndex = 1,\n  leads?: PinLeads\n): PinnedCellStyle | undefined {\n  if (!offset) return undefined;\n  const lead = leads?.[offset.side] ?? 0;\n  return {\n    position: \"sticky\",\n    [insetProp(offset.side)]: offset.inset + lead,\n    zIndex,\n  };\n}\n\n/**\n * Sticky style for a leading/trailing non-data column (the selection checkbox\n * at the inline start, row actions at the inline end) so it pins flush to the\n * edge whenever a data column on that side is pinned. `active` is false when\n * nothing on that side is pinned, in which case the column stays in normal\n * flow. Insets are logical, so the edge follows the writing direction.\n */\nexport function edgePinStyle(\n  side: PinSide,\n  active: boolean,\n  zIndex: number = PIN_Z.body\n): PinnedCellStyle | undefined {\n  if (!active) return undefined;\n  return { position: \"sticky\", [insetProp(side)]: 0, zIndex };\n}\n\n/** Order `columns` by an explicit key order, appending any unlisted columns. */\nexport function applyColumnOrder<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  order: readonly string[]\n): ColumnDef<TRow>[] {\n  if (order.length === 0) return [...columns];\n  const byKey = new Map(columns.map((c) => [c.key, c]));\n  const ordered: ColumnDef<TRow>[] = [];\n  for (const key of order) {\n    const col = byKey.get(key);\n    if (col) {\n      ordered.push(col);\n      byKey.delete(key);\n    }\n  }\n  // Columns not named in `order` keep their declared order at the end.\n  for (const col of columns) if (byKey.has(col.key)) ordered.push(col);\n  return ordered;\n}\n\n/**\n * Headless column-layout state. Uncontrolled by default; pass `layout` +\n * `onLayoutChange` to control it (and persist however you like — localStorage,\n * URL, server). Returns the reordered, visibility-filtered columns to render.\n *\n * @typeParam TRow - The row type.\n */\nexport function useColumnLayout<TRow>({\n  columns,\n  layout,\n  onLayoutChange,\n  defaultColumnLayout,\n  collapsibleColumnGroups = false,\n  columnGroups,\n}: UseColumnLayoutOptions<TRow>): UseColumnLayoutResult<TRow> {\n  const [internal, setInternal] = useState<ColumnLayoutState>(() => ({\n    ...EMPTY_COLUMN_LAYOUT,\n    ...defaultColumnLayout,\n  }));\n  const state = layout ?? internal;\n\n  // Mutators read through this ref so two mutations in ONE event handler\n  // compose (the second sees the first's result) instead of the last write\n  // silently winning. `commit` advances it optimistically; renders re-sync it.\n  const stateRef = useRef(state);\n  stateRef.current = state;\n\n  const commit = useCallback(\n    (next: ColumnLayoutState) => {\n      stateRef.current = next;\n      if (layout === undefined) setInternal(next);\n      onLayoutChange?.(next);\n    },\n    [layout, onLayoutChange]\n  );\n\n  const isHidden = useCallback(\n    (key: string) => state.hidden.includes(key),\n    [state.hidden]\n  );\n\n  const setHidden = useCallback(\n    (key: string, hidden: boolean) => {\n      const current = stateRef.current;\n      const has = current.hidden.includes(key);\n      if (has === hidden) return;\n      const nextHidden = hidden\n        ? [...current.hidden, key]\n        : current.hidden.filter((k) => k !== key);\n      commit({ ...current, hidden: nextHidden });\n    },\n    [commit]\n  );\n\n  const toggleVisible = useCallback(\n    (key: string) => setHidden(key, !stateRef.current.hidden.includes(key)),\n    [setHidden]\n  );\n\n  const setPinned = useCallback(\n    (key: string, side: PinSide | undefined) => {\n      const current = stateRef.current;\n      const next = { ...current.pinned };\n      if (side === undefined) delete next[key];\n      else next[key] = side;\n      commit({ ...current, pinned: next });\n    },\n    [commit]\n  );\n\n  const setWidth = useCallback(\n    (key: string, width: number | undefined) => {\n      const current = stateRef.current;\n      const next = { ...current.widths };\n      if (width === undefined) delete next[key];\n      else next[key] = width;\n      commit({ ...current, widths: next });\n    },\n    [commit]\n  );\n\n  const visibleColumns = useMemo(() => {\n    const ordered = applyColumnOrder(columns, state.order).filter(\n      (c) => !state.hidden.includes(c.key)\n    );\n    if (!collapsibleColumnGroups) return ordered;\n    return [\n      ...applyCollapsedColumnGroups(\n        ordered,\n        state.collapsedGroups ?? [],\n        columnGroups\n      ),\n    ];\n  }, [\n    columns,\n    state.order,\n    state.hidden,\n    state.collapsedGroups,\n    collapsibleColumnGroups,\n    columnGroups,\n  ]);\n\n  const toggleColumnGroup = useCallback(\n    (id: string) => {\n      if (!collapsibleColumnGroups) return;\n      const current = stateRef.current;\n      const nextIds = toggleCollapsedColumnGroup(\n        current.collapsedGroups ?? [],\n        id\n      );\n      commit({\n        ...current,\n        collapsedGroups: nextIds.length > 0 ? nextIds : undefined,\n      });\n    },\n    [collapsibleColumnGroups, commit]\n  );\n\n  const move = useCallback(\n    (key: string, toIndex: number) => {\n      const latest = stateRef.current;\n      // Operate on the FULL ordered list (visible + hidden) so hiding a column\n      // never reorders the rest and reordering keeps hidden columns in place.\n      const current = applyColumnOrder(columns, latest.order).map((c) => c.key);\n      const from = current.indexOf(key);\n      if (from === -1) return;\n      const clamped = Math.max(0, Math.min(toIndex, current.length - 1));\n      if (from === clamped) return;\n      current.splice(from, 1);\n      current.splice(clamped, 0, key);\n      if (columnGroups && !marriedOrderHolds(current, columnGroups)) return;\n      commit({ ...latest, order: current });\n    },\n    [commit, columns, columnGroups]\n  );\n\n  const reset = useCallback(() => commit(EMPTY_COLUMN_LAYOUT), [commit]);\n\n  // Precompute every pinned column's inset once per layout change — adapters\n  // call `pinOffset` per cell per render, so a lookup beats re-walking the\n  // pinned set each time on wide tables.\n  const pinInsets = useMemo(() => {\n    const resolveWidth = (column: ColumnDef<TRow>): number => {\n      const override = state.widths[column.key];\n      if (typeof override === \"number\") return override;\n      // Only pixel widths can be summed into a sticky inset; relative units\n      // have no px value here, so fall back to a sane default instead.\n      return parsePxWidth(column.width) ?? FALLBACK_PIN_WIDTH;\n    };\n    const insets = new Map<string, { side: PinSide; inset: number }>();\n    for (const side of [\"start\", \"end\"] as const) {\n      // Only VISIBLE pinned columns have a rendered cell to stick — a hidden\n      // pinned key stays out of the map and reads back as unpinned.\n      const samePinned = visibleColumns.filter(\n        (c) => state.pinned[c.key] === side\n      );\n      // Start: sum widths before each column; end: sum widths after it.\n      const ordered = side === \"start\" ? samePinned : [...samePinned].reverse();\n      let inset = 0;\n      for (const column of ordered) {\n        insets.set(column.key, { side, inset });\n        inset += resolveWidth(column);\n      }\n    }\n    return insets;\n  }, [state.pinned, state.widths, visibleColumns]);\n\n  const pinOffset = useCallback(\n    (key: string) => pinInsets.get(key),\n    [pinInsets]\n  );\n\n  return {\n    state,\n    visibleColumns,\n    isHidden,\n    setHidden,\n    toggleVisible,\n    setPinned,\n    move,\n    setWidth,\n    pinOffset,\n    reset,\n    toggleColumnGroup,\n  };\n}\n","import type { ColumnDef } from \"../types\";\nimport type { PinSide, UseColumnLayoutResult } from \"./useColumnLayout\";\nimport { applyColumnOrder } from \"./useColumnLayout\";\n\n/** Readable label for a column in the menu (header string → mobileLabel → key). */\nexport function columnMenuLabel<TRow>(column: ColumnDef<TRow>): string {\n  if (typeof column.header === \"string\") return column.header;\n  return column.mobileLabel ?? column.key;\n}\n\n/** Edge a column is pinned to, or `undefined` when unpinned. */\nexport type PinnedSide = PinSide | undefined;\n\n/** One row of the column-management menu, with its derived display state. */\nexport interface ColumnMenuRow<TRow> {\n  column: ColumnDef<TRow>;\n  key: string;\n  name: string;\n  /** Hidden columns keep their position; only the eye toggles. */\n  hidden: boolean;\n  /** Edge the column is pinned to, or `undefined` when unpinned. */\n  pinned: PinnedSide;\n  /** Index in the full column order (visible + hidden) — the reorder target. */\n  index: number;\n  /** False when `column.lockPosition` is set. */\n  canMove: boolean;\n  /** False when `column.lockVisibility` is set. */\n  canHide: boolean;\n  /** False when `column.lockPin` is set. */\n  canPin: boolean;\n  /** False when `column.lockWidth` is set. */\n  canResize: boolean;\n  /** True when the column declared `sortable`. */\n  canSort: boolean;\n  /** True when the column declared a `filter`. */\n  canFilter: boolean;\n}\n\n/**\n * Toggle a DATA column's start pin: none ↔ start (`\"start\"` = the logical\n * inline-start edge, which is the right edge under `dir=\"rtl\"`). Data columns\n * never pin to the END edge — that is reserved for the trailing actions column,\n * which has its own end-pin toggle. Pinning a leading data column to the\n * trailing edge has no value: it just sticky-travels across the row and\n * collides with the actions column.\n */\nexport function nextPinSide(current: PinnedSide): PinnedSide {\n  return current === undefined ? \"start\" : undefined;\n}\n\n/**\n * The label for a data column's pin toggle — \"Pin to start\" when unpinned,\n * \"Unpin\" when pinned — so the accessible name always matches what the click\n * will do. (The actions column uses its own \"Pin to end\" / \"Unpin\" label.)\n */\nexport function pinActionLabel(\n  current: PinnedSide,\n  labels: { pinStart: string; unpin: string }\n): string {\n  return current === undefined ? labels.pinStart : labels.unpin;\n}\n\n/**\n * Build the column-menu rows in the table's real order — visible and hidden\n * columns interleaved exactly as they appear (hiding never reorders the list).\n * Shared so all five adapters render an identical model and only differ in kit\n * markup.\n */\n/**\n * Reserved layout key for the injected row-actions column. It is not a\n * `ColumnDef`, but the layout state treats keys opaquely, so the actions\n * column hides (`hidden: [\"actions\"]`) and end-pins\n * (`pinned: { actions: \"end\" }`) like any data column — adapters list it\n * in the Columns menu with a visibility toggle and an end-pin toggle (no\n * reorder/resize; it always trails).\n */\nexport const ACTIONS_COLUMN_KEY = \"actions\";\n\n/**\n * Reserved layout key for the injected row-reorder column. Same deal as\n * {@link ACTIONS_COLUMN_KEY}: not a `ColumnDef`, but hideable and\n * start-pinnable through the layout because the key is just a string.\n */\nexport const REORDER_COLUMN_KEY = \"reorder\";\n\nexport function columnMenuRows<TRow>(\n  allColumns: readonly ColumnDef<TRow>[],\n  layout: UseColumnLayoutResult<TRow>\n): ColumnMenuRow<TRow>[] {\n  return applyColumnOrder(allColumns, layout.state.order).map(\n    (column, index) => ({\n      column,\n      key: column.key,\n      name: columnMenuLabel(column),\n      hidden: layout.isHidden(column.key),\n      pinned: layout.state.pinned[column.key],\n      index,\n      canMove: column.lockPosition !== true,\n      canHide: column.lockVisibility !== true,\n      canPin: column.lockPin !== true,\n      canResize: column.lockWidth !== true,\n      canSort: column.sortable === true,\n      canFilter: column.filter !== undefined,\n    })\n  );\n}\n\n/** Keep rows whose name or key contains the query (case-insensitive). */\nexport function filterColumnMenuRows<TRow>(\n  rows: readonly ColumnMenuRow<TRow>[],\n  query: string\n): ColumnMenuRow<TRow>[] {\n  const needle = query.trim().toLowerCase();\n  if (needle === \"\") return [...rows];\n  return rows.filter(\n    (row) =>\n      row.name.toLowerCase().includes(needle) ||\n      row.key.toLowerCase().includes(needle)\n  );\n}\n\n/** Show every unlocked hidden column. */\nexport function showAllColumns<TRow>(\n  rows: readonly ColumnMenuRow<TRow>[],\n  layout: UseColumnLayoutResult<TRow>\n): void {\n  for (const row of rows) {\n    if (row.canHide && layout.isHidden(row.key)) {\n      layout.setHidden(row.key, false);\n    }\n  }\n}\n\n/** Hide every unlocked visible column. */\nexport function hideAllColumns<TRow>(\n  rows: readonly ColumnMenuRow<TRow>[],\n  layout: UseColumnLayoutResult<TRow>\n): void {\n  for (const row of rows) {\n    if (row.canHide && !layout.isHidden(row.key)) {\n      layout.setHidden(row.key, true);\n    }\n  }\n}\n\n/** Unpin every unlocked pinned column. */\nexport function unpinAllColumns<TRow>(\n  rows: readonly ColumnMenuRow<TRow>[],\n  layout: UseColumnLayoutResult<TRow>\n): void {\n  for (const row of rows) {\n    if (row.canPin && layout.state.pinned[row.key] !== undefined) {\n      layout.setPinned(row.key, undefined);\n    }\n  }\n}\n\n/** Restore one column's visibility, pin and width. Locks still apply. */\nexport function resetColumnLayout<TRow>(\n  row: ColumnMenuRow<TRow>,\n  layout: UseColumnLayoutResult<TRow>\n): void {\n  if (row.canHide) layout.setHidden(row.key, false);\n  if (row.canPin) layout.setPinned(row.key, undefined);\n  if (row.canResize) layout.setWidth(row.key, undefined);\n}\n\n/** One action in a per-column submenu. */\nexport interface ColumnMenuAction {\n  id: string;\n  label: string;\n  disabled: boolean;\n  run: () => void;\n}\n\n/** What a submenu needs besides the row itself. */\nexport interface ColumnMenuActionContext<TRow = unknown> {\n  labels: ColumnMenuLabels;\n  layout: UseColumnLayoutResult<TRow>;\n  sortBy?: string;\n  sortDir?: \"asc\" | \"desc\";\n  onSortColumn?: (key: string, dir: \"asc\" | \"desc\") => void;\n  onAutoSizeColumn?: (key: string) => void;\n  onFilterColumn?: (key: string) => void;\n}\n\n/** Sort, pin, hide, autosize, filter, reset — disabled when locked. */\nexport function columnMenuActions<TRow>(\n  row: ColumnMenuRow<TRow>,\n  ctx: ColumnMenuActionContext<TRow>\n): ColumnMenuAction[] {\n  const actions: ColumnMenuAction[] = [];\n  if (row.canSort && ctx.onSortColumn) {\n    actions.push(\n      {\n        id: \"sort-asc\",\n        label: ctx.labels.sortAscending,\n        disabled: ctx.sortBy === row.key && ctx.sortDir === \"asc\",\n        run: () => ctx.onSortColumn?.(row.key, \"asc\"),\n      },\n      {\n        id: \"sort-desc\",\n        label: ctx.labels.sortDescending,\n        disabled: ctx.sortBy === row.key && ctx.sortDir === \"desc\",\n        run: () => ctx.onSortColumn?.(row.key, \"desc\"),\n      }\n    );\n  }\n  if (row.canPin) {\n    actions.push(\n      {\n        id: \"pin-start\",\n        label: ctx.labels.pinStart,\n        disabled: row.pinned === \"start\",\n        run: () => ctx.layout.setPinned(row.key, \"start\"),\n      },\n      {\n        id: \"pin-end\",\n        label: ctx.labels.pinEnd,\n        disabled: row.pinned === \"end\",\n        run: () => ctx.layout.setPinned(row.key, \"end\"),\n      },\n      {\n        id: \"unpin\",\n        label: ctx.labels.unpin,\n        disabled: row.pinned === undefined,\n        run: () => ctx.layout.setPinned(row.key, undefined),\n      }\n    );\n  }\n  if (row.canHide) {\n    actions.push({\n      id: row.hidden ? \"show\" : \"hide\",\n      label: row.hidden ? ctx.labels.showColumn : ctx.labels.hideColumn,\n      disabled: false,\n      run: () => ctx.layout.toggleVisible(row.key),\n    });\n  }\n  if (row.canResize && ctx.onAutoSizeColumn) {\n    actions.push({\n      id: \"auto-size\",\n      label: ctx.labels.autoSizeColumn,\n      disabled: false,\n      run: () => ctx.onAutoSizeColumn?.(row.key),\n    });\n  }\n  if (row.canFilter && ctx.onFilterColumn) {\n    actions.push({\n      id: \"filter\",\n      label: ctx.labels.filterColumn,\n      disabled: false,\n      run: () => ctx.onFilterColumn?.(row.key),\n    });\n  }\n  actions.push({\n    id: \"reset\",\n    label: ctx.labels.resetColumn,\n    disabled: !row.canHide && !row.canPin && !row.canResize,\n    run: () => resetColumnLayout(row, ctx.layout),\n  });\n  return actions;\n}\n\n/**\n * Labels every adapter's column menu needs (pre-translated by the caller).\n * Hoisted here so the five adapters share one contract instead of\n * re-declaring it.\n */\nexport interface ColumnMenuLabels {\n  columns: string;\n  pinStart: string;\n  pinEnd: string;\n  unpin: string;\n  moveStart: string;\n  moveEnd: string;\n  resetColumns: string;\n  /** \"Size columns to content\" — the menu's auto-size action. */\n  autoSizeColumns: string;\n  showColumn: string;\n  hideColumn: string;\n  searchColumns: string;\n  showAllColumns: string;\n  hideAllColumns: string;\n  unpinAllColumns: string;\n  resetColumn: string;\n  sortAscending: string;\n  sortDescending: string;\n  filterColumn: string;\n  columnActions: string;\n  autoSizeColumn: string;\n}\n\n/** The shared prop surface of every adapter's `<ColumnMenu>`. */\nexport interface ColumnMenuChromeProps<TRow> {\n  /** All declared columns (pre layout filtering). */\n  allColumns: ColumnDef<TRow>[];\n  /** The user column-layout state + mutators. */\n  layout: UseColumnLayoutResult<TRow>;\n  /** Resolved labels. */\n  labels: ColumnMenuLabels;\n}\n","/**\n * Progressive column hiding: which columns a narrow container can afford.\n *\n * Between \"wide enough for everything\" and \"narrow enough for cards\" there is\n * a long middle where a table has too many columns and no good answer. The\n * usual outcomes are a horizontal scrollbar the reader never finds, or columns\n * squeezed until nothing is legible. Neither is a decision — they are what\n * happens when nobody made one.\n *\n * `responsivePriority` is that decision, made once by the person who knows\n * the data: number the columns you are willing to lose, and they go in that\n * order as the space runs out.\n *\n * Two rules keep it predictable:\n *\n * A column without a `responsivePriority` is never dropped. That is what\n * makes the feature opt-in — a table that declares none behaves exactly as\n * before — and it means the columns that carry the row's identity stay put by\n * saying nothing.\n *\n * Dropping is by *declared* width, not by measuring the rendered table. A\n * measured version would have to render, observe, drop, re-render and observe\n * again, and that loop is what produces the flicker you see in tables that do\n * it. Arithmetic on the widths the columns already declare settles in one\n * pass, gives the same answer every time, and is the same number the table's\n * own `min-width` is built from.\n */\nimport type { ColumnDef } from \"../types\";\nimport { resolveColumnWidth } from \"./columnWidths\";\n\n/**\n * Width assumed for a column that declares none. Progressive hiding needs a\n * number for every column, and a table whose columns are all auto-width would\n * otherwise budget them at zero and drop nothing.\n */\nexport const ASSUMED_COLUMN_WIDTH = 150;\n\n/** What {@link responsiveColumns} needs to know about the container. */\nexport interface ResponsiveFit<TRow> {\n  /** The columns in render order, after the user's own hiding. */\n  columns: ColumnDef<TRow>[];\n  /** The width available, in pixels. `undefined` before the first measure. */\n  available: number | undefined;\n  /** Resize overrides from the column layout. */\n  widths?: Readonly<Record<string, number>>;\n  /** Pixels claimed by non-data columns — selection checkbox, row actions. */\n  extra?: number;\n}\n\n/** The result of fitting columns to a container. */\nexport interface ResponsiveColumns<TRow> {\n  /**\n   * The columns that fit, in their original order — and the very same array\n   * when nothing was dropped, so the rows this feeds keep their memoization.\n   */\n  columns: ColumnDef<TRow>[];\n  /** Keys dropped to make them fit, in the order they were dropped. */\n  dropped: readonly string[];\n}\n\n/** A column's width for budgeting: declared, resized, or assumed. */\nfunction budgetWidth<TRow>(\n  column: ColumnDef<TRow>,\n  widths: Readonly<Record<string, number>> | undefined\n): number {\n  return resolveColumnWidth(column, widths) ?? ASSUMED_COLUMN_WIDTH;\n}\n\n/**\n * The order columns are given up in: highest `responsivePriority` first, and\n * among equals the one furthest right. Numbering follows the ordinary sense\n * of the word — priority 1 is the one you keep longest.\n */\nfunction dropOrder<TRow>(\n  columns: readonly ColumnDef<TRow>[]\n): readonly ColumnDef<TRow>[] {\n  return columns\n    .map((column, index) => ({ column, index }))\n    .filter((entry) => entry.column.responsivePriority !== undefined)\n    .sort((a, b) => {\n      const byPriority =\n        (b.column.responsivePriority ?? 0) - (a.column.responsivePriority ?? 0);\n      return byPriority === 0 ? b.index - a.index : byPriority;\n    })\n    .map((entry) => entry.column);\n}\n\n/**\n * Fit columns to the available width, giving up the ones the table was told\n * it could give up.\n *\n * @typeParam TRow - The row type.\n * @param fit - The columns, the width to fit them in, and the widths to use.\n * @returns The columns that fit and the keys dropped to get there.\n */\nexport function responsiveColumns<TRow>({\n  columns,\n  available,\n  widths,\n  extra = 0,\n}: ResponsiveFit<TRow>): ResponsiveColumns<TRow> {\n  const droppable = dropOrder(columns);\n  // Nothing declared, or nothing measured yet: never guess at a narrower\n  // table than the one that was asked for.\n  if (droppable.length === 0 || available === undefined) {\n    return { columns, dropped: [] };\n  }\n\n  let width =\n    columns.reduce((sum, column) => sum + budgetWidth(column, widths), 0) +\n    extra;\n  const dropped: string[] = [];\n  for (const column of droppable) {\n    if (width <= available) break;\n    width -= budgetWidth(column, widths);\n    dropped.push(column.key);\n  }\n\n  if (dropped.length === 0) return { columns, dropped: [] };\n  const gone = new Set(dropped);\n  return {\n    columns: columns.filter((column) => !gone.has(column.key)),\n    dropped,\n  };\n}\n","/**\n * Editing lifecycle events — observe a commit, never own it.\n *\n * Integrators hook these for analytics, toasts and side effects. A handler\n * that throws, returns a value, or tries to rewrite the payload must not be\n * able to change whether a commit lands: the table already decided, and the\n * events only report what happened.\n */\nimport { useMemo } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport { devWarn } from \"../utils/devWarn\";\n\n/** Which commit unit produced an event. */\nexport type EditUnit = \"cell\" | \"row\" | \"batch\";\n\n/**\n * One lifecycle event. `columnKey` is the edited field for a cell, and empty\n * for a row or batch whose payload is the whole patch (or list of patches).\n */\nexport interface EditEvent<TRow> {\n  /** The row as it was when the gesture started. */\n  row: TRow;\n  /** Its stable id. */\n  rowId: string;\n  /** The column, or `\"\"` when the unit is the whole row or a batch. */\n  columnKey: string;\n  /** What the reader arrived at — the parsed value, the patch, or the edits. */\n  value: unknown;\n  /** What was there before. */\n  previousValue: unknown;\n  /** Which commit unit fired this. */\n  unit: EditUnit;\n  /** Why a commit was refused, or why a save rejected. */\n  error?: string;\n}\n\n/** A host callback that observes one kind of event. */\nexport type EditEventHandler<TRow> = (event: EditEvent<TRow>) => void;\n\n/** The five observers a host may wire. All optional, all inert when omitted. */\nexport interface EditLifecycle<TRow> {\n  /** An editor opened. */\n  onEditStart?: EditEventHandler<TRow>;\n  /** The reader threw the draft away. */\n  onEditCancel?: EditEventHandler<TRow>;\n  /** The host received the value. */\n  onEditCommit?: EditEventHandler<TRow>;\n  /** A validator refused the value; the editor stayed open. */\n  onValidationFail?: EditEventHandler<TRow>;\n  /** A save promise rejected. */\n  onEditError?: EditEventHandler<TRow>;\n}\n\n/**\n * Call an observer without letting it own the outcome. A throw is reported\n * and swallowed: the commit already happened, or the cancel already did, and\n * a side-effect that blows up must not rewind it.\n */\nexport function observeEdit<TRow>(\n  handler: EditEventHandler<TRow> | undefined,\n  event: EditEvent<TRow>\n): void {\n  if (!handler) return;\n  try {\n    handler(event);\n  } catch (error) {\n    const detail = error instanceof Error ? error.message : String(error);\n    devWarn(\n      `an onEdit* handler threw (${detail}) — the table ignored it so the commit could finish`\n    );\n  }\n}\n\n/**\n * Latch one observer: stable identity, missing stays missing. Calling through\n * a no-op would still look like \"someone is listening\".\n */\nfunction useObservedEdit<TRow>(\n  handler: EditEventHandler<TRow> | undefined\n): EditEventHandler<TRow> | undefined {\n  const stable = useEventCallback((event: EditEvent<TRow>) => {\n    observeEdit(handler, event);\n  });\n  return handler ? stable : undefined;\n}\n\n/**\n * Stable identities for the five observers, so a host's inline arrows never\n * repaint rows. The returned object is itself stable while the set of wired\n * handlers does not change — `editing` memoizes on it.\n */\nexport function useEditLifecycle<TRow>(\n  props: EditLifecycle<TRow>\n): EditLifecycle<TRow> {\n  const onEditStart = useObservedEdit(props.onEditStart);\n  const onEditCancel = useObservedEdit(props.onEditCancel);\n  const onEditCommit = useObservedEdit(props.onEditCommit);\n  const onValidationFail = useObservedEdit(props.onValidationFail);\n  const onEditError = useObservedEdit(props.onEditError);\n  return useMemo(\n    () => ({\n      onEditStart,\n      onEditCancel,\n      onEditCommit,\n      onValidationFail,\n      onEditError,\n    }),\n    [onEditStart, onEditCancel, onEditCommit, onValidationFail, onEditError]\n  );\n}\n","/**\n * Many rows changed, saved in one go.\n *\n * Row mode holds one row's fields until the reader saves it. Batch mode holds\n * *several rows* until they save all of them — the shape of a review pass, where\n * someone walks a list correcting values and wants one write at the end rather\n * than one per row. Nothing is sent until they say so, and one Cancel puts\n * everything back.\n *\n * The table still owns none of the data: what a save produces is the list of\n * patches, and the host applies them however it applies anything else. That is\n * also what makes the write atomic if the host wants it to be — a single request\n * with every change in it.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport type { EditableColumnLike } from \"./cellEditing\";\nimport {\n  parseCellEditValue,\n  readEditableCellValue,\n  resolveCellEditor,\n} from \"./cellEditing\";\nimport type { EditEventHandler } from \"./editingEvents\";\nimport { observeEdit } from \"./editingEvents\";\n\n/** One row's pending changes. */\nexport interface BatchRowEdit<TRow> {\n  /** The row as it was when the reader started changing it. */\n  row: TRow;\n  /** Its stable id. */\n  rowId: string;\n  /** Parsed values by column key — only the fields that actually changed. */\n  patch: Readonly<Record<string, unknown>>;\n}\n\n/** Headless batch-editing state. */\nexport interface BatchEditingState<TRow> {\n  /** How many rows are waiting — what a \"3 unsaved rows\" line reads. */\n  count: number;\n  /** Whether anything is waiting at all. */\n  pending: boolean;\n  /** Whether this row has pending changes. */\n  isPending: (rowId: string) => boolean;\n  /** This cell's draft, or the row's stored value when it has none. */\n  draftFor: (row: TRow, rowId: string, columnKey: string) => string;\n  /** Whether this cell has been changed. */\n  isChanged: (rowId: string, columnKey: string) => boolean;\n  /** Change one cell, without telling the host. */\n  setDraft: (\n    row: TRow,\n    rowId: string,\n    columnKey: string,\n    value: string\n  ) => void;\n  /** Hand the host every pending row, as one list, then forget them. */\n  saveAll: () => void;\n  /** Forget everything, restoring nothing — the drafts were never applied. */\n  cancelAll: () => void;\n  /** Forget one row's changes. */\n  cancelRow: (rowId: string) => void;\n  /** A digest of the pending drafts, for a row memo comparator. */\n  signature: string;\n}\n\n/** What {@link useBatchEditing} needs. */\nexport interface UseBatchEditingOptions<TRow> {\n  /**\n   * Whether batch editing is armed. Off by default: it changes when a commit\n   * happens, which is a decision about the data rather than a preference.\n   */\n  enabled?: boolean;\n  /** The columns, for seeding drafts and parsing them back. */\n  columns: readonly EditableColumnLike<TRow>[];\n  /**\n   * Take every pending row at once. The table never writes to a row, and the\n   * whole point of the mode is that this is called once.\n   */\n  onBatchEdit?: (edits: readonly BatchRowEdit<TRow>[]) => unknown;\n  /** A row became pending. */\n  onEditStart?: EditEventHandler<TRow>;\n  /** Pending changes were thrown away. */\n  onEditCancel?: EditEventHandler<TRow>;\n  /** The host received the batch. */\n  onEditCommit?: EditEventHandler<TRow>;\n}\n\n/** The drafts of one row, by column key. */\ntype RowDrafts = Readonly<Record<string, string>>;\n\n/** Every pending row's drafts, by row id. */\ntype PendingDrafts = Readonly<\n  Record<string, { row: unknown; drafts: RowDrafts }>\n>;\n\n/**\n * Headless state for changing many rows and saving them together.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseBatchEditingOptions}.\n * @returns The state; inert unless `enabled`.\n */\nexport function useBatchEditing<TRow>(\n  options: UseBatchEditingOptions<TRow>\n): BatchEditingState<TRow> {\n  const enabled = options.enabled ?? false;\n  const [pending, setPending] = useState<PendingDrafts>({});\n  // A ref beside the state: a save reads the drafts in the same tick a keystroke\n  // wrote one, and a control that saves on the click that also edits would\n  // otherwise send the values as they were before it.\n  const pendingRef = useRef<PendingDrafts>({});\n\n  const write = useEventCallback((next: PendingDrafts) => {\n    pendingRef.current = next;\n    setPending(next);\n  });\n\n  const setDraft = useEventCallback(\n    (row: TRow, rowId: string, columnKey: string, value: string) => {\n      if (!enabled) return;\n      const column = options.columns.find((entry) => entry.key === columnKey);\n      if (!column) return;\n      const stored = readEditableCellValue(row, column);\n      const current = pendingRef.current[rowId];\n      const drafts = { ...current?.drafts, [columnKey]: value };\n      // A value typed back to what it was is not a change, and a row left with\n      // no changes is not pending — otherwise \"3 unsaved rows\" counts rows the\n      // reader has already put back.\n      if (value === stored) delete drafts[columnKey];\n      const wasPending = current !== undefined;\n      const next = { ...pendingRef.current };\n      if (Object.keys(drafts).length === 0) delete next[rowId];\n      else next[rowId] = { row: current?.row ?? row, drafts };\n      write(next);\n      if (!wasPending && next[rowId]) {\n        observeEdit(options.onEditStart, {\n          row,\n          rowId,\n          columnKey,\n          value,\n          previousValue: stored,\n          unit: \"batch\",\n        });\n      }\n    }\n  );\n\n  const saveAll = useEventCallback(() => {\n    const current = pendingRef.current;\n    const edits: BatchRowEdit<TRow>[] = [];\n    for (const [rowId, entry] of Object.entries(current)) {\n      const row = entry.row as TRow;\n      const patch: Record<string, unknown> = {};\n      for (const [columnKey, draft] of Object.entries(entry.drafts)) {\n        const column = options.columns.find((one) => one.key === columnKey);\n        if (!column) continue;\n        patch[columnKey] = column.parseValue\n          ? column.parseValue(draft, row)\n          : parseCellEditValue(resolveCellEditor(column) ?? \"text\", draft);\n      }\n      edits.push({ row, rowId, patch });\n    }\n    if (edits.length > 0) {\n      options.onBatchEdit?.(edits);\n      for (const edit of edits) {\n        observeEdit(options.onEditCommit, {\n          row: edit.row,\n          rowId: edit.rowId,\n          columnKey: \"\",\n          value: edit.patch,\n          previousValue: edit.row,\n          unit: \"batch\",\n        });\n      }\n    }\n    write({});\n  });\n\n  const cancelAll = useEventCallback(() => {\n    for (const [rowId, entry] of Object.entries(pendingRef.current)) {\n      observeEdit(options.onEditCancel, {\n        row: entry.row as TRow,\n        rowId,\n        columnKey: \"\",\n        value: entry.drafts,\n        previousValue: entry.row,\n        unit: \"batch\",\n      });\n    }\n    write({});\n  });\n\n  const cancelRow = useEventCallback((rowId: string) => {\n    const entry = pendingRef.current[rowId];\n    if (!entry) return;\n    observeEdit(options.onEditCancel, {\n      row: entry.row as TRow,\n      rowId,\n      columnKey: \"\",\n      value: entry.drafts,\n      previousValue: entry.row,\n      unit: \"batch\",\n    });\n    const next = { ...pendingRef.current };\n    delete next[rowId];\n    write(next);\n  });\n\n  const isPending = useCallback((rowId: string) => rowId in pending, [pending]);\n\n  const isChanged = useCallback(\n    (rowId: string, columnKey: string) =>\n      pending[rowId]?.drafts[columnKey] !== undefined,\n    [pending]\n  );\n\n  const draftFor = useCallback(\n    (row: TRow, rowId: string, columnKey: string) => {\n      const draft = pending[rowId]?.drafts[columnKey];\n      if (draft !== undefined) return draft;\n      const column = options.columns.find((entry) => entry.key === columnKey);\n      return column ? readEditableCellValue(row, column) : \"\";\n    },\n    [pending, options.columns]\n  );\n\n  const signature = useMemo(\n    () =>\n      Object.entries(pending)\n        .map(\n          ([rowId, entry]) =>\n            `${rowId}:${Object.entries(entry.drafts)\n              .map(([key, value]) => `${key}=${value}`)\n              .join(\"|\")}`\n        )\n        .join(\";\"),\n    [pending]\n  );\n\n  const count = Object.keys(pending).length;\n\n  return useMemo(\n    () => ({\n      count,\n      pending: count > 0,\n      isPending,\n      isChanged,\n      draftFor,\n      setDraft,\n      saveAll,\n      cancelAll,\n      cancelRow,\n      signature,\n    }),\n    [\n      count,\n      isPending,\n      isChanged,\n      draftFor,\n      setDraft,\n      saveAll,\n      cancelAll,\n      cancelRow,\n      signature,\n    ]\n  );\n}\n","/**\n * Which cells have been changed since the reader last saw them agree with the\n * server.\n *\n * A save can be in flight, or it can have landed and not yet be confirmed by\n * anything the reader trusts — an optimistic table shows a value the server has\n * not acknowledged. Both are \"changed but not settled\", and both deserve a mark,\n * because a table that looks identical before and after a save gives the reader\n * no way to tell what is still at risk.\n *\n * The table does not decide when a value is settled: the host does, by handing\n * back a promise that resolves, or by calling `confirm` when a refetch agrees.\n * Marks clear on confirmation and on rollback, and never on their own — a mark\n * that fades on a timer says the change is safe when nobody checked.\n */\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\n\n/** Dirty state for the whole table. */\nexport interface DirtyCellState {\n  /** Whether this cell holds a change nobody has confirmed. */\n  isDirty: (rowId: string, columnKey: string) => boolean;\n  /** Whether any cell in this row does — what a row marker reads. */\n  isRowDirty: (rowId: string) => boolean;\n  /** How many cells are waiting, for a \"3 unsaved changes\" line. */\n  count: number;\n  /** Mark a cell changed. */\n  mark: (rowId: string, columnKey: string) => void;\n  /** Clear one cell — a save confirmed, or a change undone. */\n  confirm: (rowId: string, columnKey: string) => void;\n  /** Clear every cell in one row. */\n  confirmRow: (rowId: string) => void;\n  /** Clear everything — what a successful refetch means. */\n  confirmAll: () => void;\n  /** A digest of the marks, for a row memo comparator. */\n  signature: string;\n}\n\n/** What {@link useDirtyCells} needs. */\nexport interface UseDirtyCellsOptions {\n  /**\n   * Whether to mark at all. Off by default: a mark is a claim about what the\n   * server has agreed to, and a table whose host never says would be guessing.\n   */\n  enabled?: boolean;\n}\n\n/** `rowId` and `columnKey` as one map key. */\nconst cellKey = (rowId: string, columnKey: string) => `${rowId} ${columnKey}`;\n\n/**\n * Headless dirty-cell state for inline editing.\n *\n * @param options - See {@link UseDirtyCellsOptions}.\n * @returns The state; inert unless `enabled`.\n */\nexport function useDirtyCells(\n  options: UseDirtyCellsOptions = {}\n): DirtyCellState {\n  const enabled = options.enabled ?? false;\n  const [dirty, setDirty] = useState<ReadonlySet<string>>(() => new Set());\n\n  const mark = useEventCallback((rowId: string, columnKey: string) => {\n    if (!enabled) return;\n    setDirty((current) => {\n      const key = cellKey(rowId, columnKey);\n      if (current.has(key)) return current;\n      return new Set(current).add(key);\n    });\n  });\n\n  const confirm = useEventCallback((rowId: string, columnKey: string) => {\n    setDirty((current) => {\n      const key = cellKey(rowId, columnKey);\n      if (!current.has(key)) return current;\n      const next = new Set(current);\n      next.delete(key);\n      return next;\n    });\n  });\n\n  const confirmRow = useEventCallback((rowId: string) => {\n    setDirty((current) => {\n      const prefix = `${rowId} `;\n      const next = new Set(\n        [...current].filter((key) => !key.startsWith(prefix))\n      );\n      return next.size === current.size ? current : next;\n    });\n  });\n\n  const confirmAll = useEventCallback(() => {\n    setDirty((current) => (current.size === 0 ? current : new Set()));\n  });\n\n  const isDirty = useCallback(\n    (rowId: string, columnKey: string) => dirty.has(cellKey(rowId, columnKey)),\n    [dirty]\n  );\n\n  const isRowDirty = useCallback(\n    (rowId: string) => {\n      const prefix = `${rowId} `;\n      for (const key of dirty) {\n        if (key.startsWith(prefix)) return true;\n      }\n      return false;\n    },\n    [dirty]\n  );\n\n  const signature = useMemo(() => [...dirty].join(\"\"), [dirty]);\n\n  return useMemo(\n    () => ({\n      isDirty,\n      isRowDirty,\n      count: dirty.size,\n      mark,\n      confirm,\n      confirmRow,\n      confirmAll,\n      signature,\n    }),\n    [\n      isDirty,\n      isRowDirty,\n      dirty.size,\n      mark,\n      confirm,\n      confirmRow,\n      confirmAll,\n      signature,\n    ]\n  );\n}\n","/**\n * A row changed underneath an open editor.\n *\n * The table does not own the data, so it cannot merge. It can keep what the\n * reader typed, take the incoming value, or ask. Silently discarding a draft\n * is the one outcome nobody forgives, so the default is to ask.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport { devWarn } from \"../utils/devWarn\";\nimport { type EditableColumnLike, readEditableCellValue } from \"./cellEditing\";\n\n/** How an unhandled conflict is resolved. */\nexport type EditConflictPolicy = \"keep\" | \"take\" | \"ask\";\n\n/** The host's choice, when it makes one. */\nexport type EditConflictChoice = \"keep\" | \"take\";\n\n/**\n * One conflict. `row` is what just arrived; `previous` is the snapshot the\n * editor opened against (or last accepted).\n */\nexport interface EditConflict<TRow> {\n  /** The incoming row. */\n  row: TRow;\n  /** The row as it was when the editor opened (or last accepted). */\n  previous: TRow;\n  /** Its stable id. */\n  rowId: string;\n  /** The column being edited. */\n  columnKey: string;\n  /** What the reader has typed. */\n  draft: string;\n  /** The incoming cell value. */\n  incomingValue: string;\n  /** The cell value the editor opened against. */\n  previousValue: string;\n}\n\n/** What a host returns from {@link EditConflictHandler}. `void` defers to policy. */\nexport type EditConflictHandler<TRow> = (\n  conflict: EditConflict<TRow>\n) => EditConflictChoice | void;\n\n/** Headless conflict state for the active editor. */\nexport interface EditConflictState<TRow> {\n  /** The conflict being asked about, or `null`. */\n  current: EditConflict<TRow> | null;\n  /** Whether this cell is the one in conflict. */\n  isConflict: (rowId: string, columnKey: string) => boolean;\n  /** Keep the draft; accept the incoming row as the new snapshot. */\n  keep: () => void;\n  /** Replace the draft with the incoming value. */\n  take: () => void;\n  /**\n   * Compare the open editor to the live rows. Call from the same effect that\n   * discards a missing row — a conflict is that check one step milder.\n   */\n  reconcile: (input: ReconcileLiveEdit<TRow>) => void;\n  /** Drop a conflict without choosing — the editor closed. */\n  clear: () => void;\n}\n\n/** What {@link EditConflictState.reconcile} needs to judge one live update. */\nexport interface ReconcileLiveEdit<TRow> {\n  /** The active cell, or `null` when idle. */\n  active: { rowId: string; columnKey: string } | null;\n  /** The row the editor opened against. */\n  openedRow: TRow | undefined;\n  /** The live draft. */\n  draft: string;\n  /** The rendered row set. */\n  rows: readonly TRow[];\n  /** Columns, to read the edited field. */\n  columns: readonly EditableColumnLike<TRow>[];\n  rowKey: (row: TRow) => string;\n  /** Host version accessor — any change is a conflict, not just this cell. */\n  rowVersion?: (row: TRow) => string | number;\n  policy: EditConflictPolicy;\n  onEditConflict?: EditConflictHandler<TRow>;\n  /** Keep: new snapshot, same draft. */\n  keep: (row: TRow) => void;\n  /** Take: new snapshot and the incoming value as the draft. */\n  take: (row: TRow, incomingValue: string) => void;\n}\n\n/**\n * Whether the live row disagrees with the snapshot the editor opened against.\n *\n * With `rowVersion`, any version change is a conflict — the host said the row\n * moved. Without it, only the edited column's stored value counts, so an\n * unrelated field updating does not steal the draft.\n */\nexport function liveRowChanged<TRow>(input: {\n  opened: TRow;\n  current: TRow;\n  column: EditableColumnLike<TRow>;\n  rowVersion?: (row: TRow) => string | number;\n}): boolean {\n  if (input.rowVersion !== undefined) {\n    return (\n      String(input.rowVersion(input.opened)) !==\n      String(input.rowVersion(input.current))\n    );\n  }\n  return (\n    readEditableCellValue(input.opened, input.column) !==\n    readEditableCellValue(input.current, input.column)\n  );\n}\n\n/** Ask the host; a throw or a void return defers to policy. */\nexport function resolveConflictChoice<TRow>(\n  handler: EditConflictHandler<TRow> | undefined,\n  conflict: EditConflict<TRow>,\n  policy: EditConflictPolicy\n): EditConflictChoice | \"ask\" {\n  if (handler) {\n    try {\n      const choice = handler(conflict);\n      if (choice === \"keep\" || choice === \"take\") return choice;\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      devWarn(\n        `onEditConflict threw (${detail}) — the table used editConflictPolicy instead`\n      );\n    }\n  }\n  return policy;\n}\n\n/**\n * Headless conflict state. Inert until {@link EditConflictState.reconcile}\n * sees a live row that disagrees with the open editor.\n */\nexport function useEditConflict<TRow>(): EditConflictState<TRow> {\n  const [current, setCurrent] = useState<EditConflict<TRow> | null>(null);\n  const seen = useRef(\"\");\n  const keepLive = useRef<ReconcileLiveEdit<TRow>[\"keep\"]>(() => undefined);\n  const takeLive = useRef<ReconcileLiveEdit<TRow>[\"take\"]>(() => undefined);\n  const pending = useRef<EditConflict<TRow> | null>(null);\n\n  const clear = useCallback(() => {\n    seen.current = \"\";\n    pending.current = null;\n    setCurrent(null);\n  }, []);\n\n  const keep = useEventCallback(() => {\n    const conflict = pending.current ?? current;\n    if (!conflict) return;\n    keepLive.current(conflict.row);\n    clear();\n  });\n\n  const take = useEventCallback(() => {\n    const conflict = pending.current ?? current;\n    if (!conflict) return;\n    takeLive.current(conflict.row, conflict.incomingValue);\n    clear();\n  });\n\n  const applyChoice = useEventCallback(\n    (choice: EditConflictChoice | \"ask\", conflict: EditConflict<TRow>) => {\n      if (choice === \"keep\") {\n        keepLive.current(conflict.row);\n        setCurrent(null);\n        pending.current = null;\n        return;\n      }\n      if (choice === \"take\") {\n        takeLive.current(conflict.row, conflict.incomingValue);\n        setCurrent(null);\n        pending.current = null;\n        return;\n      }\n      pending.current = conflict;\n      setCurrent(conflict);\n    }\n  );\n\n  const reconcile = useEventCallback((input: ReconcileLiveEdit<TRow>) => {\n    keepLive.current = input.keep;\n    takeLive.current = input.take;\n    const { active, openedRow } = input;\n    if (!active || openedRow === undefined) {\n      if (seen.current !== \"\") clear();\n      return;\n    }\n    const live = input.rows.find((row) => input.rowKey(row) === active.rowId);\n    if (!live) {\n      // Missing rows are discardIfRowMissing's job.\n      if (seen.current !== \"\") clear();\n      return;\n    }\n    const column = input.columns.find((item) => item.key === active.columnKey);\n    if (!column) return;\n    if (\n      !liveRowChanged({\n        opened: openedRow,\n        current: live,\n        column,\n        rowVersion: input.rowVersion,\n      })\n    ) {\n      if (seen.current !== \"\") clear();\n      return;\n    }\n    const incomingValue = readEditableCellValue(live, column);\n    const previousValue = readEditableCellValue(openedRow, column);\n    const token = `${active.rowId}::${active.columnKey}::${incomingValue}`;\n    if (token === seen.current) return;\n    seen.current = token;\n    const conflict: EditConflict<TRow> = {\n      row: live,\n      previous: openedRow,\n      rowId: active.rowId,\n      columnKey: active.columnKey,\n      draft: input.draft,\n      incomingValue,\n      previousValue,\n    };\n    applyChoice(\n      resolveConflictChoice(input.onEditConflict, conflict, input.policy),\n      conflict\n    );\n  });\n\n  const isConflict = useCallback(\n    (rowId: string, columnKey: string) =>\n      current?.rowId === rowId && current.columnKey === columnKey,\n    [current]\n  );\n\n  return useMemo(\n    () => ({\n      current,\n      isConflict,\n      keep,\n      take,\n      reconcile,\n      clear,\n    }),\n    [current, isConflict, keep, take, reconcile, clear]\n  );\n}\n","/**\n * Editing a whole row at once.\n *\n * Cell editing commits each field as the reader leaves it, which is right for a\n * spreadsheet and wrong for a form: a row whose fields constrain each other\n * cannot be edited one cell at a time without passing through states that are\n * invalid on the way — a start date after an end date it is about to replace.\n *\n * So a row edit holds every field's draft until the reader saves, then hands the\n * host ONE patch. Cancel throws all of it away. The unit changes; nothing else\n * does — the same editors, the same validators, the same save states.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport type { EditableColumnLike } from \"./cellEditing\";\nimport {\n  parseCellEditValue,\n  readEditableCellValue,\n  resolveCellEditor,\n} from \"./cellEditing\";\nimport type { EditEventHandler } from \"./editingEvents\";\nimport { observeEdit } from \"./editingEvents\";\n\n/** The drafts a row edit holds, by column key. */\nexport type RowEditDrafts = Readonly<Record<string, string>>;\n\n/** Headless row-editing state. */\nexport interface RowEditingState<TRow> {\n  /** The row being edited, or `null` when none is. */\n  activeRowId: string | null;\n  /** Whether this row is the one being edited. */\n  isEditing: (rowId: string) => boolean;\n  /** Every draft in the open row, by column key. */\n  drafts: RowEditDrafts;\n  /** One column's draft in the open row. */\n  draftFor: (columnKey: string) => string;\n  /** Open a row, seeding every editable column from its current value. */\n  begin: (row: TRow, rowId: string) => void;\n  /** Replace one column's draft. */\n  setDraft: (columnKey: string, value: string) => void;\n  /**\n   * Hand the host everything the reader changed, as one patch, then close.\n   * A no-op when nothing is open, and it reports nothing when nothing changed —\n   * saving an untouched row is a write the host never asked for.\n   */\n  save: () => void;\n  /** Throw every draft away and close. */\n  cancel: () => void;\n  /** Whether any draft differs from the row's stored value. */\n  isDirty: boolean;\n  /** A digest of the open row's drafts, for a row memo comparator. */\n  signature: string;\n}\n\n/** What {@link useRowEditing} needs. */\nexport interface UseRowEditingOptions<TRow> {\n  /**\n   * Whether row editing is armed. Off by default: it changes the commit unit,\n   * which is a decision about the data, not a preference.\n   */\n  enabled?: boolean;\n  /** The columns, for seeding drafts and parsing them back. */\n  columns: readonly EditableColumnLike<TRow>[];\n  /**\n   * Take everything the reader changed, as one patch of parsed values keyed by\n   * column. The table never writes to a row.\n   */\n  onRowEdit?: (row: TRow, patch: Readonly<Record<string, unknown>>) => unknown;\n  /** An editor opened on this row. */\n  onEditStart?: EditEventHandler<TRow>;\n  /** The reader threw the drafts away. */\n  onEditCancel?: EditEventHandler<TRow>;\n  /** The host received the patch. */\n  onEditCommit?: EditEventHandler<TRow>;\n}\n\n/** Every column a reader may edit on a given row. */\nfunction editableColumns<TRow>(\n  columns: readonly EditableColumnLike<TRow>[],\n  row: TRow\n): EditableColumnLike<TRow>[] {\n  return columns.filter((column) => {\n    const { editable } = column;\n    if (editable === undefined || editable === false) return false;\n    return editable === true || editable(row);\n  });\n}\n\n/**\n * Headless state for editing a row as one unit.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseRowEditingOptions}.\n * @returns The state; inert unless `enabled`.\n */\nexport function useRowEditing<TRow>(\n  options: UseRowEditingOptions<TRow>\n): RowEditingState<TRow> {\n  const enabled = options.enabled ?? false;\n  const [activeRowId, setActiveRowId] = useState<string | null>(null);\n  const [drafts, setDrafts] = useState<RowEditDrafts>({});\n  // A ref beside the state, written in the same tick: a picker that sets a\n  // draft and commits in one gesture — the documented pattern for a custom\n  // editor — would otherwise save the drafts as they were before its own click.\n  const draftsRef = useRef<RowEditDrafts>({});\n  // The row and its seeds as they were when the edit opened: what \"changed\"\n  // is measured against, and what the patch is built from. A ref because a\n  // save reads them in the same tick a keystroke wrote a draft.\n  const opened = useRef<{\n    row: TRow;\n    rowId: string;\n    seeds: RowEditDrafts;\n  } | null>(null);\n\n  const begin = useEventCallback((row: TRow, rowId: string) => {\n    if (!enabled) return;\n    const seeds: Record<string, string> = {};\n    for (const column of editableColumns(options.columns, row)) {\n      seeds[column.key] = readEditableCellValue(row, column);\n    }\n    opened.current = { row, rowId, seeds };\n    draftsRef.current = seeds;\n    setActiveRowId(rowId);\n    setDrafts(seeds);\n    observeEdit(options.onEditStart, {\n      row,\n      rowId,\n      columnKey: \"\",\n      value: seeds,\n      previousValue: row,\n      unit: \"row\",\n    });\n  });\n\n  const setDraft = useEventCallback((columnKey: string, value: string) => {\n    if (draftsRef.current[columnKey] === value) return;\n    draftsRef.current = { ...draftsRef.current, [columnKey]: value };\n    setDrafts(draftsRef.current);\n  });\n\n  const close = useEventCallback((kind: \"cancel\" | \"silent\" = \"silent\") => {\n    const open = opened.current;\n    if (kind === \"cancel\" && open) {\n      observeEdit(options.onEditCancel, {\n        row: open.row,\n        rowId: open.rowId,\n        columnKey: \"\",\n        value: draftsRef.current,\n        previousValue: open.seeds,\n        unit: \"row\",\n      });\n    }\n    opened.current = null;\n    draftsRef.current = {};\n    setActiveRowId(null);\n    setDrafts({});\n  });\n\n  const save = useEventCallback(() => {\n    const open = opened.current;\n    if (!open) return;\n    const patch: Record<string, unknown> = {};\n    const current = draftsRef.current;\n    for (const column of editableColumns(options.columns, open.row)) {\n      const draft = current[column.key];\n      if (draft === undefined || draft === open.seeds[column.key]) continue;\n      patch[column.key] = column.parseValue\n        ? column.parseValue(draft, open.row)\n        : parseCellEditValue(resolveCellEditor(column) ?? \"text\", draft);\n    }\n    // Saving an untouched row is a write the host never asked for.\n    if (Object.keys(patch).length > 0) {\n      options.onRowEdit?.(open.row, patch);\n      observeEdit(options.onEditCommit, {\n        row: open.row,\n        rowId: open.rowId,\n        columnKey: \"\",\n        value: patch,\n        previousValue: open.row,\n        unit: \"row\",\n      });\n    }\n    close(\"silent\");\n  });\n\n  const isDirty = useMemo(() => {\n    const open = opened.current;\n    if (!open) return false;\n    return Object.entries(drafts).some(\n      ([key, value]) => value !== open.seeds[key]\n    );\n  }, [drafts]);\n\n  const isEditing = useCallback(\n    (rowId: string) => activeRowId === rowId,\n    [activeRowId]\n  );\n\n  const draftFor = useCallback(\n    (columnKey: string) => drafts[columnKey] ?? \"\",\n    [drafts]\n  );\n\n  const signature = useMemo(\n    () =>\n      activeRowId === null\n        ? \"\"\n        : `${activeRowId}:${Object.entries(drafts)\n            .map(([key, value]) => `${key}=${value}`)\n            .join(\"|\")}`,\n    [activeRowId, drafts]\n  );\n\n  return useMemo(\n    () => ({\n      activeRowId,\n      isEditing,\n      drafts,\n      draftFor,\n      begin,\n      setDraft,\n      save,\n      cancel: () => {\n        close(\"cancel\");\n      },\n      isDirty,\n      signature,\n    }),\n    [\n      activeRowId,\n      isEditing,\n      drafts,\n      draftFor,\n      begin,\n      setDraft,\n      save,\n      close,\n      isDirty,\n      signature,\n    ]\n  );\n}\n","/**\n * What a cell shows while its edit is being saved, and what happens when the\n * save fails.\n *\n * `onCellEdit` may return a promise. If it does, the table knows something the\n * reader cannot see: the value is on its way somewhere. A cell that looks\n * committed while a request is still out is a lie the reader finds out about\n * only when it fails — so the cell is marked saving until the promise settles,\n * and marked failed with the reason if it rejects.\n *\n * The table still does not own the data. An optimistic table has already shown\n * the new value (the host applied it in `onCellEdit`), so a rejection has to put\n * the old one back: `onRollback` hands the host the previous value to restore,\n * because only the host can write to its own rows.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport type { EditEventHandler } from \"./editingEvents\";\nimport { observeEdit } from \"./editingEvents\";\n\n/** What a cell's last save is doing. */\nexport type CellSaveStatus = \"saving\" | \"failed\";\n\n/** One cell's failed save, with what it takes to retry or undo it. */\nexport interface FailedCellSave<TRow> {\n  /** The row as it was before the edit — what a rollback restores. */\n  previous: TRow;\n  /** The value the reader tried to save. */\n  attempted: unknown;\n  /** Why it failed, in a sentence a reader can read. */\n  message: string;\n}\n\n/** What {@link useCellSaveState} needs. */\nexport interface UseCellSaveStateOptions<TRow> {\n  /**\n   * Put the previous row back after a rejected save. Without it the table marks\n   * the cell failed and leaves the value where it is — correct for a table that\n   * refetches, wrong for one that applied the edit optimistically.\n   */\n  onRollback?: (previous: TRow, columnKey: string) => void;\n  /** Turn a rejection into the sentence the cell shows. */\n  formatError?: (error: unknown) => string;\n  /** Observe a rejected save — never owns the outcome. */\n  onEditError?: EditEventHandler<TRow>;\n}\n\n/** Per-cell save state for the whole table. */\nexport interface CellSaveState<TRow> {\n  /** What this cell's last save is doing, if anything. */\n  statusFor: (rowId: string, columnKey: string) => CellSaveStatus | undefined;\n  /** Why this cell's last save failed, if it did. */\n  failureFor: (\n    rowId: string,\n    columnKey: string\n  ) => FailedCellSave<TRow> | undefined;\n  /**\n   * Watch one commit, and report how it went: `true` when the value reached\n   * wherever it was going, `false` when it did not.\n   *\n   * The outcome comes back from here rather than being read off the state\n   * afterwards, because a caller holding a render-old closure would read the\n   * state as it was BEFORE the failure and conclude the save succeeded.\n   */\n  track: (options: {\n    rowId: string;\n    columnKey: string;\n    /** The row before the edit — what a rollback restores. */\n    previous: TRow;\n    /** The value being saved. */\n    attempted: unknown;\n    /**\n     * The cell's previous value, when the caller has it. The error event\n     * reports this as `previousValue`; without it the event uses the row.\n     */\n    previousValue?: unknown;\n    /** Whatever `onCellEdit` returned. */\n    result: unknown;\n  }) => Promise<boolean>;\n  /** Put a failed cell's previous row back, and forget the failure. */\n  rollback: (rowId: string, columnKey: string) => void;\n  /** Forget a cell's failure without restoring anything — what a retry does. */\n  clear: (rowId: string, columnKey: string) => void;\n  /** A digest of the states, for a row memo comparator. */\n  signature: string;\n  /**\n   * Whether the table was told how to put a row back. An undo control offered\n   * without one would do nothing when pressed.\n   */\n  canRollback: boolean;\n}\n\n/** `rowId` and `columnKey` as one map key. */\nconst cellKey = (rowId: string, columnKey: string) => `${rowId} ${columnKey}`;\n\n/** The default sentence for a rejection of any shape. */\nfunction defaultFormatError(error: unknown): string {\n  if (error instanceof Error) return error.message;\n  if (typeof error === \"string\" && error !== \"\") return error;\n  return \"Could not save\";\n}\n\n/** Whether a value is a promise the table should wait on. */\nfunction isThenable(value: unknown): value is Promise<unknown> {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    typeof (value as { then?: unknown }).then === \"function\"\n  );\n}\n\n/**\n * Headless save state for inline editing.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseCellSaveStateOptions}.\n * @returns The state; inert until a commit returns a promise that rejects.\n */\nexport function useCellSaveState<TRow>(\n  options: UseCellSaveStateOptions<TRow> = {}\n): CellSaveState<TRow> {\n  const [saving, setSaving] = useState<ReadonlySet<string>>(() => new Set());\n  const [failures, setFailures] = useState<\n    ReadonlyMap<string, FailedCellSave<TRow>>\n  >(() => new Map());\n  // One token per cell: a save that settles after a newer one started must not\n  // mark a cell about a value the reader has already replaced.\n  const tokens = useRef(new Map<string, number>());\n\n  const markSaving = useEventCallback((key: string, busy: boolean) => {\n    setSaving((current) => {\n      if (current.has(key) === busy) return current;\n      const next = new Set(current);\n      if (busy) next.add(key);\n      else next.delete(key);\n      return next;\n    });\n  });\n\n  const setFailure = useEventCallback(\n    (key: string, failure: FailedCellSave<TRow> | undefined) => {\n      setFailures((current) => {\n        if (failure === undefined && !current.has(key)) return current;\n        const next = new Map(current);\n        if (failure === undefined) next.delete(key);\n        else next.set(key, failure);\n        return next;\n      });\n    }\n  );\n\n  const track = useEventCallback(\n    async (input: {\n      rowId: string;\n      columnKey: string;\n      previous: TRow;\n      attempted: unknown;\n      previousValue?: unknown;\n      result: unknown;\n    }): Promise<boolean> => {\n      const { rowId, columnKey, previous, attempted, previousValue, result } =\n        input;\n      // A host that saves synchronously has nothing to wait for, and paying a\n      // render for a state that lasts no time would be worse than useless.\n      if (!isThenable(result)) return true;\n\n      const key = cellKey(rowId, columnKey);\n      const token = (tokens.current.get(key) ?? 0) + 1;\n      tokens.current.set(key, token);\n      const current = () => tokens.current.get(key) === token;\n\n      setFailure(key, undefined);\n      markSaving(key, true);\n      try {\n        await result;\n        if (current()) setFailure(key, undefined);\n        return true;\n      } catch (error) {\n        // A superseded save says nothing either way: a newer one owns the cell.\n        if (!current()) return false;\n        const message = (options.formatError ?? defaultFormatError)(error);\n        setFailure(key, {\n          previous,\n          attempted,\n          message,\n        });\n        observeEdit(options.onEditError, {\n          row: previous,\n          rowId,\n          columnKey,\n          value: attempted,\n          previousValue: previousValue ?? previous,\n          unit: \"cell\",\n          error: message,\n        });\n        return false;\n      } finally {\n        if (current()) markSaving(key, false);\n      }\n    }\n  );\n\n  const rollback = useEventCallback((rowId: string, columnKey: string) => {\n    const key = cellKey(rowId, columnKey);\n    const failure = failures.get(key);\n    if (!failure) return;\n    setFailure(key, undefined);\n    options.onRollback?.(failure.previous, columnKey);\n  });\n\n  const clear = useEventCallback((rowId: string, columnKey: string) => {\n    setFailure(cellKey(rowId, columnKey), undefined);\n  });\n\n  const signature = useMemo(\n    () =>\n      [\n        ...saving,\n        ...[...failures.entries()].map(([key, f]) => key + f.message),\n      ].join(\"\"),\n    [saving, failures]\n  );\n\n  const statusFor = useCallback(\n    (rowId: string, columnKey: string): CellSaveStatus | undefined => {\n      const key = cellKey(rowId, columnKey);\n      if (saving.has(key)) return \"saving\";\n      return failures.has(key) ? \"failed\" : undefined;\n    },\n    [saving, failures]\n  );\n\n  const failureFor = useCallback(\n    (rowId: string, columnKey: string) =>\n      failures.get(cellKey(rowId, columnKey)),\n    [failures]\n  );\n\n  return useMemo(\n    () => ({\n      statusFor,\n      failureFor,\n      track,\n      rollback,\n      clear,\n      signature,\n      canRollback: options.onRollback !== undefined,\n    }),\n    [\n      statusFor,\n      failureFor,\n      track,\n      rollback,\n      clear,\n      signature,\n      options.onRollback,\n    ]\n  );\n}\n","/**\n * Headless editing state machine: one active cell, draft value, and the\n * Enter / Escape / Tab keyboard flow.\n *\n * Opt-in by design — calling this hook alone does nothing visible. Adapters\n * only surface editors when the table passes `onCellEdit` (see\n * {@link TableChrome.editing}) and a column sets `editable`.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n  type CellEditCommit,\n  type CellEditTarget,\n  type EditableColumnLike,\n  isCellEditable,\n  readEditableCellValue,\n  stepEditableCell,\n} from \"./cellEditing\";\nimport type { EditEventHandler } from \"./editingEvents\";\nimport { observeEdit } from \"./editingEvents\";\n\n/** Keyboard outcome from {@link CellEditingState.handleKeyDown}. */\nexport type CellEditKeyAction = \"commit\" | \"cancel\" | \"commit-advance\";\n\n/** Row/column context for Tab / Shift+Tab advance. */\nexport interface CellEditNavigation {\n  rows: readonly unknown[];\n  columns: readonly EditableColumnLike[];\n  rowKey: (row: unknown) => string;\n}\n\n/** Outcome of {@link CellEditingState.handleKeyDown}. */\nexport interface CellEditKeyOutcome {\n  action: CellEditKeyAction;\n  commit: CellEditCommit | null;\n  advanceTarget: CellEditTarget | null;\n}\n\n/** Headless cell-editing state returned by {@link useCellEditing}. */\nexport interface CellEditingState {\n  /** The cell currently being edited, or `null` when idle. */\n  active: CellEditTarget | null;\n  /** Live draft string for the active editor. */\n  draft: string;\n  /** Whether `(rowId, columnKey)` is the active cell. */\n  isActive: (rowId: string, columnKey: string) => boolean;\n  /**\n   * Start editing a cell. Re-beginning the same cell keeps the draft;\n   * switching cells abandons the previous draft without committing.\n   * Pass the row so lifecycle observers can name what opened.\n   */\n  begin: (\n    rowId: string,\n    columnKey: string,\n    initialValue: string,\n    row?: unknown\n  ) => void;\n  /** Update the draft without committing. */\n  setDraft: (value: string) => void;\n  /**\n   * Commit the draft. Returns the commit payload, or `null` when idle.\n   * Clears the active cell. The table never mutates rows — callers must\n   * apply the result through `onCellEdit` (see {@link applyCellEditCommit}).\n   */\n  commit: () => CellEditCommit | null;\n  /**\n   * Cancel editing and clear the active cell (Escape). Adapters should\n   * restore focus to the cell that was being edited.\n   */\n  cancel: () => void;\n  /**\n   * Close the editor without treating it as a cancel — what a successful\n   * validation does before handing the value to the host. Observers do not\n   * hear about this; the commit event fires from the send instead.\n   */\n  close: () => void;\n  /**\n   * Drop the active edit when its row leaves the current page/filter set\n   * (no commit). No-op when idle or the row is still present.\n   */\n  discardIfRowMissing: (\n    rows: readonly unknown[],\n    rowKey: (row: unknown) => string\n  ) => void;\n  /**\n   * The row the editor opened against, so a live update can be compared to\n   * what the reader started from.\n   */\n  openedRow: () => unknown;\n  /**\n   * Keep the draft and accept `row` as the new snapshot — the incoming\n   * change is acknowledged, the typing is not.\n   */\n  keepLive: (row: unknown) => void;\n  /**\n   * Replace the draft with `value` and accept `row` as the new snapshot —\n   * the reader takes the incoming cell.\n   */\n  takeLive: (row: unknown, value: string) => void;\n  /**\n   * Keyboard flow:\n   * - Enter → commit\n   * - Escape → cancel (adapters restore focus)\n   * - Tab → commit and advance; Shift+Tab → commit and go previous\n   *\n   * Returns `null` when idle or for unrelated keys (so the input keeps\n   * default behaviour).\n   */\n  handleKeyDown: (\n    event: { key: string; preventDefault: () => void; shiftKey?: boolean },\n    navigation?: CellEditNavigation\n  ) => CellEditKeyOutcome | null;\n}\n\n/** What {@link useCellEditing} observes, when the host wired lifecycle events. */\nexport interface UseCellEditingOptions<TRow = unknown> {\n  /** An editor opened. */\n  onEditStart?: EditEventHandler<TRow>;\n  /** The reader threw the draft away (Escape, or switching cells). */\n  onEditCancel?: EditEventHandler<TRow>;\n}\n\n/**\n * Headless editing state machine: one active cell, draft value, and the\n * Enter / Escape / Tab keyboard flow.\n *\n * @typeParam TRow - The row type, when lifecycle observers are wired.\n * @param options - Optional start/cancel observers.\n * @returns The state machine.\n */\nexport function useCellEditing<TRow = unknown>(\n  options: UseCellEditingOptions<TRow> = {}\n): CellEditingState {\n  const [active, setActive] = useState<CellEditTarget | null>(null);\n  const [draft, setDraft] = useState(\"\");\n  // Refs so commit/cancel always see the latest values without stale\n  // closures when wired through a keydown listener.\n  const activeRef = useRef(active);\n  const draftRef = useRef(draft);\n  activeRef.current = active;\n  draftRef.current = draft;\n  const openedRef = useRef<{\n    rowId: string;\n    columnKey: string;\n    initial: string;\n    row: TRow | undefined;\n  } | null>(null);\n\n  /** Update draft state and the sync ref in the same tick. */\n  const writeDraft = useCallback((value: string) => {\n    draftRef.current = value;\n    setDraft(value);\n  }, []);\n\n  /**\n   * Same for the active cell: the ref exists so callers within one tick see\n   * what just happened, and a `setActive` that left the ref stale made\n   * `begin` right after `commit` a silent no-op — it read the cell it had\n   * just closed and treated the reopen as \"same cell, keep the draft\".\n   */\n  const writeActive = useCallback((next: CellEditTarget | null) => {\n    activeRef.current = next;\n    setActive(next);\n  }, []);\n\n  const isActive = useCallback(\n    (rowId: string, columnKey: string) =>\n      active?.rowId === rowId && active.columnKey === columnKey,\n    [active]\n  );\n\n  const fireCancel = useCallback(() => {\n    const opened = openedRef.current;\n    if (!opened?.row) return;\n    observeEdit(options.onEditCancel, {\n      row: opened.row,\n      rowId: opened.rowId,\n      columnKey: opened.columnKey,\n      value: draftRef.current,\n      previousValue: opened.initial,\n      unit: \"cell\",\n    });\n  }, [options.onEditCancel]);\n\n  const clearOpened = useCallback(() => {\n    openedRef.current = null;\n    writeActive(null);\n    writeDraft(\"\");\n  }, [writeActive, writeDraft]);\n\n  const begin = useCallback(\n    (rowId: string, columnKey: string, initialValue: string, row?: unknown) => {\n      const current = activeRef.current;\n      if (current?.rowId === rowId && current.columnKey === columnKey) {\n        return;\n      }\n      if (current) fireCancel();\n      const typed = row as TRow | undefined;\n      openedRef.current = {\n        rowId,\n        columnKey,\n        initial: initialValue,\n        row: typed,\n      };\n      writeActive({ rowId, columnKey });\n      writeDraft(initialValue);\n      if (typed !== undefined) {\n        observeEdit(options.onEditStart, {\n          row: typed,\n          rowId,\n          columnKey,\n          value: initialValue,\n          previousValue: initialValue,\n          unit: \"cell\",\n        });\n      }\n    },\n    [fireCancel, options.onEditStart, writeActive, writeDraft]\n  );\n\n  const commit = useCallback((): CellEditCommit | null => {\n    const current = activeRef.current;\n    if (!current) return null;\n    const result: CellEditCommit = {\n      rowId: current.rowId,\n      columnKey: current.columnKey,\n      draft: draftRef.current,\n    };\n    openedRef.current = null;\n    writeActive(null);\n    writeDraft(\"\");\n    return result;\n  }, [writeActive, writeDraft]);\n\n  const cancel = useCallback(() => {\n    fireCancel();\n    clearOpened();\n  }, [clearOpened, fireCancel]);\n\n  const close = useCallback(() => {\n    clearOpened();\n  }, [clearOpened]);\n\n  const discardIfRowMissing = useCallback(\n    (rows: readonly unknown[], rowKey: (row: unknown) => string) => {\n      const current = activeRef.current;\n      if (!current) return;\n      if (rows.some((row) => rowKey(row) === current.rowId)) return;\n      openedRef.current = null;\n      writeActive(null);\n      writeDraft(\"\");\n    },\n    [writeActive, writeDraft]\n  );\n\n  const openedRow = useCallback(() => openedRef.current?.row, []);\n\n  const keepLive = useCallback((row: unknown) => {\n    const opened = openedRef.current;\n    if (!opened) return;\n    openedRef.current = { ...opened, row: row as TRow };\n  }, []);\n\n  const takeLive = useCallback(\n    (row: unknown, value: string) => {\n      const opened = openedRef.current;\n      if (!opened) return;\n      openedRef.current = { ...opened, row: row as TRow, initial: value };\n      writeDraft(value);\n    },\n    [writeDraft]\n  );\n\n  const handleKeyDown = useCallback(\n    (\n      event: { key: string; preventDefault: () => void; shiftKey?: boolean },\n      navigation?: CellEditNavigation\n    ): CellEditKeyOutcome | null => {\n      if (!activeRef.current) return null;\n\n      if (event.key === \"Escape\") {\n        event.preventDefault();\n        cancel();\n        return { action: \"cancel\", commit: null, advanceTarget: null };\n      }\n\n      if (event.key === \"Enter\") {\n        event.preventDefault();\n        return {\n          action: \"commit\",\n          commit: commit(),\n          advanceTarget: null,\n        };\n      }\n\n      if (event.key === \"Tab\" && navigation) {\n        event.preventDefault();\n        const result = commit();\n        const advanceTarget = result\n          ? stepEditableCell({\n              rows: navigation.rows,\n              columns: navigation.columns,\n              rowKey: navigation.rowKey,\n              from: { rowId: result.rowId, columnKey: result.columnKey },\n              direction: event.shiftKey ? -1 : 1,\n            })\n          : null;\n        return {\n          action: \"commit-advance\",\n          commit: result,\n          advanceTarget,\n        };\n      }\n\n      return null;\n    },\n    [cancel, commit]\n  );\n\n  return useMemo(\n    () => ({\n      active,\n      draft,\n      isActive,\n      begin,\n      setDraft: writeDraft,\n      commit,\n      cancel,\n      close,\n      discardIfRowMissing,\n      openedRow,\n      keepLive,\n      takeLive,\n      handleKeyDown,\n    }),\n    [\n      active,\n      draft,\n      isActive,\n      begin,\n      writeDraft,\n      commit,\n      cancel,\n      close,\n      discardIfRowMissing,\n      openedRow,\n      keepLive,\n      takeLive,\n      handleKeyDown,\n    ]\n  );\n}\n\n/**\n * Begin editing when the column is editable for this row; no-op otherwise.\n * Prefer this over raw `begin` so adapters never open an editor the host\n * didn't opt into.\n */\nexport function beginCellEdit<TRow>(\n  editing: CellEditingState,\n  row: TRow,\n  column: EditableColumnLike<TRow>,\n  rowKey: (row: TRow) => string\n): boolean {\n  if (!isCellEditable(column, row)) return false;\n  editing.begin(\n    rowKey(row),\n    column.key,\n    readEditableCellValue(row, column),\n    row\n  );\n  return true;\n}\n","/**\n * Validation that gates a commit — and gates nothing else.\n *\n * The host owns persistence. A validator's only power is to stop `onCellEdit`\n * from firing and to put a message on the cell; it never rejects a draft the\n * reader is still typing, never rewrites a value, and never decides what to\n * save. That boundary is what keeps validation composable with a host that\n * validates again on the server, which it will.\n *\n * Two levels, because they answer different questions. A **cell** validator\n * knows one value: is this a number, is it in range, is the SKU real. A **row**\n * validator sees the row the edit would produce and can answer the questions no\n * single cell can — an end date before its start, a total that must match its\n * parts. A cell failure marks that cell; a row failure marks the row and may\n * name cells too.\n *\n * Both may be async, because the interesting checks are: \"is this username\n * taken\" is a request. An async check leaves the editor open and the cell marked\n * busy rather than blocking the keystroke, and a newer draft supersedes an older\n * check — a stale answer must never mark a value the reader has already changed.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\n\n/** Validate one edited value. Return a message to reject it, nothing to allow. */\nexport type CellValidator<TRow> = (\n  value: unknown,\n  row: TRow\n) => string | undefined | Promise<string | undefined>;\n\n/**\n * Validate the row an edit would produce.\n *\n * Return a message for a row-level problem, a map of column key → message to\n * mark individual cells, or nothing to allow the commit.\n */\nexport type RowValidator<TRow> = (\n  row: TRow\n) =>\n  | string\n  | Record<string, string>\n  | undefined\n  | Promise<string | Record<string, string> | undefined>;\n\n/** A cell address, as the editing state spells it. */\nexport interface ValidationTarget {\n  rowId: string;\n  columnKey: string;\n}\n\n/** What {@link useEditValidation} needs. */\nexport interface UseEditValidationOptions<TRow> {\n  /** The row-level validator, when the host declared one. */\n  validateRow?: RowValidator<TRow>;\n  /**\n   * Apply an edit to a row without mutating it, so the row validator sees what\n   * the commit WOULD produce rather than what is stored. Defaults to a shallow\n   * spread keyed by the column key.\n   */\n  applyEdit?: (row: TRow, columnKey: string, value: unknown) => TRow;\n}\n\n/** Outcome of {@link EditValidationState.check}. */\nexport interface ValidationCheckResult {\n  /** Whether the commit may proceed. */\n  allowed: boolean;\n  /**\n   * Why it may not, when it may not. Absent when a newer check superseded\n   * this one.\n   */\n  error?: string;\n}\n\n/** Validation state for the whole table. */\nexport interface EditValidationState<TRow> {\n  /** The message on one cell, if any. */\n  errorFor: (rowId: string, columnKey: string) => string | undefined;\n  /** The row-level message, if any. */\n  rowErrorFor: (rowId: string) => string | undefined;\n  /** Whether a cell's validators are still running. */\n  isValidating: (rowId: string, columnKey: string) => boolean;\n  /** Whether any cell in this row carries a message. */\n  rowHasError: (rowId: string) => boolean;\n  /**\n   * Run the validators for one commit.\n   *\n   * `allowed` is whether the commit may proceed. A rejection also carries\n   * `error` — the sentence the editor shows — so a caller that fires in the\n   * same tick as the check does not have to wait for a render to read it.\n   */\n  check: (options: {\n    target: ValidationTarget;\n    value: unknown;\n    row: TRow;\n    validateCell?: CellValidator<TRow>;\n  }) => Promise<ValidationCheckResult>;\n  /** Forget everything about one cell — what cancelling an edit does. */\n  clear: (rowId: string, columnKey: string) => void;\n  /** Forget every message. */\n  clearAll: () => void;\n  /** A digest of the messages, for a row memo comparator. */\n  signature: string;\n  /**\n   * Whether a row validator is armed. A cell with no validator of its own still\n   * has to run the check when the table has one — a cross-field rule fires on\n   * whichever cell was edited.\n   */\n  hasRowValidator: boolean;\n}\n\n/**\n * `rowId` and `columnKey` as one map key.\n *\n * A control character rather than a printable separator, because a column key\n * is arbitrary data: any separator that can appear inside one makes two\n * different cells share a key. Written as an escape so it is visible in this\n * file rather than invisible in it — a source file carrying a raw NUL is one\n * git treats as binary, with no diff and no blame.\n */\nconst cellKey = (rowId: string, columnKey: string) =>\n  `${rowId}\\u0000${columnKey}`;\n\n/**\n * Headless validation state for inline editing.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseEditValidationOptions}.\n * @returns The state; inert until a validator rejects something.\n */\nexport function useEditValidation<TRow>(\n  options: UseEditValidationOptions<TRow> = {}\n): EditValidationState<TRow> {\n  const [cellErrors, setCellErrors] = useState<ReadonlyMap<string, string>>(\n    () => new Map()\n  );\n  const [rowErrors, setRowErrors] = useState<ReadonlyMap<string, string>>(\n    () => new Map()\n  );\n  const [validating, setValidating] = useState<ReadonlySet<string>>(\n    () => new Set()\n  );\n  // One token per cell, bumped on every check: a check that resolves after a\n  // newer one started must not write its verdict over the newer answer.\n  const tokens = useRef(new Map<string, number>());\n\n  const setCellError = useEventCallback((key: string, message?: string) => {\n    setCellErrors((current) => {\n      if ((current.get(key) ?? undefined) === message) return current;\n      const next = new Map(current);\n      if (message === undefined) next.delete(key);\n      else next.set(key, message);\n      return next;\n    });\n  });\n\n  const setRowError = useEventCallback((rowId: string, message?: string) => {\n    setRowErrors((current) => {\n      if ((current.get(rowId) ?? undefined) === message) return current;\n      const next = new Map(current);\n      if (message === undefined) next.delete(rowId);\n      else next.set(rowId, message);\n      return next;\n    });\n  });\n\n  const markValidating = useEventCallback((key: string, busy: boolean) => {\n    setValidating((current) => {\n      if (current.has(key) === busy) return current;\n      const next = new Set(current);\n      if (busy) next.add(key);\n      else next.delete(key);\n      return next;\n    });\n  });\n\n  const check = useEventCallback(\n    async (input: {\n      target: ValidationTarget;\n      value: unknown;\n      row: TRow;\n      validateCell?: CellValidator<TRow>;\n    }): Promise<ValidationCheckResult> => {\n      const { target, value, row, validateCell } = input;\n      const { validateRow, applyEdit = shallowApplyEdit } = options;\n      if (!validateCell && !validateRow) return { allowed: true };\n\n      const key = cellKey(target.rowId, target.columnKey);\n      const token = (tokens.current.get(key) ?? 0) + 1;\n      tokens.current.set(key, token);\n      const current = () => tokens.current.get(key) === token;\n\n      markValidating(key, true);\n      try {\n        const cellMessage = await validateCell?.(value, row);\n        if (!current()) return { allowed: false };\n        if (cellMessage !== undefined) {\n          setCellError(key, cellMessage);\n          setRowError(target.rowId, undefined);\n          return { allowed: false, error: cellMessage };\n        }\n        const edited = applyEdit(row, target.columnKey, value);\n        const rowVerdict = await validateRow?.(edited);\n        if (!current()) return { allowed: false };\n        return settleRowVerdict({\n          verdict: rowVerdict,\n          target,\n          setCellError,\n          setRowError,\n        });\n      } finally {\n        if (current()) markValidating(key, false);\n      }\n    }\n  );\n\n  const clear = useEventCallback((rowId: string, columnKey: string) => {\n    const key = cellKey(rowId, columnKey);\n    tokens.current.set(key, (tokens.current.get(key) ?? 0) + 1);\n    setCellError(key, undefined);\n    setRowError(rowId, undefined);\n    markValidating(key, false);\n  });\n\n  const clearAll = useEventCallback(() => {\n    tokens.current.clear();\n    setCellErrors(new Map());\n    setRowErrors(new Map());\n    setValidating(new Set());\n  });\n\n  // A value digest, so a row memo can compare messages without holding maps.\n  const signature = useMemo(\n    () =>\n      [...cellErrors.entries(), ...rowErrors.entries(), ...validating]\n        .flat()\n        .join(\"\\u0001\"),\n    [cellErrors, rowErrors, validating]\n  );\n\n  const errorFor = useCallback(\n    (rowId: string, columnKey: string) =>\n      cellErrors.get(cellKey(rowId, columnKey)),\n    [cellErrors]\n  );\n  const rowErrorFor = useCallback(\n    (rowId: string) => rowErrors.get(rowId),\n    [rowErrors]\n  );\n  const isValidating = useCallback(\n    (rowId: string, columnKey: string) =>\n      validating.has(cellKey(rowId, columnKey)),\n    [validating]\n  );\n  const rowHasError = useCallback(\n    (rowId: string) => {\n      if (rowErrors.has(rowId)) return true;\n      const prefix = `${rowId}\\u0000`;\n      for (const key of cellErrors.keys()) {\n        if (key.startsWith(prefix)) return true;\n      }\n      return false;\n    },\n    [cellErrors, rowErrors]\n  );\n\n  return useMemo(\n    () => ({\n      errorFor,\n      rowErrorFor,\n      isValidating,\n      rowHasError,\n      check,\n      clear,\n      clearAll,\n      signature,\n      hasRowValidator: options.validateRow !== undefined,\n    }),\n    [\n      errorFor,\n      rowErrorFor,\n      isValidating,\n      rowHasError,\n      check,\n      clear,\n      clearAll,\n      signature,\n      options.validateRow,\n    ]\n  );\n}\n\n/**\n * Record a row validator's verdict.\n *\n * A bare string is the row's own problem; a map names cells, which is how a\n * cross-field rule points at the field the reader should look at.\n */\nfunction settleRowVerdict(input: {\n  verdict: string | Record<string, string> | undefined;\n  target: ValidationTarget;\n  setCellError: (key: string, message?: string) => void;\n  setRowError: (rowId: string, message?: string) => void;\n}): ValidationCheckResult {\n  const { verdict, target, setCellError, setRowError } = input;\n  const key = cellKey(target.rowId, target.columnKey);\n  if (verdict === undefined) {\n    setCellError(key, undefined);\n    setRowError(target.rowId, undefined);\n    return { allowed: true };\n  }\n  if (typeof verdict === \"string\") {\n    setCellError(key, undefined);\n    setRowError(target.rowId, verdict);\n    return { allowed: false, error: verdict };\n  }\n  setRowError(target.rowId, undefined);\n  for (const [columnKey, message] of Object.entries(verdict)) {\n    setCellError(cellKey(target.rowId, columnKey), message);\n  }\n  // An empty map is a pass: the validator ran and named nothing.\n  const keys = Object.keys(verdict);\n  const firstKey = keys[0];\n  if (firstKey === undefined) return { allowed: true };\n  return {\n    allowed: false,\n    error: verdict[target.columnKey] ?? verdict[firstKey],\n  };\n}\n\n/**\n * The row an edit would produce, without touching the stored one.\n *\n * A shallow spread keyed by the column key is right for the common case where a\n * column key IS the field. A host whose columns read nested paths passes its own\n * `applyEdit`.\n */\nfunction shallowApplyEdit<TRow>(\n  row: TRow,\n  columnKey: string,\n  value: unknown\n): TRow {\n  return { ...row, [columnKey]: value };\n}\n","import { useMemo } from \"react\";\n\nimport type { ExtraFilters, FilterValue } from \"../types\";\n\n/** A single removable filter chip. */\nexport interface ActiveFilterChip {\n  /** Stable identifier, e.g. `\"status:Active\"`. */\n  key: string;\n  /** Pre-translated label shown in the chip. */\n  label: string;\n  /** Remove-this-chip handler. */\n  onRemove: () => void;\n}\n\n/** Translate a single raw filter value into a chip label. */\nexport type ChipLabelResolver = (value: string, extra?: ExtraFilters) => string;\n\n/**\n * Merge a table's derived filter chips with caller-supplied `extraChips`,\n * avoiding a new array allocation when either side is empty. Adapters call\n * this (memoised on the inputs) to build the final chip strip.\n *\n * @param filterChips - Chips derived from the table's own filter state.\n * @param extraChips - Optional caller-provided chips to append.\n * @returns The combined chip list (one of the inputs when the other is empty).\n */\nexport function mergeFilterChips(\n  filterChips: readonly ActiveFilterChip[],\n  extraChips: readonly ActiveFilterChip[] | undefined\n): readonly ActiveFilterChip[] {\n  if (!extraChips?.length) return filterChips;\n  if (filterChips.length === 0) return extraChips;\n  return [...filterChips, ...extraChips];\n}\n\n/**\n * Resolve the active-filter count shown on the filters button: a positive\n * caller `override` wins, otherwise fall back to the number of visible chips.\n *\n * @param override - Caller-supplied count (e.g. for server-driven filters).\n * @param chipCount - Number of currently-visible chips.\n * @returns The count to display.\n */\nexport function resolveActiveFilterCount(\n  override: number | undefined,\n  chipCount: number\n): number {\n  return override && override > 0 ? override : chipCount;\n}\n\n/** Options for {@link useActiveFilterChips}. */\nexport interface UseActiveFilterChipsOptions {\n  /** Map of filter key → current value (typically a source's `extra`). */\n  readonly values: Readonly<Record<string, FilterValue>>;\n  /** Map of filter key → label resolver. Keys without a resolver are skipped. */\n  readonly labels: Readonly<Record<string, ChipLabelResolver>>;\n  /**\n   * Called when a chip's ✕ is clicked. Receives the key and the next\n   * desired value (the remaining array, or `undefined` when cleared).\n   */\n  readonly onChange: (key: string, next: FilterValue) => void;\n}\n\n/**\n * Flatten a bag of filter values into removable chips. Array values\n * become one chip per element (removing one keeps the rest); scalars\n * become a single chip. Empty values and keys without a resolver are\n * skipped.\n *\n * @param options - See {@link UseActiveFilterChipsOptions}.\n * @returns The derived chips, memoised on their inputs.\n */\nfunction pushChip(\n  chips: ActiveFilterChip[],\n  key: string,\n  entry: string,\n  label: string,\n  onRemove: () => void\n): void {\n  if (!label) return;\n  chips.push({ key: `${key}:${entry}`, label, onRemove });\n}\n\nexport function useActiveFilterChips({\n  values,\n  labels,\n  onChange,\n}: UseActiveFilterChipsOptions): ActiveFilterChip[] {\n  return useMemo(() => {\n    const chips: ActiveFilterChip[] = [];\n    for (const [key, value] of Object.entries(values)) {\n      // Own properties only — the keys come from the URL, and a crafted\n      // `?f_valueOf=x` would otherwise pull Object.prototype.valueOf out\n      // of the record and crash when called as a label resolver.\n      const resolve = Object.hasOwn(labels, key) ? labels[key] : undefined;\n      if (!resolve || value == null || value === \"\") {\n        continue;\n      }\n      if (Array.isArray(value)) {\n        for (const entry of value) {\n          pushChip(chips, key, entry, resolve(entry, values), () => {\n            const remaining = value.filter((v) => v !== entry);\n            onChange(key, remaining.length > 0 ? remaining : undefined);\n          });\n        }\n      } else {\n        const text = String(value);\n        pushChip(chips, key, text, resolve(text, values), () =>\n          onChange(key, undefined)\n        );\n      }\n    }\n    return chips;\n  }, [values, labels, onChange]);\n}\n","/**\n * The grouping keys, as a prop, as URL text, and as the list the model walks.\n *\n * Grouping travels as a comma-separated STRING — `?groupBy=team,status` — for\n * one reason: the URL and the source contract already carried a single key,\n * and a list that reads the same way keeps every link, saved view and\n * `source.setGroupBy` call ever written working. The array is what the model\n * and the adapters see; the string is what state is stored as.\n */\n\n/** How the grouping keys are written down: one key, a list, or nothing. */\nexport type GroupByInput = string | readonly string[] | null | undefined;\n\n/**\n * The grouping keys as a list, in order.\n *\n * Blank entries are dropped rather than grouped on: `\"team,\"` is a trailing\n * comma, not a request to group by a column with no name.\n *\n * @param value - The prop, the source value, or the URL parameter.\n * @returns The keys, possibly empty.\n */\nexport function parseGroupBy(value: GroupByInput): string[] {\n  if (value === null || value === undefined) return [];\n  const list = typeof value === \"string\" ? value.split(\",\") : value;\n  return list.map((key) => key.trim()).filter((key) => key.length > 0);\n}\n\n/**\n * The grouping keys as the single string state is stored as.\n *\n * @param value - The keys.\n * @returns The joined string, or `undefined` when nothing is grouped.\n */\nexport function formatGroupBy(value: GroupByInput): string | undefined {\n  const keys = parseGroupBy(value);\n  return keys.length === 0 ? undefined : keys.join(\",\");\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\n\n/** Collapse state + actions returned by {@link useGroupCollapse}. */\nexport interface GroupCollapseState {\n  /** Ids of currently collapsed groups (`group:…` keys). */\n  collapsedGroupIds: ReadonlySet<string>;\n  /** Whether a group is collapsed. */\n  isCollapsed: (groupKey: string) => boolean;\n  /** Toggle a group's collapsed state. */\n  toggle: (groupKey: string) => void;\n  /** Expand every group (clear the collapsed set). */\n  expandAll: () => void;\n  /** Collapse every group in `groupKeys`. */\n  collapseAll: (groupKeys: readonly string[]) => void;\n  /**\n   * Show the tree down to `depth` and no further: every group at that depth or\n   * deeper closes, everything above it opens. Depth 0 collapses the top level,\n   * so only the outermost headers show.\n   */\n  collapseToDepth: (\n    depth: number,\n    groups: readonly { key: string; level: number }[]\n  ) => void;\n}\n\n/**\n * Headless collapse state for single-level row groups. Ephemeral — not\n * URL-synced (punch-list #62). Groups default to expanded (empty set).\n */\nexport function useGroupCollapse(controlled?: {\n  collapsedGroupIds?: readonly string[];\n  onCollapsedGroupIdsChange?: (ids: string[]) => void;\n}): GroupCollapseState {\n  const controlledIds = controlled?.collapsedGroupIds;\n  const isControlled = controlledIds !== undefined;\n  const [uncontrolled, setUncontrolled] = useState<ReadonlySet<string>>(\n    () => new Set()\n  );\n\n  const collapsedGroupIds = useMemo(\n    () => (isControlled ? new Set(controlledIds ?? []) : uncontrolled),\n    [isControlled, controlledIds, uncontrolled]\n  );\n\n  // Stable across renders on purpose: the options object arrives fresh from\n  // the caller every time, and a `commit` that changed with it would change\n  // every action here — which rebuilds the whole grouped model on a keystroke\n  // that has nothing to do with grouping.\n  const commit = useEventCallback((next: Set<string>) => {\n    if (isControlled) {\n      controlled?.onCollapsedGroupIdsChange?.([...next]);\n    } else {\n      setUncontrolled(next);\n    }\n  });\n\n  const isCollapsed = useCallback(\n    (groupKey: string) => collapsedGroupIds.has(groupKey),\n    [collapsedGroupIds]\n  );\n\n  const toggle = useCallback(\n    (groupKey: string) => {\n      const next = new Set(collapsedGroupIds);\n      if (next.has(groupKey)) next.delete(groupKey);\n      else next.add(groupKey);\n      commit(next);\n    },\n    [collapsedGroupIds, commit]\n  );\n\n  const expandAll = useCallback(() => {\n    commit(new Set());\n  }, [commit]);\n\n  const collapseAll = useCallback(\n    (groupKeys: readonly string[]) => {\n      commit(new Set(groupKeys));\n    },\n    [commit]\n  );\n\n  const collapseToDepth = useCallback(\n    (depth: number, groups: readonly { key: string; level: number }[]) => {\n      commit(\n        new Set(\n          groups.filter((group) => group.level >= depth).map((g) => g.key)\n        )\n      );\n    },\n    [commit]\n  );\n\n  return useMemo(\n    () => ({\n      collapsedGroupIds,\n      isCollapsed,\n      toggle,\n      expandAll,\n      collapseAll,\n      collapseToDepth,\n    }),\n    [\n      collapsedGroupIds,\n      isCollapsed,\n      toggle,\n      expandAll,\n      collapseAll,\n      collapseToDepth,\n    ]\n  );\n}\n","/**\n * How much of a paged group model has been asked for.\n *\n * Revealing more is not a query: the rows are already in hand on the frontend\n * tier, and on a server tier the host fetches them and hands over a longer\n * list. So this holds nothing but counts — how many extra top-level groups,\n * and how many extra leaves per group — which is all the model needs to show\n * one more page of either.\n */\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport type { GroupPaging } from \"./groupRows\";\n\n/** Paging state and the one action that changes it. */\nexport interface GroupPagingState {\n  /** What the model reads. */\n  paging: GroupPaging;\n  /**\n   * Reveal one more page. `groupKey` names the group whose leaves to extend;\n   * omit it for the top-level groups.\n   */\n  showMore: (pageSize: number, groupKey?: string) => void;\n  /** Back to the first page of everything — what new data calls for. */\n  reset: () => void;\n}\n\n/**\n * Track how much of a paged group model is showing.\n *\n * @returns The state; inert until something calls `showMore`.\n */\nexport function useGroupPaging(): GroupPagingState {\n  const [paging, setPaging] = useState<GroupPaging>({});\n\n  const showMore = useCallback((pageSize: number, groupKey?: string) => {\n    setPaging((current) => {\n      if (groupKey === undefined) {\n        return { ...current, groups: (current.groups ?? 0) + pageSize };\n      }\n      const rows = { ...current.rows };\n      rows[groupKey] = (rows[groupKey] ?? 0) + pageSize;\n      return { ...current, rows };\n    });\n  }, []);\n\n  const reset = useCallback(() => {\n    setPaging({});\n  }, []);\n\n  return useMemo(\n    () => ({ paging, showMore, reset }),\n    [paging, showMore, reset]\n  );\n}\n","import { type RefObject, useEffect, useRef } from \"react\";\n\nimport { useEventCallback } from \"./useEventCallback\";\n\n/** Options for {@link useInfiniteScroll}. */\nexport interface UseInfiniteScrollOptions {\n  /** Whether more pages remain to be fetched. */\n  hasNextPage: boolean;\n  /** Whether a page fetch is currently in flight. */\n  isFetchingNextPage: boolean;\n  /** Loads the next page; called when the sentinel scrolls into view. */\n  fetchNextPage: () => void;\n  /**\n   * Master switch. When `false` the observer is never attached (e.g. in\n   * paged mode, or when the consumer wants explicit \"Load more\" only).\n   * @defaultValue true\n   */\n  enabled?: boolean;\n  /**\n   * `IntersectionObserver` root margin — how far before the sentinel enters\n   * the viewport the next page is prefetched.\n   * @defaultValue \"200px\"\n   */\n  rootMargin?: string;\n  /**\n   * The current number of rendered rows. Pass `source.rows.length` so the\n   * observer re-arms after each page loads: when freshly-loaded content is\n   * still shorter than the viewport the sentinel stays in view, and\n   * re-observing re-fires the callback to keep loading until the viewport\n   * fills or there is no next page. Omit to disable this auto-continue.\n   */\n  itemCount?: number;\n}\n\n/**\n * Auto-loads the next page when a sentinel element scrolls near the viewport,\n * turning a paginated {@link TableSource} into true infinite scroll. Attach\n * the returned ref to a small element rendered after the last row.\n *\n * SSR- and jsdom-safe: when `IntersectionObserver` is unavailable it no-ops,\n * so an accompanying \"Load more\" button remains the fallback. The latest\n * `fetchNextPage` is read from a ref, so passing a fresh closure each render\n * never re-subscribes the observer.\n *\n * @typeParam TElement - The sentinel element type.\n * @param options - See {@link UseInfiniteScrollOptions}.\n * @returns A ref to attach to the sentinel element.\n */\nexport function useInfiniteScroll<\n  TElement extends HTMLElement = HTMLDivElement,\n>(options: UseInfiniteScrollOptions): RefObject<TElement | null> {\n  const {\n    hasNextPage,\n    isFetchingNextPage,\n    fetchNextPage,\n    enabled = true,\n    rootMargin = \"200px\",\n    itemCount,\n  } = options;\n\n  const ref = useRef<TElement>(null);\n  // The sentinel handler always sees the latest `fetchNextPage` /\n  // `isFetchingNextPage` without re-subscribing the observer, so passing a\n  // fresh closure each render never re-arms it.\n  const onSentinelVisible = useEventCallback(() => {\n    if (!isFetchingNextPage) fetchNextPage();\n  });\n\n  useEffect(() => {\n    const el = ref.current;\n    if (!enabled || !hasNextPage || el === null) return undefined;\n    if (typeof IntersectionObserver === \"undefined\") return undefined;\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        if (entries[0]?.isIntersecting) onSentinelVisible();\n      },\n      { rootMargin }\n    );\n    observer.observe(el);\n    return () => observer.disconnect();\n  }, [enabled, hasNextPage, rootMargin, itemCount, onSentinelVisible]);\n\n  return ref;\n}\n","import { type RefObject, useEffect, useRef } from \"react\";\n\n/** Options for {@link useScrollToTableTop}. */\nexport interface UseScrollToTableTopOptions {\n  /** Table/container element to bring back below sticky chrome. */\n  ref: RefObject<HTMLElement | null>;\n  /** Dependency values that represent table view changes. */\n  deps: readonly unknown[];\n  /** Master switch. Defaults to true. */\n  enabled?: boolean;\n  /** Sticky top offset in px. Defaults to 0. */\n  offset?: number;\n  /** Extra breathing room below the sticky chrome. Defaults to 8px. */\n  gap?: number;\n  /** Scroll behavior. Defaults to smooth. */\n  behavior?: ScrollBehavior;\n}\n\n/**\n * Scroll the table back below sticky chrome after search/filter/page changes.\n * The initial render is skipped so deep links and restored browser positions\n * are not disturbed on first paint.\n */\nexport function useScrollToTableTop({\n  ref,\n  deps,\n  enabled = true,\n  offset = 0,\n  gap = 8,\n  behavior = \"smooth\",\n}: UseScrollToTableTopOptions): void {\n  const depsKey = deps.map(String).join(\"|\");\n  // Last-seen-value guard, not a boolean first-run flag: refs survive\n  // StrictMode's simulated remount, so a boolean guard scrolled on the\n  // doubled mount effect and yanked the browser's restored position. Only\n  // an actual view change (a new deps key) scrolls.\n  const lastDepsKeyRef = useRef(depsKey);\n\n  useEffect(() => {\n    if (lastDepsKeyRef.current === depsKey) return;\n    lastDepsKeyRef.current = depsKey;\n    if (!enabled) return;\n    queueMicrotask(() => {\n      const node = ref.current;\n      if (!node) return;\n      const top = node.getBoundingClientRect().top;\n      if (top < offset) {\n        window.scrollBy({\n          top: top - offset - gap,\n          behavior,\n        });\n      }\n    });\n  }, [behavior, depsKey, enabled, gap, offset, ref]);\n}\n","/**\n * An element's width, kept current.\n *\n * `undefined` until the first measurement — which matters, because \"not\n * measured yet\" and \"measured as narrow\" call for opposite behaviour. A\n * table that treated the first as the second would render its narrow layout\n * for one frame on every load, and under SSR (no `ResizeObserver`) it would\n * stay there.\n */\nimport type { RefObject } from \"react\";\nimport { useEffect, useState } from \"react\";\n\n/**\n * Track the content width of an element.\n *\n * @param ref - The element to measure.\n * @returns Its width in pixels, or `undefined` before the first measure.\n */\nexport function useElementWidth(\n  ref: RefObject<HTMLElement | null>\n): number | undefined {\n  const [width, setWidth] = useState<number | undefined>(undefined);\n\n  useEffect(() => {\n    const node = ref.current;\n    if (!node || typeof ResizeObserver === \"undefined\") return undefined;\n    const measure = () => {\n      setWidth(node.clientWidth);\n    };\n    const observer = new ResizeObserver(measure);\n    observer.observe(node);\n    measure();\n    return () => {\n      observer.disconnect();\n    };\n  }, [ref]);\n\n  return width;\n}\n","/**\n * Per-row style and height — host callbacks over the same (row, index)\n * the class hook already uses. Omit both and nothing is applied.\n *\n * A number `rowHeight` is every row; a function is per row. The\n * virtualizer's `estimateSize` reads the same value so a variable-height\n * table windows correctly. `measureElement` stays authoritative for what\n * the browser actually laid out.\n *\n * These are functions of the row, not table state — nothing goes in the URL.\n */\nimport type { CSSProperties } from \"react\";\n\n/** One height, or a height from the row. */\nexport type RowHeight<TRow> = number | ((row: TRow, index: number) => number);\n\n/** Conditional per-row inline style. */\nexport type RowStyle<TRow> = (\n  row: TRow,\n  index: number\n) => CSSProperties | undefined;\n\n/** Resolve `rowHeight` for one row. */\nexport function resolveRowHeight<TRow>(\n  rowHeight: RowHeight<TRow> | undefined,\n  row: TRow,\n  index: number\n): number | undefined {\n  if (rowHeight === undefined) return undefined;\n  return typeof rowHeight === \"number\" ? rowHeight : rowHeight(row, index);\n}\n\n/**\n * Merge `rowStyle` with an explicit height. Height wins when both name it —\n * `rowHeight` is the dedicated override.\n */\nexport function resolveRowStyle<TRow>(\n  rowStyle: RowStyle<TRow> | undefined,\n  rowHeight: RowHeight<TRow> | undefined,\n  row: TRow,\n  index: number\n): CSSProperties | undefined {\n  const style = rowStyle?.(row, index);\n  const height = resolveRowHeight(rowHeight, row, index);\n  if (style === undefined && height === undefined) return undefined;\n  if (height === undefined) return style;\n  return { ...style, height };\n}\n\n/** Stable compare key for a memoized row's resolved style. */\nexport function rowStyleSignature(style: CSSProperties | undefined): string {\n  if (style === undefined) return \"\";\n  return JSON.stringify(style);\n}\n\n/** True when the host asked for a style or a height. */\nexport function rowStyleArmed(\n  rowStyle: RowStyle<unknown> | undefined,\n  rowHeight: RowHeight<unknown> | undefined\n): boolean {\n  return rowStyle !== undefined || rowHeight !== undefined;\n}\n\n/**\n * Virtualizer estimate: a constant, or a per-index read of `rowHeight`.\n * Group/extra slots fall back to `fallback` — they are not data rows.\n */\nexport function estimateFromRowHeight<TRow>(\n  rowHeight: RowHeight<TRow> | undefined,\n  fallback: number,\n  rowAt: (index: number) => { row: TRow; index: number } | undefined\n): (index: number) => number {\n  if (rowHeight === undefined) return () => fallback;\n  if (typeof rowHeight === \"number\") return () => rowHeight;\n  return (index: number) => {\n    const found = rowAt(index);\n    if (!found) return fallback;\n    return rowHeight(found.row, found.index);\n  };\n}\n","/**\n * Full-width and separator rows — host-injected slots between data rows.\n *\n * Grouping already speaks in `kind`s. These two join that vocabulary so a\n * kit maps one list: a separator is a thin rule, a full-width row is one\n * cell spanning the table. Omit `extraRows` and nothing is inserted.\n *\n * Position is `beforeRowId` (a data-row id). Omit it to append after the\n * last data row. Several extras sharing a target keep the host's order.\n * A named extra stays in front of that person through reorder and pin —\n * pin sections splice extras whose `beforeRowId` is in that section.\n *\n * Extras are content, not table state — nothing goes in the URL. Mobile\n * cards keep the same slots: a rule between cards, or a full-width note.\n */\nimport type { CSSProperties, ReactNode } from \"react\";\n\nimport { PIN_Z } from \"../columns/useColumnLayout\";\nimport { resolveRowStyle, type RowStyle } from \"./rowStyle\";\n\n/** What the host may inject. */\nexport type ExtraRowKind = \"separator\" | \"fullWidth\";\n\n/** One host-injected slot. */\nexport interface ExtraRow {\n  /** Stable id — also the React key. */\n  key: string;\n  kind: ExtraRowKind;\n  /**\n   * Insert immediately before this data row. Omit to append after the\n   * last data row in the list being interleaved.\n   */\n  beforeRowId?: string;\n  /** Full-width body. Ignored on a separator. */\n  render?: () => ReactNode;\n}\n\n/** A separator or full-width entry in a `kind`-tagged body list. */\nexport type ExtraEntry =\n  | { kind: \"separator\"; key: string }\n  | { kind: \"fullWidth\"; key: string; render?: () => ReactNode };\n\n/** Narrow a body slot to a host-injected extra. */\nexport function isExtraEntry(entry: object): entry is ExtraEntry {\n  if (!(\"kind\" in entry)) return false;\n  const kind = (entry as { kind?: unknown }).kind;\n  return kind === \"separator\" || kind === \"fullWidth\";\n}\n\n/** True when the host asked for any extra slot. */\nexport function extraRowsArmed(\n  extraRows: readonly ExtraRow[] | undefined\n): boolean {\n  return Boolean(extraRows && extraRows.length > 0);\n}\n\nfunction toEntry(extra: ExtraRow): ExtraEntry {\n  if (extra.kind === \"separator\") return { kind: \"separator\", key: extra.key };\n  return { kind: \"fullWidth\", key: extra.key, render: extra.render };\n}\n\n/**\n * Splice extras into a `kind`-tagged list. `dataKey` names the data row\n * an entry represents — group headers return `undefined` and are never\n * a splice target.\n */\nexport function insertExtraRows<T extends { key: string }>(\n  entries: readonly T[],\n  extraRows: readonly ExtraRow[] | undefined,\n  dataKey: (entry: T) => string | undefined\n): readonly (T | ExtraEntry)[] {\n  if (!extraRows || extraRows.length === 0) return entries;\n  const before = new Map<string, ExtraRow[]>();\n  const append: ExtraRow[] = [];\n  for (const extra of extraRows) {\n    if (extra.beforeRowId === undefined) {\n      append.push(extra);\n      continue;\n    }\n    const bucket = before.get(extra.beforeRowId) ?? [];\n    bucket.push(extra);\n    before.set(extra.beforeRowId, bucket);\n  }\n  const result: (T | ExtraEntry)[] = [];\n  for (const entry of entries) {\n    const id = dataKey(entry);\n    if (id !== undefined) {\n      const waiting = before.get(id);\n      if (waiting) {\n        for (const extra of waiting) result.push(toEntry(extra));\n        before.delete(id);\n      }\n    }\n    result.push(entry);\n  }\n  for (const extra of append) result.push(toEntry(extra));\n  return result;\n}\n\n/**\n * Extras whose `beforeRowId` sits in this section. Untargeted extras\n * (no `beforeRowId`) are included only when `appendUntargeted` is true —\n * those still belong at the end of the scroll body, not in a pin section.\n */\nexport function extraRowsForSection(\n  extraRows: readonly ExtraRow[] | undefined,\n  rowIds: ReadonlySet<string>,\n  appendUntargeted = false\n): readonly ExtraRow[] | undefined {\n  if (!extraRows || extraRows.length === 0) return extraRows;\n  const next = extraRows.filter((extra) => {\n    if (extra.beforeRowId === undefined) return appendUntargeted;\n    return rowIds.has(extra.beforeRowId);\n  });\n  return next.length === 0 ? undefined : next;\n}\n\n/**\n * Splice extras whose `beforeRowId` is in this row list. Use on a pin\n * section so a named extra stays in front of a pinned person.\n */\nexport function insertExtrasBeforeRows<TRow>(\n  rows: readonly TRow[],\n  extraRows: readonly ExtraRow[] | undefined,\n  getRowId: (row: TRow) => string\n): readonly ({ key: string; row: TRow } | ExtraEntry)[] {\n  const ids = new Set(rows.map(getRowId));\n  return insertExtraRows(\n    rows.map((row) => ({ key: getRowId(row), row })),\n    extraRowsForSection(extraRows, ids),\n    (entry) => entry.key\n  );\n}\n\n/**\n * Lift an extra row above a continuing Team span so the note is not hidden\n * under it. Padding is the extra's own height — it is not folded into the\n * person below. Fill comes from that person's `rowStyle` (see\n * {@link extraHostFillStyle}); AdaptTable does not pick a colour.\n */\nexport const EXTRA_OVER_SPAN_ROW_STYLE: CSSProperties = {\n  position: \"relative\",\n  zIndex: PIN_Z.rowPinned,\n};\n\n/** Cell paint for an extra: RTL-safe align, and room for a line of text. */\nexport const EXTRA_OVER_SPAN_STYLE: CSSProperties = {\n  textAlign: \"start\",\n  paddingBlock: \"0.75rem\",\n  paddingInline: \"0.75rem\",\n};\n\n/**\n * The fill the host already passed for this extra's person. Height is not\n * copied — extras size from their own padding, not `rowHeight`.\n */\nexport function extraHostFillStyle<TRow>(\n  extraKey: string,\n  extraRows: readonly ExtraRow[] | undefined,\n  rows: readonly TRow[],\n  getRowId: (row: TRow) => string,\n  rowStyle: RowStyle<TRow> | undefined\n): CSSProperties | undefined {\n  const extra = extraRows?.find((item) => item.key === extraKey);\n  if (!extra?.beforeRowId) return undefined;\n  const index = rows.findIndex((row) => getRowId(row) === extra.beforeRowId);\n  if (index < 0) return undefined;\n  const visual = resolveRowStyle(rowStyle, undefined, rows[index]!, index);\n  if (!visual) return undefined;\n  const fill: CSSProperties = {};\n  if (visual.backgroundColor !== undefined) {\n    fill.backgroundColor = visual.backgroundColor;\n  }\n  if (visual.background !== undefined) fill.background = visual.background;\n  return Object.keys(fill).length > 0 ? fill : undefined;\n}\n\n/** Part names every kit stamps on an extra row. */\nexport const EXTRA_ROW_PARTS = {\n  separator: { row: \"separator-row\", cell: \"separator-cell\" },\n  fullWidth: { row: \"full-width-row\", cell: \"full-width-cell\" },\n} as const;\n\n/** How many extras sit immediately in front of any of these data-row ids. */\nexport function extraCountBeforeRowIds(\n  extraRows: readonly ExtraRow[] | undefined,\n  ids: ReadonlySet<string>\n): number {\n  if (!extraRows || extraRows.length === 0 || ids.size === 0) return 0;\n  let count = 0;\n  for (const extra of extraRows) {\n    if (extra.beforeRowId !== undefined && ids.has(extra.beforeRowId)) {\n      count += 1;\n    }\n  }\n  return count;\n}\n\n/**\n * Grow a data-row `rowSpan` so it still reaches the last covered person\n * after extras in front of those people take `<tr>` slots.\n */\nexport function inflateBodyCellRowSpans<\n  TCell extends { columnIndex: number; colSpan: number; rowSpan: number },\n>(\n  cellsByRow: ReadonlyMap<string, readonly TCell[]>,\n  visualIds: readonly string[],\n  extraRows: readonly ExtraRow[] | undefined\n): ReadonlyMap<string, readonly TCell[]> {\n  if (!extraRows?.length) return cellsByRow;\n  const indexOf = new Map(visualIds.map((id, index) => [id, index] as const));\n  const next = new Map<string, readonly TCell[]>();\n  for (const [id, cells] of cellsByRow) {\n    const origin = indexOf.get(id);\n    if (origin === undefined) {\n      next.set(id, cells);\n      continue;\n    }\n    let changed = false;\n    const updated = cells.map((cell) => {\n      if (cell.rowSpan <= 1) return cell;\n      const extraCount = extraCountBeforeRowIds(\n        extraRows,\n        new Set(visualIds.slice(origin + 1, origin + cell.rowSpan))\n      );\n      if (extraCount === 0) return cell;\n      changed = true;\n      return { ...cell, rowSpan: cell.rowSpan + extraCount };\n    });\n    next.set(id, changed ? updated : cells);\n  }\n  return next;\n}\n\ntype VisualSlot =\n  | { kind: \"extra\"; beforeId: string }\n  | { kind: \"row\"; id: string };\n\nfunction visualBodySlots(\n  visualIds: readonly string[],\n  extraRows: readonly ExtraRow[] | undefined\n): readonly VisualSlot[] {\n  const buckets = new Map<string, ExtraRow[]>();\n  for (const extra of extraRows ?? []) {\n    if (extra.beforeRowId === undefined) continue;\n    const list = buckets.get(extra.beforeRowId) ?? [];\n    list.push(extra);\n    buckets.set(extra.beforeRowId, list);\n  }\n  const slots: VisualSlot[] = [];\n  for (const id of visualIds) {\n    for (const extra of buckets.get(id) ?? []) {\n      slots.push({ kind: \"extra\", beforeId: extra.beforeRowId ?? id });\n    }\n    slots.push({ kind: \"row\", id });\n  }\n  return slots;\n}\n\nfunction visualSlotIndexes(\n  slots: readonly VisualSlot[],\n  beforeRowId: string\n): { extraIndexes: number[]; rowSlotIndex: Map<string, number> } {\n  const extraIndexes: number[] = [];\n  const rowSlotIndex = new Map<string, number>();\n  for (let index = 0; index < slots.length; index += 1) {\n    const slot = slots[index]!;\n    if (slot.kind === \"extra\" && slot.beforeId === beforeRowId) {\n      extraIndexes.push(index);\n    }\n    if (slot.kind === \"row\") rowSlotIndex.set(slot.id, index);\n  }\n  return { extraIndexes, rowSlotIndex };\n}\n\nfunction coverContinuingSpans(\n  cellsByRow: ReadonlyMap<\n    string,\n    readonly { columnIndex: number; colSpan: number; rowSpan: number }[]\n  >,\n  extraIndexes: number[],\n  rowSlotIndex: Map<string, number>,\n  leadingCells: number,\n  covered: Set<number>\n): void {\n  for (const [id, cells] of cellsByRow) {\n    const start = rowSlotIndex.get(id);\n    if (start === undefined) continue;\n    for (const cell of cells) {\n      addSpanCoverage(cell, start, extraIndexes, leadingCells, covered);\n    }\n  }\n}\n\nfunction addSpanCoverage(\n  cell: { columnIndex: number; colSpan: number; rowSpan: number },\n  start: number,\n  extraIndexes: number[],\n  leadingCells: number,\n  covered: Set<number>\n): void {\n  if (cell.rowSpan <= 1) return;\n  const end = start + cell.rowSpan;\n  for (const extraIndex of extraIndexes) {\n    if (extraIndex <= start || extraIndex >= end) continue;\n    for (let offset = 0; offset < cell.colSpan; offset += 1) {\n      covered.add(leadingCells + cell.columnIndex + offset);\n    }\n  }\n}\n\n/**\n * Table-slot indexes (leading chrome + data columns) a continuing row span\n * already owns on extras in front of this person — those extras omit a `<td>`\n * there so the merge can keep going.\n */\nexport function extraCoveredTableSlots(\n  beforeRowId: string,\n  options: {\n    visualIds: readonly string[];\n    cellsByRow: ReadonlyMap<\n      string,\n      readonly { columnIndex: number; colSpan: number; rowSpan: number }[]\n    >;\n    extraRows?: readonly ExtraRow[];\n    leadingCells: number;\n  }\n): ReadonlySet<number> {\n  const { visualIds, cellsByRow, extraRows, leadingCells } = options;\n  const covered = new Set<number>();\n  const { extraIndexes, rowSlotIndex } = visualSlotIndexes(\n    visualBodySlots(visualIds, extraRows),\n    beforeRowId\n  );\n  if (extraIndexes.length === 0) return covered;\n  coverContinuingSpans(\n    cellsByRow,\n    extraIndexes,\n    rowSlotIndex,\n    leadingCells,\n    covered\n  );\n  return covered;\n}\n\n/** Uncovered colSpans for an extra row that has to leave holes for a row span. */\nexport function extraUncoveredColSpans(\n  columnSpan: number,\n  coveredSlots: ReadonlySet<number> | undefined\n): readonly number[] {\n  if (!coveredSlots || coveredSlots.size === 0) return [columnSpan];\n  const spans: number[] = [];\n  let index = 0;\n  while (index < columnSpan) {\n    if (coveredSlots.has(index)) {\n      index += 1;\n      continue;\n    }\n    let span = 1;\n    while (index + span < columnSpan && !coveredSlots.has(index + span)) {\n      span += 1;\n    }\n    spans.push(span);\n    index += span;\n  }\n  return spans.length === 0 ? [columnSpan] : spans;\n}\n","/**\n * Adding, duplicating and deleting rows — the asking, never the data.\n *\n * These three sit at the boundary between the table and the host: the table\n * knows *when* the reader asked (a toolbar control, a row action) and the host\n * knows what a new row IS, what a copy of one means, and whether it may go. So\n * the table asks and the host does the rest — the same one-way flow every other\n * write already follows, which is what keeps a new row an ordinary row: it\n * arrives through the source like all the others, and editing, validation,\n * grouping, the hierarchy and virtualization need to know nothing about it.\n *\n * Duplicate and delete arrive as ordinary {@link RowAction}s, so every kit\n * already renders them — trailing buttons on desktop, card buttons on mobile,\n * hideable and end-pinnable with the actions column, and confirmable through\n * the same dialog a host's own destructive action uses.\n */\nimport { useMemo } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport type { RowAction, TableLabels } from \"../types\";\n\n/** How a table asks for a row to be added, copied or removed. */\nexport interface RowMutationHandlers<TRow> {\n  /**\n   * Add a row. Setting this puts an Add control in the toolbar; the host makes\n   * the row and stores it, and it reaches the table through the source like\n   * every other row — editable, filterable and countable from the moment it\n   * lands, with nothing about it special.\n   */\n  onAddRow?: () => unknown;\n  /**\n   * Copy a row. Setting this puts a Duplicate action on every row; what a copy\n   * means — which fields carry over, which are reset, what id it gets — is the\n   * host's, because only the host knows.\n   */\n  onDuplicateRow?: (row: TRow) => unknown;\n  /**\n   * Remove a row. Setting this puts a Delete action on every row, behind a\n   * confirmation dialog unless {@link RowMutationHandlers.confirmDeleteRow} is\n   * `false`.\n   */\n  onDeleteRow?: (row: TRow) => unknown;\n  /**\n   * Delete without asking first. Off by default: a delete is destructive and\n   * the table cannot undo it. Hosts whose own UI already confirms — or whose\n   * delete is reversible — turn it off.\n   */\n  confirmDeleteRow?: boolean;\n}\n\n/** Row-mutation state: the toolbar's control and the per-row actions. */\nexport interface RowMutationsState<TRow> {\n  /** Whether an Add control should render. */\n  canAdd: boolean;\n  /** Ask for a new row. Inert without `onAddRow`. */\n  addRow: () => void;\n  /**\n   * Duplicate and Delete, in that order — empty when the host wired neither.\n   * Appended to the host's own `rowActions`, so a delete stays last.\n   */\n  actions: readonly RowAction<TRow>[];\n}\n\n/** What {@link useRowMutations} needs. */\nexport interface UseRowMutationsOptions<\n  TRow,\n> extends RowMutationHandlers<TRow> {\n  /** Resolved labels, for the action names and the delete dialog. */\n  labels: Required<TableLabels>;\n}\n\n/** The key of the synthesized duplicate action. */\nexport const DUPLICATE_ROW_ACTION_KEY = \"adapttable:duplicate-row\";\n/** The key of the synthesized delete action. */\nexport const DELETE_ROW_ACTION_KEY = \"adapttable:delete-row\";\n\n/**\n * Headless add / duplicate / delete wiring.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseRowMutationsOptions}.\n * @returns The state; every action is absent until its handler is wired.\n */\nexport function useRowMutations<TRow>(\n  options: UseRowMutationsOptions<TRow>\n): RowMutationsState<TRow> {\n  const { onDuplicateRow, onDeleteRow, confirmDeleteRow, labels } = options;\n\n  // Stable identities: a row action list that changes shape every render would\n  // defeat the memoized rows the whole body depends on.\n  const addRow = useEventCallback(() => {\n    options.onAddRow?.();\n  });\n  const duplicate = useEventCallback((row: TRow) => {\n    options.onDuplicateRow?.(row);\n  });\n  const remove = useEventCallback((row: TRow) => {\n    options.onDeleteRow?.(row);\n  });\n\n  const canAdd = options.onAddRow !== undefined;\n  const canDuplicate = onDuplicateRow !== undefined;\n  const canDelete = onDeleteRow !== undefined;\n  const confirmDelete = confirmDeleteRow !== false;\n  const { duplicateRow, deleteRow, deleteRowConfirm } = labels;\n\n  const actions = useMemo<readonly RowAction<TRow>[]>(() => {\n    const built: RowAction<TRow>[] = [];\n    if (canDuplicate) {\n      built.push({\n        key: DUPLICATE_ROW_ACTION_KEY,\n        label: duplicateRow,\n        onClick: duplicate,\n      });\n    }\n    if (canDelete) {\n      built.push({\n        key: DELETE_ROW_ACTION_KEY,\n        label: deleteRow,\n        // The kits' destructive token — the same one a host's own delete uses.\n        color: \"red\",\n        onClick: remove,\n        confirm: confirmDelete\n          ? {\n              title: deleteRow,\n              message: () => deleteRowConfirm,\n              confirmLabel: deleteRow,\n              danger: true,\n            }\n          : undefined,\n      });\n    }\n    return built;\n  }, [\n    canDuplicate,\n    canDelete,\n    confirmDelete,\n    duplicate,\n    remove,\n    duplicateRow,\n    deleteRow,\n    deleteRowConfirm,\n  ]);\n\n  return useMemo(\n    () => ({ canAdd, addRow, actions }),\n    [canAdd, addRow, actions]\n  );\n}\n","/**\n * Row pinning — the asking, never the data.\n *\n * A pinned row stays put through scroll: it leaves the virtual window and\n * renders in a sticky section above or below it. The host owns the id lists\n * (`pinnedRowIds` / `onPinnedRowIdsChange`); the table never mutates them.\n * Grouping and trees refuse it the same way they refuse reorder — a nested\n * list is not a flat pin stack.\n *\n * Mobile cards are a list, not a grid: the pin actions write the same state,\n * but there is no sticky chrome. The order of the list still puts top pins\n * first and bottom pins last.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport type { RowAction, TableLabels } from \"../types\";\n\n/** Which edge a pinned row sticks to. */\nexport type RowPinSide = \"top\" | \"bottom\";\n\n/** Controlled pin lists — ids in dataset order within each edge. */\nexport interface RowPinState {\n  readonly top: readonly string[];\n  readonly bottom: readonly string[];\n}\n\n/** Empty pin lists — omit `pinnedRowIds` and this is what the table holds. */\nexport const EMPTY_ROW_PIN_STATE: RowPinState = { top: [], bottom: [] };\n\n/** Synthesized \"Pin to top\" action. */\nexport const PIN_TOP_ACTION_KEY = \"adapttable:pin-row-top\";\n/** Synthesized \"Pin to bottom\" action. */\nexport const PIN_BOTTOM_ACTION_KEY = \"adapttable:pin-row-bottom\";\n/** Synthesized \"Unpin\" action. */\nexport const UNPIN_ROW_ACTION_KEY = \"adapttable:unpin-row\";\n\n/** Labels the pin actions and the live region need. */\nexport interface RowPinLabels {\n  pinToTop: string;\n  pinToBottom: string;\n  unpinRow: string;\n}\n\n/** Headless pin state adapters read. */\nexport interface RowPinningState<TRow> {\n  /** Current lists. */\n  state: RowPinState;\n  /** Which edge a row is pinned to, if any. */\n  sideOf: (rowId: string) => RowPinSide | undefined;\n  /** Pin a row to an edge (moves it if it was on the other). */\n  pin: (rowId: string, side: RowPinSide) => void;\n  /** Remove a row from both edges. */\n  unpin: (rowId: string) => void;\n  /** Pin actions, hidden per row so a top-pinned row does not offer Pin to top. */\n  actions: readonly RowAction<TRow>[];\n}\n\n/** Split a row list into top pins, the scroll window, and bottom pins. */\nexport function partitionPinnedRows<TRow>(\n  rows: readonly TRow[],\n  state: RowPinState,\n  getRowId: (row: TRow) => string\n): { top: TRow[]; scroll: TRow[]; bottom: TRow[] } {\n  const topSet = new Set(state.top);\n  const bottomSet = new Set(state.bottom);\n  const byId = new Map<string, TRow>();\n  for (const row of rows) byId.set(getRowId(row), row);\n  const top: TRow[] = [];\n  for (const id of state.top) {\n    const row = byId.get(id);\n    if (row !== undefined) top.push(row);\n  }\n  const bottom: TRow[] = [];\n  for (const id of state.bottom) {\n    const row = byId.get(id);\n    if (row !== undefined) bottom.push(row);\n  }\n  const scroll: TRow[] = [];\n  for (const row of rows) {\n    const id = getRowId(row);\n    if (!topSet.has(id) && !bottomSet.has(id)) scroll.push(row);\n  }\n  return { top, scroll, bottom };\n}\n\n/** Memo digest so a virtualized row repaints when it is pinned or unpinned. */\nexport function rowPinSignature(\n  pinning: Pick<RowPinningState<unknown>, \"sideOf\"> | undefined,\n  rowId: string\n): string | null {\n  if (!pinning) return null;\n  return pinning.sideOf(rowId) ?? \"\";\n}\n\nfunction withoutId(ids: readonly string[], rowId: string): string[] {\n  return ids.filter((id) => id !== rowId);\n}\n\nfunction withId(ids: readonly string[], rowId: string): string[] {\n  return ids.includes(rowId) ? [...ids] : [...ids, rowId];\n}\n\n/** Apply a pin or unpin to a copy of the state. */\nexport function applyRowPin(\n  state: RowPinState,\n  rowId: string,\n  side: RowPinSide | undefined\n): RowPinState {\n  const top = withoutId(state.top, rowId);\n  const bottom = withoutId(state.bottom, rowId);\n  if (side === \"top\") return { top: withId(top, rowId), bottom };\n  if (side === \"bottom\") return { top, bottom: withId(bottom, rowId) };\n  return { top, bottom };\n}\n\nfunction sameLists(a: readonly string[], b: readonly string[]): boolean {\n  if (a.length !== b.length) return false;\n  return a.every((id, index) => id === b[index]);\n}\n\nfunction sameState(a: RowPinState, b: RowPinState): boolean {\n  return sameLists(a.top, b.top) && sameLists(a.bottom, b.bottom);\n}\n\n/**\n * Headless row pinning. Inert until the host passes {@link UseRowPinningOptions.enabled};\n * omit the prop and this hook still runs (Rules of Hooks) but every action no-ops.\n */\nexport function useRowPinning<TRow>(options: {\n  enabled: boolean;\n  pinnedRowIds?: RowPinState;\n  onPinnedRowIdsChange?: (next: RowPinState) => void;\n  getRowId: (row: TRow) => string;\n  labels: RowPinLabels;\n}): RowPinningState<TRow> {\n  const { enabled, labels } = options;\n  const controlledValue = options.pinnedRowIds;\n  const onChange = options.onPinnedRowIdsChange;\n  const [internal, setInternal] = useState<RowPinState>(EMPTY_ROW_PIN_STATE);\n  const controlled = controlledValue !== undefined;\n  const state = controlledValue ?? internal;\n\n  const modeRef = useRef({ controlled, onChange, state, enabled });\n  modeRef.current = { controlled, onChange, state, enabled };\n\n  const commit = useCallback((next: RowPinState) => {\n    const live = modeRef.current;\n    if (!live.enabled) return;\n    if (sameState(live.state, next)) return;\n    if (live.controlled) {\n      live.onChange?.(next);\n    } else {\n      setInternal(next);\n    }\n  }, []);\n\n  const pin = useEventCallback((rowId: string, side: RowPinSide) => {\n    commit(applyRowPin(modeRef.current.state, rowId, side));\n  });\n  const unpin = useEventCallback((rowId: string) => {\n    commit(applyRowPin(modeRef.current.state, rowId, undefined));\n  });\n\n  const sideOf = useCallback(\n    (rowId: string): RowPinSide | undefined => {\n      if (state.top.includes(rowId)) return \"top\";\n      if (state.bottom.includes(rowId)) return \"bottom\";\n      return undefined;\n    },\n    [state]\n  );\n\n  const getRowId = useEventCallback(options.getRowId);\n\n  const actions = useMemo<readonly RowAction<TRow>[]>(() => {\n    if (!enabled) return [];\n    return [\n      {\n        key: PIN_TOP_ACTION_KEY,\n        label: labels.pinToTop,\n        isHidden: (row) => sideOf(getRowId(row)) === \"top\",\n        onClick: (row) => {\n          pin(getRowId(row), \"top\");\n        },\n      },\n      {\n        key: PIN_BOTTOM_ACTION_KEY,\n        label: labels.pinToBottom,\n        isHidden: (row) => sideOf(getRowId(row)) === \"bottom\",\n        onClick: (row) => {\n          pin(getRowId(row), \"bottom\");\n        },\n      },\n      {\n        key: UNPIN_ROW_ACTION_KEY,\n        label: labels.unpinRow,\n        isHidden: (row) => sideOf(getRowId(row)) === undefined,\n        onClick: (row) => {\n          unpin(getRowId(row));\n        },\n      },\n    ];\n  }, [enabled, getRowId, labels, pin, sideOf, unpin]);\n\n  return useMemo(\n    () => ({ state, sideOf, pin, unpin, actions }),\n    [actions, pin, sideOf, state, unpin]\n  );\n}\n\n/** Labels a host may override; resolved through {@link TableLabels}. */\nexport type RowPinTableLabels = Pick<\n  Required<TableLabels>,\n  \"pinToTop\" | \"pinToBottom\" | \"unpinRow\"\n>;\n","/**\n * Row reordering — the asking, never the data.\n *\n * Pointer drag follows the column-menu pattern (a MIME type, drop targets,\n * a grip). Keyboard is a grab: Space lifts, arrows move, Space drops,\n * Escape cancels, each step announced. The table never mutates the array;\n * `onRowReorder(from, to, row)` is the same one-way write as `onCellEdit`.\n *\n * `from` / `to` are dataset-relative: the row's index in the current source\n * plus the page offset (`windowStart`), so a virtual window or a paged slice\n * does not lie to the host about where the row sits.\n */\nimport type { CSSProperties, DragEvent, KeyboardEvent } from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\nimport { isRtlElement } from \"../layout/writingDirection\";\n\n/** MIME type carrying the dragged row id during a reorder drag. */\nexport const ROW_DND_MIME = \"application/x-adapttable-row\";\n\nexport { REORDER_COLUMN_KEY } from \"../columns/columnMenuModel\";\n\n/** Width (px) of the injected reorder column — shared so pin leads agree. */\nexport const REORDER_COLUMN_WIDTH = 40;\n\n/**\n * Dim the lifted row and draw an insertion line on the drop target.\n * Kits apply this so a host without CSS still sees the gesture; unstyled\n * hosts can also target `data-dragging` / `data-drop` from classNames.\n */\nexport function rowReorderDropStyle(\n  attrs: { \"data-dragging\"?: \"\"; \"data-drop\"?: \"before\" | \"after\" } | undefined\n): CSSProperties {\n  if (attrs === undefined) return {};\n  const edge = attrs[\"data-drop\"];\n  const offset = edge === \"before\" ? \"2px\" : \"-2px\";\n  return {\n    opacity: attrs[\"data-dragging\"] === \"\" ? 0.45 : undefined,\n    boxShadow: edge ? `inset 0 ${offset} 0 0 currentColor` : undefined,\n  };\n}\n\n/** Move `from` to `to` in a copy of `rows`. Out-of-range is a no-op copy. */\nexport function applyRowReorder<T>(\n  rows: readonly T[],\n  from: number,\n  to: number\n): T[] {\n  if (\n    from === to ||\n    from < 0 ||\n    to < 0 ||\n    from >= rows.length ||\n    to >= rows.length\n  ) {\n    return rows.slice();\n  }\n  const next = rows.slice();\n  const [item] = next.splice(from, 1);\n  if (item === undefined) return rows.slice();\n  next.splice(to, 0, item);\n  return next;\n}\n\n/** Dataset-relative index: the rendered slot plus the page/window offset. */\nexport function datasetIndex(localIndex: number, windowStart: number): number {\n  return windowStart + localIndex;\n}\n\n/** What a host receives when the reader drops a row. */\nexport type RowReorderHandler<TRow> = (\n  from: number,\n  to: number,\n  row: TRow\n) => void;\n\n/** Labels the reorder handle and the live region need. */\nexport interface RowReorderLabels {\n  reorderRow: string;\n  moveRowUp: string;\n  moveRowDown: string;\n  rowLifted: (position: number) => string;\n  rowMoved: (from: number, to: number) => string;\n  rowReorderCancelled: string;\n}\n\n/** Headless reorder state returned by {@link useRowReorder}. */\nexport interface RowReorderState<TRow> {\n  /** The lifted row, or `null` when idle. */\n  lifted: { rowId: string; from: number } | null;\n  /** Hovered drop index (local), or `null`. */\n  overIndex: number | null;\n  /** Live-region text. Empty until something happens. */\n  announcement: string;\n  /** Whether this row is the one being moved. */\n  isLifted: (rowId: string) => boolean;\n  /** Pointer: start a drag from this row. */\n  dragProps: (\n    rowId: string,\n    localIndex: number\n  ) => {\n    draggable: true;\n    onDragStart: (event: DragEvent<HTMLElement>) => void;\n    onDragEnd: () => void;\n  };\n  /** Pointer: this row is a drop target. */\n  dropProps: (\n    localIndex: number,\n    row: TRow,\n    windowStart: number\n  ) => {\n    onDragOver: (event: DragEvent<HTMLElement>) => void;\n    onDrop: (event: DragEvent<HTMLElement>) => void;\n  };\n  /** Keyboard: Space lifts / drops, arrows move, Escape cancels. */\n  handleKeyDown: (\n    event: KeyboardEvent<HTMLElement>,\n    rowId: string,\n    localIndex: number,\n    row: TRow,\n    windowStart: number,\n    rowCount: number\n  ) => void;\n  /** Mobile: swap with the neighbour. */\n  moveBy: (\n    localIndex: number,\n    delta: -1 | 1,\n    row: TRow,\n    windowStart: number,\n    rowCount: number\n  ) => void;\n  /** Indicator attributes for a row. */\n  rowAttrs: (\n    rowId: string,\n    localIndex: number\n  ) => {\n    \"data-dragging\"?: \"\";\n    \"data-drop\"?: \"before\" | \"after\";\n  };\n}\n\n/**\n * Per-row digest so a memoized row repaints when IT is lifted or is the drop\n * target, and bails out when the drag is happening to someone else.\n */\nexport function rowReorderSignature<TRow>(\n  reorder: RowReorderState<TRow> | undefined,\n  rowId: string,\n  localIndex: number\n): string | null {\n  if (!reorder) return null;\n  const lifted = reorder.isLifted(rowId) ? \"d\" : \"\";\n  const targeted =\n    reorder.overIndex === localIndex && reorder.lifted !== null ? \"t\" : \"\";\n  return `${lifted}${targeted}`;\n}\n\n/** Whether the grip sits in a right-to-left context. */\nfunction isRtl(grip: HTMLElement | null): boolean {\n  return isRtlElement(grip);\n}\n\n/**\n * Headless row reorder. Inert until the host passes {@link RowReorderHandler};\n * omit it and this hook still runs (Rules of Hooks) but every builder no-ops.\n */\nexport function useRowReorder<TRow>(options: {\n  enabled: boolean;\n  onRowReorder?: RowReorderHandler<TRow>;\n  labels: RowReorderLabels;\n  /** Look up a row in the current source by its rendered index. */\n  rowAt: (localIndex: number) => TRow | undefined;\n}): RowReorderState<TRow> {\n  const { enabled, labels } = options;\n  const hostReorder = options.onRowReorder;\n  const onRowReorder = useEventCallback(\n    (from: number, to: number, row: TRow) => {\n      hostReorder?.(from, to, row);\n    }\n  );\n  const rowAt = useEventCallback(options.rowAt);\n\n  const [lifted, setLifted] = useState<{\n    rowId: string;\n    from: number;\n  } | null>(null);\n  const [overIndex, setOverIndex] = useState<number | null>(null);\n  const [announcement, setAnnouncement] = useState(\"\");\n\n  const reset = useCallback(() => {\n    setLifted(null);\n    setOverIndex(null);\n  }, []);\n\n  const commit = useEventCallback(\n    (fromLocal: number, toLocal: number, row: TRow, windowStart: number) => {\n      if (!enabled || fromLocal === toLocal) {\n        reset();\n        return;\n      }\n      const from = datasetIndex(fromLocal, windowStart);\n      const to = datasetIndex(toLocal, windowStart);\n      onRowReorder(from, to, row);\n      setAnnouncement(labels.rowMoved(from + 1, to + 1));\n      reset();\n    }\n  );\n\n  const dragProps = useCallback<RowReorderState<TRow>[\"dragProps\"]>(\n    (rowId, localIndex) => ({\n      draggable: true,\n      onDragStart: (event) => {\n        if (!enabled) {\n          event.preventDefault();\n          return;\n        }\n        event.dataTransfer.setData(\n          ROW_DND_MIME,\n          `${rowId}:${String(localIndex)}`\n        );\n        event.dataTransfer.effectAllowed = \"move\";\n        setLifted({ rowId, from: localIndex });\n        setOverIndex(localIndex);\n      },\n      onDragEnd: reset,\n    }),\n    [enabled, reset]\n  );\n\n  const dropProps = useCallback<RowReorderState<TRow>[\"dropProps\"]>(\n    (localIndex, row, windowStart) => ({\n      onDragOver: (event) => {\n        // Custom MIME types are often missing from `types` during dragover;\n        // the lift flag is the reliable same-table signal.\n        if (lifted === null) return;\n        event.preventDefault();\n        event.dataTransfer.dropEffect = \"move\";\n        setOverIndex(localIndex);\n      },\n      onDrop: (event) => {\n        const payload = event.dataTransfer.getData(ROW_DND_MIME);\n        if (payload === \"\") return;\n        event.preventDefault();\n        const sep = payload.lastIndexOf(\":\");\n        const fromLocal = Number(payload.slice(sep + 1));\n        if (!Number.isFinite(fromLocal)) return;\n        const dragged = rowAt(fromLocal);\n        commit(fromLocal, localIndex, dragged ?? row, windowStart);\n      },\n    }),\n    [commit, lifted, rowAt]\n  );\n\n  const handleKeyDown = useEventCallback(\n    (\n      event: KeyboardEvent<HTMLElement>,\n      rowId: string,\n      localIndex: number,\n      row: TRow,\n      windowStart: number,\n      rowCount: number\n    ) => {\n      if (!enabled) return;\n      if (event.key === \"Escape\" && lifted) {\n        event.preventDefault();\n        setAnnouncement(labels.rowReorderCancelled);\n        reset();\n        return;\n      }\n      if (event.key === \" \" || event.key === \"Spacebar\") {\n        event.preventDefault();\n        if (lifted?.rowId === rowId) {\n          const to = overIndex ?? lifted.from;\n          commit(lifted.from, to, row, windowStart);\n          return;\n        }\n        setLifted({ rowId, from: localIndex });\n        setOverIndex(localIndex);\n        setAnnouncement(\n          labels.rowLifted(datasetIndex(localIndex, windowStart) + 1)\n        );\n        return;\n      }\n      if (lifted?.rowId !== rowId) return;\n      const rtl = isRtl(event.currentTarget);\n      const down =\n        event.key === \"ArrowDown\" ||\n        event.key === (rtl ? \"ArrowLeft\" : \"ArrowRight\");\n      const up =\n        event.key === \"ArrowUp\" ||\n        event.key === (rtl ? \"ArrowRight\" : \"ArrowLeft\");\n      if (!down && !up) return;\n      event.preventDefault();\n      const next = Math.min(\n        rowCount - 1,\n        Math.max(0, (overIndex ?? lifted.from) + (down ? 1 : -1))\n      );\n      setOverIndex(next);\n    }\n  );\n\n  const moveBy = useEventCallback(\n    (\n      localIndex: number,\n      delta: -1 | 1,\n      row: TRow,\n      windowStart: number,\n      rowCount: number\n    ) => {\n      const to = localIndex + delta;\n      if (to < 0 || to >= rowCount) return;\n      commit(localIndex, to, row, windowStart);\n    }\n  );\n\n  const isLifted = useCallback(\n    (rowId: string) => lifted?.rowId === rowId,\n    [lifted]\n  );\n\n  const rowAttrs = useCallback<RowReorderState<TRow>[\"rowAttrs\"]>(\n    (rowId, localIndex) => {\n      const dragging = isLifted(rowId);\n      const from = lifted?.from;\n      const isTarget =\n        overIndex === localIndex &&\n        from !== undefined &&\n        lifted?.rowId !== rowId;\n      const dropSide =\n        from !== undefined && localIndex > from ? \"after\" : \"before\";\n      return {\n        \"data-dragging\": dragging ? \"\" : undefined,\n        \"data-drop\": isTarget ? dropSide : undefined,\n      };\n    },\n    [isLifted, lifted, overIndex]\n  );\n\n  return useMemo(\n    () => ({\n      lifted,\n      overIndex,\n      announcement: enabled ? announcement : \"\",\n      isLifted,\n      dragProps,\n      dropProps,\n      handleKeyDown,\n      moveBy,\n      rowAttrs,\n    }),\n    [\n      lifted,\n      overIndex,\n      enabled,\n      announcement,\n      isLifted,\n      dragProps,\n      dropProps,\n      handleKeyDown,\n      moveBy,\n      rowAttrs,\n    ]\n  );\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\n/** Expansion state + actions returned by {@link useRowExpansion}. */\nexport interface RowExpansionState {\n  /** Ids of the currently expanded rows. */\n  expandedIds: ReadonlySet<string>;\n  /** Whether a row is expanded. */\n  isExpanded: (id: string) => boolean;\n  /** Toggle a row's detail panel. */\n  toggle: (id: string) => void;\n}\n\n/**\n * Headless row-expansion state for `renderRowDetail`: multiple rows may be\n * open at once, keyed by row id so expansion survives sorting and paging\n * (a row that leaves the page simply re-opens when it returns).\n *\n * @param defaultExpandedIds - Row ids whose panel starts open.\n */\nexport function useRowExpansion(\n  defaultExpandedIds?: readonly string[]\n): RowExpansionState {\n  const [expandedIds, setExpandedIds] = useState<ReadonlySet<string>>(\n    () => new Set(defaultExpandedIds)\n  );\n\n  const isExpanded = useCallback(\n    (id: string) => expandedIds.has(id),\n    [expandedIds]\n  );\n\n  const toggle = useCallback((id: string) => {\n    setExpandedIds((prev) => {\n      const next = new Set(prev);\n      if (next.has(id)) next.delete(id);\n      else next.add(id);\n      return next;\n    });\n  }, []);\n\n  return useMemo(\n    () => ({ expandedIds, isExpanded, toggle }),\n    [expandedIds, isExpanded, toggle]\n  );\n}\n","/**\n * Groups computed by a server, rendered by the same table as local ones.\n *\n * A backend that can group is usually the only thing that CAN: it has the\n * whole dataset, and the browser has a page of it. So the server answers\n * `query.groupBy` with group rows — a value, a count, its aggregates, and\n * whatever children it chose to include — and this turns that answer into the\n * exact {@link GroupedFlatEntry} list local grouping produces.\n *\n * That reuse is the point. Every adapter already renders those entries, so\n * server-side grouping is not a second rendering path with its own bugs: it is\n * the same rows, filled from a different source of truth.\n */\nimport type { ReactNode } from \"react\";\n\nimport {\n  formatGroupLabel,\n  type GroupedFlatEntry,\n  groupValueKey,\n  makeGroupRowKey,\n} from \"../grouping/groupRows\";\n\n/**\n * One group row as a server returns it.\n *\n * Only `value` and `count` are required: a server that can count but not\n * aggregate, or group but not return children, is still useful and should not\n * have to send empty fields to say so.\n */\nexport interface QueryGroupRow<TRow = unknown> {\n  /** The grouping value at this level — what the table shows as the label. */\n  value: unknown;\n  /**\n   * How many leaves sit beneath it, per the server. This is the number the\n   * header shows, and it is the server's to know: the browser holds a page.\n   */\n  count: number;\n  /** Aggregates the server computed for this group, keyed by column. */\n  aggregates?: Readonly<Record<string, unknown>>;\n  /** Nested groups, when the server grouped by more than one key. */\n  groups?: readonly QueryGroupRow<TRow>[];\n  /**\n   * The group's leaf rows, when the server included them. A server that sends\n   * counts only leaves this out; the table then shows the header with its\n   * count and asks for children when the group is opened.\n   */\n  rows?: readonly TRow[];\n}\n\n/** A page of grouped results. */\nexport interface QueryGroupsPage<TRow = unknown> {\n  /** The top-level groups, in the order the server wants them shown. */\n  groups: readonly QueryGroupRow<TRow>[];\n  /** Total leaves across every group, when the server knows it. */\n  total?: number;\n}\n\n/** What {@link serverGroupEntries} needs to lay a server's answer out. */\nexport interface ServerGroupEntriesOptions<TRow> {\n  /** The groups the server returned. */\n  groups: readonly QueryGroupRow<TRow>[];\n  /** The grouping keys that were asked for, outermost first. */\n  groupBy: readonly string[];\n  /** Which groups are collapsed, by the same keys local grouping uses. */\n  collapsedGroupIds: ReadonlySet<string>;\n  /** Row identity, for selection and React keys. */\n  getRowId: (row: TRow) => string;\n  /** Override the blank-group label (default `\"(blank)\"`). */\n  blankLabel?: string;\n  /** Close every group with a footer carrying its aggregates. */\n  footers?: boolean;\n}\n\n/**\n * Turn a server's group rows into the flat entries adapters render.\n *\n * Counts come from the server rather than from the rows in hand — a group of\n * 4,000 says 4,000 even when the response carried 20 of them. The aggregates\n * are the server's too, passed through as they arrived, so a `sum` computed\n * over the whole dataset is the one displayed.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link ServerGroupEntriesOptions}.\n * @returns The entries, in render order.\n */\nexport function serverGroupEntries<TRow>(\n  options: ServerGroupEntriesOptions<TRow>\n): GroupedFlatEntry<TRow>[] {\n  const {\n    groups,\n    groupBy,\n    collapsedGroupIds,\n    getRowId,\n    blankLabel,\n    footers = false,\n  } = options;\n  const flat: GroupedFlatEntry<TRow>[] = [];\n  let leafIndex = 0;\n\n  const walk = (\n    nodes: readonly QueryGroupRow<TRow>[],\n    level: number,\n    path: readonly string[]\n  ): void => {\n    const key = groupBy[level] ?? groupBy.at(-1) ?? \"\";\n    for (const node of nodes) {\n      const here = [...path, groupValueKey(node.value)];\n      const groupKey = makeGroupRowKey(groupBy.slice(0, level + 1), here);\n      const collapsed = collapsedGroupIds.has(groupKey);\n      const rows = node.rows ?? [];\n      const label = formatGroupLabel(node.value, blankLabel);\n\n      flat.push({\n        kind: \"group\",\n        key: groupKey,\n        value: node.value,\n        label,\n        level,\n        groupBy: key,\n        path: here,\n        // The rows the server sent, which may be none: `count` is what the\n        // header reports, and it is the server's number, not this one.\n        leafRows: rows,\n        leafIds: rows.map((row) => getRowId(row)),\n        serverCount: node.count,\n        aggregateCells: renderableAggregates(node.aggregates),\n        collapsed,\n      });\n      if (collapsed) continue;\n\n      if (node.groups && node.groups.length > 0) {\n        walk(node.groups, level + 1, here);\n      } else {\n        for (const row of rows) {\n          flat.push({\n            kind: \"row\",\n            key: getRowId(row),\n            row,\n            index: leafIndex++,\n            groupKey,\n          });\n        }\n      }\n\n      if (footers) {\n        flat.push({\n          kind: \"groupFooter\",\n          key: `${groupKey}:footer`,\n          groupKey,\n          level,\n          groupBy: key,\n          label,\n          leafRows: rows,\n          leafIds: rows.map((row) => getRowId(row)),\n          aggregateCells: renderableAggregates(node.aggregates),\n        });\n      }\n    }\n  };\n\n  walk(groups, 0, []);\n  return flat;\n}\n\n/**\n * A server's aggregate values as things React can render.\n *\n * JSON carries numbers, strings, booleans and nulls; a table cell can render\n * the first three. Anything else — an object a backend chose to nest — is\n * stringified rather than thrown at React, which would crash the row.\n *\n * @param aggregates - The values the server sent, if any.\n * @returns Renderable cells, or `undefined` when there were none.\n */\nfunction renderableAggregates(\n  aggregates: Readonly<Record<string, unknown>> | undefined\n): Partial<Record<string, ReactNode>> | undefined {\n  if (!aggregates) return undefined;\n  const cells: Partial<Record<string, ReactNode>> = {};\n  for (const [key, value] of Object.entries(aggregates)) {\n    if (value === null || value === undefined) continue;\n    cells[key] =\n      typeof value === \"string\" ||\n      typeof value === \"number\" ||\n      typeof value === \"boolean\"\n        ? value\n        : JSON.stringify(value);\n  }\n  return cells;\n}\n","/**\n * The failure state, and what a host needs to replace it.\n *\n * Skeleton and empty are already slots a host can swap out, and they can be\n * plain nodes because there is nothing to say about them: a skeleton is a\n * skeleton. An error is different — it is *about* something, and the built-in\n * one carries a working retry. Handing back a node the host wrote in advance\n * would drop both, which is the same trap the `noResults` slot documents.\n *\n * So a slot here takes a node OR a function. Pass a node when the message is\n * fixed; pass a function when the replacement needs the error it is reporting\n * or the retry it should offer.\n */\nimport type { ReactNode } from \"react\";\n\nimport type { TableSource } from \"../source/TableSource\";\n\n/** What the error chrome is describing, and what it can do about it. */\nexport interface TableErrorState {\n  /** The failure to surface. */\n  error: Error;\n  /**\n   * Ask the source to try again, or `undefined` when it cannot — a static\n   * `data` array has nothing to re-fetch, so no retry is offered rather than\n   * one that does nothing.\n   */\n  retry?: () => void;\n  /** Whether a retry is already in flight. */\n  retrying: boolean;\n}\n\n/**\n * A replaceable piece of chrome: a node, or a function that builds one from\n * what the built-in was showing.\n *\n * @typeParam TState - What the built-in had to work with.\n */\nexport type Slot<TState> = ReactNode | ((state: TState) => ReactNode);\n\n/**\n * Resolve a slot the host may have replaced.\n *\n * @param slot - The host's replacement, if any.\n * @param state - What the built-in chrome was showing.\n * @returns The host's node, or `undefined` when they left the built-in alone.\n */\nexport function fillSlot<TState>(\n  slot: Slot<TState> | undefined,\n  state: TState\n): ReactNode {\n  return typeof slot === \"function\" ? slot(state) : slot;\n}\n\n/**\n * The error state a source is in, or `undefined` when it is fine.\n *\n * Every adapter derives this the same way, so it is derived once here — the\n * retry in particular, which is only offered when the source can actually\n * perform one.\n *\n * @param source - The table's source.\n * @returns The state, or `undefined` when there is no failure to report.\n */\nexport function tableErrorState<TRow>(\n  source: TableSource<TRow>\n): TableErrorState | undefined {\n  if (!source.error) return undefined;\n  const refetch = source.refetch;\n  return {\n    error: source.error,\n    retry: refetch ? () => void refetch() : undefined,\n    retrying: source.isFetching,\n  };\n}\n","/**\n * The grouped or tree-shaped view, as an export can write it.\n *\n * Scopes still decide which *data* rows leave the table. This layer then\n * puts those rows back into the structure the reader can see — group\n * headers, outline depth, footers — so a spreadsheet is not a denormalised\n * dump of a grouped table.\n */\nimport type { GroupedFlatEntry } from \"../grouping/groupRows\";\nimport type { TreeEntry } from \"../tree/treeRows\";\nimport type { ExportViewEntry } from \"./exportWriter\";\n\n/**\n * A value a file can carry. JSX is a cell on screen, not a cell in a\n * spreadsheet — skip it rather than write \"[object Object]\".\n */\nexport function exportableValue(value: unknown): unknown {\n  if (value instanceof Date) {\n    return Number.isNaN(value.getTime()) ? undefined : value;\n  }\n  if (typeof value === \"number\") {\n    return Number.isFinite(value) ? value : undefined;\n  }\n  if (typeof value === \"boolean\" || typeof value === \"string\") return value;\n  return undefined;\n}\n\n/** Drop anything a file cannot type, keeping the keys that remain. */\nexport function exportableRecord(\n  cells: Readonly<Partial<Record<string, unknown>>> | undefined\n): Partial<Record<string, unknown>> | undefined {\n  if (!cells) return undefined;\n  const out: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(cells)) {\n    const next = exportableValue(value);\n    if (next !== undefined) out[key] = next;\n  }\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/** Whether the next visible child of this group is a nested group. */\nfunction nextIsNestedGroup<TRow>(\n  entries: readonly GroupedFlatEntry<TRow>[],\n  index: number,\n  level: number\n): boolean {\n  for (let j = index + 1; j < entries.length; j++) {\n    const next = entries[j];\n    if (!next) return false;\n    if (next.kind === \"group\") return next.level > level;\n    if (next.kind === \"groupFooter\") return false;\n  }\n  return false;\n}\n\n/** Rows, \"load more\", and extras hidden because their leaves were dumped. */\nfunction skipHiddenLeaf<TRow>(\n  entry: GroupedFlatEntry<TRow>,\n  skipUntilLevel: number | undefined\n): boolean {\n  if (skipUntilLevel === undefined) return false;\n  if (entry.kind === \"group\" || entry.kind === \"groupFooter\") {\n    return entry.level > skipUntilLevel;\n  }\n  return true;\n}\n\nfunction appendLeaves<TRow>(\n  out: ExportViewEntry<TRow>[],\n  rows: readonly TRow[],\n  level: number\n): void {\n  for (const row of rows) {\n    out.push({ role: \"data\", row, level });\n  }\n}\n\n/** The header row a group contributes, with whatever totals it carries. */\nfunction groupHeaderEntry<TRow>(\n  entry: Extract<GroupedFlatEntry<TRow>, { kind: \"group\" }>\n): ExportViewEntry<TRow> {\n  return {\n    role: \"group\",\n    label: entry.label,\n    level: entry.level,\n    labelKey: entry.groupBy,\n    values: exportableRecord(entry.aggregateCells),\n  };\n}\n\n/** The total row a group footer contributes. */\nfunction groupFooterEntry<TRow>(\n  entry: Extract<GroupedFlatEntry<TRow>, { kind: \"groupFooter\" }>,\n  groupTotal?: (label: string) => string\n): ExportViewEntry<TRow> {\n  return {\n    role: \"aggregate\",\n    label: groupTotal ? groupTotal(entry.label) : entry.label,\n    level: entry.level,\n    labelKey: entry.groupBy,\n    values: exportableRecord(entry.aggregateCells),\n  };\n}\n\n/**\n * Flatten grouping entries into export view rows.\n *\n * Headers and footers keep their outline level. Leaves sit one level\n * deeper than the group they belong to, which is what Excel's outline\n * expects. \"Load more\" and extra rows are render chrome and stay out.\n *\n * @typeParam TRow - The row type.\n * @param entries - The grouping model's flat list.\n * @param groupTotal - Optional caption for a footer (`\"Core total\"`).\n * @param includeHiddenLeaves - When true, a collapsed or paged group\n *   contributes every leaf it holds, not only the ones on screen.\n */\nexport function viewFromGroupedEntries<TRow>(\n  entries: readonly GroupedFlatEntry<TRow>[],\n  groupTotal?: (label: string) => string,\n  includeHiddenLeaves = false\n): ExportViewEntry<TRow>[] {\n  const out: ExportViewEntry<TRow>[] = [];\n  let dataLevel = 1;\n  let skipUntilLevel: number | undefined;\n  for (let i = 0; i < entries.length; i++) {\n    const entry = entries[i];\n    if (!entry || skipHiddenLeaf(entry, skipUntilLevel)) continue;\n    if (entry.kind === \"group\" || entry.kind === \"groupFooter\") {\n      skipUntilLevel = undefined;\n    }\n    if (entry.kind === \"group\") {\n      dataLevel = entry.level + 1;\n      out.push(groupHeaderEntry(entry));\n      if (includeHiddenLeaves && !nextIsNestedGroup(entries, i, entry.level)) {\n        appendLeaves(out, entry.leafRows, dataLevel);\n        skipUntilLevel = entry.level;\n      }\n      continue;\n    }\n    if (entry.kind === \"groupFooter\") {\n      out.push(groupFooterEntry(entry, groupTotal));\n      continue;\n    }\n    if (entry.kind === \"row\") {\n      out.push({ role: \"data\", row: entry.row, level: dataLevel });\n    }\n  }\n  return out;\n}\n\n/**\n * A tree is already a list of data rows with a depth. The outline is that\n * depth; there are no extra header rows to invent.\n *\n * @typeParam TRow - The row type.\n * @param entries - The flattened tree, in render order.\n */\nexport function viewFromTreeEntries<TRow>(\n  entries: readonly TreeEntry<TRow>[]\n): ExportViewEntry<TRow>[] {\n  return entries.map((entry) => ({\n    role: \"data\" as const,\n    row: entry.row,\n    level: entry.level,\n  }));\n}\n\nfunction isStructure(entry: ExportViewEntry<unknown>): boolean {\n  return entry.role === \"group\" || entry.role === \"aggregate\";\n}\n\n/** A group stays if any later leaf before the next peer is kept. */\nfunction markKeptGroups(\n  view: readonly ExportViewEntry<unknown>[],\n  keep: boolean[]\n): void {\n  for (let i = 0; i < view.length; i++) {\n    const entry = view[i];\n    if (entry?.role !== \"group\") continue;\n    for (let j = i + 1; j < view.length; j++) {\n      const next = view[j];\n      if (!next || (isStructure(next) && next.level <= entry.level)) break;\n      if (keep[j]) {\n        keep[i] = true;\n        break;\n      }\n    }\n  }\n}\n\n/** Index of the group this footer closes, or -1. */\nfunction footerGroupIndex(\n  view: readonly ExportViewEntry<unknown>[],\n  footerAt: number,\n  level: number\n): number {\n  for (let j = footerAt - 1; j >= 0; j--) {\n    const prev = view[j];\n    if (!prev) return -1;\n    if (prev.role === \"group\" && prev.level === level) return j;\n    if (isStructure(prev) && prev.level < level) return -1;\n  }\n  return -1;\n}\n\n/** A footer stays with the group it closes. */\nfunction markKeptFooters(\n  view: readonly ExportViewEntry<unknown>[],\n  keep: boolean[]\n): void {\n  for (let i = 0; i < view.length; i++) {\n    const entry = view[i];\n    if (entry?.role !== \"aggregate\") continue;\n    const groupAt = footerGroupIndex(view, i, entry.level);\n    if (groupAt >= 0) keep[i] = Boolean(keep[groupAt]);\n  }\n}\n\n/**\n * Keep the structure that still has a reason to exist after a scope\n * dropped some leaves: a group header stays if any of its remaining\n * descendants stayed; a footer stays with its header.\n *\n * @typeParam TRow - The row type.\n * @param view - The full grouped or tree view.\n * @param scopedIds - Row ids the scope resolved to.\n * @param getRowId - How a row's id is derived.\n */\nexport function filterExportView<TRow>(\n  view: readonly ExportViewEntry<TRow>[],\n  scopedIds: ReadonlySet<string>,\n  getRowId: (row: TRow) => string\n): ExportViewEntry<TRow>[] {\n  const keep = view.map(\n    (entry) => entry.role === \"data\" && scopedIds.has(getRowId(entry.row))\n  );\n  markKeptGroups(view, keep);\n  markKeptFooters(view, keep);\n  return view.filter((_, index) => keep[index]);\n}\n\n/**\n * Pick the view the current chrome is showing. A tree outranks grouping —\n * the same rule the table uses when both are armed.\n *\n * @typeParam TRow - The row type.\n */\nexport function exportViewFromChrome<TRow>(options: {\n  grouping?: { entries: readonly GroupedFlatEntry<TRow>[] };\n  tree?: {\n    entries: readonly TreeEntry<TRow>[];\n    allEntries?: readonly TreeEntry<TRow>[];\n  };\n  groupTotal?: (label: string) => string;\n  /** Folded or paged-away leaves, for `scope: \"all\"` / `\"selected\"`. */\n  includeHiddenLeaves?: boolean;\n}): ExportViewEntry<TRow>[] | undefined {\n  if (options.tree) {\n    // A scope that unfolds reads the whole hierarchy; the rendered entries\n    // stop at every collapsed node and would drop those subtrees entirely.\n    const entries =\n      options.includeHiddenLeaves && options.tree.allEntries\n        ? options.tree.allEntries\n        : options.tree.entries;\n    return viewFromTreeEntries(entries);\n  }\n  if (options.grouping) {\n    return viewFromGroupedEntries(\n      options.grouping.entries,\n      options.groupTotal,\n      options.includeHiddenLeaves\n    );\n  }\n  return undefined;\n}\n\n/** `summaryRow` as file values — JSX cells drop out. */\nexport function summaryExportValues(\n  cells: Readonly<Partial<Record<string, unknown>>> | undefined\n): Partial<Record<string, unknown>> | undefined {\n  return exportableRecord(cells);\n}\n","import type { ReactNode } from \"react\";\n\nimport {\n  ACTIONS_COLUMN_KEY,\n  REORDER_COLUMN_KEY,\n} from \"../columns/columnMenuModel\";\nimport { type CellRange, cellRangeIndices } from \"../focus/cellRange\";\nimport type { GroupedFlatEntry } from \"../grouping/groupRows\";\nimport type { GetCellSpan } from \"../rows/cellSpan\";\nimport type { TableSource } from \"../source/TableSource\";\nimport type { TreeEntry } from \"../tree/treeRows\";\nimport type { ColumnDef, ExtraFilters, SortDirection } from \"../types\";\nimport { devWarn } from \"../utils/devWarn\";\nimport {\n  exportViewFromChrome,\n  filterExportView,\n  summaryExportValues,\n} from \"./exportView\";\nimport {\n  buildExportTable,\n  csvWriter,\n  defaultExportFilename,\n  downloadExportFile,\n  type ExportPayload,\n  type ExportWriter,\n} from \"./exportWriter\";\n\n/** Which rows an export covers. */\nexport type ExportRowScope = \"page\" | \"all\" | \"selected\" | \"range\";\n\n/**\n * Which columns an export covers: what the user can see, every defined\n * column, or an explicit list of keys in file order.\n */\nexport type ExportColumnScope = \"visible\" | \"all\" | readonly string[];\n\n/** Opt-in CSV export config for the shared DataTable surface. */\nexport interface ExportCsvOptions<TRow = unknown> {\n  /** Download filename. Defaults to `\"export.csv\"`. */\n  filename?: string;\n  /**\n   * Which rows the file contains.\n   *\n   * `\"page\"` (default) — current page / loaded slice.\n   * `\"all\"` — full filtered+sorted set when the source exposes\n   * {@link TableSource.allFilteredRows}; otherwise falls back to the\n   * page with a dev-only warning.\n   * `\"selected\"` — the checked rows, in table order. Selection is a set of\n   * ids, so this searches the widest set the source can offer: a row selected\n   * on page 1 is still exported while page 3 is on screen.\n   * `\"range\"` — the highlighted cell rectangle, which needs `cellNavigation`;\n   * a rectangle names its own columns, so it decides them and `columns` is not\n   * consulted. Without a selection this falls back to the page with a dev-only\n   * warning.\n   */\n  scope?: ExportRowScope;\n  /**\n   * Which columns the file contains.\n   *\n   * `\"visible\"` (default) — what the user can see, so the file matches the\n   * screen. `\"all\"` — every defined column including those hidden through the\n   * column menu, for a complete extract. An explicit array picks columns by\n   * key, in the order given, and silently ignores a key that matches no\n   * column so a stale saved config cannot break the button.\n   *\n   * The synthetic actions column is never exported under any of them.\n   */\n  columns?: ExportColumnScope;\n  /**\n   * Neutralise spreadsheet formula injection (see\n   * {@link RowsToCsvOptions.escapeFormulas}). Disable ONLY for\n   * machine-consumed output that is never opened in a spreadsheet.\n   * @defaultValue true\n   */\n  escapeFormulas?: boolean;\n  /**\n   * Runs after the rows and columns are chosen and before the file is\n   * written, which is the only moment where both are known and nothing has\n   * happened yet.\n   *\n   * Return `false` to cancel the export — enough is known here to decide\n   * (too many rows, nothing selected, a permission the host enforces).\n   * Return `{ filename }` to name the file from the data, which is what most\n   * callers want it for. Return nothing to continue unchanged.\n   */\n  onBeforeExport?: (\n    info: ExportInfo<TRow>\n  ) => boolean | void | { filename?: string };\n  /**\n   * Runs once the file has been handed to the browser, with what was written.\n   * For analytics, a toast, or keeping a copy.\n   *\n   * `csv` is the file's text; a binary format leaves it empty and carries its\n   * bytes in `file.parts`.\n   */\n  onAfterExport?: (\n    info: ExportInfo<TRow> & { csv: string; file: ExportPayload }\n  ) => void;\n  /**\n   * The file format. Defaults to CSV; `@adapttable/core/xlsx` exports\n   * {@link ExportWriter | a spreadsheet writer}, and any function of the\n   * resolved rows and columns is a valid one.\n   *\n   * The scope options above are unaffected by this — which rows and columns\n   * leave the table is decided before a writer sees them.\n   */\n  writer?: ExportWriter;\n  /**\n   * Hand the export to your backend instead of building the file in the\n   * browser.\n   *\n   * Past a certain size the browser is the wrong place to do this: the rows\n   * are not all loaded, holding them would cost more memory than the tab has,\n   * and the work blocks the main thread. With this set, the button sends the\n   * user's current view — filters, search, sort, the chosen scope — to your\n   * handler, and building the file (or queueing a job and emailing a link)\n   * happens where the data already lives.\n   *\n   * The table builds no file and downloads nothing when this is present.\n   * Return a promise and the button stays busy until it settles, so a second\n   * click cannot start the same export twice.\n   */\n  request?: (info: ExportRequest<TRow>) => void | Promise<void>;\n  /**\n   * Let `scope: \"all\"` page a server source itself.\n   *\n   * A server-backed table holds one page, so \"all\" has nothing to read. The\n   * first answer is {@link ExportCsvOptions.request} — the backend already has\n   * the data. This is the second: opt in and the table walks the query page by\n   * page and builds the file in the browser.\n   *\n   * It is opt-in because it is a loop of network requests the reader did not\n   * ask for, and capped because an unbounded one over a large table is a way\n   * to hang a tab. Past {@link FetchAllExport.maxRows} the export stops and\n   * says so through {@link FetchAllExport.onCapped} rather than quietly\n   * writing a partial file.\n   */\n  fetchAll?: FetchAllExport<TRow>;\n}\n\n/** How `scope: \"all\"` pages a server source when the host opts in. */\nexport interface FetchAllExport<TRow> {\n  /**\n   * Fetch one page of the current query. Called with 1-based page numbers\n   * until it returns fewer rows than `limit`, or the cap is reached.\n   */\n  fetchPage: (query: ExportQuery) => Promise<readonly TRow[]>;\n  /** Rows per request. Defaults to the table's current page size. */\n  pageSize?: number;\n  /**\n   * Stop after this many rows. Defaults to 50,000 — high enough that ordinary\n   * tables never meet it, low enough that a runaway query cannot exhaust the\n   * tab.\n   */\n  maxRows?: number;\n  /**\n   * Called when the cap stopped the export short, with what was written and\n   * the cap that stopped it. Tell the reader; a silently truncated file is the\n   * outcome this whole option exists to avoid.\n   */\n  onCapped?: (info: { rows: number; maxRows: number }) => void;\n}\n\n/** The default {@link FetchAllExport.maxRows}. */\nexport const EXPORT_FETCH_ALL_MAX_ROWS = 50_000;\n\n/**\n * Walk a server source page by page for `scope: \"all\"`.\n *\n * @typeParam TRow - The row type.\n * @param source - The table's source, for the current query and page size.\n * @param config - See {@link FetchAllExport}.\n * @returns Every row the query matches, up to the cap.\n */\nexport async function fetchAllExportRows<TRow>(\n  source: TableSource<TRow>,\n  config: FetchAllExport<TRow>\n): Promise<readonly TRow[]> {\n  const limit = config.pageSize ?? source.limit ?? 100;\n  const maxRows = config.maxRows ?? EXPORT_FETCH_ALL_MAX_ROWS;\n  const base = exportQueryOf(source, \"page\");\n  const out: TRow[] = [];\n  let reachedEnd = false;\n  let page = 1;\n  while (out.length < maxRows && !reachedEnd) {\n    const batch = await config.fetchPage({ ...base, page, limit });\n    out.push(...batch);\n    // A short page is the end of the set; an empty one guards a source that\n    // answers the page after the last with an empty array rather than fewer.\n    reachedEnd = batch.length < limit;\n    page += 1;\n  }\n  // Stopping ON the cap is still stopping short — a full last page says\n  // nothing about whether more exist, so only a short page proves the end.\n  if (!reachedEnd) {\n    const rows = Math.min(out.length, maxRows);\n    config.onCapped?.({ rows, maxRows });\n    return out.slice(0, rows);\n  }\n  return out;\n}\n\n/** The view an export was asked for, as a server needs to hear it. */\nexport interface ExportRequest<TRow> extends ExportInfo<TRow> {\n  /**\n   * The query behind the current view: search, filters, sort and paging,\n   * exactly as {@link TableQuery} carries them to a server tier.\n   */\n  query: ExportQuery;\n  /** Which rows were asked for. `rows` holds what the browser has of them. */\n  scope: ExportRowScope;\n  /**\n   * The file extension the button would have produced — `\"csv\"`, `\"xlsx\"`, or\n   * whatever a custom writer names itself. A backend building the file needs to\n   * know which one, and the filename alone is a guess.\n   */\n  format: string;\n}\n\n/** The view-defining half of a table query, for an export request. */\nexport interface ExportQuery {\n  /**\n   * Undefined for `scope: \"all\"`: \"all\" means every row the filters match, so\n   * a page number would contradict the ask. Present for every other scope.\n   */\n  page: number | undefined;\n  /** Undefined for `scope: \"all\"` — see {@link ExportQuery.page}. */\n  limit: number | undefined;\n  search: string;\n  sortBy: string | undefined;\n  sortDir: SortDirection | undefined;\n  filters: ExtraFilters;\n  groupBy: string | undefined;\n}\n\n/** What an export lifecycle hook is told about the file being written. */\nexport interface ExportInfo<TRow> {\n  /** The rows the chosen scope resolved to, in table order. */\n  rows: readonly TRow[];\n  /** The columns the chosen scope resolved to, in file order. */\n  columns: readonly ColumnDef<TRow>[];\n  /** The filename as it stands, before any override this hook returns. */\n  filename: string;\n}\n\n/** Boolean-or-options CSV export prop (off / on / configured). */\ntype ExportCsvProp<TRow = unknown> =\n  | boolean\n  | ExportCsvOptions<TRow>\n  | undefined;\n\n/** Resolve a boolean-or-options prop into a concrete config, or `null` when off. */\nexport function resolveExportCsv<TRow = unknown>(\n  value: ExportCsvProp<TRow>\n): ExportCsvOptions<TRow> | null {\n  if (!value) return null;\n  if (value === true) return {};\n  return value;\n}\n\n/**\n * Whether `scope: \"all\"` will write the current page instead of the\n * full filtered set.\n *\n * A frontend source that exposes `allFilteredRows`, or a host that\n * passed `request` / `fetchAll`, can answer honestly. Everything else\n * is this page — the button should say so.\n */\nexport function exportAllFallsBackToPage<TRow = unknown>(\n  exportCsv: ExportCsvProp<TRow>,\n  source: Pick<TableSource<TRow>, \"allFilteredRows\">\n): boolean {\n  const options = resolveExportCsv(exportCsv);\n  return Boolean(\n    options?.scope === \"all\" &&\n    source.allFilteredRows === undefined &&\n    options.request === undefined &&\n    options.fetchAll === undefined\n  );\n}\n\n/** Columns that belong in a CSV (drop synthetic actions and reorder columns). */\nexport function exportableColumns<TRow>(\n  columns: readonly ColumnDef<TRow>[]\n): ColumnDef<TRow>[] {\n  return columns.filter(\n    (column) =>\n      column.key !== ACTIONS_COLUMN_KEY && column.key !== REORDER_COLUMN_KEY\n  );\n}\n\n/**\n * Everything an export needs beyond the visible columns: the selection to\n * honour a `\"selected\"` scope, and the full column set to honour `\"all\"`.\n *\n * Every field is optional. A caller that passes none gets exactly the\n * behaviour this function always had.\n */\nexport interface ExportContext<TRow> {\n  /** The checked row ids. */\n  selectedIds?: ReadonlySet<string>;\n  /** How a row's id is derived — the table's own `getRowId`. */\n  getRowId?: (row: TRow) => string;\n  /** Every defined column, including any hidden through the column menu. */\n  allColumns?: readonly ColumnDef<TRow>[];\n  /** The highlighted cell rectangle, for `scope: \"range\"`. */\n  range?: CellRange | null;\n  /**\n   * Where the rendered window starts in the dataset — the offset that turns a\n   * range's absolute row addresses back into rows the browser holds. Zero\n   * unless the table is paged.\n   */\n  firstRowIndex?: number;\n  /** Omit covered cells from the file — a span exports its value once. */\n  getCellSpan?: GetCellSpan<TRow>;\n  /**\n   * The grouping model's entries, when grouping is armed. A spreadsheet\n   * writes headers, outline levels and footers from them. A range export\n   * ignores this — a rectangle is already its own shape.\n   */\n  grouping?: { entries: readonly GroupedFlatEntry<TRow>[] };\n  /**\n   * The flattened tree, when a tree is armed. Outranks grouping, the same\n   * way the table does.\n   */\n  tree?: {\n    entries: readonly TreeEntry<TRow>[];\n    /**\n     * The same hierarchy with every node open. A folded folder is display\n     * state, so `scope: \"all\"` writes what is inside it — without this, a\n     * collapsed subtree is silently missing from the file.\n     */\n    allEntries?: readonly TreeEntry<TRow>[];\n  };\n  /** Caption for a group footer — the table's `labels.groupTotal`. */\n  groupTotal?: (label: string) => string;\n  /**\n   * The table's `summaryRow` mapper. Called on the scoped rows so a grand\n   * total in the file matches the rows that actually left.\n   */\n  summaryRow?: (rows: readonly TRow[]) => Partial<Record<string, ReactNode>>;\n}\n\n/** Pick the column set an export scope asks for, minus the actions column. */\nexport function resolveExportColumns<TRow>(\n  scope: ExportColumnScope | undefined,\n  visible: readonly ColumnDef<TRow>[],\n  all: readonly ColumnDef<TRow>[] | undefined\n): ColumnDef<TRow>[] {\n  const keys: readonly string[] | undefined =\n    typeof scope === \"string\" || scope === undefined ? undefined : scope;\n  const pool = exportableColumns(\n    scope === \"all\" || keys ? (all ?? visible) : visible\n  );\n  if (!keys) return pool;\n  // Order follows the caller's list, not the table's, because an explicit\n  // list is a statement about the file's shape.\n  const byKey = new Map(pool.map((column) => [column.key, column]));\n  return keys.flatMap((key) => {\n    const column = byKey.get(key);\n    return column ? [column] : [];\n  });\n}\n\n/**\n * The rows a highlighted rectangle covers.\n *\n * A range addresses rows by their place in the dataset, because that is what a\n * screen reader is told and what survives scrolling. Turning one back into rows\n * is therefore an offset subtraction — and every row in a range is loaded, since\n * navigation cannot leave the loaded window. A programmatic selection that\n * reaches past it drops those rows rather than exporting blanks.\n */\nfunction rowsInRange<TRow>(\n  range: CellRange,\n  source: TableSource<TRow>,\n  firstRowIndex: number\n): readonly TRow[] {\n  return cellRangeIndices(range).rows.flatMap((index) => {\n    const row = source.rows[index - firstRowIndex];\n    return row === undefined ? [] : [row];\n  });\n}\n\n/** The rows a scope asks for, in table order. */\nfunction resolveExportRows<TRow>(\n  scope: ExportRowScope,\n  source: TableSource<TRow>,\n  context: ExportContext<TRow> | undefined\n): readonly TRow[] {\n  if (scope === \"page\") return source.rows;\n  if (scope === \"range\") {\n    const { range, firstRowIndex } = context ?? {};\n    if (!range) {\n      devWarn(\n        'exportCsv scope \"range\" needs a selected cell range, which needs `cellNavigation`. Nothing is selected, so the current page is exported instead.'\n      );\n      return source.rows;\n    }\n    return rowsInRange(range, source, firstRowIndex ?? 0);\n  }\n  if (scope === \"all\") {\n    if (!source.allFilteredRows) {\n      // Reached only by a hand-built call: the toolbar handler refuses to\n      // render an \"all\" button a server source cannot answer.\n      devWarn(\n        'exportCsv scope \"all\" needs the full filtered set. This source exposes only the current page, so that is what is exported. Pass `request` or `fetchAll` to export everything from a server tier.'\n      );\n    }\n    return source.allFilteredRows ?? source.rows;\n  }\n  const { selectedIds, getRowId } = context ?? {};\n  if (!selectedIds || !getRowId) {\n    devWarn(\n      'exportCsv scope \"selected\" needs the table\\'s selection. Adapters pass it automatically; a hand-built call must supply `selectedIds` and `getRowId`. Exporting the current page instead.'\n    );\n    return source.rows;\n  }\n  // Search the widest set available, so a row checked on an earlier page is\n  // still in the file when a later page is on screen.\n  const searchable = source.allFilteredRows ?? source.rows;\n  return searchable.filter((row) => selectedIds.has(getRowId(row)));\n}\n\n/**\n * What an export resolves to: the rows a scope asks for and the columns a\n * scope asks for.\n *\n * Three call sites need exactly this pair — the pure builder, the download\n * path (which brackets it with hooks) and the backend-request path (which\n * sends it instead of writing a file). Resolving it once is what keeps them\n * from drifting apart.\n */\nfunction resolveExport<TRow>(options: {\n  source: TableSource<TRow>;\n  columns: readonly ColumnDef<TRow>[];\n  scope?: ExportRowScope;\n  columnScope?: ExportColumnScope;\n  context?: ExportContext<TRow>;\n}): { rows: readonly TRow[]; columns: ColumnDef<TRow>[] } {\n  const scope = options.scope ?? \"page\";\n  const range = options.context?.range;\n  return {\n    rows: resolveExportRows(scope, options.source, options.context),\n    // A rectangle names its own columns. Asking for one and then exporting\n    // every visible column would ignore half of what the user selected, so the\n    // range decides here and `columns` is not consulted.\n    columns:\n      scope === \"range\" && range\n        ? columnsInRange(range, options.columns)\n        : resolveExportColumns(\n            options.columnScope ?? \"visible\",\n            options.columns,\n            options.context?.allColumns\n          ),\n  };\n}\n\n/**\n * The columns a rectangle covers, in table order. Column addresses index the\n * columns as rendered, which is the same list the export is given.\n */\nfunction columnsInRange<TRow>(\n  range: CellRange,\n  columns: readonly ColumnDef<TRow>[]\n): ColumnDef<TRow>[] {\n  return exportableColumns(\n    cellRangeIndices(range).cols.flatMap((index) => {\n      const column = columns[index];\n      return column ? [column] : [];\n    })\n  );\n}\n\n/** Structure and spans for the resolved rows, when the context has them. */\nfunction exportTableOptions<TRow>(\n  rows: readonly TRow[],\n  scope: ExportRowScope | undefined,\n  context: ExportContext<TRow> | undefined\n) {\n  const getRowId = context?.getRowId;\n  // Page writes the chrome view as it stands — collapsed headers stay,\n  // folded leaves stay out. All / selected unfold those leaves first so a\n  // ticked row inside a closed group still leaves the table, then prune.\n  const includeHiddenLeaves = scope === \"all\" || scope === \"selected\";\n  const fullView = exportViewFromChrome({\n    grouping: context?.grouping,\n    tree: context?.tree,\n    groupTotal: context?.groupTotal,\n    includeHiddenLeaves,\n  });\n  let view = fullView;\n  if (scope === \"range\" || !fullView) view = undefined;\n  else if (includeHiddenLeaves && getRowId) {\n    view = filterExportView(\n      fullView,\n      new Set(rows.map((row) => getRowId(row))),\n      getRowId\n    );\n  }\n  return {\n    getCellSpan: context?.getCellSpan,\n    firstRowIndex: context?.firstRowIndex,\n    view,\n    summary: summaryExportValues(context?.summaryRow?.(rows)),\n  };\n}\n\n/**\n * Build CSV text for the chosen row and column scopes.\n *\n * @typeParam TRow - The row type.\n */\nexport function buildTableCsv<TRow>(options: {\n  source: TableSource<TRow>;\n  columns: readonly ColumnDef<TRow>[];\n  scope?: ExportRowScope;\n  columnScope?: ExportColumnScope;\n  escapeFormulas?: boolean;\n  context?: ExportContext<TRow>;\n}): string {\n  const { rows, columns } = resolveExport(options);\n  return csvWriter.build({\n    table: buildExportTable(\n      rows,\n      columns,\n      exportTableOptions(rows, options.scope, options.context)\n    ),\n    filename: \"export.csv\",\n    escapeFormulas: options.escapeFormulas,\n  }).text;\n}\n\n/**\n * Build + download a file for the current table view. CSV unless a `writer`\n * says otherwise.\n *\n * @typeParam TRow - The row type.\n */\nexport function downloadTableCsv<TRow>(options: {\n  source: TableSource<TRow>;\n  columns: readonly ColumnDef<TRow>[];\n  filename?: string;\n  scope?: ExportRowScope;\n  columnScope?: ExportColumnScope;\n  escapeFormulas?: boolean;\n  context?: ExportContext<TRow>;\n  writer?: ExportWriter;\n  onBeforeExport?: NonNullable<ExportCsvOptions<TRow>[\"onBeforeExport\"]>;\n  onAfterExport?: NonNullable<ExportCsvOptions<TRow>[\"onAfterExport\"]>;\n}): void {\n  const { rows, columns } = resolveExport(options);\n  const writer = options.writer ?? csvWriter;\n\n  let filename = options.filename ?? defaultExportFilename(writer);\n  const decision = options.onBeforeExport?.({ rows, columns, filename });\n  if (decision === false) return;\n  if (decision && decision !== true && decision.filename) {\n    filename = decision.filename;\n  }\n\n  // Built after the hook, so a filename the hook chose reaches a writer that\n  // embeds it — and so a cancelled export builds nothing at all.\n  const file = writer.build({\n    table: buildExportTable(\n      rows,\n      columns,\n      exportTableOptions(rows, options.scope, options.context)\n    ),\n    filename,\n    escapeFormulas: options.escapeFormulas,\n  });\n  downloadExportFile(filename, file);\n  options.onAfterExport?.({ rows, columns, filename, csv: file.text, file });\n}\n\n/**\n * Resolve the `exportCsv` prop into a click handler, or `undefined` when off.\n * Adapters bind this to the toolbar Export button.\n *\n * @typeParam TRow - The row type.\n */\nexport function makeExportCsvHandler<TRow>(\n  exportCsv: boolean | ExportCsvOptions<TRow> | undefined,\n  source: TableSource<TRow>,\n  columns: readonly ColumnDef<TRow>[],\n  context?: ExportContext<TRow>\n): (() => void | Promise<void>) | undefined {\n  const options = resolveExportCsv(exportCsv);\n  if (!options) return undefined;\n\n  // Handing the export to a backend replaces building it here entirely —\n  // the browser neither assembles a file nor downloads one.\n  const writer = options.writer ?? csvWriter;\n  const { request } = options;\n  if (request) {\n    return () =>\n      request({\n        ...resolveExport({\n          source,\n          columns,\n          scope: options.scope,\n          columnScope: options.columns,\n          context,\n        }),\n        filename: options.filename ?? defaultExportFilename(writer),\n        scope: options.scope ?? \"page\",\n        format: writer.extension,\n        query: exportQueryOf(source, options.scope ?? \"page\"),\n      });\n  }\n\n  // \"All\" over a server source: the browser holds one page, so it has to be\n  // answered by fetching, not by pretending. `fetchAll` is the opt-in.\n  const serverAll =\n    options.scope === \"all\" && !source.allFilteredRows && options.fetchAll;\n  if (serverAll) {\n    return async () => {\n      const rows = await fetchAllExportRows(source, serverAll);\n      downloadTableCsv({\n        source: { ...source, allFilteredRows: rows },\n        columns,\n        filename: options.filename,\n        scope: \"all\",\n        columnScope: options.columns,\n        escapeFormulas: options.escapeFormulas,\n        context,\n        writer,\n        onBeforeExport: options.onBeforeExport,\n        onAfterExport: options.onAfterExport,\n      });\n    };\n  }\n\n  // Neither a backend handler nor an opt-in fetch, and no rows to read:\n  // write this page and name the button that way.\n  if (options.scope === \"all\" && !source.allFilteredRows) {\n    devWarn(\n      'exportCsv scope \"all\" needs the full filtered set. This source ' +\n        \"exposes only the current page, so the Export button writes this \" +\n        \"page and names itself that way. Pass `request` or `fetchAll` to \" +\n        \"export everything from a server tier.\"\n    );\n    return () =>\n      downloadTableCsv({\n        source,\n        columns,\n        filename: options.filename,\n        scope: \"page\",\n        columnScope: options.columns,\n        escapeFormulas: options.escapeFormulas,\n        context,\n        writer,\n        onBeforeExport: options.onBeforeExport,\n        onAfterExport: options.onAfterExport,\n      });\n  }\n\n  return () =>\n    downloadTableCsv({\n      source,\n      columns,\n      filename: options.filename,\n      scope: options.scope,\n      columnScope: options.columns,\n      escapeFormulas: options.escapeFormulas,\n      context,\n      writer,\n      onBeforeExport: options.onBeforeExport,\n      onAfterExport: options.onAfterExport,\n    });\n}\n\n/** The view-defining half of the source's state, for a server export. */\nfunction exportQueryOf<TRow>(\n  source: TableSource<TRow>,\n  scope: ExportRowScope\n): ExportQuery {\n  // \"All\" is the whole filtered set, so the window the reader happens to be\n  // looking at is not part of the question. Sending it invites a backend to\n  // answer with one page and call it everything.\n  const paged = scope !== \"all\";\n  return {\n    page: paged ? source.page : undefined,\n    limit: paged ? source.limit : undefined,\n    search: source.search,\n    sortBy: source.sortBy,\n    sortDir: source.sortDir,\n    filters: source.extra,\n    groupBy: source.groupBy,\n  };\n}\n","/**\n * Kit-agnostic notices for opted-in features that cannot run.\n *\n * The host turned something on; the table cannot honour it. Dev consoles\n * already warn. The person at the table should see the same fact — off,\n * disabled, or one page — through existing chrome (status bar, export\n * label, missing pin/reorder, unvirtualized page). Nothing here flips an\n * opt-in or draws a new control.\n */\nimport {\n  exportAllFallsBackToPage,\n  type ExportCsvOptions,\n} from \"../export/tableCsv\";\nimport type { TableSource } from \"../source/TableSource\";\nimport type { TableLabels } from \"../types\";\n\n/** Which opted-in feature is inert. */\nexport type FeatureNoticeKind =\n  | \"virtualize-paged\"\n  | \"pin-nested\"\n  | \"reorder-nested\"\n  | \"grouping-unavailable\"\n  | \"export-all-page\"\n  | \"edit-without-writer\";\n\n/** How the table already looks to the person sitting at it. */\nexport type FeatureNoticeAppearance = \"off\" | \"disabled\" | \"one-page\";\n\n/** One inert feature, ready for a status slot or a root attribute. */\nexport interface FeatureNotice {\n  readonly kind: FeatureNoticeKind;\n  readonly appearance: FeatureNoticeAppearance;\n  readonly message: string;\n}\n\n/** Inputs {@link collectFeatureNotices} needs. Host props + source facts. */\nexport interface CollectFeatureNoticesInput<TRow = unknown> {\n  virtualize?: boolean;\n  paginationMode?: TableSource<TRow>[\"paginationMode\"];\n  groupByKeys: readonly string[];\n  allFilteredRows?: readonly TRow[];\n  serverGroups?: unknown;\n  rowPinningRequested: boolean;\n  rowReorderRequested: boolean;\n  /** Grouping is armed or a tree is on — pin and reorder stay off. */\n  nestedArmed: boolean;\n  hasEditableColumn: boolean;\n  onCellEdit?: unknown;\n  rowEditing?: boolean;\n  onRowEdit?: unknown;\n  batchEditing?: boolean;\n  onBatchEdit?: unknown;\n  exportCsv?: boolean | ExportCsvOptions<TRow>;\n  labels: TableLabels;\n}\n\n/**\n * Build the notices for features the host asked for that cannot run.\n *\n * @param input - Host flags, source facts, and resolved labels.\n * @returns Notices in a stable order; empty when everything can run.\n */\nexport function collectFeatureNotices<TRow>(\n  input: CollectFeatureNoticesInput<TRow>\n): readonly FeatureNotice[] {\n  const labels = input.labels;\n  const notices: FeatureNotice[] = [];\n\n  if (input.virtualize === true && input.paginationMode === \"paged\") {\n    notices.push({\n      kind: \"virtualize-paged\",\n      appearance: \"one-page\",\n      message:\n        labels.noticeVirtualizePaged ??\n        \"Virtualization is off — this paged table shows one page at a time.\",\n    });\n  }\n\n  if (\n    input.groupByKeys.length > 0 &&\n    input.allFilteredRows === undefined &&\n    input.serverGroups === undefined\n  ) {\n    notices.push({\n      kind: \"grouping-unavailable\",\n      appearance: \"off\",\n      message:\n        labels.noticeGroupingUnavailable ??\n        \"Grouping is off — this source does not provide the full filtered set.\",\n    });\n  }\n\n  if (input.rowPinningRequested && input.nestedArmed) {\n    notices.push({\n      kind: \"pin-nested\",\n      appearance: \"off\",\n      message:\n        labels.noticePinNested ??\n        \"Row pinning is off while grouping or a tree is on.\",\n    });\n  }\n\n  if (input.rowReorderRequested && input.nestedArmed) {\n    notices.push({\n      kind: \"reorder-nested\",\n      appearance: \"off\",\n      message:\n        labels.noticeReorderNested ??\n        \"Row reorder is off while grouping or a tree is on.\",\n    });\n  }\n\n  if (\n    exportAllFallsBackToPage(input.exportCsv, {\n      allFilteredRows: input.allFilteredRows,\n    })\n  ) {\n    notices.push({\n      kind: \"export-all-page\",\n      appearance: \"one-page\",\n      message:\n        labels.noticeExportAllPage ??\n        \"Export all is this page — the full filtered set is not available.\",\n    });\n  }\n\n  const editMissingWriter =\n    (input.hasEditableColumn && input.onCellEdit === undefined) ||\n    (input.rowEditing === true && input.onRowEdit === undefined) ||\n    (input.batchEditing === true && input.onBatchEdit === undefined);\n  if (editMissingWriter) {\n    notices.push({\n      kind: \"edit-without-writer\",\n      appearance: \"off\",\n      message:\n        labels.noticeEditWithoutWriter ??\n        \"Editing is off — no write handler is wired.\",\n    });\n  }\n\n  return notices;\n}\n","/**\n * A nested table under a row — a real table, not a rendered slot.\n *\n * `renderRowDetail` hands the host a blank panel: whatever goes in it is theirs\n * to build, and a table built by hand in there has none of the sorting,\n * filtering, selection, keyboard navigation or accessibility the outer one has.\n * A nested table is the same component the page uses, so the reader gets the\n * same table twice over rather than a lesser one inside a better one.\n *\n * The host mounts the kit's own `<DataTable>` — core has no components, and the\n * child rows are a different type from the parent's, which no prop on a\n * single-generic component can carry without erasing it. What core owns is the\n * part every nested table gets wrong on its own: the defaults it must have, the\n * region that names it for assistive technology, and the fall back to a\n * hand-built panel for rows that have no nested table.\n */\nimport type { ReactElement, ReactNode } from \"react\";\n\nimport type { TableLabels } from \"../types\";\n\n/** Row density, as the table's own prop spells it. */\ntype Density = \"comfortable\" | \"compact\";\n\n/**\n * The props a nested table must be mounted with, handed to the host's `table`\n * callback to spread onto the kit's own component.\n */\nexport interface NestedTableDefaults {\n  /**\n   * Never true. Two tables writing `?page=` fight over one URL, and the loser\n   * silently resets while the reader is using it.\n   */\n  urlSync: false;\n  /**\n   * Off by default: a second search box inside a row reads as chrome rather\n   * than as a feature. Spread these first and pass `searchable` after to keep\n   * it.\n   */\n  searchable: boolean;\n  /** The parent's density, so the child matches rather than guessing. */\n  density: Density | undefined;\n  /** The parent's labels, so a nested table is localized like its parent. */\n  labels: TableLabels | undefined;\n  /** The accessible name, also used on the region around it. */\n  tableLabel: string;\n}\n\n/** A row's nested table. */\nexport interface NestedTable {\n  /**\n   * Accessible name for the nested table and its region — the only thing a\n   * screen-reader user has to go on once focus is inside it. Name it after the\n   * row it belongs to (\"Orders for Ada Lovelace\"), not after the feature.\n   */\n  label?: string;\n  /**\n   * Mount the kit's own table with these defaults:\n   * `(defaults) => <DataTable {...defaults} data={row.orders} columns={cols} rowKey={id} />`.\n   * The child rows keep their own type — the closure holds it, so nothing is\n   * erased at a prop boundary.\n   */\n  table: (defaults: NestedTableDefaults) => ReactNode;\n}\n\n/** A host's declaration: the nested table for a row, or nothing. */\nexport type NestedTableFor<TRow> = (row: TRow) => NestedTable | undefined;\n\n/** What the parent contributes to its nested tables. */\nexport interface NestedTableParent {\n  /** The parent's density. */\n  density?: Density;\n  /** The parent's labels. */\n  labels?: TableLabels;\n}\n\n/** The name a nested table takes when the host does not give it one. */\nconst DEFAULT_LABEL = \"Row details\";\n\n/**\n * The defaults a table inside a row is mounted with.\n *\n * @param label - The nested table's accessible name.\n * @param parent - What the parent table contributes.\n * @returns Props to spread onto the kit's own table.\n */\nexport function nestedTableDefaults(\n  label: string,\n  parent: NestedTableParent = {}\n): NestedTableDefaults {\n  return {\n    urlSync: false,\n    searchable: false,\n    density: parent.density,\n    labels: parent.labels,\n    tableLabel: label,\n  };\n}\n\n/**\n * Turn a nested-table declaration into the detail renderer the table already\n * knows how to place under a row.\n *\n * @typeParam TRow - The parent row type.\n * @param options - The declaration, the host's own panel, and the parent chrome.\n * @returns A `renderRowDetail`, or `undefined` when neither is declared.\n */\nexport function nestedTableDetail<TRow>(options: {\n  nestedTable: NestedTableFor<TRow> | undefined;\n  /** The host's own detail panel, used for rows with no nested table. */\n  renderRowDetail?: (row: TRow) => ReactNode;\n  parent?: NestedTableParent;\n}): ((row: TRow) => ReactNode) | undefined {\n  const { nestedTable, renderRowDetail, parent } = options;\n  if (!nestedTable) return renderRowDetail;\n  // One shape out of here, always an element or null: a union of \"the host's\n  // node\" and \"our element\" reads as two functions wearing one name.\n  function renderNestedDetail(row: TRow): ReactElement | null {\n    const nested = nestedTable?.(row);\n    if (nested) return <NestedTableRegion nested={nested} parent={parent} />;\n    const own = renderRowDetail?.(row);\n    return own === undefined || own === null ? null : <>{own}</>;\n  }\n  return renderNestedDetail;\n}\n\n/** The region around a nested table, named for assistive technology. */\nfunction NestedTableRegion({\n  nested,\n  parent,\n}: Readonly<{\n  nested: NestedTable;\n  parent?: NestedTableParent;\n}>): ReactElement {\n  const label = nested.label ?? DEFAULT_LABEL;\n  return (\n    <section data-adapttable-part=\"nested-table\" aria-label={label}>\n      {nested.table(nestedTableDefaults(label, parent))}\n    </section>\n  );\n}\n","/**\n * Hierarchical rows — a tree the DATA declares, not one derived from values.\n *\n * This is deliberately not the grouping model. A group is an answer to a\n * question the reader asked (\"by team\"), computed from values and re-computed\n * when they change the question. A tree is a fact about the rows: a folder\n * contains files, a task has subtasks, an account rolls up to a parent. Sharing\n * one implementation would mean either grouping that cannot express a real\n * hierarchy, or a tree that reshuffles when someone sorts a column.\n *\n * A host declares the shape either way round — `getChildren(row)` for nested\n * data, or `getParentId(row)` for a flat table with a parent column — and the\n * model flattens it to the same list of entries adapters render.\n */\nimport type { ColumnDef } from \"../types\";\n\n/** One visual row of a tree: the row itself, plus where it sits. */\nexport interface TreeEntry<TRow> {\n  /** The row. */\n  row: TRow;\n  /** Its stable id. */\n  key: string;\n  /** Depth from zero — what the tree column indents by. */\n  level: number;\n  /** Whether it has children at all, loaded or not. */\n  hasChildren: boolean;\n  /** Whether its children are showing. */\n  expanded: boolean;\n  /** Its ancestors' ids, outermost first — what collapsing a parent hides. */\n  path: readonly string[];\n  /**\n   * Every descendant's id, for selection: ticking a folder ticks what is in\n   * it, and a parent shows as partly selected when only some are.\n   */\n  descendantIds: readonly string[];\n  /** Whether children are being fetched for this node right now. */\n  loading?: boolean;\n}\n\n/** How a host declares the hierarchy. */\nexport interface TreeShape<TRow> {\n  /** Nested data: the children of a row, if any. */\n  getChildren?: (row: TRow) => readonly TRow[] | undefined;\n  /** Flat data: the id of a row's parent, if any. */\n  getParentId?: (row: TRow) => string | undefined;\n  /**\n   * Whether a row has children the browser has not fetched yet. Without it a\n   * node with no loaded children is a leaf, which is the right default for\n   * data that is all in hand.\n   */\n  hasChildren?: (row: TRow) => boolean;\n}\n\n/** What {@link buildTreeEntries} needs. */\nexport interface BuildTreeEntriesOptions<TRow> extends TreeShape<TRow> {\n  /** The rows, nested or flat. */\n  rows: readonly TRow[];\n  /** Row identity. */\n  getRowId: (row: TRow) => string;\n  /** Which nodes are expanded, by id. */\n  expandedIds: ReadonlySet<string>;\n  /** Nodes whose children are being fetched. */\n  loadingIds?: ReadonlySet<string>;\n}\n\n/**\n * Flatten a hierarchy into the rows a table renders, in reading order.\n *\n * A collapsed node contributes itself and nothing beneath it. `descendantIds`\n * covers the whole subtree whether or not it is showing, because selecting a\n * folder means selecting what is in it — including the part currently folded\n * away.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link BuildTreeEntriesOptions}.\n * @returns The entries, in render order.\n */\nexport function buildTreeEntries<TRow>(\n  options: BuildTreeEntriesOptions<TRow>\n): TreeEntry<TRow>[] {\n  const {\n    rows,\n    getRowId,\n    expandedIds,\n    loadingIds,\n    getChildren,\n    getParentId,\n    hasChildren,\n  } = options;\n  const childrenOf =\n    getChildren ?? childrenFromParentIds(rows, getParentId, getRowId);\n  const roots = getParentId\n    ? rows.filter((row) => {\n        const parent = getParentId(row);\n        return (\n          parent === undefined || !rows.some((r) => getRowId(r) === parent)\n        );\n      })\n    : rows;\n\n  const entries: TreeEntry<TRow>[] = [];\n\n  /** Collect a subtree's ids, folded or not — selection covers all of it. */\n  const descendantsOf = (row: TRow): string[] => {\n    const ids: string[] = [];\n    for (const child of childrenOf(row) ?? []) {\n      ids.push(getRowId(child), ...descendantsOf(child));\n    }\n    return ids;\n  };\n\n  const walk = (list: readonly TRow[], level: number, path: string[]): void => {\n    for (const row of list) {\n      const key = getRowId(row);\n      const children = childrenOf(row) ?? [];\n      const expandable = children.length > 0 || hasChildren?.(row) === true;\n      const expanded = expandable && expandedIds.has(key);\n      entries.push({\n        row,\n        key,\n        level,\n        hasChildren: expandable,\n        expanded,\n        path,\n        descendantIds: descendantsOf(row),\n        loading: loadingIds?.has(key),\n      });\n      if (expanded && children.length > 0) {\n        walk(children, level + 1, [...path, key]);\n      }\n    }\n  };\n\n  walk(roots, 0, []);\n  return entries;\n}\n\n/**\n * Read children from a flat list keyed by parent id.\n *\n * Built once per call rather than scanned per row: a thousand rows scanned for\n * each of a thousand rows is a million comparisons for a table nobody would\n * call large.\n */\nfunction childrenFromParentIds<TRow>(\n  rows: readonly TRow[],\n  getParentId: ((row: TRow) => string | undefined) | undefined,\n  getRowId: (row: TRow) => string\n): (row: TRow) => readonly TRow[] {\n  if (!getParentId) return () => [];\n  const byParent = new Map<string, TRow[]>();\n  for (const row of rows) {\n    const parent = getParentId(row);\n    if (parent === undefined) continue;\n    const siblings = byParent.get(parent) ?? [];\n    siblings.push(row);\n    byParent.set(parent, siblings);\n  }\n  return (row) => byParent.get(getRowId(row)) ?? [];\n}\n\n/**\n * Keep the rows that match, and every ancestor that leads to one.\n *\n * A filtered tree that dropped the folders would leave matching files with no\n * path to them — the reader would see a flat list and lose the one thing the\n * tree was for. Ancestors are kept even when they do not match themselves.\n *\n * @typeParam TRow - The row type.\n * @param options - The shape, the rows, and the predicate.\n * @returns The rows that survive, nested exactly as they arrived.\n */\nexport function filterTreeRows<TRow>(options: {\n  rows: readonly TRow[];\n  getChildren: (row: TRow) => readonly TRow[] | undefined;\n  /** Rebuild a row with the children that survived — the host owns its shape. */\n  withChildren: (row: TRow, children: readonly TRow[]) => TRow;\n  match: (row: TRow) => boolean;\n}): TRow[] {\n  const { rows, getChildren, withChildren, match } = options;\n  return rows.flatMap((row) => {\n    const kept = filterTreeRows({\n      rows: getChildren(row) ?? [],\n      getChildren,\n      withChildren,\n      match,\n    });\n    if (kept.length === 0 && !match(row)) return [];\n    return [withChildren(row, kept)];\n  });\n}\n\n/**\n * The style a tree column's cell carries at a given depth.\n *\n * Logical padding, so a tree indents from the right in Arabic and Hebrew\n * without a second rule — the same one grouping uses, at the same step, so a\n * table that has both does not step differently between them.\n *\n * @param level - Depth from zero.\n * @returns The style for the tree column's cell.\n */\nexport function treeIndentStyle(level: number): {\n  paddingInlineStart?: string;\n} {\n  return level > 0 ? { paddingInlineStart: `${level * 1.5}rem` } : {};\n}\n\n/**\n * The style a card carries at a given depth.\n *\n * A card is a block, not a cell, so the whole card steps in rather than its\n * text — on a narrow screen an indented card edge reads as hierarchy where an\n * indented line reads as a typo. Logical margin, so it steps from the right\n * in Arabic and Hebrew.\n *\n * @param level - Depth from zero.\n * @returns The style for the card.\n */\nexport function treeCardStyle(level: number): {\n  marginInlineStart?: string;\n} {\n  return level > 0 ? { marginInlineStart: `${level * 1.25}rem` } : {};\n}\n\n/** Which column renders the chevron and the indent. */\nexport function treeColumnKey<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  declared?: string\n): string | undefined {\n  if (declared !== undefined) return declared;\n  return columns[0]?.key;\n}\n\n/** One body row an adapter renders, tree or flat. */\nexport interface BodyRowEntry<TRow> {\n  /** The row. */\n  row: TRow;\n  /** Its position for `data-index` and cell navigation. */\n  index: number;\n  /**\n   * Index in the page dataset when pinned rows left the window.\n   * Equals `index` when pinning is off.\n   */\n  sourceIndex?: number;\n  /** Its stable key. */\n  key: string;\n  /** Its place in the tree, when the table is one. */\n  treeEntry?: TreeEntry<TRow>;\n}\n\n/**\n * The rows a body renders: the tree's visible entries when the host declared\n * a hierarchy, the (possibly windowed) rows otherwise.\n *\n * Nine adapters make the same choice, so they make it in one place — and each\n * body keeps a single `.map` over one list rather than a branch that has to\n * stay in step across nine files.\n *\n * @typeParam TRow - The row type.\n * @param rows - The flat rows, already windowed.\n * @param tree - The tree bundle, when one is armed.\n * @returns What to render, in reading order.\n */\nexport function bodyRowEntries<TRow>(\n  rows: readonly {\n    row: TRow;\n    index: number;\n    key: string;\n    sourceIndex?: number;\n  }[],\n  tree?: { entries: readonly TreeEntry<TRow>[] }\n): BodyRowEntry<TRow>[] {\n  if (tree) {\n    return tree.entries.map((entry, position) => ({\n      row: entry.row,\n      index: position,\n      key: entry.key,\n      treeEntry: entry,\n    }));\n  }\n  return rows.map((entry) => ({\n    row: entry.row,\n    index: entry.index,\n    sourceIndex: entry.sourceIndex,\n    key: entry.key,\n  }));\n}\n","/**\n * Children fetched when a node is opened.\n *\n * A tree of any size cannot arrive whole: an org chart of ten thousand people\n * is one request per branch the reader actually opens. What that costs the host\n * is one callback; what it costs the reader is a spinner on the node they\n * clicked — never a table-wide loading state, because the rest of the tree is\n * still perfectly readable while one branch fills.\n *\n * The set of loading ids lives here rather than in the host's state so the\n * chevron can show it without the host wiring anything: opening a node with\n * unfetched children marks it, and it clears when the rows arrive or the fetch\n * rejects. A node whose fetch failed is left closed and clickable, so the\n * reader's retry is the same gesture as the first attempt.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\n\n/** What {@link useLazyChildren} needs. */\nexport interface UseLazyChildrenOptions<TRow> {\n  /**\n   * Fetch a node's children. Resolve once they are in the data the table\n   * reads — the table re-walks the tree from the rows it is given, so it needs\n   * nothing back.\n   */\n  onLoadChildren?: (row: TRow) => void | Promise<void>;\n  /** Whether a row's children are already in hand. */\n  hasLoadedChildren: (row: TRow) => boolean;\n  /** Row identity. */\n  getRowId: (row: TRow) => string;\n}\n\n/** Lazy-loading state for a tree. */\nexport interface LazyChildrenState<TRow> {\n  /** Nodes being fetched right now — what the chevron shows a spinner for. */\n  loadingIds: ReadonlySet<string>;\n  /**\n   * Call before opening a node: fetches its children when they are missing.\n   * Returns nothing — expansion is not blocked on the fetch, so the row opens\n   * immediately and fills when the rows arrive.\n   */\n  loadIfNeeded: (row: TRow) => void;\n  /** Ids whose last fetch rejected, so a caller can offer a retry. */\n  failedIds: ReadonlySet<string>;\n}\n\n/**\n * Track which nodes are fetching their children, and fetch on demand.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseLazyChildrenOptions}.\n * @returns The state; inert when no `onLoadChildren` is given.\n */\nexport function useLazyChildren<TRow>(\n  options: UseLazyChildrenOptions<TRow>\n): LazyChildrenState<TRow> {\n  const [loadingIds, setLoadingIds] = useState<ReadonlySet<string>>(\n    () => new Set()\n  );\n  const [failedIds, setFailedIds] = useState<ReadonlySet<string>>(\n    () => new Set()\n  );\n  // Ids already asked for, so a second click while a fetch is in flight — or\n  // after one that returned nothing — does not ask again.\n  const asked = useRef(new Set<string>());\n  const alive = useRef(true);\n  useEffect(() => {\n    alive.current = true;\n    return () => {\n      alive.current = false;\n    };\n  }, []);\n\n  const settle = useEventCallback((id: string, failed: boolean) => {\n    if (!alive.current) return;\n    setLoadingIds((current) => {\n      const next = new Set(current);\n      next.delete(id);\n      return next;\n    });\n    if (failed) {\n      asked.current.delete(id);\n      setFailedIds((current) => new Set(current).add(id));\n    }\n  });\n\n  const loadIfNeeded = useEventCallback((row: TRow) => {\n    const { onLoadChildren, hasLoadedChildren, getRowId } = options;\n    if (!onLoadChildren) return;\n    const id = getRowId(row);\n    if (hasLoadedChildren(row) || asked.current.has(id)) return;\n    asked.current.add(id);\n    setFailedIds((current) => {\n      if (!current.has(id)) return current;\n      const next = new Set(current);\n      next.delete(id);\n      return next;\n    });\n    setLoadingIds((current) => new Set(current).add(id));\n    // A synchronous handler that throws must settle the node too, or the\n    // spinner outlives the attempt.\n    try {\n      void Promise.resolve(onLoadChildren(row)).then(\n        () => {\n          settle(id, false);\n        },\n        () => {\n          settle(id, true);\n        }\n      );\n    } catch {\n      settle(id, true);\n    }\n  });\n\n  return {\n    loadingIds,\n    failedIds,\n    loadIfNeeded: useCallback(loadIfNeeded, [loadIfNeeded]),\n  };\n}\n","/**\n * Which tree nodes are open.\n *\n * Separate state from row expansion (a detail panel) and from group collapse\n * (a derived bucket), because they answer different questions and a table can\n * have all three at once. The controlled pair mirrors the others: the table\n * performs the change and tells the host, or the host holds the set.\n *\n * Expanded rather than collapsed, unlike groups: a tree starts folded, so the\n * open set is the small one — the opposite default, and the same reasoning.\n */\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { useEventCallback } from \"../hooks/useEventCallback\";\n\n/** Tree expansion state and the actions that change it. */\nexport interface TreeExpansionState {\n  /** Ids of the currently expanded nodes. */\n  expandedIds: ReadonlySet<string>;\n  /** Whether a node is expanded. */\n  isExpanded: (id: string) => boolean;\n  /** Open or close one node. */\n  toggle: (id: string) => void;\n  /** Open a specific node — what \"reveal this row\" needs. */\n  expand: (id: string) => void;\n  /** Open every node in `ids`. */\n  expandAll: (ids: readonly string[]) => void;\n  /** Fold everything. */\n  collapseAll: () => void;\n}\n\n/**\n * Headless expansion state for a tree.\n *\n * @param controlled - The host's pair, when it holds the state.\n * @returns The state; uncontrolled unless `expandedIds` is given.\n */\nexport function useTreeExpansion(controlled?: {\n  expandedIds?: readonly string[];\n  onExpandedIdsChange?: (ids: string[]) => void;\n}): TreeExpansionState {\n  const controlledIds = controlled?.expandedIds;\n  const isControlled = controlledIds !== undefined;\n  const [uncontrolled, setUncontrolled] = useState<ReadonlySet<string>>(\n    () => new Set()\n  );\n\n  const expandedIds = useMemo(\n    () => (isControlled ? new Set(controlledIds ?? []) : uncontrolled),\n    [isControlled, controlledIds, uncontrolled]\n  );\n\n  // Stable across renders: the options object arrives fresh every time, and a\n  // commit that changed with it would change every action here.\n  const commit = useEventCallback((next: Set<string>) => {\n    if (isControlled) controlled?.onExpandedIdsChange?.([...next]);\n    else setUncontrolled(next);\n  });\n\n  const isExpanded = useCallback(\n    (id: string) => expandedIds.has(id),\n    [expandedIds]\n  );\n\n  const toggle = useCallback(\n    (id: string) => {\n      const next = new Set(expandedIds);\n      if (next.has(id)) next.delete(id);\n      else next.add(id);\n      commit(next);\n    },\n    [expandedIds, commit]\n  );\n\n  const expand = useCallback(\n    (id: string) => {\n      if (expandedIds.has(id)) return;\n      commit(new Set(expandedIds).add(id));\n    },\n    [expandedIds, commit]\n  );\n\n  const expandAll = useCallback(\n    (ids: readonly string[]) => {\n      commit(new Set(ids));\n    },\n    [commit]\n  );\n\n  const collapseAll = useCallback(() => {\n    commit(new Set());\n  }, [commit]);\n\n  return useMemo(\n    () => ({\n      expandedIds,\n      isExpanded,\n      toggle,\n      expand,\n      expandAll,\n      collapseAll,\n    }),\n    [expandedIds, isExpanded, toggle, expand, expandAll, collapseAll]\n  );\n}\n","/**\n * How wide each column ends up.\n *\n * A table has two honest answers to \"how wide is this column\": as wide as it\n * needs to be, and as wide as its share of the space. The first overflows and\n * scrolls, which is right for a dense table of many columns; the second fits\n * the container, which is right for a table of six. The difference is one prop,\n * and the mechanism underneath is CSS the browser already knows: a fixed table\n * layout with percentage widths shares space proportionally, and `min-width` /\n * `max-width` clamp it.\n */\nimport type { CSSProperties } from \"react\";\n\nimport type { ColumnDef } from \"../types\";\nimport { columnGroupStubStyle, isColumnGroupStubKey } from \"./headerGroups\";\n\n/** What the sizing needs to know about the table as a whole. */\nexport interface ColumnSizingOptions<TRow> {\n  /** The columns as rendered. */\n  columns: readonly ColumnDef<TRow>[];\n  /** Whether the table fits its container rather than overflowing it. */\n  fitColumns?: boolean;\n  /** User widths from the layout state, which always win. */\n  widths?: Readonly<Record<string, number>>;\n}\n\n/**\n * The share of leftover space each flexible column takes.\n *\n * A column with a width — declared or dragged — is not flexible: the user or\n * the author already answered the question for it. Everything else divides\n * what remains, weighted by `flex`, which defaults to 1 in fitting mode so a\n * table of plain columns simply spreads.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link ColumnSizingOptions}.\n * @returns Total flex weight, and each flexible column's percentage.\n */\nexport function columnFlexShares<TRow>(\n  options: ColumnSizingOptions<TRow>\n): Readonly<Record<string, number>> {\n  const { columns, fitColumns = false, widths } = options;\n  const flexible = columns.filter(\n    (column) =>\n      widths?.[column.key] === undefined &&\n      column.width === undefined &&\n      (column.flex !== undefined || fitColumns)\n  );\n  const total = flexible.reduce((sum, column) => sum + (column.flex ?? 1), 0);\n  if (total === 0) return {};\n  const shares: Record<string, number> = {};\n  for (const column of flexible) {\n    shares[column.key] = ((column.flex ?? 1) / total) * 100;\n  }\n  return shares;\n}\n\n/**\n * The style one column's cells carry: its width, and the bounds it keeps.\n *\n * The user's dragged width wins over everything — they said what they wanted\n * — then the column's own `width`, then its share of the leftover space.\n *\n * @typeParam TRow - The row type.\n * @param column - The column being sized.\n * @param shares - Percentages from {@link columnFlexShares}.\n * @param userWidth - The width from the layout state, when the user set one.\n * @returns The style, or `undefined` when the column says nothing about size.\n */\nexport function columnSizeStyle<TRow>(\n  column: ColumnDef<TRow>,\n  shares: Readonly<Record<string, number>> = {},\n  userWidth?: number\n): CSSProperties | undefined {\n  if (isColumnGroupStubKey(column.key)) {\n    return columnGroupStubStyle();\n  }\n  const share = shares[column.key];\n  const width =\n    userWidth ??\n    column.width ??\n    (share === undefined ? undefined : `${share}%`);\n  if (\n    width === undefined &&\n    column.minWidth === undefined &&\n    column.maxWidth === undefined\n  ) {\n    return undefined;\n  }\n  return {\n    width,\n    minWidth: column.minWidth,\n    maxWidth: column.maxWidth,\n  };\n}\n\n/**\n * The style the `<table>` itself carries when it fits its container.\n *\n * `table-layout: fixed` is what makes percentage widths mean anything: without\n * it the browser sizes columns from their content and the percentages are a\n * suggestion it may ignore.\n *\n * @param fitColumns - Whether the table fits its container.\n * @returns The style, or `undefined` when it overflows as usual.\n */\nexport function fittedTableStyle(\n  fitColumns?: boolean\n): CSSProperties | undefined {\n  return fitColumns === true\n    ? { tableLayout: \"fixed\", width: \"100%\" }\n    : undefined;\n}\n","import type { ColumnDef } from \"../types\";\n\n/** Which layout a table is rendering in. */\nexport type TableLayout = \"desktop\" | \"mobile\";\n\n/**\n * Resolve the columns visible for a layout.\n *\n * - Desktop: drops `hideOnDesktop` columns.\n * - Mobile: drops `hideOnMobile` columns, but the first three declared\n *   desktop-visible columns WITHOUT an explicit `hideOnMobile` surface so\n *   every card keeps a minimum identity block — an explicit hide always\n *   wins over the identity default. Mobile-only columns (`hideOnDesktop`\n *   without `hideOnMobile`) render here — they exist precisely for the\n *   card layout.\n *\n * @typeParam TRow - The row type.\n * @param columns - All declared columns.\n * @param layout - The current layout.\n * @returns The columns to render, in declared order.\n */\nexport function visibleColumns<TRow>(\n  columns: readonly ColumnDef<TRow>[],\n  layout: TableLayout,\n  mobileIdentityColumns = 3\n): ColumnDef<TRow>[] {\n  if (layout === \"desktop\") return columns.filter((c) => !c.hideOnDesktop);\n  // Identity anchors come from the desktop view (the columns a user knows),\n  // but mobile filters the FULL declared set so mobile-only columns survive.\n  // An explicit `hideOnMobile` is never anchored — the author's hide wins,\n  // and the next desktop-visible column takes the identity slot instead.\n  const alwaysShow = new Set(\n    columns\n      .filter((c) => !c.hideOnDesktop && !c.hideOnMobile)\n      .slice(0, Math.max(0, mobileIdentityColumns))\n      .map((c) => c.key)\n  );\n  return columns.filter((c) => alwaysShow.has(c.key) || !c.hideOnMobile);\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport type { ExtraFilters, FilterValue } from \"../types\";\nimport {\n  type ActiveFilterChip,\n  type ChipLabelResolver,\n  useActiveFilterChips,\n} from \"./useActiveFilterChips\";\n\n/** Options for {@link useExtraChips}. */\nexport interface UseExtraChipsOptions {\n  /** A source's `extra` bag. */\n  readonly extra: ExtraFilters;\n  /** A source's `setExtra` setter. */\n  readonly setExtra: (key: string, value: FilterValue) => void;\n  /**\n   * Map of filter key → label resolver. Only keys present here become\n   * chips. Memoise this on the caller side when the resolver closes over\n   * `t`/lookup data so the chip list stays stable across renders.\n   */\n  readonly labels: Readonly<Record<string, ChipLabelResolver>>;\n}\n\n/**\n * Convenience wrapper over {@link useActiveFilterChips} that reads a\n * source's `extra` bag, applies the label resolvers, and wires each\n * chip's removal back to `setExtra`. The caller only declares the labels.\n *\n * @param options - See {@link UseExtraChipsOptions}.\n * @returns The derived chips.\n */\nexport function useExtraChips({\n  extra,\n  setExtra,\n  labels,\n}: UseExtraChipsOptions): ActiveFilterChip[] {\n  const values = useMemo<Record<string, FilterValue>>(() => {\n    const out: Record<string, FilterValue> = {};\n    for (const key of Object.keys(labels)) {\n      const v = extra[key];\n      if (v == null || v === \"\") continue;\n      if (Array.isArray(v) && v.length === 0) continue;\n      out[key] = v;\n    }\n    return out;\n  }, [extra, labels]);\n\n  const onChange = useCallback(\n    (key: string, next: FilterValue) => {\n      setExtra(key, next ?? \"\");\n    },\n    [setExtra]\n  );\n\n  return useActiveFilterChips({ values, labels, onChange });\n}\n","/** Derived pagination figures for a paged view. */\nexport interface PaginationInfo {\n  /** Total number of pages (always ≥ 1). */\n  totalPages: number;\n  /** The page clamped into `[1, totalPages]`. */\n  safePage: number;\n  /** 1-based index of the first row on the page (0 when empty). */\n  fromIndex: number;\n  /** 1-based index of the last row on the page (0 when empty). */\n  toIndex: number;\n}\n\n/**\n * Compute page count and the visible \"from–to\" range for a paged view.\n *\n * @param input - Current `page`, `limit`, and `total`.\n * @returns The derived {@link PaginationInfo}.\n */\nexport function computePagination(input: {\n  page: number;\n  limit: number;\n  total: number;\n}): PaginationInfo {\n  // Coerce non-finite inputs (NaN/Infinity from hand-built params or bad\n  // data) to sane defaults so the derived figures are never NaN.\n  const limit = Number.isFinite(input.limit) ? Math.max(input.limit, 1) : 1;\n  const total = Number.isFinite(input.total) ? Math.max(input.total, 0) : 0;\n  const page = Number.isFinite(input.page) ? input.page : 1;\n  const totalPages = Math.max(1, Math.ceil(total / limit));\n  const safePage = Math.min(Math.max(page, 1), totalPages);\n  const fromIndex = total === 0 ? 0 : (safePage - 1) * limit + 1;\n  const toIndex = Math.min(safePage * limit, total);\n  return { totalPages, safePage, fromIndex, toIndex };\n}\n\n/** One slot in a numbered pager: a page number, or a gap where pages were elided. */\nexport type PaginationItem = number | \"ellipsis\";\n\nfunction range(start: number, end: number): number[] {\n  const out: number[] = [];\n  for (let n = start; n <= end; n += 1) out.push(n);\n  return out;\n}\n\n/**\n * A pager slot paired with a stable React key — page numbers key on themselves,\n * ellipses on their semantic side (`ellipsis-left` / `ellipsis-right`). Use this\n * instead of indexing into {@link paginationItems} so list keys never depend on\n * the array position.\n */\nexport interface PaginationSlot {\n  /** The page number or `\"ellipsis\"` marker. */\n  item: PaginationItem;\n  /** A stable, position-free React key for this slot. */\n  key: string;\n}\n\n/**\n * Build the keyed pager slots (see {@link PaginationSlot}) for a numbered pager.\n * Wraps {@link paginationItems}, assigning each ellipsis a `left`/`right` side\n * key in encounter order — at most two ellipses ever appear, so the side is a\n * stable identity that does not rely on the array index.\n *\n * @param page - The current (1-based) page.\n * @param totalPages - Total page count (coerced to ≥ 1).\n * @param siblings - Pages to show on each side of the current page.\n * @returns Keyed pager slots.\n */\nexport function paginationSlots(\n  page: number,\n  totalPages: number,\n  siblings = 1\n): PaginationSlot[] {\n  let nextSide: \"left\" | \"right\" = \"left\";\n  return paginationItems(page, totalPages, siblings).map((item) => {\n    if (item === \"ellipsis\") {\n      const key = `ellipsis-${nextSide}`;\n      nextSide = \"right\";\n      return { item, key };\n    }\n    return { item, key: String(item) };\n  });\n}\n\n/**\n * Build the page-number sequence for a numbered pager — the first and last\n * (boundary) pages, the current page with `siblings` neighbours on each side,\n * and an `\"ellipsis\"` marker wherever a run of pages is elided. Mirrors the\n * `boundaries: 1` / `siblings: 1` defaults of the kit `<Pagination>` widgets so\n * every adapter — including the hand-rendered unstyled and Chakra pagers — lays\n * pages out identically.\n *\n * @param page - The current (1-based) page.\n * @param totalPages - Total page count (coerced to ≥ 1).\n * @param siblings - Pages to show on each side of the current page.\n * @returns Ordered page numbers interleaved with `\"ellipsis\"` gaps.\n */\nexport function paginationItems(\n  page: number,\n  totalPages: number,\n  siblings = 1\n): PaginationItem[] {\n  const total = Number.isFinite(totalPages)\n    ? Math.max(1, Math.floor(totalPages))\n    : 1;\n  const current = Math.min(Math.max(Math.floor(page) || 1, 1), total);\n  const boundaries = 1;\n\n  // With first/last boundaries, the current page + its siblings, and two\n  // ellipses, this many slots fit without eliding anything — so just list all.\n  const maxSlots = boundaries * 2 + siblings * 2 + 3;\n  if (total <= maxSlots) return range(1, total);\n\n  const left = Math.max(\n    Math.min(current - siblings, total - boundaries - siblings * 2 - 1),\n    boundaries + 2\n  );\n  const right = Math.min(\n    Math.max(current + siblings, boundaries + siblings * 2 + 2),\n    total - boundaries - 1\n  );\n\n  return [\n    ...range(1, boundaries),\n    // Collapse a single skipped page to that page rather than an ellipsis.\n    left > boundaries + 2 ? \"ellipsis\" : boundaries + 1,\n    ...range(left, right),\n    right < total - boundaries - 1 ? \"ellipsis\" : total - boundaries,\n    ...range(total - boundaries + 1, total),\n  ];\n}\n","import type { HeaderSelectionState } from \"../selection/useSelection\";\n\n/**\n * Tri-state for a group checkbox over its leaf row ids — same enum as the\n * table header selection state. Leaf ids only; never synthetic group keys.\n */\nexport function groupSelectionState(\n  leafIds: readonly string[],\n  selectedIds: ReadonlySet<string>\n): HeaderSelectionState {\n  if (leafIds.length === 0) return \"none\";\n  let selected = 0;\n  for (const id of leafIds) {\n    if (selectedIds.has(id)) selected += 1;\n  }\n  if (selected === 0) return \"none\";\n  if (selected === leafIds.length) return \"all\";\n  return \"some\";\n}\n\n/**\n * Toggle every leaf in the group: if any leaf is unselected, select all;\n * otherwise deselect all (matches typical \"select group\" checkbox UX).\n */\nexport function nextGroupSelection(\n  leafIds: readonly string[],\n  selectedIds: ReadonlySet<string>\n): { action: \"select\" | \"deselect\"; ids: readonly string[] } {\n  const state = groupSelectionState(leafIds, selectedIds);\n  if (state === \"all\") return { action: \"deselect\", ids: leafIds };\n  return { action: \"select\", ids: leafIds };\n}\n\n/**\n * Apply a group checkbox toggle in one pass — returns the next selected-id\n * set (adapters / {@link useSelection.toggleGroupLeaves} commit this).\n */\nexport function applyGroupLeafSelection(\n  leafIds: readonly string[],\n  selectedIds: ReadonlySet<string>\n): Set<string> {\n  const { action, ids } = nextGroupSelection(leafIds, selectedIds);\n  const next = new Set(selectedIds);\n  for (const id of ids) {\n    if (action === \"select\") next.add(id);\n    else next.delete(id);\n  }\n  return next;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { applyGroupLeafSelection } from \"../grouping/groupSelection\";\n\n/** Tri-state of the \"select all visible\" header control. */\nexport type HeaderSelectionState = \"all\" | \"some\" | \"none\";\n\n/** Options for {@link useSelection}. */\nexport interface UseSelectionOptions<TRow> {\n  /** The currently visible rows. */\n  rows: readonly TRow[];\n  /** Stable id extractor for a row. */\n  getId: (row: TRow) => string;\n  /**\n   * When this value changes, the selection is cleared (the previously\n   * selected ids may no longer be visible). Compose it from search /\n   * page / active-filter count — e.g. `` `${search}|${page}` ``.\n   */\n  resetKey?: unknown;\n  /**\n   * Controlled selection. When provided, the hook reads from this value\n   * and reports every change request through `onSelectionChange` instead\n   * of mutating its own state — the same controlled/uncontrolled split as\n   * `useColumnLayout`.\n   */\n  selectedIds?: readonly string[];\n  /** Change handler; required for the controlled mode to update. */\n  onSelectionChange?: (selectedIds: string[]) => void;\n}\n\n/** Selection state + actions returned by {@link useSelection}. */\nexport interface SelectionState {\n  /** The set of selected ids. */\n  selectedIds: ReadonlySet<string>;\n  /** Number of selected ids. */\n  selectedCount: number;\n  /** Tri-state for the visible rows (`all` / `some` / `none`). */\n  headerState: HeaderSelectionState;\n  /** Whether a specific id is selected. */\n  isSelected: (id: string) => boolean;\n  /** Toggle a single id. */\n  toggle: (id: string) => void;\n  /**\n   * Toggle all leaf ids in a group (select missing, or deselect when all\n   * selected) — one commit so memoized rows see a single selection change.\n   */\n  toggleGroupLeaves: (leafIds: readonly string[]) => void;\n  /** Toggle every visible id (select all, or clear all if already full). */\n  toggleAll: () => void;\n  /** Clear the entire selection. */\n  clear: () => void;\n  /** The visible ids, in row order. */\n  visibleIds: string[];\n  /** True when the user chose \"select all matching\" across every page. */\n  allMatching: boolean;\n  /** Extend the selection to every matching row (across all pages). */\n  selectAllMatching: () => void;\n}\n\n/**\n * Headless multi-row selection. Tracks a set of ids, derives the header\n * tri-state from the visible rows, and clears itself when `resetKey`\n * changes so stale ids never linger after a filter/page change.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseSelectionOptions}.\n * @returns Selection state and actions.\n */\nexport function useSelection<TRow>(\n  options: UseSelectionOptions<TRow>\n): SelectionState {\n  const { rows, getId, resetKey } = options;\n  const controlledValue = options.selectedIds;\n  const onChange = options.onSelectionChange;\n  const [internal, setInternal] = useState<Set<string>>(() => new Set());\n  const [allMatching, setAllMatching] = useState(false);\n  const controlled = controlledValue !== undefined;\n  const selectedIds = useMemo(\n    () => (controlledValue === undefined ? internal : new Set(controlledValue)),\n    [controlledValue, internal]\n  );\n\n  // The mutators below close over `commit`; reading the live mode/state\n  // through this ref keeps their identities PERMANENTLY stable — memoized\n  // adapter rows can hold `toggle` forever without computing from a stale\n  // set in the controlled mode.\n  const modeRef = useRef({ controlled, onChange, selectedIds });\n  modeRef.current = { controlled, onChange, selectedIds };\n\n  /** Route a change to the parent (controlled) or internal state. */\n  const commit = useCallback(\n    (compute: (prev: ReadonlySet<string>) => Set<string>) => {\n      // Any explicit mutation narrows the scope back to concrete ids.\n      setAllMatching(false);\n      const live = modeRef.current;\n      if (live.controlled) {\n        live.onChange?.([...compute(live.selectedIds)]);\n      } else {\n        setInternal((prev) => compute(prev));\n      }\n    },\n    []\n  );\n\n  const selectAllMatching = useCallback(() => setAllMatching(true), []);\n\n  // Clear on reset-key change, but not on first mount. The effect reads the\n  // LATEST size through a ref so only `resetKey` retriggers it. The guard\n  // is last-seen-value, not a boolean first-run flag: refs survive\n  // StrictMode's simulated remount, so a boolean guard saw the doubled\n  // mount effect as a \"change\" and wiped a controlled preselection.\n  const liveRef = useRef({ commit, size: selectedIds.size });\n  liveRef.current = { commit, size: selectedIds.size };\n  const lastResetKeyRef = useRef(resetKey);\n  useEffect(() => {\n    if (Object.is(lastResetKeyRef.current, resetKey)) return;\n    lastResetKeyRef.current = resetKey;\n    // Identity-preserving no-op when there is nothing to clear.\n    if (liveRef.current.size === 0) return;\n    liveRef.current.commit(() => new Set());\n  }, [resetKey]);\n\n  const visibleIds = useMemo(() => rows.map(getId), [rows, getId]);\n\n  const selectedVisible = useMemo(\n    () => visibleIds.reduce((n, id) => (selectedIds.has(id) ? n + 1 : n), 0),\n    [visibleIds, selectedIds]\n  );\n\n  let headerState: HeaderSelectionState = \"none\";\n  if (visibleIds.length > 0 && selectedVisible === visibleIds.length) {\n    headerState = \"all\";\n  } else if (selectedVisible > 0) {\n    headerState = \"some\";\n  }\n\n  const isSelected = useCallback(\n    (id: string) => selectedIds.has(id),\n    [selectedIds]\n  );\n\n  const toggle = useCallback(\n    (id: string) => {\n      commit((prev) => {\n        const next = new Set(prev);\n        if (next.has(id)) next.delete(id);\n        else next.add(id);\n        return next;\n      });\n    },\n    [commit]\n  );\n\n  const toggleGroupLeaves = useCallback(\n    (leafIds: readonly string[]) => {\n      commit((prev) => applyGroupLeafSelection(leafIds, prev));\n    },\n    [commit]\n  );\n\n  const toggleAll = useCallback(() => {\n    commit((prev) => {\n      const next = new Set(prev);\n      const allSelected =\n        visibleIds.length > 0 && visibleIds.every((id) => next.has(id));\n      for (const id of visibleIds) {\n        if (allSelected) next.delete(id);\n        else next.add(id);\n      }\n      return next;\n    });\n  }, [commit, visibleIds]);\n\n  const clear = useCallback(() => commit(() => new Set()), [commit]);\n\n  // Stable identity: row-level React.memo in the adapters depends on the\n  // selection object only changing when the selection actually changes.\n  return useMemo(\n    () => ({\n      selectedIds,\n      selectedCount: selectedIds.size,\n      headerState,\n      isSelected,\n      toggle,\n      toggleGroupLeaves,\n      toggleAll,\n      clear,\n      visibleIds,\n      allMatching,\n      selectAllMatching,\n    }),\n    [\n      selectedIds,\n      headerState,\n      isSelected,\n      toggle,\n      toggleGroupLeaves,\n      toggleAll,\n      clear,\n      visibleIds,\n      allMatching,\n      selectAllMatching,\n    ]\n  );\n}\n","import type { SortLevel } from \"./compare\";\n\n/**\n * Advance the three-step sort cycle for a column header click:\n * inactive → ascending → descending → cleared.\n *\n * @param current - The current sort pair (both fields unset when inactive).\n * @param key - The column key that was clicked.\n * @returns The next sort state.\n */\nexport function nextSort(\n  current: Partial<SortLevel>,\n  key: string\n): Partial<SortLevel> {\n  if (current.key !== key) return { key, dir: \"asc\" };\n  if (current.dir === \"asc\") return { key, dir: \"desc\" };\n  return { key: undefined, dir: undefined };\n}\n","import type { ColumnDef, SortByOption } from \"../types\";\n\n/**\n * Build sort-by select options from sortable columns. On mobile the card\n * layout has no clickable headers, so a \"Sort by\" select is the only sort\n * affordance — adapters fall back to these when the caller passes no explicit\n * `sortByOptions`.\n *\n * A column contributes an option when it is `sortable` and has a string label\n * (its `header`, else `mobileLabel`). Columns with non-string headers and no\n * `mobileLabel` are skipped — there's nothing to show in the select.\n *\n * @typeParam TRow - The row type.\n * @param columns - The columns to derive from (already layout-filtered).\n * @returns One option per labellable sortable column, in column order.\n */\nexport function deriveSortByOptions<TRow>(\n  columns: readonly ColumnDef<TRow>[]\n): SortByOption[] {\n  const options: SortByOption[] = [];\n  for (const column of columns) {\n    if (!column.sortable) continue;\n    let label: string | undefined;\n    if (typeof column.header === \"string\") label = column.header;\n    else if (typeof column.mobileLabel === \"string\") label = column.mobileLabel;\n    if (label !== undefined) options.push({ value: column.key, label });\n  }\n  return options;\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * Any props object a prop-getter can produce or accept for merging.\n *\n * @internal — prop-getter plumbing. Consumers use the prop-getters from\n * `useDataTable`, not this merge helper directly.\n */\nexport type Props = Record<string, unknown>;\n\nfunction isEventHandler(\n  key: string,\n  value: unknown\n): value is (...a: unknown[]) => void {\n  return typeof value === \"function\" && /^on[A-Z]/.test(key);\n}\n\n/**\n * Merge a prop-getter's own props with caller overrides (the\n * Downshift/Radix pattern). Event handlers (`onX`) are composed so both\n * run; `className` strings are concatenated; `style` objects are merged.\n * Everything else is overridden by the caller's value.\n *\n * @param base - The prop-getter's own props.\n * @param overrides - Optional caller-supplied props to merge on top.\n * @returns The merged props object.\n *\n * @internal — prop-getter plumbing. Consumers use the prop-getters from\n * `useDataTable`, not this merge helper directly.\n */\nexport function mergeProps<T extends Props>(base: T, overrides?: Props): T {\n  if (!overrides) return base;\n  const out: Props = { ...base };\n\n  for (const [key, value] of Object.entries(overrides)) {\n    const existing = out[key];\n    if (isEventHandler(key, value) && isEventHandler(key, existing)) {\n      out[key] = (...args: unknown[]) => {\n        existing(...args);\n        value(...args);\n      };\n    } else if (key === \"className\" && existing && value) {\n      out[key] = `${existing as string} ${value as string}`;\n    } else if (key === \"style\" && existing && value) {\n      out[key] = {\n        ...(existing as CSSProperties),\n        ...(value as CSSProperties),\n      };\n    } else {\n      out[key] = value;\n    }\n  }\n\n  return out as T;\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Debounce a rapidly-changing value. The returned value only updates\n * after `delay` ms have elapsed without a new change.\n *\n * @typeParam T - The value type.\n * @param value - The source value.\n * @param delay - Debounce delay in milliseconds. Defaults to 300.\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n  const [debounced, setDebounced] = useState<T>(value);\n\n  useEffect(() => {\n    const id = setTimeout(() => setDebounced(value), delay);\n    return () => clearTimeout(id);\n  }, [value, delay]);\n\n  return debounced;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport { useDebounce } from \"../hooks/useDebounce\";\n\n/** A controlled, debounced search input bound to a committed value. */\nexport interface SearchInputState {\n  /** The live (uncommitted) input value. */\n  value: string;\n  /** Update the live input value. */\n  setValue: (next: string) => void;\n}\n\n/**\n * Bridge a fast-typing search box to a slower committed search value.\n * Local input updates immediately; the trimmed value is flushed to\n * `setSearch` after the debounce, and external `search` changes (back\n * button, deep link, clear-all) mirror back into the input.\n *\n * @param search - The committed search value (from a source).\n * @param setSearch - Commit a new search value.\n * @param debounceMs - Debounce delay; defaults to 300.\n * @returns The controlled input state.\n */\nexport function useSearchInput(\n  search: string,\n  setSearch: (next: string) => void,\n  debounceMs = 300\n): SearchInputState {\n  const [value, setValue] = useState(search);\n  const debounced = useDebounce(value, debounceMs);\n  // The last value we committed, so we can tell our own echo (the committed\n  // value coming back as `search`) from a genuine external change.\n  const committedRef = useRef(search);\n\n  // Mirror only *external* changes (back button, deep link, clear-all) into\n  // the input. Skipping our own echo avoids clobbering in-flight typing:\n  // a keystroke landing between commit and the committed-value re-render\n  // must not be reset to the just-committed string.\n  useEffect(() => {\n    if (search !== committedRef.current) {\n      committedRef.current = search;\n      setValue(search);\n    }\n  }, [search]);\n\n  // Debounced input → commit, skipping when already in sync. Compare against\n  // the last value WE committed (not the live `search`): when an external\n  // change (clear-all, back button) lands while a debounce is still pending,\n  // `search` flips but `debounced` is briefly stale — keying off `search` here\n  // would re-commit that stale value and resurrect the cleared/old search.\n  useEffect(() => {\n    const trimmed = debounced.trim();\n    if (trimmed !== committedRef.current) {\n      committedRef.current = trimmed;\n      setSearch(trimmed);\n    }\n  }, [debounced, setSearch]);\n\n  return { value, setValue };\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { createElement, useCallback, useEffect, useMemo } from \"react\";\n\nimport { columnFlexShares, columnSizeStyle } from \"../columns/columnSizing\";\nimport { resolveColumns } from \"../columns/resolveColumns\";\nimport { visibleColumns } from \"../columns/visibleColumns\";\nimport { SEARCH_DEBOUNCE_MS } from \"../constants\";\nimport {\n  type ActiveFilterChip,\n  type ChipLabelResolver,\n} from \"../filters/useActiveFilterChips\";\nimport { useExtraChips } from \"../filters/useExtraChips\";\nimport { resolveLabels } from \"../labels\";\nimport {\n  computePagination,\n  type PaginationInfo,\n} from \"../pagination/paginationMath\";\nimport { type SelectionState, useSelection } from \"../selection/useSelection\";\nimport { nextSort } from \"../sort/cycleSort\";\nimport { deriveSortByOptions } from \"../sort/sortByOptions\";\nimport type { TableSource } from \"../source/TableSource\";\nimport type {\n  BulkAction,\n  ColumnDef,\n  Direction,\n  SortByOption,\n  SortDirection,\n  TableLabels,\n} from \"../types\";\nimport { devWarn } from \"../utils/devWarn\";\nimport { mergeProps, type Props } from \"../utils/mergeProps\";\nimport { stableKey } from \"../utils/stableKey\";\nimport { useSearchInput } from \"./useSearchInput\";\n\nconst EMPTY_LABELS: Readonly<Record<string, ChipLabelResolver>> = {};\n\n/** Options for {@link useDataTable}. */\nexport interface UseDataTableOptions<TRow> {\n  /** The data + state contract, from `useFrontendData` / `useQuerySource`. */\n  source: TableSource<TRow>;\n  /** Column definitions. */\n  columns: ColumnDef<TRow>[];\n  /**\n   * Make the columns share the container's width instead of overflowing it.\n   * Columns with `flex` take that share; columns with a `width` keep it.\n   */\n  fitColumns?: boolean;\n  /** User widths from the column layout, which win over everything else. */\n  columnWidths?: Readonly<Record<string, number>>;\n  /** Stable React key extractor for a row. */\n  rowKey: (row: TRow) => string;\n  /** Accessible label for the table element. */\n  tableLabel?: string;\n  /** Pre-translated label overrides (merged over English defaults). */\n  labels?: TableLabels;\n  /** Text direction. Defaults to `\"ltr\"`. */\n  dir?: Direction;\n  /** Render the mobile (card) layout. Defaults to `false`. */\n  forceMobile?: boolean;\n  /**\n   * Active locale — drives per-column `i18n` data-path resolution for\n   * bare-key columns, exactly as it does under `<DataTable>`.\n   */\n  locale?: string;\n  /** Number of leading desktop-visible columns always shown on mobile cards. */\n  mobileIdentityColumns?: number;\n  /** Search debounce in ms. Defaults to 300. */\n  searchDebounceMs?: number;\n  /** Bulk actions — enabling these turns on selection. */\n  bulkActions?: BulkAction[];\n  /** Selection id extractor; defaults to `rowKey` when bulk actions exist. */\n  selectionGetId?: (row: TRow) => string;\n  /** Controlled selection value (see {@link BaseDataTableProps.selectedIds}). */\n  selectedIds?: readonly string[];\n  /** Change handler for the controlled selection. */\n  onSelectedIdsChange?: (selectedIds: string[]) => void;\n  /** Per-filter-key chip label resolvers (drives the chip strip). */\n  filterLabels?: Readonly<Record<string, ChipLabelResolver>>;\n  /** Enable shift-click multi-column sorting (see BaseDataTableProps). */\n  multiSort?: boolean;\n}\n\n/** Everything a headless consumer needs to render a table. */\nexport interface UseDataTableResult<TRow> {\n  /** The materialised rows for the current slice. */\n  rows: readonly TRow[];\n  /** Whether there are no rows and nothing is loading. */\n  isEmpty: boolean;\n  /** Columns visible for the current layout. */\n  columns: ColumnDef<TRow>[];\n  /** Whether the mobile (card) layout is active. */\n  isMobile: boolean;\n  /**\n   * Sort-by select options auto-derived from the sortable columns. Adapters\n   * render these as the mobile sort affordance (no clickable headers there)\n   * when the caller passes no explicit `sortByOptions`.\n   */\n  sortByOptions: SortByOption[];\n  /** Resolved labels (English defaults + overrides). */\n  labels: Required<TableLabels>;\n  /** Text direction. */\n  dir: Direction;\n  /** Derived pagination figures. */\n  pagination: PaginationInfo;\n  /** Active sort column key. */\n  sortBy: string | undefined;\n  /** Active sort direction. */\n  sortDir: SortDirection | undefined;\n  /** Advance the sort cycle for a column. */\n  toggleSort: (key: string) => void;\n  /** The controlled search input value. */\n  searchValue: string;\n  /** Update the search input value. */\n  setSearchValue: (next: string) => void;\n  /** Selection state, or `null` when no bulk actions are configured. */\n  selection: SelectionState | null;\n  /** Removable filter chips derived from `filterLabels` + the source. */\n  filterChips: ActiveFilterChip[];\n  /** Number of active filter chips (drives the Filters badge). */\n  activeFilterCount: number;\n  /** The underlying source (for pagination setters, fetchNextPage, etc.). */\n  source: TableSource<TRow>;\n\n  /* ── Prop-getters (merge caller overrides) ───────────────────────── */\n  getTableProps: (props?: Props) => TableElementProps;\n  getHeaderRowProps: (props?: Props) => Props;\n  getHeaderCellProps: (\n    column: ColumnDef<TRow>,\n    props?: Props\n  ) => CellElementProps;\n  getSortButtonProps: (\n    column: ColumnDef<TRow>,\n    props?: Props\n  ) => SortButtonElementProps;\n  getRowProps: (row: TRow, index: number, props?: Props) => RowElementProps;\n  getCellProps: (column: ColumnDef<TRow>, props?: Props) => CellElementProps;\n  getSearchInputProps: (props?: Props) => SearchInputElementProps;\n  /**\n   * The row's stable React key. Kept OUT of {@link getRowProps} so its\n   * result spreads clean — React forbids spreading a `key`.\n   */\n  getRowKey: (row: TRow) => string;\n  /**\n   * A cell's rendered content: the column's `Cell` component when set,\n   * else its (resolved) `accessor` value — no optional chaining needed.\n   */\n  getCellContent: (\n    column: ColumnDef<TRow>,\n    row: TRow,\n    rowIndex: number\n  ) => ReactNode;\n}\n\n/* Precise prop-getter return shapes. Each extends `Props` (keeping the\n   index signature so caller overrides still merge and `mergeProps` stays\n   compatible) while typing the known keys — so adapters read them without\n   casts. */\n\n/** Props from {@link UseDataTableResult.getTableProps}. */\nexport interface TableElementProps extends Props {\n  role: string;\n  dir?: Direction;\n  \"aria-label\": string;\n}\n\n/**\n * Props from {@link UseDataTableResult.getRowProps}. Spread-clean by\n * contract: never contains `key` — read {@link UseDataTableResult.getRowKey}\n * for the React key.\n */\nexport interface RowElementProps extends Props {\n  role: string;\n  /** The structural part name every kit's body row carries. */\n  \"data-adapttable-part\": \"row\";\n  /** The row's id, so an event can be traced back to the row it happened in. */\n  \"data-row-id\": string;\n  \"data-index\": number;\n  \"aria-selected\"?: boolean;\n}\n\n/** Props from {@link UseDataTableResult.getSortButtonProps}. */\nexport interface SortButtonElementProps extends Props {\n  type: \"button\";\n  disabled: boolean;\n  onClick: (event?: { shiftKey?: boolean }) => void;\n  \"data-sort-index\"?: number;\n  \"aria-label\": string;\n}\n\n/** Props from {@link UseDataTableResult.getCellProps} / `getHeaderCellProps`. */\nexport interface CellElementProps extends Props {\n  role: string;\n  style?: CSSProperties;\n  \"data-sort-index\"?: number;\n}\n\n/** Props from {@link UseDataTableResult.getSearchInputProps}. */\nexport interface SearchInputElementProps extends Props {\n  type: string;\n  role: string;\n  value: string;\n  placeholder: string;\n  \"aria-label\": string;\n  onChange: (event: { currentTarget: { value: string } }) => void;\n}\n\nfunction textAlign(\n  align: ColumnDef<TRowAny>[\"align\"]\n): \"start\" | \"center\" | \"end\" {\n  if (align === \"center\") return \"center\";\n  if (align === \"end\") return \"end\";\n  return \"start\";\n}\n\n/** The chain level for a column, if multi-sort has one. */\nfunction chainLevel(\n  levels: readonly { key: string; dir: \"asc\" | \"desc\" }[],\n  key: string\n): { key: string; dir: \"asc\" | \"desc\" } | undefined {\n  return levels.find((l) => l.key === key);\n}\n\n/** 1-based chain position for the header badge, or undefined. */\nfunction sortIndexAttr(\n  levels: readonly { key: string; dir: \"asc\" | \"desc\" }[],\n  key: string\n): number | undefined {\n  const index = levels.findIndex((l) => l.key === key);\n  return index === -1 ? undefined : index + 1;\n}\n\nfunction ariaSort<TRow>(\n  column: ColumnDef<TRow>,\n  sortBy: string | undefined,\n  sortDir: SortDirection | undefined\n): \"ascending\" | \"descending\" | \"none\" | undefined {\n  if (!column.sortable) return undefined;\n  if (sortBy !== column.key) return \"none\";\n  return sortDir === \"asc\" ? \"ascending\" : \"descending\";\n}\n\n/** A row type we don't care about here — `align` is independent of it. */\ntype TRowAny = Record<string, unknown>;\n\n/**\n * The headless entry point. Combines a {@link TableSource} with columns,\n * sorting, a debounced search input, selection, and filter chips, and\n * returns derived state plus accessible prop-getters so consumers can\n * render any markup with any UI kit.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseDataTableOptions}.\n * @returns Derived state and prop-getters — see {@link UseDataTableResult}.\n */\nexport function useDataTable<TRow>(\n  options: UseDataTableOptions<TRow>\n): UseDataTableResult<TRow> {\n  const {\n    source,\n    columns: declaredColumns,\n    rowKey,\n    tableLabel,\n    labels: labelOverrides,\n    dir = \"ltr\",\n    forceMobile: isMobile = false,\n    mobileIdentityColumns = 3,\n    searchDebounceMs = SEARCH_DEBOUNCE_MS,\n    bulkActions,\n    selectionGetId,\n    selectedIds,\n    onSelectedIdsChange,\n    filterLabels = EMPTY_LABELS,\n    multiSort = false,\n    locale,\n    fitColumns = false,\n    columnWidths,\n  } = options;\n\n  const labels = useMemo(() => resolveLabels(labelOverrides), [labelOverrides]);\n\n  // Bare-key columns auto-derive their header and accessor here, exactly\n  // as they do under `<DataTable>` — headless callers get real headers and\n  // cells, not blanks. Idempotent: already-complete columns pass through.\n  const allColumns = useMemo(\n    () => resolveColumns(declaredColumns, locale),\n    [declaredColumns, locale]\n  );\n\n  // Duplicate keys silently corrupt sorting, selection, and column layout —\n  // every feature targets columns by key. Catch it in development.\n  useEffect(() => {\n    const seen = new Set<string>();\n    for (const column of allColumns) {\n      if (seen.has(column.key)) {\n        devWarn(\n          `duplicate column key \"${column.key}\" — column keys must be unique; sorting, selection, and column layout all target keys.`\n        );\n      }\n      seen.add(column.key);\n    }\n  }, [allColumns]);\n\n  const columns = useMemo(\n    () =>\n      visibleColumns(\n        allColumns,\n        isMobile ? \"mobile\" : \"desktop\",\n        mobileIdentityColumns\n      ),\n    [allColumns, isMobile, mobileIdentityColumns]\n  );\n\n  // Each flexible column's share of the leftover width, recomputed only when\n  // the column set or the user's widths change.\n  const flexShares = useMemo(\n    () => columnFlexShares({ columns, fitColumns, widths: columnWidths }),\n    [columns, fitColumns, columnWidths]\n  );\n\n  const sortByOptions = useMemo(() => deriveSortByOptions(columns), [columns]);\n\n  const { value: searchValue, setValue: setSearchValue } = useSearchInput(\n    source.search,\n    source.setSearch,\n    searchDebounceMs\n  );\n\n  const filterChips = useExtraChips({\n    extra: source.extra,\n    setExtra: source.setExtra,\n    labels: filterLabels,\n  });\n  const activeFilterCount = filterChips.length;\n\n  const pagination = useMemo(\n    () =>\n      computePagination({\n        page: source.page,\n        limit: source.limit,\n        total: source.total,\n      }),\n    [source.page, source.limit, source.total]\n  );\n\n  const hasBulk = (bulkActions?.length ?? 0) > 0;\n  const getId = selectionGetId ?? rowKey;\n  // Selection is keyed by id, so it persists across page / sort / page-size\n  // changes (the rows still exist); it only resets when the result *set*\n  // changes — i.e. a new search term or a filter change. Keyed on the filter\n  // *values* (not just the active count) so swapping one filter value for\n  // another — same count, different rows — still clears the stale selection.\n  const selectionResetKey = `${source.search}|${stableKey(source.extra)}|${source.groupBy ?? \"\"}`;\n  const selectionState = useSelection<TRow>({\n    rows: source.rows,\n    getId,\n    resetKey: selectionResetKey,\n    selectedIds,\n    onSelectionChange: onSelectedIdsChange,\n  });\n  const selection = hasBulk ? selectionState : null;\n\n  const toggleSort = useCallback(\n    (key: string) => {\n      const next = nextSort({ key: source.sortBy, dir: source.sortDir }, key);\n      source.setSort(next.key, next.dir);\n    },\n    [source]\n  );\n\n  const getTableProps = useCallback(\n    (props?: Props) =>\n      mergeProps(\n        { role: \"table\", dir, \"aria-label\": tableLabel ?? labels.table },\n        props\n      ),\n    [dir, tableLabel, labels.table]\n  );\n\n  const getHeaderRowProps = useCallback(\n    (props?: Props) => mergeProps({ role: \"row\" }, props),\n    []\n  );\n\n  const getHeaderCellProps = useCallback(\n    (column: ColumnDef<TRow>, props?: Props) =>\n      mergeProps(\n        {\n          role: \"columnheader\",\n          \"aria-sort\": ariaSort(\n            column,\n            chainLevel(source.sortLevels, column.key)?.key ?? source.sortBy,\n            chainLevel(source.sortLevels, column.key)?.dir ?? source.sortDir\n          ),\n          \"data-sort-index\": sortIndexAttr(source.sortLevels, column.key),\n          \"data-column-key\": column.key,\n          style: {\n            textAlign: textAlign(column.align),\n            ...columnSizeStyle(column, flexShares, columnWidths?.[column.key]),\n          },\n        },\n        props\n      ),\n    [source.sortBy, source.sortDir, source.sortLevels, flexShares, columnWidths]\n  );\n\n  const getSortButtonProps = useCallback(\n    (column: ColumnDef<TRow>, props?: Props) =>\n      mergeProps<SortButtonElementProps>(\n        {\n          type: \"button\",\n          disabled: !column.sortable,\n          onClick: (event?: { shiftKey?: boolean }) => {\n            if (!column.sortable) return;\n            if (multiSort && event?.shiftKey) {\n              source.toggleSortLevel(column.key);\n              return;\n            }\n            toggleSort(column.key);\n          },\n          \"data-sort-index\": sortIndexAttr(source.sortLevels, column.key),\n          \"aria-label\": `${labels.sortBy}: ${\n            typeof column.header === \"string\" ? column.header : column.key\n          }`,\n        },\n        props\n      ),\n    [toggleSort, labels.sortBy, multiSort, source]\n  );\n\n  // Spread-clean by contract: no `key` in here — React forbids spreading\n  // one, and every consumer had to destructure-and-cast it out. The key\n  // lives in `getRowKey` instead.\n  const getRowProps = useCallback(\n    (row: TRow, index: number, props?: Props) => {\n      const id = getId(row);\n      const selected = selection?.isSelected(id) ?? false;\n      return mergeProps<RowElementProps>(\n        {\n          role: \"row\",\n          // The part name a host styles and tests against, emitted here so\n          // one spread names the row in every kit that renders one.\n          \"data-adapttable-part\": \"row\",\n          // The id an event can be traced back to. It lives here because\n          // this is the row's prop-getter — antd, whose <Table> builds its\n          // own <tr>, carries both through `onRow` instead.\n          \"data-row-id\": id,\n          \"data-index\": index,\n          \"aria-selected\": hasBulk ? selected : undefined,\n        },\n        props\n      );\n    },\n    [getId, selection, hasBulk]\n  );\n\n  const getCellContent = useCallback(\n    (column: ColumnDef<TRow>, row: TRow, rowIndex: number): ReactNode =>\n      column.Cell\n        ? createElement(column.Cell, { row, rowIndex })\n        : (column.accessor?.(row) ?? null),\n    []\n  );\n\n  const getCellProps = useCallback(\n    (column: ColumnDef<TRow>, props?: Props) =>\n      mergeProps(\n        {\n          role: \"cell\",\n          // Which column this cell belongs to, so auto-sizing can measure a\n          // column's content and CSS can target one column across any kit.\n          \"data-column-key\": column.key,\n          style: {\n            textAlign: textAlign(column.align),\n            ...columnSizeStyle(column, flexShares, columnWidths?.[column.key]),\n          },\n        },\n        props\n      ),\n    [flexShares, columnWidths]\n  );\n\n  const getSearchInputProps = useCallback(\n    (props?: Props) =>\n      mergeProps(\n        {\n          type: \"search\",\n          role: \"searchbox\",\n          value: searchValue,\n          placeholder: labels.searchPlaceholder,\n          \"aria-label\": labels.search,\n          onChange: (event: { currentTarget: { value: string } }) =>\n            setSearchValue(event.currentTarget.value),\n        },\n        props\n      ),\n    [searchValue, setSearchValue, labels.searchPlaceholder, labels.search]\n  );\n\n  return {\n    rows: source.rows,\n    isEmpty: source.rows.length === 0 && !source.isLoading,\n    columns,\n    isMobile,\n    sortByOptions,\n    labels,\n    dir,\n    pagination,\n    sortBy: source.sortBy,\n    sortDir: source.sortDir,\n    toggleSort,\n    searchValue,\n    setSearchValue,\n    selection,\n    filterChips,\n    activeFilterCount,\n    source,\n    getTableProps,\n    getHeaderRowProps,\n    getHeaderCellProps,\n    getSortButtonProps,\n    getRowProps,\n    getCellProps,\n    getSearchInputProps,\n    getRowKey: rowKey,\n    getCellContent,\n  };\n}\n\nexport { defaultLabels } from \"../labels\";\n","/**\n * Measuring a row that carries an expanded detail panel beneath it.\n *\n * A virtualizer sizes one item by measuring one element. A row with an open\n * detail panel is two elements — a table cannot nest the panel inside the row\n * it belongs to, because a `<tr>` may only contain cells — so measuring the row\n * alone reports 56px for something 300px tall. Scroll positions then drift as\n * soon as anything is expanded, which is the whole reason row detail carried a\n * \"not recommended with virtualize\" warning.\n *\n * So the pair is measured as a pair: both elements are observed, and their\n * combined height is handed to the virtualizer through `resizeItem`. The\n * virtualizer keeps owning the layout; it is simply told the truth about how\n * tall the item is.\n */\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\n\n/** What a virtualizer must offer for a pair to be measurable. */\nexport interface ResizableVirtualizer {\n  /** Tell the virtualizer an item's real size. */\n  resizeItem: (index: number, size: number) => void;\n}\n\n/** Ref callbacks for the two halves of one row. */\nexport interface RowPairMeasurer {\n  /** Ref for the row element itself. */\n  row: (index: number) => (node: Element | null) => void;\n  /** Ref for its detail element, when one is open. */\n  detail: (index: number) => (node: Element | null) => void;\n}\n\n/** The two elements of one item, either of which may be absent. */\ninterface Pair {\n  row: Element | null;\n  detail: Element | null;\n}\n\n/**\n * Measure each row together with its open detail panel.\n *\n * Sizes are reported on every resize of either half, so a detail panel that\n * grows — an image loading, a nested table expanding — corrects the item's\n * height rather than leaving the scrollbar wrong until the next scroll.\n *\n * @param virtualizer - The virtualizer to report sizes to.\n * @param enabled - Off when nothing is virtualized or nothing can expand, in\n *   which case the returned refs do nothing at all.\n * @returns Ref callbacks for a row and its detail.\n */\nexport function useRowPairMeasurer(\n  virtualizer: ResizableVirtualizer | undefined,\n  enabled: boolean\n): RowPairMeasurer {\n  const pairs = useRef(new Map<number, Pair>());\n  const observer = useRef<ResizeObserver | null>(null);\n  const owners = useRef(new Map<Element, number>());\n\n  const report = useCallback(\n    (index: number) => {\n      if (!virtualizer) return;\n      const pair = pairs.current.get(index);\n      if (!pair?.row) return;\n      const rowHeight = pair.row.getBoundingClientRect().height;\n      const detailHeight = pair.detail?.getBoundingClientRect().height ?? 0;\n      const total = rowHeight + detailHeight;\n      if (total > 0) virtualizer.resizeItem(index, total);\n    },\n    [virtualizer]\n  );\n\n  useEffect(() => {\n    if (!enabled || typeof ResizeObserver === \"undefined\") return undefined;\n    const seen = owners.current;\n    const instance = new ResizeObserver((entries) => {\n      const touched = new Set<number>();\n      for (const entry of entries) {\n        const index = seen.get(entry.target);\n        if (index !== undefined) touched.add(index);\n      }\n      for (const index of touched) report(index);\n    });\n    observer.current = instance;\n    // Refs run during commit and effects after it, so by the time the observer\n    // exists the first rows are already attached. Pick them up rather than\n    // waiting for a re-render that may never come.\n    for (const element of seen.keys()) instance.observe(element);\n    return () => {\n      instance.disconnect();\n      observer.current = null;\n    };\n  }, [enabled, report]);\n\n  const attach = useCallback(\n    (index: number, half: keyof Pair) => (node: Element | null) => {\n      if (!enabled) return;\n      const pair = pairs.current.get(index) ?? { row: null, detail: null };\n      const previous = pair[half];\n      if (previous && previous !== node) {\n        observer.current?.unobserve(previous);\n        owners.current.delete(previous);\n      }\n      pair[half] = node;\n      pairs.current.set(index, pair);\n      if (node) {\n        owners.current.set(node, index);\n        observer.current?.observe(node);\n      }\n      // Report straight away: the first paint is when a wrong height is most\n      // visible, and waiting for a resize would mean waiting for a change that\n      // may never come.\n      report(index);\n    },\n    [enabled, report]\n  );\n\n  return useMemo(\n    () => ({\n      row: (index: number) => attach(index, \"row\"),\n      detail: (index: number) => attach(index, \"detail\"),\n    }),\n    [attach]\n  );\n}\n","import {\n  useVirtualizer,\n  useWindowVirtualizer,\n  type VirtualItem,\n} from \"@tanstack/react-virtual\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\n\nimport { VIRTUAL_OVERSCAN } from \"../constants\";\nimport { type RowPairMeasurer, useRowPairMeasurer } from \"./measureRowPair\";\n\n/** One row/card entry materialized from a virtual window. */\nexport interface VirtualTableRow<TRow> {\n  /** Row data for this visual slot. */\n  row: TRow;\n  /**\n   * Index in the array the virtualizer windows. When pinning is on that is\n   * the unpinned scroll list, not the page — use {@link rowSourceIndex}\n   * for ARIA, focus and `rowClassName`.\n   */\n  index: number;\n  /**\n   * Index in the page's full row list. Equals {@link VirtualTableRow.index}\n   * unless pinned rows were pulled out of the window.\n   */\n  sourceIndex?: number;\n  /** Stable key resolved from the caller's rowKey. */\n  key: string;\n  /** Virtualizer item metadata; absent when virtualization is disabled. */\n  virtualItem?: VirtualItem;\n}\n\n/** Wrap a constant estimate so both virtualizer modes share one shape. */\nfunction asSizeEstimator(\n  estimateSize: number | ((index: number) => number)\n): (index: number) => number {\n  return typeof estimateSize === \"function\" ? estimateSize : () => estimateSize;\n}\n\n/** Dataset index for ARIA / focus — the window index when pinning is off. */\nexport function rowSourceIndex(\n  entry: Pick<VirtualTableRow<unknown>, \"index\" | \"sourceIndex\">\n): number {\n  return entry.sourceIndex ?? entry.index;\n}\n\n/** Result consumed by adapters that opt into virtualized rendering. */\nexport interface TableVirtualization<TRow> {\n  /** Whether the returned rows represent a virtual window. */\n  enabled: boolean;\n  /** Rows to render: either every source row or only the virtual slice. */\n  rows: readonly VirtualTableRow<TRow>[];\n  /** Spacer before the rendered slice. */\n  paddingTop: number;\n  /** Spacer after the rendered slice. */\n  paddingBottom: number;\n  /** Element measurement callback for virtualized rows/cards. */\n  measureElement?: (node: Element | null) => void;\n  /**\n   * Measure a row TOGETHER with its open detail panel.\n   *\n   * A table cannot nest a detail panel inside the row it belongs to, so the\n   * two are separate elements and the virtualizer would size the item from the\n   * row alone. These refs report the pair's real height instead — which is\n   * what lets row detail and virtualization be used together at all.\n   */\n  measureRowPair?: RowPairMeasurer;\n}\n\n/** Options for {@link useTableVirtualization}. */\nexport interface UseTableVirtualizationOptions<TRow> {\n  /** Source rows from the table source. */\n  rows: readonly TRow[];\n  /** Stable row key resolver. */\n  rowKey: (row: TRow) => string;\n  /** Master switch; adapters keep this optional. */\n  enabled?: boolean;\n  /** Estimated row/card size in px, or a per-index reader. */\n  estimateSize?: number | ((index: number) => number);\n  /** Extra items rendered before/after the visible window. */\n  overscan?: number;\n  /** Window virtualizer scroll margin, usually sticky header height. */\n  scrollMargin?: number;\n  /**\n   * Scroll container accessor. When provided, the virtual window tracks\n   * THIS element's scrolling (a `maxHeight` box) instead of the page —\n   * that's how `virtualize` + `maxHeight` compose.\n   */\n  getScrollElement?: () => Element | null;\n  /** Called when the virtual window reaches the last source row. */\n  onEndReached?: () => void;\n  /**\n   * Whether rows can expand. With detail panels in play the window measures\n   * each row together with its panel; without them the extra observers would\n   * be pure cost.\n   */\n  expandable?: boolean;\n}\n\n/** Resolve either virtual entries or the full source rows into render entries. */\nexport function resolveVirtualRows<TRow>(\n  rows: readonly TRow[],\n  rowKey: (row: TRow) => string,\n  rowEntries?: readonly VirtualTableRow<TRow>[]\n): readonly VirtualTableRow<TRow>[] {\n  return (\n    rowEntries ??\n    rows.map((row, index) => ({\n      row,\n      index,\n      key: rowKey(row),\n    }))\n  );\n}\n\n/** Column span for spacer/detail/summary cells in table-based adapters. */\nexport function virtualColumnSpan(\n  columnCount: number,\n  hasSelection: boolean,\n  hasActions: boolean,\n  hasExpansion = false,\n  hasReorder = false\n): number {\n  return (\n    columnCount +\n    (hasSelection ? 1 : 0) +\n    (hasActions ? 1 : 0) +\n    (hasExpansion ? 1 : 0) +\n    (hasReorder ? 1 : 0)\n  );\n}\n\n/**\n * Headless window virtualization for adapter tables. When disabled, it returns\n * every row and no spacer/measurement data, so adapters can use the same render\n * path for virtual and non-virtual tables.\n */\nexport function useTableVirtualization<TRow>({\n  rows,\n  rowKey,\n  enabled = false,\n  estimateSize = 56,\n  overscan = VIRTUAL_OVERSCAN,\n  scrollMargin = 0,\n  getScrollElement,\n  onEndReached,\n  expandable = false,\n}: UseTableVirtualizationOptions<TRow>): TableVirtualization<TRow> {\n  const elementMode = getScrollElement !== undefined;\n  // Stable identity, re-keyed ONLY when the data changes: the virtualizer\n  // memoises its measurements on `getItemKey`, so an inline closure (or the\n  // routinely-inline `rowKey` prop) invalidated the cache every render — a\n  // full O(n) rebuild with n rowKey calls per keystroke at 10k rows. The\n  // extractor reads through a ref (ids for the same row are stable by\n  // contract), so only a new `rows` array re-keys.\n  const rowKeyRef = useRef(rowKey);\n  rowKeyRef.current = rowKey;\n  const getItemKey = useCallback(\n    (index: number): string => {\n      const row = rows[index];\n      return row === undefined ? String(index) : rowKeyRef.current(row);\n    },\n    [rows]\n  );\n  // Both hooks must run unconditionally (rules of hooks); exactly one is\n  // enabled. Window mode tracks the page; element mode tracks the box.\n  const windowVirtualizer = useWindowVirtualizer({\n    count: rows.length,\n    enabled: enabled && !elementMode,\n    estimateSize: asSizeEstimator(estimateSize),\n    getItemKey,\n    overscan,\n    scrollMargin,\n  });\n  const elementVirtualizer = useVirtualizer({\n    count: rows.length,\n    enabled: enabled && elementMode,\n    getScrollElement: getScrollElement ?? (() => null),\n    estimateSize: asSizeEstimator(estimateSize),\n    getItemKey,\n    overscan,\n  });\n  const virtualizer = elementMode ? elementVirtualizer : windowVirtualizer;\n\n  const virtualItems = virtualizer.getVirtualItems();\n  const active = enabled && virtualItems.length > 0;\n  const measureRowPair = useRowPairMeasurer(virtualizer, enabled && expandable);\n  const materializedRows = useMemo<readonly VirtualTableRow<TRow>[]>(() => {\n    if (!active) {\n      return rows.map((row, index) => ({\n        row,\n        index,\n        key: rowKey(row),\n      }));\n    }\n    return virtualItems.flatMap((virtualItem) => {\n      const row = rows[virtualItem.index];\n      if (row === undefined) return [];\n      return [\n        {\n          row,\n          index: virtualItem.index,\n          key: rowKey(row),\n          virtualItem,\n        },\n      ];\n    });\n  }, [active, rowKey, rows, virtualItems]);\n\n  // `virtualItems` is a fresh array every render, so a naive effect would call\n  // `onEndReached` on every render while the last row stays in view. Notify at\n  // most once per row count: re-arm only when more rows actually load (the\n  // count grows) or the user scrolls back off the end.\n  const notifiedAtCount = useRef(-1);\n  useEffect(() => {\n    if (!active || rows.length === 0) return;\n    const last = virtualItems.at(-1);\n    const atEnd = last !== undefined && last.index >= rows.length - 1;\n    if (!atEnd) {\n      notifiedAtCount.current = -1;\n      return;\n    }\n    if (notifiedAtCount.current !== rows.length) {\n      notifiedAtCount.current = rows.length;\n      onEndReached?.();\n    }\n  }, [active, onEndReached, rows.length, virtualItems]);\n\n  if (!active) {\n    return {\n      enabled: false,\n      rows: materializedRows,\n      paddingTop: 0,\n      paddingBottom: 0,\n    };\n  }\n\n  // `active` guarantees a non-empty window, so the edges always exist.\n  const first = virtualItems[0]!;\n  const last = virtualItems.at(-1)!;\n  const resolvedScrollMargin = virtualizer.options.scrollMargin ?? 0;\n  const paddingTop = first.start - resolvedScrollMargin;\n  const paddingBottom =\n    virtualizer.getTotalSize() - (last.end - resolvedScrollMargin);\n\n  return {\n    enabled: true,\n    rows: materializedRows,\n    paddingTop: Math.max(0, paddingTop),\n    paddingBottom: Math.max(0, paddingBottom),\n    // A row that can expand is measured as a PAIR; one that cannot keeps the\n    // virtualizer's own element measurement, which is cheaper.\n    measureElement: expandable ? undefined : virtualizer.measureElement,\n    measureRowPair: expandable ? measureRowPair : undefined,\n  };\n}\n\n/** Result of {@link useKeyedVirtualization} — index window over a keyed list. */\nexport interface KeyedVirtualization {\n  enabled: boolean;\n  /** Source indices in the virtual window (or every index when disabled). */\n  indices: readonly number[];\n  paddingTop: number;\n  paddingBottom: number;\n  measureElement?: (node: Element | null) => void;\n}\n\n/**\n * Virtualize an opaque keyed list (e.g. grouped flat entries). Same window /\n * element modes as {@link useTableVirtualization}.\n */\nexport function useKeyedVirtualization(options: {\n  keys: readonly string[];\n  enabled?: boolean;\n  estimateSize?: number | ((index: number) => number);\n  overscan?: number;\n  scrollMargin?: number;\n  getScrollElement?: () => Element | null;\n  onEndReached?: () => void;\n}): KeyedVirtualization {\n  const {\n    keys,\n    enabled = false,\n    estimateSize = 56,\n    overscan = VIRTUAL_OVERSCAN,\n    scrollMargin = 0,\n    getScrollElement,\n    onEndReached,\n  } = options;\n  const elementMode = getScrollElement !== undefined;\n  const getItemKey = (index: number): string => keys[index] ?? String(index);\n  const sizeOf = asSizeEstimator(estimateSize);\n  const windowVirtualizer = useWindowVirtualizer({\n    count: keys.length,\n    enabled: enabled && !elementMode,\n    estimateSize: sizeOf,\n    getItemKey,\n    overscan,\n    scrollMargin,\n  });\n  const elementVirtualizer = useVirtualizer({\n    count: keys.length,\n    enabled: enabled && elementMode,\n    getScrollElement: getScrollElement ?? (() => null),\n    estimateSize: sizeOf,\n    getItemKey,\n    overscan,\n  });\n  const virtualizer = elementMode ? elementVirtualizer : windowVirtualizer;\n  const virtualItems = virtualizer.getVirtualItems();\n  const active = enabled && virtualItems.length > 0;\n\n  const indices = useMemo<readonly number[]>(() => {\n    if (!active) return keys.map((_, index) => index);\n    return virtualItems.map((item) => item.index);\n  }, [active, keys, virtualItems]);\n\n  const notifiedAtCount = useRef(-1);\n  useEffect(() => {\n    if (!active || keys.length === 0) return;\n    const last = virtualItems.at(-1);\n    const atEnd = last !== undefined && last.index >= keys.length - 1;\n    if (!atEnd) {\n      notifiedAtCount.current = -1;\n      return;\n    }\n    if (notifiedAtCount.current !== keys.length) {\n      notifiedAtCount.current = keys.length;\n      onEndReached?.();\n    }\n  }, [active, onEndReached, keys.length, virtualItems]);\n\n  if (!active) {\n    return { enabled: false, indices, paddingTop: 0, paddingBottom: 0 };\n  }\n\n  const first = virtualItems[0]!;\n  const last = virtualItems.at(-1)!;\n  const resolvedScrollMargin = virtualizer.options.scrollMargin ?? 0;\n  const paddingTop = first.start - resolvedScrollMargin;\n  const paddingBottom =\n    virtualizer.getTotalSize() - (last.end - resolvedScrollMargin);\n\n  return {\n    enabled: true,\n    indices,\n    paddingTop: Math.max(0, paddingTop),\n    paddingBottom: Math.max(0, paddingBottom),\n    measureElement: virtualizer.measureElement,\n  };\n}\n\n/** Slice a flat grouped model to the virtual window indices. */\nexport function windowGroupedEntries<TEntry>(\n  entries: readonly TEntry[],\n  indices: readonly number[]\n): readonly TEntry[] {\n  if (indices.length === entries.length) return entries;\n  return indices.flatMap((index) => {\n    const entry = entries[index];\n    return entry === undefined ? [] : [entry];\n  });\n}\n","import type { RefObject } from \"react\";\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\";\n\n/**\n * Document Y of an element — what TanStack's window virtualizer wants as\n * `scrollMargin` so a list that is not at y=0 does not treat the page chrome\n * above it as already-scrolled rows.\n */\nexport function documentOffsetTop(el: Element): number {\n  return Math.max(\n    0,\n    Math.round(el.getBoundingClientRect().top + window.scrollY)\n  );\n}\n\nconst LIST_SELECTOR =\n  '[data-adapttable-part=\"tbody\"], [data-adapttable-part=\"cards\"]';\n\n/** The virtualized list node inside a table root, or the root itself. */\nexport function virtualListElement(root: Element | null): Element | null {\n  if (!root) return null;\n  return root.querySelector(LIST_SELECTOR) ?? root;\n}\n\n/** TanStack window `scrollMargin` for a mounted table root or scroll box. */\nexport function measureWindowScrollMargin(root: Element | null): number {\n  const list = virtualListElement(root);\n  return list === null ? 0 : documentOffsetTop(list);\n}\n\n/**\n * Keep the window virtualizer's scroll margin equal to the list's document\n * offset. Call {@link UseMeasuredWindowScrollMargin.observe} with the desktop\n * scroll-box (or any ancestor of `tbody` / `cards`); the table root is a\n * fallback so mobile cards, which never attach that box, still measure.\n */\nexport function useMeasuredWindowScrollMargin(\n  enabled: boolean,\n  fallbackRoot?: RefObject<Element | null>\n): {\n  scrollMargin: number;\n  observe: (node: HTMLElement | null) => void;\n} {\n  const [scrollMargin, setScrollMargin] = useState(0);\n  const nodeRef = useRef<HTMLElement | null>(null);\n\n  const read = useCallback(() => {\n    if (!enabled) return;\n    const next = measureWindowScrollMargin(\n      nodeRef.current ?? fallbackRoot?.current ?? null\n    );\n    setScrollMargin((prev) => (prev === next ? prev : next));\n  }, [enabled, fallbackRoot]);\n\n  const observe = useCallback(\n    (node: HTMLElement | null) => {\n      nodeRef.current = node;\n      if (!enabled) return;\n      if (node === null) {\n        setScrollMargin(0);\n        return;\n      }\n      read();\n    },\n    [enabled, read]\n  );\n\n  useLayoutEffect(() => {\n    if (!enabled) {\n      setScrollMargin(0);\n      return;\n    }\n    read();\n    if (typeof ResizeObserver === \"undefined\") return;\n    const ro = new ResizeObserver(read);\n    const observed = nodeRef.current ?? fallbackRoot?.current;\n    if (observed) ro.observe(observed);\n    ro.observe(document.documentElement);\n    window.addEventListener(\"resize\", read);\n    return () => {\n      ro.disconnect();\n      window.removeEventListener(\"resize\", read);\n    };\n  }, [enabled, fallbackRoot, read]);\n\n  return { scrollMargin, observe };\n}\n","import type { ReactNode, RefCallback, RefObject } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\n\nimport { type ConfirmHandler, defaultConfirm } from \"./actions/confirm\";\nimport {\n  ACTIONS_COLUMN_KEY,\n  REORDER_COLUMN_KEY,\n} from \"./columns/columnMenuModel\";\nimport {\n  type ColumnGroupRecord,\n  flattenColumnTree,\n} from \"./columns/columnTree\";\nimport { resolveColumns } from \"./columns/resolveColumns\";\nimport { responsiveColumns } from \"./columns/responsiveColumns\";\nimport {\n  useColumnLayout,\n  type UseColumnLayoutResult,\n} from \"./columns/useColumnLayout\";\nimport { DEFAULT_CARD_SIZE_PX, DEFAULT_ROW_SIZE_PX } from \"./constants\";\nimport { useBatchEditing } from \"./editing/batchEditing\";\nimport { useDirtyCells } from \"./editing/dirtyCells\";\nimport type { EditableCellEditing } from \"./editing/editableCellController\";\nimport { useEditConflict } from \"./editing/editConflict\";\nimport type { EditHistoryState } from \"./editing/editHistory\";\nimport { useEditLifecycle } from \"./editing/editingEvents\";\nimport { useRowEditing } from \"./editing/rowEditing\";\nimport { useCellSaveState } from \"./editing/saveState\";\nimport { useCellEditing } from \"./editing/useCellEditing\";\nimport { useEditValidation } from \"./editing/validation\";\nimport type { ExportStatus } from \"./export/useExportHandler\";\nimport {\n  type ActiveFilterChip,\n  mergeFilterChips,\n  resolveActiveFilterCount,\n} from \"./filters/useActiveFilterChips\";\nimport { useFilterTreeChips } from \"./filters/useFilterTreeChips\";\nimport {\n  formatGroupBy,\n  type GroupByInput,\n  parseGroupBy,\n} from \"./grouping/groupKeys\";\nimport {\n  buildGroupedFlatModel,\n  type GroupAggregatesFn,\n  type GroupedFlatEntry,\n} from \"./grouping/groupRows\";\nimport {\n  type GroupCollapseState,\n  useGroupCollapse,\n} from \"./grouping/useGroupCollapse\";\nimport { useGroupPaging } from \"./grouping/useGroupPaging\";\nimport { useEventCallback } from \"./hooks/useEventCallback\";\nimport { useInfiniteScroll } from \"./hooks/useInfiniteScroll\";\nimport { useIsMobile } from \"./hooks/useIsMobile\";\nimport { useScrollToTableTop } from \"./hooks/useScrollToTableTop\";\nimport { useElementWidth } from \"./layout/useElementWidth\";\nimport type { BaseDataTableProps, ToolbarSlots } from \"./props\";\nimport { insertExtraRows } from \"./rows/extraRows\";\nimport {\n  configureIncrementalView,\n  incrementalViewOf,\n} from \"./rows/incremental\";\nimport { type RowMutationsState, useRowMutations } from \"./rows/rowMutations\";\nimport {\n  partitionPinnedRows,\n  type RowPinLabels,\n  type RowPinningState,\n  type RowPinState,\n  useRowPinning,\n} from \"./rows/rowPinning\";\nimport { type RowReorderState, useRowReorder } from \"./rows/rowReorder\";\nimport { estimateFromRowHeight } from \"./rows/rowStyle\";\nimport {\n  type RowExpansionState,\n  useRowExpansion,\n} from \"./rows/useRowExpansion\";\nimport type { SelectionState } from \"./selection/useSelection\";\nimport { serverGroupEntries } from \"./source/queryGroups\";\nimport type { TableSource } from \"./source/TableSource\";\nimport { type TableErrorState, tableErrorState } from \"./state/errorState\";\nimport {\n  collectFeatureNotices,\n  type FeatureNotice,\n} from \"./state/featureNotices\";\n\nexport type { FeatureNotice, FeatureNoticeKind } from \"./state/featureNotices\";\nimport { nestedTableDetail } from \"./tree/nestedTable\";\nimport {\n  buildTreeEntries,\n  treeColumnKey,\n  type TreeEntry,\n} from \"./tree/treeRows\";\nimport { useLazyChildren } from \"./tree/useLazyChildren\";\nimport {\n  type TreeExpansionState,\n  useTreeExpansion,\n} from \"./tree/useTreeExpansion\";\nimport type {\n  BulkAction,\n  ColumnDef,\n  RowAction,\n  SortByOption,\n  TableLabels,\n} from \"./types\";\nimport {\n  useDataTable,\n  type UseDataTableResult,\n} from \"./useDataTable/useDataTable\";\nimport { devWarn } from \"./utils/devWarn\";\nimport {\n  type TableVirtualization,\n  useKeyedVirtualization,\n  useTableVirtualization,\n  windowGroupedEntries,\n} from \"./virtual/useTableVirtualization\";\nimport { useMeasuredWindowScrollMargin } from \"./virtual/windowScrollMargin\";\n\n/**\n * The shared prop surface every adapter's toolbar sub-component needs.\n * Adapters render kit-specific markup from this; extracting it keeps the\n * identical shape from being re-declared (and flagged as duplication) in\n * each adapter.\n *\n * @typeParam TRow - The row type.\n */\nexport interface ToolbarChromeProps<TRow> {\n  /** The headless table state + prop-getters. */\n  table: UseDataTableResult<TRow>;\n  /** Render the search input (default `true`). */\n  searchable?: boolean;\n  /** Placeholder for the search input. */\n  searchPlaceholder?: string;\n  /** Options for an explicit sort-by control. */\n  sortByOptions?: SortByOption[];\n  /** Extra caller-supplied toolbar content, in the middle region. */\n  toolbar?: ReactNode;\n  /** Caller-supplied content for the two ends of the toolbar. */\n  toolbarSlots?: ToolbarSlots;\n  /**\n   * Put the last edit back. Set only when the host asked for the buttons\n   * (`undoRedoButtons`) AND `editHistory` is armed, so an adapter renders\n   * the pair on presence and never has to check two things.\n   */\n  onUndo?: () => void;\n  /** Do the last undone edit again. Present with {@link onUndo}. */\n  onRedo?: () => void;\n  /**\n   * Whether there is anything to undo. The button is disabled, not\n   * hidden — a control that vanishes moves the ones beside it, and a\n   * toolbar that reflows while someone is working is worse than a button\n   * that is briefly unavailable.\n   */\n  canUndo?: boolean;\n  /** Whether there is anything to redo. */\n  canRedo?: boolean;\n  /** `labels.undoEdit` — the undo button's caption. */\n  undoLabel?: string;\n  /** `labels.redoEdit` — the redo button's caption. */\n  redoLabel?: string;\n  /**\n   * Open the print dialog. Set only when the host asked for the button\n   * (`printButton`) AND wired `onPrint`, so an adapter renders on presence\n   * and never has to check two things.\n   */\n  onPrint?: () => void;\n  /** `labels.print` — the print button's caption. */\n  printLabel?: string;\n  /** The density the table is rendering, when the chooser is shown. */\n  density?: \"comfortable\" | \"compact\";\n  /** Change it. Present iff the host asked for the chooser. */\n  onDensityChange?: (next: \"comfortable\" | \"compact\") => void;\n  /** Toggle fullscreen. Present iff asked for AND the browser allows it. */\n  onToggleFullscreen?: () => void;\n  /** Whether the table is fullscreen right now, for the button's state. */\n  isFullscreen?: boolean;\n  /** Whether a filters affordance should render. */\n  hasFilters: boolean;\n  /** Number shown on the filters badge. */\n  activeFilterCount: number;\n  /** Whether the filter container is open (drives `aria-expanded`). */\n  filtersOpen: boolean;\n  /** Toggle the filter container (popover and drawer alike). */\n  onToggleFilters: () => void;\n  /**\n   * Bind to the trigger's `onPointerDown` (see\n   * {@link useFilterTriggerToggle}) so a click on the open trigger CLOSES\n   * the popover instead of racing the kit's outside-close and reopening.\n   */\n  onFiltersTriggerPointerDown?: () => void;\n  /** Whether to show the rows-per-page control (infinite mode). */\n  showRowsPerPage: boolean;\n  /**\n   * Built saved-views menu node, when the `savedViews` prop opts in. Renders\n   * ahead of {@link columnMenu} so every adapter's toolbar reads\n   * Filters · Saved views · Columns · Export CSV.\n   */\n  savedViewsMenu?: ReactNode;\n  /** Built column-menu node, when `enableColumnMenu` is set. */\n  columnMenu?: ReactNode;\n  /**\n   * When set, render the Export CSV toolbar button and call this on click.\n   * Built by {@link makeExportCsvHandler} from the `exportCsv` prop.\n   */\n  onExportCsv?: () => void;\n  /**\n   * True while a host-handled export (`exportCsv.request`) is still running.\n   *\n   * Adapters disable the Export button and mark it busy, so the same export\n   * cannot be started twice and the user can see that something is happening.\n   * Always false for the built-in browser export, which is synchronous.\n   */\n  exportBusy?: boolean;\n  /**\n   * What the last export did — `\"idle\"`, `\"busy\"`, `\"done\"` or `\"failed\"` —\n   * for a kit whose button shows more than a spinner.\n   */\n  exportStatus?: ExportStatus;\n  /**\n   * Live-region text for the last export's outcome, empty until there is one.\n   * Adapters render it through `ExportAnnouncer` beside the button: a download\n   * is silent, so without it a screen-reader user cannot tell a finished export\n   * from a failed one.\n   */\n  exportAnnouncement?: string;\n  /**\n   * The export button's caption, naming the format it produces — CSV by\n   * default, the writer's format otherwise, localized either way. Adapters\n   * render this rather than `labels.exportCsv`, so a button never names a file\n   * the user is not getting.\n   */\n  exportLabel?: string;\n  /**\n   * When set, render an Add-row control and call this on click. Present iff\n   * the host wired `onAddRow`, so the toolbar needs no second guard.\n   */\n  onAddRow?: () => void;\n  /** The Add control's caption, already localized. */\n  addRowLabel?: string;\n  /** Text direction, for adapters whose toolbar needs explicit RTL hints. */\n  dir?: \"ltr\" | \"rtl\";\n}\n\n/**\n * The shared prop surface every adapter's bulk-action bar needs. Extracted\n * so the identical shape isn't re-declared (and flagged as duplication) in\n * each adapter's chrome.\n */\nexport interface BulkBarChromeProps {\n  /** Current selection state. */\n  selection: SelectionState;\n  /**\n   * Total rows in the filtered set — drives the \"select all N matching\"\n   * banner when a full page is selected and more rows match elsewhere.\n   */\n  total: number;\n  /** Caller-supplied bulk actions. */\n  bulkActions: BulkAction[];\n  /** Confirmation handler for actions that declare a `confirm` block. */\n  confirm: ConfirmHandler;\n  /** Resolved labels. */\n  labels: Required<TableLabels>;\n}\n\n/**\n * Which body region a `DataTable` should render. Named `TableBodyRegion`\n * (not `TableBody`) so it never collides with MUI's `TableBody` component\n * in consumer imports.\n */\nexport type TableBodyRegion = \"skeleton\" | \"empty\" | \"mobile\" | \"desktop\";\n\n/** The shared, UI-agnostic orchestration result for an adapter table. */\nexport interface TableChrome<TRow> {\n  /**\n   * The source as the VIEW sees it. Identical to the caller's source —\n   * except with grouping armed, where the table renders the full filtered\n   * set and this facade presents that set (full rows, one page, matching\n   * total) so footer numbers, select-all scope and page-scope CSV export\n   * agree with the screen. Adapters read THIS, never the raw source.\n   */\n  source: TableSource<TRow>;\n  /** The headless table state + prop-getters. */\n  table: UseDataTableResult<TRow>;\n  /** Resolved mobile layout flag. */\n  isMobile: boolean;\n  /** Resolved confirmation handler. */\n  confirm: ConfirmHandler;\n  /** Row id extractor (selection id, falling back to rowKey). */\n  getRowId: (row: TRow) => string;\n  /** Derived chips: label-driven merged with caller `extraChips`. */\n  mergedChips: readonly ActiveFilterChip[];\n  /** Active filter count (override, or merged chip count). */\n  activeFilterCount: number;\n  /** Whether the resolved pagination mode is `\"paged\"`. */\n  isPaged: boolean;\n  /**\n   * The table root. Owned here so the width that drives progressive column\n   * hiding is measured on the table itself, in both wiring paths.\n   */\n  rootRef: RefObject<HTMLDivElement | null>;\n  /** Column keys progressive hiding gave up at the current width. */\n  droppedColumns: readonly string[];\n  /** Which body region to render. */\n  body: TableBodyRegion;\n  /**\n   * The load failure to show in place of the body, or `undefined` when the\n   * source is fine. Derived here so every adapter offers a retry on exactly\n   * the same terms — one the source can actually perform.\n   */\n  errorState?: TableErrorState;\n  /**\n   * Why the body is empty: `\"noResults\"` when an active search/filter\n   * produced zero rows (offer a clear-filters CTA), `\"noData\"` when the\n   * source itself is empty. Only meaningful while `body === \"empty\"`.\n   */\n  emptyVariant: \"noData\" | \"noResults\";\n  /**\n   * A background refresh is in flight (`isFetching` without `isLoading`):\n   * rows on screen are potentially stale. Adapters show a subtle,\n   * non-blocking indicator (thin progress bar / `aria-busy`).\n   */\n  isRefreshing: boolean;\n  /**\n   * Clear-filters handler: the caller's `onClearFilters`, falling back to\n   * `source.clearExtras` — so chips, the drawer and the no-results CTA can\n   * always offer a working \"clear\".\n   */\n  clearFilters: () => void;\n  /**\n   * Row-detail bundle — present iff `renderRowDetail` is set, so ONE guard\n   * narrows both the renderer and the expansion state (no correlated\n   * optionals to re-check).\n   */\n  detail?: {\n    /** The caller's detail-panel renderer. */\n    render: (row: TRow) => ReactNode;\n    /** Expansion state for the chevrons. */\n    expansion: RowExpansionState;\n  };\n  /**\n   * Inline editing bundle — present iff either channel is set (`onCellEdit`\n   * for per-cell commits, `rowEditing` + `onRowEdit` for row-level ones), so\n   * ONE guard narrows the host channel, the state machine, validation, save\n   * state, dirty marks and row mode. Pass neither and editing stays fully\n   * dormant: no UI, no keyboard.\n   */\n  editing?: EditableCellEditing<TRow>;\n  /**\n   * Adding, duplicating and deleting rows. Always present: `canAdd` says\n   * whether the toolbar's Add control renders, and the duplicate and delete\n   * actions are already folded into {@link TableChrome.rowActions}, so an\n   * adapter that renders row actions gets both for free.\n   */\n  rowMutations: RowMutationsState<TRow>;\n  /**\n   * The row actions to render — the host's, plus duplicate and delete when\n   * those are wired, and `undefined` when the reader hid the actions column.\n   * Adapters read THIS rather than the `rowActions` prop.\n   */\n  rowActions?: RowAction<TRow>[];\n  /**\n   * Whether an actions column exists at all, hidden or not — what the column\n   * menu offers, and the one figure a hidden column must not change.\n   */\n  hasRowActions: boolean;\n  /**\n   * Whether a reorder column exists at all, hidden or not — what the column\n   * menu offers. False when grouping or a tree is armed (reorder is refused).\n   */\n  hasRowReorder: boolean;\n  /**\n   * Headless row-reorder state. Present iff the host passed `onRowReorder`,\n   * grouping/tree are off, and the column is visible. Adapters read THIS.\n   */\n  rowReorder?: RowReorderState<TRow>;\n  /**\n   * Headless row-pin state. Present iff the host passed `pinnedRowIds` or\n   * `onPinnedRowIdsChange`, and grouping/tree are off.\n   */\n  rowPinning?: RowPinningState<TRow>;\n  /**\n   * Tree bundle — present iff the host declared a hierarchy (`getChildren` or\n   * `getParentId`). A tree and a grouping are different models and can both be\n   * dormant; a table that arms both renders the tree, since the rows' own\n   * shape outranks a derived one.\n   */\n  tree?: {\n    /** The flattened hierarchy, in render order. */\n    entries: readonly TreeEntry<TRow>[];\n    /** Which nodes are open. */\n    expansion: TreeExpansionState;\n    /** Which column carries the chevron and the indent. */\n    columnKey?: string;\n  };\n  /**\n   * Row-grouping bundle — present iff an effective `groupBy` is set AND the\n   * source can supply a full filtered set (`allFilteredRows`). Omit\n   * `groupBy` and grouping stays fully dormant (package DNA: opt-in).\n   */\n  grouping?: {\n    /** The grouping keys in order — one entry for a flat group, more for nested. */\n    groupBy: readonly string[];\n    collapsed: GroupCollapseState;\n    aggregates?: GroupAggregatesFn<TRow>;\n    /** Flat group-header + leaf entries for adapters to render. */\n    entries: readonly GroupedFlatEntry<TRow>[];\n    setGroupBy: (key: GroupByInput) => void;\n    /** Open every group. */\n    expandAll: () => void;\n    /** Close every group, at every level. */\n    collapseAll: () => void;\n    /**\n     * Show the tree down to `depth` and no further — `0` leaves only the\n     * outermost headers, `1` opens the first level inside them.\n     */\n    collapseToDepth: (depth: number) => void;\n    /** Reveal the next page of groups, or of one group's rows. */\n    showMore: (entry: { scope: \"groups\" | \"rows\"; groupKey?: string }) => void;\n  };\n  /**\n   * The rows the editing layer must treat as present: the grouped leaf set\n   * (in render order) while grouping renders the full filtered set, the\n   * page slice otherwise. Adapters pass THIS — never `source.rows` — as the\n   * `rows` context for editable cells, so an edit on a row outside the\n   * current page slice survives and Tab-advance follows the rendered order.\n   */\n  editingRows: readonly TRow[];\n  /** Whether the paged footer should render. */\n  showFooter: boolean;\n  /** User column-layout state + mutators (visibility, order, …). */\n  columnLayout: UseColumnLayoutResult<TRow>;\n  /** Tree groups for the declared columns — collapse options, header align. */\n  columnGroups: ReadonlyMap<string, ColumnGroupRecord<TRow>>;\n  /** All declared columns (pre layout/device filtering) for the column menu. */\n  allColumns: ColumnDef<TRow>[];\n  /**\n   * Opted-in features that cannot run. Empty when everything the host\n   * asked for can. Adapters show these on the status bar (when it is\n   * on) and as `data-adapttable-notices` on the root; the matching\n   * control already looks off, disabled, or one-page.\n   */\n  featureNotices: readonly FeatureNotice[];\n}\n\n/**\n * Run the shared orchestration every adapter `<DataTable>` needs: resolve\n * the layout + confirm handler, build the headless table, merge filter\n * chips, compute the active-filter count, and decide which body region and\n * footer to show. Adapters then render their kit-specific markup from this.\n *\n * @typeParam TRow - The row type.\n * @param props - The adapter's {@link BaseDataTableProps}.\n * @returns The {@link TableChrome} orchestration result.\n */\n/**\n * The undo/redo half of a toolbar's props, or nothing at all.\n *\n * Two conditions have to hold — the host asked for the buttons, and there\n * is a history for them to drive — and resolving both here means an\n * adapter renders the pair on `onUndo` being present and never has to\n * know that `editHistory` exists. Off, the object is empty and the props\n * are absent, which is what keeps an opted-out toolbar identical.\n */\n/**\n * The density chooser and the fullscreen toggle, or nothing.\n *\n * Both resolve to present-or-absent rather than present-and-disabled, so an\n * adapter renders on presence. The fullscreen half folds in whether the\n * browser will allow it at all: a toggle that cannot work is worse than no\n * toggle, and an embedded webview is a real place where it cannot.\n */\nexport interface ViewControlsToolbar {\n  density?: \"comfortable\" | \"compact\";\n  onDensityChange?: (next: \"comfortable\" | \"compact\") => void;\n  onToggleFullscreen?: () => void;\n  isFullscreen?: boolean;\n}\n\nexport function viewControlsToolbar(\n  props: {\n    densityChooser?: boolean;\n    density?: \"comfortable\" | \"compact\";\n    onDensityChange?: (next: \"comfortable\" | \"compact\") => void;\n    fullscreen?: boolean;\n  },\n  fullscreen: { supported: boolean; active: boolean; toggle: () => void }\n): ViewControlsToolbar {\n  return {\n    ...(props.densityChooser === true\n      ? {\n          density: props.density ?? \"comfortable\",\n          onDensityChange: props.onDensityChange,\n        }\n      : {}),\n    ...(props.fullscreen === true && fullscreen.supported\n      ? {\n          onToggleFullscreen: fullscreen.toggle,\n          isFullscreen: fullscreen.active,\n        }\n      : {}),\n  };\n}\n\nexport function undoRedoToolbar<TRow>(\n  wanted: boolean | undefined,\n  history: EditHistoryState<TRow>,\n  labels: TableLabels\n): Partial<ToolbarChromeProps<TRow>> {\n  if (wanted !== true || !history.enabled) return {};\n  return {\n    onUndo: history.undo,\n    onRedo: history.redo,\n    canUndo: history.canUndo,\n    canRedo: history.canRedo,\n    undoLabel: labels.undoEdit,\n    redoLabel: labels.redoEdit,\n  };\n}\n\n/** The print button's half of a toolbar's props. */\nexport interface PrintToolbar {\n  onPrint?: () => void;\n  printLabel?: string;\n}\n\n/**\n * The print button's half of a toolbar's props, or nothing at all.\n *\n * Two conditions again — the host asked for the button, and there is a handler\n * for it to call — resolved here so an adapter renders on `onPrint` being\n * present. `onPrint` alone stays what it has always been: a palette command.\n *\n * Not generic, unlike {@link undoRedoToolbar}: neither prop mentions the row\n * type, and a `Partial<ToolbarChromeProps<TRow>>` return with no `TRow` in the\n * arguments infers `unknown` and widens the whole spread at every call site.\n */\nexport function printToolbar(\n  wanted: boolean | undefined,\n  onPrint: (() => void) | undefined,\n  labels: TableLabels\n): PrintToolbar {\n  if (wanted !== true || onPrint === undefined) return {};\n  return { onPrint, printLabel: labels.print };\n}\n\nexport function useTableChrome<TRow>(\n  props: BaseDataTableProps<TRow>\n): TableChrome<TRow> {\n  const {\n    source,\n    columns,\n    rowKey,\n    tableLabel,\n    labels,\n    dir,\n    forceMobile,\n    mobileBreakpoint,\n    mobileIdentityColumns,\n    onRowsChange,\n    bulkActions,\n    selectionGetId,\n    selectedIds: selectedIdsProp,\n    onSelectionChange,\n    filterLabels,\n    onClearFilters,\n    extraChips,\n    activeFilterCount: activeFilterCountProp,\n    confirm: confirmProp,\n    columnLayout: columnLayoutProp,\n    onColumnLayoutChange,\n    defaultColumnLayout,\n    groupAggregates,\n    groupFooters,\n    groupSort,\n    groupFilter,\n    groupPageSize,\n    groupRowPageSize,\n    onGroupLoadMore,\n    extraRows,\n  } = props;\n\n  const autoMobile = useIsMobile(mobileBreakpoint);\n  const isMobile = forceMobile ?? autoMobile;\n  const confirm = confirmProp ?? defaultConfirm;\n\n  // Declarative defaults (auto headers, dot-path accessors) resolve once\n  // here, so the layout, the column menu and the table all see them.\n  const flattened = useMemo(() => flattenColumnTree(columns), [columns]);\n  const resolvedColumns = useMemo(\n    () => resolveColumns(flattened.leaves, props.locale),\n    [flattened.leaves, props.locale]\n  );\n\n  // User column layout (hide/order/…) applied on top of the declared columns,\n  // before device filtering inside useDataTable. The menu uses `allColumns`.\n  // The chrome owns the root ref so both wiring paths measure the same\n  // element: the width that decides progressive hiding has to be the table's\n  // own, not the window's.\n  const rootRef = useRef<HTMLDivElement>(null);\n  const rootWidth = useElementWidth(rootRef);\n\n  const columnLayout = useColumnLayout<TRow>({\n    columns: resolvedColumns,\n    layout: columnLayoutProp,\n    onLayoutChange: onColumnLayoutChange,\n    defaultColumnLayout,\n    collapsibleColumnGroups: props.collapsibleColumnGroups === true,\n    columnGroups: flattened.groups,\n  });\n\n  // Effective groupBy: prop wins when provided (including `null` to force\n  // off); otherwise the URL/source value. Empty string is treated as unset.\n  //\n  // With grouping armed the table is a FULL-SET view: grouped mode renders\n  // every filtered row, so the source the chrome reasons about presents\n  // that same set — footer numbers, select-all scope and page-scope CSV\n  // export all describe exactly what is on screen instead of the page\n  // slice. Mutators pass through untouched; the overlay disappears (and\n  // real pagination resumes) the moment grouping is cleared.\n  const requestedGroupBy =\n    props.groupBy === undefined ? source.groupBy : props.groupBy;\n  const groupByKeys = useMemo(\n    () => parseGroupBy(requestedGroupBy),\n    [requestedGroupBy]\n  );\n  // A server tier that answered `query.groupBy` sends its own groups; a\n  // frontend tier hands over the whole filtered set to group locally. Either\n  // way the adapters see the same entries.\n  const serverGroups = source.groups;\n  const groupingArmed = Boolean(\n    groupByKeys.length > 0 && (source.allFilteredRows ?? serverGroups)\n  );\n  const viewSource = useMemo<TableSource<TRow>>(() => {\n    if (!groupingArmed || !source.allFilteredRows) return source;\n    const all = source.allFilteredRows;\n    return {\n      ...source,\n      rows: all,\n      page: 1,\n      limit: Math.max(all.length, 1),\n      total: all.length,\n      hasNextPage: false,\n      isFetchingNextPage: false,\n    };\n  }, [groupingArmed, source]);\n\n  // Progressive hiding sits between the user's own hidden set and what is\n  // rendered: it is a fact about the viewport, not a choice the user made,\n  // so it never reaches the layout state, the URL or a saved view.\n  const responsive = useMemo(\n    () =>\n      responsiveColumns({\n        columns: columnLayout.visibleColumns,\n        available: rootWidth,\n        widths: columnLayout.state.widths,\n      }),\n    [columnLayout.visibleColumns, columnLayout.state.widths, rootWidth]\n  );\n\n  const table = useDataTable<TRow>({\n    source: viewSource,\n    columns: responsive.columns,\n    rowKey,\n    tableLabel,\n    labels,\n    dir,\n    forceMobile: isMobile,\n    mobileIdentityColumns,\n    bulkActions,\n    selectionGetId,\n    selectedIds: selectedIdsProp,\n    onSelectedIdsChange: onSelectionChange,\n    filterLabels,\n    multiSort: props.multiSort,\n    searchDebounceMs: props.searchDebounceMs,\n    locale: props.locale,\n    fitColumns: props.fitColumns,\n    // The user's dragged widths win over any share: they said what they wanted.\n    columnWidths: columnLayout.state.widths,\n  });\n\n  useEffect(() => {\n    onRowsChange?.(table.rows);\n  }, [onRowsChange, table.rows]);\n\n  // Selection observer (uncontrolled only): the Set identity only changes\n  // when the selection does, so this fires exactly once per user-visible\n  // change (including automatic resets and the documented mount fire with\n  // the empty selection). The handler is read through a ref-latch — the\n  // documented inline-arrow usage is a fresh identity every render, and\n  // keying the effect on it loops forever when the handler stores the ids\n  // in state. In the CONTROLLED mode the parent already receives change\n  // requests synchronously through useSelection's onChange — echoing them\n  // here would double-fire (and feed loops).\n  const controlledSelection = selectedIdsProp !== undefined;\n  const selectedIds = table.selection?.selectedIds;\n  const notifySelectionChange = useEventCallback((ids: string[]) => {\n    onSelectionChange?.(ids);\n  });\n  useEffect(() => {\n    if (!controlledSelection && selectedIds) {\n      notifySelectionChange([...selectedIds]);\n    }\n  }, [controlledSelection, selectedIds, notifySelectionChange]);\n\n  const treeChips = useFilterTreeChips({\n    tree: source.filterTree,\n    defs: props.filterDefs ?? [],\n    labels: table.labels,\n    setFilterTree: source.setFilterTree,\n  });\n  const mergedChips = useMemo<readonly ActiveFilterChip[]>(\n    () =>\n      mergeFilterChips(\n        mergeFilterChips(table.filterChips, extraChips),\n        treeChips\n      ),\n    [table.filterChips, extraChips, treeChips]\n  );\n\n  const activeFilterCount = resolveActiveFilterCount(\n    activeFilterCountProp,\n    mergedChips.length\n  );\n\n  const isPaged = source.paginationMode === \"paged\";\n\n  const errorState = tableErrorState(viewSource);\n  let body: TableBodyRegion;\n  if (viewSource.isLoading && viewSource.rows.length === 0) body = \"skeleton\";\n  else if (table.isEmpty) body = \"empty\";\n  else if (isMobile) body = \"mobile\";\n  else body = \"desktop\";\n\n  // Zero rows under an active search/filter is \"nothing MATCHED\", not\n  // \"nothing exists\" — the empty state should say so and offer a clear.\n  const emptyVariant =\n    activeFilterCount > 0 || source.search !== \"\" ? \"noResults\" : \"noData\";\n\n  // `isFetchingNextPage` is load-more, not a refresh of what's on screen.\n  const isRefreshing = Boolean(\n    source.isFetching && !source.isLoading && !source.isFetchingNextPage\n  );\n\n  // `onClearFilters` is a pure NOTIFICATION: the chrome always performs\n  // the clear itself, then tells the host. (It used to REPLACE the clear,\n  // so a logging handler silently broke the button — take full control\n  // via `source.clearExtras` instead.)\n  const clearFilters = useCallback(() => {\n    source.clearExtras();\n    source.setFilterTree?.(undefined);\n    onClearFilters?.();\n  }, [onClearFilters, source]);\n\n  // Hooks run unconditionally; the state is simply unused (and unexposed)\n  // when the caller renders no row details.\n  const expansionState = useRowExpansion(props.defaultExpandedRowIds);\n  // A declared nested table IS the detail panel; a row without one falls back\n  // to whatever the host builds itself.\n  const { nestedTable, density, labels: hostLabels } = props;\n  const hostRenderRowDetail = props.renderRowDetail;\n  const renderRowDetail = useMemo(\n    () =>\n      nestedTableDetail({\n        nestedTable,\n        renderRowDetail: hostRenderRowDetail,\n        parent: { density, labels: hostLabels },\n      }),\n    [nestedTable, hostRenderRowDetail, density, hostLabels]\n  );\n  const detail = useMemo(\n    () =>\n      renderRowDetail\n        ? { render: renderRowDetail, expansion: expansionState }\n        : undefined,\n    [renderRowDetail, expansionState]\n  );\n\n  // Same opt-in pattern as `detail`: the hook always runs (Rules of Hooks),\n  // but `editing` is only exposed when the host passes `onCellEdit`.\n  const lifecycle = useEditLifecycle<TRow>({\n    onEditStart: props.onEditStart,\n    onEditCancel: props.onEditCancel,\n    onEditCommit: props.onEditCommit,\n    onValidationFail: props.onValidationFail,\n    onEditError: props.onEditError,\n  });\n  const cellEditingState = useCellEditing<TRow>({\n    onEditStart: lifecycle.onEditStart,\n    onEditCancel: lifecycle.onEditCancel,\n  });\n  const conflict = useEditConflict<TRow>();\n  const onCellEdit = props.onCellEdit;\n  // Validation gates the commit and nothing else; it runs whether or not any\n  // validator exists, and stays inert until one rejects something.\n  const validation = useEditValidation<TRow>({\n    validateRow: props.validateRow,\n    applyEdit: props.applyEdit,\n  });\n  // A host whose `onCellEdit` returns a promise gets a saving cell for free;\n  // one that saves synchronously never pays a render for it.\n  const saving = useCellSaveState<TRow>({\n    onRollback: props.onEditRollback,\n    formatError: props.formatEditError,\n    onEditError: lifecycle.onEditError,\n  });\n  // A mark is a claim about what the server has agreed to, so it is the host's\n  // to ask for: `dirtyIndicators` on, and `confirmEdits` to say when a value has\n  // settled (a refetch agreed, a websocket echoed it back).\n  const dirty = useDirtyCells({ enabled: props.dirtyIndicators === true });\n  // Row mode changes the commit unit from a cell to a row, so it takes both the\n  // flag and a channel: an Edit control with nowhere to send the patch would be\n  // a mode the reader can enter and never leave usefully.\n  const rowModeArmed =\n    props.rowEditing === true && props.onRowEdit !== undefined;\n  const rowEditing = useRowEditing<TRow>({\n    enabled: rowModeArmed,\n    columns: resolvedColumns,\n    onRowEdit: props.onRowEdit,\n    onEditStart: lifecycle.onEditStart,\n    onEditCancel: lifecycle.onEditCancel,\n    onEditCommit: lifecycle.onEditCommit,\n  });\n  // Either channel arms the bundle: a host that wants row-level commits only\n  // never passes `onCellEdit`, and its cells stay display-only until a reader\n  // opens the row.\n  // Batch mode is the third commit unit: many rows held, one write at the end.\n  const batchArmed =\n    props.batchEditing === true && props.onBatchEdit !== undefined;\n  const batch = useBatchEditing<TRow>({\n    enabled: batchArmed,\n    columns: resolvedColumns,\n    onBatchEdit: props.onBatchEdit,\n    onEditStart: lifecycle.onEditStart,\n    onEditCancel: lifecycle.onEditCancel,\n    onEditCommit: lifecycle.onEditCommit,\n  });\n  const editingArmed = onCellEdit !== undefined || rowModeArmed || batchArmed;\n  const editing = useMemo(\n    () =>\n      editingArmed\n        ? {\n            onCellEdit,\n            state: cellEditingState,\n            validation,\n            saving,\n            dirty,\n            // Only when the host armed row mode: carried unconditionally, every\n            // table with cell editing would grow an \"Edit row\" control.\n            rowEditing: rowModeArmed ? rowEditing : undefined,\n            batch: batchArmed ? batch : undefined,\n            lifecycle,\n            conflict,\n            conflictLabels: {\n              message: table.labels.editConflict,\n              keepMine: table.labels.keepMine,\n              takeTheirs: table.labels.takeTheirs,\n              theirsValue: table.labels.theirsValue,\n            },\n          }\n        : undefined,\n    [\n      editingArmed,\n      onCellEdit,\n      cellEditingState,\n      validation,\n      saving,\n      dirty,\n      rowModeArmed,\n      rowEditing,\n      batchArmed,\n      batch,\n      lifecycle,\n      conflict,\n      table.labels.editConflict,\n      table.labels.keepMine,\n      table.labels.takeTheirs,\n      table.labels.theirsValue,\n    ]\n  );\n  // Half-configured editing is a silent trap: `editable: true` on a column\n  // does NOTHING without the table-level change channel. Say so in dev.\n  const hasEditableColumn = resolvedColumns.some((column) => column.editable);\n  useEffect(() => {\n    if (!hasEditableColumn || onCellEdit) return;\n    devWarn(\n      \"columns declare `editable` but no `onCellEdit` handler is set — cell editing stays inert. Pass `onCellEdit` on the table to enable it.\"\n    );\n  }, [hasEditableColumn, onCellEdit]);\n\n  // If the active row leaves the rendered set, drop the draft without\n  // committing — the host never receives a stale edit. The check runs\n  // against `editingRows` (defined after grouping below): the grouped body\n  // renders the FULL filtered leaf set, so validating against the page\n  // slice would silently kill edits on every off-page row (each group's\n  // rows beyond page 1 froze as display-only).\n\n  const groupCollapse = useGroupCollapse({\n    collapsedGroupIds: props.collapsedGroupIds,\n    onCollapsedGroupIdsChange: props.onCollapsedGroupIdsChange,\n  });\n\n  useEffect(() => {\n    if (groupByKeys.length === 0) return;\n    if (source.allFilteredRows || serverGroups) return;\n    devWarn(\n      \"groupBy is only supported on the frontend data tier (in-memory rows with allFilteredRows). Server-paginated sources cannot regroup a full result set; grouping is ignored.\"\n    );\n  }, [groupByKeys, source.allFilteredRows, serverGroups]);\n\n  // Depend on the two stable members, never the whole props/source objects\n  // (both fresh every render) — keying on them rebuilt the grouping bundle,\n  // and the O(filtered rows) grouped flat model behind it, on every\n  // keystroke.\n  const { onGroupByChange } = props;\n  const { setGroupBy: sourceSetGroupBy } = source;\n  // `onGroupByChange` is a pure NOTIFICATION: the chrome always applies\n  // the grouping change itself, then tells the host. (It used to REPLACE\n  // the mutator, so a logging handler silently broke grouping — take full\n  // control via `source.setGroupBy` instead.)\n  const setGroupBy = useCallback(\n    (key: GroupByInput) => {\n      sourceSetGroupBy(formatGroupBy(key));\n      onGroupByChange?.(parseGroupBy(key));\n    },\n    [onGroupByChange, sourceSetGroupBy]\n  );\n\n  const getRowId = selectionGetId ?? rowKey;\n  const groupPaging = useGroupPaging();\n  // Adding, duplicating and deleting: the table asks, the host does. Nothing\n  // renders until the handler that performs it is wired.\n  const rowMutations = useRowMutations<TRow>({\n    labels: table.labels,\n    onAddRow: props.onAddRow,\n    onDuplicateRow: props.onDuplicateRow,\n    onDeleteRow: props.onDeleteRow,\n    confirmDeleteRow: props.confirmDeleteRow,\n  });\n  // The one row-action list every renderer reads. Duplicate and delete come\n  // after the host's own, so a delete stays last where a destructive action\n  // belongs — and the whole column hides and end-pins as one, because the\n  // layout state cannot tell a synthesized action from a declared one.\n  const mutationActions = rowMutations.actions;\n  const hasRowActions =\n    (props.rowActions?.length ?? 0) + mutationActions.length > 0;\n  const actionsHidden = columnLayout.isHidden(ACTIONS_COLUMN_KEY);\n  const hostRowActions = props.rowActions;\n  const rowActions = useMemo<RowAction<TRow>[] | undefined>(() => {\n    if (actionsHidden || !hasRowActions) return undefined;\n    if (mutationActions.length === 0) return hostRowActions;\n    return [...(hostRowActions ?? []), ...mutationActions];\n  }, [actionsHidden, hasRowActions, hostRowActions, mutationActions]);\n\n  // A declared hierarchy is a fact about the rows, so it is armed by the shape\n  // the host gave rather than by a mode flag.\n  const treeExpansion = useTreeExpansion({\n    expandedIds: props.expandedIds,\n    onExpandedIdsChange: props.onExpandedIdsChange,\n  });\n  const treeShaped =\n    props.getChildren !== undefined || props.getParentId !== undefined;\n  // A branch the browser has not fetched yet: the host says there is more, the\n  // rows are not there, so opening it is a request rather than a reveal.\n  const lazyChildren = useLazyChildren<TRow>({\n    onLoadChildren: props.onLoadChildren,\n    hasLoadedChildren: (row) => hasLoadedChildren(row, source.rows, props),\n    getRowId,\n  });\n  // The walked hierarchy, before any lazy-loading chrome is layered on it: the\n  // entries are what a toggle looks a row up in, since a nested child never\n  // appears in `source.rows` at all.\n  const treeEntries = useMemo(\n    () =>\n      treeShaped\n        ? buildTreeEntries<TRow>({\n            rows: source.rows,\n            getRowId,\n            expandedIds: treeExpansion.expandedIds,\n            loadingIds: lazyChildren.loadingIds,\n            getChildren: props.getChildren,\n            getParentId: props.getParentId,\n            hasChildren: props.hasChildren,\n          })\n        : undefined,\n    [\n      treeShaped,\n      source.rows,\n      getRowId,\n      treeExpansion.expandedIds,\n      lazyChildren.loadingIds,\n      props.getChildren,\n      props.getParentId,\n      props.hasChildren,\n    ]\n  );\n  /**\n   * The same hierarchy with every node open.\n   *\n   * An export scoped to \"all\" means all the data, and a folded folder is a\n   * display state — the rows inside it matched the filters just the same. The\n   * rendered entries stop at every collapsed node, so exporting from them\n   * silently drops whole subtrees. This is what the export reads instead.\n   */\n  const treeExportEntries = useMemo(\n    () =>\n      treeEntries\n        ? buildTreeEntries<TRow>({\n            rows: source.rows,\n            getRowId,\n            // Every node id: a rendered entry carries its whole subtree in\n            // `descendantIds` whether or not it is open, and roots are always\n            // rendered — so the walked entries name every node in the tree.\n            expandedIds: new Set(\n              treeEntries.flatMap((entry) => [\n                entry.key,\n                ...entry.descendantIds,\n              ])\n            ),\n            getChildren: props.getChildren,\n            getParentId: props.getParentId,\n            hasChildren: props.hasChildren,\n          })\n        : undefined,\n    [\n      treeEntries,\n      source.rows,\n      getRowId,\n      props.getChildren,\n      props.getParentId,\n      props.hasChildren,\n    ]\n  );\n  const tree = useMemo(() => {\n    if (!treeEntries) return undefined;\n    return {\n      entries: treeEntries,\n      /** Every node, folded ones included — what an \"all\" export writes. */\n      allEntries: treeExportEntries,\n      // Opening a node fetches its children on the way: the row opens at once\n      // and fills when they land, so the chevron never feels stuck behind a\n      // request.\n      expansion: {\n        ...treeExpansion,\n        toggle: (id: string) => {\n          const entry = treeEntries.find((candidate) => candidate.key === id);\n          if (entry && !entry.expanded) lazyChildren.loadIfNeeded(entry.row);\n          treeExpansion.toggle(id);\n        },\n      },\n      loadingIds: lazyChildren.loadingIds,\n      /** Nodes whose last fetch failed — closed, and clickable again. */\n      failedIds: lazyChildren.failedIds,\n      columnKey: treeColumnKey(columnLayout.visibleColumns, props.treeColumn),\n    };\n  }, [\n    treeEntries,\n    treeExportEntries,\n    treeExpansion,\n    lazyChildren,\n    props.treeColumn,\n    columnLayout.visibleColumns,\n  ]);\n  const grouping = useMemo(() => {\n    if (groupByKeys.length === 0) return undefined;\n    if (!source.allFilteredRows && !serverGroups) return undefined;\n    const incremental = incrementalViewOf(source.allFilteredRows ?? []);\n    const view = incremental\n      ? configureIncrementalView(incremental, {\n          groupBy: groupByKeys,\n          columns: columnLayout.visibleColumns,\n          getRowId,\n          groupAggregates,\n          groupSort,\n          groupFilter,\n          groupFooters: groupFooters === true,\n          collapsedGroupIds: groupCollapse.collapsedGroupIds,\n          groupPageSize,\n          rowPageSize: groupRowPageSize,\n          paging: groupPaging.paging,\n        })\n      : undefined;\n    const entries = serverGroups\n      ? serverGroupEntries({\n          groups: serverGroups,\n          groupBy: groupByKeys,\n          collapsedGroupIds: groupCollapse.collapsedGroupIds,\n          getRowId,\n          footers: groupFooters === true,\n        })\n      : (view?.groups ??\n        buildGroupedFlatModel({\n          rows: source.allFilteredRows ?? [],\n          groupBy: groupByKeys,\n          columns: columnLayout.visibleColumns,\n          getRowId,\n          collapsedGroupIds: groupCollapse.collapsedGroupIds,\n          aggregates: groupAggregates,\n          footers: groupFooters === true,\n          sort: groupSort,\n          filter: groupFilter,\n          groupPageSize,\n          rowPageSize: groupRowPageSize,\n          paging: groupPaging.paging,\n        }));\n    // The whole-tree actions need the keys, and the entries are where they\n    // are: a collapsed group hides its children, so its own key is still\n    // listed while theirs are not — which is exactly what closing everything\n    // one level at a time produces.\n    const openGroups = entries.flatMap((entry) =>\n      entry.kind === \"group\" ? [{ key: entry.key, level: entry.level }] : []\n    );\n    const withExtras = insertExtraRows(entries, extraRows, (entry) =>\n      entry.kind === \"row\" ? entry.key : undefined\n    );\n    return {\n      groupBy: groupByKeys,\n      collapsed: groupCollapse,\n      aggregates: groupAggregates,\n      entries: withExtras,\n      setGroupBy,\n      /**\n       * Reveal the next page of groups, or of one group's rows. The table\n       * shows what it already holds; `onGroupLoadMore` is where a server tier\n       * fetches the rest.\n       */\n      showMore: (entry: { scope: \"groups\" | \"rows\"; groupKey?: string }) => {\n        const size =\n          entry.scope === \"groups\"\n            ? (groupPageSize ?? 0)\n            : (groupRowPageSize ?? 0);\n        groupPaging.showMore(size, entry.groupKey);\n        if (entry.scope === \"rows\" && entry.groupKey) {\n          onGroupLoadMore?.(entry.groupKey);\n        }\n      },\n      expandAll: groupCollapse.expandAll,\n      collapseAll: () => {\n        groupCollapse.collapseToDepth(0, openGroups);\n      },\n      collapseToDepth: (depth: number) => {\n        groupCollapse.collapseToDepth(depth, openGroups);\n      },\n    };\n  }, [\n    groupByKeys,\n    serverGroups,\n    source.allFilteredRows,\n    columnLayout.visibleColumns,\n    getRowId,\n    groupCollapse,\n    groupAggregates,\n    groupFooters,\n    groupSort,\n    groupFilter,\n    groupPageSize,\n    groupRowPageSize,\n    onGroupLoadMore,\n    extraRows,\n    groupPaging,\n    setGroupBy,\n  ]);\n\n  // See TableChrome.editingRows — the row universe the editing layer\n  // validates against must match what the body renders.\n  const editingRows = useMemo<readonly TRow[]>(() => {\n    if (!grouping) return viewSource.rows;\n    const leaves: TRow[] = [];\n    for (const entry of grouping.entries) {\n      if (entry.kind === \"row\") leaves.push(entry.row);\n    }\n    return leaves;\n  }, [grouping, viewSource.rows]);\n\n  // Reorder a flat list, never a nested one: grouping and trees have their\n  // own order, and a splice through them would silently lie.\n  const requestedReorder = props.onRowReorder !== undefined;\n  const reorderBlocked = grouping !== undefined || treeShaped;\n  useEffect(() => {\n    if (!requestedReorder || !reorderBlocked) return;\n    devWarn(\n      \"onRowReorder is ignored while grouping or a tree is armed — reorder a flat list, not a nested one.\"\n    );\n  }, [requestedReorder, reorderBlocked]);\n  const hasRowReorder = requestedReorder && !reorderBlocked;\n  const reorderHidden = columnLayout.isHidden(REORDER_COLUMN_KEY);\n  const rowReorderEnabled = hasRowReorder && !reorderHidden;\n  const hostRowReorder = props.onRowReorder;\n  const rowReorderState = useRowReorder<TRow>({\n    enabled: rowReorderEnabled,\n    onRowReorder: hostRowReorder,\n    labels: {\n      reorderRow: table.labels.reorderRow,\n      moveRowUp: table.labels.moveRowUp,\n      moveRowDown: table.labels.moveRowDown,\n      rowLifted: table.labels.rowLifted,\n      rowMoved: table.labels.rowMoved,\n      rowReorderCancelled: table.labels.rowReorderCancelled,\n    },\n    rowAt: (index) => editingRows[index],\n  });\n  const rowReorder = rowReorderEnabled ? rowReorderState : undefined;\n\n  const rowPinning = useChromeRowPinning<TRow>({\n    requested:\n      props.pinnedRowIds !== undefined ||\n      props.onPinnedRowIdsChange !== undefined,\n    blocked: grouping !== undefined || treeShaped,\n    pinnedRowIds: props.pinnedRowIds,\n    onPinnedRowIdsChange: props.onPinnedRowIdsChange,\n    getRowId: (row) => rowKey(row),\n    labels: {\n      pinToTop: table.labels.pinToTop,\n      pinToBottom: table.labels.pinToBottom,\n      unpinRow: table.labels.unpinRow,\n    },\n  });\n\n  useEffect(() => {\n    if (!editing) return;\n    editing.state.discardIfRowMissing(editingRows, (row) =>\n      rowKey(row as TRow)\n    );\n    conflict.reconcile({\n      active: editing.state.active,\n      openedRow: editing.state.openedRow() as TRow | undefined,\n      draft: editing.state.draft,\n      rows: editingRows,\n      columns: resolvedColumns,\n      rowKey,\n      rowVersion: props.rowVersion,\n      policy: props.editConflictPolicy ?? \"ask\",\n      onEditConflict: props.onEditConflict,\n      keep: (row) => {\n        editing.state.keepLive(row);\n      },\n      take: (row, value) => {\n        editing.state.takeLive(row, value);\n      },\n    });\n  }, [\n    editing,\n    editingRows,\n    rowKey,\n    conflict,\n    resolvedColumns,\n    props.rowVersion,\n    props.editConflictPolicy,\n    props.onEditConflict,\n  ]);\n\n  const showFooter =\n    isPaged &&\n    !viewSource.error &&\n    (viewSource.total > 0 || viewSource.isLoading || viewSource.isFetching);\n\n  const featureNotices = useMemo(\n    () =>\n      collectFeatureNotices({\n        virtualize: props.virtualize,\n        paginationMode: source.paginationMode,\n        groupByKeys,\n        allFilteredRows: source.allFilteredRows,\n        serverGroups,\n        rowPinningRequested:\n          props.pinnedRowIds !== undefined ||\n          props.onPinnedRowIdsChange !== undefined,\n        rowReorderRequested: props.onRowReorder !== undefined,\n        nestedArmed: grouping !== undefined || treeShaped,\n        hasEditableColumn,\n        onCellEdit,\n        rowEditing: props.rowEditing,\n        onRowEdit: props.onRowEdit,\n        batchEditing: props.batchEditing,\n        onBatchEdit: props.onBatchEdit,\n        exportCsv: props.exportCsv,\n        labels: table.labels,\n      }),\n    [\n      props.virtualize,\n      source.paginationMode,\n      groupByKeys,\n      source.allFilteredRows,\n      serverGroups,\n      props.pinnedRowIds,\n      props.onPinnedRowIdsChange,\n      props.onRowReorder,\n      grouping,\n      treeShaped,\n      hasEditableColumn,\n      onCellEdit,\n      props.rowEditing,\n      props.onRowEdit,\n      props.batchEditing,\n      props.onBatchEdit,\n      props.exportCsv,\n      table.labels,\n    ]\n  );\n\n  useEffect(() => {\n    const el = rootRef.current;\n    if (!el) return;\n    const value = featureNotices.map((notice) => notice.kind).join(\" \");\n    if (value) el.dataset.adapttableNotices = value;\n    else delete el.dataset.adapttableNotices;\n  });\n\n  const hasAnyActions = hasRowActions || rowPinning !== undefined;\n  const visibleRowActions = useMemo(() => {\n    if (actionsHidden || !hasAnyActions) return undefined;\n    const pins = rowPinning?.actions ?? [];\n    if (pins.length === 0) return rowActions;\n    return [...(rowActions ?? []), ...pins];\n  }, [actionsHidden, hasAnyActions, rowActions, rowPinning]);\n\n  return {\n    source: viewSource,\n    table,\n    isMobile,\n    confirm,\n    getRowId,\n    mergedChips,\n    activeFilterCount,\n    isPaged,\n    rootRef,\n    droppedColumns: responsive.dropped,\n    body,\n    errorState,\n    emptyVariant,\n    isRefreshing,\n    clearFilters,\n    detail,\n    rowMutations,\n    rowActions: visibleRowActions,\n    hasRowActions: hasAnyActions,\n    hasRowReorder,\n    rowReorder,\n    rowPinning,\n    editing,\n    grouping,\n    tree,\n    editingRows,\n    showFooter,\n    columnLayout,\n    columnGroups: flattened.groups,\n    allColumns: resolvedColumns,\n    featureNotices,\n  };\n}\n\n/** Result of {@link useChromeBodyData}. */\nexport interface ChromeBodyData<TRow> {\n  /** Row/card window virtualization state (disabled unless eligible). */\n  virtualization: TableVirtualization<TRow>;\n  /**\n   * When grouping is armed, the (possibly virtual-windowed) flat entries\n   * adapters should render. `undefined` when grouping is dormant.\n   */\n  groupingEntries?: readonly GroupedFlatEntry<TRow>[];\n  /**\n   * When a tree is armed, the (possibly virtual-windowed) entries adapters\n   * should render. `undefined` when the table is flat.\n   */\n  treeEntries?: readonly TreeEntry<TRow>[];\n  /** Sentinel ref that auto-loads the next page in infinite mode. */\n  loadMoreRef: RefObject<HTMLDivElement | null>;\n  /** Whether the load-more affordance applies (infinite mode, no error). */\n  canLoadMore: boolean;\n  /**\n   * Attach to the `maxHeight` scroll box (when one renders) so the virtual\n   * window tracks the box's scrolling instead of the page's. Harmless to\n   * attach when virtualization is off.\n   */\n  virtualScrollRef: RefCallback<HTMLElement>;\n  /** Top-pinned rows, removed from the virtual window. */\n  pinnedTopRows: readonly TRow[];\n  /** Bottom-pinned rows, removed from the virtual window. */\n  pinnedBottomRows: readonly TRow[];\n}\n\n/**\n * The shared data-flow wiring between {@link useTableChrome} and an\n * adapter's body: window virtualization (eligible only for real rows in\n * infinite mode) and the infinite-scroll sentinel. Extracted because four\n * adapters repeated this block verbatim; antd opts out (it scrolls inside\n * its own `<Table>` container).\n *\n * @typeParam TRow - The row type.\n * @param chrome - The {@link useTableChrome} result.\n * @param props - The adapter's {@link BaseDataTableProps}.\n * @returns Virtualization state + the load-more sentinel.\n */\nexport function useChromeBodyData<TRow>(\n  chrome: TableChrome<TRow>,\n  props: BaseDataTableProps<TRow>\n): ChromeBodyData<TRow> {\n  const { rowKey, virtualize = false } = props;\n  // The chrome's view facade, so grouped full-set state (no next page, all\n  // rows present) drives the sentinel and virtualization too.\n  const { source } = chrome;\n  if (virtualize && source.paginationMode === \"paged\") {\n    devWarn(\n      'virtualize only applies in infinite mode — this paged table renders unvirtualized. Pass paginationMode=\"infinite\" to enable it.'\n    );\n  }\n  const fetchNext = useCallback(() => {\n    if (source.hasNextPage && !source.isFetchingNextPage) {\n      source.fetchNextPage();\n    }\n  }, [source]);\n  const scrollBoxRef = useRef<HTMLElement | null>(null);\n  const inScrollBox = props.maxHeight != null;\n  // Window mode needs the list's document Y as TanStack `scrollMargin`.\n  // Without it, page chrome above the table is treated as already-scrolled\n  // rows and the body opens with a blank gap. An explicit prop wins.\n  const measureWindowOffset =\n    virtualize && !inScrollBox && props.virtualScrollMargin == null;\n  const { scrollMargin: measuredScrollMargin, observe: observeWindowList } =\n    useMeasuredWindowScrollMargin(measureWindowOffset, chrome.rootRef);\n  const virtualScrollRef = useCallback(\n    (node: HTMLElement | null) => {\n      scrollBoxRef.current = node;\n      observeWindowList(node);\n    },\n    [observeWindowList]\n  );\n  const bodyEligible = isBodyEligible(chrome);\n  const groupingArmed = Boolean(chrome.grouping);\n  const groupKeys = entryKeys(chrome.grouping?.entries);\n  // A tree is a keyed flat list once it has been walked, exactly like a\n  // grouped model — so it windows through the same hook rather than a second\n  // one. Without this a 50,000-row hierarchy renders 50,000 rows: the row\n  // virtualizer counts source rows, and a tree's visible list is its own.\n  const treeArmed = Boolean(chrome.tree);\n  const treeKeys = entryKeys(chrome.tree?.entries);\n  const pinState = chrome.rowPinning?.state;\n  const partitioned = useMemo(() => {\n    if (!pinState) {\n      return { top: [] as TRow[], scroll: source.rows, bottom: [] as TRow[] };\n    }\n    return partitionPinnedRows(source.rows, pinState, rowKey);\n  }, [pinState, rowKey, source.rows]);\n  const estimateSize = estimateBodyItemSize(chrome, props, partitioned.scroll);\n  const scrollOpts = {\n    overscan: props.virtualOverscan,\n    scrollMargin: props.virtualScrollMargin ?? measuredScrollMargin,\n    getScrollElement: inScrollBox ? () => scrollBoxRef.current : undefined,\n    onEndReached: fetchNext,\n    estimateSize,\n  } as const;\n\n  // Both hooks run unconditionally (Rules of Hooks); exactly one is enabled.\n  const groupVirtualization = useKeyedVirtualization({\n    keys: groupKeys,\n    enabled: virtualize && groupingArmed && bodyEligible,\n    ...scrollOpts,\n  });\n  const treeVirtualization = useKeyedVirtualization({\n    keys: treeKeys,\n    enabled: virtualize && treeArmed && !groupingArmed && bodyEligible,\n    ...scrollOpts,\n  });\n\n  const virtualization = useTableVirtualization({\n    rows: partitioned.scroll,\n    rowKey,\n    enabled: virtualize && !groupingArmed && !treeArmed && bodyEligible,\n    // Detail panels are separate elements from their rows, so the window\n    // measures the two together rather than sizing an expanded row from its\n    // top half.\n    expandable: props.renderRowDetail !== undefined,\n    ...scrollOpts,\n  });\n\n  const groupingEntries = chrome.grouping\n    ? windowGroupedEntries(chrome.grouping.entries, groupVirtualization.indices)\n    : undefined;\n  const treeEntries = chrome.tree\n    ? windowGroupedEntries(chrome.tree.entries, treeVirtualization.indices)\n    : undefined;\n\n  const resolvedVirtualization = resolveBodyVirtualization(\n    groupingArmed ? groupVirtualization : treeVirtualization,\n    virtualization\n  );\n\n  const boxVirtual = resolvedVirtualization.enabled && inScrollBox;\n  const canLoadMore = !chrome.isPaged && !source.error && !boxVirtual;\n  const loadMoreRef = useInfiniteScroll<HTMLDivElement>({\n    hasNextPage: Boolean(source.hasNextPage),\n    isFetchingNextPage: Boolean(source.isFetchingNextPage),\n    fetchNextPage: fetchNext,\n    itemCount: bodySentinelCount(chrome, groupingArmed),\n    enabled: canLoadMore,\n  });\n  const sourceIndexById = useMemo(() => {\n    const map = new Map<string, number>();\n    source.rows.forEach((row, index) => map.set(rowKey(row), index));\n    return map;\n  }, [rowKey, source.rows]);\n\n  const pinnedVirtualization = useMemo(() => {\n    if (!pinState) return resolvedVirtualization;\n    return {\n      ...resolvedVirtualization,\n      rows: resolvedVirtualization.rows.map((entry) => ({\n        ...entry,\n        sourceIndex: sourceIndexById.get(entry.key) ?? entry.index,\n      })),\n    };\n  }, [pinState, resolvedVirtualization, sourceIndexById]);\n\n  return {\n    virtualization: pinnedVirtualization,\n    groupingEntries,\n    treeEntries,\n    loadMoreRef,\n    canLoadMore,\n    virtualScrollRef,\n    pinnedTopRows: partitioned.top,\n    pinnedBottomRows: partitioned.bottom,\n  };\n}\n\n/**\n * Whether a row's children are already in the data.\n *\n * Both declarations answer it: nested data has them under the row, a flat table\n * has them among the rows keyed by their parent. A node with none is one the\n * host said has children (`hasChildren`) and the browser has not fetched.\n */\nfunction hasLoadedChildren<TRow>(\n  row: TRow,\n  rows: readonly TRow[],\n  props: BaseDataTableProps<TRow>\n): boolean {\n  const nested = props.getChildren?.(row);\n  if (nested !== undefined) return nested.length > 0;\n  const { getParentId, rowKey } = props;\n  if (!getParentId) return false;\n  const id = rowKey(row);\n  return rows.some((candidate) => getParentId(candidate) === id);\n}\n\n/** The keys of a walked model's entries — one shape for groups and trees. */\nfunction entryKeys(entries?: readonly { key: string }[]): string[] {\n  return entries?.map((entry) => entry.key) ?? [];\n}\n\n/** Whether the body is a real row/card list the window can apply to. */\nfunction isBodyEligible<TRow>(chrome: TableChrome<TRow>): boolean {\n  return (\n    !chrome.isPaged &&\n    !chrome.source.error &&\n    (chrome.body === \"desktop\" || chrome.body === \"mobile\")\n  );\n}\n\n/** A card's height on a phone, a row's on a desktop — or `rowHeight`. */\nfunction estimateBodyItemSize<TRow>(\n  chrome: TableChrome<TRow>,\n  props: BaseDataTableProps<TRow>,\n  scrollRows: readonly TRow[]\n): (index: number) => number {\n  const fallback = chrome.isMobile\n    ? (props.estimateCardSize ?? DEFAULT_CARD_SIZE_PX)\n    : (props.estimateRowSize ?? DEFAULT_ROW_SIZE_PX);\n  return estimateFromRowHeight(props.rowHeight, fallback, (index) => {\n    if (chrome.grouping) {\n      const entry = chrome.grouping.entries[index];\n      if (entry?.kind === \"row\") return { row: entry.row, index: entry.index };\n      return undefined;\n    }\n    if (chrome.tree) {\n      const entry = chrome.tree.entries[index];\n      if (entry) return { row: entry.row, index };\n      return undefined;\n    }\n    const row = scrollRows[index];\n    return row === undefined ? undefined : { row, index };\n  });\n}\n\n/** How many items the infinite-scroll sentinel counts as already rendered. */\nfunction bodySentinelCount<TRow>(\n  chrome: TableChrome<TRow>,\n  groupingArmed: boolean\n): number {\n  if (groupingArmed) return chrome.grouping?.entries.length ?? 0;\n  return chrome.source.rows.length;\n}\n\nfunction resolveBodyVirtualization<TRow>(\n  keyed: ReturnType<typeof useKeyedVirtualization>,\n  virtualization: TableVirtualization<TRow>\n): TableVirtualization<TRow> {\n  if (!keyed.enabled) return virtualization;\n  return {\n    enabled: true,\n    rows: [],\n    paddingTop: keyed.paddingTop,\n    paddingBottom: keyed.paddingBottom,\n    measureElement: keyed.measureElement,\n  };\n}\n\n/**\n * The shared scroll-restoration wiring every adapter `<DataTable>` needs:\n * when search / sort / page / filters change, scroll the table back below\n * the sticky chrome. Extracted so the identical block isn't repeated (and\n * flagged as duplication) in each adapter.\n *\n * @typeParam TRow - The row type.\n * @param ref - The adapter's root element.\n * @param chrome - The {@link useTableChrome} result.\n * @param props - The adapter's {@link BaseDataTableProps}.\n */\nexport function useChromeScrollReset<TRow>(\n  ref: RefObject<HTMLElement | null>,\n  chrome: TableChrome<TRow>,\n  props: BaseDataTableProps<TRow>\n): void {\n  const { source } = props;\n  // In infinite mode a page increment means \"the window grew at the\n  // bottom\" (the sentinel loaded more) — yanking the reader back to the\n  // table top would fight the scroll they are mid-way through. Only paged\n  // navigation is a real page change worth resetting for.\n  const pageDep = source.paginationMode === \"paged\" ? source.page : 0;\n  useScrollToTableTop({\n    ref,\n    deps: [\n      source.search,\n      source.sortBy ?? \"\",\n      source.sortDir ?? \"\",\n      pageDep,\n      chrome.activeFilterCount,\n    ],\n    enabled: props.scrollToTopOnChange,\n    offset: props.stickyTop,\n    gap: props.scrollTopGap,\n  });\n}\n\n/** Pointer/click handlers returned by {@link useFilterTriggerToggle}. */\nexport interface FilterTriggerToggle {\n  onPointerDown: () => void;\n  onClick: () => void;\n}\n\n/**\n * A toggle for the Filters trigger that survives every kit's outside-close\n * behavior. Some kits (Chakra `closeOnBlur`, outside `mousedown` handlers)\n * close the popover on the trigger's own pointer-down — a plain\n * `setOpen(o => !o)` on click then instantly REOPENS it, so the button can\n * never close the popover. This records whether the popover was open at\n * pointer-down: if the kit closed it in between, the click is swallowed;\n * otherwise the click toggles normally (kits that exclude the trigger from\n * outside-close keep working unchanged).\n */\nfunction useChromeRowPinning<TRow>(options: {\n  requested: boolean;\n  blocked: boolean;\n  pinnedRowIds?: RowPinState;\n  onPinnedRowIdsChange?: (next: RowPinState) => void;\n  getRowId: (row: TRow) => string;\n  labels: RowPinLabels;\n}): RowPinningState<TRow> | undefined {\n  const { requested, blocked, labels } = options;\n  useEffect(() => {\n    if (!requested || !blocked) return;\n    devWarn(\n      \"row pinning is ignored while grouping or a tree is armed — pin a flat list, not a nested one.\"\n    );\n  }, [blocked, requested]);\n  const enabled = requested && !blocked;\n  const state = useRowPinning<TRow>({\n    enabled,\n    pinnedRowIds: options.pinnedRowIds,\n    onPinnedRowIdsChange: options.onPinnedRowIdsChange,\n    getRowId: options.getRowId,\n    labels,\n  });\n  return enabled ? state : undefined;\n}\n\nexport function useFilterTriggerToggle(\n  open: boolean,\n  setOpen: (next: boolean | ((current: boolean) => boolean)) => void\n): FilterTriggerToggle {\n  const wasOpenAtPointerDown = useRef(false);\n  return {\n    onPointerDown: useCallback(() => {\n      wasOpenAtPointerDown.current = open;\n    }, [open]),\n    onClick: useCallback(() => {\n      const closedByKit = wasOpenAtPointerDown.current && !open;\n      wasOpenAtPointerDown.current = false;\n      if (closedByKit) return;\n      setOpen((current) => !current);\n    }, [open, setOpen]),\n  };\n}\n","import type { ReactNode } from \"react\";\n\nimport type {\n  ColumnDef,\n  ColumnHeaderContext,\n  ColumnHeaderController,\n} from \"../types\";\nimport { humanizeKey } from \"../utils/humanizeKey\";\n\n/** Default header caption: the explicit header, else a humanized key. */\nexport function columnHeaderLabel<TRow>(column: ColumnDef<TRow>): ReactNode {\n  return column.header ?? humanizeKey(column.key);\n}\n\n/** Build the controller a custom header receives. */\nexport function columnHeaderController<TRow>(\n  column: ColumnDef<TRow>,\n  extras: {\n    sortDir?: \"asc\" | \"desc\";\n    sortIndex?: number;\n    toggleSort?: (event?: { shiftKey?: boolean }) => void;\n  } = {}\n): ColumnHeaderController {\n  return {\n    label: columnHeaderLabel(column),\n    sortDir: extras.sortDir,\n    sortIndex: extras.sortIndex,\n    toggleSort: extras.toggleSort ?? (() => undefined),\n  };\n}\n\n/** Custom `renderHeader`, or the default caption. */\nexport function resolveColumnHeader<TRow>(\n  column: ColumnDef<TRow>,\n  controller: ColumnHeaderController\n): ReactNode {\n  if (column.renderHeader === undefined) return controller.label;\n  const ctx: ColumnHeaderContext<TRow> = { column, controller };\n  return column.renderHeader(ctx);\n}\n\n/** Custom `renderFooter`, or the summary value as-is. */\nexport function resolveColumnFooter<TRow>(\n  column: ColumnDef<TRow>,\n  value: ReactNode\n): ReactNode {\n  if (column.renderFooter === undefined) return value;\n  return column.renderFooter({ column, value });\n}\n\n/** True when any column wants a footer cell of its own. */\nexport function columnsHaveFooter<TRow>(\n  columns: readonly ColumnDef<TRow>[]\n): boolean {\n  return columns.some((column) => column.renderFooter !== undefined);\n}\n","import type { DragEvent, KeyboardEvent } from \"react\";\nimport { useCallback, useState } from \"react\";\n\nimport { isRtlElement } from \"../layout/writingDirection\";\n\n/** MIME type carrying the dragged column key during a reorder drag. */\nexport const COLUMN_DND_MIME = \"application/x-adapttable-column\";\n\n/** Props that make a whole menu ROW draggable (so the browser's drag image is\n * the full row — you see the column move). Pair with {@link columnDropProps}. */\nexport interface ColumnRowDragProps {\n  draggable: true;\n  onDragStart: (event: DragEvent<HTMLElement>) => void;\n}\n\n/**\n * Build drag props for a column-menu row. The entire row is the drag handle,\n * matching the native drag-image so the reorder feels physical.\n *\n * @param key - Column key being reordered.\n */\nexport function columnRowDragProps(key: string): ColumnRowDragProps {\n  return {\n    draggable: true,\n    onDragStart: (event) => {\n      // The whole row is draggable so the drag image is the full row — but a\n      // drag starting on an interactive control (the eye/pin buttons) would\n      // hijack their click. Cancel those so the buttons stay clickable. The\n      // reorder grip is exempt even when a kit renders it as a button\n      // (Mantine ActionIcon, MUI IconButton): it carries\n      // `data-adapttable-grip` via {@link columnReorderKeyProps}, and\n      // dragging from the grip is the strongest affordance of all.\n      const target = event.target as HTMLElement | null;\n      if (\n        target?.closest(\"button,input,select,a\") &&\n        !target.closest(\"[data-adapttable-grip]\")\n      ) {\n        event.preventDefault();\n        return;\n      }\n      event.dataTransfer.setData(COLUMN_DND_MIME, key);\n      event.dataTransfer.effectAllowed = \"move\";\n    },\n  };\n}\n\n/** Props for a small, focusable reorder grip — keyboard a11y for the row drag. */\nexport interface ColumnReorderKeyProps {\n  role: \"button\";\n  tabIndex: 0;\n  \"aria-label\": string;\n  \"data-adapttable-grip\": \"\";\n  onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n}\n\n/**\n * Whether the grip sits in a right-to-left context. Mirrors the resize\n * handle's detection: an explicit `[dir]` ancestor wins (what the adapters\n * set on the root), falling back to the resolved CSS `direction`.\n */\nfunction isRtl(grip: HTMLElement | null): boolean {\n  return isRtlElement(grip);\n}\n\n/**\n * Build keyboard props for the reorder grip. Arrow keys move the column one\n * slot — the accessible equivalent of the pointer drag. Up/Down always mean\n * earlier/later in the order; Left/Right follow the writing direction, so in\n * RTL pressing ArrowRight moves the column toward the start (visually right).\n *\n * @param key - Column key being reordered.\n * @param index - The column's current index in the full order.\n * @param move - Layout mutator that moves a column to a new index.\n * @param label - Accessible label for the grip.\n */\nexport function columnReorderKeyProps(\n  key: string,\n  index: number,\n  move: (key: string, toIndex: number) => void,\n  label: string\n): ColumnReorderKeyProps {\n  return {\n    role: \"button\",\n    tabIndex: 0,\n    \"aria-label\": label,\n    \"data-adapttable-grip\": \"\",\n    onKeyDown: (event) => {\n      const horizontal =\n        event.key === \"ArrowLeft\" || event.key === \"ArrowRight\";\n      const vertical = event.key === \"ArrowUp\" || event.key === \"ArrowDown\";\n      if (!horizontal && !vertical) return;\n      event.preventDefault();\n      // The arrow that points toward the inline start: ArrowLeft in LTR,\n      // ArrowRight in RTL (where the first column renders on the right).\n      const startKey = isRtl(event.currentTarget) ? \"ArrowRight\" : \"ArrowLeft\";\n      const towardStart = horizontal\n        ? event.key === startKey\n        : event.key === \"ArrowUp\";\n      move(key, towardStart ? index - 1 : index + 1);\n    },\n  };\n}\n\n/** Props for a row that accepts a dropped column, moving it to this index. */\nexport interface ColumnDropProps {\n  onDragOver: (event: DragEvent<HTMLElement>) => void;\n  onDrop: (event: DragEvent<HTMLElement>) => void;\n}\n\n/**\n * Build drop props for a reorder target: moves the dragged column to this\n * row's `index` on drop.\n *\n * @param index - Target index the dragged column moves to.\n * @param move - Layout mutator that moves a column to a new index.\n */\nexport function columnDropProps(\n  index: number,\n  move: (key: string, toIndex: number) => void\n): ColumnDropProps {\n  return {\n    onDragOver: (event) => {\n      if (!event.dataTransfer.types.includes(COLUMN_DND_MIME)) return;\n      event.preventDefault();\n      event.dataTransfer.dropEffect = \"move\";\n    },\n    onDrop: (event) => {\n      const key = event.dataTransfer.getData(COLUMN_DND_MIME);\n      if (key === \"\") return;\n      event.preventDefault();\n      move(key, index);\n    },\n  };\n}\n\n/** Indicator attributes for a column-menu row during a reorder drag. */\nexport interface ColumnDragRowAttrs {\n  /** Present on the row being dragged (kits dim it). */\n  \"data-dragging\"?: \"\";\n  /** Present on the hovered drop target, with the insertion edge. */\n  \"data-drop\"?: \"before\" | \"after\";\n}\n\n/** Live drag state + composed prop builders from {@link useColumnDragState}. */\nexport interface ColumnDragState {\n  /** Key currently being dragged, or `null` outside a drag. */\n  draggingKey: string | null;\n  /** Hovered drop index, or `null`. */\n  overIndex: number | null;\n  /** Drag props for a row — {@link columnRowDragProps} + state tracking. */\n  rowDragProps: (\n    key: string,\n    index: number\n  ) => ColumnRowDragProps & {\n    onDragEnd: () => void;\n  };\n  /** Drop props for a row — {@link columnDropProps} + hover tracking. */\n  dropProps: (\n    index: number,\n    move: (key: string, toIndex: number) => void\n  ) => ColumnDropProps;\n  /** Indicator data-attributes for a row; style them with kit CSS. */\n  rowAttrs: (key: string, index: number) => ColumnDragRowAttrs;\n}\n\n/**\n * Drop-position feedback for the column-menu reorder. Composes the existing\n * drag/drop prop builders with the tracking they lack, so adapters can show\n * WHERE the dragged column will land instead of leaving the user to guess:\n * the dragged row carries `data-dragging` (dim it) and the hovered target\n * carries `data-drop=\"before\" | \"after\"` (draw an insertion line on that\n * edge). State clears on drop, drag end, and drag cancel alike.\n */\nexport function useColumnDragState(): ColumnDragState {\n  const [drag, setDrag] = useState<{ key: string; from: number } | null>(null);\n  const [overIndex, setOverIndex] = useState<number | null>(null);\n\n  const reset = useCallback(() => {\n    setDrag(null);\n    setOverIndex(null);\n  }, []);\n\n  const rowDragProps = useCallback<ColumnDragState[\"rowDragProps\"]>(\n    (key, index) => {\n      const base = columnRowDragProps(key);\n      return {\n        ...base,\n        onDragStart: (event) => {\n          base.onDragStart(event);\n          // The base handler cancels drags that start on interactive\n          // controls — only track the ones it allowed.\n          if (!event.defaultPrevented) setDrag({ key, from: index });\n        },\n        onDragEnd: reset,\n      };\n    },\n    [reset]\n  );\n\n  const dropProps = useCallback<ColumnDragState[\"dropProps\"]>(\n    (index, move) => {\n      const base = columnDropProps(index, move);\n      return {\n        onDragOver: (event) => {\n          base.onDragOver(event);\n          // Only a column drag (accepted above) marks a target.\n          if (event.defaultPrevented) setOverIndex(index);\n        },\n        onDrop: (event) => {\n          base.onDrop(event);\n          reset();\n        },\n      };\n    },\n    [reset]\n  );\n\n  const rowAttrs = useCallback<ColumnDragState[\"rowAttrs\"]>(\n    (key, index) => {\n      if (!drag) return {};\n      // The source row matches by key here, so the hovered-target branch\n      // below can never be the dragged row itself.\n      if (drag.key === key) return { \"data-dragging\": \"\" };\n      if (overIndex !== index) return {};\n      // `move` inserts the dragged column AT this index: coming from later\n      // in the order it lands before this row, from earlier it lands after.\n      return { \"data-drop\": index < drag.from ? \"before\" : \"after\" };\n    },\n    [drag, overIndex]\n  );\n\n  return {\n    draggingKey: drag?.key ?? null,\n    overIndex,\n    rowDragProps,\n    dropProps,\n    rowAttrs,\n  };\n}\n","import { useCallback, useRef, useState } from \"react\";\n\n/** Result of {@link useHorizontalOverflow}. */\nexport interface HorizontalOverflow<E extends HTMLElement> {\n  /** Callback ref for the wrapper element to measure. */\n  ref: (node: E | null) => void;\n  /** True while the wrapper's content is wider than the wrapper. */\n  overflowing: boolean;\n}\n\n/**\n * Whether an element's content overflows it horizontally, kept current via\n * `ResizeObserver`. Adapters use it to turn the table wrapper into a\n * horizontal scroller ONLY when the table is actually wider than its\n * container — an unconditional `overflow-x: auto` would make the wrapper a\n * scroll container and trap page-scroll sticky headers even when nothing\n * overflows. Under SSR (no `ResizeObserver`) it stays `false`.\n */\nexport function useHorizontalOverflow<\n  E extends HTMLElement,\n>(): HorizontalOverflow<E> {\n  const [overflowing, setOverflowing] = useState(false);\n  const observerRef = useRef<ResizeObserver | null>(null);\n  const ref = useCallback((node: E | null) => {\n    observerRef.current?.disconnect();\n    observerRef.current = null;\n    if (!node || typeof ResizeObserver === \"undefined\") return;\n    const measure = (): void => {\n      // +1 absorbs sub-pixel rounding so the scroller never flickers on.\n      setOverflowing(node.scrollWidth > node.clientWidth + 1);\n    };\n    const observer = new ResizeObserver(measure);\n    observer.observe(node);\n    // The table's width changes (columns shown/hidden/resized) move\n    // scrollWidth without resizing the wrapper itself — observe it too.\n    if (node.firstElementChild) observer.observe(node.firstElementChild);\n    observerRef.current = observer;\n    measure();\n  }, []);\n  return { ref, overflowing };\n}\n","/**\n * Sticky chrome for pinned rows — one style, every kit.\n *\n * A pinned row leaves the virtual window and sticks above or below it.\n * Column pins still apply on those cells, so the z-index has to sit\n * between a scrolled pinned column and the sticky header: otherwise a\n * pinned row slides under the header, or a pinned column paints over it.\n */\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { PIN_Z } from \"../columns/useColumnLayout\";\nimport type { VirtualTableRow } from \"../virtual/useTableVirtualization\";\nimport { resolveVirtualRows } from \"../virtual/useTableVirtualization\";\nimport type { RowPinSide } from \"./rowPinning\";\n\n/** `data-adapttable-part` on a pinned row in the shared tbody. */\nexport const PINNED_TOP_PART = \"pinned-top\";\n/** Bottom pin marker on that row. */\nexport const PINNED_BOTTOM_PART = \"pinned-bottom\";\n\n/** Part name for a pinned row, or `undefined` when the row is not pinned. */\nexport function pinnedRowPart(\n  side: RowPinSide | undefined\n): typeof PINNED_TOP_PART | typeof PINNED_BOTTOM_PART | undefined {\n  if (side === \"top\") return PINNED_TOP_PART;\n  if (side === \"bottom\") return PINNED_BOTTOM_PART;\n  return undefined;\n}\n\n/** Sticky style when the row is pinned and the kit asked for sticky pins. */\nexport function pinnedRowSticky(\n  side: RowPinSide | undefined,\n  sticky: boolean,\n  headerOffsetPx: number\n): ReturnType<typeof pinnedRowStickyStyle> | undefined {\n  if (!sticky || !side) return undefined;\n  const offset = side === \"bottom\" ? 0 : headerOffsetPx;\n  return pinnedRowStickyStyle(side, offset);\n}\n\n/** Sticky style for a pinned-row section (tbody or the row itself). */\nexport function pinnedRowStickyStyle(\n  side: RowPinSide,\n  headerOffsetPx: number\n): { position: \"sticky\"; top?: number; bottom?: number; zIndex: number } {\n  if (side === \"top\") {\n    return {\n      position: \"sticky\",\n      top: headerOffsetPx,\n      zIndex: PIN_Z.rowPinned,\n    };\n  }\n  return {\n    position: \"sticky\",\n    bottom: 0,\n    zIndex: PIN_Z.rowPinned,\n  };\n}\n\n/**\n * Extra sticky inset a cell in a pinned row needs, and the z-index when\n * that cell is also a pinned column.\n */\nexport function pinnedRowCellStyle(\n  side: RowPinSide | undefined,\n  headerOffsetPx: number,\n  columnPinned: boolean\n): {\n  position?: \"sticky\";\n  top?: number;\n  bottom?: number;\n  zIndex?: number;\n} {\n  if (!side) return {};\n  const edge = side === \"top\" ? { top: headerOffsetPx } : { bottom: 0 };\n  return {\n    position: \"sticky\",\n    ...edge,\n    zIndex: columnPinned ? PIN_Z.rowPinnedColumn : PIN_Z.rowPinned,\n  };\n}\n\n/** Measure an element's offset height; used for the sticky header offset. */\nexport function useOffsetHeight(): [\n  (node: HTMLElement | null) => void,\n  number,\n] {\n  const [node, setNode] = useState<HTMLElement | null>(null);\n  const [height, setHeight] = useState(0);\n  const ref = useCallback((next: HTMLElement | null) => {\n    setNode(next);\n    if (next) setHeight(next.getBoundingClientRect().height);\n  }, []);\n  useEffect(() => {\n    if (!node || typeof ResizeObserver === \"undefined\") return undefined;\n    const observer = new ResizeObserver(() => {\n      setHeight(node.getBoundingClientRect().height);\n    });\n    observer.observe(node);\n    return () => observer.disconnect();\n  }, [node]);\n  return [ref, height];\n}\n\n/**\n * Card list order: top pins, then the scroll window, then bottom pins.\n * Desktop sticky sections use the same three lists; cards are a list, so\n * this is the only \"chrome\" they get.\n */\nexport function orderedCardEntries<TRow>(\n  rows: readonly TRow[],\n  getRowId: (row: TRow) => string,\n  rowEntries: readonly VirtualTableRow<TRow>[] | undefined,\n  pinnedTop: readonly TRow[],\n  pinnedBottom: readonly TRow[]\n): readonly VirtualTableRow<TRow>[] {\n  if (pinnedTop.length === 0 && pinnedBottom.length === 0) {\n    return resolveVirtualRows(rows, getRowId, rowEntries);\n  }\n  const pinnedIds = new Set<string>();\n  for (const row of pinnedTop) pinnedIds.add(getRowId(row));\n  for (const row of pinnedBottom) pinnedIds.add(getRowId(row));\n  const indexById = new Map<string, number>();\n  rows.forEach((row, index) => indexById.set(getRowId(row), index));\n  const asEntry = (row: TRow): VirtualTableRow<TRow> => {\n    const key = getRowId(row);\n    const sourceIndex = indexById.get(key) ?? 0;\n    return { row, index: sourceIndex, sourceIndex, key };\n  };\n  const scroll = resolveVirtualRows(rows, getRowId, rowEntries).filter(\n    (entry) => !pinnedIds.has(entry.key)\n  );\n  return [...pinnedTop.map(asEntry), ...scroll, ...pinnedBottom.map(asEntry)];\n}\n","import type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nimport type { ColumnDef } from \"../types\";\nimport type { BatchEditingState } from \"./batchEditing\";\nimport {\n  type CellEditCommit,\n  type CellEditor,\n  type EditableColumnLike,\n  isCellEditable,\n  isMultiSelectEditor,\n  isSelectEditor,\n  normalizeEditorOptions,\n  readEditableCellValue,\n  resolveCellEditor,\n  resolveCommitValue,\n} from \"./cellEditing\";\nimport type { DirtyCellState } from \"./dirtyCells\";\nimport type { EditConflict, EditConflictState } from \"./editConflict\";\nimport type { EditLifecycle } from \"./editingEvents\";\nimport { observeEdit } from \"./editingEvents\";\nimport type { RowEditingState } from \"./rowEditing\";\nimport type {\n  CellSaveState,\n  CellSaveStatus,\n  FailedCellSave,\n} from \"./saveState\";\nimport {\n  beginCellEdit as beginEdit,\n  type CellEditingState,\n} from \"./useCellEditing\";\nimport type { CellValidator, EditValidationState } from \"./validation\";\n\n/** Opt-in editing bundle from {@link TableChrome.editing}. */\nexport interface EditableCellEditing<TRow> {\n  /**\n   * The per-cell change channel. Return a promise and the cell shows it is\n   * saving until that promise settles, and shows why if it rejects.\n   *\n   * Absent when the host wants row-level commits only: the bundle still exists\n   * (row mode needs it) and every cell stays display-only until a reader opens\n   * the row.\n   */\n  onCellEdit?: (row: TRow, key: string, nextValue: unknown) => unknown;\n  state: CellEditingState;\n  /**\n   * Validation, when the host declared any. A commit runs the validators first\n   * and is dropped if one rejects — the editor stays open with the message on\n   * it, so the reader fixes what they typed instead of losing it.\n   */\n  validation?: EditValidationState<TRow>;\n  /**\n   * Save state, when the host's `onCellEdit` returns promises. Inert for a\n   * host that saves synchronously.\n   */\n  saving?: CellSaveState<TRow>;\n  /** Dirty marks, when the host asked for them (`dirtyIndicators`). */\n  dirty?: DirtyCellState;\n  /**\n   * Row-mode state, when the host armed it. While a row is open its cells render\n   * row editors instead of the per-cell activate control.\n   */\n  rowEditing?: RowEditingState<TRow>;\n  /**\n   * Batch state, when the host armed it. Every editable cell renders a field\n   * and nothing reaches the host until the reader saves them all.\n   */\n  batch?: BatchEditingState<TRow>;\n  /** Lifecycle observers — fire from the same place the transition happens. */\n  lifecycle?: EditLifecycle<TRow>;\n  /** Live-update conflict for the open editor, when one is being asked about. */\n  conflict?: EditConflictState<TRow>;\n  /** Labels for the conflict notice — already resolved. */\n  conflictLabels?: {\n    message: string;\n    keepMine: string;\n    takeTheirs: string;\n    theirsValue: (value: string) => string;\n  };\n}\n\n/** Display / edit mode for one cell. */\nexport type EditableCellMode = \"display\" | \"activatable\" | \"editing\";\n\n/** Controller returned by {@link editableCellController}. */\nexport interface EditableCellController<TRow = unknown> {\n  mode: EditableCellMode;\n  /** The validator's message for this cell, if it rejected the last commit. */\n  error?: string;\n  /** Whether an async validator is still deciding about this cell. */\n  validating: boolean;\n  /** What this cell's last save is doing: in flight, or failed. */\n  saveStatus?: CellSaveStatus;\n  /** Why this cell's last save failed, and what it takes to undo it. */\n  saveFailure?: FailedCellSave<TRow>;\n  /** Whether this cell holds a change nobody has confirmed yet. */\n  isDirty: boolean;\n  /** Whether an undo can be offered — the host said how to perform one. */\n  canRollback: boolean;\n  /** Put the previous value back after a failed save. */\n  rollback: () => void;\n  /** Forget a failed save without restoring anything. */\n  dismissFailure: () => void;\n  /** Resolved editor when the column is editable; always set for activatable/editing. */\n  editor: CellEditor | null;\n  /** Normalized select options (empty for text/number). */\n  selectOptions: ReturnType<typeof normalizeEditorOptions>;\n  draft: string;\n  begin: () => void;\n  setDraft: (value: string) => void;\n  /** Commit the draft now, without waiting for Enter or a blur. */\n  commit: () => void;\n  /** Abandon the draft, exactly as Escape does. */\n  cancel: () => void;\n  /** Wire to the editor's keydown — Enter/Tab/Escape. */\n  onEditorKeyDown: (event: {\n    key: string;\n    preventDefault: () => void;\n    shiftKey?: boolean;\n  }) => void;\n  /** Commit on blur (click-away). No-op when not editing. */\n  commitOnBlur: () => void;\n  /**\n   * A live row changed under this editor. Present only while the policy is\n   * asking; Keep mine / Take theirs resolve it.\n   */\n  conflict?: EditConflict<TRow>;\n  /** Labels for the conflict notice. */\n  conflictLabels?: {\n    message: string;\n    keepMine: string;\n    takeTheirs: string;\n    theirsValue: (value: string) => string;\n  };\n  /** Keep the draft. */\n  keepConflict: () => void;\n  /** Take the incoming value. */\n  takeConflict: () => void;\n}\n\n/**\n * Derive the per-cell editing controller. When `editing` is omitted (host\n * did not pass `onCellEdit`), always returns `mode: \"display\"` — zero UI\n * change for tables that never opted in.\n */\nexport function editableCellController<TRow>(options: {\n  editing: EditableCellEditing<TRow> | undefined;\n  row: TRow;\n  column: ColumnDef<TRow>;\n  rowId: string;\n  rows: readonly TRow[];\n  columns: readonly ColumnDef<TRow>[];\n  rowKey: (row: TRow) => string;\n}): EditableCellController {\n  const { editing, row, column, rowId, rows, columns, rowKey } = options;\n\n  const idle: EditableCellController<TRow> = {\n    mode: \"display\",\n    validating: false,\n    isDirty: false,\n    canRollback: false,\n    rollback: () => undefined,\n    dismissFailure: () => undefined,\n    editor: null,\n    selectOptions: [],\n    draft: \"\",\n    begin: () => undefined,\n    setDraft: () => undefined,\n    commit: () => undefined,\n    cancel: () => undefined,\n    onEditorKeyDown: () => undefined,\n    commitOnBlur: () => undefined,\n    keepConflict: () => undefined,\n    takeConflict: () => undefined,\n  };\n\n  // No per-cell channel means no per-cell editing, whatever else the bundle\n  // carries: a cell that opened an editor with nowhere to send the value would\n  // lose whatever the reader typed.\n  if (!editing?.onCellEdit) return idle;\n  const onCellEdit = editing.onCellEdit;\n\n  const editor = resolveCellEditor(column);\n  if (!editor || !isCellEditable(column, row)) return idle;\n\n  // Both kinds of chooser carry options; only the number chosen differs.\n  const selectOptions =\n    isSelectEditor(editor) || isMultiSelectEditor(editor)\n      ? normalizeEditorOptions(editor.options)\n      : [];\n\n  const { state, validation, saving, dirty } = editing;\n  const isEditing = state.isActive(rowId, column.key);\n\n  const validateCell = asCellValidator<TRow>(column);\n  // Nothing validates this cell, so the commit stays exactly as synchronous as\n  // it has always been. A microtask on every Tab, paid by every table, to\n  // support validators most tables never declare, is not a trade worth making.\n  const gated =\n    validation !== undefined &&\n    (validateCell !== undefined || validation.hasRowValidator);\n\n  /**\n   * Hand a resolved value to the host, and watch whatever it hands back: a\n   * promise means the value is still on its way somewhere, which is something\n   * the reader cannot see unless the cell says so.\n   */\n  const sendToHost = (resolved: {\n    row: TRow;\n    column: EditableColumnLike<TRow>;\n    value: unknown;\n  }) => {\n    const result = onCellEdit(\n      resolved.row,\n      resolved.column.key,\n      resolved.value\n    );\n    const columnKey = resolved.column.key;\n    observeEdit(editing.lifecycle?.onEditCommit, {\n      row: resolved.row,\n      rowId,\n      columnKey,\n      value: resolved.value,\n      previousValue: readEditableCellValue(resolved.row, resolved.column),\n      unit: \"cell\",\n    });\n    // Changed, and not settled by anything the reader trusts yet.\n    dirty?.mark(rowId, columnKey);\n    if (!saving) return;\n    void saving\n      .track({\n        rowId,\n        columnKey,\n        previous: resolved.row,\n        attempted: resolved.value,\n        previousValue: readEditableCellValue(resolved.row, resolved.column),\n        result,\n      })\n      .then((saved) => {\n        // The host agreeing is what settles a value, so the mark clears here and\n        // nowhere else. A failed save keeps it: the value is still at risk until\n        // the reader undoes it or tries again.\n        if (saved) dirty?.confirm(rowId, columnKey);\n      });\n  };\n\n  /** Send a commit straight through — the path for an ungated column. */\n  const commitNow = (commit: CellEditCommit | null): boolean => {\n    if (!commit) return false;\n    const resolved = resolveCommitValue({ commit, rows, columns, rowKey });\n    if (!resolved) return false;\n    sendToHost(resolved);\n    return true;\n  };\n\n  /**\n   * Run the validators, then send the value if they allow it.\n   *\n   * Resolves to whether the host received it, so a Tab that advances can stop\n   * short: moving on while this cell is rejected would put the cursor past the\n   * message the reader needs to read.\n   */\n  const commitValidated = async (\n    commit: CellEditCommit | null\n  ): Promise<boolean> => {\n    if (!commit || !validation) return false;\n    const resolved = resolveCommitValue({ commit, rows, columns, rowKey });\n    if (!resolved) return false;\n    // Hold the reader in the editor while the check runs — a cell that closes\n    // and reopens on a rejection loses the caret, and an async check would\n    // leave nothing on screen to mark busy.\n    beginEdit(state, resolved.row, resolved.column, rowKey);\n    state.setDraft(commit.draft);\n    const verdict = await validation.check({\n      target: { rowId: commit.rowId, columnKey: commit.columnKey },\n      value: resolved.value,\n      row: resolved.row,\n      validateCell,\n    });\n    // A rejection leaves the editor exactly where it is, message attached.\n    // A superseded check (`allowed: false` with no `error`) is silence: a\n    // newer draft owns the cell and this one must not speak for it.\n    if (!verdict.allowed) {\n      if (verdict.error !== undefined) {\n        observeEdit(editing.lifecycle?.onValidationFail, {\n          row: resolved.row,\n          rowId: commit.rowId,\n          columnKey: commit.columnKey,\n          value: resolved.value,\n          previousValue: readEditableCellValue(resolved.row, resolved.column),\n          unit: \"cell\",\n          error: verdict.error,\n        });\n      }\n      return false;\n    }\n    // Allowed: close the editor, then hand the value over.\n    state.close();\n    sendToHost(resolved);\n    return true;\n  };\n\n  const beginNext = (target: { rowId: string; columnKey: string } | null) => {\n    if (!target) return;\n    const nextRow = rows.find((r) => rowKey(r) === target.rowId);\n    const nextCol = columns.find((c) => c.key === target.columnKey);\n    if (!nextRow || !nextCol) return;\n    beginEdit(state, nextRow, nextCol, rowKey);\n  };\n\n  const liveConflict = editing.conflict?.isConflict(rowId, column.key)\n    ? (editing.conflict.current ?? undefined)\n    : undefined;\n  let validationError = validation?.errorFor(rowId, column.key);\n  if (validationError === undefined && isEditing) {\n    validationError = validation?.rowErrorFor(rowId);\n  }\n\n  return {\n    mode: isEditing ? \"editing\" : \"activatable\",\n    // A row-level message has no cell of its own, so it shows under the cell\n    // the reader just edited — where they are looking. A live conflict uses\n    // the same channel: the message is what `aria-describedby` points at.\n    error: liveConflict ? editing.conflictLabels?.message : validationError,\n    validating: validation?.isValidating(rowId, column.key) ?? false,\n    saveStatus: saving?.statusFor(rowId, column.key),\n    saveFailure: saving?.failureFor(rowId, column.key),\n    isDirty: dirty?.isDirty(rowId, column.key) ?? false,\n    canRollback: saving?.canRollback ?? false,\n    rollback: () => {\n      saving?.rollback(rowId, column.key);\n      // The value the reader typed is gone, so nothing is waiting on it.\n      dirty?.confirm(rowId, column.key);\n    },\n    dismissFailure: () => {\n      saving?.clear(rowId, column.key);\n    },\n    editor,\n    selectOptions,\n    draft: isEditing ? state.draft : \"\",\n    begin: () => {\n      beginEdit(state, row, column, rowKey);\n    },\n    setDraft: state.setDraft,\n    commit: () => {\n      if (!state.isActive(rowId, column.key)) return;\n      if (editing.conflict?.isConflict(rowId, column.key)) return;\n      const pending = state.commit();\n      if (gated) void commitValidated(pending);\n      else commitNow(pending);\n    },\n    cancel: () => {\n      validation?.clear(rowId, column.key);\n      state.cancel();\n    },\n    onEditorKeyDown: (event) => {\n      // Enter / Tab would commit through the state machine, which does not\n      // know about the ask. Hold them until the reader chooses; Escape still\n      // throws the draft away.\n      if (\n        editing.conflict?.isConflict(rowId, column.key) &&\n        (event.key === \"Enter\" || event.key === \"Tab\")\n      ) {\n        event.preventDefault();\n        return;\n      }\n      const outcome = state.handleKeyDown(event, {\n        rows,\n        columns,\n        rowKey: (r) => rowKey(r as TRow),\n      });\n      if (!outcome) return;\n      if (outcome.action === \"cancel\") {\n        validation?.clear(rowId, column.key);\n        return;\n      }\n      const advance = () => {\n        if (outcome.action === \"commit-advance\")\n          beginNext(outcome.advanceTarget);\n      };\n      if (!gated) {\n        if (commitNow(outcome.commit)) advance();\n        return;\n      }\n      void commitValidated(outcome.commit).then((committed) => {\n        if (committed) advance();\n      });\n    },\n    commitOnBlur: () => {\n      if (!state.isActive(rowId, column.key)) return;\n      if (editing.conflict?.isConflict(rowId, column.key)) return;\n      const commit = state.commit();\n      if (gated) void commitValidated(commit);\n      else commitNow(commit);\n    },\n    conflict: liveConflict,\n    conflictLabels: liveConflict ? editing.conflictLabels : undefined,\n    keepConflict: () => {\n      editing.conflict?.keep();\n    },\n    takeConflict: () => {\n      editing.conflict?.take();\n    },\n  };\n}\n\n/**\n * A column's own validator, if it declared one.\n *\n * Read off the column rather than passed in, so a validator lives beside the\n * `editor` and `parseValue` that produce the value it judges.\n */\nfunction asCellValidator<TRow>(column: {\n  validate?: (\n    value: unknown,\n    row: TRow\n  ) => string | undefined | Promise<string | undefined>;\n}): CellValidator<TRow> | undefined {\n  return column.validate;\n}\n\n/** Convenience: stop React keyboard events from bubbling to row click. */\nexport function stopCellEditKeyboard(\n  event: Pick<ReactKeyboardEvent, \"stopPropagation\">\n): void {\n  event.stopPropagation();\n}\n\n/**\n * Attach as a `ref` (or kit `inputRef`) so the editor receives focus when the\n * cell enters edit mode — replaces the `autoFocus` attribute (axe/a11y).\n * Accepts DOM nodes and kit refs that expose `.focus()` (e.g. antd InputRef).\n */\nexport function focusEditorOnMount(node: { focus: () => void } | null): void {\n  node?.focus();\n}\n\n/**\n * Whether any cell in a row holds a change nobody has confirmed.\n *\n * Read by every adapter's row so the mark exists at both scales: a reader\n * scanning a long table sees which rows are unsettled without hunting for the\n * cell inside them.\n *\n * @typeParam TRow - The row type.\n * @param editing - The editing bundle from the chrome.\n * @param rowId - The row's stable id.\n * @returns Whether to mark the row.\n */\nexport function rowIsDirty<TRow>(\n  editing: EditableCellEditing<TRow> | undefined,\n  rowId: string\n): boolean {\n  return editing?.dirty?.isRowDirty(rowId) ?? false;\n}\n\n/**\n * Memo digest for one desktop/card row: `null` when editing is off (host\n * never passed `onCellEdit`); empty string when this row is idle; otherwise\n * `columnKey:draft` so only the active edit row re-renders on keystrokes.\n */\nexport function rowEditingSignature<TRow>(\n  editing: EditableCellEditing<TRow> | undefined,\n  rowId: string\n): string | null {\n  if (!editing) return null;\n  const { active, draft } = editing.state;\n  // A validation message belongs to a ROW that may not hold the active editor:\n  // a cross-field rule marks the cell it points at, and that row has to repaint\n  // to show it. Left out, a rejected commit paints nothing.\n  const marked = editing.validation?.rowHasError(rowId) ?? false;\n  const busy = editing.validation?.isValidating(rowId, active?.columnKey ?? \"\");\n  // A save is in flight or has failed on a cell of this row, which may hold no\n  // editor at all by then — the reader closed it and moved on.\n  const save = editing.saving?.signature ?? \"\";\n  const rowSave = save.includes(`${rowId} `) ? save : \"\";\n  // A dirty mark belongs to the row too, and outlives the editor that made it.\n  const marks = editing.dirty?.signature ?? \"\";\n  const rowMarks = marks.includes(`${rowId} `) ? marks : \"\";\n  // Row mode replaces every cell in the open row with an editor, so the row it\n  // belongs to has to repaint — including on every keystroke in any field.\n  const rowMode = editing.rowEditing;\n  const rowDrafts =\n    rowMode?.activeRowId === rowId ? (rowMode.signature ?? \"\") : \"\";\n  // A batch holds drafts for many rows at once, so each row watches its own\n  // slice of the digest — without it a typed cell never repaints.\n  const batchAll = editing.batch?.signature ?? \"\";\n  const batchRow =\n    batchAll.split(\";\").find((entry) => entry.startsWith(`${rowId}:`)) ?? \"\";\n  // A live conflict is asked on the open editor. Left out, the row memo\n  // sees the same draft and never paints Keep mine / Take theirs.\n  const live = editing.conflict?.current;\n  const conflictMark =\n    live?.rowId === rowId\n      ? `conflict:${live.columnKey}:${live.incomingValue}`\n      : \"\";\n  if (active?.rowId !== rowId) {\n    const base = `${rowSave}${rowMarks}${rowDrafts}${batchRow}${conflictMark}`;\n    return marked ? `invalid${base}` : base;\n  }\n  const message = editing.validation?.errorFor(rowId, active.columnKey) ?? \"\";\n  return `${active.columnKey}:${draft}:${message}:${busy === true ? \"1\" : \"\"}${rowSave}${rowMarks}${rowDrafts}${batchRow}${conflictMark}`;\n}\n","/**\n * A cell inside a row that is being edited as one unit, and the controls that\n * end that edit.\n *\n * Row mode reuses everything cell mode already has — the same editor set, the\n * same validation ARIA, the same custom-editor contract — so the only thing that\n * differs is where the draft lives and when it reaches the host. Both live here\n * rather than in nine adapters, because a second copy of \"which editor does this\n * column want\" is a second place for the answer to drift.\n */\nimport type { ReactElement, ReactNode } from \"react\";\n\nimport type { TableLabels } from \"../types\";\nimport type { BatchEditingState } from \"./batchEditing\";\nimport {\n  type CellEditor,\n  type EditableColumnLike,\n  isCustomEditor,\n  normalizeEditorOptions,\n  resolveCellEditor,\n} from \"./cellEditing\";\nimport { focusEditorOnMount } from \"./editableCellController\";\nimport type { EditableCellEditorCtrl } from \"./EditableCellGate\";\nimport type { RowEditingState } from \"./rowEditing\";\n\n/** Props for {@link RowEditCell}. */\nexport interface RowEditCellProps<TRow> {\n  /** The row-editing state from the chrome. */\n  rowEditing: RowEditingState<TRow>;\n  /** The column this cell belongs to. */\n  column: EditableColumnLike<TRow>;\n  /** The cell's display content, for a column that is not editable. */\n  display: ReactElement | string | number | null;\n  /** Accessible name for the editor (`labels.editCell`). */\n  editLabel: string;\n  /**\n   * Whether this is the first editable column of the row, and so the field the\n   * table hands focus to when the row opens. Every field calling focus on mount\n   * would leave the reader at the last column of the row they just opened.\n   *\n   * Not the DOM's `autoFocus`: focus moves because a reader asked to edit this\n   * row, which is the case the accessibility guidance carves out.\n   */\n  takesFocus: boolean;\n  /**\n   * Render the kit's own editor from a controller — the same callback shape the\n   * cell gate uses, so a kit writes one editor and both modes use it.\n   */\n  renderEditor: (ctrl: EditableCellEditorCtrl) => ReactElement;\n}\n\n/**\n * One cell of a row being edited: the kit's editor bound to the row's draft, or\n * the plain display when the column is not editable.\n *\n * @typeParam TRow - The row type.\n * @param props - See {@link RowEditCellProps}.\n * @returns The editor, or the display content.\n */\nexport function RowEditCell<TRow>({\n  rowEditing,\n  column,\n  display,\n  editLabel,\n  takesFocus,\n  renderEditor,\n}: Readonly<RowEditCellProps<TRow>>): ReactElement {\n  const editor = resolveCellEditor(column);\n  if (!editor) return <>{display}</>;\n  const focusRef = takesFocus ? focusEditorOnMount : () => undefined;\n\n  const ctrl: EditableCellEditorCtrl = {\n    draft: rowEditing.draftFor(column.key),\n    setDraft: (value) => {\n      rowEditing.setDraft(column.key, value);\n    },\n    // Enter saves the whole row, Escape cancels it: in row mode the unit is the\n    // row, so a per-cell commit would be a different feature wearing this one's\n    // keys.\n    onEditorKeyDown: (event) => {\n      if (event.key === \"Enter\") {\n        event.preventDefault();\n        rowEditing.save();\n      } else if (event.key === \"Escape\") {\n        event.preventDefault();\n        rowEditing.cancel();\n      }\n    },\n    // Nothing commits on blur: the reader is moving between fields of one form.\n    commitOnBlur: () => undefined,\n    editor,\n    selectOptions: selectOptionsFor(editor),\n    validating: false,\n    errorId: `adapttable-row-edit-${column.key}`,\n    focusRef,\n  };\n\n  if (isCustomEditor(editor)) {\n    return editor.render({\n      draft: ctrl.draft,\n      setDraft: ctrl.setDraft,\n      commit: rowEditing.save,\n      cancel: rowEditing.cancel,\n      onKeyDown: ctrl.onEditorKeyDown,\n      onBlur: ctrl.commitOnBlur,\n      focusRef,\n      label: editLabel,\n      validating: false,\n      errorId: ctrl.errorId,\n    });\n  }\n  return renderEditor(ctrl);\n}\n\n/** The options a chooser editor carries, normalized. */\nfunction selectOptionsFor(editor: CellEditor) {\n  if (\n    typeof editor === \"object\" &&\n    (editor.type === \"select\" || editor.type === \"multi-select\")\n  ) {\n    return normalizeEditorOptions(editor.options);\n  }\n  return [];\n}\n\n/** Props for {@link rowEditControls}. */\nexport interface RowEditControlsOptions<TRow> {\n  /** The row-editing state from the chrome. */\n  rowEditing: RowEditingState<TRow>;\n  /** The row this control set belongs to. */\n  row: TRow;\n  /** Its stable id. */\n  rowId: string;\n  /** Labels; falls back to the built-in English. */\n  labels?: TableLabels;\n}\n\n/** What a kit needs to render the row's edit / save / cancel controls. */\nexport interface RowEditControls {\n  /** Whether this row is the one being edited. */\n  editing: boolean;\n  /** Open this row for editing. */\n  begin: () => void;\n  /** Hand the host everything that changed. */\n  save: () => void;\n  /** Throw the drafts away. */\n  cancel: () => void;\n  /** Accessible name for the control that opens the row. */\n  editLabel: string;\n  /** Accessible name for save. */\n  saveLabel: string;\n  /** Accessible name for cancel. */\n  cancelLabel: string;\n  /** Whether anything actually changed — a save with nothing to save is inert. */\n  dirty: boolean;\n}\n\n/**\n * The row-mode controls, resolved.\n *\n * A helper rather than a component because each kit renders its own buttons —\n * what is shared is which ones exist, what they are called, and what they do.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link RowEditControlsOptions}.\n * @returns The controls to render.\n */\nexport function rowEditControls<TRow>({\n  rowEditing,\n  row,\n  rowId,\n  labels,\n}: Readonly<RowEditControlsOptions<TRow>>): RowEditControls {\n  return {\n    editing: rowEditing.isEditing(rowId),\n    begin: () => {\n      rowEditing.begin(row, rowId);\n    },\n    save: rowEditing.save,\n    cancel: rowEditing.cancel,\n    editLabel: labels?.editRow ?? \"Edit row\",\n    saveLabel: labels?.saveRow ?? \"Save row\",\n    cancelLabel: labels?.cancel ?? \"Cancel\",\n    dirty: rowEditing.isDirty,\n  };\n}\n\n/** Props for an adapter {@link RowEditActions} — no slots on the public API. */\nexport interface RowEditActionsProps<\n  TRow,\n> extends RowEditControlsOptions<TRow> {\n  /** Class for the control group. */\n  className?: string;\n  /** Class for each button. */\n  buttonClassName?: string;\n}\n\n/** Kit button the row-edit chrome calls. */\nexport interface RowEditButtonProps {\n  readonly label: string;\n  readonly part: string;\n  readonly className?: string;\n  readonly onClick: (event: { stopPropagation: () => void }) => void;\n}\n\n/** Adapter-supplied controls for {@link RowEditActionsChrome}. */\nexport interface RowEditActionsSlots {\n  readonly Button: (props: RowEditButtonProps) => ReactNode;\n}\n\n/** Props for {@link RowEditActionsChrome}. */\nexport interface RowEditActionsChromeProps<\n  TRow,\n> extends RowEditActionsProps<TRow> {\n  readonly slots: RowEditActionsSlots;\n}\n\n/**\n * The row's edit / save / cancel controls.\n *\n * Layout and the shared {@link rowEditControls} contract — adapters pass the\n * buttons the end user clicks. A kit with a strong opinion about its buttons\n * can still use {@link rowEditControls} directly instead.\n *\n * @typeParam TRow - The row type.\n * @param props - See {@link RowEditActionsChromeProps}.\n * @returns The controls for this row.\n */\nexport function RowEditActionsChrome<TRow>({\n  className,\n  buttonClassName,\n  slots,\n  ...options\n}: Readonly<RowEditActionsChromeProps<TRow>>): ReactElement {\n  const controls = rowEditControls(options);\n  const Button = slots.Button;\n  if (!controls.editing) {\n    return (\n      <Button\n        label={controls.editLabel}\n        part=\"row-edit-begin\"\n        className={buttonClassName}\n        onClick={(event) => {\n          event.stopPropagation();\n          controls.begin();\n        }}\n      />\n    );\n  }\n  return (\n    <span\n      data-adapttable-part=\"row-edit-actions\"\n      className={className}\n      style={{ display: \"inline-flex\", gap: 4 }}\n    >\n      <Button\n        label={controls.saveLabel}\n        part=\"row-edit-save\"\n        className={buttonClassName}\n        onClick={(event) => {\n          event.stopPropagation();\n          controls.save();\n        }}\n      />\n      <Button\n        label={controls.cancelLabel}\n        part=\"row-edit-cancel\"\n        className={buttonClassName}\n        onClick={(event) => {\n          event.stopPropagation();\n          controls.cancel();\n        }}\n      />\n    </span>\n  );\n}\n\n/** Props for {@link BatchEditCell}. */\nexport interface BatchEditCellProps<TRow> {\n  /** The batch state from the chrome. */\n  batch: BatchEditingState<TRow>;\n  /** The row this cell belongs to. */\n  row: TRow;\n  /** Its stable id. */\n  rowId: string;\n  /** The column this cell belongs to. */\n  column: EditableColumnLike<TRow>;\n  /** The cell's display content, for a column that is not editable. */\n  display: ReactElement | string | number | null;\n  /** Accessible name for the editor (`labels.editCell`). */\n  editLabel: string;\n  /** Render the kit's own editor from a controller. */\n  renderEditor: (ctrl: EditableCellEditorCtrl) => ReactElement;\n}\n\n/**\n * One cell while a batch is being edited: always a field, never an activate\n * control.\n *\n * Batch mode's premise is that the reader is walking a list correcting values,\n * so making them open each cell first would be the friction the mode exists to\n * remove. A changed cell carries `data-changed`, which is how the reader finds\n * their way back to what they touched.\n *\n * @typeParam TRow - The row type.\n * @param props - See {@link BatchEditCellProps}.\n * @returns The field, or the display content.\n */\nexport function BatchEditCell<TRow>({\n  batch,\n  row,\n  rowId,\n  column,\n  display,\n  editLabel,\n  renderEditor,\n}: Readonly<BatchEditCellProps<TRow>>): ReactElement {\n  const editor = resolveCellEditor(column);\n  if (!editor) return <>{display}</>;\n\n  const ctrl: EditableCellEditorCtrl = {\n    draft: batch.draftFor(row, rowId, column.key),\n    setDraft: (value) => {\n      batch.setDraft(row, rowId, column.key, value);\n    },\n    // No key ends a batch: the reader is moving through a list, and Enter would\n    // send everything they have not finished.\n    onEditorKeyDown: () => undefined,\n    commitOnBlur: () => undefined,\n    editor,\n    selectOptions: selectOptionsFor(editor),\n    validating: false,\n    errorId: `adapttable-batch-edit-${rowId}-${column.key}`,\n    // Nothing steals focus: every cell is a field, and the reader chose where\n    // to start.\n    focusRef: () => undefined,\n  };\n\n  if (isCustomEditor(editor)) {\n    return editor.render({\n      draft: ctrl.draft,\n      setDraft: ctrl.setDraft,\n      commit: () => undefined,\n      cancel: () => {\n        batch.cancelRow(rowId);\n      },\n      onKeyDown: ctrl.onEditorKeyDown,\n      onBlur: ctrl.commitOnBlur,\n      focusRef: ctrl.focusRef,\n      label: editLabel,\n      validating: false,\n      errorId: ctrl.errorId,\n    });\n  }\n  return (\n    <span\n      data-adapttable-part=\"batch-edit-cell\"\n      data-changed={batch.isChanged(rowId, column.key) ? \"\" : undefined}\n    >\n      {renderEditor(ctrl)}\n    </span>\n  );\n}\n\n/** Props for an adapter {@link BatchEditBar} — no slots on the public API. */\nexport interface BatchEditBarProps<TRow> {\n  /** The batch state from the chrome. */\n  batch: BatchEditingState<TRow>;\n  /** Labels; falls back to the built-in English. */\n  labels?: TableLabels;\n  /** Class for the bar. */\n  className?: string;\n  /** Class for each button. */\n  buttonClassName?: string;\n}\n\n/** Kit button the batch-edit bar calls. */\nexport interface BatchEditButtonProps {\n  readonly label: string;\n  readonly part: string;\n  readonly className?: string;\n  readonly onClick: () => void;\n}\n\n/** Adapter-supplied controls for {@link BatchEditBarChrome}. */\nexport interface BatchEditBarSlots {\n  readonly Button: (props: BatchEditButtonProps) => ReactNode;\n}\n\n/** Props for {@link BatchEditBarChrome}. */\nexport interface BatchEditBarChromeProps<TRow> extends BatchEditBarProps<TRow> {\n  readonly slots: BatchEditBarSlots;\n}\n\n/**\n * The bar that ends a batch: how many rows are waiting, save all, cancel all.\n *\n * Rendered only while something is pending — a bar that is always there says\n * the table is in a mode, when what matters is that there are unsaved changes.\n *\n * @typeParam TRow - The row type.\n * @param props - See {@link BatchEditBarChromeProps}.\n * @returns The bar, or nothing.\n */\nexport function BatchEditBarChrome<TRow>({\n  batch,\n  labels,\n  className,\n  buttonClassName,\n  slots,\n}: Readonly<BatchEditBarChromeProps<TRow>>): ReactElement | null {\n  if (!batch.pending) return null;\n  const count = (labels?.pendingRows ?? defaultPendingRows)(batch.count);\n  const Button = slots.Button;\n  return (\n    <div\n      data-adapttable-part=\"batch-edit-bar\"\n      className={className}\n      style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5em\" }}\n    >\n      <output data-adapttable-part=\"batch-edit-count\">{count}</output>\n      <Button\n        label={labels?.saveAll ?? \"Save all\"}\n        part=\"batch-edit-save\"\n        className={buttonClassName}\n        onClick={batch.saveAll}\n      />\n      <Button\n        label={labels?.cancelAll ?? \"Cancel all\"}\n        part=\"batch-edit-cancel\"\n        className={buttonClassName}\n        onClick={batch.cancelAll}\n      />\n    </div>\n  );\n}\n\n/** \"3 unsaved rows\" — replaceable through `labels.pendingRows`. */\nfunction defaultPendingRows(count: number): string {\n  return count === 1 ? \"1 unsaved row\" : `${String(count)} unsaved rows`;\n}\n","import {\n  type ReactElement,\n  type ReactNode,\n  useLayoutEffect,\n  useRef,\n} from \"react\";\n\nimport type { ColumnDef } from \"../types\";\nimport { booleanDraft, formatMultiDraft, isCustomEditor } from \"./cellEditing\";\nimport {\n  editableCellController,\n  type EditableCellEditing,\n  focusEditorOnMount,\n  stopCellEditKeyboard,\n} from \"./editableCellController\";\nimport { BatchEditCell, RowEditCell } from \"./RowEditGate\";\n\n/** Props for a kit-native editor while a cell is active. */\nexport interface EditableCellEditorCtrl {\n  draft: string;\n  setDraft: (value: string) => void;\n  onEditorKeyDown: (event: {\n    key: string;\n    preventDefault: () => void;\n    shiftKey?: boolean;\n  }) => void;\n  commitOnBlur: () => void;\n  editor: NonNullable<ReturnType<typeof editableCellController>[\"editor\"]>;\n  selectOptions: ReturnType<typeof editableCellController>[\"selectOptions\"];\n  /**\n   * A validator's message for this cell, when the last commit was rejected.\n   * Wire it to the kit's own error surface (Mantine's `error`, MUI's\n   * `helperText`, …) — and it is on the DOM either way, see `errorId`.\n   */\n  error?: string;\n  /** Whether an async validator is still deciding. */\n  validating: boolean;\n  /**\n   * `id` of the element holding the message. Put it on the editor's\n   * `aria-describedby` so the message is announced with the field, and set\n   * `aria-invalid` when `error` is set.\n   */\n  errorId: string;\n  /**\n   * Attach as the editor's `ref` so the table decides what takes focus.\n   *\n   * In cell mode that is this editor, every time. In row mode a whole row opens\n   * at once, and only the FIRST field should take focus — nine editors each\n   * calling focus on mount would leave the reader at the last column of the row\n   * they just opened.\n   */\n  focusRef: (node: { focus: () => void } | null) => void;\n  /** A live row changed under this editor. */\n  conflict?: boolean;\n}\n\n/**\n * Whether a column is the first editable one — the field a row edit focuses.\n *\n * By column order rather than by which cell renders first, so the answer is the\n * same in a windowed body and in a reordered one.\n */\nfunction isFirstEditableColumn(\n  columns: readonly { key: string; editable?: unknown }[],\n  key: string\n): boolean {\n  const first = columns.find(\n    (column) => column.editable !== undefined && column.editable !== false\n  );\n  return first?.key === key;\n}\n\n/**\n * Opt-in cell wrapper: plain display when editing is off; double-click /\n * Enter / F2 to activate; kit supplies the editor via `renderEditor`.\n *\n * When `editing` is omitted this is a pure pass-through of `display` —\n * zero DOM / behavior change for tables that never opted into cell edit.\n */\nexport interface EditableCellGateProps<TRow> {\n  readonly editing: EditableCellEditing<TRow> | undefined;\n  readonly row: TRow;\n  readonly column: ColumnDef<TRow>;\n  readonly rowId: string;\n  readonly rows: readonly TRow[];\n  readonly columns: readonly ColumnDef<TRow>[];\n  readonly rowKey: (row: TRow) => string;\n  /** Accessible name for the activate control. */\n  readonly editLabel: string;\n  /** Optional class for the activate button (adapters' styling hook). */\n  readonly activateClassName?: string;\n  /** Optional class for the validation message (adapters' styling hook). */\n  readonly errorClassName?: string;\n  /** Optional class for a failed save's message. */\n  readonly saveErrorClassName?: string;\n  /** Optional class for the undo control beside it. */\n  readonly rollbackClassName?: string;\n  /**\n   * Label for the undo control a failed save offers (`labels.undoEdit`). Omit\n   * it and the message shows without one — right for a table that refetches\n   * rather than rolling back.\n   */\n  readonly undoLabel?: string;\n  /**\n   * Set by a kit whose own input renders the message — Mantine's `error`, MUI's\n   * `helperText`. Those components own the input's `aria-describedby`, so a\n   * second copy of the text would be both duplicated in the DOM and announced\n   * twice. The gate then renders no message of its own and leaves the ARIA to\n   * the kit.\n   */\n  readonly kitRendersError?: boolean;\n  readonly display: ReactNode;\n  /**\n   * Kit-native editor. Only called while this cell is the active edit.\n   * Wire `value`/`onChange`/`onKeyDown`/`onBlur` from the controller.\n   */\n  readonly renderEditor: (ctrl: EditableCellEditorCtrl) => ReactElement;\n  /** Kit activate control and conflict / undo buttons. */\n  readonly slots: EditableCellSlots;\n}\n\n/** Kit activate control the gate calls while the cell is idle. */\nexport interface EditableCellActivateProps {\n  readonly title: string;\n  readonly className?: string;\n  readonly saveStatus: string | undefined;\n  readonly dirty: boolean;\n  readonly activateRef: (node: HTMLButtonElement | null) => void;\n  readonly display: ReactNode;\n  readonly onDoubleClick: (event: {\n    preventDefault: () => void;\n    stopPropagation: () => void;\n  }) => void;\n  readonly onClick: (event: { stopPropagation: () => void }) => void;\n  readonly onKeyDown: (event: {\n    key: string;\n    preventDefault: () => void;\n    stopPropagation: () => void;\n  }) => void;\n}\n\n/** Kit button the gate calls for conflict choices and undo. */\nexport interface EditableCellButtonProps {\n  readonly label: string;\n  readonly part: string;\n  readonly className?: string;\n  readonly onMouseDown?: (event: { preventDefault: () => void }) => void;\n  readonly onClick: (event: { stopPropagation: () => void }) => void;\n}\n\n/** Adapter-supplied controls for {@link EditableCellGate}. */\nexport interface EditableCellSlots {\n  readonly Activate: (props: EditableCellActivateProps) => ReactNode;\n  readonly Button: (props: EditableCellButtonProps) => ReactNode;\n}\n\n/**\n * The ARIA a kit's editor needs when validation is in play.\n *\n * Spread onto the input or select: invalid marks the field, `describedby`\n * points at the message so it is read WITH the field rather than announced\n * once and lost, and busy says an async check is still deciding.\n *\n * @param ctrl - The editor controller the gate handed the kit.\n * @returns Attributes to spread; empty while the value is fine.\n */\nexport function editorValidationProps(ctrl: EditableCellEditorCtrl): {\n  \"aria-invalid\"?: true;\n  \"aria-describedby\"?: string;\n  \"aria-busy\"?: true;\n  \"data-conflict\"?: \"\";\n} {\n  return {\n    \"aria-invalid\": ctrl.error === undefined ? undefined : true,\n    \"aria-describedby\": ctrl.error === undefined ? undefined : ctrl.errorId,\n    \"aria-busy\": ctrl.validating ? true : undefined,\n    \"data-conflict\": ctrl.conflict === true ? \"\" : undefined,\n  };\n}\n\n/**\n * Busy and conflict marks, for a kit whose own input owns `aria-invalid`\n * (Mantine, MUI). `data-conflict` still belongs on the field so the same\n * selector works on every kit; `aria-describedby` points at the notice\n * while one is up.\n *\n * @param ctrl - The editor controller the gate handed the kit.\n * @returns Attributes to spread; empty unless a check is running or a\n *   conflict is being asked.\n */\nexport function editorBusyProps(ctrl: EditableCellEditorCtrl): {\n  \"aria-busy\"?: true;\n  \"aria-describedby\"?: string;\n  \"data-conflict\"?: \"\";\n} {\n  const describedBy =\n    ctrl.conflict === true ? { \"aria-describedby\": ctrl.errorId } : {};\n  return {\n    \"aria-busy\": ctrl.validating ? true : undefined,\n    ...describedBy,\n    \"data-conflict\": ctrl.conflict === true ? \"\" : undefined,\n  };\n}\n\n/** Keep mine / Take theirs — same channel as a validation message. */\nfunction ConflictNotice(\n  props: Readonly<{\n    ctrl: ReturnType<typeof editableCellController>;\n    errorId: string;\n    errorClassName?: string;\n    slots: EditableCellSlots;\n  }>\n): ReactElement | null {\n  \"use no memo\";\n  const { ctrl, errorId, errorClassName, slots } = props;\n  const Button = slots.Button;\n  if (ctrl.conflict === undefined || ctrl.conflictLabels === undefined) {\n    return null;\n  }\n  const holdFocus = (event: { preventDefault: () => void }) => {\n    event.preventDefault();\n  };\n  return (\n    <span\n      id={errorId}\n      role=\"alert\"\n      data-adapttable-part=\"edit-cell-conflict\"\n      data-conflict=\"\"\n      className={errorClassName}\n    >\n      {ctrl.conflictLabels.message}\n      <span data-adapttable-part=\"edit-cell-incoming\">\n        {ctrl.conflictLabels.theirsValue(ctrl.conflict.incomingValue)}\n      </span>\n      <Button\n        label={ctrl.conflictLabels.keepMine}\n        part=\"edit-cell-keep-mine\"\n        onMouseDown={holdFocus}\n        onClick={(event) => {\n          event.stopPropagation();\n          ctrl.keepConflict();\n        }}\n      />\n      <Button\n        label={ctrl.conflictLabels.takeTheirs}\n        part=\"edit-cell-take-theirs\"\n        onMouseDown={holdFocus}\n        onClick={(event) => {\n          event.stopPropagation();\n          ctrl.takeConflict();\n        }}\n      />\n    </span>\n  );\n}\n\n/**\n * Toggle a checkbox editor and commit in the same gesture.\n *\n * A checkbox has one gesture, so waiting for Enter or a blur would leave the\n * reader looking at a ticked box that has changed nothing. Safe to call\n * synchronously: the editing state writes its draft ref in the same tick, so the\n * commit that follows sees the new value.\n *\n * @param ctrl - The editor controller the gate handed the kit.\n * @param checked - The box's new state.\n */\nexport function commitBooleanDraft(\n  ctrl: EditableCellEditorCtrl,\n  checked: boolean\n): void {\n  ctrl.setDraft(booleanDraft(checked));\n  ctrl.commitOnBlur();\n}\n\n/**\n * The draft for a native `<select multiple>`'s current selection.\n *\n * @param select - The select element.\n * @returns The draft string the editing state holds.\n */\nexport function multiDraftFromSelect(select: HTMLSelectElement): string {\n  return formatMultiDraft(\n    [...select.selectedOptions].map((option) => option.value)\n  );\n}\n\n/** Opt out of the React Compiler: early returns swap trees of different memo sizes. */\nexport function EditableCellGate<TRow>(\n  props: EditableCellGateProps<TRow>\n): ReactElement {\n  \"use no memo\";\n  const activateRef = useRef<HTMLButtonElement>(null);\n  const restoreFocusRef = useRef(false);\n\n  const ctrl = editableCellController({\n    editing: props.editing,\n    row: props.row,\n    column: props.column,\n    rowId: props.rowId,\n    rows: props.rows,\n    columns: props.columns,\n    rowKey: props.rowKey,\n  });\n\n  useLayoutEffect(() => {\n    if (!restoreFocusRef.current || ctrl.mode !== \"activatable\") return;\n    restoreFocusRef.current = false;\n    activateRef.current?.focus();\n  });\n\n  // A batch turns every editable cell into a field: the reader is walking a\n  // list correcting values, and opening each cell first is the friction the\n  // mode exists to remove.\n  const batch = props.editing?.batch;\n  if (batch) {\n    return (\n      <BatchEditCell\n        batch={batch}\n        row={props.row}\n        rowId={props.rowId}\n        column={props.column}\n        display={<>{props.display}</>}\n        editLabel={props.editLabel}\n        renderEditor={props.renderEditor}\n      />\n    );\n  }\n\n  // A row being edited as one unit owns every cell in it: the per-cell activate\n  // control would be a second way to start an edit that is already open.\n  const rowEditing = props.editing?.rowEditing;\n  if (rowEditing?.isEditing(props.rowId) === true) {\n    return (\n      <RowEditCell\n        rowEditing={rowEditing}\n        column={props.column}\n        display={<>{props.display}</>}\n        editLabel={props.editLabel}\n        takesFocus={isFirstEditableColumn(props.columns, props.column.key)}\n        renderEditor={props.renderEditor}\n      />\n    );\n  }\n\n  if (ctrl.mode === \"display\") {\n    return <>{props.display}</>;\n  }\n\n  const errorId = `adapttable-edit-error-${props.rowId}-${props.column.key}`;\n\n  /** Hand the reader's keys to the table, and focus back to the cell after. */\n  const onEditorKeyDown = (event: {\n    key: string;\n    preventDefault: () => void;\n    shiftKey?: boolean;\n  }) => {\n    // Escape cancels, Enter commits — BOTH must hand keyboard focus\n    // back to the activate button, or it falls to <body>. (Tab moves\n    // to the next editable cell, which manages its own focus.)\n    if (event.key === \"Escape\" || event.key === \"Enter\") {\n      restoreFocusRef.current = true;\n    }\n    ctrl.onEditorKeyDown(event);\n  };\n\n  // A column that brought its own component renders it here rather than in each\n  // kit: activation, focus, the keyboard flow, validation and the commit are\n  // all the table's either way, so nine copies of this branch would differ only\n  // in which file they sat in.\n  if (ctrl.mode === \"editing\" && isCustomEditor(ctrl.editor)) {\n    const custom = ctrl.editor.render({\n      draft: ctrl.draft,\n      setDraft: ctrl.setDraft,\n      commit: () => {\n        restoreFocusRef.current = true;\n        ctrl.commit();\n      },\n      cancel: () => {\n        restoreFocusRef.current = true;\n        ctrl.cancel();\n      },\n      onKeyDown: onEditorKeyDown,\n      onBlur: ctrl.commitOnBlur,\n      focusRef: focusEditorOnMount,\n      label: props.editLabel,\n      error: ctrl.error,\n      validating: ctrl.validating,\n      errorId,\n    });\n    return (\n      <>\n        {custom}\n        <ConflictNotice\n          ctrl={ctrl}\n          errorId={errorId}\n          errorClassName={props.errorClassName}\n          slots={props.slots}\n        />\n        {/* A kit that renders its own message does so through its own input,\n            and a custom editor has none — so the message is always the gate's\n            here, whatever the kit does for the built-in editors. */}\n        {ctrl.conflict === undefined && ctrl.error !== undefined && (\n          <span\n            id={errorId}\n            role=\"alert\"\n            data-adapttable-part=\"edit-cell-error\"\n            className={props.errorClassName}\n          >\n            {ctrl.error}\n          </span>\n        )}\n      </>\n    );\n  }\n\n  if (ctrl.mode === \"editing\" && ctrl.editor) {\n    return (\n      <>\n        {props.renderEditor({\n          draft: ctrl.draft,\n          setDraft: ctrl.setDraft,\n          onEditorKeyDown,\n          commitOnBlur: ctrl.commitOnBlur,\n          editor: ctrl.editor,\n          selectOptions: ctrl.selectOptions,\n          error: ctrl.error,\n          validating: ctrl.validating,\n          errorId,\n          conflict: ctrl.conflict !== undefined,\n          // One cell, so this editor is what takes focus.\n          focusRef: focusEditorOnMount,\n        })}\n        <ConflictNotice\n          ctrl={ctrl}\n          errorId={errorId}\n          errorClassName={props.errorClassName}\n          slots={props.slots}\n        />\n        {/* The message is in the DOM whatever the kit does with `error`, and\n            it is a live region so it is heard the moment it appears — a\n            rejected commit that only paints red says nothing to a reader who\n            cannot see it. A conflict uses the same channel, so this span stays\n            off while that notice is up. */}\n        {ctrl.conflict === undefined &&\n          ctrl.error !== undefined &&\n          props.kitRendersError !== true && (\n            <span\n              id={errorId}\n              role=\"alert\"\n              data-adapttable-part=\"edit-cell-error\"\n              className={props.errorClassName}\n            >\n              {ctrl.error}\n            </span>\n          )}\n      </>\n    );\n  }\n\n  const Activate = props.slots.Activate;\n  const Button = props.slots.Button;\n  return (\n    <>\n      <Activate\n        title={props.editLabel}\n        className={props.activateClassName}\n        saveStatus={ctrl.saveStatus}\n        dirty={ctrl.isDirty}\n        activateRef={(node) => {\n          activateRef.current = node;\n        }}\n        display={props.display}\n        onDoubleClick={(event) => {\n          event.preventDefault();\n          event.stopPropagation();\n          ctrl.begin();\n        }}\n        onClick={(event) => {\n          event.stopPropagation();\n        }}\n        onKeyDown={(event) => {\n          if (event.key === \"Enter\" || event.key === \"F2\") {\n            event.preventDefault();\n            stopCellEditKeyboard(event);\n            ctrl.begin();\n          }\n        }}\n      />\n      {ctrl.saveFailure && (\n        <span\n          role=\"alert\"\n          data-adapttable-part=\"edit-cell-save-error\"\n          className={props.saveErrorClassName}\n        >\n          {ctrl.saveFailure.message}\n          {ctrl.canRollback && props.undoLabel !== undefined ? (\n            <Button\n              label={props.undoLabel}\n              part=\"edit-cell-rollback\"\n              className={props.rollbackClassName}\n              onClick={(event) => {\n                event.stopPropagation();\n                ctrl.rollback();\n              }}\n            />\n          ) : null}\n        </span>\n      )}\n    </>\n  );\n}\n","/**\n * Undo and redo, without the table ever owning the data.\n *\n * The boundary is the whole design: AdaptTable never mutates rows, so it\n * cannot \"restore\" anything. What it can do is remember the value a cell held\n * before an edit and, on undo, COMMIT that value back through `onCellEdit` —\n * the same call the original edit made. Everything the host wrapped around\n * editing (validation, a mutation, an optimistic update, a toast) runs on the\n * way back exactly as it ran on the way out.\n *\n * A gesture is one entry, not one cell. Pasting two hundred cells and pressing\n * undo once puts all two hundred back, because that is what a person means by\n * \"undo that paste\" — and it is why the batch routes come through here rather\n * than each cell recording itself.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport type { CellEdit } from \"../focus/cellEdits\";\nimport type { ColumnDef } from \"../types\";\nimport { getPath } from \"../utils/path\";\n\n/** One undoable gesture: what it wrote, and what was there before. */\nexport interface EditHistoryEntry<TRow> {\n  /** The edits the gesture made, in the order it made them. */\n  redo: readonly CellEdit<TRow>[];\n  /** The values those cells held before it — the inverse, in the same order. */\n  undo: readonly CellEdit<TRow>[];\n}\n\n/** What {@link useEditHistory} needs. */\nexport interface UseEditHistoryOptions<TRow> {\n  /** Off unless the host asked for it; when false nothing is recorded. */\n  enabled: boolean;\n  /** How many gestures to remember. Defaults to 50. */\n  depth?: number;\n  /** The columns, for reading a cell's value before it changes. */\n  columns: readonly ColumnDef<TRow>[];\n  /** The host's commit channel — every replay goes back out through it. */\n  onCellEdit?: (row: TRow, key: string, nextValue: unknown) => unknown;\n}\n\n/** What {@link useEditHistory} returns. */\nexport interface EditHistoryState<TRow> {\n  /**\n   * Whether the host armed a history at all.\n   *\n   * `canUndo` answers \"is there something to put back\", which is false\n   * both when the feature is off and when nothing has been edited yet.\n   * Chrome that should not exist without a history needs the other\n   * question, and this is it.\n   */\n  enabled: boolean;\n  /** Whether anything can be undone right now. */\n  canUndo: boolean;\n  /** Whether anything can be redone right now. */\n  canRedo: boolean;\n  /**\n   * Put the last gesture back, through the host's own commit channel.\n   *\n   * @returns How many cells were restored; zero when there was nothing to undo.\n   */\n  undo: () => number;\n  /**\n   * Do the last undone gesture again.\n   *\n   * @returns How many cells were rewritten; zero when there was nothing to redo.\n   */\n  redo: () => number;\n  /** Forget everything — what a host calls when the data is replaced. */\n  clear: () => void;\n  /**\n   * Record a batch as ONE gesture and apply it. Returns the edits so a caller\n   * can keep chaining; applies nothing when history is off, in which case the\n   * caller's own handler still runs.\n   */\n  record: (edits: readonly CellEdit<TRow>[]) => void;\n}\n\n/**\n * The value a cell holds right now, unstringified.\n *\n * The editor's seed is a string because an input needs one; an undo needs the\n * VALUE, so that putting back the number 10 does not put back `\"10\"`. Same\n * priority the editor uses otherwise: an explicit `editValue`, then\n * `sortValue`, then the key's data path.\n *\n * @typeParam TRow - The row type.\n * @param row - The row being read.\n * @param column - The column being read.\n * @returns The current value, in whatever type the row holds it.\n */\nexport function readCellValue<TRow>(\n  row: TRow,\n  column: ColumnDef<TRow>\n): unknown {\n  if (column.editValue) return column.editValue(row);\n  if (column.sortValue) return column.sortValue(row);\n  return getPath(row, column.key);\n}\n\n/** The default number of gestures remembered — deep enough to feel infinite. */\nconst DEFAULT_DEPTH = 50;\n\n/**\n * Remember edits so they can be replayed backwards.\n *\n * @typeParam TRow - The row type.\n * @param options - See {@link UseEditHistoryOptions}.\n * @returns The history controls; inert when `enabled` is false.\n */\nexport function useEditHistory<TRow>(\n  options: UseEditHistoryOptions<TRow>\n): EditHistoryState<TRow> {\n  const { enabled, depth = DEFAULT_DEPTH, columns, onCellEdit } = options;\n  const past = useRef<EditHistoryEntry<TRow>[]>([]);\n  const future = useRef<EditHistoryEntry<TRow>[]>([]);\n  // Depth counts are state because buttons enable and disable on them; the\n  // stacks themselves are refs, since nothing renders from their contents.\n  const [counts, setCounts] = useState({ past: 0, future: 0 });\n  const sync = useCallback(() => {\n    setCounts({ past: past.current.length, future: future.current.length });\n  }, []);\n\n  const columnFor = useCallback(\n    (key: string) => columns.find((column) => column.key === key),\n    [columns]\n  );\n\n  const record = useCallback(\n    (edits: readonly CellEdit<TRow>[]) => {\n      if (!enabled || edits.length === 0) return;\n      const undo = edits.flatMap((edit) => {\n        const column = columnFor(edit.columnKey);\n        return column\n          ? [\n              {\n                row: edit.row,\n                columnKey: edit.columnKey,\n                value: readCellValue(edit.row, column),\n              },\n            ]\n          : [];\n      });\n      past.current = [...past.current, { redo: edits, undo }].slice(-depth);\n      // A new edit ends the redo line, exactly as it does in an editor: the\n      // future that was undone is no longer reachable from here.\n      future.current = [];\n      sync();\n    },\n    [enabled, depth, columnFor, sync]\n  );\n\n  const replay = useCallback(\n    (edits: readonly CellEdit<TRow>[]) => {\n      for (const edit of edits) {\n        onCellEdit?.(edit.row, edit.columnKey, edit.value);\n      }\n      return edits.length;\n    },\n    [onCellEdit]\n  );\n\n  const undo = useCallback(() => {\n    const entry = past.current.at(-1);\n    if (!entry) return 0;\n    past.current = past.current.slice(0, -1);\n    future.current = [...future.current, entry];\n    sync();\n    return replay(entry.undo);\n  }, [replay, sync]);\n\n  const redo = useCallback(() => {\n    const entry = future.current.at(-1);\n    if (!entry) return 0;\n    future.current = future.current.slice(0, -1);\n    past.current = [...past.current, entry];\n    sync();\n    return replay(entry.redo);\n  }, [replay, sync]);\n\n  const clear = useCallback(() => {\n    past.current = [];\n    future.current = [];\n    sync();\n  }, [sync]);\n\n  return useMemo(\n    () => ({\n      enabled,\n      canUndo: enabled && counts.past > 0,\n      canRedo: enabled && counts.future > 0,\n      undo,\n      redo,\n      clear,\n      record,\n    }),\n    [enabled, counts, undo, redo, clear, record]\n  );\n}\n\n/** The props a table needs for its history — the `editHistory` prop, resolved. */\nexport interface TableEditHistoryProps<TRow> {\n  /** The `editHistory` prop as the host wrote it. */\n  editHistory?: boolean | { depth?: number };\n  /** The columns, for reading a cell's value before it changes. */\n  columns: readonly ColumnDef<TRow>[];\n  /** The host's commit channel. */\n  onCellEdit?: (row: TRow, key: string, nextValue: unknown) => unknown;\n}\n\n/**\n * The history a `<DataTable>` runs, plus the commit channel to hand the chrome.\n *\n * The returned `onCellEdit` records each inline commit as a one-cell gesture\n * before passing it on. Batch routes (paste, fill) must NOT go through it —\n * they record themselves through {@link asGesture}, so that two hundred pasted\n * cells undo in one press rather than two hundred.\n *\n * Both the shell and the antd adapter build their chrome this way, and this is\n * the one place the rule lives.\n *\n * @typeParam TRow - The row type.\n * @param props - See {@link TableEditHistoryProps}.\n * @returns The history state and the commit channel to give the chrome.\n */\nexport function useTableEditHistory<TRow>(props: TableEditHistoryProps<TRow>): {\n  history: EditHistoryState<TRow>;\n  onCellEdit:\n    | ((row: TRow, key: string, nextValue: unknown) => unknown)\n    | undefined;\n} {\n  const { editHistory, columns, onCellEdit } = props;\n  const history = useEditHistory<TRow>({\n    enabled: editHistory !== undefined && editHistory !== false,\n    depth: typeof editHistory === \"object\" ? editHistory.depth : undefined,\n    columns,\n    onCellEdit,\n  });\n  const record = history.record;\n  const recording = useCallback(\n    (row: TRow, key: string, nextValue: unknown) => {\n      record([{ row, columnKey: key, value: nextValue }]);\n      // Hand back whatever the host returned: a promise is how a cell knows the\n      // value is still on its way somewhere, and swallowing it here would make\n      // every save look instant.\n      return onCellEdit?.(row, key, nextValue);\n    },\n    [record, onCellEdit]\n  );\n  return { history, onCellEdit: onCellEdit ? recording : undefined };\n}\n\n/**\n * Wrap a batch handler so the whole batch is one undo entry.\n *\n * Recording happens before the handler runs: the inverse is read from the rows\n * as they are NOW, and a host that applies the edits synchronously would\n * otherwise have already changed them.\n *\n * @typeParam TRow - The row type.\n * @param apply - The resolved handler, or `undefined` when nothing receives it.\n * @param record - The history recorder.\n * @returns The wrapped handler, or `undefined` when there was none to wrap.\n */\nexport function asGesture<TRow>(\n  apply: ((edits: CellEdit<TRow>[]) => void) | undefined,\n  record: (edits: readonly CellEdit<TRow>[]) => void\n): ((edits: CellEdit<TRow>[]) => void) | undefined {\n  if (!apply) return undefined;\n  return (edits) => {\n    record(edits);\n    apply(edits);\n  };\n}\n","/**\n * Pinned rows, in the URL.\n *\n * Which rows stay put is part of what a shared link means — \"look at these\n * two, they stay on screen\". Pair it with `<DataTable pinnedRowIds\n * onPinnedRowIdsChange>` and the lists travel with the address. The\n * batteries-included shell also writes this when pinning is armed and the\n * host has not taken control.\n */\nimport { useCallback, useMemo, useState, useSyncExternalStore } from \"react\";\n\nimport { EMPTY_ROW_PIN_STATE, type RowPinState } from \"../rows/rowPinning\";\nimport { type UrlStateAdapter, useResolvedAdapter } from \"./adapter\";\nimport { readRowPins, writeRowPins } from \"./serialize\";\n\n/** What {@link useRowPinningUrlState} needs. */\nexport interface UseRowPinningUrlStateOptions {\n  /** URL backend; defaults to the History API. */\n  urlAdapter?: UrlStateAdapter;\n  /** Sync to the URL at all. Defaults to `true`. */\n  urlSync?: boolean;\n  /** Namespace, when several tables share a page. */\n  urlKey?: string;\n}\n\n/** The controlled pair `<DataTable>` takes. */\nexport interface UseRowPinningUrlStateResult {\n  /** The pin lists. */\n  pinnedRowIds: RowPinState;\n  /** Hand this to `onPinnedRowIdsChange`. */\n  onPinnedRowIdsChange: (next: RowPinState) => void;\n}\n\n/**\n * Keep pinned rows in the URL.\n *\n * @param options - See {@link UseRowPinningUrlStateOptions}.\n * @returns The controlled pair to spread onto the table.\n */\nexport function useRowPinningUrlState(\n  options: UseRowPinningUrlStateOptions = {}\n): UseRowPinningUrlStateResult {\n  const { urlAdapter, urlSync, urlKey } = options;\n  const ns = urlKey ? `${urlKey}.` : \"\";\n  const resolved = useResolvedAdapter(urlAdapter, urlSync ?? true);\n  const search = useSyncExternalStore(\n    (onChange) => resolved.subscribe(onChange),\n    () => resolved.getSearch(),\n    () => (urlAdapter ? urlAdapter.getSearch() : \"\")\n  );\n  const [pending, setPending] = useState<RowPinState | null>(null);\n\n  const pinnedRowIds = useMemo(() => {\n    if (pending) return pending;\n    return readRowPins(new URLSearchParams(search), ns) ?? EMPTY_ROW_PIN_STATE;\n  }, [ns, pending, search]);\n\n  const onPinnedRowIdsChange = useCallback(\n    (next: RowPinState) => {\n      setPending(next);\n      const params = new URLSearchParams(resolved.getSearch());\n      writeRowPins(params, next, ns);\n      resolved.setSearch(params.toString());\n      setPending(null);\n    },\n    [ns, resolved]\n  );\n\n  return { pinnedRowIds, onPinnedRowIdsChange };\n}\n"],"mappings":"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"}