argus-table 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/argus-column.js +24 -1
- package/dist/argus-column.js.map +1 -1
- package/dist/argus-table.js +1026 -167
- package/dist/argus-table.js.map +1 -1
- package/dist/cdn/argus-table.js +74 -50
- package/dist/cdn/argus-table.js.map +1 -1
- package/dist/controllers/auto-width.js +11 -0
- package/dist/controllers/auto-width.js.map +1 -1
- package/dist/controllers/column-window.js +139 -0
- package/dist/controllers/column-window.js.map +1 -0
- package/dist/controllers/data-controller.js +9 -4
- package/dist/controllers/data-controller.js.map +1 -1
- package/dist/controllers/plugins.js +102 -0
- package/dist/controllers/plugins.js.map +1 -0
- package/dist/controllers/reorder-drag.js +9 -10
- package/dist/controllers/reorder-drag.js.map +1 -1
- package/dist/controllers/row-measure.js +121 -0
- package/dist/controllers/row-measure.js.map +1 -0
- package/dist/controllers/virtual-controller.js +316 -10
- package/dist/controllers/virtual-controller.js.map +1 -1
- package/dist/core/src/columns/column-order.js +14 -10
- package/dist/core/src/columns/column-order.js.map +1 -1
- package/dist/core/src/columns/resolve-columns.js +18 -4
- package/dist/core/src/columns/resolve-columns.js.map +1 -1
- package/dist/core/src/data/page-cache.js +4 -0
- package/dist/core/src/data/page-cache.js.map +1 -1
- package/dist/core/src/filters/filter.js +185 -0
- package/dist/core/src/filters/filter.js.map +1 -0
- package/dist/core/src/state/selection.js +70 -0
- package/dist/core/src/state/selection.js.map +1 -0
- package/dist/core/src/table/create-table.js +239 -64
- package/dist/core/src/table/create-table.js.map +1 -1
- package/dist/core/src/table/filtered-row-model.js +48 -0
- package/dist/core/src/table/filtered-row-model.js.map +1 -0
- package/dist/core/src/table/sorted-row-model.js +13 -2
- package/dist/core/src/table/sorted-row-model.js.map +1 -1
- package/dist/core/src/virtual/column-window.js +72 -0
- package/dist/core/src/virtual/column-window.js.map +1 -0
- package/dist/core/src/virtual/row-pool.js +2 -1
- package/dist/core/src/virtual/row-pool.js.map +1 -1
- package/dist/core/src/virtual/row-sizes.js +156 -0
- package/dist/core/src/virtual/row-sizes.js.map +1 -0
- package/dist/core/src/virtual/scroll-scale.js +41 -3
- package/dist/core/src/virtual/scroll-scale.js.map +1 -1
- package/dist/custom-elements.json +1320 -74
- package/dist/events.js +9 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +609 -74
- package/dist/index.js +3 -2
- package/dist/interactive.js +22 -0
- package/dist/interactive.js.map +1 -0
- package/dist/max-height.js +22 -8
- package/dist/max-height.js.map +1 -1
- package/dist/render/body.js +47 -7
- package/dist/render/body.js.map +1 -1
- package/dist/render/cells.js +14 -11
- package/dist/render/cells.js.map +1 -1
- package/dist/render/content-directive.js +115 -0
- package/dist/render/content-directive.js.map +1 -0
- package/dist/render/content.js +20 -9
- package/dist/render/content.js.map +1 -1
- package/dist/render/header.js +24 -5
- package/dist/render/header.js.map +1 -1
- package/dist/render/pinned-rows.js +1 -1
- package/dist/render/pinned-rows.js.map +1 -1
- package/dist/styles/base.js +1 -1
- package/dist/styles/base.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argus-table.js","names":["t","e","s","o","n","r","i","S","c","i","e","h","r","o","n","a","c","l","p","d","u","f","b","y","t","s","t","i","s","e","h","o","n","r","l","c","u","d","f","v","m","p","M","j","s","i","t","e","r","o","t","o","e","t","r","n","t","e","i","o","r","e","n","t","ReactiveElement","templateContent","_decorate","property","customElement","n","i","e","r","s","t","memo","orderByColumnPinning","orderByColumnPinning","o","c","u","s","t","r","l","p","h","v","o","i","n","f","e","nothing","styleMap","repeat","nothing","repeat","repeat","nothing","nothing","repeat","nothing","styleMap","LitElement","_decorate","property","customElement","t$4","e$4","s$3","o$6","n$5","o","t","e","s","r$4","i$6","S$1","n","c$4","i$5","e$3","h$2","r$3","o$5","n$4","a$1","c$3","l$2","p$2","d$2","u$3","i","f$2","b$1","y$1","h","r","t$3","i$4","s$2","e$2","h$1","o$4","n$3","r$2","l$1","c$2","a","u$2","d$1","f$1","v$1","_","m$1","p$1","g","$","y","b","E","A","C","P","V","N","l","c","u","d","f","x","S","v","I","L","z","H","M$1","R","k","Z","j$1","B","D","s$1","i$3","\"finalized\"","o$3","t$2","o$2","r$1","n$2","t$1","e$1","i$2","o$1","__decorate","target","desc","key","decorators","watchers","watchColumns","host","onChange","unwatchColumns","notify","parent","widthConverter","value","text","match","flagConverter","ArgusColumn","_args","#parent","#children","#def","template","n$1","i$1","pathCache","readPath","keys","path","source","finite","resolveColumns","seen","defs","def","index","minWidth","maxWidth","clamp","px","pin","flex","width","auto","fixed","base","getValue","accessor","row","groupOf","column","normalizeOrder","byId","columns","listed","groups","id","order","moveColumn","columnId","to","current","pinOf","group","first","last","next","functionalUpdate","updater","input","cloneState","proto","copy","makeObjectMap","hasOwn","obj","makeStateUpdater","instance","old","isPlainContainer","getEnumerableOwnKeys","MAX_STATE_COMPARE_DEPTH","stateSlicesEqual","stateSlicesEqualAtDepth","depth","keysA","keysB","recordA","recordB","setStateSlice","onChangeKey","isEqual","isFunction","flattenBy","flat","recurse","subArr","item","children","getChildren","arr","memo$1","deps","result","onBeforeCompare","newDeps","memoDeps","depArgs","depsChanged","onAfterCompare","onBeforeUpdate","fn","onAfterUpdate","skipFirstRun","hasRun","tableMemo","memoOptions","debugOptions","table","schedule","untrack","getFunctionNameInfo","parentName","fnKey","staticFnName","splitBy","assignTableAPIs","apis","assignPrototypeAPIs","memoKey","args","self","callMemoOrStaticFn","staticFn","cell_getValue","cell","cell_renderValue","cell_getContext","coreCellsFeature","prototype","getColumnPrototype","features","constructColumn","resolvedColumnDef","columnDef","accessorKey","accessorKeyString","accessorFn","originalRow","columnPrototype","initFns","getIsColumnVisible","getVisibleLeafColumns","getVisibleCells","getVisibleCellsByColumnId","orderLeafColumns","orderedTable","leafColumns","orderByColumnPinning$1","items","getColumnId","getItemsByColumnId","getPinnedVisibleLeafColumns","position","expandRowModel","rowModel","autoResetExpanded","autoResetPageIndex","autoResetSorting","autoResetCellSelection","column_getFlatColumns","col","column_getLeafColumns","table_getDefaultColumnDef","props","feature","constructColumns","columnDefs","groupingColumnDef","table_getAllColumns","table_getAllFlatColumns","table_getAllFlatColumnsById","flatColumns","table_getAllLeafColumns","table_getAllLeafColumnsById","table_getColumn","coreColumnsFeature","getHeaderPrototype","constructHeader","headerPrototype","header","options","getMaxHeaderDepth","maxDepth","formatHeaderGroupId","headerFamily","formatHeaderId","childHeaderId","countPendingHeadersForColumn","count","headers","constructHeaderGroup","headerGroup","pendingParentHeaders","headersToGroup","headerToGroup","latestPendingParentHeader","isLeafHeader","isPlaceholder","headerGroupInitFns","headerGroups","updateHeaderSpans","colSpan","j","child","rowSpan","chainChild","buildHeaderGroups","allColumns","bottomHeaders","columnsToGroup","collectLeafHeaders","leafHeaders","header_getLeafHeaders","header_getContext","table_getHeaderGroups","table_getFooterGroups","table_getFlatHeaders","table_getLeafHeaders","topHeaders","coreHeadersFeature","getRowPrototype","constructRow","rowPrototype","rowIndex","original","parentId","subRows","createCoreRowModel","_createCoreRowModel","accessRows","rows","originalRows","parentRow","data","table_getCoreRowModel","table_getPreFilteredRowModel","table_getFilteredRowModel","table_getPreGroupedRowModel","table_getGroupedRowModel","table_getPreSortedRowModel","table_getSortedRowModel","table_getPreExpandedRowModel","table_getExpandedRowModel","table_getPrePaginatedRowModel","table_getPaginatedRowModel","table_getRowModel","coreRowModelsFeature","getCellPrototype","constructCell","cellPrototype","row_getDisplayIndex","displayIndex","table_getRowsInDisplayOrder","row_getValue","row_getUniqueValues","row_renderValue","row_getLeafRows","table_getMaxSubRowDepth","row_getParentRow","row_getParentRows","parentRows","currentRow","row_getAllCells","cache","cells","row_getAllCellsByColumnId","table_getRowId","table_getRow","searchAll","rowId","coreRowsFeature","table_syncExternalStateToBaseAtoms","currentState","externalState","state","capturedState","baseAtom","rawExternalState","compare","table_publishExternalState","table_reset","snap","table_mergeOptions","newOptions","mergedOptions","descriptors","atoms","initialState","table_setOptions","coreFeatures","tableFeatures","atomToStore","store","atom","createReactiveSystem","link","prevDep","sub","dep","nextDep","version","prevSub","newLink","unlink","nextSub","unwatched","propagate","stack","flags","isValidLink","subSubs","checkDirty","checkDepth","dirty","update","subs","shallowPropagate","firstSub","hasMultipleSubs","checkLink","toObserver","isObserver","nextHandler","errorHandler","completionHandler","queuedEffects","cycle","effect","purgeDeps","notifyIndex","queuedEffectsLength","activeSub","batchDepth","batch","flush","depsTail","createAtom","isComputed","valueOrFn","getter","obs","observerOrFn","observed","oldValue","newValue","run","effectObj","shallow","objA","objB","getOwnKeys","getInitialTableState","constructTable","_reactivity","tableOptions","_columnMeta","_filterMeta","_tableMeta","featuresList","atomKey","_atom","wrappedAtom","syncExternal","syncAtomToWrappedSub","syncWrappedToAtomSub","stateKeys","externalAtom","reactiveState","controlledState","controlledValue","snapshot","getDefaultColumnPinningState","column_pin","columnIds","table_setColumnPinning","column_getCanPin","leafColumn","column_getIsPinned","start","end","column_getPinnedIndex","row_getCenterVisibleCells","allCells","startAndEnd","row_getStartVisibleCells","allVisibleCells","row_getEndVisibleCells","table_resetColumnPinning","defaultState","table_getIsSomeColumnsPinned","pinningState","table_getStartHeaderGroups","leafColumnsById","orderedLeafColumns","table_getEndHeaderGroups","table_getCenterHeaderGroups","table_getStartFooterGroups","table_getEndFooterGroups","table_getCenterFooterGroups","table_getStartFlatHeaders","leftHeaderGroups","table_getEndFlatHeaders","rightHeaderGroups","table_getCenterFlatHeaders","centerHeaderGroups","table_getStartLeafHeaders","table_getEndLeafHeaders","table_getCenterLeafHeaders","table_getStartLeafColumns","table_getEndLeafColumns","table_getCenterLeafColumns","table_getPinnedLeafColumns","table_getStartVisibleLeafColumns","table_getEndVisibleLeafColumns","table_getCenterVisibleLeafColumns","table_getPinnedVisibleLeafColumns","orderByColumnPinning","columnPinning","itemsByColumnId","ordered","columnPinningFeature","getDefaultColumnSizingState","getDefaultColumnSizingColumnDef","column_getSize","defaultSizes","columnSizing","columnSize","buildColumnOffsets","starts","afters","sizes","size","after","table_getColumnOffsets","toOffsetsKey","column_getStart","column_getAfter","column_resetSize","table_setColumnSizing","rest","sumHeaderSize","sum","header_getSize","header_getStart","prevSiblingHeader","table_resetColumnSizing","sumColumnSizes","table_getTotalSize","table_getStartTotalSize","table_getCenterTotalSize","table_getEndTotalSize","columnSizingFeature","reSplitAlphaNumeric","constructSortFn","sortFn","dataValueA","rowA","dataValueB","rowB","resolveDataValue","sortFn_alphanumeric","toString","dataValue","compareAlphanumeric","sortFn_text","compareBasic","sortFn_datetime","toDateSortValue","sortFn_basic","ai","bi","aLen","aStr","bLen","bStr","aIsNumeric","isDigit","bIsNumeric","aEnd","findChunkEnd","bEnd","stringComparison","compareStringChunks","numericComparison","compareNumericChunks","countRemainingChunks","charCode","str","isNumeric","aLength","aStart","bLength","bStart","minLength","aCode","bCode","aSignificantStart","bSignificantStart","aSignificantLength","bSignificantLength","an","parseSmallInt","bn","getDefaultSortingState","table_setSorting","table_resetSorting","table_autoResetSorting","column_getAutoSortFn","sortFns","firstRows","sortFnName","isString","column_getAutoSortDir","column_getSortFn","column_toggleSorting","nextSortingOrder","column_getNextSortingOrder","multi","column_getCanMultiSort","hasManualValue","existingIndex","existingSorting","newSorting","sortAction","nextDesc","isMultiMode","column_getFirstSortDir","firstSortDirection","isSorted","column_getIsSorted","column_getCanSort","columnSort","column_getSortIndex","column_clearSorting","column_getToggleSortingHandler","canSort","rowSortingFeature","storeReactivityBindings","sortedRowModel","sorting","prev","model","sortRows","sortKeys","read","resolve","sortUndefined","sorted","sign","defaultRowId","toTanStack","createTableModel","initial","resolved","tanStackById","views","sizing","sizingState","merged","orderState","rowViews","indexById","orderedColumns","pinned","side","buildViews","center","view","sort","entry","clamped","RowLayout","top","body","bottom","section","ariaRowIndex","controllable","controlled","RowPool","#size","#pinned","#slots","keep","ids","slot","#free","entries","ScrollScale","logical","#logical","cap","#cap","#landed","range","physical","landed","total","max","maxVisibleRows","viewHeight","rowHeight","steadyWindow","visible","maxVisible","endIndex","startIndex","overscan","PageCache","#getRowId","#rowCount","#totalKnown","#pages","#indexById","#failed","pages","page","#inFlight","asked","#drop","#setCount","known","region","announce","doc","message","measureColumns","wanted","widths","root","AutoWidths","#state","#fontsPending","#requestUpdate","requestUpdate","kept","due","hasLoadedRows","measured","fontsLoading","#remeasureAfterFonts","any","ColumnChildrenController","#host","#dirty","#defs","DataController","#timer","#abortAll","#range","#cache","#config","#reset","moved","#load","errors","#errors","carry","controller","#requests","margin","#fetch","pending","error","response","SETTLE_MS","PinScrollController","#scroller","scroller","#attach","#attached","#onScroll","#resize","shadow","#left","dropTarget","from","slots","draggedId","gap","direction","at","THRESHOLD","EDGE","MAX_SPEED","INTERACTIVE","canStartReorder","down","startReorderDrag","startX","startY","dragging","frame","same","tick","area","speed","listeners","cleanup","event","move","up","swallowClick","cancel","listen","stop","remove","released","startResizeDrag","onWidth","startWidth","handle","TableController","getMeasurementKey","createLazyMeasurementsView","prop","receiver","memo","opts","isInitial","memoizedFunction","getDeps","notUndefined","msg","approxEqual","debounce","timeoutId","targetWindow","ms","classifyScrollEvent","isScrolling","pendingWrite","offset","scrollOffset","elementMax","holdOffset","clampedMaxAtWrite","isAnimating","phase","externalRetiresCommand","kind","command","FLING_WINDOW_MS","flingSpedUp","samples","mid","recent","before","flingCaught","_isIOSResult","isIOSWebKit","mtp","_iosMomentumOverridesWritesResult","iosMomentumOverridesWrites","momentumOverridesWrites","touchListenerOptions","IosGesture","ownReadBack","external","win","onTouchStart","onTouchEnd","tail","getRect","element","clientWidth","clientHeight","createFrameQueue","defaultKeyExtractor","defaultRangeExtractor","len","observeElementRect","handler","rect","cb","height","frames","observer","addEventListenerOptions","supportsScrollend","observeOffset","registerScrollendEvent","fallback","readOffset","createHandler","endHandler","observeElementOffset","horizontal","el","isRtl","measureElement","box","cachedSize","elementScroll","_a","adjustedOffset","adjustments","isRtlElement","scrollElement","initialScrollPhase","behavior","atTarget","isSmoothScroll","isAppendWithTrim","nextCount","firstKey","getNextKey","removedKeys","removedCount","prevCount","getPreviousKey","retainedCount","Virtualizer","now","_b","_ro","_frames","delivering","observeQueued","pendingObservations","get","measureEntry","node","cacheKey","cachedNode","opts2","prevOptions","anchor","followOnAppend","edgeKeysChanged","measurements","previousItems","prevFirstKey","prevLastKey","anchorDelta","anchorKey","anchorOffset","newMeasurements","idx","getItemKey","anchorItem","newOffset","sync","cached","wasOverscrolled","elementOffset","prevOffset","prevDirection","queued","sample","maxAtWrite","lanes","itemSizeCache","enabled","min","need","runningStart","paddingStart","scrollMargin","prevIdx","measuredSize","laneLastIndex","laneEnds","filledLanes","m","cachedLane","lane","shouldCacheLane","laneAssignmentMode","prevIndex","prevInLane","bestLane","bestEnd","bestIdx","outerSize","maxScrollOffset","listEnd","calculateRangeImpl","rangeExtractor","attributeName","indexStr","scrollIndex","bufferSize","minIndex","maxIndex","key2","prevNode","_c","itemStart","itemSize","delta","wasAtEnd","prevTotalSize","defaultShouldAdjust","shouldAdjustScroll","adjustedSync","virtualItems","indexes","measurement","hold","useFlat","findNearestBinarySearch","write","lowMaxes","done","property","style","priority","crossSize","crossSizeBefore","threshold","align","toOffset","maxOffset","toOffset2","initialAlign","offsetInfo","lastIdx","endByLane","val","writtenOffset","targetOffset","STABLE_FRAMES","targetChanged","viewport","distance","keepSmooth","low","high","middle","currentValue","getCurrentValue","findNearestBinarySearchFlat","lastIndex","startIndex2","endIndex2","limit","endPerLane","pos","startPerLane","VirtualizerControllerBase","changed","partial","VirtualizerController","VirtualController","#getScrollElement","getScrollElement","#virtual","#element","report","#standIn","#top","#scale","#write","scale","round","wasScaled","#anchor","scaled","shift","#pool","RANGE_CHANGE","SORT_CHANGE","COLUMN_RESIZE","COLUMN_REORDER","ROW_CLICK","CELL_CLICK","LOAD_ERROR","fire","name","HEIGHTS","SAFE_HEIGHT","MARGIN","dpr","onResize","listener","maxElementHeight","probe","bodyCap","extra","watchMaxElementHeight","u$1","p","M","p$3","h$3","v$2","w","toChild","content","formatValue","cellSlot","colIndex","headerSlot","pinnedSlot","cellParts","parts","pinnedRow","ariaSort","pinStyle","renderBody","totalSize","renderRow","active","firstRowIndex","loading","retry","renderCell","activeCol","placeholder","tabStop","retryLabel","renderLightDom","headerContent","pinnedContent","cellContent","pinnedCell","context","renderHeader","handlers","headerParts","drag","resizeHandle","renderPinnedRows","baseStyles","attachGridInternals","internals","sortColumnOf","RESIZE_STEP","HEADER","layoutOf","gridCell","role","gridRowOf","layout","pinShadow","rowPx","track","ArgusTable","#columnsProp","#dataProp","#overscan","#sorting","#sizing","#order","#appliedReorders","#appliedResizes","#autoWidths","#autoWidthsChanged","#internals","#table","#columns","#columnsChanged","#warnedColumns","#data","#scrollToTop","#pinScroll","#rowPx","#window","#focusPending","#lastRange","#onRetry","button","#headerHandlers","#requestSort","#direction","#requestResize","#startReorder","#requestResizes","#onKeydown","inHeader","arrow","towardEnd","#moveByKey","#currentWidth","corner","#activate","bodyFirst","bodyLast","fit","#moveTo","#onFocusin","#active","#gridRowId","#onClick","#observeProbe","#unwatchMaxHeight","#probeObserver","#contentEnd","targets","#effectiveColumns","autoWidths","#pushedAutoWidths","#reconcileActive","unknownTotal","#rowId","pinnedWidth","activeIn","firstIndex","#drag","#loading","#measureRowHeight","#lightDomEnd","#measureAutoWidths","#focusActive","details","detail","#announceMove","#announceMoved","#appliedSort","over","loaded","firstByPage","#placeholderId","found","unloaded","sized","applied","#requestReorder","step","#dropSlots","#scrollArea","ltr","left"],"sources":["../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js","../../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/template-content.js","../../src/argus-column.ts","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/style-map.js","../../../core/src/columns/resolve-columns.ts","../../../core/src/columns/column-order.ts","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/columns/constructColumn.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/featureStubs.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/constructHeader.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/buildHeaderGroups.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/rows/constructRow.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/row-models/createCoreRowModel.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/cells/constructCell.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/coreFeatures.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/helpers/tableFeatures.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/reactivity/coreReactivityFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/alien.js","../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/atom.js","../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/shallow.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/table/constructTable.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/column-pinning/columnPinningFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/column-pinning/orderByColumnPinning.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/column-pinning/columnPinningFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/row-sorting/sortFns.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/store-reactivity-bindings.js","../../../core/src/table/sorted-row-model.ts","../../../core/src/table/create-table.ts","../../../core/src/grid/row-layout.ts","../../../core/src/state/controllable.ts","../../../core/src/virtual/row-pool.ts","../../../core/src/virtual/scroll-scale.ts","../../../core/src/virtual/steady-window.ts","../../../core/src/data/page-cache.ts","../../src/announce.ts","../../src/controllers/auto-width.ts","../../src/controllers/column-children.ts","../../src/controllers/data-controller.ts","../../src/controllers/pin-scroll-controller.ts","../../src/controllers/reorder-drag.ts","../../src/controllers/resize-drag.ts","../../src/controllers/table-controller.ts","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/utils.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/scroll-classifier.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/ios-gesture.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/index.js","../../../../node_modules/.pnpm/@tanstack+lit-virtual@3.15.3_lit@3.3.3/node_modules/@tanstack/lit-virtual/dist/esm/index.js","../../src/controllers/virtual-controller.ts","../../src/events.ts","../../src/max-height.ts","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive-helpers.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/repeat.js","../../src/render/content.ts","../../src/render/body.ts","../../src/render/cells.ts","../../src/render/header.ts","../../src/render/pinned-rows.ts","../../src/styles/base.ts","../../src/argus-table.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.3\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{noChange as t}from\"../lit-html.js\";import{directive as r,Directive as e,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=r(class extends e{constructor(t){if(super(t),t.type!==n.CHILD)throw Error(\"templateContent can only be used in child bindings\")}render(r){return this.vt===r?t:(this.vt=r,document.importNode(r.content,!0))}});export{o as templateContent};\n//# sourceMappingURL=template-content.js.map\n","import { html, ReactiveElement, type ComplexAttributeConverter } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { templateContent } from 'lit/directives/template-content.js';\nimport type {\n CellContent,\n CellContext,\n ColumnAlign,\n ColumnDef,\n ColumnPin,\n ColumnWidth,\n} from './types.js';\n\n/**\n * Tables watching their `<argus-column>` children, by table element. Columns\n * call their parent's entry when they connect, disconnect or change, so the\n * table needs no MutationObserver on its own children (which would fire on\n * every light-DOM cell render while scrolling).\n */\nconst watchers = new WeakMap<Element, () => void>();\n\n/** Calls `onChange` whenever an `<argus-column>` child of `host` is added, removed, moved or changed. */\nexport function watchColumns(host: Element, onChange: () => void): void {\n watchers.set(host, onChange);\n}\n\nexport function unwatchColumns(host: Element): void {\n watchers.delete(host);\n}\n\nfunction notify(parent: Element | null): void {\n if (parent) watchers.get(parent)?.();\n}\n\n/** `width` attribute: `\"90\"` or `\"90px\"` → 90, `\"auto\"`, `\"2fr\"` → `{ flex: 2 }`. */\nconst widthConverter: ComplexAttributeConverter<ColumnWidth | undefined> = {\n fromAttribute(value) {\n if (value === null) return undefined;\n const text = value.trim().toLowerCase();\n if (text === 'auto') return 'auto';\n const match = /^(\\d*\\.?\\d+)(px|fr)?$/.exec(text);\n if (!match) return undefined;\n const n = Number(match[1]);\n return match[2] === 'fr' ? { flex: n } : n;\n },\n};\n\n/**\n * Boolean attribute with a default that may be `true`: absent → unset (the\n * default applies), `\"false\"` → `false`, anything else → `true`.\n */\nconst flagConverter: ComplexAttributeConverter<boolean | undefined> = {\n fromAttribute(value) {\n return value === null ? undefined : value.trim().toLowerCase() !== 'false';\n },\n};\n\n/**\n * One column of the parent `<argus-table>`, written as markup instead of an entry in\n * its `columns` property. It is data only and renders nothing.\n *\n * Only direct children of the table count, in document order. A non-empty `columns`\n * property wins over the children. Adding, removing, moving or changing a column\n * updates the table; sizes, order and sorting are kept by `column-id`.\n *\n * A `<template>` child is the content of every cell in the column (static: the same\n * for each row). Set the `cell` property for content that depends on the row.\n *\n * @summary Declarative column of an `<argus-table>`.\n */\n@customElement('argus-column')\nexport class ArgusColumn<T = unknown> extends ReactiveElement {\n /** Stable key, used in state objects, events and persistence. Must be unique within the table. */\n @property({ attribute: 'column-id' })\n columnId = '';\n\n /** Header content: text as an attribute; a Lit template, a node or a function as a property. */\n @property()\n header?: CellContent | (() => CellContent);\n\n /**\n * How to read the cell value: a property path such as `customer.name`, or (as a\n * property) a function of the row and its index.\n */\n @property()\n accessor?: string | ((row: T, index: number) => unknown);\n\n /** Cell content from the row: `(row, context) => content`. Property only; wins over a `<template>` child. */\n @property({ attribute: false })\n cell?: (row: T, context: CellContext<T>) => CellContent;\n\n /** Width: `90` (px), `auto` to fit the content, or `2fr` for a share of the free space. Default: 150 px. */\n @property({ converter: widthConverter })\n width?: ColumnWidth;\n\n /** Lower bound for resizing and for flex columns, in px. Default: 40. */\n @property({ attribute: 'min-width', type: Number })\n minWidth?: number;\n\n /** Upper bound for resizing, in px. Default: no limit. */\n @property({ attribute: 'max-width', type: Number })\n maxWidth?: number;\n\n /** Pins the column to the `start` or `end` side. */\n @property()\n pin?: ColumnPin;\n\n /** Text alignment: `start`, `center` or `end`. Default: `start`. */\n @property()\n align?: ColumnAlign;\n\n /** Whether the header can be clicked to sort. Default: `false`. */\n @property({ converter: flagConverter })\n sortable?: boolean;\n\n /** Whether the column can be resized. Default: `true`; `resizable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n resizable?: boolean;\n\n /** Whether the column can be moved. Default: `true`; `reorderable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n reorderable?: boolean;\n\n #parent: Element | null = null;\n #def: ColumnDef<T> | undefined;\n readonly #children = new MutationObserver(() => {\n this.#def = undefined;\n this.requestUpdate();\n });\n\n /** Data only: no shadow root, nothing rendered. */\n protected override createRenderRoot(): HTMLElement {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#children.observe(this, { childList: true });\n this.#parent = this.parentElement;\n notify(this.#parent);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#children.disconnect();\n const parent = this.#parent;\n this.#parent = null;\n notify(parent);\n }\n\n /**\n * The column as the table reads it. Unset fields stay `undefined`, which the\n * table reads as its defaults. An unknown `pin` is ignored and an unknown\n * `align` falls back to `start`.\n */\n toColumnDef(): ColumnDef<T> {\n if (this.#def) return this.#def;\n const template = [...this.children].find((c) => c instanceof HTMLTemplateElement);\n return (this.#def = {\n id: this.columnId,\n header: this.header,\n accessor: this.accessor,\n cell: this.cell ?? (template && (() => html`${templateContent(template)}`)),\n width: this.width,\n minWidth: this.minWidth,\n maxWidth: this.maxWidth,\n pin: this.pin,\n align: this.align,\n sortable: this.sortable,\n resizable: this.resizable,\n reorderable: this.reorderable,\n });\n }\n\n protected override willUpdate(): void {\n this.#def = undefined;\n }\n\n protected override updated(): void {\n notify(this.#parent);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'argus-column': ArgusColumn;\n }\n}\n","import{noChange as t}from\"../lit-html.js\";import{directive as e,Directive as r,PartType as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const n=\"important\",i=\" !\"+n,o=e(class extends r{constructor(t){if(super(t),t.type!==s.ATTRIBUTE||\"style\"!==t.name||t.strings?.length>2)throw Error(\"The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.\")}render(t){return Object.keys(t).reduce((e,r)=>{const s=t[r];return null==s?e:e+`${r=r.includes(\"-\")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,\"-$&\").toLowerCase()}:${s};`},\"\")}update(e,[r]){const{style:s}=e.element;if(void 0===this.ft)return this.ft=new Set(Object.keys(r)),this.render(r);for(const t of this.ft)null==r[t]&&(this.ft.delete(t),t.includes(\"-\")?s.removeProperty(t):s[t]=null);for(const t in r){const e=r[t];if(null!=e){this.ft.add(t);const r=\"string\"==typeof e&&e.endsWith(i);t.includes(\"-\")||r?s.setProperty(t,r?e.slice(0,-11):e,r?n:\"\"):s[t]=e}}return t}});export{o as styleMap};\n//# sourceMappingURL=style-map.js.map\n","import type { ColumnAlign, ColumnDef, ColumnPin } from '../types.js';\n\n/** Width used when a column sets none. */\nexport const DEFAULT_WIDTH = 150;\n/** Lower bound used when a column sets no `minWidth`. */\nexport const DEFAULT_MIN_WIDTH = 40;\n\n/** A column after defaults, bounds and the accessor have been resolved. */\nexport interface ResolvedColumn<TData, TContent> {\n id: string;\n /** Position in the `columns` array. */\n index: number;\n header: ColumnDef<TData, TContent>['header'];\n cell: ColumnDef<TData, TContent>['cell'];\n /** Reads the cell value; returns `undefined` when the column has no accessor. */\n getValue: (row: TData, index: number) => unknown;\n hasAccessor: boolean;\n /** Base width in px. For a flex column this is its minimum track size. */\n width: number;\n /** Share of free space for `{ flex }` columns, otherwise `undefined`. Pinned columns never flex. */\n flex: number | undefined;\n /** `true` for `width: 'auto'`: the table measures the content and passes the width in. */\n auto: boolean;\n minWidth: number;\n maxWidth: number;\n pin: ColumnPin | undefined;\n sortable: boolean;\n resizable: boolean;\n reorderable: boolean;\n align: ColumnAlign;\n}\n\nconst pathCache = new Map<string, readonly string[]>();\n\n/**\n * Reads a dotted property path such as `'customer.name'`. Returns `undefined`\n * as soon as a step is `null` or `undefined`, like optional chaining.\n */\nexport function readPath(source: unknown, path: string): unknown {\n let keys = pathCache.get(path);\n if (!keys) {\n keys = path.split('.');\n pathCache.set(path, keys);\n }\n let value: unknown = source;\n for (const key of keys) {\n if (value === null || value === undefined) return undefined;\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\nfunction finite(value: number | undefined): number | undefined {\n return value !== undefined && Number.isFinite(value) ? value : undefined;\n}\n\n/**\n * Normalizes `ColumnDef`s: checks ids, applies defaults and clamps widths.\n *\n * @throws if an id is empty or used twice, because state and events are keyed by id.\n */\nexport function resolveColumns<TData, TContent>(\n defs: readonly ColumnDef<TData, TContent>[],\n): ResolvedColumn<TData, TContent>[] {\n const seen = new Set<string>();\n return defs.map((def, index) => {\n if (typeof def.id !== 'string' || def.id === '') {\n throw new Error(`argus-table: column at index ${String(index)} needs a non-empty string id.`);\n }\n if (seen.has(def.id)) {\n throw new Error(`argus-table: column id '${def.id}' is used more than once.`);\n }\n seen.add(def.id);\n\n const minWidth = Math.max(0, finite(def.minWidth) ?? DEFAULT_MIN_WIDTH);\n const maxWidth = Math.max(minWidth, finite(def.maxWidth) ?? Number.POSITIVE_INFINITY);\n const clamp = (px: number) => Math.min(maxWidth, Math.max(minWidth, px));\n\n const pin = def.pin === 'start' || def.pin === 'end' ? def.pin : undefined;\n const { width } = def;\n // Pinned columns need a known width for their sticky offsets, so they never flex.\n const flex =\n pin === undefined &&\n typeof width === 'object' &&\n Number.isFinite(width.flex) &&\n width.flex > 0\n ? width.flex\n : undefined;\n const auto = width === 'auto';\n // An auto column shows the default width until it is measured.\n const fixed = typeof width === 'number' ? finite(width) : undefined;\n const base = flex !== undefined ? minWidth : clamp(fixed ?? DEFAULT_WIDTH);\n\n const { accessor } = def;\n const getValue: ResolvedColumn<TData, TContent>['getValue'] =\n typeof accessor === 'function'\n ? accessor\n : typeof accessor === 'string'\n ? (row) => readPath(row, accessor)\n : () => undefined;\n\n return {\n id: def.id,\n index,\n header: def.header,\n cell: def.cell,\n getValue,\n hasAccessor: accessor !== undefined,\n width: base,\n flex,\n auto,\n minWidth,\n maxWidth,\n pin,\n sortable: def.sortable === true,\n resizable: def.resizable !== false,\n reorderable: def.reorderable !== false,\n align: def.align ?? 'start',\n };\n });\n}\n","import type { ColumnOrderState, ColumnPin } from '../types.js';\n\n/** What ordering needs to know about a column. */\nexport interface OrderableColumn {\n id: string;\n pin: ColumnPin | undefined;\n reorderable: boolean;\n}\n\ntype Group = ColumnPin | 'center';\n\nconst groupOf = (column: OrderableColumn): Group => column.pin ?? 'center';\n\n/**\n * The order the table shows: start-pinned, scrolling, end-pinned columns, each\n * group in the sequence of `order`. Unknown and repeated ids are dropped; columns\n * the order doesn't list follow the listed ones of their group, in `columns` order.\n */\nexport function normalizeOrder(\n order: readonly string[],\n columns: readonly OrderableColumn[],\n): ColumnOrderState {\n const byId = new Map(columns.map((c) => [c.id, c]));\n const listed = new Set<string>();\n const groups: Record<Group, string[]> = { start: [], center: [], end: [] };\n for (const id of order) {\n const column = byId.get(id);\n if (!column || listed.has(id)) continue;\n listed.add(id);\n groups[groupOf(column)].push(id);\n }\n for (const column of columns) {\n if (!listed.has(column.id)) groups[groupOf(column)].push(column.id);\n }\n return [...groups.start, ...groups.center, ...groups.end];\n}\n\n/**\n * The order after moving a column to position `to` (0-based, in the whole order\n * as the table shows it, counted after the move). `undefined` if the column can't\n * move, `to` is outside the column's group, or nothing changes.\n */\nexport function moveColumn(\n order: readonly string[],\n columns: readonly OrderableColumn[],\n columnId: string,\n to: number,\n): ColumnOrderState | undefined {\n const column = columns.find((c) => c.id === columnId);\n if (!column?.reorderable || !Number.isInteger(to)) return undefined;\n const current = normalizeOrder(order, columns);\n const from = current.indexOf(columnId);\n if (to === from) return undefined;\n const pinOf = new Map(columns.map((c) => [c.id, groupOf(c)]));\n const group = groupOf(column);\n const first = current.findIndex((id) => pinOf.get(id) === group);\n const last = current.findLastIndex((id) => pinOf.get(id) === group);\n if (to < first || to > last) return undefined;\n const next = current.filter((id) => id !== columnId);\n next.splice(to, 0, columnId);\n return next;\n}\n","//#region src/utils.ts\n/**\n* Applies a TanStack updater to a value.\n*\n* If the updater is a function it is called with the previous value; otherwise the updater value is returned directly.\n*/\nfunction functionalUpdate(updater, input) {\n\treturn typeof updater === \"function\" ? updater(input) : updater;\n}\n/**\n* Clones table state values while preserving non-plain objects.\n*\n* Plain objects and arrays are copied recursively so state updates can avoid mutating existing references.\n*/\nfunction cloneState(value) {\n\tif (Array.isArray(value)) return value.map(cloneState);\n\tif (value && typeof value === \"object\") {\n\t\tconst proto = Object.getPrototypeOf(value);\n\t\tif (proto !== Object.prototype && proto !== null) return value;\n\t\tconst copy = proto === null ? makeObjectMap() : {};\n\t\tconst keys = Object.keys(value);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\tObject.defineProperty(copy, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: cloneState(value[key]),\n\t\t\t\twritable: true\n\t\t\t});\n\t\t}\n\t\treturn copy;\n\t}\n\treturn value;\n}\n/**\n* Copies prototype-instance own properties without carrying over lazy memo\n* closures or the per-row cell cache, both of which are bound to the source\n* instance (cached cells reference the source row).\n*/\nfunction copyInstancePropertiesWithoutMemos(target, source) {\n\tconst keys = Object.keys(source);\n\tconst targetRecord = target;\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tif (!key.startsWith(\"_memo_\") && key !== \"_cellsCache\") targetRecord[key] = source[key];\n\t}\n\treturn target;\n}\n/**\n* Creates an object intended only for string-keyed dictionary lookups.\n*\n* The null prototype keeps user-controlled ids such as `__proto__` and\n* `hasOwnProperty` as plain data keys.\n*/\nfunction makeObjectMap() {\n\treturn Object.create(null);\n}\n/**\n* Checks whether an object owns a key, including null-prototype dictionaries.\n*/\nfunction hasOwn(obj, key) {\n\treturn Object.prototype.hasOwnProperty.call(obj, key);\n}\n/**\n* Creates a table state updater for a single state slice.\n*\n* The updater writes through the table base atom for the slice and supports both value and functional updater forms.\n*/\nfunction makeStateUpdater(key, instance) {\n\treturn (updater) => {\n\t\t(instance.options.atoms?.[key] ?? instance.baseAtoms[key]).set((old) => functionalUpdate(updater, old));\n\t};\n}\n/**\n* Checks whether a value is an array or a plain (or null-prototype) object.\n* Class instances, dates, and other exotic values compare by reference only,\n* mirroring the `cloneState` plain-object policy.\n*/\nfunction isPlainContainer(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (Array.isArray(value)) return true;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n/**\n* Returns every enumerable own key, including symbols and non-index array\n* properties. Keeping key presence explicit distinguishes sparse array holes\n* from entries whose value is `undefined`.\n*/\nfunction getEnumerableOwnKeys(value) {\n\treturn Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));\n}\nconst MAX_STATE_COMPARE_DEPTH = 3;\n/**\n* Structurally compares two state slice values as deeply as stock feature\n* state can nest and no deeper.\n*\n* Three container levels cover flat maps and arrays, arrays of state objects,\n* array-valued filter values, and `columnResizing.columnSizingStart` tuples.\n* Deeper containers and non-plain values compare by reference. A `false`\n* result is always safe: the state update simply proceeds.\n*/\nfunction stateSlicesEqual(a, b) {\n\treturn stateSlicesEqualAtDepth(a, b, MAX_STATE_COMPARE_DEPTH);\n}\nfunction stateSlicesEqualAtDepth(a, b, depth) {\n\tif (Object.is(a, b)) return true;\n\tif (depth <= 0 || !isPlainContainer(a) || !isPlainContainer(b)) return false;\n\tif (Array.isArray(a) || Array.isArray(b)) {\n\t\tif (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n\t}\n\tconst keysA = getEnumerableOwnKeys(a);\n\tconst keysB = getEnumerableOwnKeys(b);\n\tif (keysA.length !== keysB.length) return false;\n\tconst recordA = a;\n\tconst recordB = b;\n\tfor (let i = 0; i < keysA.length; i++) {\n\t\tconst key = keysA[i];\n\t\tif (!Object.prototype.propertyIsEnumerable.call(b, key)) return false;\n\t\tif (!stateSlicesEqualAtDepth(recordA[key], recordB[key], depth - 1)) return false;\n\t}\n\treturn true;\n}\n/**\n* Routes a state slice update through the slice's `on<State>Change` handler,\n* preserving the owner's current reference for structural no-ops.\n*\n* Equality is evaluated inside the updater received by the state owner, never\n* against the table's potentially stale controlled snapshot. This keeps\n* same-tick updates composable in queued host containers such as React state,\n* evaluates the original updater only when the owner applies it, and lets atom\n* owners suppress notifications by returning their existing reference.\n*\n* A user-provided change handler is still invoked for a no-op because only that\n* handler's state container can know its latest queued value. The guarded\n* updater returns that container's previous reference, preventing a state write\n* or render in state containers with identity bailout semantics.\n*\n* Hot-path slices that skip guarding entirely (selection maps that scale with\n* row count, pointer-frequency resize state) call their change handler\n* directly instead of routing through this util. Custom feature slices with a\n* cheaper or semantic-aware comparison can pass `isEqual` to override the\n* structural default.\n*/\nfunction setStateSlice(instance, key, updater, isEqual = stateSlicesEqual) {\n\tconst onChangeKey = `on${key.charAt(0).toUpperCase()}${key.slice(1)}Change`;\n\tconst onChange = instance.options[onChangeKey];\n\tif (!onChange) return;\n\tonChange((current) => {\n\t\tconst next = functionalUpdate(updater, current);\n\t\treturn isEqual(current, next) ? current : next;\n\t});\n}\n/**\n* Returns whether a value is a function.\n*/\nfunction isFunction(d) {\n\treturn d instanceof Function;\n}\n/**\n* Flattens a tree of nodes by recursively reading child nodes.\n*\n* The original nodes are preserved in depth-first order.\n*/\nfunction flattenBy(arr, getChildren) {\n\tconst flat = [];\n\tconst recurse = (subArr) => {\n\t\tsubArr.forEach((item) => {\n\t\t\tflat.push(item);\n\t\t\tconst children = getChildren(item);\n\t\t\tif (children.length) recurse(children);\n\t\t});\n\t};\n\trecurse(arr);\n\treturn flat;\n}\n/**\n* Creates a dependency-tracked memoized function for table internals.\n*\n* The memo recomputes only when its dependency tuple changes and can emit debug timing information.\n*/\nconst memo = ({ fn, memoDeps, onAfterCompare, onAfterUpdate, onBeforeCompare, onBeforeUpdate }) => {\n\tlet deps = [];\n\tlet result;\n\tconst memoizedFn = (depArgs) => {\n\t\tonBeforeCompare?.();\n\t\tconst newDeps = memoDeps?.(depArgs);\n\t\tlet depsChanged = !newDeps || newDeps.length !== deps?.length;\n\t\tif (!depsChanged && newDeps) {\n\t\t\tfor (let i = 0; i < newDeps.length; i++) if (newDeps[i] !== deps[i]) {\n\t\t\t\tdepsChanged = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tonAfterCompare?.(depsChanged);\n\t\tif (!depsChanged) return result;\n\t\tdeps = newDeps;\n\t\tonBeforeUpdate?.();\n\t\tresult = fn(...newDeps ?? []);\n\t\tonAfterUpdate?.(result);\n\t\treturn result;\n\t};\n\treturn memoizedFn;\n};\n/**\n* Wraps a callback so that its first invocation is skipped.\n*\n* Row-model `onAfterUpdate` hooks schedule auto-resets when their inputs\n* change. The initial computation of a row model is not a change, so state\n* resets must not fire for it — otherwise merely reading a row model on mount\n* would wipe initial or controlled state.\n*/\nfunction skipFirstRun(fn) {\n\tlet hasRun = false;\n\treturn () => {\n\t\tif (!hasRun) {\n\t\t\thasRun = true;\n\t\t\treturn;\n\t\t}\n\t\tfn();\n\t};\n}\nconst pad = (str, num) => {\n\tstr = String(str);\n\twhile (str.length < num) str = \" \" + str;\n\treturn str;\n};\n/**\n* Creates a table-aware memoized function.\n*\n* This wraps `memo` with table debug options and feature metadata so row models and derived APIs can share consistent diagnostics.\n*/\nfunction tableMemo({ feature, fnName, objectId, onAfterUpdate, table, ...memoOptions }) {\n\tlet startCalcTime;\n\tlet endCalcTime;\n\tlet runCount = 0;\n\tlet debug;\n\tif (process.env.NODE_ENV === \"development\") {\n\t\tconst { debugAll } = table.options;\n\t\tconst { parentName } = getFunctionNameInfo(fnName, \".\");\n\t\tconst debugByParent = table.options[`debug${(parentName != \"table\" ? parentName + \"s\" : parentName).replace(parentName, parentName.charAt(0).toUpperCase() + parentName.slice(1))}`];\n\t\tconst debugByFeature = feature ? table.options[`debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`] : false;\n\t\tdebug = debugAll || debugByParent || debugByFeature;\n\t}\n\tfunction logTime(time, depsChanged) {\n\t\tconst runType = runCount === 0 ? \"(1st run)\" : depsChanged ? \"(rerun #\" + runCount + \")\" : \"(cache)\";\n\t\trunCount++;\n\t\tconsole.groupCollapsed(`%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split(\".\")[0]}Id: ${objectId})` : \"\"}`, `font-size: .6rem; font-weight: bold; ${depsChanged ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);` : \"\"} `, `color: ${runCount < 2 ? \"#FF00FF\" : \"#FF1493\"}`, \"color: #666\", \"color: #87CEEB\");\n\t\tconsole.info({\n\t\t\tfeature,\n\t\t\tstate: table.store.state,\n\t\t\tdeps: memoOptions.memoDeps?.toString()\n\t\t});\n\t\tconsole.trace();\n\t\tconsole.groupEnd();\n\t}\n\tconst onAfterUpdateHandler = onAfterUpdate ? () => {\n\t\tconst { schedule, untrack } = table._reactivity;\n\t\tschedule(() => untrack(() => onAfterUpdate()));\n\t} : void 0;\n\tconst debugOptions = process.env.NODE_ENV === \"development\" ? {\n\t\tonBeforeCompare: () => {},\n\t\tonAfterCompare: (depsChanged) => {},\n\t\tonBeforeUpdate: () => {\n\t\t\tif (debug) startCalcTime = performance.now();\n\t\t},\n\t\tonAfterUpdate: () => {\n\t\t\tif (debug) {\n\t\t\t\tendCalcTime = performance.now();\n\t\t\t\tlogTime(Math.round((endCalcTime - startCalcTime) * 100) / 100, true);\n\t\t\t}\n\t\t\tonAfterUpdateHandler?.();\n\t\t}\n\t} : { onAfterUpdate: onAfterUpdateHandler };\n\treturn memo({\n\t\t...memoOptions,\n\t\t...debugOptions\n\t});\n}\n/**\n* Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n*\n* Splits on the first separator only, so an internal API name such as\n* `table__expandRows` has the `fnKey` `_expandRows`.\n*/\nfunction getFunctionNameInfo(staticFnName, splitBy = \"_\") {\n\tconst [parentName, fnKey] = staticFnName.replace(splitBy, \" \").split(\" \");\n\treturn {\n\t\tfnKey,\n\t\tfnName: `${parentName}.${fnKey}`,\n\t\tparentName\n\t};\n}\n/**\n* Assigns Table API methods directly to the table instance.\n* Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n*/\nfunction assignTableAPIs(feature, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\ttable[fnKey] = memoDeps ? tableMemo({\n\t\t\tmemoDeps,\n\t\t\tfn,\n\t\t\tfnName,\n\t\t\ttable,\n\t\t\tfeature\n\t\t}) : fn;\n\t}\n}\n/**\n* Assigns API methods to a prototype object for memory-efficient method sharing.\n* All instances created with this prototype will share the same method references.\n*\n* For memoized methods, the memo state is lazily created and stored on each instance.\n* This provides the best of both worlds: shared method code + per-instance caching.\n*/\nfunction assignPrototypeAPIs(feature, prototype, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\tif (memoDeps) {\n\t\t\tconst memoKey = `_memo_${fnKey}`;\n\t\t\tprototype[fnKey] = function(...args) {\n\t\t\t\tif (!this[memoKey]) {\n\t\t\t\t\tconst self = this;\n\t\t\t\t\tthis[memoKey] = tableMemo({\n\t\t\t\t\t\tmemoDeps: (depArgs) => memoDeps(self, depArgs),\n\t\t\t\t\t\tfn: (...deps) => fn(self, ...deps),\n\t\t\t\t\t\tfnName,\n\t\t\t\t\t\tobjectId: self.id,\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tfeature\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this[memoKey](...args);\n\t\t\t};\n\t\t} else prototype[fnKey] = function(...args) {\n\t\t\treturn fn(this, ...args);\n\t\t};\n\t}\n}\n/**\n* Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fall back to the static method passed in.\n*/\nfunction callMemoOrStaticFn(obj, fnKey, staticFn, ...args) {\n\treturn obj[fnKey]?.(...args) ?? staticFn(obj, ...args);\n}\n\n//#endregion\nexport { assignPrototypeAPIs, assignTableAPIs, callMemoOrStaticFn, cloneState, copyInstancePropertiesWithoutMemos, flattenBy, functionalUpdate, getFunctionNameInfo, hasOwn, isFunction, makeObjectMap, makeStateUpdater, memo, setStateSlice, skipFirstRun, stateSlicesEqual, tableMemo };","//#region src/core/cells/coreCellsFeature.utils.ts\n/**\n* Reads this cell's accessor value from its owning row and column.\n*\n* This is the standalone implementation behind `cell.getValue()`, useful when\n* importing static APIs instead of calling methods from the cell prototype.\n*\n* @example\n* ```ts\n* const value = cell_getValue(cell)\n* ```\n*/\nfunction cell_getValue(cell) {\n\treturn cell.row.getValue(cell.column.id);\n}\n/**\n* Reads the value that should be rendered for this cell.\n*\n* Nullish accessor values are replaced with `table.options.renderFallbackValue`,\n* matching the behavior of `cell.renderValue()`.\n*\n* @example\n* ```ts\n* const rendered = cell_renderValue(cell)\n* ```\n*/\nfunction cell_renderValue(cell) {\n\treturn cell.getValue() ?? cell.table.options.renderFallbackValue;\n}\n/**\n* Builds the render context passed to a column's `cell` template.\n*\n* The returned object includes stable references to the table, row, column, and\n* cell, plus bound `getValue` and `renderValue` helpers for render functions.\n*\n* @example\n* ```ts\n* const context = cell_getContext(cell)\n* ```\n*/\nfunction cell_getContext(cell) {\n\treturn {\n\t\ttable: cell.table,\n\t\tcolumn: cell.column,\n\t\trow: cell.row,\n\t\tcell,\n\t\tgetValue: () => cell.getValue(),\n\t\trenderValue: () => cell.renderValue()\n\t};\n}\n\n//#endregion\nexport { cell_getContext, cell_getValue, cell_renderValue };","import { assignPrototypeAPIs } from \"../../utils.js\";\nimport { cell_getContext, cell_getValue, cell_renderValue } from \"./coreCellsFeature.utils.js\";\n\n//#region src/core/cells/coreCellsFeature.ts\n/**\n* Core feature that adds cell value, render, and context APIs.\n*/\nconst coreCellsFeature = { assignCellPrototype: (prototype, table) => {\n\tassignPrototypeAPIs(\"coreCellsFeature\", prototype, table, {\n\t\tcell_getValue: { fn: (cell) => cell_getValue(cell) },\n\t\tcell_renderValue: { fn: (cell) => cell_renderValue(cell) },\n\t\tcell_getContext: {\n\t\t\tfn: (cell) => cell_getContext(cell),\n\t\t\tmemoDeps: (cell) => [cell]\n\t\t}\n\t});\n} };\n\n//#endregion\nexport { coreCellsFeature };","//#region src/core/columns/constructColumn.ts\n/**\n* Creates or retrieves the column prototype for a table.\n* The prototype is cached on the table and shared by all column instances.\n*/\nfunction getColumnPrototype(table) {\n\tif (!table._columnPrototype) {\n\t\ttable._columnPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignColumnPrototype?.(table._columnPrototype, table);\n\t}\n\treturn table._columnPrototype;\n}\n/**\n* Constructs a column instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructColumn(table, columnDef, depth, parent) {\n\tconst resolvedColumnDef = {\n\t\t...table.getDefaultColumnDef(),\n\t\t...columnDef\n\t};\n\tconst accessorKey = resolvedColumnDef.accessorKey;\n\tconst accessorKeyString = accessorKey === void 0 ? void 0 : String(accessorKey);\n\tconst id = resolvedColumnDef.id ?? accessorKeyString?.replaceAll(\".\", \"_\") ?? (typeof resolvedColumnDef.header === \"string\" ? resolvedColumnDef.header : void 0);\n\tlet accessorFn;\n\tif (resolvedColumnDef.accessorFn) accessorFn = resolvedColumnDef.accessorFn;\n\telse if (accessorKey !== void 0) {\n\t\tif (typeof accessorKey === \"string\" && accessorKey.includes(\".\")) {\n\t\t\tconst keys = accessorKey.split(\".\");\n\t\t\taccessorFn = (originalRow) => {\n\t\t\t\tlet result = originalRow;\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tconst key = keys[i];\n\t\t\t\t\tresult = result?.[key];\n\t\t\t\t\tif (process.env.NODE_ENV === \"development\" && result === void 0) console.warn(`\"${key}\" in deeply nested key \"${accessorKey}\" returned undefined.`);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t};\n\t\t} else accessorFn = (originalRow) => originalRow[resolvedColumnDef.accessorKey];\n\t}\n\tif (!id) {\n\t\tif (process.env.NODE_ENV === \"development\") throw new Error(resolvedColumnDef.accessorFn ? `coreColumnsFeature require an id when using an accessorFn` : `coreColumnsFeature require an id when using a non-string header`);\n\t\tthrow new Error();\n\t}\n\tconst columnPrototype = getColumnPrototype(table);\n\tconst column = Object.create(columnPrototype);\n\tcolumn.accessorFn = accessorFn;\n\tcolumn.columnDef = resolvedColumnDef;\n\tcolumn.columns = [];\n\tcolumn.depth = depth;\n\tcolumn.id = `${String(id)}`;\n\tcolumn.parent = parent;\n\tconst initFns = table._columnInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](column);\n\treturn column;\n}\n\n//#endregion\nexport { constructColumn };","//#region src/core/featureStubs.ts\n/**\n* Stubs for optional features, used by the core and by any feature or row\n* model that reads another feature.\n*\n* Importing a feature's code from shared code would bundle that feature into\n* every table that uses the shared code, registered or not. A stub instead\n* calls a member the feature declares on its table, column, or row type and\n* assigns when it is registered, and otherwise behaves as if the feature were\n* absent. Members that only other features use are `_`-prefixed and marked\n* `@internal`, such as `table._expandRows`.\n*\n* How code in this package reaches other code:\n*\n* - Its own feature: call the static function, or `callMemoOrStaticFn` to use\n* the feature's memoized API.\n* - The core: import it. Every table bundles the core.\n* - Another feature's state: read `table.atoms.<slice>?.get()`.\n* - Another feature's APIs: call a stub from this file, adding one if needed.\n* - A feature it requires, such as column resizing requiring column sizing:\n* import it.\n*\n* Features assign functions, internal ones included, with `assignTableAPIs` or\n* `assignPrototypeAPIs`, and keep the `init*InstanceData` hooks for mutable\n* per-instance state. The `import/no-restricted-paths` lint rule rejects value\n* imports between feature folders outside an explicit list.\n*\n* Internal: not exported from any package entry point.\n*/\n/** Whether a column is visible; every column is without the feature. */\nfunction getIsColumnVisible(column) {\n\treturn column.getIsVisible?.() ?? true;\n}\n/** Visible leaf columns; all leaf columns without the feature. */\nfunction getVisibleLeafColumns(table) {\n\treturn table.getVisibleLeafColumns?.() ?? table.getAllLeafColumns();\n}\n/**\n* A row's visible cells; all cells, in leaf column order, without the\n* feature.\n*/\nfunction getVisibleCells(row) {\n\treturn row.getVisibleCells?.() ?? row.getAllCells();\n}\n/** A row's visible cells by column id; all cells without the feature. */\nfunction getVisibleCellsByColumnId(row) {\n\treturn row.getVisibleCellsByColumnId?.() ?? row.getAllCellsByColumnId();\n}\n/**\n* Orders leaf columns for display. The column ordering feature applies\n* `columnOrder` and moves grouped columns. Without it, the grouping feature\n* still moves grouped columns, and without either the order is unchanged.\n*/\nfunction orderLeafColumns(table, columns) {\n\tconst orderedTable = table;\n\tconst leafColumns = columns;\n\treturn orderedTable.getOrderColumnsFn?.()(leafColumns) ?? orderedTable._orderGroupedColumns?.(leafColumns) ?? columns;\n}\n/**\n* Orders items that each belong to a leaf column, such as visible leaf columns\n* or a row's visible cells, with start-pinned items first and end-pinned items\n* last. Without the feature, nothing is pinned and the order is unchanged.\n*/\nfunction orderByColumnPinning(table, items, getColumnId, getItemsByColumnId) {\n\treturn table._orderByColumnPinning?.(items, getColumnId, getItemsByColumnId) ?? items;\n}\n/**\n* Visible leaf columns in a pinning region. Without the feature, nothing is\n* pinned: the start and end regions are empty, and the center region and the\n* full list (`position` omitted) hold every visible leaf column.\n*/\nfunction getPinnedVisibleLeafColumns(table, position) {\n\treturn table.getPinnedVisibleLeafColumns?.(position) ?? (position && position !== \"center\" ? [] : getVisibleLeafColumns(table));\n}\n/** The resolved global filter function, if the feature is registered. */\nfunction getGlobalFilterFn(table) {\n\treturn table.getGlobalFilterFn?.();\n}\n/** Whether a column takes part in global filtering; none do without the feature. */\nfunction getCanGlobalFilter(column) {\n\treturn column.getCanGlobalFilter?.() ?? false;\n}\n/**\n* Lists expanded sub-rows inline below their parents. Without the feature no\n* row is expanded, so the row model is returned as is.\n*/\nfunction expandRowModel(table, rowModel) {\n\treturn table._expandRows?.(rowModel) ?? rowModel;\n}\n/**\n* Whether every parent of a row is expanded. Without the feature no row is\n* expanded, so only a top-level row qualifies.\n*/\nfunction getIsAllParentsExpanded(row) {\n\treturn row.getIsAllParentsExpanded?.() ?? !row.parentId;\n}\n/** Resets expanded state if row expanding is registered. */\nfunction autoResetExpanded(table) {\n\ttable.autoResetExpanded?.();\n}\n/** Resets the page index if row pagination is registered. */\nfunction autoResetPageIndex(table) {\n\ttable.autoResetPageIndex?.();\n}\n/** Resets sorting if row sorting is registered. */\nfunction autoResetSorting(table) {\n\ttable.autoResetSorting?.();\n}\n/** Resets cell selection if cell selection is registered. */\nfunction autoResetCellSelection(table) {\n\ttable.autoResetCellSelection?.();\n}\n/**\n* The aggregation executor `rowAggregationFeature` assigns to the table, or\n* `undefined` when the feature is not registered.\n*/\nfunction getAggregateColumnValue(table) {\n\treturn table._aggregateColumnValue;\n}\n\n//#endregion\nexport { autoResetCellSelection, autoResetExpanded, autoResetPageIndex, autoResetSorting, expandRowModel, getAggregateColumnValue, getCanGlobalFilter, getGlobalFilterFn, getIsAllParentsExpanded, getIsColumnVisible, getPinnedVisibleLeafColumns, getVisibleCells, getVisibleCellsByColumnId, getVisibleLeafColumns, orderByColumnPinning, orderLeafColumns };","import { makeObjectMap } from \"../../utils.js\";\nimport { orderLeafColumns } from \"../featureStubs.js\";\nimport { constructColumn } from \"./constructColumn.js\";\n\n//#region src/core/columns/coreColumnsFeature.utils.ts\n/**\n* Flattens this column and every descendant column into a single array.\n*\n* Group columns appear before their child columns, which matches the normalized\n* column hierarchy produced during table construction.\n*\n* @example\n* ```ts\n* const flatColumns = column_getFlatColumns(column)\n* ```\n*/\nfunction column_getFlatColumns(column) {\n\treturn [column, ...column.columns.flatMap((col) => col.getFlatColumns())];\n}\n/**\n* Collects the terminal leaf columns below this column.\n*\n* Group columns return their ordered descendants. Non-group columns return an\n* array containing only the column itself.\n*\n* @example\n* ```ts\n* const leafColumns = column_getLeafColumns(column)\n* ```\n*/\nfunction column_getLeafColumns(column) {\n\tif (column.columns.length) {\n\t\tconst leafColumns = column.columns.flatMap((col) => col.getLeafColumns());\n\t\treturn orderLeafColumns(column.table, leafColumns);\n\t}\n\treturn [column];\n}\n/**\n* Merges built-in, feature, and user default column definitions.\n*\n* Built-in defaults provide a header and fallback cell renderer, feature\n* defaults can add feature-specific column options, and\n* `options.defaultColumn` wins last.\n*\n* @example\n* ```ts\n* const defaultColumn = table_getDefaultColumnDef(table)\n* ```\n*/\nfunction table_getDefaultColumnDef(table) {\n\treturn {\n\t\theader: (props) => {\n\t\t\tconst resolvedColumnDef = props.header.column.columnDef;\n\t\t\tif (resolvedColumnDef.accessorKey) return resolvedColumnDef.accessorKey;\n\t\t\tif (resolvedColumnDef.accessorFn) return resolvedColumnDef.id;\n\t\t\treturn null;\n\t\t},\n\t\tcell: (props) => props.renderValue()?.toString?.() ?? null,\n\t\t...Object.values(table._features).reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultColumnDef?.());\n\t\t}, {}),\n\t\t...table.options.defaultColumn\n\t};\n}\nfunction constructColumns(table, columnDefs, parent, depth = 0) {\n\tconst columns = new Array(columnDefs.length);\n\tfor (let i = 0; i < columnDefs.length; i++) {\n\t\tif (!(i in columnDefs)) continue;\n\t\tconst columnDef = columnDefs[i];\n\t\tconst column = constructColumn(table, columnDef, depth, parent);\n\t\tconst groupingColumnDef = columnDef;\n\t\tcolumn.columns = groupingColumnDef.columns ? constructColumns(table, groupingColumnDef.columns, column, depth + 1) : [];\n\t\tcolumns[i] = column;\n\t}\n\treturn columns;\n}\n/**\n* Normalizes `options.columns` into the table's nested column tree.\n*\n* Each column definition is constructed with its parent and depth, and group\n* column children are recursively constructed.\n*\n* @example\n* ```ts\n* const columns = table_getAllColumns(table)\n* ```\n*/\nfunction table_getAllColumns(table) {\n\treturn constructColumns(table, table.options.columns);\n}\n/**\n* Flattens every table column, including group columns and leaf columns.\n*\n* Use this when parent/group columns must be included in addition to data leaf\n* columns.\n*\n* @example\n* ```ts\n* const flatColumns = table_getAllFlatColumns(table)\n* ```\n*/\nfunction table_getAllFlatColumns(table) {\n\treturn table.getAllColumns().flatMap((column) => column.getFlatColumns());\n}\n/**\n* Builds an id lookup for every flat column in the table.\n*\n* Group columns and leaf columns are included. Later columns with the same id\n* replace earlier entries.\n*\n* @example\n* ```ts\n* const columnsById = table_getAllFlatColumnsById(table)\n* ```\n*/\nfunction table_getAllFlatColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst flatColumns = table.getAllFlatColumns();\n\tfor (let i = 0; i < flatColumns.length; i++) {\n\t\tconst column = flatColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Collects all terminal leaf columns in their current table order.\n*\n* Column ordering features can reorder the collected leaves before the result\n* is returned.\n*\n* @example\n* ```ts\n* const leafColumns = table_getAllLeafColumns(table)\n* ```\n*/\nfunction table_getAllLeafColumns(table) {\n\tconst leafColumns = table.getAllColumns().flatMap((c) => c.getLeafColumns());\n\treturn orderLeafColumns(table, leafColumns);\n}\n/**\n* Builds an id lookup for terminal leaf columns only.\n*\n* Parent/group columns are excluded, making this lookup appropriate for row\n* cells and feature state keyed by data columns.\n*\n* @example\n* ```ts\n* const leavesById = table_getAllLeafColumnsById(table)\n* ```\n*/\nfunction table_getAllLeafColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst leafColumns = table.getAllLeafColumns();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst column = leafColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Looks up a column by id from the flat column map.\n*\n* The lookup can return group columns or leaf columns. In development, a\n* missing id logs a warning to help catch stale column references.\n*\n* @example\n* ```ts\n* const column = table_getColumn(table, 'firstName')\n* ```\n*/\nfunction table_getColumn(table, columnId) {\n\tconst column = table.getAllFlatColumnsById()[columnId];\n\tif (process.env.NODE_ENV === \"development\" && !column) console.warn(`[Table] Column with id '${columnId}' does not exist.`);\n\treturn column;\n}\n\n//#endregion\nexport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef } from \"./coreColumnsFeature.utils.js\";\n\n//#region src/core/columns/coreColumnsFeature.ts\n/**\n* Core feature that builds the column tree and exposes table/column APIs.\n*/\nconst coreColumnsFeature = {\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreColumnsFeature\", prototype, table, {\n\t\t\tcolumn_getFlatColumns: {\n\t\t\t\tfn: (column) => column_getFlatColumns(column),\n\t\t\t\tmemoDeps: (column) => [column.table.options.columns]\n\t\t\t},\n\t\t\tcolumn_getLeafColumns: {\n\t\t\t\tfn: (column) => column_getLeafColumns(column),\n\t\t\t\tmemoDeps: (column) => [\n\t\t\t\t\tcolumn.table.atoms.columnOrder?.get(),\n\t\t\t\t\tcolumn.table.atoms.grouping?.get(),\n\t\t\t\t\tcolumn.table.options.columns,\n\t\t\t\t\tcolumn.table.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreColumnsFeature\", table, {\n\t\t\ttable_getDefaultColumnDef: {\n\t\t\t\tfn: () => table_getDefaultColumnDef(table),\n\t\t\t\tmemoDeps: () => [table.options.defaultColumn]\n\t\t\t},\n\t\t\ttable_getAllColumns: {\n\t\t\t\tfn: () => table_getAllColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumns: {\n\t\t\t\tfn: () => table_getAllFlatColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumnsById: {\n\t\t\t\tfn: () => table_getAllFlatColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllLeafColumns: {\n\t\t\t\tfn: () => table_getAllLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getAllLeafColumnsById: {\n\t\t\t\tfn: () => table_getAllLeafColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.getAllLeafColumns()]\n\t\t\t},\n\t\t\ttable_getColumn: { fn: (columnId) => table_getColumn(table, columnId) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreColumnsFeature };","//#region src/core/headers/constructHeader.ts\n/**\n* Creates or retrieves the header prototype for a table.\n* The prototype is cached on the table and shared by all header instances.\n*/\nfunction getHeaderPrototype(table) {\n\tif (!table._headerPrototype) {\n\t\ttable._headerPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignHeaderPrototype?.(table._headerPrototype, table);\n\t}\n\treturn table._headerPrototype;\n}\n/**\n* Constructs a header instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructHeader(table, column, options) {\n\tconst headerPrototype = getHeaderPrototype(table);\n\tconst header = Object.create(headerPrototype);\n\theader.colSpan = 0;\n\theader.column = column;\n\theader.depth = options.depth;\n\theader.headerGroup = null;\n\theader.id = options.id ?? column.id;\n\theader.index = options.index;\n\theader.isPlaceholder = !!options.isPlaceholder;\n\theader.placeholderId = options.placeholderId;\n\theader.rowSpan = 0;\n\theader.subHeaders = [];\n\tconst initFns = table._headerInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](header);\n\treturn header;\n}\n\n//#endregion\nexport { constructHeader };","import { getIsColumnVisible } from \"../featureStubs.js\";\nimport { constructHeader } from \"./constructHeader.js\";\n\n//#region src/core/headers/buildHeaderGroups.ts\nfunction getMaxHeaderDepth(columns, depth = 1) {\n\tlet maxDepth = depth;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tif (getIsColumnVisible(column) && column.columns.length) maxDepth = Math.max(maxDepth, getMaxHeaderDepth(column.columns, depth + 1));\n\t}\n\treturn maxDepth;\n}\nfunction formatHeaderGroupId(headerFamily, depth) {\n\treturn headerFamily ? `${headerFamily}_${depth}` : String(depth);\n}\nfunction formatHeaderId(headerFamily, depth, columnId, childHeaderId) {\n\tlet id = headerFamily ?? \"\";\n\tif (depth) id = id ? `${id}_${depth}` : String(depth);\n\tif (columnId) id = id ? `${id}_${columnId}` : columnId;\n\tif (childHeaderId) id = id ? `${id}_${childHeaderId}` : childHeaderId;\n\treturn id;\n}\nfunction countPendingHeadersForColumn(headers, column) {\n\tlet count = 0;\n\tfor (let i = 0; i < headers.length; i++) if (headers[i].column === column) count++;\n\treturn count;\n}\nfunction constructHeaderGroup(headersToGroup, depth, table, headerFamily, headerGroups, headerGroupInitFns) {\n\tconst headerGroup = {\n\t\tdepth,\n\t\tid: formatHeaderGroupId(headerFamily, depth),\n\t\theaders: []\n\t};\n\tconst pendingParentHeaders = [];\n\tfor (let i = 0; i < headersToGroup.length; i++) {\n\t\tif (!(i in headersToGroup)) continue;\n\t\tconst headerToGroup = headersToGroup[i];\n\t\tconst latestPendingParentHeader = pendingParentHeaders[pendingParentHeaders.length - 1];\n\t\tconst isLeafHeader = headerToGroup.column.depth === headerGroup.depth;\n\t\tlet column;\n\t\tlet isPlaceholder = false;\n\t\tif (isLeafHeader && headerToGroup.column.parent) column = headerToGroup.column.parent;\n\t\telse {\n\t\t\tcolumn = headerToGroup.column;\n\t\t\tisPlaceholder = true;\n\t\t}\n\t\tif (latestPendingParentHeader && latestPendingParentHeader.column === column) latestPendingParentHeader.subHeaders.push(headerToGroup);\n\t\telse {\n\t\t\tconst header = constructHeader(table, column, {\n\t\t\t\tid: formatHeaderId(headerFamily, depth, column.id, headerToGroup.id),\n\t\t\t\tisPlaceholder,\n\t\t\t\tplaceholderId: isPlaceholder ? String(countPendingHeadersForColumn(pendingParentHeaders, column)) : void 0,\n\t\t\t\tdepth,\n\t\t\t\tindex: pendingParentHeaders.length\n\t\t\t});\n\t\t\theader.subHeaders.push(headerToGroup);\n\t\t\tpendingParentHeaders.push(header);\n\t\t}\n\t\theaderGroup.headers.push(headerToGroup);\n\t\theaderToGroup.headerGroup = headerGroup;\n\t}\n\tfor (let i = 0; i < headerGroupInitFns.length; i++) headerGroupInitFns[i](headerGroup);\n\theaderGroups.push(headerGroup);\n\tif (depth > 0) constructHeaderGroup(pendingParentHeaders, depth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n}\nfunction updateHeaderSpans(headers) {\n\tfor (let i = 0; i < headers.length; i++) {\n\t\tconst header = headers[i];\n\t\tif (!getIsColumnVisible(header.column)) continue;\n\t\tlet colSpan = 0;\n\t\tif (header.subHeaders.length) {\n\t\t\tupdateHeaderSpans(header.subHeaders);\n\t\t\tfor (let j = 0; j < header.subHeaders.length; j++) {\n\t\t\t\tconst child = header.subHeaders[j];\n\t\t\t\tif (!getIsColumnVisible(child.column)) continue;\n\t\t\t\tcolSpan += child.colSpan;\n\t\t\t}\n\t\t} else colSpan = 1;\n\t\theader.colSpan = colSpan;\n\t\tif (header.isPlaceholder && header.subHeaders.length === 1 && header.subHeaders[0].column === header.column) {\n\t\t\tlet rowSpan = 1;\n\t\t\tlet chainChild = header.subHeaders[0];\n\t\t\twhile (chainChild) {\n\t\t\t\tchainChild.rowSpan = 0;\n\t\t\t\trowSpan++;\n\t\t\t\tchainChild = chainChild.subHeaders.length === 1 && chainChild.subHeaders[0].column === header.column ? chainChild.subHeaders[0] : void 0;\n\t\t\t}\n\t\t\theader.rowSpan = rowSpan;\n\t\t} else header.rowSpan = 1;\n\t}\n}\n/**\n* Builds the nested header group structure for a table.\n*\n* The result accounts for visible leaf columns, pinned column groups, and placeholder headers needed to render multi-level headers.\n*/\nfunction buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {\n\tconst maxDepth = getMaxHeaderDepth(allColumns);\n\tconst headerGroups = [];\n\tconst headerGroupInitFns = table._headerGroupInstanceInitFns;\n\tconst bottomHeaders = new Array(columnsToGroup.length);\n\tfor (let i = 0; i < columnsToGroup.length; i++) {\n\t\tif (!(i in columnsToGroup)) continue;\n\t\tbottomHeaders[i] = constructHeader(table, columnsToGroup[i], {\n\t\t\tdepth: maxDepth,\n\t\t\tindex: i\n\t\t});\n\t}\n\tconstructHeaderGroup(bottomHeaders, maxDepth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n\theaderGroups.reverse();\n\tupdateHeaderSpans(headerGroups[0]?.headers ?? []);\n\treturn headerGroups;\n}\n\n//#endregion\nexport { buildHeaderGroups };","import { getVisibleLeafColumns, orderByColumnPinning } from \"../featureStubs.js\";\nimport { buildHeaderGroups } from \"./buildHeaderGroups.js\";\n\n//#region src/core/headers/coreHeadersFeature.utils.ts\nfunction collectLeafHeaders(header, leafHeaders) {\n\tfor (let i = 0; i < header.subHeaders.length; i++) collectLeafHeaders(header.subHeaders[i], leafHeaders);\n\tleafHeaders.push(header);\n}\n/**\n* Walks a header tree and collects all descendant leaf headers.\n*\n* The header itself is included after its descendants, matching the recursive\n* shape used by nested header groups.\n*\n* @example\n* ```ts\n* const leafHeaders = header_getLeafHeaders(header)\n* ```\n*/\nfunction header_getLeafHeaders(header) {\n\tconst leafHeaders = [];\n\tcollectLeafHeaders(header, leafHeaders);\n\treturn leafHeaders;\n}\n/**\n* Builds the render context passed to a column's `header` or `footer` template.\n*\n* The context contains the header, its column, and the owning table instance.\n*\n* @example\n* ```ts\n* const context = header_getContext(header)\n* ```\n*/\nfunction header_getContext(header) {\n\treturn {\n\t\tcolumn: header.column,\n\t\theader,\n\t\ttable: header.column.table\n\t};\n}\n/**\n* Builds visible header groups for the current column tree.\n*\n* Column visibility and pinning are applied before groups are built. When no\n* columns are pinned, the fast path skips pin partitioning.\n*\n* @example\n* ```ts\n* const headerGroups = table_getHeaderGroups(table)\n* ```\n*/\nfunction table_getHeaderGroups(table) {\n\treturn buildHeaderGroups(table.getAllColumns(), orderByColumnPinning(table, getVisibleLeafColumns(table), (column) => column.id), table);\n}\n/**\n* Builds footer groups by reversing the current header groups.\n*\n* Footer rendering uses the same header objects and grouping structure, but\n* renders them from leaf level back toward the root.\n*\n* @example\n* ```ts\n* const footerGroups = table_getFooterGroups(table)\n* ```\n*/\nfunction table_getFooterGroups(table) {\n\treturn [...table.getHeaderGroups()].reverse();\n}\n/**\n* Flattens every header from every header group into one array.\n*\n* The result includes parent headers and placeholder headers, in header-group\n* order from top to bottom.\n*\n* @example\n* ```ts\n* const flatHeaders = table_getFlatHeaders(table)\n* ```\n*/\nfunction table_getFlatHeaders(table) {\n\tconst headerGroups = table.getHeaderGroups();\n\tconst result = [];\n\tfor (let i = 0; i < headerGroups.length; i++) {\n\t\tconst headers = headerGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Collects only the leaf headers from the current header tree.\n*\n* Parent/group headers are skipped, making the result suitable for rendering\n* one header per visible leaf column.\n*\n* @example\n* ```ts\n* const leafHeaders = table_getLeafHeaders(table)\n* ```\n*/\nfunction table_getLeafHeaders(table) {\n\tconst topHeaders = table.getHeaderGroups()[0]?.headers ?? [];\n\tconst result = [];\n\tfor (let i = 0; i < topHeaders.length; i++) {\n\t\tconst leafHeaders = topHeaders[i].getLeafHeaders();\n\t\tfor (let j = 0; j < leafHeaders.length; j++) result.push(leafHeaders[j]);\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders } from \"./coreHeadersFeature.utils.js\";\n\n//#region src/core/headers/coreHeadersFeature.ts\n/**\n* Core feature that builds header groups and exposes header context APIs.\n*/\nconst coreHeadersFeature = {\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreHeadersFeature\", prototype, table, {\n\t\t\theader_getLeafHeaders: {\n\t\t\t\tfn: (header) => header_getLeafHeaders(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t},\n\t\t\theader_getContext: {\n\t\t\t\tfn: (header) => header_getContext(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreHeadersFeature\", table, {\n\t\t\ttable_getHeaderGroups: {\n\t\t\t\tfn: () => table_getHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getFooterGroups: {\n\t\t\t\tfn: () => table_getFooterGroups(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getFlatHeaders: {\n\t\t\t\tfn: () => table_getFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getLeafHeaders: {\n\t\t\t\tfn: () => table_getLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreHeadersFeature };","import { makeObjectMap } from \"../../utils.js\";\n\n//#region src/core/rows/constructRow.ts\n/**\n* Creates or retrieves the row prototype for a table.\n* The prototype is cached on the table and shared by all row instances.\n*/\nfunction getRowPrototype(table) {\n\tif (!table._rowPrototype) {\n\t\ttable._rowPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignRowPrototype?.(table._rowPrototype, table);\n\t}\n\treturn table._rowPrototype;\n}\n/**\n* Constructs a row instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nconst constructRow = (table, id, original, rowIndex, depth, subRows, parentId) => {\n\tconst rowPrototype = getRowPrototype(table);\n\tconst row = Object.create(rowPrototype);\n\trow._displayIndexCache = -1;\n\trow._uniqueValuesCache = makeObjectMap();\n\trow._valuesCache = makeObjectMap();\n\trow.depth = depth;\n\trow.id = id;\n\trow.index = rowIndex;\n\trow.original = original;\n\trow.parentId = parentId;\n\trow.subRows = subRows ?? [];\n\tconst initFns = table._rowInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](row);\n\treturn row;\n};\n\n//#endregion\nexport { constructRow };","import { makeObjectMap, skipFirstRun, tableMemo } from \"../../utils.js\";\nimport { autoResetCellSelection, autoResetExpanded, autoResetPageIndex, autoResetSorting } from \"../featureStubs.js\";\nimport { constructRow } from \"../rows/constructRow.js\";\n\n//#region src/core/row-models/createCoreRowModel.ts\n/**\n* Creates a memoized core row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*/\nfunction createCoreRowModel() {\n\treturn (table) => {\n\t\treturn tableMemo({\n\t\t\tfeature: \"coreRowModelsFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getCoreRowModel\",\n\t\t\tmemoDeps: () => [table.options.data],\n\t\t\tfn: () => _createCoreRowModel(table, table.options.data),\n\t\t\tonAfterUpdate: skipFirstRun(() => {\n\t\t\t\tautoResetExpanded(table);\n\t\t\t\tautoResetPageIndex(table);\n\t\t\t\tautoResetSorting(table);\n\t\t\t\tautoResetCellSelection(table);\n\t\t\t})\n\t\t});\n\t};\n}\nfunction accessRows(table, rowModel, originalRows, depth = 0, parentRow) {\n\tconst rows = [];\n\tfor (let i = 0; i < originalRows.length; i++) {\n\t\tconst originalRow = originalRows[i];\n\t\tconst row = constructRow(table, table.getRowId(originalRow, i, parentRow), originalRow, i, depth, void 0, parentRow?.id);\n\t\trowModel.flatRows.push(row);\n\t\trowModel.rowsById[row.id] = row;\n\t\trows.push(row);\n\t\tif (table.options.getSubRows) {\n\t\t\trow.originalSubRows = table.options.getSubRows(originalRow, i);\n\t\t\tif (row.originalSubRows?.length) row.subRows = accessRows(table, rowModel, row.originalSubRows, depth + 1, row);\n\t\t}\n\t}\n\treturn rows;\n}\nfunction _createCoreRowModel(table, data) {\n\tconst rowModel = {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\trowModel.rows = accessRows(table, rowModel, data);\n\treturn rowModel;\n}\n\n//#endregion\nexport { createCoreRowModel };","import { createCoreRowModel } from \"./createCoreRowModel.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.utils.ts\n/**\n* Resolves the table's unmodified core row model.\n*\n* The factory is created once per table, either from the `coreRowModel` slot on the `features` option\n* or the built-in `createCoreRowModel()`, then reused for later calls.\n*\n* @example\n* ```ts\n* const coreRows = table_getCoreRowModel(table)\n* ```\n*/\nfunction table_getCoreRowModel(table) {\n\tif (!table._rowModels.coreRowModel) table._rowModels.coreRowModel = table.options.features.coreRowModel?.(table) ?? createCoreRowModel()(table);\n\treturn table._rowModels.coreRowModel();\n}\n/**\n* Reads the row model immediately before column/global filtering.\n*\n* Filtering is the first derived row-model stage, so this currently aliases\n* `table.getCoreRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeFiltering = table_getPreFilteredRowModel(table)\n* ```\n*/\nfunction table_getPreFilteredRowModel(table) {\n\treturn table.getCoreRowModel();\n}\n/**\n* Resolves the row model after column and global filtering.\n*\n* When `manualFiltering` is enabled, or no filtered row-model factory was\n* registered, this returns the pre-filtered row model because filtering is\n* expected to happen outside the table.\n*\n* @example\n* ```ts\n* const filteredRows = table_getFilteredRowModel(table)\n* ```\n*/\nfunction table_getFilteredRowModel(table) {\n\tif (!table._rowModels.filteredRowModel) table._rowModels.filteredRowModel = table.options.features.filteredRowModel?.(table);\n\tif (table.options.manualFiltering || !table._rowModels.filteredRowModel) return table.getPreFilteredRowModel();\n\treturn table._rowModels.filteredRowModel();\n}\n/**\n* Reads the row model immediately before grouping.\n*\n* Grouping runs after filtering, so this aliases `table.getFilteredRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeGrouping = table_getPreGroupedRowModel(table)\n* ```\n*/\nfunction table_getPreGroupedRowModel(table) {\n\treturn table.getFilteredRowModel();\n}\n/**\n* Resolves the row model after grouping has produced grouped rows.\n*\n* When `manualGrouping` is enabled, or no grouped row-model factory was\n* registered, this returns the pre-grouped row model unchanged.\n*\n* @example\n* ```ts\n* const groupedRows = table_getGroupedRowModel(table)\n* ```\n*/\nfunction table_getGroupedRowModel(table) {\n\tif (!table._rowModels.groupedRowModel) table._rowModels.groupedRowModel = table.options.features.groupedRowModel?.(table);\n\tif (table.options.manualGrouping || !table._rowModels.groupedRowModel) return table.getPreGroupedRowModel();\n\treturn table._rowModels.groupedRowModel();\n}\n/**\n* Reads the row model immediately before sorting.\n*\n* Sorting runs after grouping, so this aliases `table.getGroupedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeSorting = table_getPreSortedRowModel(table)\n* ```\n*/\nfunction table_getPreSortedRowModel(table) {\n\treturn table.getGroupedRowModel();\n}\n/**\n* Resolves the row model after sorting has been applied.\n*\n* When `manualSorting` is enabled, or no sorted row-model factory was\n* registered, this returns the pre-sorted row model because sorted data is\n* expected to be supplied by the caller.\n*\n* @example\n* ```ts\n* const sortedRows = table_getSortedRowModel(table)\n* ```\n*/\nfunction table_getSortedRowModel(table) {\n\tif (!table._rowModels.sortedRowModel) table._rowModels.sortedRowModel = table.options.features.sortedRowModel?.(table);\n\tif (table.options.manualSorting || !table._rowModels.sortedRowModel) return table.getPreSortedRowModel();\n\treturn table._rowModels.sortedRowModel();\n}\n/**\n* Reads the row model immediately before row expansion.\n*\n* Expansion runs after sorting, so this aliases `table.getSortedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeExpansion = table_getPreExpandedRowModel(table)\n* ```\n*/\nfunction table_getPreExpandedRowModel(table) {\n\treturn table.getSortedRowModel();\n}\n/**\n* Resolves the row model after expanded rows have been flattened into view.\n*\n* When `manualExpanding` is enabled, or no expanded row-model factory was\n* registered, this returns the pre-expanded row model unchanged.\n*\n* @example\n* ```ts\n* const expandedRows = table_getExpandedRowModel(table)\n* ```\n*/\nfunction table_getExpandedRowModel(table) {\n\tif (!table._rowModels.expandedRowModel) table._rowModels.expandedRowModel = table.options.features.expandedRowModel?.(table);\n\tif (table.options.manualExpanding || !table._rowModels.expandedRowModel) return table.getPreExpandedRowModel();\n\treturn table._rowModels.expandedRowModel();\n}\n/**\n* Reads the row model immediately before pagination.\n*\n* Pagination is the final built-in row-model stage, so this aliases\n* `table.getExpandedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforePagination = table_getPrePaginatedRowModel(table)\n* ```\n*/\nfunction table_getPrePaginatedRowModel(table) {\n\treturn table.getExpandedRowModel();\n}\n/**\n* Resolves the row model after pagination has sliced rows for the current page.\n*\n* When `manualPagination` is enabled, or no paginated row-model factory was\n* registered, this returns the pre-paginated row model because pagination is\n* expected to happen before data reaches the table.\n*\n* @example\n* ```ts\n* const pageRows = table_getPaginatedRowModel(table)\n* ```\n*/\nfunction table_getPaginatedRowModel(table) {\n\tif (!table._rowModels.paginatedRowModel) table._rowModels.paginatedRowModel = table.options.features.paginatedRowModel?.(table);\n\tif (table.options.manualPagination || !table._rowModels.paginatedRowModel) return table.getPrePaginatedRowModel();\n\treturn table._rowModels.paginatedRowModel();\n}\n/**\n* Resolves the final row model consumed by renderers.\n*\n* This is the end of the built-in row-model pipeline: core -> filtering ->\n* grouping -> sorting -> expanding -> pagination.\n*\n* @example\n* ```ts\n* const visibleRows = table_getRowModel(table)\n* ```\n*/\nfunction table_getRowModel(table) {\n\treturn table.getPaginatedRowModel();\n}\n\n//#endregion\nexport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel } from \"./coreRowModelsFeature.utils.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.ts\n/**\n* Core feature that wires table row-model accessors and row-model caches.\n*/\nconst coreRowModelsFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreRowModelsFeature\", table, {\n\t\ttable_getCoreRowModel: { fn: () => table_getCoreRowModel(table) },\n\t\ttable_getPreFilteredRowModel: { fn: () => table_getPreFilteredRowModel(table) },\n\t\ttable_getFilteredRowModel: { fn: () => table_getFilteredRowModel(table) },\n\t\ttable_getPreGroupedRowModel: { fn: () => table_getPreGroupedRowModel(table) },\n\t\ttable_getGroupedRowModel: { fn: () => table_getGroupedRowModel(table) },\n\t\ttable_getPreSortedRowModel: { fn: () => table_getPreSortedRowModel(table) },\n\t\ttable_getSortedRowModel: { fn: () => table_getSortedRowModel(table) },\n\t\ttable_getPreExpandedRowModel: { fn: () => table_getPreExpandedRowModel(table) },\n\t\ttable_getExpandedRowModel: { fn: () => table_getExpandedRowModel(table) },\n\t\ttable_getPrePaginatedRowModel: { fn: () => table_getPrePaginatedRowModel(table) },\n\t\ttable_getPaginatedRowModel: { fn: () => table_getPaginatedRowModel(table) },\n\t\ttable_getRowModel: { fn: () => table_getRowModel(table) }\n\t});\n} };\n\n//#endregion\nexport { coreRowModelsFeature };","//#region src/core/cells/constructCell.ts\n/**\n* Creates or retrieves the cell prototype for a table.\n* The prototype is cached on the table and shared by all cell instances.\n*/\nfunction getCellPrototype(table) {\n\tif (!table._cellPrototype) {\n\t\ttable._cellPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignCellPrototype?.(table._cellPrototype, table);\n\t}\n\treturn table._cellPrototype;\n}\n/**\n* Constructs a cell instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructCell(column, row, table) {\n\tconst cellPrototype = getCellPrototype(table);\n\tconst cell = Object.create(cellPrototype);\n\tcell.column = column;\n\tcell.id = `${row.id}_${column.id}`;\n\tcell.row = row;\n\tconst initFns = table._cellInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](cell);\n\treturn cell;\n}\n\n//#endregion\nexport { constructCell };","import { flattenBy, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { expandRowModel } from \"../featureStubs.js\";\nimport { constructCell } from \"../cells/constructCell.js\";\n\n//#region src/core/rows/coreRowsFeature.utils.ts\n/**\n* Returns this row's zero-based position in the current pre-pagination row\n* model. Rows outside that model return `-1`.\n*/\nfunction row_getDisplayIndex(row) {\n\tconst rows = row.table.getRowsInDisplayOrder();\n\tconst displayIndex = row._displayIndexCache;\n\treturn rows[displayIndex] === row ? displayIndex : -1;\n}\n/**\n* Returns the rows in the current display order after assigning their\n* zero-based display indexes.\n*\n* When expanded rows bypass pagination, expanded descendants are inserted into\n* the returned order even though they are absent from the pre-pagination row\n* model.\n*/\nfunction table_getRowsInDisplayOrder(table) {\n\tconst rowModel = table.getPrePaginatedRowModel();\n\tconst rows = table.options.paginateExpandedRows === false ? expandRowModel(table, rowModel).rows : rowModel.rows;\n\tfor (let i = 0; i < rows.length; i++) rows[i]._displayIndexCache = i;\n\treturn rows;\n}\n/**\n* Reads and caches this row's value for a column.\n*\n* The value is produced by the column accessor. Missing columns or display\n* columns without an accessor return `undefined`.\n*\n* @example\n* ```ts\n* const firstName = row_getValue(row, 'firstName')\n* ```\n*/\nfunction row_getValue(row, columnId) {\n\tif (hasOwn(row._valuesCache, columnId)) return row._valuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\trow._valuesCache[columnId] = column.accessorFn(row.original, row.index);\n\treturn row._valuesCache[columnId];\n}\n/**\n* Reads and caches the values used by faceting/grouping for a column.\n*\n* If the column defines `getUniqueValues`, that result is used. Otherwise the\n* row's accessor value is wrapped in a single-item array.\n*\n* @example\n* ```ts\n* const values = row_getUniqueValues(row, 'tags')\n* ```\n*/\nfunction row_getUniqueValues(row, columnId) {\n\tif (hasOwn(row._uniqueValuesCache, columnId)) return row._uniqueValuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\tif (!column.columnDef.getUniqueValues) {\n\t\trow._uniqueValuesCache[columnId] = [row.getValue(columnId)];\n\t\treturn row._uniqueValuesCache[columnId];\n\t}\n\trow._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, row.index);\n\treturn row._uniqueValuesCache[columnId];\n}\n/**\n* Returns a renderable row value for a column.\n*\n* If the accessor value is nullish, the table's `renderFallbackValue` is used\n* instead.\n*\n* @example\n* ```ts\n* const value = row_renderValue(row, 'firstName')\n* ```\n*/\nfunction row_renderValue(row, columnId) {\n\treturn row.getValue(columnId) ?? row.table.options.renderFallbackValue;\n}\n/**\n* Flattens this row's descendant tree into leaf rows.\n*\n* The row itself is not included; only nested `subRows` are walked.\n*\n* @example\n* ```ts\n* const descendants = row_getLeafRows(row)\n* ```\n*/\nfunction row_getLeafRows(row) {\n\treturn flattenBy(row.subRows, (d) => d.subRows);\n}\n/**\n* Returns the deepest structural row depth in the core row model.\n* Root rows are depth `0`, their direct sub-rows are depth `1`, and so on.\n*/\nfunction table_getMaxSubRowDepth(table) {\n\tconst rows = table.getCoreRowModel().flatRows;\n\tlet maxDepth = 0;\n\tfor (let i = 0; i < rows.length; i++) maxDepth = Math.max(maxDepth, rows[i].depth);\n\treturn maxDepth;\n}\n/**\n* Looks up this row's direct parent, if it has one.\n*\n* Parent lookup prefers the core row model for structural parents, then falls\n* back to the pre-pagination row model for generated parent rows.\n*\n* @example\n* ```ts\n* const parent = row_getParentRow(row)\n* ```\n*/\nfunction row_getParentRow(row) {\n\tif (!row.parentId) return;\n\treturn row.table.getCoreRowModel().rowsById[row.parentId] ?? row.table.getRow(row.parentId, true);\n}\n/**\n* Collects this row's ancestor chain from root to direct parent.\n*\n* The current row is not included. Rows without a parent return an empty array.\n*\n* @example\n* ```ts\n* const ancestors = row_getParentRows(row)\n* ```\n*/\nfunction row_getParentRows(row) {\n\tconst parentRows = [];\n\tlet currentRow = row;\n\twhile (true) {\n\t\tconst parentRow = currentRow.getParentRow();\n\t\tif (!parentRow) break;\n\t\tparentRows.push(parentRow);\n\t\tcurrentRow = parentRow;\n\t}\n\treturn parentRows.reverse();\n}\n/**\n* Constructs one cell for each leaf column in this row.\n*\n* The result follows `table.getAllLeafColumns()` order and includes hidden\n* columns; visibility-specific APIs filter this list later.\n*\n* @example\n* ```ts\n* const cells = row_getAllCells(row)\n* ```\n*/\nfunction row_getAllCells(row) {\n\tconst columns = row.table.getAllLeafColumns();\n\tlet cache = row._cellsCache;\n\tif (!cache) cache = row._cellsCache = /* @__PURE__ */ new WeakMap();\n\tconst cells = new Array(columns.length);\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tlet cell = cache.get(column);\n\t\tif (!cell) {\n\t\t\tcell = constructCell(column, row, row.table);\n\t\t\tcache.set(column, cell);\n\t\t}\n\t\tcells[i] = cell;\n\t}\n\treturn cells;\n}\n/**\n* Builds a lookup map of this row's cells keyed by column id.\n*\n* This is the static implementation behind `row.getAllCellsByColumnId()`.\n*\n* @example\n* ```ts\n* const cellsById = row_getAllCellsByColumnId(row)\n* ```\n*/\nfunction row_getAllCellsByColumnId(row) {\n\tconst result = makeObjectMap();\n\tconst cells = row.getAllCells();\n\tfor (let i = 0; i < cells.length; i++) {\n\t\tconst cell = cells[i];\n\t\tresult[cell.column.id] = cell;\n\t}\n\treturn result;\n}\n/**\n* Resolves the stable id for a row.\n*\n* `options.getRowId` wins when provided. Otherwise root rows use their index\n* and child rows append their index to the parent id, such as `0.2`.\n*\n* @example\n* ```ts\n* const id = table_getRowId(originalRow, table, index, parentRow)\n* ```\n*/\nfunction table_getRowId(originalRow, table, index, parent) {\n\treturn table.options.getRowId?.(originalRow, index, parent) ?? (parent ? `${parent.id}.${index}` : String(index));\n}\n/**\n* Looks up a row by id from the current or full row model.\n*\n* By default this searches `table.getRowModel()`. Passing `searchAll` searches\n* the pre-pagination model first, then falls back to the core model.\n*\n* @example\n* ```ts\n* const row = table_getRow(table, rowId, true)\n* ```\n*/\nfunction table_getRow(table, rowId, searchAll) {\n\tlet row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel()).rowsById[rowId];\n\tif (!row) {\n\t\trow = table.getCoreRowModel().rowsById[rowId];\n\t\tif (!row) {\n\t\t\tif (process.env.NODE_ENV === \"development\") throw new Error(`getRow could not find row with ID: ${rowId}`);\n\t\t\tthrow new Error();\n\t\t}\n\t}\n\treturn row;\n}\n\n//#endregion\nexport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder } from \"./coreRowsFeature.utils.js\";\n\n//#region src/core/rows/coreRowsFeature.ts\n/**\n* Core feature that creates row APIs for values, cells, and tree traversal.\n*/\nconst coreRowsFeature = {\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreRowsFeature\", prototype, table, {\n\t\t\trow_getDisplayIndex: { fn: (row) => row_getDisplayIndex(row) },\n\t\t\trow_getAllCellsByColumnId: {\n\t\t\t\tfn: (row) => row_getAllCellsByColumnId(row),\n\t\t\t\tmemoDeps: (row) => [row.getAllCells()]\n\t\t\t},\n\t\t\trow_getAllCells: {\n\t\t\t\tfn: (row) => row_getAllCells(row),\n\t\t\t\tmemoDeps: (row) => [row.table.getAllLeafColumns()]\n\t\t\t},\n\t\t\trow_getLeafRows: {\n\t\t\t\tfn: (row) => row_getLeafRows(row),\n\t\t\t\tmemoDeps: (row) => [row.subRows]\n\t\t\t},\n\t\t\trow_getParentRow: { fn: (row) => row_getParentRow(row) },\n\t\t\trow_getParentRows: { fn: (row) => row_getParentRows(row) },\n\t\t\trow_getUniqueValues: { fn: (row, columnId) => row_getUniqueValues(row, columnId) },\n\t\t\trow_getValue: { fn: (row, columnId) => row_getValue(row, columnId) },\n\t\t\trow_renderValue: { fn: (row, columnId) => row_renderValue(row, columnId) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreRowsFeature\", table, {\n\t\t\ttable_getRowsInDisplayOrder: {\n\t\t\t\tfn: () => table_getRowsInDisplayOrder(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getPrePaginatedRowModel().rows,\n\t\t\t\t\ttable.options.paginateExpandedRows,\n\t\t\t\t\ttable.options.paginateExpandedRows === false ? table.atoms.expanded?.get() : void 0\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getRowId: { fn: (originalRow, index, parent) => table_getRowId(originalRow, table, index, parent) },\n\t\t\ttable_getRow: { fn: (id, searchAll) => table_getRow(table, id, searchAll) },\n\t\t\ttable_getMaxSubRowDepth: {\n\t\t\t\tfn: () => table_getMaxSubRowDepth(table),\n\t\t\t\tmemoDeps: () => [table.getCoreRowModel()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreRowsFeature };","import { cloneState, functionalUpdate } from \"../../utils.js\";\n\n//#region src/core/table/coreTablesFeature.utils.ts\n/**\n* Synchronizes externally controlled state slices into the table's base atoms.\n*\n* This keeps `options.state` values mirrored in the atom graph so derived\n* atoms, stores, and table APIs read a consistent snapshot.\n*\n* Adapters that update options during their host's render phase pass the\n* state snapshot captured by the committed render as `capturedState` — the\n* shared options object may already hold values from a newer render that\n* never commits. Pass `null` to publish nothing (a captured \"no controlled\n* state\"); omitting the argument reads the current `table.options.state`\n* instead. An optional `compare` suppresses semantically unchanged slice\n* writes; the default remains reference equality.\n*\n* @example\n* ```ts\n* table_syncExternalStateToBaseAtoms(table)\n* table_syncExternalStateToBaseAtoms(table, capturedState ?? null, shallow)\n* ```\n*/\nfunction table_syncExternalStateToBaseAtoms(table, capturedState, compare = (currentState, externalState) => currentState === externalState) {\n\tconst state = capturedState === void 0 ? table.options.state : capturedState;\n\ttable._reactivity.batch(() => {\n\t\tif (state) for (const key in state) {\n\t\t\tconst baseAtom = table.baseAtoms[key];\n\t\t\tif (!baseAtom) continue;\n\t\t\tconst rawExternalState = state[key];\n\t\t\tconst externalState = rawExternalState === void 0 ? table.initialState[key] : rawExternalState;\n\t\t\tif (!compare(table._reactivity.untrack(() => baseAtom.get()), externalState)) baseAtom.set(() => externalState);\n\t\t}\n\t});\n}\n/**\n* Publishes captured controlled state after a host framework commits.\n*\n* Render-phase adapters stage options without synchronizing base atoms, then\n* pass the state captured by the committed render here. The commit signal also\n* invalidates ownership changes when no base atom was written.\n*/\nfunction table_publishExternalState(table, state, compare = (currentState, externalState) => currentState === externalState) {\n\ttable._reactivity.batch(() => {\n\t\ttable_syncExternalStateToBaseAtoms(table, state, compare);\n\t\ttable._reactivity.commit?.();\n\t});\n}\n/**\n* Resets all internal table base atoms to `table.initialState`, then clears\n* transient instance data through registered feature reset hooks.\n*\n* This resets internally owned state slices in a single reactivity batch. Use\n* feature-specific reset APIs when a slice may be externally owned.\n*\n* @example\n* ```ts\n* table_reset(table)\n* ```\n*/\nfunction table_reset(table) {\n\tconst snap = cloneState(table.initialState);\n\ttable._reactivity.batch(() => {\n\t\tconst keys = Object.keys(snap);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\ttable.baseAtoms[key].set(snap[key]);\n\t\t}\n\t});\n\tconst features = Object.values(table._features);\n\tfor (let i = 0; i < features.length; i++) features[i].resetTableInstanceData?.(table);\n}\n/**\n* Merges new table options with the current resolved options.\n*\n* If `options.mergeOptions` is provided, it owns the merge behavior; otherwise\n* options are shallow-merged. Static options that should never change after\n* initialization are restored on a fresh object so framework merge helpers may\n* return readonly getter/proxy objects.\n*\n* @example\n* ```ts\n* const options = table_mergeOptions(table, nextOptions)\n* ```\n*/\nfunction table_mergeOptions(table, newOptions) {\n\tconst { features, atoms, initialState } = table.options;\n\tif (!table.options.mergeOptions) return {\n\t\t...table.options,\n\t\t...newOptions,\n\t\tfeatures,\n\t\tatoms,\n\t\tinitialState\n\t};\n\tconst mergedOptions = table.options.mergeOptions(table.options, newOptions);\n\tconst descriptors = { ...Object.getOwnPropertyDescriptors(mergedOptions) };\n\treturn Object.defineProperties(Object.create(Object.getPrototypeOf(mergedOptions)), {\n\t\t...descriptors,\n\t\tfeatures: {\n\t\t\tvalue: features,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tatoms: {\n\t\t\tvalue: atoms,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tinitialState: {\n\t\t\tvalue: initialState,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t}\n\t});\n}\n/**\n* Updates the table options object.\n*\n* The updater receives the current resolved options and the merged result is\n* immediately assigned to the table instance.\n*\n* @example\n* ```ts\n* table_setOptions(table, (old) => old)\n* table_setOptions(table, (old) => old, { syncExternalState: false })\n* ```\n*/\nfunction table_setOptions(table, updater, options) {\n\tconst mergedOptions = table_mergeOptions(table, functionalUpdate(updater, table.options));\n\tif (table.optionsStore) table.optionsStore.set(() => mergedOptions);\n\telse table.options = mergedOptions;\n\tif (options?.syncExternalState !== false) table_publishExternalState(table, mergedOptions.state ?? null);\n}\n\n//#endregion\nexport { table_mergeOptions, table_publishExternalState, table_reset, table_setOptions, table_syncExternalStateToBaseAtoms };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_reset, table_setOptions } from \"./coreTablesFeature.utils.js\";\n\n//#region src/core/table/coreTablesFeature.ts\n/**\n* Core feature that adds base table instance APIs such as reset and setOptions.\n*/\nconst coreTablesFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreTablesFeature\", table, {\n\t\ttable_reset: { fn: () => table_reset(table) },\n\t\ttable_setOptions: { fn: (updater) => table_setOptions(table, updater) }\n\t});\n} };\n\n//#endregion\nexport { coreTablesFeature };","import { coreCellsFeature } from \"./cells/coreCellsFeature.js\";\nimport { coreColumnsFeature } from \"./columns/coreColumnsFeature.js\";\nimport { coreHeadersFeature } from \"./headers/coreHeadersFeature.js\";\nimport { coreRowModelsFeature } from \"./row-models/coreRowModelsFeature.js\";\nimport { coreRowsFeature } from \"./rows/coreRowsFeature.js\";\nimport { coreTablesFeature } from \"./table/coreTablesFeature.js\";\n\n//#region src/core/coreFeatures.ts\n/**\n* The built-in core feature set required by every table.\n*\n* These features provide table, column, row, header, cell, and core row-model behavior before optional feature plugins are added.\n*/\nconst coreFeatures = {\n\tcoreCellsFeature,\n\tcoreColumnsFeature,\n\tcoreHeadersFeature,\n\tcoreRowModelsFeature,\n\tcoreRowsFeature,\n\tcoreTablesFeature\n};\n\n//#endregion\nexport { coreFeatures };","//#region src/helpers/tableFeatures.ts\n/**\n* A helper function to help define the features that are to be imported and applied to a table instance.\n* Use this utility to make it easier to have the correct type inference for the features that are being imported.\n* **Note:** It is recommended to use this utility statically outside of a component.\n*\n* Alongside feature modules, this object carries everything else that is\n* statically stitched into the table:\n*\n* - Row model factories (`sortedRowModel`, `filteredRowModel`, etc.)\n* - Row model function registries (`sortFns`, `filterFns`, `aggregationFns`),\n* whose keys become the valid string values for `sortFn`, `filterFn`,\n* `globalFilterFn`, and `aggregationFn` with full inference\n* - Type-only `tableMeta`/`columnMeta` slots for declaring per-table meta types\n* instead of using global declaration merging. The values are phantom\n* (ignored and stripped at runtime); only their types are used.\n* @example\n* ```\n* import {\n* columnFilteringFeature,\n* createFilteredRowModel,\n* createSortedRowModel,\n* filterFn_includesString,\n* rowSortingFeature,\n* sortFn_alphanumeric,\n* sortFn_text,\n* tableFeatures,\n* } from '@tanstack/react-table'\n* const features = tableFeatures({\n* columnFilteringFeature,\n* rowSortingFeature,\n* filteredRowModel: createFilteredRowModel(),\n* sortedRowModel: createSortedRowModel(),\n* filterFns: { includesString: filterFn_includesString, myCustomFilterFn },\n* sortFns: { alphanumeric: sortFn_alphanumeric, text: sortFn_text },\n* tableMeta: {} as { updateData: (rowIndex: number, columnId: string, value: unknown) => void },\n* columnMeta: {} as { align?: 'left' | 'right' },\n* });\n* const table = useTable({ features, columns, data });\n* ```\n*/\nfunction tableFeatures(features) {\n\treturn features;\n}\n\n//#endregion\nexport { tableFeatures };","//#region src/core/reactivity/coreReactivityFeature.utils.ts\n/**\n* Bridges atom instances to the `Store`/`ReadonlyStore` API by exposing\n* a `state` getter backed by `atom.get()`, and wiring `setState` for\n* writable atoms.\n*\n* @example\n* ```ts\n* const store = atomToStore(atom)\n* ```\n*/\nfunction atomToStore(atom) {\n\tconst store = atom;\n\tObject.defineProperty(atom, \"state\", { get() {\n\t\treturn atom.get();\n\t} });\n\tif (\"set\" in atom) store.setState = atom.set.bind(atom);\n\treturn store;\n}\n\n//#endregion\nexport { atomToStore };","//#region src/alien.ts\nconst NONE = 0;\nconst MUTABLE = 1;\nconst WATCHING = 2;\nconst RECURSED_CHECK = 4;\nconst RECURSED = 8;\nconst DIRTY = 16;\nconst PENDING = 32;\n/* @__NO_SIDE_EFFECTS__ */\nfunction createReactiveSystem({ update, notify, unwatched }) {\n\treturn {\n\t\tlink,\n\t\tunlink,\n\t\tpropagate,\n\t\tcheckDirty,\n\t\tshallowPropagate\n\t};\n\tfunction link(dep, sub, version) {\n\t\tconst prevDep = sub.depsTail;\n\t\tif (prevDep !== void 0 && prevDep.dep === dep) return;\n\t\tconst nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;\n\t\tif (nextDep !== void 0 && nextDep.dep === dep) {\n\t\t\tnextDep.version = version;\n\t\t\tsub.depsTail = nextDep;\n\t\t\treturn;\n\t\t}\n\t\tconst prevSub = dep.subsTail;\n\t\tif (prevSub !== void 0 && prevSub.version === version && prevSub.sub === sub) return;\n\t\tconst newLink = sub.depsTail = dep.subsTail = {\n\t\t\tversion,\n\t\t\tdep,\n\t\t\tsub,\n\t\t\tprevDep,\n\t\t\tnextDep,\n\t\t\tprevSub,\n\t\t\tnextSub: void 0\n\t\t};\n\t\tif (nextDep !== void 0) nextDep.prevDep = newLink;\n\t\tif (prevDep !== void 0) prevDep.nextDep = newLink;\n\t\telse sub.deps = newLink;\n\t\tif (prevSub !== void 0) prevSub.nextSub = newLink;\n\t\telse dep.subs = newLink;\n\t}\n\tfunction unlink(link, sub = link.sub) {\n\t\tconst dep = link.dep;\n\t\tconst prevDep = link.prevDep;\n\t\tconst nextDep = link.nextDep;\n\t\tconst nextSub = link.nextSub;\n\t\tconst prevSub = link.prevSub;\n\t\tif (nextDep !== void 0) nextDep.prevDep = prevDep;\n\t\telse sub.depsTail = prevDep;\n\t\tif (prevDep !== void 0) prevDep.nextDep = nextDep;\n\t\telse sub.deps = nextDep;\n\t\tif (nextSub !== void 0) nextSub.prevSub = prevSub;\n\t\telse dep.subsTail = prevSub;\n\t\tif (prevSub !== void 0) prevSub.nextSub = nextSub;\n\t\telse if ((dep.subs = nextSub) === void 0) unwatched(dep);\n\t\treturn nextDep;\n\t}\n\tfunction propagate(link) {\n\t\tlet next = link.nextSub;\n\t\tlet stack;\n\t\ttop: do {\n\t\t\tconst sub = link.sub;\n\t\t\tlet flags = sub.flags;\n\t\t\tif (!(flags & 60)) sub.flags = flags | 32;\n\t\t\telse if (!(flags & (4 | 8))) flags = 0;\n\t\t\telse if (!(flags & 4)) sub.flags = flags & ~8 | 32;\n\t\t\telse if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n\t\t\t\tsub.flags = flags | (8 | 32);\n\t\t\t\tflags &= 1;\n\t\t\t} else flags = 0;\n\t\t\tif (flags & 2) notify(sub);\n\t\t\tif (flags & 1) {\n\t\t\t\tconst subSubs = sub.subs;\n\t\t\t\tif (subSubs !== void 0) {\n\t\t\t\t\tconst nextSub = (link = subSubs).nextSub;\n\t\t\t\t\tif (nextSub !== void 0) {\n\t\t\t\t\t\tstack = {\n\t\t\t\t\t\t\tvalue: next,\n\t\t\t\t\t\t\tprev: stack\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnext = nextSub;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((link = next) !== void 0) {\n\t\t\t\tnext = link.nextSub;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twhile (stack !== void 0) {\n\t\t\t\tlink = stack.value;\n\t\t\t\tstack = stack.prev;\n\t\t\t\tif (link !== void 0) {\n\t\t\t\t\tnext = link.nextSub;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t} while (true);\n\t}\n\tfunction checkDirty(link, sub) {\n\t\tlet stack;\n\t\tlet checkDepth = 0;\n\t\tlet dirty = false;\n\t\ttop: do {\n\t\t\tconst dep = link.dep;\n\t\t\tconst flags = dep.flags;\n\t\t\tif (sub.flags & 16) dirty = true;\n\t\t\telse if ((flags & (1 | 16)) === (1 | 16)) {\n\t\t\t\tif (update(dep)) {\n\t\t\t\t\tconst subs = dep.subs;\n\t\t\t\t\tif (subs.nextSub !== void 0) shallowPropagate(subs);\n\t\t\t\t\tdirty = true;\n\t\t\t\t}\n\t\t\t} else if ((flags & (1 | 32)) === (1 | 32)) {\n\t\t\t\tif (link.nextSub !== void 0 || link.prevSub !== void 0) stack = {\n\t\t\t\t\tvalue: link,\n\t\t\t\t\tprev: stack\n\t\t\t\t};\n\t\t\t\tlink = dep.deps;\n\t\t\t\tsub = dep;\n\t\t\t\t++checkDepth;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!dirty) {\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (checkDepth--) {\n\t\t\t\tconst firstSub = sub.subs;\n\t\t\t\tconst hasMultipleSubs = firstSub.nextSub !== void 0;\n\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\tlink = stack.value;\n\t\t\t\t\tstack = stack.prev;\n\t\t\t\t} else link = firstSub;\n\t\t\t\tif (dirty) {\n\t\t\t\t\tif (update(sub)) {\n\t\t\t\t\t\tif (hasMultipleSubs) shallowPropagate(firstSub);\n\t\t\t\t\t\tsub = link.sub;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdirty = false;\n\t\t\t\t} else sub.flags &= ~32;\n\t\t\t\tsub = link.sub;\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dirty;\n\t\t} while (true);\n\t}\n\tfunction shallowPropagate(link) {\n\t\tdo {\n\t\t\tconst sub = link.sub;\n\t\t\tconst flags = sub.flags;\n\t\t\tif ((flags & (32 | 16)) === 32) {\n\t\t\t\tsub.flags = flags | 16;\n\t\t\t\tif ((flags & (2 | 4)) === 2) notify(sub);\n\t\t\t}\n\t\t} while ((link = link.nextSub) !== void 0);\n\t}\n\tfunction isValidLink(checkLink, sub) {\n\t\tlet link = sub.depsTail;\n\t\twhile (link !== void 0) {\n\t\t\tif (link === checkLink) return true;\n\t\t\tlink = link.prevDep;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n//#endregion\nexport { createReactiveSystem };\n//# sourceMappingURL=alien.js.map","import { createReactiveSystem } from \"./alien.js\";\n\n//#region src/atom.ts\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n\tconst isObserver = typeof nextHandler === \"object\";\n\tconst self = isObserver ? nextHandler : void 0;\n\treturn {\n\t\tnext: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n\t\terror: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n\t\tcomplete: (isObserver ? nextHandler.complete : completionHandler)?.bind(self)\n\t};\n}\nconst queuedEffects = [];\nlet cycle = 0;\nconst { link, unlink, propagate, checkDirty, shallowPropagate } = /* @__PURE__ */ createReactiveSystem({\n\tupdate(atom) {\n\t\treturn atom._update();\n\t},\n\tnotify(effect) {\n\t\tqueuedEffects[queuedEffectsLength++] = effect;\n\t\teffect.flags &= ~2;\n\t},\n\tunwatched(atom) {\n\t\tif (atom.depsTail !== void 0) {\n\t\t\tatom.depsTail = void 0;\n\t\t\tatom.flags = 1 | 16;\n\t\t\tpurgeDeps(atom);\n\t\t}\n\t}\n});\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub;\nlet batchDepth = 0;\nfunction batch(fn) {\n\ttry {\n\t\t++batchDepth;\n\t\tfn();\n\t} finally {\n\t\tif (!--batchDepth) flush();\n\t}\n}\nfunction purgeDeps(sub) {\n\tconst depsTail = sub.depsTail;\n\tlet dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;\n\twhile (dep !== void 0) dep = unlink(dep, sub);\n}\nfunction flush() {\n\tif (batchDepth > 0) return;\n\twhile (notifyIndex < queuedEffectsLength) {\n\t\tconst effect = queuedEffects[notifyIndex];\n\t\tqueuedEffects[notifyIndex++] = void 0;\n\t\teffect.notify();\n\t}\n\tnotifyIndex = 0;\n\tqueuedEffectsLength = 0;\n}\nfunction createAsyncAtom(getValue, options) {\n\tconst ref = {};\n\tconst atom = createAtom(() => {\n\t\tgetValue().then((data) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"done\",\n\t\t\t\tdata\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t}, (error) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn { status: \"pending\" };\n\t}, options);\n\tref.current = atom;\n\treturn atom;\n}\nfunction createAtom(valueOrFn, options) {\n\tconst isComputed = typeof valueOrFn === \"function\";\n\tconst getter = valueOrFn;\n\tconst atom = {\n\t\t_snapshot: isComputed ? void 0 : valueOrFn,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tflags: isComputed ? 0 : 1,\n\t\tget() {\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t},\n\t\tsubscribe(observerOrFn) {\n\t\t\tconst obs = toObserver(observerOrFn);\n\t\t\tconst observed = { current: false };\n\t\t\tconst e = effect(() => {\n\t\t\t\tatom.get();\n\t\t\t\tif (!observed.current) observed.current = true;\n\t\t\t\telse {\n\t\t\t\t\tactiveSub = void 0;\n\t\t\t\t\tobs.next?.(atom._snapshot);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn { unsubscribe: () => {\n\t\t\t\te.stop();\n\t\t\t} };\n\t\t},\n\t\t_update(getValue) {\n\t\t\tconst prevSub = activeSub;\n\t\t\tconst compare = options?.compare ?? Object.is;\n\t\t\tif (isComputed) {\n\t\t\t\tactiveSub = atom;\n\t\t\t\t++cycle;\n\t\t\t\tatom.depsTail = void 0;\n\t\t\t} else if (getValue === void 0) return false;\n\t\t\tif (isComputed) atom.flags = 1 | 4;\n\t\t\ttry {\n\t\t\t\tconst oldValue = atom._snapshot;\n\t\t\t\tconst newValue = typeof getValue === \"function\" ? getValue(oldValue) : getValue === void 0 && isComputed ? getter(oldValue) : getValue;\n\t\t\t\tif (oldValue === void 0 || !compare(oldValue, newValue)) {\n\t\t\t\t\tatom._snapshot = newValue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tactiveSub = prevSub;\n\t\t\t\tif (isComputed) atom.flags &= ~4;\n\t\t\t\tpurgeDeps(atom);\n\t\t\t}\n\t\t}\n\t};\n\tif (isComputed) {\n\t\tatom.flags = 1 | 16;\n\t\tatom.get = function() {\n\t\t\tconst flags = atom.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) {\n\t\t\t\tif (atom._update()) {\n\t\t\t\t\tconst subs = atom.subs;\n\t\t\t\t\tif (subs !== void 0) shallowPropagate(subs);\n\t\t\t\t}\n\t\t\t} else if (flags & 32) atom.flags = flags & ~32;\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t};\n\t} else atom.set = function(valueOrFn) {\n\t\tif (atom._update(valueOrFn)) {\n\t\t\tconst subs = atom.subs;\n\t\t\tif (subs !== void 0) {\n\t\t\t\tpropagate(subs);\n\t\t\t\tshallowPropagate(subs);\n\t\t\t\tflush();\n\t\t\t}\n\t\t}\n\t};\n\treturn atom;\n}\nfunction effect(fn) {\n\tconst run = () => {\n\t\tconst prevSub = activeSub;\n\t\tactiveSub = effectObj;\n\t\t++cycle;\n\t\teffectObj.depsTail = void 0;\n\t\teffectObj.flags = 2 | 4;\n\t\ttry {\n\t\t\treturn fn();\n\t\t} finally {\n\t\t\tactiveSub = prevSub;\n\t\t\teffectObj.flags &= ~4;\n\t\t\tpurgeDeps(effectObj);\n\t\t}\n\t};\n\tconst effectObj = {\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tflags: 2 | 4,\n\t\tnotify() {\n\t\t\tconst flags = this.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run();\n\t\t\telse this.flags = 2;\n\t\t},\n\t\tstop() {\n\t\t\tthis.flags = 0;\n\t\t\tthis.depsTail = void 0;\n\t\t\tpurgeDeps(this);\n\t\t}\n\t};\n\trun();\n\treturn effectObj;\n}\n\n//#endregion\nexport { batch, createAsyncAtom, createAtom, flush, toObserver };\n//# sourceMappingURL=atom.js.map","//#region src/shallow.ts\nfunction shallow(objA, objB) {\n\tif (Object.is(objA, objB)) return true;\n\tif (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) return false;\n\tif (objA instanceof Map && objB instanceof Map) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const [k, v] of objA) if (!objB.has(k) || !Object.is(v, objB.get(k))) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Set && objB instanceof Set) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const v of objA) if (!objB.has(v)) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Date && objB instanceof Date) {\n\t\tif (objA.getTime() !== objB.getTime()) return false;\n\t\treturn true;\n\t}\n\tconst keysA = getOwnKeys(objA);\n\tif (keysA.length !== getOwnKeys(objB).length) return false;\n\tfor (let i = 0; i < keysA.length; i++) if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) return false;\n\treturn true;\n}\nfunction getOwnKeys(obj) {\n\treturn Object.keys(obj).concat(Object.getOwnPropertySymbols(obj));\n}\n\n//#endregion\nexport { shallow };\n//# sourceMappingURL=shallow.js.map","import { cloneState, hasOwn } from \"../../utils.js\";\nimport { table_syncExternalStateToBaseAtoms } from \"./coreTablesFeature.utils.js\";\nimport { coreFeatures } from \"../coreFeatures.js\";\nimport { atomToStore } from \"../reactivity/coreReactivityFeature.utils.js\";\nimport { shallow } from \"@tanstack/store\";\n\n//#region src/core/table/constructTable.ts\n/**\n* Builds the initial table state from registered features and user initial state.\n*\n* Each feature contributes its default state before user-provided `initialState` values are merged in.\n*/\nfunction getInitialTableState(features, initialState = {}) {\n\tObject.values(features).forEach((feature) => {\n\t\tinitialState = feature.getInitialState?.(initialState) ?? initialState;\n\t});\n\treturn cloneState(initialState);\n}\n/**\n* Constructs a table instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructTable(tableOptions) {\n\tconst _reactivity = tableOptions.features.coreReactivityFeature;\n\tconst { aggregationFns, columnMeta: _columnMeta, coreRowModel, expandedRowModel, facetedMinMaxValues, facetedRowModel, facetedUniqueValues, filterFns, filterMeta: _filterMeta, filteredRowModel, groupedRowModel, paginatedRowModel, sortFns, sortedRowModel, tableMeta: _tableMeta, ...features } = tableOptions.features;\n\tconst table = {\n\t\t_cellInstanceInitFns: [],\n\t\t_columnInstanceInitFns: [],\n\t\t_features: {\n\t\t\t...coreFeatures,\n\t\t\t...features\n\t\t},\n\t\t_headerGroupInstanceInitFns: [],\n\t\t_headerInstanceInitFns: [],\n\t\t_reactivity,\n\t\t_rowInstanceInitFns: [],\n\t\t_rowModelFns: {\n\t\t\taggregationFns,\n\t\t\tfilterFns,\n\t\t\tsortFns\n\t\t},\n\t\t_rowModels: {},\n\t\tatoms: {},\n\t\tbaseAtoms: {}\n\t};\n\tconst featuresList = Object.values(table._features);\n\tconst mergedOptions = {\n\t\t...featuresList.reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultTableOptions?.(table));\n\t\t}, {}),\n\t\t...tableOptions\n\t};\n\tif (_reactivity.wrapExternalAtoms && mergedOptions.atoms) for (const [atomKey, _atom] of Object.entries(mergedOptions.atoms)) {\n\t\tconst atom = _atom;\n\t\tconst wrappedAtom = _reactivity.createWritableAtom(atom.get(), { debugName: `externalAtom/${atomKey}` });\n\t\tmergedOptions.atoms[atomKey] = wrappedAtom;\n\t\tlet syncExternal = false;\n\t\tconst syncAtomToWrappedSub = atom.subscribe((value) => {\n\t\t\tif (syncExternal) return;\n\t\t\twrappedAtom.set(value);\n\t\t});\n\t\tconst syncWrappedToAtomSub = wrappedAtom.subscribe((value) => {\n\t\t\tsyncExternal = true;\n\t\t\tatom.set(value);\n\t\t\tsyncExternal = false;\n\t\t});\n\t\t_reactivity.addSubscription(syncAtomToWrappedSub);\n\t\t_reactivity.addSubscription(syncWrappedToAtomSub);\n\t}\n\tif (_reactivity.createOptionsStore) {\n\t\ttable.optionsStore = _reactivity.createWritableAtom(mergedOptions, { debugName: \"table/optionsStore\" });\n\t\tObject.defineProperty(table, \"options\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tget() {\n\t\t\t\treturn table.optionsStore.get();\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\ttable.optionsStore.set(() => value);\n\t\t\t}\n\t\t});\n\t} else table.options = mergedOptions;\n\ttable.initialState = getInitialTableState(table._features, table.options.initialState);\n\tconst stateKeys = Object.keys(table.initialState);\n\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\tconst key = stateKeys[i];\n\t\ttable.baseAtoms[key] = _reactivity.createWritableAtom(table.initialState[key], { debugName: `table/baseAtoms/${key}` });\n\t\ttable.atoms[key] = _reactivity.createReadonlyAtom(() => {\n\t\t\tconst options = table.options;\n\t\t\tconst externalAtom = options.atoms?.[key];\n\t\t\tconst reactiveState = externalAtom ? externalAtom.get() : table.baseAtoms[key].get();\n\t\t\tif (externalAtom) return reactiveState;\n\t\t\tconst controlledState = options.state;\n\t\t\tif (controlledState && hasOwn(controlledState, key)) {\n\t\t\t\tconst controlledValue = controlledState[key];\n\t\t\t\treturn controlledValue === void 0 ? table.initialState[key] : controlledValue;\n\t\t\t}\n\t\t\treturn reactiveState;\n\t\t}, { debugName: `table/atoms/${key}` });\n\t}\n\ttable_syncExternalStateToBaseAtoms(table);\n\ttable.store = atomToStore(_reactivity.createReadonlyAtom(() => {\n\t\tconst snapshot = {};\n\t\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\t\tconst key = stateKeys[i];\n\t\t\tsnapshot[key] = table.atoms[key].get();\n\t\t}\n\t\treturn snapshot;\n\t}, {\n\t\tcompare: shallow,\n\t\tdebugName: \"table/store\"\n\t}));\n\tfor (let i = 0; i < featuresList.length; i++) {\n\t\tconst feature = featuresList[i];\n\t\tfeature.initTableInstanceData?.(table);\n\t\tif (feature.initCellInstanceData) table._cellInstanceInitFns.push(feature.initCellInstanceData.bind(feature));\n\t\tif (feature.initColumnInstanceData) table._columnInstanceInitFns.push(feature.initColumnInstanceData.bind(feature));\n\t\tif (feature.initHeaderGroupInstanceData) table._headerGroupInstanceInitFns.push(feature.initHeaderGroupInstanceData.bind(feature));\n\t\tif (feature.initHeaderInstanceData) table._headerInstanceInitFns.push(feature.initHeaderInstanceData.bind(feature));\n\t\tif (feature.initRowInstanceData) table._rowInstanceInitFns.push(feature.initRowInstanceData.bind(feature));\n\t\tfeature.constructTableAPIs?.(table);\n\t}\n\tif (process.env.NODE_ENV === \"development\" && (tableOptions.debugAll || tableOptions.debugTable)) {\n\t\tconst features = Object.keys(table._features);\n\t\tconst rowModels = Object.entries({\n\t\t\tcoreRowModel,\n\t\t\tfilteredRowModel,\n\t\t\tgroupedRowModel,\n\t\t\tsortedRowModel,\n\t\t\texpandedRowModel,\n\t\t\tpaginatedRowModel,\n\t\t\tfacetedRowModel,\n\t\t\tfacetedMinMaxValues,\n\t\t\tfacetedUniqueValues\n\t\t}).filter(([, factory]) => factory).map(([key]) => key);\n\t\tconst states = Object.keys(table.initialState);\n\t\tconsole.log(`Constructing Table Instance\n\n Features: ${features.join(\"\\n \")}\n\n Row Models: ${rowModels.length ? rowModels.join(\"\\n \") : \"(none)\"}\n\n States: ${states.join(\"\\n \")}\\n`, { table });\n\t}\n\treturn table;\n}\n\n//#endregion\nexport { constructTable, getInitialTableState };","import { callMemoOrStaticFn, cloneState, setStateSlice } from \"../../utils.js\";\nimport { getIsColumnVisible, getVisibleCells, getVisibleCellsByColumnId, getVisibleLeafColumns } from \"../../core/featureStubs.js\";\nimport { buildHeaderGroups } from \"../../core/headers/buildHeaderGroups.js\";\n\n//#region src/features/column-pinning/columnPinningFeature.utils.ts\n/**\n* Creates the default column pinning state.\n*\n* Both pinning regions start empty. Reset APIs use this value when\n* `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const pinning = getDefaultColumnPinningState()\n* ```\n*/\nfunction getDefaultColumnPinningState() {\n\treturn {\n\t\tstart: [],\n\t\tend: []\n\t};\n}\n/**\n* Moves this column's leaf column ids into a pinning region.\n*\n* Pinning a group column pins all of its leaves. The leaf ids are first removed\n* from both regions, then appended to the requested `'start'` or `'end'`\n* region. Passing `false` unpins them back to the center.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* column_pin(column, 'start')\n* ```\n*/\nfunction column_pin(column, position) {\n\tconst leafColumns = column.getLeafColumns();\n\tconst columnIds = [];\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst id = leafColumns[i].id;\n\t\tif (id) columnIds.push(id);\n\t}\n\ttable_setColumnPinning(column.table, (old) => {\n\t\tif (position === \"end\") return {\n\t\t\tstart: old.start.filter((d) => !columnIds.includes(d)),\n\t\t\tend: [...old.end.filter((d) => !columnIds.includes(d)), ...columnIds]\n\t\t};\n\t\tif (position === \"start\") return {\n\t\t\tstart: [...old.start.filter((d) => !columnIds.includes(d)), ...columnIds],\n\t\t\tend: old.end.filter((d) => !columnIds.includes(d))\n\t\t};\n\t\treturn {\n\t\t\tstart: old.start.filter((d) => !columnIds.includes(d)),\n\t\t\tend: old.end.filter((d) => !columnIds.includes(d))\n\t\t};\n\t});\n}\n/**\n* Checks whether this column or any of its leaf columns can be pinned.\n*\n* Column-level `enablePinning` and table `enableColumnPinning` both default to\n* `true`; at least one leaf column must allow pinning.\n*\n* @example\n* ```ts\n* const canPin = column_getCanPin(column)\n* ```\n*/\nfunction column_getCanPin(column) {\n\treturn column.getLeafColumns().some((leafColumn) => (leafColumn.columnDef.enablePinning ?? true) && (column.table.options.enableColumnPinning ?? true));\n}\n/**\n* Reads this column's current pinning region.\n*\n* Group columns report `'start'` or `'end'` when any leaf column is pinned in\n* that region. Unpinned columns return `false`.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* const position = column_getIsPinned(column)\n* ```\n*/\nfunction column_getIsPinned(column) {\n\tconst leafColumns = column.getLeafColumns();\n\tconst { start, end } = column.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tfor (let i = 0; i < leafColumns.length; i++) if (start.includes(leafColumns[i].id)) return \"start\";\n\tfor (let i = 0; i < leafColumns.length; i++) if (end.includes(leafColumns[i].id)) return \"end\";\n\treturn false;\n}\n/**\n* Finds this column's index within its pinned region.\n*\n* Unpinned columns return `0`; pinned columns return their position in\n* `state.columnPinning.start` or `state.columnPinning.end`.\n*\n* @example\n* ```ts\n* const index = column_getPinnedIndex(column)\n* ```\n*/\nfunction column_getPinnedIndex(column) {\n\tconst position = column_getIsPinned(column);\n\treturn position ? column.table.atoms.columnPinning?.get()?.[position].indexOf(column.id) ?? -1 : 0;\n}\n/**\n* Collects visible cells whose columns are not pinned start or end.\n*\n* The result preserves the row's visible-cell order for center columns.\n*\n* @example\n* ```ts\n* const centerCells = row_getCenterVisibleCells(row)\n* ```\n*/\nfunction row_getCenterVisibleCells(row) {\n\tconst allCells = getVisibleCells(row);\n\tconst { start, end } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length && !end.length) return allCells;\n\tconst startAndEnd = [...start, ...end];\n\treturn allCells.filter((d) => !startAndEnd.includes(d.column.id));\n}\n/**\n* Collects visible cells for columns pinned to the start region.\n*\n* Cells are returned in `state.columnPinning.start` order and are marked with\n* `cell.position = 'start'`.\n*\n* @example\n* ```ts\n* const startCells = row_getStartVisibleCells(row)\n* ```\n*/\nfunction row_getStartVisibleCells(row) {\n\tconst { start } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length) return [];\n\tconst allVisibleCells = getVisibleCellsByColumnId(row);\n\tconst cells = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst cell = allVisibleCells[start[i]];\n\t\tif (cell) {\n\t\t\tcell.position = \"start\";\n\t\t\tcells.push(cell);\n\t\t}\n\t}\n\treturn cells;\n}\n/**\n* Collects visible cells for columns pinned to the end region.\n*\n* Cells are returned in `state.columnPinning.end` order and are marked with\n* `cell.position = 'end'`.\n*\n* @example\n* ```ts\n* const endCells = row_getEndVisibleCells(row)\n* ```\n*/\nfunction row_getEndVisibleCells(row) {\n\tconst { end } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!end.length) return [];\n\tconst allVisibleCells = getVisibleCellsByColumnId(row);\n\tconst cells = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst cell = allVisibleCells[end[i]];\n\t\tif (cell) {\n\t\t\tcell.position = \"end\";\n\t\t\tcells.push(cell);\n\t\t}\n\t}\n\treturn cells;\n}\n/**\n* Routes a column pinning updater through the table's pinning change handler.\n*\n* The updater may be a next `{ start, end }` state or a function of the\n* previous state, matching the instance `table.setColumnPinning` behavior.\n*\n* @example\n* ```ts\n* table_setColumnPinning(table, (old) => ({ ...old, start: ['select'] }))\n* ```\n*/\nfunction table_setColumnPinning(table, updater) {\n\tsetStateSlice(table, \"columnPinning\", updater);\n}\n/**\n* Resets `columnPinning` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnPinning` when it\n* exists. Passing `true` ignores initial state and resets to empty start/end\n* arrays.\n*\n* @example\n* ```ts\n* table_resetColumnPinning(table)\n* table_resetColumnPinning(table, true)\n* ```\n*/\nfunction table_resetColumnPinning(table, defaultState) {\n\ttable_setColumnPinning(table, defaultState ? getDefaultColumnPinningState() : cloneState(table.initialState.columnPinning ?? getDefaultColumnPinningState()));\n}\n/**\n* Checks whether any columns are pinned.\n*\n* Omit `position` to check both sides, or pass `'start'`/`'end'` to inspect a\n* single pinning region.\n*\n* @example\n* ```ts\n* const hasPinnedColumns = table_getIsSomeColumnsPinned(table)\n* ```\n*/\nfunction table_getIsSomeColumnsPinned(table, position) {\n\tconst pinningState = table.atoms.columnPinning?.get();\n\tif (!position) return Boolean(pinningState?.start.length || pinningState?.end.length);\n\treturn Boolean(pinningState?.[position].length);\n}\n/**\n* Builds header groups for visible columns pinned to the start region.\n*\n* The leaf columns are read in `state.columnPinning.start` order and then passed\n* through the same header-group builder as the unpinned table.\n*\n* @example\n* ```ts\n* const headerGroups = table_getStartHeaderGroups(table)\n* ```\n*/\nfunction table_getStartHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst { start } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst orderedLeafColumns = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst column = leafColumnsById[start[i]];\n\t\tif (column && getIsColumnVisible(column)) orderedLeafColumns.push(column);\n\t}\n\treturn buildHeaderGroups(allColumns, orderedLeafColumns, table, \"start\");\n}\n/**\n* Builds header groups for visible columns pinned to the end region.\n*\n* The leaf columns are read in `state.columnPinning.end` order and then\n* passed through the same header-group builder as the unpinned table.\n*\n* @example\n* ```ts\n* const headerGroups = table_getEndHeaderGroups(table)\n* ```\n*/\nfunction table_getEndHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst { end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst orderedLeafColumns = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst column = leafColumnsById[end[i]];\n\t\tif (column && getIsColumnVisible(column)) orderedLeafColumns.push(column);\n\t}\n\treturn buildHeaderGroups(allColumns, orderedLeafColumns, table, \"end\");\n}\n/**\n* Builds header groups for visible columns that are not pinned.\n*\n* Start- and end-pinned column ids are removed from the visible leaf column\n* list before header groups are built for the center region.\n*\n* @example\n* ```ts\n* const headerGroups = table_getCenterHeaderGroups(table)\n* ```\n*/\nfunction table_getCenterHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tlet leafColumns = getVisibleLeafColumns(table);\n\tconst { start, end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (start.length || end.length) {\n\t\tconst startAndEnd = [...start, ...end];\n\t\tleafColumns = leafColumns.filter((column) => !startAndEnd.includes(column.id));\n\t}\n\treturn buildHeaderGroups(allColumns, leafColumns, table, \"center\");\n}\n/**\n* Builds footer groups for the start pinned region.\n*\n* Footer groups reuse the start header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getStartFooterGroups(table)\n* ```\n*/\nfunction table_getStartFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)].reverse();\n}\n/**\n* Builds footer groups for the end pinned region.\n*\n* Footer groups reuse the end header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getEndFooterGroups(table)\n* ```\n*/\nfunction table_getEndFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)].reverse();\n}\n/**\n* Builds footer groups for the center, unpinned region.\n*\n* Footer groups reuse the center header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getCenterFooterGroups(table)\n* ```\n*/\nfunction table_getCenterFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)].reverse();\n}\n/**\n* Flattens every header from the start pinned header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getStartFlatHeaders(table)\n* ```\n*/\nfunction table_getStartFlatHeaders(table) {\n\tconst leftHeaderGroups = callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < leftHeaderGroups.length; i++) {\n\t\tconst headers = leftHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Flattens every header from the end pinned header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getEndFlatHeaders(table)\n* ```\n*/\nfunction table_getEndFlatHeaders(table) {\n\tconst rightHeaderGroups = callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < rightHeaderGroups.length; i++) {\n\t\tconst headers = rightHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Flattens every header from the center header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getCenterFlatHeaders(table)\n* ```\n*/\nfunction table_getCenterFlatHeaders(table) {\n\tconst centerHeaderGroups = callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < centerHeaderGroups.length; i++) {\n\t\tconst headers = centerHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Collects leaf headers for the start pinned region.\n*\n* Parent headers are filtered out from the start flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getStartLeafHeaders(table)\n* ```\n*/\nfunction table_getStartLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getStartFlatHeaders\", table_getStartFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Collects leaf headers for the end pinned region.\n*\n* Parent headers are filtered out from the end flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getEndLeafHeaders(table)\n* ```\n*/\nfunction table_getEndLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getEndFlatHeaders\", table_getEndFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Collects leaf headers for the center, unpinned region.\n*\n* Parent headers are filtered out from the center flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getCenterLeafHeaders(table)\n* ```\n*/\nfunction table_getCenterLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getCenterFlatHeaders\", table_getCenterFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Resolves leaf columns pinned to the start region.\n*\n* The result follows `state.columnPinning.start` order and skips stale ids that\n* no longer correspond to a leaf column.\n*\n* @example\n* ```ts\n* const columns = table_getStartLeafColumns(table)\n* ```\n*/\nfunction table_getStartLeafColumns(table) {\n\tconst { start } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst result = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst column = leafColumnsById[start[i]];\n\t\tif (column) result.push(column);\n\t}\n\treturn result;\n}\n/**\n* Resolves leaf columns pinned to the end region.\n*\n* The result follows `state.columnPinning.end` order and skips stale ids that\n* no longer correspond to a leaf column.\n*\n* @example\n* ```ts\n* const columns = table_getEndLeafColumns(table)\n* ```\n*/\nfunction table_getEndLeafColumns(table) {\n\tconst { end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst result = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst column = leafColumnsById[end[i]];\n\t\tif (column) result.push(column);\n\t}\n\treturn result;\n}\n/**\n* Resolves leaf columns that are not pinned to either logical side.\n*\n* Start- and end-pinned ids are removed from `table.getAllLeafColumns()`.\n*\n* @example\n* ```ts\n* const columns = table_getCenterLeafColumns(table)\n* ```\n*/\nfunction table_getCenterLeafColumns(table) {\n\tconst { start, end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length && !end.length) return table.getAllLeafColumns();\n\tconst startAndEnd = [...start, ...end];\n\treturn table.getAllLeafColumns().filter((d) => !startAndEnd.includes(d.id));\n}\n/**\n* Resolves leaf columns for a requested pinning region.\n*\n* Pass `'start'`, `'center'`, or `'end'` for a partition, or pass `false` to\n* read all leaf columns without partitioning.\n*\n* @example\n* ```ts\n* const columns = table_getPinnedLeafColumns(table, 'center')\n* ```\n*/\nfunction table_getPinnedLeafColumns(table, position) {\n\treturn !position ? table.getAllLeafColumns() : position === \"start\" ? callMemoOrStaticFn(table, \"getStartLeafColumns\", table_getStartLeafColumns) : position === \"end\" ? callMemoOrStaticFn(table, \"getEndLeafColumns\", table_getEndLeafColumns) : callMemoOrStaticFn(table, \"getCenterLeafColumns\", table_getCenterLeafColumns);\n}\n/**\n* Resolves visible leaf columns pinned to the start region.\n*\n* Hidden pinned columns are filtered out after the start pin order is applied.\n*\n* @example\n* ```ts\n* const columns = table_getStartVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getStartVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getStartLeafColumns\", table_getStartLeafColumns).filter((column) => getIsColumnVisible(column));\n}\n/**\n* Resolves visible leaf columns pinned to the end region.\n*\n* Hidden pinned columns are filtered out after the end pin order is applied.\n*\n* @example\n* ```ts\n* const columns = table_getEndVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getEndVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getEndLeafColumns\", table_getEndLeafColumns).filter((column) => getIsColumnVisible(column));\n}\n/**\n* Resolves visible leaf columns that are not pinned.\n*\n* This is the center partition used by layouts that render pinned columns\n* separately from the scrollable middle region.\n*\n* @example\n* ```ts\n* const columns = table_getCenterVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getCenterVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getCenterLeafColumns\", table_getCenterLeafColumns).filter((column) => getIsColumnVisible(column));\n}\n/**\n* Resolves visible leaf columns for a requested pinning region.\n*\n* Omit `position` to get all visible leaf columns, or pass `'start'`, `'center'`,\n* or `'end'` to get one partition.\n*\n* @example\n* ```ts\n* const columns = table_getPinnedVisibleLeafColumns(table, 'start')\n* ```\n*/\nfunction table_getPinnedVisibleLeafColumns(table, position) {\n\treturn !position ? getVisibleLeafColumns(table) : position === \"start\" ? callMemoOrStaticFn(table, \"getStartVisibleLeafColumns\", table_getStartVisibleLeafColumns) : position === \"end\" ? callMemoOrStaticFn(table, \"getEndVisibleLeafColumns\", table_getEndVisibleLeafColumns) : callMemoOrStaticFn(table, \"getCenterVisibleLeafColumns\", table_getCenterVisibleLeafColumns);\n}\n\n//#endregion\nexport { column_getCanPin, column_getIsPinned, column_getPinnedIndex, column_pin, getDefaultColumnPinningState, row_getCenterVisibleCells, row_getEndVisibleCells, row_getStartVisibleCells, table_getCenterFlatHeaders, table_getCenterFooterGroups, table_getCenterHeaderGroups, table_getCenterLeafColumns, table_getCenterLeafHeaders, table_getCenterVisibleLeafColumns, table_getEndFlatHeaders, table_getEndFooterGroups, table_getEndHeaderGroups, table_getEndLeafColumns, table_getEndLeafHeaders, table_getEndVisibleLeafColumns, table_getIsSomeColumnsPinned, table_getPinnedLeafColumns, table_getPinnedVisibleLeafColumns, table_getStartFlatHeaders, table_getStartFooterGroups, table_getStartHeaderGroups, table_getStartLeafColumns, table_getStartLeafHeaders, table_getStartVisibleLeafColumns, table_resetColumnPinning, table_setColumnPinning };","import { makeObjectMap } from \"../../utils.js\";\n\n//#region src/features/column-pinning/orderByColumnPinning.ts\n/**\n* Display order for column pinning, shared through the `orderByColumnPinning`\n* feature stub so that the core headers, row visible cells, and cell selection\n* don't bundle it when the column pinning feature is not registered.\n*\n* Internal: not exported from any package entry point.\n*/\n/**\n* Orders items that each belong to a leaf column, such as visible leaf\n* columns or a row's visible cells: start-pinned items in pinning order, then\n* unpinned items in their given order, then end-pinned items in pinning order.\n* Pinned ids that match no item are skipped.\n*\n* `getItemsByColumnId` can return an existing lookup of the same items, which\n* is only read when something is pinned.\n*/\nfunction orderByColumnPinning(table, items, getColumnId, getItemsByColumnId) {\n\tconst columnPinning = table.atoms.columnPinning?.get();\n\tif (!columnPinning || !columnPinning.start.length && !columnPinning.end.length) return items;\n\tconst { start, end } = columnPinning;\n\tlet itemsByColumnId = getItemsByColumnId?.();\n\tif (!itemsByColumnId) {\n\t\titemsByColumnId = makeObjectMap();\n\t\tfor (let i = 0; i < items.length; i++) itemsByColumnId[getColumnId(items[i])] = items[i];\n\t}\n\tconst ordered = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst item = itemsByColumnId[start[i]];\n\t\tif (item) ordered.push(item);\n\t}\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst columnId = getColumnId(items[i]);\n\t\tif (!start.includes(columnId) && !end.includes(columnId)) ordered.push(items[i]);\n\t}\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst item = itemsByColumnId[end[i]];\n\t\tif (item) ordered.push(item);\n\t}\n\treturn ordered;\n}\n\n//#endregion\nexport { orderByColumnPinning };","import { assignPrototypeAPIs, assignTableAPIs, callMemoOrStaticFn, makeStateUpdater } from \"../../utils.js\";\nimport { getVisibleLeafColumns } from \"../../core/featureStubs.js\";\nimport { column_getCanPin, column_getIsPinned, column_getPinnedIndex, column_pin, getDefaultColumnPinningState, row_getCenterVisibleCells, row_getEndVisibleCells, row_getStartVisibleCells, table_getCenterFlatHeaders, table_getCenterFooterGroups, table_getCenterHeaderGroups, table_getCenterLeafColumns, table_getCenterLeafHeaders, table_getCenterVisibleLeafColumns, table_getEndFlatHeaders, table_getEndFooterGroups, table_getEndHeaderGroups, table_getEndLeafColumns, table_getEndLeafHeaders, table_getEndVisibleLeafColumns, table_getIsSomeColumnsPinned, table_getPinnedLeafColumns, table_getPinnedVisibleLeafColumns, table_getStartFlatHeaders, table_getStartFooterGroups, table_getStartHeaderGroups, table_getStartLeafColumns, table_getStartLeafHeaders, table_getStartVisibleLeafColumns, table_resetColumnPinning, table_setColumnPinning } from \"./columnPinningFeature.utils.js\";\nimport { orderByColumnPinning } from \"./orderByColumnPinning.js\";\n\n//#region src/features/column-pinning/columnPinningFeature.ts\n/**\n* Feature that adds column pinning state and APIs for logical start, center,\n* and end regions.\n*\n* In LTR languages/layouts, start usually corresponds to left and end to\n* right. In RTL languages/layouts, start usually corresponds to right and end\n* to left.\n*/\nconst columnPinningFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnPinning: {\n\t\t\t\t...getDefaultColumnPinningState(),\n\t\t\t\t...initialState.columnPinning\n\t\t\t},\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnPinningChange: makeStateUpdater(\"columnPinning\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnPinningFeature\", prototype, table, {\n\t\t\tcolumn_pin: { fn: (column, position) => column_pin(column, position) },\n\t\t\tcolumn_getCanPin: { fn: (column) => column_getCanPin(column) },\n\t\t\tcolumn_getPinnedIndex: { fn: (column) => column_getPinnedIndex(column) },\n\t\t\tcolumn_getIsPinned: { fn: (column) => column_getIsPinned(column) }\n\t\t});\n\t},\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnPinningFeature\", prototype, table, {\n\t\t\trow_getCenterVisibleCells: {\n\t\t\t\tfn: (row) => row_getCenterVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\trow.table.atoms.columnPinning?.get(),\n\t\t\t\t\trow.table.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getStartVisibleCells: {\n\t\t\t\tfn: (row) => row_getStartVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\trow.table.atoms.columnPinning?.get()?.start,\n\t\t\t\t\trow.table.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getEndVisibleCells: {\n\t\t\t\tfn: (row) => row_getEndVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\trow.table.atoms.columnPinning?.get()?.end,\n\t\t\t\t\trow.table.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnPinningFeature\", table, {\n\t\t\ttable_setColumnPinning: { fn: (updater) => table_setColumnPinning(table, updater) },\n\t\t\ttable_resetColumnPinning: { fn: (defaultState) => table_resetColumnPinning(table, defaultState) },\n\t\t\ttable_getIsSomeColumnsPinned: { fn: (position) => table_getIsSomeColumnsPinned(table, position) },\n\t\t\ttable__orderByColumnPinning: { fn: (items, getColumnId, getItemsByColumnId) => orderByColumnPinning(table, items, getColumnId, getItemsByColumnId) },\n\t\t\ttable_getStartHeaderGroups: {\n\t\t\t\tfn: () => table_getStartHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getAllColumns(),\n\t\t\t\t\tgetVisibleLeafColumns(table),\n\t\t\t\t\ttable.atoms.columnPinning?.get()?.start,\n\t\t\t\t\ttable.atoms.columnOrder?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getCenterHeaderGroups: {\n\t\t\t\tfn: () => table_getCenterHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getAllColumns(),\n\t\t\t\t\tgetVisibleLeafColumns(table),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getEndHeaderGroups: {\n\t\t\t\tfn: () => table_getEndHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getAllColumns(),\n\t\t\t\t\tgetVisibleLeafColumns(table),\n\t\t\t\t\ttable.atoms.columnPinning?.get()?.end,\n\t\t\t\t\ttable.atoms.columnOrder?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getStartFooterGroups: {\n\t\t\t\tfn: () => table_getStartFooterGroups(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getCenterFooterGroups: {\n\t\t\t\tfn: () => table_getCenterFooterGroups(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getEndFooterGroups: {\n\t\t\t\tfn: () => table_getEndFooterGroups(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getStartFlatHeaders: {\n\t\t\t\tfn: () => table_getStartFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getEndFlatHeaders: {\n\t\t\t\tfn: () => table_getEndFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getCenterFlatHeaders: {\n\t\t\t\tfn: () => table_getCenterFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getStartLeafHeaders: {\n\t\t\t\tfn: () => table_getStartLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getEndLeafHeaders: {\n\t\t\t\tfn: () => table_getEndLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getCenterLeafHeaders: {\n\t\t\t\tfn: () => table_getCenterLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getStartLeafColumns: {\n\t\t\t\tfn: () => table_getStartLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getEndLeafColumns: {\n\t\t\t\tfn: () => table_getEndLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getCenterLeafColumns: {\n\t\t\t\tfn: () => table_getCenterLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getPinnedLeafColumns: { fn: (position) => table_getPinnedLeafColumns(table, position) },\n\t\t\ttable_getStartVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getStartVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getCenterVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getCenterVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getEndVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getEndVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getPinnedVisibleLeafColumns: { fn: (position) => table_getPinnedVisibleLeafColumns(table, position) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnPinningFeature };","import { callMemoOrStaticFn, cloneState, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { getPinnedVisibleLeafColumns } from \"../../core/featureStubs.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.utils.ts\n/**\n* Creates the default committed column sizing state.\n*\n* The feature default is an empty map, so columns fall back to their column def\n* size or the built-in sizing defaults.\n*\n* @example\n* ```ts\n* const sizing = getDefaultColumnSizingState()\n* ```\n*/\nfunction getDefaultColumnSizingState() {\n\treturn makeObjectMap();\n}\n/**\n* Creates the built-in sizing defaults for column definitions.\n*\n* Columns default to `size: 150`, `minSize: 20`, and\n* `maxSize: Number.MAX_SAFE_INTEGER` unless overridden by column definitions or\n* table defaults.\n*\n* @example\n* ```ts\n* const defaults = getDefaultColumnSizingColumnDef()\n* ```\n*/\nfunction getDefaultColumnSizingColumnDef() {\n\treturn {\n\t\tsize: 150,\n\t\tminSize: 20,\n\t\tmaxSize: Number.MAX_SAFE_INTEGER\n\t};\n}\n/**\n* Resolves a column's current pixel size.\n*\n* Committed `state.columnSizing[column.id]` wins over `columnDef.size`, then the\n* built-in default size. The result is clamped between min and max size.\n*\n* @example\n* ```ts\n* const width = column_getSize(column)\n* ```\n*/\nfunction column_getSize(column) {\n\tconst defaultSizes = getDefaultColumnSizingColumnDef();\n\tconst columnSizing = column.table.atoms.columnSizing?.get();\n\tconst columnSize = columnSizing && hasOwn(columnSizing, column.id) ? columnSizing[column.id] : void 0;\n\treturn Math.min(Math.max(column.columnDef.minSize ?? defaultSizes.minSize, columnSize ?? column.columnDef.size ?? defaultSizes.size), column.columnDef.maxSize ?? defaultSizes.maxSize);\n}\nfunction buildColumnOffsets(columns) {\n\tconst starts = makeObjectMap();\n\tconst afters = makeObjectMap();\n\tconst sizes = new Array(columns.length);\n\tlet start = 0;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tconst size = callMemoOrStaticFn(column, \"getSize\", column_getSize);\n\t\tsizes[i] = size;\n\t\tstarts[column.id] = start;\n\t\tstart += size;\n\t}\n\tlet after = 0;\n\tfor (let i = columns.length - 1; i >= 0; i--) {\n\t\tafters[columns[i].id] = after;\n\t\tafter += sizes[i];\n\t}\n\treturn {\n\t\tstarts,\n\t\tafters\n\t};\n}\n/**\n* Builds start and after offset maps for every visible leaf column, computed\n* once per pinning region plus the full visible list.\n*\n* A single table-level memo of this result backs all `column.getStart()` and\n* `column.getAfter()` calls with O(1) lookups.\n*\n* @example\n* ```ts\n* const offsets = table_getColumnOffsets(table)\n* const startOffset = offsets.start.starts[column.id]\n* ```\n*/\nfunction table_getColumnOffsets(table) {\n\treturn {\n\t\tall: buildColumnOffsets(getPinnedVisibleLeafColumns(table)),\n\t\tcenter: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"center\")),\n\t\tstart: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"start\")),\n\t\tend: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"end\"))\n\t};\n}\nfunction toOffsetsKey(position) {\n\treturn position === \"start\" ? \"start\" : position === \"end\" ? \"end\" : position === \"center\" ? \"center\" : \"all\";\n}\n/**\n* Computes the offset from the start edge of a pinning region to this column.\n*\n* The value is the sum of all previous visible leaf column sizes in the\n* requested `'start'`, `'center'`, or `'end'` region.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* const startOffset = column_getStart(column, 'start')\n* ```\n*/\nfunction column_getStart(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].starts[column.id] ?? 0;\n}\n/**\n* Computes the offset from the end edge of a pinning region after this column.\n*\n* The value is the sum of all following visible leaf column sizes in the\n* requested region.\n*\n* @example\n* ```ts\n* const endOffset = column_getAfter(column, 'end')\n* ```\n*/\nfunction column_getAfter(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].afters[column.id] ?? 0;\n}\n/**\n* Removes this column's committed size override.\n*\n* After reset, the column resolves size from `columnDef.size` or built-in\n* defaults again.\n*\n* @example\n* ```ts\n* column_resetSize(column)\n* ```\n*/\nfunction column_resetSize(column) {\n\ttable_setColumnSizing(column.table, (old) => {\n\t\tconst rest = makeObjectMap();\n\t\tconst columnIds = Object.keys(old);\n\t\tfor (let i = 0; i < columnIds.length; i++) {\n\t\t\tconst columnId = columnIds[i];\n\t\t\tif (columnId !== column.id) rest[columnId] = old[columnId];\n\t\t}\n\t\treturn rest;\n\t});\n}\nfunction sumHeaderSize(header) {\n\tif (!header.subHeaders.length) return column_getSize(header.column);\n\tlet sum = 0;\n\tfor (let i = 0; i < header.subHeaders.length; i++) sum += sumHeaderSize(header.subHeaders[i]);\n\treturn sum;\n}\n/**\n* Computes a header's rendered size from its leaf headers.\n*\n* Group headers sum the sizes of all descendant leaf columns. Leaf headers use\n* their column's current size.\n*\n* @example\n* ```ts\n* const width = header_getSize(header)\n* ```\n*/\nfunction header_getSize(header) {\n\treturn sumHeaderSize(header);\n}\n/**\n* Computes a header's offset from the start of its header group.\n*\n* The offset is the previous sibling header's start plus size, or `0` for the\n* first header in the group.\n*\n* @example\n* ```ts\n* const offset = header_getStart(header)\n* ```\n*/\nfunction header_getStart(header) {\n\tif (header.index > 0) {\n\t\tconst prevSiblingHeader = header.headerGroup?.headers[header.index - 1];\n\t\tif (prevSiblingHeader) return callMemoOrStaticFn(prevSiblingHeader, \"getStart\", header_getStart) + callMemoOrStaticFn(prevSiblingHeader, \"getSize\", header_getSize);\n\t}\n\treturn 0;\n}\n/**\n* Routes a committed column sizing updater through the table's sizing handler.\n*\n* The updater may be a next size map or a function of the previous map,\n* matching the instance `table.setColumnSizing` behavior.\n*\n* @example\n* ```ts\n* table_setColumnSizing(table, (old) => ({ ...old, age: 96 }))\n* ```\n*/\nfunction table_setColumnSizing(table, updater) {\n\ttable.options.onColumnSizingChange?.(updater);\n}\n/**\n* Resets `columnSizing` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnSizing` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetColumnSizing(table)\n* table_resetColumnSizing(table, true)\n* ```\n*/\nfunction table_resetColumnSizing(table, defaultState) {\n\ttable_setColumnSizing(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.columnSizing ?? {})));\n}\nfunction sumColumnSizes(columns) {\n\tlet sum = 0;\n\tfor (let i = 0; i < columns.length; i++) sum += callMemoOrStaticFn(columns[i], \"getSize\", column_getSize);\n\treturn sum;\n}\n/**\n* Sums the rendered size of the full table header row.\n*\n* This includes start, center, and end columns in the main header group.\n*\n* @example\n* ```ts\n* const width = table_getTotalSize(table)\n* ```\n*/\nfunction table_getTotalSize(table) {\n\treturn table.getHeaderGroups()[0]?.headers.reduce((sum, header) => {\n\t\treturn sum + header_getSize(header);\n\t}, 0) ?? 0;\n}\n/**\n* Sums the sizes of the visible leaf columns pinned to the logical start\n* region.\n*\n* An empty start pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getStartTotalSize(table)\n* ```\n*/\nfunction table_getStartTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"start\"));\n}\n/**\n* Sums the sizes of the visible leaf columns that are not pinned.\n*\n* An empty center region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getCenterTotalSize(table)\n* ```\n*/\nfunction table_getCenterTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"center\"));\n}\n/**\n* Sums the sizes of the visible leaf columns pinned to the logical end region.\n*\n* An empty end pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getEndTotalSize(table)\n* ```\n*/\nfunction table_getEndTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"end\"));\n}\n\n//#endregion\nexport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing } from \"./columnSizingFeature.utils.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.ts\n/**\n* Feature that adds column sizing state, defaults, and size measurement APIs.\n*/\nconst columnSizingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnSizing: getDefaultColumnSizingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef: () => {\n\t\treturn getDefaultColumnSizingColumnDef();\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnSizingChange: makeStateUpdater(\"columnSizing\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\tcolumn_getSize: {\n\t\t\t\tfn: (column) => column_getSize(column),\n\t\t\t\tmemoDeps: (column) => [table.options.columns, table.atoms.columnSizing?.get()?.[column.id]]\n\t\t\t},\n\t\t\tcolumn_getStart: { fn: (column, position) => column_getStart(column, position) },\n\t\t\tcolumn_getAfter: { fn: (column, position) => column_getAfter(column, position) },\n\t\t\tcolumn_resetSize: { fn: (column) => column_resetSize(column) }\n\t\t});\n\t},\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\theader_getSize: {\n\t\t\t\tfn: (header) => header_getSize(header),\n\t\t\t\tmemoDeps: (header) => [table.options.columns, header.column.columns.length > 0 ? table.atoms.columnSizing?.get() : table.atoms.columnSizing?.get()?.[header.column.id]]\n\t\t\t},\n\t\t\theader_getStart: {\n\t\t\t\tfn: (header) => header_getStart(header),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnSizingFeature\", table, {\n\t\t\ttable_getColumnOffsets: {\n\t\t\t\tfn: () => table_getColumnOffsets(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_setColumnSizing: { fn: (updater) => table_setColumnSizing(table, updater) },\n\t\t\ttable_resetColumnSizing: { fn: (defaultState) => table_resetColumnSizing(table, defaultState) },\n\t\t\ttable_getTotalSize: {\n\t\t\t\tfn: () => table_getTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getStartTotalSize: {\n\t\t\t\tfn: () => table_getStartTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getCenterTotalSize: {\n\t\t\t\tfn: () => table_getCenterTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getEndTotalSize: {\n\t\t\t\tfn: () => table_getEndTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnSizingFeature };","//#region src/features/row-sorting/sortFns.ts\n/**\n* Regular expression used to split mixed text and numeric chunks.\n*\n* The alphanumeric sort functions use these chunks for natural sorting of\n* strings like `item2` before `item10`.\n*/\nconst reSplitAlphaNumeric = /([0-9]+)/gm;\n/**\n* Builds a `SortFn` from a value-level comparator plus an optional\n* `resolveDataValue` normalizer.\n*\n* The `sort` comparator receives both rows' data values, each already passed\n* through `resolveDataValue` when one is defined. Keeping normalization in the\n* resolver means a variant of an existing sorting function only has to swap\n* the resolver, not re-implement the comparison.\n*\n* The definition is attached to the returned function, so a variant can be\n* created by spreading a built-in sorting function and overriding what\n* differs:\n*\n* ```ts\n* const stripDiacritics = (value: string) =>\n* value.normalize('NFD').replace(/\\p{Diacritic}/gu, '')\n*\n* const alphanumericIgnoreDiacritics = constructSortFn({\n* ...sortFn_alphanumeric,\n* resolveDataValue: (value) =>\n* stripDiacritics(sortFn_alphanumeric.resolveDataValue!(value)),\n* })\n* ```\n*/\n/* @__NO_SIDE_EFFECTS__ */\nfunction constructSortFn(def) {\n\tconst sortFn = Object.assign((rowA, rowB, columnId) => {\n\t\tlet dataValueA = rowA.getValue(columnId);\n\t\tlet dataValueB = rowB.getValue(columnId);\n\t\tconst resolveDataValue = sortFn.resolveDataValue;\n\t\tif (resolveDataValue) {\n\t\t\tdataValueA = resolveDataValue(dataValueA);\n\t\t\tdataValueB = resolveDataValue(dataValueB);\n\t\t}\n\t\treturn sortFn.sort(dataValueA, dataValueB, rowA, rowB, columnId);\n\t}, def);\n\treturn sortFn;\n}\n/**\n* Sorts rows with the built-in alphanumeric strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumeric = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in alphanumeric case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumericCaseSensitive = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_text = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_textCaseSensitive = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in datetime strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_datetime = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toDateSortValue(dataValue),\n\tsort: (dataValueA, dataValueB) => dataValueA > dataValueB ? 1 : dataValueA < dataValueB ? -1 : 0\n});\n/**\n* Sorts rows with the built-in basic strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_basic = /* @__PURE__ */ constructSortFn({ sort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB) });\nfunction compareBasic(a, b) {\n\treturn a === b ? 0 : a > b ? 1 : -1;\n}\nfunction toDateSortValue(value) {\n\treturn value instanceof Date ? value.getTime() : value;\n}\nfunction toString(a) {\n\tif (typeof a === \"number\") {\n\t\tif (isNaN(a) || a === Infinity || a === -Infinity) return \"\";\n\t\treturn String(a);\n\t}\n\tif (typeof a === \"string\") return a;\n\treturn \"\";\n}\nfunction compareAlphanumeric(aStr, bStr) {\n\tlet ai = 0;\n\tlet bi = 0;\n\tconst aLen = aStr.length;\n\tconst bLen = bStr.length;\n\twhile (ai < aLen && bi < bLen) {\n\t\tconst aIsNumeric = isDigit(aStr.charCodeAt(ai));\n\t\tconst bIsNumeric = isDigit(bStr.charCodeAt(bi));\n\t\tconst aEnd = findChunkEnd(aStr, ai, aIsNumeric);\n\t\tconst bEnd = findChunkEnd(bStr, bi, bIsNumeric);\n\t\tif (!aIsNumeric && !bIsNumeric) {\n\t\t\tconst stringComparison = compareStringChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\t\tif (stringComparison) return stringComparison;\n\t\t\tai = aEnd;\n\t\t\tbi = bEnd;\n\t\t\tcontinue;\n\t\t}\n\t\tif (aIsNumeric !== bIsNumeric) return aIsNumeric ? 1 : -1;\n\t\tconst numericComparison = compareNumericChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\tif (numericComparison) return numericComparison;\n\t\tai = aEnd;\n\t\tbi = bEnd;\n\t}\n\treturn countRemainingChunks(aStr, ai) - countRemainingChunks(bStr, bi);\n}\nfunction isDigit(charCode) {\n\treturn charCode >= 48 && charCode <= 57;\n}\nfunction findChunkEnd(str, start, isNumeric) {\n\tlet end = start + 1;\n\twhile (end < str.length && isDigit(str.charCodeAt(end)) === isNumeric) end++;\n\treturn end;\n}\nfunction compareStringChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tconst aLength = aEnd - aStart;\n\tconst bLength = bEnd - bStart;\n\tconst minLength = aLength < bLength ? aLength : bLength;\n\tfor (let i = 0; i < minLength; i++) {\n\t\tconst aCode = aStr.charCodeAt(aStart + i);\n\t\tconst bCode = bStr.charCodeAt(bStart + i);\n\t\tif (aCode > bCode) return 1;\n\t\tif (bCode > aCode) return -1;\n\t}\n\tif (aLength > bLength) return 1;\n\tif (bLength > aLength) return -1;\n\treturn 0;\n}\nfunction compareNumericChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tlet aSignificantStart = aStart;\n\twhile (aSignificantStart < aEnd && aStr.charCodeAt(aSignificantStart) === 48) aSignificantStart++;\n\tlet bSignificantStart = bStart;\n\twhile (bSignificantStart < bEnd && bStr.charCodeAt(bSignificantStart) === 48) bSignificantStart++;\n\tconst aSignificantLength = aEnd - aSignificantStart;\n\tconst bSignificantLength = bEnd - bSignificantStart;\n\tif (aSignificantLength === 0 && bSignificantLength === 0) return 0;\n\tif (aSignificantLength <= 15 && bSignificantLength <= 15) {\n\t\tconst an = parseSmallInt(aStr, aSignificantStart, aEnd);\n\t\tconst bn = parseSmallInt(bStr, bSignificantStart, bEnd);\n\t\tif (an > bn) return 1;\n\t\tif (bn > an) return -1;\n\t\treturn 0;\n\t}\n\tconst an = parseInt(aStr.slice(aStart, aEnd), 10);\n\tconst bn = parseInt(bStr.slice(bStart, bEnd), 10);\n\tif (an > bn) return 1;\n\tif (bn > an) return -1;\n\treturn 0;\n}\nfunction parseSmallInt(str, start, end) {\n\tlet result = 0;\n\tfor (let i = start; i < end; i++) result = result * 10 + str.charCodeAt(i) - 48;\n\treturn result;\n}\nfunction countRemainingChunks(str, start) {\n\tlet count = 0;\n\tlet index = start;\n\twhile (index < str.length) {\n\t\tcount++;\n\t\tindex = findChunkEnd(str, index, isDigit(str.charCodeAt(index)));\n\t}\n\treturn count;\n}\n/**\n* The built-in sorting function registry.\n*\n* Registering this full object opts out of tree-shaking: every built-in\n* sorting function ends up in your bundle. Prefer importing the `sortFn_*`\n* functions you actually use and registering just those in the `sortFns`\n* slot, or passing them directly to the `sortFn` column option.\n*\n* @deprecated Import individual `sortFn_*` functions instead for a smaller\n* bundle. This export still works and is not going away in v9, but built-in\n* name resolution (including `sortFn: 'auto'`) only finds functions you\n* register yourself.\n*/\nconst sortFns = {\n\talphanumeric: sortFn_alphanumeric,\n\talphanumericCaseSensitive: sortFn_alphanumericCaseSensitive,\n\tbasic: sortFn_basic,\n\tdatetime: sortFn_datetime,\n\ttext: sortFn_text,\n\ttextCaseSensitive: sortFn_textCaseSensitive\n};\n\n//#endregion\nexport { constructSortFn, reSplitAlphaNumeric, sortFn_alphanumeric, sortFn_alphanumericCaseSensitive, sortFn_basic, sortFn_datetime, sortFn_text, sortFn_textCaseSensitive, sortFns };","import { cloneState, isFunction, setStateSlice } from \"../../utils.js\";\nimport { reSplitAlphaNumeric, sortFn_basic } from \"./sortFns.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.utils.ts\n/**\n* Creates the default sorting state.\n*\n* The feature default is an empty array, meaning no columns are sorted. Reset\n* APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const sorting = getDefaultSortingState()\n* ```\n*/\nfunction getDefaultSortingState() {\n\treturn [];\n}\n/**\n* Routes a sorting updater through the table's sorting change handler.\n*\n* The updater may be a next `SortingState` array or a function of the previous\n* sorting state, matching the instance `table.setSorting` behavior. State\n* owners receive an equality-guarded updater so structurally equal sorting\n* values preserve the owner's existing reference.\n*\n* @example\n* ```ts\n* table_setSorting(table, (old) => [...old, { id: 'age', desc: true }])\n* ```\n*/\nfunction table_setSorting(table, updater) {\n\tsetStateSlice(table, \"sorting\", updater);\n}\n/**\n* Resets `sorting` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.sorting` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetSorting(table)\n* table_resetSorting(table, true)\n* ```\n*/\nfunction table_resetSorting(table, defaultState) {\n\ttable_setSorting(table, defaultState ? [] : cloneState(table.initialState.sorting ?? []));\n}\n/**\n* Resets sorting after the table data changes when explicitly enabled.\n*\n* Unlike other auto-reset behaviors, sorting is preserved by default. An\n* explicit `autoResetAll` value takes precedence over `autoResetSorting`.\n*\n* @example\n* ```ts\n* table_autoResetSorting(table)\n* ```\n*/\nfunction table_autoResetSorting(table) {\n\tif (!table.atoms.sorting) return;\n\tif (table.options.autoResetAll ?? table.options.autoResetSorting ?? false) table_resetSorting(table);\n}\n/**\n* Chooses a built-in sorting function from sampled filtered row values.\n*\n* Date-like values use `datetime`, mixed text/numeric strings use\n* `alphanumeric`, plain strings use `text`, and unknown values fall back to\n* `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getAutoSortFn(column)\n* ```\n*/\nfunction column_getAutoSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tlet sortFnName;\n\tlet isString = false;\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (Object.prototype.toString.call(value) === \"[object Date]\") {\n\t\t\tsortFnName = \"datetime\";\n\t\t\tbreak;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\tisString = true;\n\t\t\tif (value.split(reSplitAlphaNumeric).length > 1) {\n\t\t\t\tsortFnName = \"alphanumeric\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!sortFnName && isString) sortFnName = \"text\";\n\tif (sortFnName) {\n\t\tlet sortFn = sortFns?.[sortFnName];\n\t\tif (!sortFn) {\n\t\t\tif (process.env.NODE_ENV === \"development\") console.warn(`sortFn '${sortFnName}' (auto) for column '${column.id}' is not registered`);\n\t\t\tif (sortFnName === \"alphanumeric\") sortFn = sortFns?.text;\n\t\t}\n\t\tif (sortFn) return sortFn;\n\t}\n\treturn sortFn_basic;\n}\n/**\n* Chooses the default first sort direction from sampled filtered row values.\n*\n* The first non-nullish value among the sampled rows decides: string columns\n* start ascending so alphabetical order is natural; other value types (or\n* columns with no non-nullish sample) start descending. Sampling past leading\n* nullish values keeps the toggle cycle stable when sorting or a data swap\n* moves an empty value into the first row.\n*\n* @example\n* ```ts\n* const direction = column_getAutoSortDir(column)\n* ```\n*/\nfunction column_getAutoSortDir(column) {\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (value == null) continue;\n\t\treturn typeof value === \"string\" ? \"asc\" : \"desc\";\n\t}\n\treturn \"desc\";\n}\n/**\n* Resolves the sorting function configured for a column.\n*\n* Function-valued `columnDef.sortFn` is returned directly, `'auto'` delegates\n* to `column_getAutoSortFn`, and string values are looked up in the table's\n* sorting function registry before falling back to `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getSortFn(column)\n* ```\n*/\nfunction column_getSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tif (isFunction(column.columnDef.sortFn)) return column.columnDef.sortFn;\n\tif (column.columnDef.sortFn === \"auto\") return column_getAutoSortFn(column);\n\tconst sortFn = sortFns?.[column.columnDef.sortFn];\n\tif (process.env.NODE_ENV === \"development\" && !sortFn) console.warn(`sortFn '${String(column.columnDef.sortFn)}' for column '${column.id}' is not registered`);\n\treturn sortFn ?? sortFn_basic;\n}\n/**\n* Applies the next sorting state for this column.\n*\n* The toggle can add, replace, flip, or remove this column's sort entry. Multi\n* sorting respects `enableMultiSort`, `enableMultiRemove`,\n* `maxMultiSortColCount`, and the `multi` argument.\n*\n* @example\n* ```ts\n* column_toggleSorting(column, undefined, true)\n* ```\n*/\nfunction column_toggleSorting(column, desc, multi) {\n\tconst nextSortingOrder = column_getNextSortingOrder(column, multi && column_getCanMultiSort(column));\n\tconst hasManualValue = typeof desc !== \"undefined\";\n\ttable_setSorting(column.table, (old) => {\n\t\tconst existingIndex = old.findIndex((d) => d.id === column.id);\n\t\tconst existingSorting = existingIndex === -1 ? void 0 : old[existingIndex];\n\t\tlet newSorting = [];\n\t\tlet sortAction;\n\t\tconst nextDesc = hasManualValue ? desc : nextSortingOrder === \"desc\";\n\t\tconst isMultiMode = !!(old.length && column_getCanMultiSort(column) && multi);\n\t\tif (isMultiMode) {\n\t\t\tif (existingSorting) sortAction = \"toggle\";\n\t\t\telse sortAction = \"add\";\n\t\t} else if (existingSorting) sortAction = \"toggle\";\n\t\telse sortAction = \"replace\";\n\t\tif (sortAction === \"toggle\") {\n\t\t\tif (!hasManualValue) {\n\t\t\t\tif (!nextSortingOrder) sortAction = \"remove\";\n\t\t\t}\n\t\t}\n\t\tif (sortAction === \"add\") {\n\t\t\tnewSorting = [...old, {\n\t\t\t\tid: column.id,\n\t\t\t\tdesc: nextDesc\n\t\t\t}];\n\t\t\tnewSorting.splice(0, newSorting.length - (column.table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER));\n\t\t} else if (sortAction === \"toggle\") newSorting = isMultiMode ? old.map((d) => {\n\t\t\tif (d.id === column.id) return {\n\t\t\t\t...d,\n\t\t\t\tdesc: nextDesc\n\t\t\t};\n\t\t\treturn d;\n\t\t}) : [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\telse if (sortAction === \"remove\") newSorting = isMultiMode ? old.filter((d) => d.id !== column.id) : [];\n\t\telse newSorting = [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\treturn newSorting;\n\t});\n}\n/**\n* Resolves the first direction used when this column begins sorting.\n*\n* Column-level `sortDescFirst` wins, then table-level `sortDescFirst`, then the\n* auto direction inferred from sampled values.\n*\n* @example\n* ```ts\n* const firstDirection = column_getFirstSortDir(column)\n* ```\n*/\nfunction column_getFirstSortDir(column) {\n\treturn column.columnDef.sortDescFirst ?? column.table.options.sortDescFirst ?? column_getAutoSortDir(column) === \"desc\" ? \"desc\" : \"asc\";\n}\n/**\n* Resolves the next sort order for this column's toggle cycle.\n*\n* The cycle starts with the first sort direction, flips between `asc` and\n* `desc`, and can return `false` when sorting removal is enabled.\n*\n* @example\n* ```ts\n* const nextOrder = column_getNextSortingOrder(column)\n* ```\n*/\nfunction column_getNextSortingOrder(column, multi) {\n\tconst firstSortDirection = column_getFirstSortDir(column);\n\tconst isSorted = column_getIsSorted(column);\n\tif (!isSorted) return firstSortDirection;\n\tif (isSorted !== firstSortDirection && (column.table.options.enableSortingRemoval ?? true) && (multi ? column.table.options.enableMultiRemove ?? true : true)) return false;\n\treturn isSorted === \"desc\" ? \"asc\" : \"desc\";\n}\n/**\n* Checks whether this accessor column can participate in sorting.\n*\n* The column must have an accessor and sorting must be enabled by both the\n* column definition and table options.\n*\n* @example\n* ```ts\n* const canSort = column_getCanSort(column)\n* ```\n*/\nfunction column_getCanSort(column) {\n\treturn (column.columnDef.enableSorting ?? true) && (column.table.options.enableSorting ?? true) && !!column.accessorFn;\n}\n/**\n* Checks whether this column can be added to a multi-sort state.\n*\n* Column-level `enableMultiSort` wins over table-level `enableMultiSort`; if\n* neither is set, accessor columns can multi-sort by default.\n*\n* @example\n* ```ts\n* const canMultiSort = column_getCanMultiSort(column)\n* ```\n*/\nfunction column_getCanMultiSort(column) {\n\treturn column.columnDef.enableMultiSort ?? column.table.options.enableMultiSort ?? !!column.accessorFn;\n}\n/**\n* Reads this column's current sort direction.\n*\n* The result is `false` when the column is not sorted, otherwise `'asc'` or\n* `'desc'` based on the column's entry in `state.sorting`.\n*\n* @example\n* ```ts\n* const direction = column_getIsSorted(column)\n* ```\n*/\nfunction column_getIsSorted(column) {\n\tconst columnSort = column.table.atoms.sorting?.get()?.find((d) => d.id === column.id);\n\treturn !columnSort ? false : columnSort.desc ? \"desc\" : \"asc\";\n}\n/**\n* Finds this column's position in the ordered `state.sorting` array.\n*\n* The result is `-1` when the column is not sorted.\n*\n* @example\n* ```ts\n* const index = column_getSortIndex(column)\n* ```\n*/\nfunction column_getSortIndex(column) {\n\treturn column.table.atoms.sorting?.get()?.findIndex((d) => d.id === column.id) ?? -1;\n}\n/**\n* Removes this column from the sorting state.\n*\n* Other sorted columns are preserved, including their relative order.\n*\n* @example\n* ```ts\n* column_clearSorting(column)\n* ```\n*/\nfunction column_clearSorting(column) {\n\ttable_setSorting(column.table, (old) => old.length ? old.filter((d) => d.id !== column.id) : []);\n}\n/**\n* Creates a header event handler that toggles this column's sorting.\n*\n* The handler ignores events when the column cannot sort, and asks\n* `options.isMultiSortEvent` whether the event should add to a multi-sort.\n*\n* @example\n* ```ts\n* const onClick = column_getToggleSortingHandler(column)\n* ```\n*/\nfunction column_getToggleSortingHandler(column) {\n\tconst canSort = column_getCanSort(column);\n\treturn (e) => {\n\t\tif (!canSort) return;\n\t\tcolumn_toggleSorting(column, void 0, column_getCanMultiSort(column) ? column.table.options.isMultiSortEvent?.(e) : false);\n\t};\n}\n\n//#endregion\nexport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_autoResetSorting, table_resetSorting, table_setSorting };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_autoResetSorting, table_resetSorting, table_setSorting } from \"./rowSortingFeature.utils.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.ts\n/**\n* Feature that adds row sorting state, defaults, and column/table sorting APIs.\n*/\nconst rowSortingFeature = {\n\tgetInitialState(initialState) {\n\t\treturn {\n\t\t\tsorting: getDefaultSortingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef() {\n\t\treturn {\n\t\t\tsortFn: \"auto\",\n\t\t\tsortUndefined: 1\n\t\t};\n\t},\n\tgetDefaultTableOptions(table) {\n\t\treturn {\n\t\t\tautoResetSorting: false,\n\t\t\tonSortingChange: makeStateUpdater(\"sorting\", table),\n\t\t\tisMultiSortEvent: (e) => {\n\t\t\t\treturn e.shiftKey;\n\t\t\t}\n\t\t};\n\t},\n\tassignColumnPrototype(prototype, table) {\n\t\tassignPrototypeAPIs(\"rowSortingFeature\", prototype, table, {\n\t\t\tcolumn_getAutoSortFn: { fn: (column) => column_getAutoSortFn(column) },\n\t\t\tcolumn_getAutoSortDir: { fn: (column) => column_getAutoSortDir(column) },\n\t\t\tcolumn_getSortFn: { fn: (column) => column_getSortFn(column) },\n\t\t\tcolumn_toggleSorting: { fn: (column, desc, multi) => column_toggleSorting(column, desc, multi) },\n\t\t\tcolumn_getFirstSortDir: { fn: (column) => column_getFirstSortDir(column) },\n\t\t\tcolumn_getNextSortingOrder: { fn: (column, multi) => column_getNextSortingOrder(column, multi) },\n\t\t\tcolumn_getCanSort: { fn: (column) => column_getCanSort(column) },\n\t\t\tcolumn_getCanMultiSort: { fn: (column) => column_getCanMultiSort(column) },\n\t\t\tcolumn_getIsSorted: { fn: (column) => column_getIsSorted(column) },\n\t\t\tcolumn_getSortIndex: { fn: (column) => column_getSortIndex(column) },\n\t\t\tcolumn_clearSorting: { fn: (column) => column_clearSorting(column) },\n\t\t\tcolumn_getToggleSortingHandler: { fn: (column) => column_getToggleSortingHandler(column) }\n\t\t});\n\t},\n\tconstructTableAPIs(table) {\n\t\tassignTableAPIs(\"rowSortingFeature\", table, {\n\t\t\ttable_autoResetSorting: { fn: () => table_autoResetSorting(table) },\n\t\t\ttable_setSorting: { fn: (updater) => table_setSorting(table, updater) },\n\t\t\ttable_resetSorting: { fn: (defaultState) => table_resetSorting(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowSortingFeature };","import { batch, createAtom } from \"@tanstack/store\";\n\n//#region src/store-reactivity-bindings.ts\n/**\n* TanStack Store–based reactivity for vanilla / non-framework use of `constructTable`,\n* with `createOptionsStore: true` so `table.optionsStore` is available for subscriptions.\n*\n* @example\n* ```ts\n* import { constructTable, tableFeatures } from '@tanstack/table-core'\n* import { storeReactivityBindings } from '@tanstack/table-core/store-reactivity-bindings'\n*\n* const table = constructTable({\n* features: tableFeatures({ coreReactivityFeature: storeReactivityBindings() }),\n* // ...\n* })\n* ```\n*/\nfunction storeReactivityBindings() {\n\treturn {\n\t\tcreateOptionsStore: true,\n\t\twrapExternalAtoms: false,\n\t\taddSubscription: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tunmount: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tbatch,\n\t\tschedule: (fn) => queueMicrotask(fn),\n\t\tuntrack: (fn) => fn(),\n\t\tcreateReadonlyAtom: (fn, options) => {\n\t\t\treturn createAtom(() => fn(), { compare: options?.compare });\n\t\t},\n\t\tcreateWritableAtom: (value, options) => {\n\t\t\treturn createAtom(value, { compare: options?.compare });\n\t\t}\n\t};\n}\n\n//#endregion\nexport { storeReactivityBindings };","import type {\n ColumnDef_RowSorting,\n RowData,\n RowModel,\n SortFnDef,\n Table,\n TableFeatures,\n} from '@tanstack/table-core';\nimport { column_getCanSort, column_getSortFn } from '@tanstack/table-core/static-functions';\n\ntype Sorting = readonly { id: string; desc: boolean }[];\n\ninterface SortKey {\n /** Each row's value by its position in the unsorted rows, resolved for `compare`. */\n keys: unknown[];\n compare: (a: unknown, b: unknown) => number;\n /** -1 flips `compare` (descending, inverted). */\n sign: number;\n sortUndefined: false | -1 | 1 | 'first' | 'last' | undefined;\n}\n\n/**\n * The sorted row model, in place of TanStack's `createSortedRowModel()`, giving the\n * same order: the same sort functions (`auto` included), `sortUndefined`,\n * `invertSorting`, ties by row index.\n *\n * It reads each row's value once, through the column's accessor, and sorts the row\n * positions by those values. TanStack's model calls `row.getValue()` four times per\n * comparison, and its row methods take rest arguments (`function (...args)`): in\n * Firefox that slows a large sort down by orders of magnitude (750k rows: 176 s\n * against 0.9 s for the same comparator without rest arguments). Reading values\n * once is also faster everywhere, most of all for text, which is lowercased once\n * per row instead of twice per comparison.\n *\n * The registered sort functions come from `constructSortFn`: each carries a value\n * comparator (`sort`, which compares values only) and a normalizer\n * (`resolveDataValue`). The rows are flat (no sub-rows), so there is nothing to\n * sort below them.\n */\nexport function sortedRowModel<TFeatures extends TableFeatures, TData extends RowData>() {\n return (table: Table<TFeatures, TData>) => {\n let last:\n | { sorting: unknown; source: RowModel<TFeatures, TData>; model: RowModel<TFeatures, TData> }\n | undefined;\n return (): RowModel<TFeatures, TData> => {\n const source = table.getPreSortedRowModel();\n const sorting = (table.options.state as { sorting?: Sorting } | undefined)?.sorting;\n const prev = last;\n if (prev && prev.sorting === sorting && prev.source === source) return prev.model;\n const model = sortRows(table, source, sorting ?? []);\n last = { sorting, source, model };\n return model;\n };\n };\n}\n\nfunction sortRows<TFeatures extends TableFeatures, TData extends RowData>(\n table: Table<TFeatures, TData>,\n source: RowModel<TFeatures, TData>,\n sorting: Sorting,\n): RowModel<TFeatures, TData> {\n const rows = source.rows;\n const sortKeys: SortKey[] = [];\n for (const { id, desc } of sorting) {\n const column = table.getColumn(id);\n if (!column || !column_getCanSort(column)) continue;\n const fn = column_getSortFn(column) as unknown as SortFnDef<TFeatures, TData>;\n const def = column.columnDef as ColumnDef_RowSorting<TFeatures, TData>;\n const read = column.accessorFn;\n const resolve = fn.resolveDataValue;\n const sortUndefined = def.sortUndefined;\n sortKeys.push({\n keys: rows.map((row) => {\n const value = read?.(row.original, row.index);\n // Undefined stays undefined where `sortUndefined` places it.\n return resolve && !(value === undefined && sortUndefined)\n ? (resolve(value) as unknown)\n : value;\n }),\n compare: fn.sort as (a: unknown, b: unknown) => number,\n sign: (desc ? -1 : 1) * (def.invertSorting ? -1 : 1),\n sortUndefined,\n });\n }\n if (!sortKeys.length || !rows.length) return source;\n\n const compare = (i: number, j: number): number => {\n for (const { keys, compare, sign, sortUndefined } of sortKeys) {\n const a = keys[i];\n const b = keys[j];\n let result = 0;\n if (sortUndefined && (a === undefined || b === undefined)) {\n if (a === undefined && b === undefined) continue;\n if (sortUndefined === 'first') return a === undefined ? -1 : 1;\n if (sortUndefined === 'last') return a === undefined ? 1 : -1;\n result = a === undefined ? sortUndefined : -sortUndefined;\n }\n if (result === 0) result = compare(a, b);\n if (result !== 0) return result * sign;\n }\n return (rows[i]?.index ?? i) - (rows[j]?.index ?? j);\n };\n\n const sorted = rows\n .map((_, i) => i)\n .sort(compare)\n .map((i) => rows[i])\n .filter((row) => row !== undefined);\n return { rows: sorted, flatRows: sorted, rowsById: source.rowsById };\n}\n","import {\n columnPinningFeature,\n columnSizingFeature,\n constructTable,\n rowSortingFeature,\n sortFn_alphanumeric,\n sortFn_basic,\n sortFn_datetime,\n sortFn_text,\n tableFeatures,\n type Column,\n type ColumnDef as TanStackColumnDef,\n type Row,\n type Table,\n type TableOptions,\n} from '@tanstack/table-core';\nimport { storeReactivityBindings } from '@tanstack/table-core/store-reactivity-bindings';\nimport { moveColumn, normalizeOrder } from '../columns/column-order.js';\nimport { resolveColumns, type ResolvedColumn } from '../columns/resolve-columns.js';\nimport { sortedRowModel } from './sorted-row-model.js';\nimport type {\n CellContext,\n ColumnAlign,\n ColumnDef,\n ColumnOrderState,\n ColumnPin,\n ColumnSizingState,\n PinnedRows,\n RowPin,\n SortState,\n} from '../types.js';\n\n// The TanStack adapter. Everything TanStack stays in this module: callers only see\n// the view types below, so TanStack can be upgraded or replaced without touching\n// `argus-table`'s public API.\n\nconst features = tableFeatures({\n // Vanilla (framework-free) reactivity; required by `constructTable`.\n coreReactivityFeature: storeReactivityBindings(),\n columnPinningFeature,\n columnSizingFeature,\n rowSortingFeature,\n // Our own: TanStack's is very slow in Firefox at scale (see sorted-row-model.ts).\n sortedRowModel: sortedRowModel(),\n // Registered by name so `sortFn: 'auto'` can pick one by value type.\n sortFns: {\n alphanumeric: sortFn_alphanumeric,\n basic: sortFn_basic,\n datetime: sortFn_datetime,\n text: sortFn_text,\n },\n});\ntype Features = typeof features;\ntype AnyRow = Record<string, unknown>;\n\n/** Sort direction of a column, or `false` when it isn't sorted. */\nexport type SortDirection = 'asc' | 'desc' | false;\n\n/** A column as the renderer sees it, in visual order: start-pinned, scrolling, end-pinned. */\nexport interface ColumnView<TData, TContent> {\n id: string;\n /** 1-based position in visual order, for `aria-colindex`. */\n colIndex: number;\n pin: ColumnPin | undefined;\n /**\n * Sticky inset in px: from the start edge for `'start'` columns, from the end edge\n * for `'end'` columns. For scrolling columns, the start within the scrolling area.\n */\n offset: number;\n /** `true` on the pinned column next to the scrolling area (one per pinned side). */\n pinEdge: boolean;\n /** Current width in px (a resized width wins over the column's own). */\n width: number;\n /** Share of free space, or `undefined` for a fixed width. A resized column stops flexing. */\n flex: number | undefined;\n /**\n * `true` for a `width: 'auto'` column that hasn't been resized: the table measures\n * its content and passes the width in as `autoWidths`.\n */\n auto: boolean;\n minWidth: number;\n maxWidth: number;\n sortable: boolean;\n resizable: boolean;\n reorderable: boolean;\n align: ColumnAlign;\n sorted: SortDirection;\n header: ColumnDef<TData, TContent>['header'];\n cell: ColumnDef<TData, TContent>['cell'];\n hasAccessor: boolean;\n}\n\n/** A row of the current (sorted) row model. */\nexport interface RowView<TData> {\n id: string;\n /** Index in the current row model, 0-based. */\n index: number;\n original: TData;\n}\n\n/**\n * Rows that live outside the model, loaded page by page (`dataSource`). The\n * source sorts them, so the model reads them as they are. `PageCache` implements it.\n */\nexport interface RemoteRows<TData> {\n readonly rowCount: number;\n /** The loaded row at an index, with its id; `undefined` while it isn't loaded. */\n entryAt(index: number): { id: string; row: TData } | undefined;\n /** The index of a loaded row's id, or `undefined`. */\n indexOf(rowId: string): number | undefined;\n}\n\nexport interface TableModelOptions<TData, TContent> {\n columns: readonly ColumnDef<TData, TContent>[];\n data: readonly TData[];\n /**\n * Remote rows. When set, rows come from here instead of `data`, and the model\n * doesn't sort them (the source does).\n */\n remote?: RemoteRows<TData> | undefined;\n /** Row id function. Default: the row's index in `data`, as a string. */\n getRowId: ((row: TData, index: number) => string) | undefined;\n /** Current sort state; its owner is the caller (see `controllable`). */\n sorting: SortState;\n /** Current resized widths; its owner is the caller. */\n columnSizing: ColumnSizingState;\n /**\n * Current column order; its owner is the caller. Each pin group follows it; an\n * empty array (the default) keeps the order of `columns`.\n */\n columnOrder?: ColumnOrderState | undefined;\n /**\n * Measured widths of `width: 'auto'` columns, in px by id. Clamped to the column's\n * bounds; a resized width wins. Ids of other columns are ignored.\n */\n autoWidths?: ColumnSizingState | undefined;\n /** Rows fixed above or below the body. They stay out of the row model: never sorted, not counted. */\n pinnedRows?: PinnedRows<TData> | undefined;\n}\n\nexport interface TableModel<TData, TContent> {\n /** Updates any subset of the options. Unchanged references are ignored. */\n update(options: Partial<TableModelOptions<TData, TContent>>): void;\n /** Columns in visual order. */\n readonly columns: readonly ColumnView<TData, TContent>[];\n /** Number of rows in the current row model. */\n readonly rowCount: number;\n /** Sum of all column widths in px (flex columns count their minimum). */\n readonly totalWidth: number;\n /** The row at an index of the current row model; `undefined` for a remote row not loaded yet. */\n rowAt(index: number): RowView<TData> | undefined;\n /** The index of a row id in the current row model (after sorting), or `undefined`. */\n indexOf(rowId: string): number | undefined;\n /** The value a column reads from the row at `index`. */\n valueAt(index: number, columnId: string): unknown;\n /** What a column's `cell` function receives for the row at `index`. */\n cellContext(index: number, columnId: string): CellContext<TData> | undefined;\n /**\n * The sort state that clicking this column's header would produce:\n * asc → desc → unsorted, one column at a time. `undefined` if it can't sort.\n */\n nextSorting(columnId: string): SortState | undefined;\n /**\n * The sizing state after setting a column to `width` px, clamped to its bounds.\n * `undefined` if the column can't be resized.\n */\n nextSizing(columnId: string, width: number): ColumnSizingState | undefined;\n /**\n * The full column order as the table shows it: start-pinned, scrolling and\n * end-pinned ids. `base` defaults to the current `columnOrder`.\n */\n orderOf(base?: readonly string[]): ColumnOrderState;\n /**\n * The order after moving a column to position `to` (0-based, in the whole order,\n * counted after the move), starting from `base` (default: the current order).\n * `undefined` if the column can't move, `to` is outside its pin group, or nothing changes.\n */\n nextOrder(columnId: string, to: number, base?: readonly string[]): ColumnOrderState | undefined;\n /** Number of rows pinned to a side. */\n pinnedCount(side: RowPin): number;\n /**\n * A pinned row, `index` counted within its side. Its id comes from `getRowId`,\n * else it is `'top-{index}'` or `'bottom-{index}'`, apart from the data rows' index ids.\n */\n pinnedRowAt(side: RowPin, index: number): RowView<TData> | undefined;\n /** The value a column reads from a pinned row. */\n pinnedValueAt(side: RowPin, index: number, columnId: string): unknown;\n /** What a column's `cell` function receives for a pinned row (with `pinned` set). */\n pinnedCellContext(side: RowPin, index: number, columnId: string): CellContext<TData> | undefined;\n}\n\nconst defaultRowId = (_row: unknown, index: number) => String(index);\n\nfunction toTanStack<TData, TContent>(\n column: ResolvedColumn<TData, TContent>,\n): TanStackColumnDef<Features, AnyRow> {\n return {\n id: column.id,\n accessorFn: column.getValue as (row: AnyRow, index: number) => unknown,\n size: column.width,\n minSize: column.minWidth,\n maxSize: column.maxWidth,\n enableSorting: column.sortable,\n sortUndefined: 'last',\n };\n}\n\n/**\n * Creates the table model over TanStack Table. It owns no state: sorting, sizing and order\n * come in through `update()`, and `nextSorting()`, `nextSizing()` and `nextOrder()` only propose\n * changes, so the caller decides (controlled or uncontrolled) whether to apply them.\n */\nexport function createTableModel<TData, TContent>(\n initial: TableModelOptions<TData, TContent>,\n): TableModel<TData, TContent> {\n let options = initial;\n let resolved = resolveColumns(options.columns);\n let byId = new Map(resolved.map((c) => [c.id, c]));\n // TanStack column defs by id, kept between updates that don't change `columns`.\n let tanStackById = new Map(resolved.map((c) => [c.id, toTanStack(c)]));\n let views: ColumnView<TData, TContent>[] | undefined;\n // TanStack's sizing state: measured auto widths under the resized ones. Kept stable\n // between updates that don't touch either.\n let sizing: ColumnSizingState | undefined;\n const sizingState = (): ColumnSizingState => {\n if (sizing) return sizing;\n const auto = options.autoWidths;\n if (!auto) return (sizing = options.columnSizing);\n const merged: ColumnSizingState = {};\n for (const column of resolved) {\n const px = auto[column.id];\n if (!column.auto || px === undefined || !Number.isFinite(px)) continue;\n merged[column.id] = Math.min(column.maxWidth, Math.max(column.minWidth, px));\n }\n return (sizing = { ...merged, ...options.columnSizing });\n };\n // The normalized order, kept stable between updates that touch neither columns nor order.\n let order: ColumnOrderState | undefined;\n const orderState = (): ColumnOrderState =>\n (order ??= normalizeOrder(options.columnOrder ?? [], resolved));\n const rowViews = new WeakMap<Row<Features, AnyRow>, RowView<TData>>();\n // Built lazily per row model (sorting or new data gives a new array).\n let indexById: { rows: readonly Row<Features, AnyRow>[]; map: Map<string, number> } | undefined;\n\n // The order reaches TanStack as the order of its column defs (the scrolling\n // columns follow it) and of the pinning arrays (the pinned ones do). Rebuilt only\n // when the order changes: a new columns array makes TanStack rebuild its columns,\n // though not its row models, which depend on data and sorting alone.\n let ordered:\n | {\n order: ColumnOrderState;\n columns: TanStackColumnDef<Features, AnyRow>[];\n pinning: { start: string[]; end: string[] };\n }\n | undefined;\n const orderedColumns = () => {\n const current = orderState();\n if (ordered?.order !== current) {\n const pinOf = (id: string) => byId.get(id)?.pin;\n ordered = {\n order: current,\n columns: current.flatMap((id) => tanStackById.get(id) ?? []),\n pinning: {\n start: current.filter((id) => pinOf(id) === 'start'),\n end: current.filter((id) => pinOf(id) === 'end'),\n },\n };\n }\n return ordered;\n };\n\n const tableOptions = (): TableOptions<Features, AnyRow> => ({\n features,\n columns: orderedColumns().columns,\n // Remote rows bypass TanStack's row models; it still handles columns and state.\n data: (options.remote ? [] : options.data) as AnyRow[],\n getRowId: (options.getRowId ?? defaultRowId) as (row: AnyRow, index: number) => string,\n state: {\n sorting: options.sorting,\n columnSizing: sizingState(),\n columnPinning: orderedColumns().pinning,\n },\n // State is owned by the caller; TanStack's own setters must not change it.\n onSortingChange: () => undefined,\n onColumnSizingChange: () => undefined,\n onColumnPinningChange: () => undefined,\n });\n\n const table: Table<Features, AnyRow> = constructTable(tableOptions());\n\n const rows = () => table.getRowModel().rows;\n const pinned = (side: RowPin): readonly TData[] => options.pinnedRows?.[side] ?? [];\n\n const buildViews = (): ColumnView<TData, TContent>[] => {\n const start = table.getStartLeafColumns();\n const center = table.getCenterLeafColumns();\n const end = table.getEndLeafColumns();\n const sorting = options.sorting;\n const view = (\n column: Column<Features, AnyRow>,\n colIndex: number,\n offset: number,\n pinEdge: boolean,\n ): ColumnView<TData, TContent> => {\n const def = byId.get(column.id);\n if (!def) throw new Error(`argus-table: unknown column '${column.id}'.`);\n const sort = sorting.find((s) => s.id === column.id);\n return {\n id: def.id,\n colIndex,\n pin: def.pin,\n offset,\n pinEdge,\n width: column.getSize(),\n flex: options.columnSizing[def.id] === undefined ? def.flex : undefined,\n auto: def.auto && options.columnSizing[def.id] === undefined,\n minWidth: def.minWidth,\n maxWidth: def.maxWidth,\n sortable: def.sortable,\n resizable: def.resizable,\n reorderable: def.reorderable,\n align: def.align,\n sorted: sort ? (sort.desc ? 'desc' : 'asc') : false,\n header: def.header,\n cell: def.cell,\n hasAccessor: def.hasAccessor,\n };\n };\n return [\n ...start.map((c, i) => view(c, i + 1, c.getStart('start'), i === start.length - 1)),\n ...center.map((c, i) => view(c, start.length + i + 1, c.getStart('center'), false)),\n ...end.map((c, i) =>\n view(c, start.length + center.length + i + 1, c.getAfter('end'), i === 0),\n ),\n ];\n };\n\n return {\n update(next) {\n const merged = { ...options, ...next };\n const changed = (Object.keys(next) as (keyof typeof next)[]).some(\n (key) => next[key] !== options[key],\n );\n if (!changed) return;\n if (next.columns && next.columns !== options.columns) {\n resolved = resolveColumns(next.columns);\n byId = new Map(resolved.map((c) => [c.id, c]));\n tanStackById = new Map(resolved.map((c) => [c.id, toTanStack(c)]));\n }\n if (\n merged.columns !== options.columns ||\n merged.columnSizing !== options.columnSizing ||\n merged.autoWidths !== options.autoWidths\n ) {\n sizing = undefined;\n }\n if (merged.columns !== options.columns || merged.columnOrder !== options.columnOrder) {\n order = undefined;\n }\n options = merged;\n views = undefined;\n table.setOptions((prev) => ({ ...prev, ...tableOptions() }));\n },\n\n get columns() {\n return (views ??= buildViews());\n },\n\n get rowCount() {\n return options.remote?.rowCount ?? rows().length;\n },\n\n get totalWidth() {\n return table.getTotalSize();\n },\n\n rowAt(index) {\n if (options.remote) {\n const entry = options.remote.entryAt(index);\n return entry && { id: entry.id, index, original: entry.row };\n }\n const row = rows()[index];\n if (!row) return undefined;\n let view = rowViews.get(row);\n if (view?.index !== index) {\n view = { id: row.id, index, original: row.original as TData };\n rowViews.set(row, view);\n }\n return view;\n },\n\n indexOf(rowId) {\n if (options.remote) return options.remote.indexOf(rowId);\n const current = rows();\n if (indexById?.rows !== current) {\n indexById = { rows: current, map: new Map(current.map((r, i) => [r.id, i])) };\n }\n return indexById.map.get(rowId);\n },\n\n valueAt(index, columnId) {\n if (options.remote) {\n const entry = options.remote.entryAt(index);\n return entry && byId.get(columnId)?.getValue(entry.row, index);\n }\n return rows()[index]?.getValue(columnId);\n },\n\n cellContext(index, columnId) {\n if (options.remote) {\n const entry = options.remote.entryAt(index);\n const column = byId.get(columnId);\n if (!entry || !column) return undefined;\n return {\n row: entry.row,\n rowId: entry.id,\n index,\n columnId,\n value: column.getValue(entry.row, index),\n };\n }\n const row = rows()[index];\n if (!row || !byId.has(columnId)) return undefined;\n return {\n row: row.original as TData,\n rowId: row.id,\n index,\n columnId,\n value: row.getValue(columnId),\n };\n },\n\n nextSorting(columnId) {\n if (byId.get(columnId)?.sortable !== true) return undefined;\n const current = options.sorting.find((s) => s.id === columnId);\n if (!current) return [{ id: columnId, desc: false }];\n return current.desc ? [] : [{ id: columnId, desc: true }];\n },\n\n nextSizing(columnId, width) {\n const column = byId.get(columnId);\n if (!column?.resizable || !Number.isFinite(width)) return undefined;\n const clamped = Math.round(Math.min(column.maxWidth, Math.max(column.minWidth, width)));\n return { ...options.columnSizing, [columnId]: clamped };\n },\n\n orderOf(base) {\n return base === undefined ? orderState() : normalizeOrder(base, resolved);\n },\n\n nextOrder(columnId, to, base) {\n return moveColumn(base ?? orderState(), resolved, columnId, to);\n },\n\n pinnedCount(side) {\n return pinned(side).length;\n },\n\n pinnedRowAt(side, index) {\n if (index < 0 || index >= pinned(side).length) return undefined;\n const row = pinned(side)[index] as TData;\n const id = options.getRowId ? options.getRowId(row, index) : `${side}-${String(index)}`;\n return { id, index, original: row };\n },\n\n pinnedValueAt(side, index, columnId) {\n if (index < 0 || index >= pinned(side).length) return undefined;\n return byId.get(columnId)?.getValue(pinned(side)[index] as TData, index);\n },\n\n pinnedCellContext(side, index, columnId) {\n const row = this.pinnedRowAt(side, index);\n const column = byId.get(columnId);\n if (!row || !column) return undefined;\n return {\n row: row.original,\n rowId: row.id,\n index,\n columnId,\n value: column.getValue(row.original, index),\n pinned: side,\n };\n },\n };\n}\n","/** The row groups of the grid, top to bottom. */\nexport type GridSection = 'header' | 'top' | 'body' | 'bottom';\n\n/** A row of the grid: its section and its index within it (the header is index 0). */\nexport interface GridRow {\n section: GridSection;\n index: number;\n}\n\n/**\n * Where each row sits in the grid as a whole: the header row, then the rows\n * pinned to the top, the body rows, and the rows pinned to the bottom. The\n * position is 0-based and `aria-rowindex` is one more. Keyboard navigation\n * steps through positions, so it crosses sections without special cases.\n */\nexport class RowLayout {\n readonly top: number;\n readonly body: number;\n readonly bottom: number;\n\n constructor(top: number, body: number, bottom: number) {\n this.top = top;\n this.body = body;\n this.bottom = bottom;\n }\n\n /** Number of rows, the header included (`aria-rowcount`). */\n get total(): number {\n return 1 + this.top + this.body + this.bottom;\n }\n\n /** 0-based position of a row in the grid. */\n position({ section, index }: GridRow): number {\n switch (section) {\n case 'header':\n return 0;\n case 'top':\n return 1 + index;\n case 'body':\n return 1 + this.top + index;\n case 'bottom':\n return 1 + this.top + this.body + index;\n }\n }\n\n /** The row at a 0-based position, or `undefined` outside the grid. */\n at(position: number): GridRow | undefined {\n if (!Number.isInteger(position) || position < 0 || position >= this.total) return undefined;\n if (position === 0) return { section: 'header', index: 0 };\n let index = position - 1;\n if (index < this.top) return { section: 'top', index };\n index -= this.top;\n if (index < this.body) return { section: 'body', index };\n return { section: 'bottom', index: index - this.body };\n }\n\n ariaRowIndex(row: GridRow): number {\n return this.position(row) + 1;\n }\n\n fromAriaRowIndex(ariaRowIndex: number): GridRow | undefined {\n return this.at(ariaRowIndex - 1);\n }\n}\n","/**\n * State that works like a form input: uncontrolled until the host sets it,\n * controlled from then on. See `docs/plan/code-architecture/04-state-and-events.md`.\n *\n * - **Uncontrolled:** `request()` applies the change. The caller then fires the change event.\n * - **Controlled:** `request()` changes nothing and returns the proposed value for the\n * event. The value only changes when the host calls `set()` again.\n * - `set(undefined)` hands ownership back to the table and keeps the last value.\n */\nexport interface Controllable<T> {\n /** The current value. */\n readonly value: T;\n /** `true` once the host has set a value (and not handed it back with `undefined`). */\n readonly controlled: boolean;\n /** Called when the host sets the property. */\n set(value: T | undefined): void;\n /**\n * Called when the table wants to change the state, for example after a header click.\n * Returns the proposed value and whether it was applied.\n */\n request(next: T): { value: T; applied: boolean };\n}\n\nexport function controllable<T>(initial: T): Controllable<T> {\n let value = initial;\n let controlled = false;\n return {\n get value() {\n return value;\n },\n get controlled() {\n return controlled;\n },\n set(next) {\n if (next === undefined) {\n controlled = false;\n return;\n }\n controlled = true;\n value = next;\n },\n request(next) {\n if (!controlled) value = next;\n return { value: next, applied: !controlled };\n },\n };\n}\n","/** A rendered row and the pool slot whose DOM it uses. */\nexport interface PoolEntry {\n id: string;\n slot: number;\n}\n\n/**\n * Assigns pool slots to rendered rows (ADR 0001).\n *\n * A row keeps its slot while it stays rendered. A row entering the window takes a\n * slot freed by a row that left, so its DOM is updated in place rather than created.\n * Rows are returned in slot order (\"pool order\"); the ADR 0001 addendum ruled out\n * re-sorting them by row index, so assistive tech gets row positions from\n * `aria-rowindex` instead.\n */\nexport class RowPool {\n #slots = new Map<string, number>();\n #free: number[] = [];\n #size = 0;\n #pinned: string | undefined;\n\n /** Number of slots created so far: the most rows rendered at once. */\n get size(): number {\n return this.#size;\n }\n\n /** The row id whose slot is kept while it is out of range, if any. */\n get pinned(): string | undefined {\n return this.#pinned;\n }\n\n /**\n * Keeps one row's slot, and keeps it rendered, while it is outside the rendered\n * range. Used for the row holding focus. `undefined` releases it.\n */\n pin(id: string | undefined): void {\n this.#pinned = id;\n }\n\n /** The slot a row holds, or `undefined` when it isn't rendered. */\n slotOf(id: string): number | undefined {\n return this.#slots.get(id);\n }\n\n /**\n * Updates the pool for the rows that should be rendered and returns them, plus the\n * pinned row if it isn't among them, in slot order.\n */\n update(ids: Iterable<string>): PoolEntry[] {\n const keep = new Set(ids);\n if (this.#pinned !== undefined) keep.add(this.#pinned);\n\n for (const [id, slot] of this.#slots) {\n if (!keep.has(id)) {\n this.#slots.delete(id);\n this.#free.push(slot);\n }\n }\n for (const id of keep) {\n if (!this.#slots.has(id)) this.#slots.set(id, this.#free.pop() ?? this.#size++);\n }\n\n const entries: PoolEntry[] = [];\n for (const [id, slot] of this.#slots) entries.push({ id, slot });\n return entries.sort((a, b) => a.slot - b.slot);\n }\n\n /** Frees every slot, for example when the data is replaced. */\n clear(): void {\n this.#slots.clear();\n this.#free = [];\n this.#size = 0;\n this.#pinned = undefined;\n }\n}\n","/**\n * Maps the scroll position of a body that is too tall to render onto the rows.\n *\n * Engines limit an element's height (about 33.5M px in Chromium and WebKit, less\n * when zoomed; about 17.9M px in Firefox, which drops a taller element to 0). A\n * body taller than `cap` renders `cap` px tall, and the scroll position is scaled\n * linearly: the top of the physical scroll range is the first row, its bottom the\n * last. Offsets the virtualizer works with are logical (unscaled) px; the\n * scroller's `scrollTop` is physical. Under the cap the mapping is the identity.\n *\n * The scroll range is the scroller's: the body plus what scrolls with it (header,\n * pinned rows) minus the viewport, so pass the physical range,\n * `scrollHeight - clientHeight`. The logical range is longer by `excess`.\n */\nexport class ScrollScale {\n #logical = 0;\n #cap = Infinity;\n /** The logical offset last written and the physical offset it landed on. */\n #landed: { physical: number; logical: number } | undefined;\n\n /**\n * `logical`: the height of all body rows in px. `cap`: the tallest body the\n * engine renders. Returns whether anything changed.\n */\n configure(logical: number, cap: number): boolean {\n if (logical === this.#logical && cap === this.#cap) return false;\n this.#logical = logical;\n this.#cap = cap;\n this.#landed = undefined;\n return true;\n }\n\n /** Whether the body is taller than the cap, so offsets are scaled. */\n get scaled(): boolean {\n return this.#logical > this.#cap;\n }\n\n /** The body's rendered height in px. */\n get size(): number {\n return Math.min(this.#logical, this.#cap);\n }\n\n /** How much longer the logical scroll range is than the physical one. */\n get excess(): number {\n return this.#logical - this.size;\n }\n\n /** The logical offset for a physical one, given the physical scroll range. */\n toLogical(physical: number, range: number): number {\n if (!this.scaled || range <= 0) return physical;\n const landed = this.#landed;\n if (landed?.physical === physical) return landed.logical;\n return (clamp(physical, range) * (range + this.excess)) / range;\n }\n\n /** The physical offset for a logical one, given the physical scroll range. */\n toPhysical(logical: number, range: number): number {\n if (!this.scaled || range <= 0) return logical;\n const total = range + this.excess;\n return (clamp(logical, total) * range) / total;\n }\n\n /**\n * Records that a write of the logical offset `logical` left the scroller at\n * `physical` (read back, after the engine's rounding), so reading that physical\n * offset gives the exact logical one again. Without it a scaled offset could be\n * off by up to the scale ratio, and a row scrolled to the top would sit under\n * the header by a few px.\n */\n land(logical: number, physical: number): void {\n this.#landed = this.scaled ? { physical, logical } : undefined;\n }\n}\n\nconst clamp = (value: number, max: number) => Math.min(Math.max(value, 0), max);\n","/** The visible rows as the virtualizer reports them: indexes inclusive. */\nexport interface VisibleRange {\n startIndex: number;\n endIndex: number;\n overscan: number;\n count: number;\n}\n\n/**\n * The most rows of `rowHeight` px a view `viewHeight` px tall can show at once,\n * partly: one more than fit, when the view starts inside a row.\n */\nexport function maxVisibleRows(viewHeight: number, rowHeight: number): number {\n return viewHeight > 0 && rowHeight > 0 ? Math.ceil(viewHeight / rowHeight) + 1 : 0;\n}\n\n/**\n * The row indexes to render: the visible rows plus `overscan` on each side,\n * always the same number of rows (`maxVisible` plus twice the overscan, or all\n * rows when there are fewer). At either end the overscan that has no room goes to\n * the other side.\n *\n * The usual window is cut off at the ends instead: at the top it holds only the\n * overscan below, and the row pool grows by a row, its cells and their slots,\n * with every row scrolled until the overscan above is full. WebKit cancels a\n * wheel scroll's animation when slot assignment changes inside the scroller, so\n * from the top each wheel step moved a few px instead of a full step. A window of\n * one size fills the pool on the first render, and scrolling only reuses it.\n */\nexport function steadyWindow(\n { startIndex, endIndex, overscan, count }: VisibleRange,\n maxVisible: number,\n): number[] {\n const visible = Math.max(maxVisible, endIndex - startIndex + 1);\n const size = Math.min(count, visible + 2 * overscan);\n const first = Math.max(0, Math.min(startIndex - overscan, count - size));\n return Array.from({ length: size }, (_, i) => first + i);\n}\n","/** Whether a row's data is there: loaded, still to come, or its page failed. */\nexport type RowState = 'loaded' | 'loading' | 'error';\n\n/** A loaded row and its id. */\nexport interface CachedRow<TData> {\n id: string;\n row: TData;\n}\n\nexport interface PageCacheOptions<TData> {\n /** Rows per page, at least 1. */\n pageSize: number;\n /** Row id function, given the absolute index. Default: the index as a string. */\n getRowId?: ((row: TData, index: number) => string) | undefined;\n /** Row count to start with (carried over from a previous cache). Default: one page. */\n rowCount?: number;\n /** Whether `rowCount` is the real total. Default: `false`. */\n totalKnown?: boolean;\n}\n\n/**\n * Pages kept loaded on each side of the requested range; pages further away are\n * dropped, so memory stays bounded however far the table scrolls.\n */\nexport const KEEP_PAGES = 10;\n\n/**\n * The row cache behind `dataSource`: which pages are loaded, in flight or failed,\n * and how many rows the table has. Bookkeeping only: no timers and no fetching,\n * so the caller (the element's DataController) decides when to load.\n *\n * Without a known total, the row count stays one page past the last loaded row,\n * so the next page shows as skeletons and loads when it scrolls into view. A page\n * shorter than asked for marks the end.\n */\nexport class PageCache<TData> {\n readonly pageSize: number;\n readonly #getRowId: (row: TData, index: number) => string;\n readonly #pages = new Map<number, CachedRow<TData>[]>();\n /** In-flight pages and the `end` they asked for. */\n readonly #inFlight = new Map<number, number>();\n readonly #failed = new Set<number>();\n readonly #indexById = new Map<string, number>();\n #rowCount: number;\n #totalKnown: boolean;\n\n constructor(options: PageCacheOptions<TData>) {\n this.pageSize = Math.max(1, Math.floor(options.pageSize));\n this.#getRowId = options.getRowId ?? ((_row, index) => String(index));\n this.#rowCount = Math.max(0, Math.floor(options.rowCount ?? this.pageSize));\n this.#totalKnown = options.totalKnown ?? false;\n }\n\n /** Number of rows, loaded or not. */\n get rowCount(): number {\n return this.#rowCount;\n }\n\n /** `true` once the total is known (given by the server, or found from a short page). */\n get totalKnown(): boolean {\n return this.#totalKnown;\n }\n\n pageOf(index: number): number {\n return Math.floor(index / this.pageSize);\n }\n\n /** The loaded row at an index, with its id; `undefined` until its page has loaded. */\n entryAt(index: number): CachedRow<TData> | undefined {\n if (index < 0 || index >= this.#rowCount) return undefined;\n return this.#pages.get(this.pageOf(index))?.[index % this.pageSize];\n }\n\n /** The index of a loaded row's id, or `undefined`. */\n indexOf(rowId: string): number | undefined {\n return this.#indexById.get(rowId);\n }\n\n stateAt(index: number): RowState {\n if (this.entryAt(index)) return 'loaded';\n return this.#failed.has(this.pageOf(index)) ? 'error' : 'loading';\n }\n\n /** Pages touching the rows `start` to `end` (exclusive) that still need a request. */\n missingPages(start: number, end: number): number[] {\n const last = Math.min(end, this.#rowCount) - 1;\n const pages: number[] = [];\n if (last < 0) return pages;\n for (let page = this.pageOf(Math.max(0, start)); page <= this.pageOf(last); page++) {\n if (!this.#pages.has(page) && !this.#inFlight.has(page) && !this.#failed.has(page)) {\n pages.push(page);\n }\n }\n return pages;\n }\n\n /** Marks a page as in flight and returns the rows to ask for. */\n begin(page: number): { start: number; end: number } {\n const start = page * this.pageSize;\n let end = start + this.pageSize;\n if (this.#totalKnown) end = Math.min(end, this.#rowCount);\n this.#failed.delete(page);\n this.#inFlight.set(page, end);\n return { start, end };\n }\n\n /** Stores a page's rows and updates the row count. Ignored unless the page is in flight. */\n resolve(page: number, rows: readonly TData[], total?: number): boolean {\n const end = this.#inFlight.get(page);\n if (end === undefined) return false;\n this.#inFlight.delete(page);\n const start = page * this.pageSize;\n const asked = end - start;\n const entries = rows.slice(0, asked).map((row, i) => ({\n id: this.#getRowId(row, start + i),\n row,\n }));\n this.#drop(page);\n if (entries.length > 0) this.#pages.set(page, entries);\n entries.forEach((entry, i) => this.#indexById.set(entry.id, start + i));\n\n if (total !== undefined && Number.isFinite(total) && total >= 0) {\n this.#setCount(Math.floor(total), true);\n } else if (entries.length < asked) {\n this.#setCount(start + entries.length, true);\n } else if (!this.#totalKnown) {\n this.#setCount(Math.max(this.#rowCount, end + this.pageSize), false);\n }\n return true;\n }\n\n /** Marks an in-flight page as failed. Ignored unless the page is in flight. */\n fail(page: number): boolean {\n if (!this.#inFlight.delete(page)) return false;\n this.#failed.add(page);\n return true;\n }\n\n /** Lets a failed page be requested again. */\n retry(page: number): void {\n this.#failed.delete(page);\n }\n\n /** Forgets an in-flight page (its request was aborted), so it can be requested again. */\n cancel(page: number): void {\n this.#inFlight.delete(page);\n }\n\n /** `true` if a page failed and hasn't been retried or evicted since. */\n isFailed(page: number): boolean {\n return this.#failed.has(page);\n }\n\n /** In-flight pages entirely outside rows `start` to `end` (exclusive). */\n inFlightOutside(start: number, end: number): number[] {\n const first = this.pageOf(Math.max(0, start));\n const last = this.pageOf(Math.max(0, end - 1));\n return [...this.#inFlight.keys()].filter((page) => page < first || page > last);\n }\n\n /**\n * Drops loaded and failed pages more than `KEEP_PAGES` pages away from rows\n * `start` to `end` (exclusive). Failed pages that come back into view load again.\n */\n evictOutside(start: number, end: number): void {\n const first = this.pageOf(Math.max(0, start)) - KEEP_PAGES;\n const last = this.pageOf(Math.max(0, end - 1)) + KEEP_PAGES;\n for (const page of [...this.#pages.keys()]) {\n if (page < first || page > last) this.#drop(page);\n }\n for (const page of [...this.#failed]) {\n if (page < first || page > last) this.#failed.delete(page);\n }\n }\n\n /** Number of pages holding rows: bounded by eviction. */\n get loadedPages(): number {\n return this.#pages.size;\n }\n\n #setCount(count: number, known: boolean): void {\n this.#rowCount = count;\n this.#totalKnown = known;\n // Rows past the end are gone; drop pages that start there.\n for (const page of [...this.#pages.keys()]) {\n if (page * this.pageSize >= count) this.#drop(page);\n }\n }\n\n #drop(page: number): void {\n const entries = this.#pages.get(page);\n if (!entries) return;\n const start = page * this.pageSize;\n entries.forEach((entry, i) => {\n if (this.#indexById.get(entry.id) === start + i) this.#indexById.delete(entry.id);\n });\n this.#pages.delete(page);\n }\n}\n","let region: HTMLElement | undefined;\n\n/**\n * Says something to screen readers through a polite live region. The region\n * lives in the document body, not in the table: a grid may only own rows, so a\n * status element inside it would break the grid's structure. One region serves\n * every table on the page. It is visually hidden with inline styles, so page\n * CSS can't reveal it.\n */\nexport function announce(doc: Document, message: string): void {\n if (!region?.isConnected || region.ownerDocument !== doc) {\n region = doc.createElement('div');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.dataset.argusAnnouncer = '';\n region.style.cssText =\n 'position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap';\n doc.body.append(region);\n }\n const target = region;\n // A new text node each time, so the same message twice is still announced.\n target.textContent = '';\n setTimeout(() => {\n target.textContent = message;\n }, 50);\n}\n","import type { ColumnSizingState } from '@argus-table/core';\n\n/**\n * The width each column's content needs, in px, from the cells rendered now:\n * the header, the pinned rows and the rendered body rows. Rows that haven't\n * loaded are skipped (their skeleton bars say nothing about the content).\n *\n * Every cell of the columns gets `data-measure`, which sizes it to its\n * `max-content` (base styles), so the browser accounts for padding, the sort\n * indicator and whatever the content is. One forced layout, no paint: the\n * attribute is gone before the frame ends. A column with nothing laid out\n * (the table is hidden) is left out.\n */\nexport function measureColumns(root: ParentNode, ids: Iterable<string>): Map<string, number> {\n const wanted = new Set(ids);\n const widths = new Map<string, number>();\n if (wanted.size === 0) return widths;\n const cells = [...root.querySelectorAll<HTMLElement>('[data-col]')].filter(\n (cell) =>\n wanted.has(cell.dataset.col ?? '') && !cell.parentElement?.matches('[part~=\"row-loading\"]'),\n );\n for (const cell of cells) cell.setAttribute('data-measure', '');\n for (const cell of cells) {\n const id = cell.dataset.col ?? '';\n const px = Math.ceil(cell.getBoundingClientRect().width);\n if (px > 0 && px > (widths.get(id) ?? 0)) widths.set(id, px);\n }\n for (const cell of cells) cell.removeAttribute('data-measure');\n return widths;\n}\n\n/**\n * - `provisional`: measured without loaded body rows (the header and pinned rows only).\n * - `final`: measured with loaded rows; kept until the column goes away.\n * - `fonts`: measured while web fonts were loading; measured again once they are ready.\n */\ntype State = 'provisional' | 'final' | 'fonts';\n\n/**\n * Widths of `width: 'auto'` columns. A column measures once its first loaded\n * rows render, and before that fits the header and pinned rows. So each column\n * is measured at most twice (three times if fonts were still loading), and a\n * table that stays empty doesn't measure on every update. State is keyed by\n * column id, so new `columns` arrays with the same ids don't measure again.\n */\nexport class AutoWidths {\n /** Measured widths by column id; a new object whenever one changes. */\n widths: ColumnSizingState = {};\n readonly #state = new Map<string, State>();\n #fontsPending = false;\n readonly #requestUpdate: () => void;\n\n constructor(requestUpdate: () => void) {\n this.#requestUpdate = requestUpdate;\n }\n\n /** Forgets columns that are gone or no longer `'auto'`, given the ids of the auto columns. */\n sync(ids: Iterable<string>): void {\n const auto = new Set(ids);\n for (const id of this.#state.keys()) {\n if (!auto.has(id)) this.#state.delete(id);\n }\n const kept = Object.entries(this.widths).filter(([id]) => auto.has(id));\n if (kept.length !== Object.keys(this.widths).length) this.widths = Object.fromEntries(kept);\n }\n\n /**\n * Measures the auto columns that need it. Returns `true` if a width changed;\n * the caller then renders again (the one extra pass of the render cycle).\n */\n measure(\n root: ParentNode,\n columns: readonly { id: string; auto: boolean }[],\n hasLoadedRows: boolean,\n ): boolean {\n const due = columns\n .filter((c) => c.auto)\n .map((c) => c.id)\n .filter((id) => {\n const state = this.#state.get(id);\n return state === undefined || (state === 'provisional' && hasLoadedRows);\n });\n if (due.length === 0) return false;\n const measured = measureColumns(root, due);\n const fontsLoading = typeof document !== 'undefined' && document.fonts.status === 'loading';\n let next: ColumnSizingState | undefined;\n for (const [id, px] of measured) {\n this.#state.set(id, fontsLoading ? 'fonts' : hasLoadedRows ? 'final' : 'provisional');\n if (this.widths[id] !== px) (next ??= { ...this.widths })[id] = px;\n }\n if (fontsLoading && measured.size > 0) this.#remeasureAfterFonts();\n if (next) this.widths = next;\n return next !== undefined;\n }\n\n /** Once web fonts are ready, columns measured meanwhile measure again. */\n #remeasureAfterFonts(): void {\n if (this.#fontsPending) return;\n this.#fontsPending = true;\n void document.fonts.ready.then(() => {\n this.#fontsPending = false;\n let any = false;\n for (const [id, state] of this.#state) {\n if (state === 'fonts') {\n this.#state.delete(id);\n any = true;\n }\n }\n if (any) this.#requestUpdate();\n });\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { ArgusColumn, unwatchColumns, watchColumns } from '../argus-column.js';\nimport type { ColumnDef } from '../types.js';\n\n/**\n * Reads the host's `<argus-column>` children into `ColumnDef`s. The columns tell\n * the host when they change (`watchColumns`); the list is rebuilt only then, so\n * `defs` keeps its identity between changes.\n */\nexport class ColumnChildrenController<T> implements ReactiveController {\n readonly #host: ReactiveControllerHost & HTMLElement;\n #defs: readonly ColumnDef<T>[] = [];\n #dirty = true;\n\n constructor(host: ReactiveControllerHost & HTMLElement) {\n this.#host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n this.#dirty = true;\n watchColumns(this.#host, () => {\n this.#dirty = true;\n this.#host.requestUpdate();\n });\n }\n\n hostDisconnected(): void {\n unwatchColumns(this.#host);\n }\n\n /** Whether the host has any `<argus-column>` child. */\n get present(): boolean {\n return this.defs.length > 0;\n }\n\n /** The children's columns, in document order. */\n get defs(): readonly ColumnDef<T>[] {\n if (this.#dirty) {\n this.#dirty = false;\n this.#defs = [...this.#host.children]\n .filter((c): c is ArgusColumn<T> => c instanceof ArgusColumn)\n .map((c) => c.toColumnDef());\n }\n return this.#defs;\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport {\n PageCache,\n type DataSource,\n type LoadErrorDetail,\n type RowState,\n type SortState,\n} from '@argus-table/core';\n\n/** Rows per request when the data source sets no `pageSize`. */\nexport const DEFAULT_PAGE_SIZE = 100;\n\n/** Quiet time after the last range change before pages load, so fast scrolling loads only where it stops. */\nexport const LOAD_DEBOUNCE_MS = 50;\n\nexport interface DataConfig<T> {\n source: DataSource<T> | undefined;\n sorting: SortState;\n getRowId: ((row: T, index: number) => string) | undefined;\n}\n\n/**\n * Loads `dataSource` pages for the rendered rows (infinite loading). It owns the\n * page cache: a new source, sort order or row id function starts a fresh one, and\n * answers for an old cache are dropped. Requests wait until the range has been\n * quiet for `LOAD_DEBOUNCE_MS`; pages that scrolled away are aborted.\n */\nexport class DataController<T> implements ReactiveController {\n readonly #host: ReactiveControllerHost;\n #config: DataConfig<T> = { source: undefined, sorting: [], getRowId: undefined };\n #cache: PageCache<T> | undefined;\n readonly #requests = new Map<number, AbortController>();\n #range: { start: number; end: number } | undefined;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #errors: LoadErrorDetail[] = [];\n\n constructor(host: ReactiveControllerHost) {\n this.#host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n this.#abortAll();\n }\n\n hostConnected(): void {\n // Requests aborted on disconnect load again on the next range request.\n this.#range = undefined;\n }\n\n /** The page cache, while a data source is set: the model reads rows from it. */\n get rows(): PageCache<T> | undefined {\n return this.#cache;\n }\n\n /**\n * Takes the source, sort order and row id function. Any change starts a fresh\n * cache; a sort or row id change keeps the row count (the rows are the same).\n */\n configure(next: DataConfig<T>): void {\n const prev = this.#config;\n this.#config = next;\n if (!next.source) {\n this.#reset(undefined);\n return;\n }\n if (next.source !== prev.source || !this.#cache) {\n this.#reset({ rowCount: undefined, totalKnown: false });\n } else if (next.sorting !== prev.sorting || next.getRowId !== prev.getRowId) {\n this.#reset({ rowCount: this.#cache.rowCount, totalKnown: this.#cache.totalKnown });\n }\n }\n\n /** Drops every loaded page and loads the rendered ones again. The row count stays until pages answer. */\n refresh(): void {\n if (!this.#cache) return;\n this.#reset({ rowCount: this.#cache.rowCount, totalKnown: false });\n this.#host.requestUpdate();\n }\n\n stateAt(index: number): RowState {\n return this.#cache?.stateAt(index) ?? 'loaded';\n }\n\n /**\n * The rendered rows, `start` to `end` (exclusive). Loads what's missing once the\n * range has been quiet for a moment. Call after every update.\n */\n request(start: number, end: number): void {\n const cache = this.#cache;\n if (!cache) return;\n const prev = this.#range;\n const moved = prev?.start !== start || prev.end !== end;\n this.#range = { start, end };\n if (moved) {\n clearTimeout(this.#timer);\n } else if (this.#timer !== undefined || cache.missingPages(start, end).length === 0) {\n return;\n }\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n this.#load();\n }, LOAD_DEBOUNCE_MS);\n }\n\n /** Requests the failed page holding row `index` again (the Retry button, or Enter on a failed row). */\n retry(index: number): void {\n const cache = this.#cache;\n const page = cache?.pageOf(index);\n if (!cache || page === undefined || !cache.isFailed(page)) return;\n cache.retry(page);\n this.#range = undefined;\n this.#host.requestUpdate();\n }\n\n /** Load errors since the last call, to fire as `argus-load-error` after the update. */\n takeErrors(): LoadErrorDetail[] {\n const errors = this.#errors;\n this.#errors = [];\n return errors;\n }\n\n #reset(carry: { rowCount: number | undefined; totalKnown: boolean } | undefined): void {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n this.#abortAll();\n this.#range = undefined;\n this.#errors = [];\n const { source, getRowId } = this.#config;\n this.#cache =\n source && carry\n ? new PageCache<T>({\n pageSize: source.pageSize ?? DEFAULT_PAGE_SIZE,\n getRowId,\n rowCount: carry.rowCount,\n totalKnown: carry.totalKnown,\n })\n : undefined;\n }\n\n #abortAll(): void {\n for (const [page, controller] of this.#requests) {\n controller.abort();\n this.#cache?.cancel(page);\n }\n this.#requests.clear();\n }\n\n #load(): void {\n const cache = this.#cache;\n const range = this.#range;\n if (!cache || !range) return;\n // Keep a page of margin, so a small scroll back doesn't abort a page about to land.\n const margin = cache.pageSize;\n for (const page of cache.inFlightOutside(range.start - margin, range.end + margin)) {\n this.#requests.get(page)?.abort();\n this.#requests.delete(page);\n cache.cancel(page);\n }\n cache.evictOutside(range.start, range.end);\n for (const page of cache.missingPages(range.start, range.end)) this.#fetch(cache, page);\n }\n\n #fetch(cache: PageCache<T>, page: number): void {\n const source = this.#config.source;\n if (!source) return;\n const { start, end } = cache.begin(page);\n const controller = new AbortController();\n this.#requests.set(page, controller);\n const current = () => !controller.signal.aborted && cache === this.#cache;\n let pending: Promise<unknown>;\n try {\n pending = Promise.resolve(\n source.getRows({ start, end, sorting: this.#config.sorting, signal: controller.signal }),\n );\n } catch (error) {\n pending = Promise.reject(error instanceof Error ? error : new Error(String(error)));\n }\n pending\n .then((response) => {\n if (!current()) return;\n const { rows, total } = (response ?? {}) as { rows?: unknown; total?: unknown };\n if (!Array.isArray(rows)) {\n throw new TypeError('argus-table: getRows() must resolve to { rows: [], total? }.');\n }\n this.#requests.delete(page);\n cache.resolve(page, rows as T[], typeof total === 'number' ? total : undefined);\n this.#host.requestUpdate();\n })\n .catch((error: unknown) => {\n if (!current()) return;\n this.#requests.delete(page);\n cache.fail(page);\n this.#errors.push({ error, start, end });\n this.#host.requestUpdate();\n });\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\n/** How long after the last sideways scroll pinned cells stay sticky. */\nconst SETTLE_MS = 150;\n\n/**\n * Keeps pinned body cells in place without making them sticky while the table\n * only scrolls up and down.\n *\n * Safari gives every sticky element a compositing layer of its own and moves\n * each one on every scroll frame; with a sticky cell per pinned column per row\n * that is dozens of layers, and vertical scrolling stutters (ADR 0001, \"Pinned\n * columns in Safari\"). At rest, pinned body cells are plain cells shifted by the\n * horizontal scroll offset (`--_sx`, and `--_max-x` for the end side), which\n * only changes when the table scrolls sideways. While it does, the scroller\n * carries `data-hscroll` and the cells are sticky, so they don't lag behind\n * the scroll; once it settles they go back to the transform, at the same place.\n * It also sizes the pinned edges' shadow overlays (`.pin-shadow`) to the\n * scroller's visible area.\n */\nexport class PinScrollController implements ReactiveController {\n readonly #scroller: () => HTMLElement | null;\n #attached: HTMLElement | undefined;\n #left = 0;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #resize: ResizeObserver | undefined;\n\n constructor(host: ReactiveControllerHost, scroller: () => HTMLElement | null) {\n this.#scroller = scroller;\n host.addController(this);\n }\n\n hostConnected(): void {\n // After a move in the DOM; before the first render there is no scroller yet.\n this.#attach();\n }\n\n hostUpdated(): void {\n this.#attach();\n }\n\n hostDisconnected(): void {\n this.#attached?.removeEventListener('scroll', this.#onScroll);\n this.#resize?.disconnect();\n clearTimeout(this.#timer);\n this.#attached = undefined;\n }\n\n /** Re-reads how far the table scrolls sideways: call when column widths change. */\n measure(): void {\n const s = this.#attached;\n if (!s) return;\n s.style.setProperty('--_max-x', `${String(Math.max(0, s.scrollWidth - s.clientWidth))}px`);\n // The edge shadows sit over the scroller, clear of its scrollbars.\n for (const shadow of s.parentNode?.querySelectorAll<HTMLElement>(':scope > .pin-shadow') ??\n []) {\n shadow.style.setProperty('--_view-h', `${String(s.clientHeight)}px`);\n shadow.style.setProperty('--_sb-x', `${String(s.offsetWidth - s.clientWidth)}px`);\n }\n this.#left = s.scrollLeft;\n s.style.setProperty('--_sx', `${String(this.#left)}px`);\n }\n\n #attach(): void {\n const s = this.#scroller();\n if (!s || s === this.#attached) return;\n this.#attached = s;\n s.addEventListener('scroll', this.#onScroll, { passive: true });\n this.#resize ??= new ResizeObserver(() => {\n this.measure();\n });\n this.#resize.observe(s);\n this.measure();\n }\n\n readonly #onScroll = () => {\n const s = this.#attached;\n if (!s || s.scrollLeft === this.#left) return;\n this.#left = s.scrollLeft;\n s.toggleAttribute('data-hscroll', true);\n clearTimeout(this.#timer);\n this.#timer = setTimeout(() => {\n this.measure();\n s.removeAttribute('data-hscroll');\n }, SETTLE_MS);\n };\n}\n","/** Where a dragged column would land: its new position and the header that shows the drop line. */\nexport interface DropTarget {\n /** Position in the whole column order after the move, 0-based. */\n to: number;\n /** The header that draws the drop line. */\n columnId: string;\n /** The edge of that header the line is on, in logical terms. */\n edge: 'start' | 'end';\n}\n\n/** A header of the dragged column's group, in visual order. */\nexport interface DropSlot {\n id: string;\n /** Its position in the whole column order, 0-based. */\n index: number;\n rect: { left: number; right: number };\n}\n\n/**\n * The drop target for a pointer at `x`: the gap between headers nearest to it,\n * decided by each header's midpoint. `undefined` where the column would stay\n * put. `direction` is 1 in LTR and -1 in RTL, where the group runs right to left.\n */\nexport function dropTarget(\n slots: readonly DropSlot[],\n draggedId: string,\n x: number,\n direction: 1 | -1,\n): DropTarget | undefined {\n const from = slots.findIndex((s) => s.id === draggedId);\n const first = slots[0];\n const last = slots.at(-1);\n if (from < 0 || !first || !last) return undefined;\n // The gap before the first header whose middle is past the pointer, in reading order.\n let gap = slots.findIndex((s) => (x - (s.rect.left + s.rect.right) / 2) * direction < 0);\n if (gap < 0) gap = slots.length;\n if (gap === from || gap === from + 1) return undefined;\n const to = first.index + (gap > from ? gap - 1 : gap);\n const at = slots[gap];\n return at ? { to, columnId: at.id, edge: 'start' } : { to, columnId: last.id, edge: 'end' };\n}\n\nexport interface ReorderDragOptions {\n /** The scroll container: it scrolls while the pointer is near its edges. */\n scroller: HTMLElement;\n /** The drop target for a pointer at `x` (client coordinates). */\n targetAt: (x: number) => DropTarget | undefined;\n /**\n * Where the dragged column's group is visible, in client x, if it can scroll\n * (the scrolling columns). Near these edges the scroller scrolls with the drag.\n */\n scrollArea: () => { left: number; right: number } | undefined;\n onStart: () => void;\n /** The target changed (`undefined`: the column would stay put). */\n onTarget: (target: DropTarget | undefined) => void;\n /** The pointer was released over a target, or `undefined` when it would stay put. */\n onDrop: (target: DropTarget | undefined) => void;\n /** Escape, a cancelled pointer, or a release without a drag. */\n onCancel: () => void;\n}\n\n/** Movement before a press becomes a drag, so a click still sorts. */\nconst THRESHOLD = 4;\n/** Width of the band at the scroll area's edges that scrolls, and the top speed there. */\nconst EDGE = 40;\nconst MAX_SPEED = 16;\n\nconst INTERACTIVE = 'button,input,select,textarea,a[href],label,[contenteditable]';\n\n/**\n * Whether a press on a header may start a reorder drag: the primary button of a\n * mouse or pen (a touch pans the table instead), not on a resize handle, and not\n * in interactive content slotted into the header.\n */\nexport function canStartReorder(down: PointerEvent, cell: HTMLElement): boolean {\n if (down.button !== 0 || down.pointerType === 'touch') return false;\n for (const target of down.composedPath()) {\n if (target === cell) return true;\n if (!(target instanceof Element)) continue;\n if (target instanceof HTMLElement && target.dataset.resizeCol !== undefined) return false;\n if (target.matches(INTERACTIVE)) return false;\n }\n return false;\n}\n\n/**\n * One pointer drag of a column header. It becomes a drag after a few pixels of\n * movement; until then the press is a click. While dragging, the pointer is\n * captured by the header, the target follows the pointer once per frame, and the\n * scroll area scrolls near its edges. Escape cancels. The click that ends a drag\n * is swallowed, so it neither sorts nor counts as a cell click.\n */\nexport function startReorderDrag(\n cell: HTMLElement,\n down: PointerEvent,\n options: ReorderDragOptions,\n): void {\n const view = cell.ownerDocument.defaultView ?? window;\n const startX = down.clientX;\n const startY = down.clientY;\n let x = startX;\n let dragging = false;\n let frame = 0;\n let target: DropTarget | undefined;\n\n const same = (a: DropTarget | undefined, b: DropTarget | undefined) =>\n a?.to === b?.to && a?.columnId === b?.columnId && a?.edge === b?.edge;\n\n const tick = () => {\n frame = 0;\n if (!dragging) return;\n const area = options.scrollArea();\n if (area) {\n const speed =\n x < area.left + EDGE\n ? -Math.min(1, (area.left + EDGE - x) / EDGE)\n : x > area.right - EDGE\n ? Math.min(1, (x - (area.right - EDGE)) / EDGE)\n : 0;\n // A visual delta: scrollLeft runs the same way in LTR and RTL.\n if (speed !== 0) options.scroller.scrollLeft += Math.round(speed * MAX_SPEED);\n // Targets past the visible part would be hidden under pinned columns.\n x = Math.min(Math.max(x, area.left), area.right);\n }\n const next = options.targetAt(x);\n if (!same(next, target)) {\n target = next;\n options.onTarget(target);\n }\n // Keep running while dragging: the view may still be scrolling.\n frame = view.requestAnimationFrame(tick);\n };\n\n const listeners = new AbortController();\n const cleanup = (event?: PointerEvent) => {\n if (frame) view.cancelAnimationFrame(frame);\n frame = 0;\n listeners.abort();\n if (event && cell.hasPointerCapture(event.pointerId)) {\n cell.releasePointerCapture(event.pointerId);\n }\n };\n\n const move = (event: PointerEvent) => {\n if (event.pointerId !== down.pointerId) return;\n x = event.clientX;\n if (!dragging) {\n if (Math.hypot(x - startX, event.clientY - startY) < THRESHOLD) return;\n dragging = true;\n try {\n cell.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic pointers can't be captured; the window listeners still see the moves.\n }\n options.onStart();\n }\n // No text selection while dragging.\n event.preventDefault();\n frame ||= view.requestAnimationFrame(tick);\n };\n\n const up = (event: PointerEvent) => {\n if (event.pointerId !== down.pointerId) return;\n cleanup(event);\n if (!dragging) return;\n x = event.clientX;\n const area = options.scrollArea();\n if (area) x = Math.min(Math.max(x, area.left), area.right);\n swallowClick(view);\n options.onDrop(options.targetAt(x));\n };\n\n const cancel = (event: PointerEvent) => {\n if (event.pointerId !== down.pointerId) return;\n cleanup(event);\n if (dragging) options.onCancel();\n };\n\n const key = (event: KeyboardEvent) => {\n if (!dragging || event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n cleanup();\n // The pointer is still down: its release must not count as a click.\n swallowClick(view, false);\n options.onCancel();\n };\n\n const listen = { capture: true, signal: listeners.signal };\n view.addEventListener('pointermove', move, listen);\n view.addEventListener('pointerup', up, listen);\n view.addEventListener('pointercancel', cancel, listen);\n view.addEventListener('keydown', key, listen);\n}\n\n/**\n * Stops the click that follows the release of a drag, if one comes. It comes in\n * the same task as the release, so the guard goes once that task is over. After\n * Escape the pointer is still down (`released: false`): the guard waits for its release.\n */\nfunction swallowClick(view: Window, released = true): void {\n const stop = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n const remove = () => {\n setTimeout(() => {\n view.removeEventListener('click', stop, { capture: true });\n });\n };\n view.addEventListener('click', stop, { capture: true, once: true });\n if (released) remove();\n else view.addEventListener('pointerup', remove, { capture: true, once: true });\n}\n","/**\n * One pointer drag on a resize handle. The pointer is captured, so the drag keeps\n * working outside the handle, and moves are batched to one `onWidth` call per\n * animation frame (TanStack's `onChange` mode: the width updates while dragging).\n *\n * `direction` is 1 in LTR and -1 in RTL: the handle sits on the inline-end edge,\n * so moving toward the inline end always grows the column.\n */\nexport function startResizeDrag(\n handle: HTMLElement,\n down: PointerEvent,\n startWidth: number,\n direction: 1 | -1,\n onWidth: (width: number) => void,\n): void {\n const startX = down.clientX;\n let frame = 0;\n let pending: number | undefined;\n\n const flush = () => {\n frame = 0;\n if (pending !== undefined) onWidth(pending);\n pending = undefined;\n };\n // A press and release without moving (or the clicks of a double-click) changes nothing.\n let moved = false;\n const move = (event: PointerEvent) => {\n moved ||= event.clientX !== startX;\n if (!moved) return;\n pending = startWidth + (event.clientX - startX) * direction;\n frame ||= requestAnimationFrame(flush);\n };\n const end = (event: PointerEvent) => {\n if (event.type === 'pointerup') move(event);\n if (frame) cancelAnimationFrame(frame);\n flush();\n handle.removeAttribute('data-active');\n handle.removeEventListener('pointermove', move);\n handle.removeEventListener('pointerup', end);\n handle.removeEventListener('pointercancel', end);\n if (handle.hasPointerCapture(event.pointerId)) handle.releasePointerCapture(event.pointerId);\n };\n\n down.preventDefault();\n try {\n handle.setPointerCapture(down.pointerId);\n } catch {\n // Synthetic or already released pointers can't be captured; moves on the handle still work.\n }\n handle.setAttribute('data-active', '');\n handle.addEventListener('pointermove', move);\n handle.addEventListener('pointerup', end);\n handle.addEventListener('pointercancel', end);\n}\n","import { createTableModel, type TableModel, type TableModelOptions } from '@argus-table/core';\nimport type { CellContent } from '../types.js';\n\n/**\n * Owns the table model (core's TanStack adapter). The element pushes its\n * properties in from `willUpdate`; render functions read `model`. It needs no\n * lifecycle hooks yet: the model is pull-based and owns no state.\n */\nexport class TableController<T> {\n readonly model: TableModel<T, CellContent>;\n\n constructor() {\n this.model = createTableModel<T, CellContent>({\n columns: [],\n data: [],\n getRowId: undefined,\n sorting: [],\n columnSizing: {},\n columnOrder: [],\n });\n }\n\n update(options: Partial<TableModelOptions<T, CellContent>>): void {\n this.model.update(options);\n }\n}\n","function getMeasurementKey(item) {\n return typeof item === \"object\" ? item.key : item;\n}\nfunction createLazyMeasurementsView(cache, flat) {\n const count = cache.length;\n return new Proxy(cache, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\") {\n const c = prop.charCodeAt(0);\n if (c >= 48 && c <= 57) {\n const i = +prop;\n if (Number.isInteger(i) && i >= 0 && i < count) {\n let v = target[i];\n if (typeof v !== \"object\") {\n const s = flat[i * 2];\n v = target[i] = {\n index: i,\n key: v,\n start: s,\n size: flat[i * 2 + 1],\n end: s + flat[i * 2 + 1],\n lane: 0\n };\n }\n return v;\n }\n }\n if (prop === \"length\") return count;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nexport {\n createLazyMeasurementsView,\n getMeasurementKey\n};\n//# sourceMappingURL=lazy-measurements.js.map\n","function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n let isInitial = true;\n function memoizedFunction() {\n var _a;\n const debugEnabled = process.env.NODE_ENV !== \"production\" && !!opts.key && !!((_a = opts.debug) == null ? void 0 : _a.call(opts));\n let depTime = 0;\n if (debugEnabled) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime = 0;\n if (debugEnabled) resultTime = Date.now();\n result = fn(...newDeps);\n if (debugEnabled) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result);\n }\n isInitial = false;\n return result;\n }\n memoizedFunction.updateDeps = (newDeps) => {\n deps = newDeps;\n };\n return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return Object.assign(\n function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n },\n {\n // The handle is closure-local, so a caller that has already\n // unsubscribed has no way to stop a queued call. Teardown paths use\n // this to drop the pending invocation instead of letting it land.\n cancel: () => {\n targetWindow.clearTimeout(timeoutId);\n }\n }\n );\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { approxEqual } from \"./utils.js\";\nfunction classifyScrollEvent({\n offset,\n isScrolling,\n elementMax,\n holdOffset,\n scrollOffset,\n pendingWrite,\n clampedMaxAtWrite\n}) {\n var _a;\n if (isScrolling && pendingWrite === null && offset === scrollOffset) {\n return \"spurious\";\n }\n if (pendingWrite !== null && Math.abs(offset - pendingWrite.target) < 1.5) {\n return \"readBack\";\n }\n if (pendingWrite !== null && !pendingWrite.smooth && elementMax !== null && pendingWrite.target > elementMax + holdOffset + 0.5 && Math.abs(offset - (elementMax + holdOffset)) < 1.5) {\n return \"clampedReadBack\";\n }\n if (pendingWrite !== null && !pendingWrite.smooth && ((_a = pendingWrite.lowMaxes) == null ? void 0 : _a.some((max) => Math.abs(offset - max) < 1.5))) {\n return \"clampedReadBack\";\n }\n if (clampedMaxAtWrite !== null && Math.abs(offset - clampedMaxAtWrite) < 1.5) {\n return \"clampedEcho\";\n }\n return \"external\";\n}\nconst isAnimating = (phase) => phase === \"smooth\" || phase === \"smoothFinishing\";\nfunction externalRetiresCommand({\n kind,\n offset,\n command,\n target\n}) {\n return kind !== \"spurious\" && kind !== \"readBack\" && // Our own write, clamped (`clampedReadBack`, #1310): the command is not\n // retired by it, and reconcile retargets below the new max.\n kind !== \"clampedReadBack\" && (command == null ? void 0 : command.index) != null && // Nothing has been written for a command waiting for the tail; these\n // are the fling's events.\n command.phase !== \"queued\" && // A non-smooth write lands at once, so any other scroll event is the\n // user's, even before reconcile saw the target reached (the target may\n // keep moving, or iOS ignored the write under a finger). A write the\n // browser clamped because the sizer hasn't grown yet reads back at the\n // max, which is also where the fresh target clamps, so the check below\n // keeps it reconciling (#1294). While a smooth scroll's animation may\n // still report, its events look like a user's, so it yields only once it\n // has landed.\n !isAnimating(command.phase) && !approxEqual(offset, command.lastTargetOffset) && !approxEqual(offset, target()) && // A compensation write's clamped echo (#1258) keeps the command. The\n // order is deliberate, not tidiness: this clause stays after `target()`\n // (and `clampedReadBack` before it) because `target()` can rebuild the\n // measurements, so it must run for exactly the events it always did.\n kind !== \"clampedEcho\";\n}\nconst FLING_WINDOW_MS = 40;\nfunction flingSpedUp(samples) {\n const last = samples[samples.length - 1];\n if (last === void 0) return false;\n let j = samples.length - 2;\n while (j >= 0 && last.t - samples[j].t < FLING_WINDOW_MS) j--;\n if (j < 0) return false;\n const mid = samples[j];\n let k = j - 1;\n while (k >= 0 && mid.t - samples[k].t < FLING_WINDOW_MS) k--;\n if (k < 0) return false;\n const first = samples[k];\n const recent = (last.offset - mid.offset) / (last.t - mid.t);\n const before = (mid.offset - first.offset) / (mid.t - first.t);\n return recent * before >= 0 && Math.abs(recent) >= 2 * Math.abs(before) && Math.abs(recent) - Math.abs(before) >= 0.8;\n}\nfunction flingCaught(samples) {\n const last = samples[samples.length - 1];\n if (last === void 0) return false;\n let j = samples.length - 2;\n while (j >= 0 && last.t - samples[j].t < FLING_WINDOW_MS) j--;\n if (j < 0) return false;\n const from = samples[j];\n return Math.abs(last.offset - from.offset) / (last.t - from.t) >= 0.05;\n}\nexport {\n classifyScrollEvent,\n externalRetiresCommand,\n flingCaught,\n flingSpedUp\n};\n//# sourceMappingURL=scroll-classifier.js.map\n","let _isIOSResult;\nconst isIOSWebKit = () => {\n if (_isIOSResult !== void 0) return _isIOSResult;\n if (typeof navigator === \"undefined\") return _isIOSResult = false;\n if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;\n const mtp = navigator.maxTouchPoints;\n return _isIOSResult = navigator.platform === \"MacIntel\" && mtp !== void 0 && mtp > 0;\n};\nlet _iosMomentumOverridesWritesResult;\nconst iosMomentumOverridesWrites = () => {\n if (_iosMomentumOverridesWritesResult !== void 0) {\n return _iosMomentumOverridesWritesResult;\n }\n return _iosMomentumOverridesWritesResult = isIOSWebKit() && typeof CSS !== \"undefined\" && typeof CSS.supports === \"function\" && CSS.supports(\"overflow-anchor: auto\");\n};\nconst momentumOverridesWrites = () => !isIOSWebKit() || iosMomentumOverridesWrites();\nconst _resetIOSDetectionForTests = () => {\n _isIOSResult = void 0;\n _iosMomentumOverridesWritesResult = void 0;\n};\nconst touchListenerOptions = {\n capture: true,\n passive: true\n};\nclass IosGesture {\n constructor(host) {\n this.host = host;\n this._touch = null;\n this.inMotion = () => this._touch !== null && this._touch.phase !== \"lateFling\";\n this.dragging = () => {\n var _a;\n return ((_a = this._touch) == null ? void 0 : _a.phase) === \"down\" && this._touch.moved;\n };\n this.tail = () => {\n var _a;\n return ((_a = this._touch) == null ? void 0 : _a.phase) === \"tail\" ? this._touch.moved ? \"fling\" : \"tap\" : null;\n };\n this.onScroll = ({\n isScrolling,\n ownReadBack,\n moved,\n external\n }) => {\n var _a, _b, _c;\n if (isScrolling && ((_a = this._touch) == null ? void 0 : _a.phase) === \"tail\") {\n this._openTail(this._touch.moved || !ownReadBack, false);\n } else if (((_b = this._touch) == null ? void 0 : _b.phase) === \"lateFling\") {\n if (this.host.now() > this._touch.until) {\n this._touch = null;\n } else if (external && isScrolling && moved) {\n this._openTail(true, false);\n }\n }\n if (!ownReadBack && isScrolling && moved && ((_c = this._touch) == null ? void 0 : _c.phase) === \"down\") {\n this._touch.moved = true;\n return true;\n }\n return false;\n };\n this.touchStart = () => {\n this.end();\n this._touch = { phase: \"down\", moved: false };\n };\n this.touchEnd = () => {\n var _a;\n const moved = ((_a = this._touch) == null ? void 0 : _a.phase) === \"down\" && this._touch.moved;\n this.end();\n this._openTail(moved, moved);\n };\n this.end = () => {\n var _a;\n const win = this.host.getWindow();\n if (((_a = this._touch) == null ? void 0 : _a.phase) === \"tail\" && win != null) {\n win.clearTimeout(this._touch.timerId);\n }\n this._touch = null;\n };\n this.listen = (target) => {\n const onTouchStart = () => this.touchStart();\n const onTouchEnd = () => this.touchEnd();\n target.addEventListener(\"touchstart\", onTouchStart, touchListenerOptions);\n target.addEventListener(\"touchend\", onTouchEnd, touchListenerOptions);\n target.addEventListener(\"touchcancel\", onTouchEnd, touchListenerOptions);\n return () => {\n target.removeEventListener(\n \"touchstart\",\n onTouchStart,\n touchListenerOptions\n );\n target.removeEventListener(\"touchend\", onTouchEnd, touchListenerOptions);\n target.removeEventListener(\n \"touchcancel\",\n onTouchEnd,\n touchListenerOptions\n );\n this.end();\n };\n };\n this._openTail = (moved, awaitingFling) => {\n const win = this.host.getWindow();\n if (win == null) return;\n this.end();\n const tail = {\n phase: \"tail\",\n moved,\n awaitingFling,\n // Only fires while this tail is current: `end` clears it otherwise.\n timerId: win.setTimeout(() => {\n if (this.host.tailStillMoving()) {\n this._openTail(tail.moved, tail.awaitingFling);\n return;\n }\n this._touch = tail.awaitingFling ? { phase: \"lateFling\", until: this.host.now() + 1e3 } : null;\n this.host.onTailClosed();\n }, 150)\n };\n this._touch = tail;\n };\n }\n get touch() {\n return this._touch;\n }\n}\nexport {\n IosGesture,\n _resetIOSDetectionForTests,\n iosMomentumOverridesWrites,\n isIOSWebKit,\n momentumOverridesWrites\n};\n//# sourceMappingURL=ios-gesture.js.map\n","import { createLazyMeasurementsView, getMeasurementKey } from \"./lazy-measurements.js\";\nimport { memo, approxEqual, notUndefined, debounce } from \"./utils.js\";\nimport { flingCaught, externalRetiresCommand, flingSpedUp, classifyScrollEvent } from \"./scroll-classifier.js\";\nimport { IosGesture, isIOSWebKit, momentumOverridesWrites } from \"./ios-gesture.js\";\nimport { _resetIOSDetectionForTests } from \"./ios-gesture.js\";\nconst getRect = (element) => {\n const { clientWidth, clientHeight } = element;\n return { width: clientWidth, height: clientHeight };\n};\nconst createFrameQueue = (targetWindow) => {\n const ids = /* @__PURE__ */ new Set();\n return {\n schedule: (fn) => {\n const id = targetWindow.requestAnimationFrame(() => {\n ids.delete(id);\n fn();\n });\n ids.add(id);\n },\n cancel: () => {\n ids.forEach((id) => targetWindow.cancelAnimationFrame(id));\n ids.clear();\n }\n };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const overscan = range.overscan * Math.max(range.lanes ?? 1, 1);\n const start = Math.max(range.startIndex - overscan, 0);\n const end = Math.min(range.endIndex + overscan, range.count - 1);\n const len = end - start + 1;\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = start + i;\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(getRect(element));\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const frames = createFrameQueue(targetWindow);\n const observer = new targetWindow.ResizeObserver(() => {\n const run = () => {\n handler(getRect(element));\n };\n instance.options.useAnimationFrameWithResizeObserver ? frames.schedule(run) : run();\n });\n observer.observe(element, { box: \"content-box\" });\n return () => {\n observer.unobserve(element);\n frames.cancel();\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeOffset = (instance, cb, readOffset) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n let offset = 0;\n const fallback = registerScrollendEvent ? null : debounce(\n targetWindow,\n () => cb(readOffset(element), false),\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = readOffset(element);\n fallback == null ? void 0 : fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n fallback == null ? void 0 : fallback.cancel();\n };\n};\nconst observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {\n const { horizontal, isRtl } = instance.options;\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n});\nconst observeWindowOffset = (instance, cb) => observeOffset(\n instance,\n cb,\n (win) => instance.options.horizontal ? win.scrollX : win.scrollY\n);\nconst measureElement = (element, entry, instance) => {\n if (instance.options.useCachedMeasurements) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n return instance.itemSizeCache.get(key) ?? instance.options.estimateSize(index);\n }\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n if (!entry) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n const cachedSize = instance.itemSizeCache.get(key);\n if (cachedSize !== void 0) {\n return cachedSize;\n }\n }\n return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst scrollWithAdjustments = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a;\n const { scrollElement, options } = instance;\n const adjustedOffset = offset + adjustments;\n const isRtlElement = options.horizontal && options.isRtl && scrollElement !== null && \"ownerDocument\" in scrollElement;\n (_a = scrollElement == null ? void 0 : scrollElement.scrollTo) == null ? void 0 : _a.call(scrollElement, {\n [options.horizontal ? \"left\" : \"top\"]: isRtlElement ? -adjustedOffset : adjustedOffset,\n behavior\n });\n};\nconst windowScroll = scrollWithAdjustments;\nconst elementScroll = scrollWithAdjustments;\nconst initialScrollPhase = (behavior, atTarget) => behavior === \"smooth\" ? atTarget ? \"smoothLanded\" : \"smooth\" : \"instant\";\nconst isSmoothScroll = (state) => (state == null ? void 0 : state.phase) === \"smooth\" || (state == null ? void 0 : state.phase) === \"smoothLanded\";\nfunction isAppendWithTrim(prevCount, nextCount, getPreviousKey, getNextKey) {\n if (nextCount === 0) return false;\n const firstKey = getNextKey(0);\n const removedKeys = /* @__PURE__ */ new Set();\n let removedCount = 0;\n while (removedCount < prevCount) {\n const key = getPreviousKey(removedCount);\n if (key === firstKey) break;\n removedKeys.add(key);\n removedCount++;\n }\n const retainedCount = prevCount - removedCount;\n if (retainedCount === 0 || retainedCount >= nextCount) return false;\n for (let i = 0; i < retainedCount; i++) {\n if (getNextKey(i) !== getPreviousKey(removedCount + i)) return false;\n }\n for (let i = retainedCount; i < nextCount; i++) {\n if (removedKeys.has(getNextKey(i))) return false;\n }\n return true;\n}\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.scrollState = null;\n this.measurementsCache = [];\n this._singleLaneMeasurements = null;\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.itemSizeCacheVersion = 0;\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.pendingMin = null;\n this.prevLanes = void 0;\n this.lanesChangedFlag = false;\n this.lanesSettling = false;\n this.pendingScrollAnchor = null;\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this._holdOffset = 0;\n this._reportedOverscroll = false;\n this._iosGesture = new IosGesture({\n getWindow: () => this.targetWindow,\n now: () => this.now(),\n // The end of a fling can move less than a pixel per scroll event, so\n // events can stop for 150ms while the fling is still running (seen on\n // an iPhone, 27.0.1). A command waiting for it would then be written\n // into the fling and overridden. The element having moved since the\n // last event means it has not ended: wait again. Not while our own\n // write has yet to report: that moved it.\n tailStillMoving: () => {\n const state = this.scrollState;\n if ((state == null ? void 0 : state.phase) !== \"queued\" || this.pendingWrite !== null) {\n return false;\n }\n const now = this._readElementOffset();\n if (now === null || this._lastElementOffset === null || Math.abs(now - this._lastElementOffset) < 1) {\n return false;\n }\n this._lastElementOffset = now;\n state.samples = [...state.samples ?? [], { t: this.now(), offset: now }];\n return true;\n },\n onTailClosed: () => {\n const state = this.scrollState;\n if ((state == null ? void 0 : state.phase) === \"queued\" && flingCaught(state.samples ?? [])) {\n this.scrollState = null;\n }\n this._flushHoldIfReady(true);\n this._writeAwaitingCommand();\n this._retryClampedAdjustment();\n }\n });\n this._lastElementOffset = null;\n this.pendingWrite = null;\n this._clampedAdjustment = null;\n this.elementsCache = /* @__PURE__ */ new Map();\n this._resizeBatch = null;\n this.now = () => {\n var _a, _b, _c;\n return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();\n };\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n let _frames = null;\n let delivering = false;\n let observeQueued = false;\n const pendingObservations = /* @__PURE__ */ new Set();\n const get = () => {\n if (_ro) {\n return _ro;\n }\n const targetWindow = this.targetWindow;\n if (!targetWindow || !targetWindow.ResizeObserver) {\n return null;\n }\n const frames = _frames = createFrameQueue(targetWindow);\n return _ro = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const batch = { sync: false };\n this._resizeBatch = batch;\n try {\n entries.forEach(measureEntry);\n } finally {\n this._resizeBatch = null;\n if (batch.notify) {\n this.notify(batch.sync);\n this._noteClampMax();\n this._flushHoldIfReady(true);\n this._retryClampedAdjustment();\n this.measureElement(null);\n }\n }\n };\n if (this.options.useAnimationFrameWithResizeObserver) {\n frames.schedule(run);\n } else {\n delivering = true;\n try {\n run();\n } finally {\n delivering = false;\n }\n }\n });\n };\n const measureEntry = (entry) => {\n const node = entry.target;\n const index = this.indexFromElement(node);\n if (!node.isConnected) {\n this.observer.unobserve(node);\n for (const [cacheKey, cachedNode] of this.elementsCache) {\n if (cachedNode === node) {\n this.elementsCache.delete(cacheKey);\n break;\n }\n }\n return;\n }\n if (!this.isIndexInRange(index)) return;\n if (this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, entry, this));\n }\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _frames == null ? void 0 : _frames.cancel();\n pendingObservations.clear();\n observeQueued = false;\n _ro = null;\n _frames = null;\n },\n observe: (target) => {\n const observer = get();\n if (!observer) return;\n if (!delivering) {\n observer.observe(target, { box: \"border-box\" });\n return;\n }\n pendingObservations.add(target);\n if (!observeQueued) {\n observeQueued = true;\n _frames == null ? void 0 : _frames.schedule(() => {\n observeQueued = false;\n pendingObservations.forEach((node) => {\n if (node.isConnected) _ro == null ? void 0 : _ro.observe(node, { box: \"border-box\" });\n });\n pendingObservations.clear();\n });\n }\n },\n unobserve: (target) => {\n var _a;\n pendingObservations.delete(target);\n (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n var _a;\n const merged = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n anchorTo: \"start\",\n followOnAppend: false,\n scrollEndThreshold: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n laneAssignmentMode: \"estimate\",\n useCachedMeasurements: false\n };\n for (const key in opts2) {\n const v = opts2[key];\n if (v !== void 0) merged[key] = v;\n }\n const prevOptions = this.options;\n let anchor = null;\n let followOnAppend = null;\n let edgeKeysChanged = false;\n if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === \"end\" && this.scrollElement !== null) {\n const prevCount = prevOptions.count;\n const nextCount = merged.count;\n const measurements = this.getMeasurements();\n const previousItems = ((_a = this._singleLaneMeasurements) == null ? void 0 : _a.items) ?? measurements;\n const getPreviousKey = (index) => getMeasurementKey(previousItems[index]);\n const prevFirstKey = prevCount > 0 ? getPreviousKey(0) : null;\n const prevLastKey = prevCount > 0 ? getPreviousKey(prevCount - 1) : null;\n const didCountChange = nextCount !== prevCount;\n const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);\n if (didEdgeKeysChange) {\n edgeKeysChanged = true;\n const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;\n if (item) {\n anchor = [item.key, this.getScrollOffset() - item.start];\n }\n const behavior = merged.followOnAppend === true ? \"auto\" : merged.followOnAppend || null;\n if (behavior && nextCount > 0 && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {\n if (nextCount > prevCount || isAppendWithTrim(\n prevCount,\n nextCount,\n getPreviousKey,\n merged.getItemKey\n )) {\n followOnAppend = behavior;\n }\n }\n }\n }\n this.options = merged;\n if (edgeKeysChanged) {\n this.pendingMin = 0;\n this.itemSizeCacheVersion++;\n }\n let anchorDelta = null;\n if (anchor && this.scrollOffset !== null && !this._awaitingCommandReadBack()) {\n const [anchorKey, anchorOffset] = anchor;\n const newMeasurements = this.getMeasurements();\n const { count, getItemKey } = this.options;\n let idx = 0;\n while (idx < count && getItemKey(idx) !== anchorKey) {\n idx++;\n }\n if (idx < count) {\n const anchorItem = newMeasurements[idx];\n if (anchorItem) {\n const newOffset = Math.max(0, anchorItem.start + anchorOffset);\n if (!followOnAppend && newOffset !== this.scrollOffset) {\n anchorDelta = newOffset - this.scrollOffset;\n this.scrollOffset = newOffset;\n }\n }\n }\n }\n if (followOnAppend) {\n this.pendingScrollAnchor = { kind: \"follow\", behavior: followOnAppend };\n } else if (anchorDelta !== null) {\n if (this._canWriteScroll()) {\n this.pendingScrollAnchor = { kind: \"anchor\", delta: anchorDelta };\n } else {\n this._holdOffset += anchorDelta;\n this._followOffsetTarget(anchorDelta);\n }\n }\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n var _a;\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n (_a = this._momentumStop) == null ? void 0 : _a.restore();\n this._momentumStop = null;\n this.isScrolling = false;\n this.scrollDirection = null;\n this._holdOffset = 0;\n this._reportedOverscroll = false;\n this._clampedAdjustment = null;\n this.pendingWrite = null;\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n var _a2, _b, _c, _d;\n const elementMax = isScrolling ? this._elementMaxScrollOffset() : null;\n const wasOverscrolled = this._reportedOverscroll;\n this._reportedOverscroll = offset < 0 || elementMax !== null && offset > elementMax + 1;\n const elementOffset = offset;\n this._lastElementOffset = elementOffset;\n offset = this._toLayoutOffset(offset);\n const kind = this._classifyScrollEvent(\n offset,\n isScrolling,\n elementMax\n );\n if (kind === \"spurious\") return;\n if (kind === \"readBack\") {\n offset = this.pendingWrite.target;\n } else if (kind === \"clampedReadBack\" && ((_a2 = this.scrollState) == null ? void 0 : _a2.index) != null && // Not `elementMax`: an adapter can report the read-back at rest.\n offset < this.getMaxScrollOffset() - 1.5) {\n this.scrollState.lastTargetOffset = offset;\n } else if (externalRetiresCommand({\n kind,\n offset,\n command: this.scrollState,\n target: () => this.getScrollStateTarget(this.scrollState)\n })) {\n this.scrollState = null;\n }\n this.pendingWrite = null;\n if (this._clampedAdjustment !== null && Math.abs(offset - this._clampedAdjustment.maxAtWrite) >= 1.5) {\n this._clampedAdjustment = null;\n }\n const prevOffset = this.getScrollOffset();\n const prevDirection = this.scrollDirection;\n this.scrollDirection = isScrolling ? prevOffset === offset ? this.scrollDirection : prevOffset < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n const queued = this.scrollState;\n if ((queued == null ? void 0 : queued.phase) === \"queued\" && kind === \"external\" && isScrolling) {\n if (wasOverscrolled || this._reportedOverscroll) {\n queued.samples = [];\n } else {\n const t = this.now();\n queued.samples = [\n ...(queued.samples ?? []).filter(\n (sample) => t - sample.t <= 200\n ),\n { t, offset: elementOffset }\n ];\n if (prevDirection !== null && this.scrollDirection !== prevDirection || flingSpedUp(queued.samples)) {\n this.scrollState = null;\n }\n }\n }\n if (this._iosGesture.onScroll({\n isScrolling,\n ownReadBack: kind === \"readBack\",\n moved: offset !== prevOffset,\n // Neither our write's read-back nor a frame of our smooth\n // animation: the user or a fling moved it.\n external: kind === \"external\" && ((_b = this.scrollState) == null ? void 0 : _b.phase) !== \"smooth\" && ((_c = this.scrollState) == null ? void 0 : _c.phase) !== \"smoothFinishing\"\n }) && // The user scrolls: a command still waiting for the tail is\n // theirs to override, like a written one would be.\n ((_d = this.scrollState) == null ? void 0 : _d.phase) === \"queued\") {\n this.scrollState = null;\n }\n this._flushHoldIfReady(true);\n if (this.scrollState) {\n this.scheduleScrollReconcile();\n }\n this.maybeNotify();\n })\n );\n if (\"addEventListener\" in this.scrollElement) {\n this.unsubs.push(\n this._iosGesture.listen(this.scrollElement)\n );\n }\n this._scrollToOffset(this.getScrollOffset());\n }\n this._noteClampMax();\n const anchor = this.pendingScrollAnchor;\n this.pendingScrollAnchor = null;\n if (anchor && this.scrollElement && this.options.enabled) {\n if (anchor.kind === \"anchor\") {\n if (!this._canWriteScroll()) {\n this._holdOffset += anchor.delta;\n this._followOffsetTarget(anchor.delta);\n this.notify(false);\n } else if (isSmoothScroll(this.scrollState) && !approxEqual(\n this.getScrollOffset() - anchor.delta,\n this.scrollState.lastTargetOffset\n )) ;\n else {\n this._followOffsetTarget(anchor.delta);\n this._scrollToOffset(this.getScrollOffset());\n }\n } else {\n this.scrollToEnd({ behavior: anchor.behavior });\n }\n }\n this._flushHoldIfReady(false);\n this._retryClampedAdjustment();\n };\n this._classifyScrollEvent = (offset, isScrolling, elementMax) => {\n var _a;\n return classifyScrollEvent({\n offset,\n isScrolling,\n elementMax,\n holdOffset: this._holdOffset,\n scrollOffset: this.scrollOffset,\n pendingWrite: this.pendingWrite,\n clampedMaxAtWrite: ((_a = this._clampedAdjustment) == null ? void 0 : _a.maxAtWrite) ?? null\n });\n };\n this._retryClampedAdjustment = () => {\n if (this._clampedAdjustment === null || !this.scrollElement || !this.options.enabled || !this._canWriteScroll()) {\n return;\n }\n const { target, maxAtWrite } = this._clampedAdjustment;\n const max = this.getMaxScrollOffset();\n if (max > maxAtWrite + 0.5) {\n this._clampedAdjustment = target > max + 0.5 ? { target, maxAtWrite: max } : null;\n this._scrollToOffset(target);\n }\n };\n this._writeAwaitingCommand = () => {\n const state = this.scrollState;\n if (state === null || state.phase !== \"queued\") return;\n const { behavior } = state;\n this.getMeasurements();\n const offset = this.getScrollStateTarget(state);\n state.lastTargetOffset = offset;\n this._clampedAdjustment = null;\n state.phase = initialScrollPhase(\n behavior,\n state.index != null && approxEqual(offset, this.getScrollOffset())\n );\n this._scrollToOffset(offset, { behavior });\n this.scheduleScrollReconcile();\n };\n this._readElementOffset = () => {\n const el = this.scrollElement;\n if (el == null) return null;\n const { horizontal, isRtl } = this.options;\n if (typeof el.scrollTop === \"number\") {\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n }\n if (typeof el.scrollY === \"number\") {\n return horizontal ? el.scrollX : el.scrollY;\n }\n return null;\n };\n this._canWriteScroll = () => !(isIOSWebKit() && this._iosGesture.inMotion()) && !this._reportedOverscroll;\n this._flushHoldIfReady = (sync) => {\n var _a;\n if (this._holdOffset === 0) return;\n if (!this.scrollElement || !this.options.enabled) return;\n if (!this._canWriteScroll()) return;\n if (((_a = this.scrollState) == null ? void 0 : _a.phase) === \"smooth\") return;\n this._holdOffset = 0;\n if (this.scrollOffset !== null && this.scrollOffset < 0) {\n this.scrollOffset = 0;\n }\n this.notify(sync);\n const target = this.getCommandWrittenOffset() ?? this.getScrollOffset();\n this._clampedAdjustment = this._clampedBy(target);\n this._scrollToOffset(target);\n };\n this.rafId = null;\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes,\n this.options.laneAssignmentMode,\n this.options.gap\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode, gap) => {\n const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n if (lanesChanged) {\n this.lanesChangedFlag = true;\n }\n this.prevLanes = lanes;\n this.pendingMin = null;\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode,\n gap\n };\n },\n {\n key: false\n }\n );\n this.isIndexInRange = (index) => index >= 0 && index < this.options.count;\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],\n ({\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode,\n gap\n }, _itemSizeCacheVersion) => {\n var _a;\n const itemSizeCache = this.itemSizeCache;\n if (!enabled) {\n this.measurementsCache = [];\n this._singleLaneMeasurements = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n return [];\n }\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index);\n }\n }\n }\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false;\n this.lanesSettling = true;\n this.measurementsCache = [];\n this._singleLaneMeasurements = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.pendingMin = null;\n }\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;\n this.pendingMin = null;\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false;\n }\n if (lanes === 1) {\n const need = count * 2;\n let flat = (_a = this._singleLaneMeasurements) == null ? void 0 : _a.flat;\n if (!flat || flat.length < need) {\n const next = new Float64Array(need);\n if (flat && min > 0) next.set(flat.subarray(0, min * 2));\n flat = next;\n }\n const items = min === 0 ? new Array(count) : this._singleLaneMeasurements.items.slice();\n let runningStart;\n if (min === 0) {\n runningStart = paddingStart + scrollMargin;\n } else {\n const prevIdx = min - 1;\n runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n items[i] = key;\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n flat[i * 2] = runningStart;\n flat[i * 2 + 1] = size;\n runningStart += size + gap;\n }\n this._singleLaneMeasurements = { flat, items };\n const view = createLazyMeasurementsView(items, flat);\n this.measurementsCache = view;\n return view;\n }\n const measurements = this.measurementsCache.slice(0, min);\n const laneLastIndex = new Array(lanes).fill(\n void 0\n );\n const laneEnds = new Float64Array(lanes);\n let filledLanes = 0;\n for (let m = 0; m < min; m++) {\n const item = measurements[m];\n if (item) {\n if (laneLastIndex[item.lane] === void 0) filledLanes++;\n laneLastIndex[item.lane] = m;\n laneEnds[item.lane] = item.end;\n }\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const cachedLane = this.laneAssignments.get(i);\n let lane;\n let start;\n const shouldCacheLane = laneAssignmentMode === \"estimate\" || itemSizeCache.has(key);\n if (cachedLane !== void 0 && this.options.lanes > 1) {\n lane = cachedLane;\n const prevIndex = laneLastIndex[lane];\n const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n start = prevInLane ? prevInLane.end + gap : paddingStart + scrollMargin;\n } else if (filledLanes === lanes) {\n let bestLane = 0;\n let bestEnd = laneEnds[0];\n let bestIdx = laneLastIndex[0];\n for (let l = 1; l < lanes; l++) {\n const e = laneEnds[l];\n if (e < bestEnd || e === bestEnd && laneLastIndex[l] < bestIdx) {\n bestLane = l;\n bestEnd = e;\n bestIdx = laneLastIndex[l];\n }\n }\n lane = bestLane;\n start = bestEnd + gap;\n if (shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n } else {\n lane = i % this.options.lanes;\n start = paddingStart + scrollMargin;\n if (shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n }\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n if (laneLastIndex[lane] === void 0) filledLanes++;\n laneLastIndex[lane] = i;\n laneEnds[lane] = end;\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes,\n // scrollOffset is measured in the scroll element and the layout total\n // from the list start, so the list ends scrollMargin further down.\n this._getLayoutTotalSize() + this.options.scrollMargin\n ],\n (measurements, outerSize, scrollOffset, lanes, listEnd) => {\n if (measurements.length === 0 || outerSize === 0) {\n this.range = null;\n return null;\n }\n const maxScrollOffset = Math.max(listEnd - outerSize, 0);\n this.range = calculateRangeImpl(\n measurements,\n outerSize,\n Math.min(scrollOffset, maxScrollOffset),\n lanes,\n // Pass the typed array so binary search + forward-walk can read\n // start/end directly from Float64Array, skipping the Proxy traps.\n lanes === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null\n );\n return this.range;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex,\n this.options.lanes\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex, lanes) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count,\n lanes\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this.shouldMeasureDuringScroll = (index) => {\n var _a;\n if (!isSmoothScroll(this.scrollState)) {\n return true;\n }\n const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);\n if (scrollIndex !== void 0 && this.range) {\n const bufferSize = Math.max(\n this.options.overscan,\n Math.ceil((this.range.endIndex - this.range.startIndex) / 2)\n );\n const minIndex = Math.max(0, scrollIndex - bufferSize);\n const maxIndex = Math.min(\n this.options.count - 1,\n scrollIndex + bufferSize\n );\n return index >= minIndex && index <= maxIndex;\n }\n return true;\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key2) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key2);\n }\n });\n return;\n }\n const index = this.indexFromElement(node);\n if (!this.isIndexInRange(index)) return;\n const key = this.options.getItemKey(index);\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if (node.isConnected && (!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, void 0, this));\n }\n };\n this.resizeItem = (index, size) => {\n var _a, _b, _c;\n if (!this.isIndexInRange(index)) return;\n if ((_a = this._resizeBatch) == null ? void 0 : _a.sync) this.getMeasurements();\n let cachedSize;\n let itemStart;\n let key;\n const flat = (_b = this._singleLaneMeasurements) == null ? void 0 : _b.flat;\n if (this.options.lanes === 1 && flat != null) {\n key = this.options.getItemKey(index);\n itemStart = flat[index * 2];\n cachedSize = flat[index * 2 + 1];\n } else {\n const item = this.measurementsCache[index];\n if (!item) return;\n key = item.key;\n itemStart = item.start;\n cachedSize = item.size;\n }\n const itemSize = this.itemSizeCache.get(key) ?? cachedSize;\n const delta = size - itemSize;\n if (delta !== 0) {\n const wasAtEnd = this.options.anchorTo === \"end\" && !isSmoothScroll(this.scrollState) && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;\n const prevTotalSize = wasAtEnd ? this._getLayoutTotalSize() : 0;\n const scrollOffset = this.getScrollOffset();\n const isFirstMeasure = !this.itemSizeCache.has(key);\n const defaultShouldAdjust = isFirstMeasure ? (\n // First measurement: compensate any item whose top sits above the\n // fold — the estimate→actual delta must be corrected regardless of\n // scroll direction, since the whole estimated block was above it.\n itemStart < scrollOffset\n ) : (\n // Re-measurement: only compensate an item that is ENTIRELY above the\n // fold. An item that merely *spans* the fold (top above, bottom\n // below — e.g. a streaming chat message growing at its bottom)\n // changes size *below* the anchor point, so shifting scrollTop by the\n // delta would drag the viewport downward on every growth (#1218).\n // Also skip during backward scroll to avoid the \"items jump while\n // scrolling up\" cascade.\n itemStart + itemSize <= scrollOffset && this.scrollDirection !== \"backward\"\n );\n const shouldAdjustScroll = !isSmoothScroll(this.scrollState) && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(\n // The callback expects a VirtualItem; build one lazily only\n // when the consumer actually supplied a custom predicate.\n this.measurementsCache[index] ?? {\n index,\n key,\n start: itemStart,\n size: cachedSize,\n end: itemStart + cachedSize,\n lane: 0\n },\n delta,\n this\n ) : defaultShouldAdjust);\n if (this.pendingMin === null || index < this.pendingMin) {\n this.pendingMin = index;\n }\n this.itemSizeCache.set(key, size);\n this.itemSizeCacheVersion++;\n let adjustedSync = false;\n if (!this._awaitingCommandReadBack()) {\n if (wasAtEnd) {\n adjustedSync = this.applyScrollAdjustment(\n this._getLayoutTotalSize() - prevTotalSize\n );\n } else if (shouldAdjustScroll) {\n adjustedSync = this.applyScrollAdjustment(delta);\n }\n }\n if (this._resizeBatch) {\n this._resizeBatch.notify = true;\n (_c = this._resizeBatch).sync || (_c.sync = adjustedSync);\n return;\n }\n this.notify(adjustedSync);\n this._noteClampMax();\n this._flushHoldIfReady(true);\n this._retryClampedAdjustment();\n }\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements(), this._holdOffset],\n (indexes, measurements, hold) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(\n hold === 0 ? measurement : {\n ...measurement,\n start: measurement.start - hold,\n end: measurement.end - hold\n }\n );\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n var _a;\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n const flat = (_a = this._singleLaneMeasurements) == null ? void 0 : _a.flat;\n const useFlat = this.options.lanes === 1 && flat != null;\n const idx = findNearestBinarySearch(\n 0,\n measurements.length - 1,\n useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,\n offset\n );\n return notUndefined(measurements[idx]);\n };\n this._noteClampMax = () => {\n if (!this._awaitingCommandReadBack()) return;\n const elementMax = this._elementMaxScrollOffset();\n if (elementMax === null) return;\n const write = this.pendingWrite;\n const max = Math.max(elementMax, 0) + this._holdOffset;\n if (max >= write.target) return;\n const lowMaxes = write.lowMaxes ?? (write.lowMaxes = []);\n if (lowMaxes[lowMaxes.length - 1] !== max) lowMaxes.push(max);\n };\n this.getMaxScrollOffset = () => (this._elementMaxScrollOffset() ?? 0) + this._holdOffset;\n this._toLayoutOffset = (elementOffset) => {\n var _a;\n let offset = elementOffset + this._holdOffset;\n if (((_a = this.pendingScrollAnchor) == null ? void 0 : _a.kind) === \"anchor\") {\n offset += this.pendingScrollAnchor.delta;\n }\n return offset;\n };\n this._elementMaxScrollOffset = () => {\n const el = this.scrollElement;\n if (el === null) return null;\n if (\"scrollHeight\" in el) {\n return this.options.horizontal ? el.scrollWidth - el.clientWidth : el.scrollHeight - el.clientHeight;\n }\n if (\"document\" in el) {\n const doc = el.document.documentElement;\n return this.options.horizontal ? doc.scrollWidth - el.innerWidth : doc.scrollHeight - el.innerHeight;\n }\n return null;\n };\n this._momentumStop = null;\n this._stopMomentum = (done) => {\n const el = this.scrollElement;\n const win = this.targetWindow;\n if (el === null || win === null) return;\n const scroller = \"document\" in el ? el.document.scrollingElement : el;\n if (!(scroller == null ? void 0 : scroller.style)) return;\n if (this._momentumStop) {\n this._momentumStop.done = done;\n return;\n }\n const { style } = scroller;\n const property = this.options.horizontal ? \"overflow-x\" : \"overflow-y\";\n const value = style.getPropertyValue(property);\n const priority = style.getPropertyPriority(property);\n const crossSize = () => this.options.horizontal ? scroller.clientHeight : scroller.clientWidth;\n const crossSizeBefore = crossSize();\n style.setProperty(property, \"hidden\", \"important\");\n if (crossSize() !== crossSizeBefore) {\n style.setProperty(property, value, priority);\n return;\n }\n const stop = {\n // False when the app replaced the hidden value: the fling may not\n // have stopped.\n restore: () => {\n if (style.getPropertyValue(property) !== \"hidden\" || style.getPropertyPriority(property) !== \"important\") {\n return false;\n }\n style.setProperty(property, value, priority);\n return true;\n },\n done\n };\n this._momentumStop = stop;\n win.requestAnimationFrame(\n () => win.requestAnimationFrame(() => {\n if (this._momentumStop !== stop) return;\n this._momentumStop = null;\n if (stop.restore()) stop.done();\n })\n );\n };\n this._clampedBy = (target) => {\n const elementMax = this._elementMaxScrollOffset();\n if (elementMax === null) return null;\n const maxAtWrite = elementMax + this._holdOffset;\n return target > maxAtWrite + 0.5 ? { target, maxAtWrite } : null;\n };\n this.getVirtualDistanceFromEnd = () => {\n return Math.max(\n this._getLayoutTotalSize() + this.options.scrollMargin - this.getSize() - this.getScrollOffset(),\n 0\n );\n };\n this.getDistanceFromEnd = () => {\n return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);\n };\n this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {\n return this.getDistanceFromEnd() <= threshold;\n };\n this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n if (!this.scrollElement) return 0;\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n }\n if (align === \"center\") {\n toOffset += (itemSize - size) / 2;\n } else if (align === \"end\") {\n toOffset -= size;\n }\n const maxOffset = this.getMaxScrollOffset();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n const item = this.getMeasurements()[index];\n if (!item) return;\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n if (align === \"end\" && index === this.options.count - 1) {\n const maxOffset = this.getMaxScrollOffset();\n const toOffset2 = maxOffset - this.options.paddingEnd + this.options.scrollPaddingEnd;\n return [Math.max(Math.min(toOffset2, maxOffset), 0), align];\n }\n const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align\n ];\n };\n this.scrollToOffset = (toOffset, { align = \"start\", behavior = \"auto\" } = {}) => {\n this._startScroll(\n { index: null, align },\n this.getOffsetForAlignment(toOffset, align),\n behavior,\n \"absolute\"\n );\n };\n this.scrollToIndex = (index, {\n align: initialAlign = \"auto\",\n behavior = \"auto\"\n } = {}) => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const offsetInfo = this.getOffsetForIndex(index, initialAlign);\n if (!offsetInfo) return;\n const [offset, align] = offsetInfo;\n this._startScroll({ index, align }, offset, behavior, \"absolute\");\n };\n this.scrollBy = (delta, { behavior = \"auto\" } = {}) => {\n const offset = this.getOffsetForAlignment(\n (this.getCommandWrittenOffset() ?? this.getScrollOffset()) + delta,\n \"start\"\n );\n this._startScroll(\n { index: null, align: \"start\" },\n offset,\n behavior,\n \"relative\"\n );\n };\n this.scrollToEnd = ({ behavior = \"auto\" } = {}) => {\n if (this.options.count > 0) {\n this._startScroll(\n { index: this.options.count - 1, align: \"end\", toEnd: true },\n Math.max(this.getMaxScrollOffset(), 0),\n behavior,\n \"absolute\"\n );\n return;\n }\n this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {\n behavior\n });\n };\n this.cancelScroll = () => {\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n };\n this.getTotalSize = () => Math.max(this._getLayoutTotalSize() - this._holdOffset, 0);\n this._getLayoutTotalSize = () => {\n var _a, _b;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else if (this.options.lanes === 1) {\n const lastIdx = measurements.length - 1;\n const flat = (_a = this._singleLaneMeasurements) == null ? void 0 : _a.flat;\n if (flat != null) {\n end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];\n } else {\n end = ((_b = measurements[lastIdx]) == null ? void 0 : _b.end) ?? 0;\n }\n } else {\n const endByLane = Array(this.options.lanes).fill(null);\n let endIndex = measurements.length - 1;\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex];\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end;\n }\n endIndex--;\n }\n end = Math.max(...endByLane.filter((val) => val !== null));\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this.takeSnapshot = () => {\n const snapshot = [];\n if (this.itemSizeCache.size === 0) return snapshot;\n const m = this.getMeasurements();\n for (const item of m) {\n if (item && this.itemSizeCache.has(item.key)) {\n snapshot.push({\n index: item.index,\n key: item.key,\n start: item.start,\n size: item.size,\n end: item.end,\n lane: item.lane\n });\n }\n }\n return snapshot;\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n } = {}) => {\n const write = {\n target: offset + (adjustments ?? 0),\n smooth: behavior === \"smooth\"\n };\n this.pendingWrite = write;\n this.options.scrollToFn(\n offset - this._holdOffset,\n { behavior, adjustments },\n this\n );\n return write;\n };\n this.getCommandWrittenOffset = () => this.scrollState !== null && this.pendingWrite !== null && !this.pendingWrite.smooth ? this.pendingWrite.target : null;\n this._awaitingCommandReadBack = () => {\n const writtenOffset = this.getCommandWrittenOffset();\n return !(isIOSWebKit() && this._iosGesture.dragging()) && writtenOffset !== null && !approxEqual(writtenOffset, this.getScrollOffset());\n };\n this._followOffsetTarget = (delta) => {\n if (this.scrollState !== null && this.scrollState.index == null) {\n this.scrollState.lastTargetOffset += delta;\n }\n };\n this.measure = () => {\n this.pendingMin = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.itemSizeCacheVersion++;\n this.notify(false);\n };\n this.setOptions(opts);\n }\n /**\n * @deprecated Always 0: a scroll correction is folded into `scrollOffset`\n * at once, so there is never an outstanding adjustment to add to it. Read\n * `scrollOffset` alone.\n */\n get scrollAdjustments() {\n return 0;\n }\n // Returns `true` when it performed a synchronous `scrollTop` write this\n // tick, `false` when the delta was zero or the write was deferred (iOS).\n // `resizeItem` uses that to decide whether the follow-up `notify` must be\n // synchronous so the grown transforms commit in the same paint (#1227).\n applyScrollAdjustment(delta, behavior) {\n if (delta === 0) return false;\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n this._followOffsetTarget(delta);\n if (!this._canWriteScroll()) {\n this._holdOffset += delta;\n if (this.scrollOffset !== null) this.scrollOffset += delta;\n return true;\n } else {\n const offset = this.getScrollOffset();\n this._clampedAdjustment = this._clampedBy(offset + delta);\n const write = this._scrollToOffset(offset, {\n adjustments: delta,\n behavior\n });\n if (this.scrollOffset !== null) {\n if (this.pendingWrite === write) this.scrollOffset += delta;\n if (this.scrollOffset < 0) this.scrollOffset = 0;\n }\n return true;\n }\n }\n scheduleScrollReconcile() {\n if (!this.targetWindow) {\n this.scrollState = null;\n return;\n }\n if (this.rafId != null) return;\n this.rafId = this.targetWindow.requestAnimationFrame(() => {\n this.rafId = null;\n this.reconcileScroll();\n });\n }\n getScrollStateTarget(state) {\n const offsetInfo = state.toEnd ? [Math.max(this.getMaxScrollOffset(), 0)] : state.index != null ? this.getOffsetForIndex(state.index, state.align) : void 0;\n return offsetInfo ? offsetInfo[0] : state.lastTargetOffset;\n }\n reconcileScroll() {\n if (!this.scrollState) return;\n const el = this.scrollElement;\n if (!el) return;\n const MAX_RECONCILE_MS = 5e3;\n if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n this.scrollState = null;\n return;\n }\n if (this.scrollState.phase === \"queued\") {\n this.scheduleScrollReconcile();\n return;\n }\n this.getMeasurements();\n const targetOffset = this.getScrollStateTarget(this.scrollState);\n const STABLE_FRAMES = this.scrollState.index == null ? 1 : this.options.useAnimationFrameWithResizeObserver ? 3 : 2;\n const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;\n if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n if (this.scrollState.phase === \"smooth\") {\n this.scrollState.phase = \"smoothLanded\";\n } else if (this.scrollState.phase === \"smoothFinishing\") {\n this.scrollState.phase = \"instant\";\n }\n this.scrollState.stableFrames++;\n if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n if (this.getScrollOffset() !== targetOffset) {\n this._scrollToOffset(targetOffset, { behavior: \"auto\" });\n }\n this.scrollState = null;\n return;\n }\n } else {\n this.scrollState.stableFrames = 0;\n if (targetChanged) {\n const viewport = this.getSize() || 600;\n const distance = Math.abs(targetOffset - this.getScrollOffset());\n const keepSmooth = isSmoothScroll(this.scrollState) && distance > viewport;\n this.scrollState.lastTargetOffset = targetOffset;\n if (keepSmooth) {\n this.scrollState.phase = \"smooth\";\n } else if (this.scrollState.phase === \"smooth\") {\n this.scrollState.phase = \"smoothFinishing\";\n } else if (this.scrollState.phase === \"smoothLanded\") {\n this.scrollState.phase = \"instant\";\n }\n this._scrollToOffset(targetOffset, {\n behavior: keepSmooth ? \"smooth\" : \"auto\"\n });\n }\n }\n this.scheduleScrollReconcile();\n }\n // Every scroll command starts here: it becomes the in-flight command,\n // writes its first target and leaves reconcile to retarget and retire it.\n //\n // Targets are layout offsets. A held correction is not dropped by a\n // command: the write lands the element `_holdOffset` short of the target,\n // under the rows exposed shifted by the same amount, and the flush moves\n // both together once a write is possible.\n //\n // An index or end target that is already at its offset starts a smooth\n // scroll as landed; an offset target never does, so its first scroll\n // event is read as the user's (see the scroll handler in `_willUpdate`).\n _startScroll(target, offset, behavior, kind) {\n this.pendingScrollAnchor = null;\n this._clampedAdjustment = null;\n const tail = this._iosGesture.tail();\n if (kind === \"absolute\" && tail !== null) {\n if (tail === \"fling\" && momentumOverridesWrites()) {\n this._stopMomentum(() => {\n const state = this.scrollState;\n if ((state == null ? void 0 : state.phase) !== \"queued\" || // A finger came down: it owns the scroll until it lifts.\n this._iosGesture.tail() !== \"fling\" || // In a bounce WebKit can drop the write (#1287): the tail\n // decides, as without the stop. (Not `flingCaught`: our stop\n // also ends the fling at speed, so a slow frame would read as\n // a catch and the tail would drop the command.)\n this._reportedOverscroll) {\n return;\n }\n this._iosGesture.end();\n this._flushHoldIfReady(true);\n this._writeAwaitingCommand();\n });\n this.scrollState = {\n ...target,\n startedAt: this.now(),\n lastTargetOffset: offset,\n stableFrames: 0,\n phase: \"queued\",\n behavior,\n samples: []\n };\n this.scheduleScrollReconcile();\n return;\n }\n this._iosGesture.end();\n }\n this.scrollState = {\n ...target,\n startedAt: this.now(),\n lastTargetOffset: offset,\n stableFrames: 0,\n behavior,\n phase: initialScrollPhase(\n behavior,\n target.index != null && approxEqual(offset, this.getScrollOffset())\n )\n };\n this._scrollToOffset(offset, { behavior });\n this.scheduleScrollReconcile();\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction findNearestBinarySearchFlat(flat, high, value) {\n let low = 0;\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = flat[middle * 2];\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n return low > 0 ? low - 1 : 0;\n}\nfunction calculateRangeImpl(measurements, outerSize, scrollOffset, lanes, flat) {\n const lastIndex = measurements.length - 1;\n if (measurements.length <= lanes) {\n return { startIndex: 0, endIndex: lastIndex };\n }\n if (lanes === 1 && flat !== null) {\n const startIndex2 = findNearestBinarySearchFlat(\n flat,\n lastIndex,\n scrollOffset\n );\n let endIndex2 = startIndex2;\n const limit = scrollOffset + outerSize;\n while (endIndex2 < lastIndex && flat[endIndex2 * 2] + flat[endIndex2 * 2 + 1] < limit) {\n endIndex2++;\n }\n return { startIndex: startIndex2, endIndex: endIndex2 };\n }\n const getStart = (index) => measurements[index].start;\n let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);\n let endIndex = startIndex;\n if (lanes === 1) {\n while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {\n endIndex++;\n }\n } else if (lanes > 1) {\n const endPerLane = Array(lanes).fill(0);\n while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n const item = measurements[endIndex];\n endPerLane[item.lane] = item.end;\n endIndex++;\n }\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex];\n startPerLane[item.lane] = item.start;\n startIndex--;\n }\n startIndex = Math.max(0, startIndex - startIndex % lanes);\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n _resetIOSDetectionForTests,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import { elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect, Virtualizer } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nclass VirtualizerControllerBase {\n constructor(host, options) {\n this.cleanup = () => {\n };\n this.host = host;\n this.options = { ...options };\n this.virtualizer = new Virtualizer(this.resolveOptions(this.options));\n this.host.addController(this);\n }\n getVirtualizer() {\n return this.virtualizer;\n }\n /**\n * Merge a partial options update into the options this controller already\n * holds, push them to the virtualizer, and request a host update. Lit folds\n * a request made from `willUpdate` into the update already in progress.\n *\n * Keys set to `undefined` are ignored, matching core `setOptions`, so a\n * partial update cannot wipe an option stored earlier. Defaults supplied by\n * `VirtualizerController` / `WindowVirtualizerController` stay in place\n * unless a later call replaces them.\n */\n setOptions(options) {\n if (!this.applyOptions(options)) return;\n this.virtualizer.setOptions(this.resolveOptions(this.options));\n this.virtualizer._willUpdate();\n this.host.requestUpdate();\n }\n hostConnected() {\n this.cleanup = this.virtualizer._didMount();\n this.virtualizer._willUpdate();\n this.host.requestUpdate();\n }\n hostUpdated() {\n this.virtualizer._willUpdate();\n }\n hostDisconnected() {\n this.cleanup();\n }\n applyOptions(partial) {\n const next = {\n ...this.options\n };\n let changed = false;\n for (const key in partial) {\n if (!Object.prototype.hasOwnProperty.call(partial, key)) continue;\n const value = partial[key];\n if (value === void 0) continue;\n if (!Object.is(next[key], value)) {\n changed = true;\n Object.assign(next, { [key]: value });\n }\n }\n if (changed) this.options = next;\n return changed;\n }\n resolveOptions(options) {\n return {\n ...options,\n onChange: (instance, sync) => {\n var _a;\n this.host.updateComplete.then(() => this.host.requestUpdate());\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance, sync);\n }\n };\n }\n}\nclass VirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n }\n}\nclass WindowVirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n }\n}\nexport {\n VirtualizerController,\n WindowVirtualizerController\n};\n//# sourceMappingURL=index.js.map\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { VirtualizerController } from '@tanstack/lit-virtual';\nimport { RowPool, ScrollScale, maxVisibleRows, steadyWindow } from '@argus-table/core';\n\n/** A rendered body row: its pool slot, its index in the row model and its offset. */\nexport interface WindowRow {\n slot: number;\n index: number;\n /** Offset in the rendered body, in px (scaled bodies: relative to the scroll position). */\n start: number;\n}\n\nexport interface VirtualWindow {\n /** Rendered rows, in pool order (ADR 0001 addendum). */\n rows: WindowRow[];\n /** Rendered height of the body in px: all rows, or the cap. */\n totalSize: number;\n /** Visible rows, without overscan; `null` before the first layout. */\n range: { start: number; end: number } | null;\n}\n\nexport interface VirtualConfig {\n count: number;\n rowHeight: number;\n overscan: number;\n /** Row id at an index of the row model; pool slots follow row ids. */\n rowIdAt: (index: number) => string;\n /**\n * The row to keep rendered outside the range (the one holding the grid's tab\n * stop), so its DOM and focus survive scrolling. `undefined`: none.\n */\n keep?: { id: string; index: number } | undefined;\n /** The tallest the body may render (`bodyCap()`); a taller one scrolls scaled. */\n cap: number;\n}\n\n/**\n * Row virtualization (TanStack Virtual) plus the row pool: which rows render,\n * where, and which pool slot's DOM each one uses. The virtualizer registers itself\n * with the host and requests updates on scroll.\n *\n * Scroll scaling: engines limit an element's height, so a body taller than the\n * cap renders at the cap and its scroll position maps linearly onto the rows\n * (`ScrollScale`). The virtualizer works in logical offsets: it gets a stand-in\n * for the scroller whose `scrollTop`, `scrollHeight` and `scrollTo()` are\n * logical, and everything else passes through. Rows render relative to the\n * scroll position (`start` minus the difference between the logical and the\n * physical offset). Scroll through this controller (`scrollBy`, `reveal`,\n * `scrollToIndex`): physical px no longer match rows once the body is scaled.\n */\nexport class VirtualController implements ReactiveController {\n readonly #virtual: VirtualizerController<HTMLElement, Element>;\n readonly #pool = new RowPool();\n readonly #scale = new ScrollScale();\n readonly #host: ReactiveControllerHost;\n readonly #getScrollElement: () => HTMLElement | null;\n #element: HTMLElement | undefined;\n #standIn: HTMLElement | undefined;\n #config: VirtualConfig = {\n count: 0,\n rowHeight: 40,\n overscan: 6,\n rowIdAt: String,\n cap: Infinity,\n };\n /** A logical offset to restore after the update, once the body has its new height. */\n #anchor: number | undefined;\n\n constructor(host: ReactiveControllerHost, getScrollElement: () => HTMLElement | null) {\n this.#host = host;\n this.#getScrollElement = getScrollElement;\n this.#virtual = new VirtualizerController<HTMLElement, Element>(host, {\n count: 0,\n getScrollElement: () => this.#scroller(),\n // The real element: a ResizeObserver can't observe the stand-in.\n observeElementRect: (_instance, cb) => {\n const element = this.#element;\n if (!element) return undefined;\n const report = () => {\n cb({ width: element.clientWidth, height: element.clientHeight });\n };\n report();\n const observer = new ResizeObserver(report);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n },\n estimateSize: () => this.#config.rowHeight,\n overscan: this.#config.overscan,\n // One window size from the first render: the pool never grows while scrolling\n // (in WebKit, new rows' slots would cut a wheel scroll short; see steadyWindow).\n rangeExtractor: (range) =>\n steadyWindow(\n range,\n maxVisibleRows(this.#element?.clientHeight ?? 0, this.#config.rowHeight),\n ),\n });\n host.addController(this);\n }\n\n /** The scroller's stand-in for the virtualizer: vertical offsets and height in logical px. */\n #scroller(): HTMLElement | null {\n const element = this.#getScrollElement();\n if (!element) return null;\n if (this.#element !== element || !this.#standIn) {\n this.#element = element;\n this.#standIn = new Proxy(element, {\n get: (target, key) => {\n if (key === 'scrollTop') return this.#top(target);\n if (key === 'scrollHeight') return target.scrollHeight + this.#scale.excess;\n if (key === 'scrollTo') {\n return (options: ScrollToOptions) => {\n if (options.top === undefined) target.scrollTo(options);\n else this.#write(target, options.top, options.behavior);\n };\n }\n const value: unknown = Reflect.get(target, key);\n // Methods run on the element itself (DOM methods reject the proxy).\n return typeof value === 'function'\n ? (value as (...args: unknown[]) => unknown).bind(target)\n : value;\n },\n });\n }\n return this.#standIn;\n }\n\n /** The scroller's logical offset. */\n #top(element: HTMLElement): number {\n const top = element.scrollTop;\n const scale = this.#scale;\n return scale.scaled ? scale.toLogical(top, element.scrollHeight - element.clientHeight) : top;\n }\n\n /**\n * Scrolls to a logical offset. `round` rounds the physical one, so that a\n * scaled offset moves the scroller at all.\n */\n #write(\n element: HTMLElement,\n logical: number,\n behavior?: ScrollBehavior,\n round?: (px: number) => number,\n ): void {\n const scale = this.#scale;\n if (!scale.scaled) {\n element.scrollTo({ top: logical, behavior });\n return;\n }\n const range = element.scrollHeight - element.clientHeight;\n const target = Math.min(Math.max(logical, 0), range + scale.excess);\n const physical = scale.toPhysical(target, range);\n element.scrollTo({ top: round ? round(physical) : physical, behavior });\n if (behavior !== 'smooth') scale.land(target, element.scrollTop);\n }\n\n configure(next: VirtualConfig): void {\n const prev = this.#config;\n this.#config = next;\n if (\n next.count !== prev.count ||\n next.overscan !== prev.overscan ||\n next.rowHeight !== prev.rowHeight\n ) {\n this.#virtual.setOptions({ count: next.count, overscan: next.overscan });\n if (next.rowHeight !== prev.rowHeight) this.#virtual.getVirtualizer().measure();\n }\n // Not `scaled`: TypeScript would take it for unchanged after `configure()`.\n const wasScaled = this.#scale.excess > 0;\n const offset = this.#virtual.getVirtualizer().scrollOffset;\n if (this.#scale.configure(next.count * next.rowHeight, next.cap)) {\n // A new mapping would move the rows under a scaled scroll position (a data\n // source growing, a zoom change): keep the logical offset once the body\n // has its new height.\n if ((wasScaled || this.#scale.scaled) && offset !== null && offset > 0) {\n this.#anchor = offset;\n }\n }\n }\n\n hostUpdated(): void {\n const anchor = this.#anchor;\n if (anchor === undefined) return;\n this.#anchor = undefined;\n if (this.#element) this.#write(this.#element, anchor);\n // The logical offset is the same, so the virtualizer sees no change; the\n // rows still have to move to the new physical one.\n this.#host.requestUpdate();\n }\n\n /**\n * Computes the rendered window and updates the pool. Call once per render.\n */\n computeWindow(): VirtualWindow {\n const v = this.#virtual.getVirtualizer();\n const items = v.getVirtualItems();\n // Scaled: rows render relative to the scroll position. The physical offset is\n // read now, so rows for the virtualizer's offset fill the view even if the\n // scroller has moved on since its last scroll event.\n const scaled = this.#scale.scaled;\n const size = this.#scale.size;\n const shift = scaled ? (v.scrollOffset ?? 0) - (this.#element?.scrollTop ?? 0) : 0;\n const byId = new Map<string, { index: number; start: number }>();\n for (const item of items) {\n byId.set(this.#config.rowIdAt(item.index), { index: item.index, start: item.start - shift });\n }\n const { keep, rowHeight } = this.#config;\n this.#pool.pin(keep?.id);\n if (keep && !byId.has(keep.id)) {\n // Fixed row heights: the virtualizer would place it here too. Scaled, it is\n // out of view: keep it inside the body (or just above it, under the header),\n // so it doesn't stretch the scroll range past the cap.\n const start = keep.index * rowHeight - shift;\n byId.set(keep.id, {\n index: keep.index,\n start: scaled ? Math.min(Math.max(start, -rowHeight), size) : start,\n });\n }\n const rows: WindowRow[] = [];\n for (const { id, slot } of this.#pool.update(byId.keys())) {\n const item = byId.get(id);\n if (item) rows.push({ slot, ...item });\n }\n const range = v.range;\n return {\n rows,\n totalSize: scaled ? size : v.getTotalSize(),\n range: range ? { start: range.startIndex, end: range.endIndex } : null,\n };\n }\n\n /** Number of pool slots created so far: bounded by the most rows rendered at once. */\n get poolSize(): number {\n return this.#pool.size;\n }\n\n /** Whether the body is taller than the cap and scrolls scaled. */\n get scaled(): boolean {\n return this.#scale.scaled;\n }\n\n /** `'start'` puts the row at the top; `'auto'` scrolls only as far as needed to show it. */\n scrollToIndex(index: number, align: 'start' | 'auto' = 'start'): void {\n this.#virtual.getVirtualizer().scrollToIndex(index, { align });\n }\n\n /** Scrolls by `delta` px of rows (logical px). */\n scrollBy(delta: number): void {\n const element = this.#element;\n if (element) this.#write(element, this.#top(element) + delta);\n }\n\n /**\n * Scrolls the least distance that shows row `index` in full, between the\n * content above the body (`before` px: the header and top pinned rows) and\n * below it (`after` px). Returns whether the rows are yet to move there (with\n * the update after the scroll event): until then the row's DOM isn't where it\n * will be.\n */\n reveal(index: number, before: number, after: number): boolean {\n const element = this.#element;\n if (!element) return false;\n const { rowHeight } = this.#config;\n const offset = this.#top(element);\n const view = element.clientHeight - before - after;\n const start = index * rowHeight;\n let target: number;\n let round: ((px: number) => number) | undefined;\n if (start < offset) {\n target = start;\n round = Math.floor;\n } else if (start + rowHeight > offset + view) {\n target = start + rowHeight - view;\n round = Math.ceil;\n } else {\n target = offset;\n }\n if (target !== offset) this.#write(element, target, undefined, round);\n // Rendered for an offset the scroller has since left: they move with the\n // update after the scroll event.\n return this.#virtual.getVirtualizer().scrollOffset !== this.#top(element);\n }\n}\n","import type {\n CellClickDetail,\n ColumnReorderDetail,\n ColumnResizeDetail,\n LoadErrorDetail,\n RangeChangeDetail,\n RowClickDetail,\n SortChangeDetail,\n} from '@argus-table/core';\n\n/** Fired after an update when the visible row range changed. */\nexport const RANGE_CHANGE = 'argus-range-change';\n\n/** Fired after the sort order changed (uncontrolled), or with the proposed order (controlled). */\nexport const SORT_CHANGE = 'argus-sort-change';\n\n/** Fired when a column was resized (uncontrolled), or with the proposed widths (controlled). */\nexport const COLUMN_RESIZE = 'argus-column-resize';\n\n/** Fired when a column was moved (uncontrolled), or with the proposed order (controlled). */\nexport const COLUMN_REORDER = 'argus-column-reorder';\n\n/** Fired when a body row was clicked, after `argus-cell-click`. */\nexport const ROW_CLICK = 'argus-row-click';\n\n/** Fired when a body cell was clicked, before `argus-row-click`. */\nexport const CELL_CLICK = 'argus-cell-click';\n\n/** Fired after the update when a `dataSource` page failed to load. */\nexport const LOAD_ERROR = 'argus-load-error';\n\ndeclare global {\n interface HTMLElementEventMap {\n 'argus-range-change': CustomEvent<RangeChangeDetail>;\n 'argus-sort-change': CustomEvent<SortChangeDetail>;\n 'argus-column-resize': CustomEvent<ColumnResizeDetail>;\n 'argus-column-reorder': CustomEvent<ColumnReorderDetail>;\n 'argus-row-click': CustomEvent<RowClickDetail<unknown>>;\n 'argus-cell-click': CustomEvent<CellClickDetail<unknown>>;\n 'argus-load-error': CustomEvent<LoadErrorDetail>;\n }\n}\n\n/** Dispatches a bubbling, composed `CustomEvent`, the shape of every public event. */\nexport function fire(host: HTMLElement, name: string, detail: unknown): boolean {\n return host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n}\n","/**\n * The tallest element the engine renders, measured once per page.\n *\n * Chromium and WebKit clamp a taller element at about 33.5M px (fewer CSS px\n * when the page is zoomed in), and Firefox drops anything over about 17.9M px\n * to 0. A hidden probe tries a few heights and keeps the first that renders at\n * full size. A zoom change (a new `devicePixelRatio` on resize) measures again\n * and tells the tables, so a scaled body stays within the new limit.\n */\nconst HEIGHTS = [32_000_000, 16_000_000, 8_000_000, 4_000_000, 2_000_000];\n\n/** Content below this never needs the probe: every engine renders it. */\nconst SAFE_HEIGHT = 2_000_000;\n/** Room left for the scrollbar and rounding. */\nconst MARGIN = 1000;\n\nlet measured: number | undefined;\nlet forced: number | undefined;\nlet dpr = 0;\nconst listeners = new Set<() => void>();\n\nfunction onResize() {\n if (window.devicePixelRatio === dpr) return;\n dpr = window.devicePixelRatio;\n measured = undefined;\n for (const listener of listeners) listener();\n}\n\n/** The tallest element height in px the engine renders. */\nfunction maxElementHeight(): number {\n if (forced !== undefined) return forced;\n if (measured !== undefined) return measured;\n // Fixed, so the probe never makes the page scroll.\n const probe = document.createElement('div');\n probe.setAttribute('aria-hidden', 'true');\n probe.style.cssText =\n 'position:fixed;inset-block-start:0;inset-inline-start:0;inline-size:1px;visibility:hidden;pointer-events:none';\n document.body.append(probe);\n measured =\n HEIGHTS.find((height) => {\n probe.style.blockSize = `${String(height)}px`;\n return probe.offsetHeight >= height - 1;\n }) ?? SAFE_HEIGHT;\n probe.remove();\n return measured;\n}\n\n/**\n * The tallest the body may render: the engine's maximum less what scrolls with\n * it (`extra`: the header and pinned rows). `Infinity` for a body of `logical`\n * px that is far from any limit, without measuring.\n */\nexport function bodyCap(logical: number, extra: number): number {\n if (forced === undefined && logical + extra < SAFE_HEIGHT) return Infinity;\n return Math.max(maxElementHeight() - extra - MARGIN, 0);\n}\n\n/** Calls `listener` when the maximum may have changed (the page was zoomed). Returns the unsubscribe. */\nexport function watchMaxElementHeight(listener: () => void): () => void {\n if (listeners.size === 0) {\n dpr = window.devicePixelRatio;\n window.addEventListener('resize', onResize, { passive: true });\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) window.removeEventListener('resize', onResize);\n };\n}\n\n/** Tests: pretend the engine renders at most `height` px (`undefined` measures again). */\nexport function setMaxElementHeightForTests(height: number | undefined): void {\n forced = height;\n}\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","import { nothing } from 'lit';\nimport type { CellContent } from '../types.js';\n\n/** Turns header or cell content into a Lit child. */\nexport function toChild(content: CellContent | null | undefined): unknown {\n if (content === null || content === undefined) return nothing;\n return typeof content === 'number' ? String(content) : content;\n}\n\n/** Default cell text for an accessor value. */\nexport function formatValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (value instanceof Date) return value.toLocaleString();\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- objects are handled above\n return typeof value === 'object' ? JSON.stringify(value) : String(value);\n}\n\n/**\n * Private slot names (ADR 0001): cells by pool slot and column, headers by\n * column, pinned rows by side, index and column.\n */\nexport const cellSlot = (slot: number, colIndex: number) => `c-${String(slot)}-${String(colIndex)}`;\nexport const headerSlot = (colIndex: number) => `h-${String(colIndex)}`;\nexport const pinnedSlot = (side: 'top' | 'bottom', index: number, colIndex: number) =>\n `${side === 'top' ? 't' : 'b'}-${String(index)}-${String(colIndex)}`;\n\ninterface Pinnable {\n pin: 'start' | 'end' | undefined;\n pinEdge: boolean;\n}\n\n/**\n * Part list of a body or pinned-row cell: state is in the part name (`::part()`\n * can't take attribute selectors).\n */\nexport function cellParts(\n column: Pinnable & { sorted: 'asc' | 'desc' | false },\n pinnedRow = false,\n): string {\n let parts = pinnedRow ? 'cell cell-pinned-row' : 'cell';\n if (column.pin) parts += column.pinEdge ? ' cell-pinned cell-pinned-edge' : ' cell-pinned';\n if (column.sorted) parts += ' cell-sorted';\n return parts;\n}\n\n/** `aria-sort` for a header: only the sorted column carries it (WAI-ARIA APG). */\nexport function ariaSort(sorted: 'asc' | 'desc' | false): 'ascending' | 'descending' | undefined {\n if (!sorted) return undefined;\n return sorted === 'asc' ? 'ascending' : 'descending';\n}\n\n/** Inline style of a pinned cell: its sticky inset, from the start or the end edge. */\nexport function pinStyle(column: Pinnable & { offset: number }): string | undefined {\n return column.pin ? `--_pin-offset: ${String(column.offset)}px` : undefined;\n}\n","import { html, nothing } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport type { ColumnView, RowState } from '@argus-table/core';\nimport type { WindowRow } from '../controllers/virtual-controller.js';\nimport type { CellContent } from '../types.js';\nimport { cellParts, cellSlot, pinStyle } from './content.js';\n\ntype Columns<T> = readonly ColumnView<T, CellContent>[];\n\n/** The cell holding the grid's tab stop: a row index and a column id. */\nexport interface ActiveCell {\n index: number;\n col: string;\n}\n\n/** Row loading state for `dataSource` tables. */\nexport interface Loading {\n /** Whether a row's data is loaded, still loading, or its page failed. */\n stateAt(index: number): RowState;\n /** Rows that show a Retry button (one per failed page in view), with its accessible label. */\n retry: ReadonlyMap<number, string>;\n /** Click handler of the Retry buttons; the button carries the row index in `data-row`. */\n onRetry: (event: Event) => void;\n}\n\n/**\n * The virtualized body. Rows are keyed by pool slot, so a row entering the window\n * reuses the DOM of one that left (ADR 0001), and they stay in pool order: screen\n * readers get the position from `aria-rowindex`. `firstRowIndex` is the\n * `aria-rowindex` of row 0: after the header and the rows pinned to the top.\n */\nexport function renderBody<T>(\n rows: readonly WindowRow[],\n columns: Columns<T>,\n totalSize: number,\n active: ActiveCell | undefined,\n firstRowIndex: number,\n loading?: Loading,\n) {\n return html`<div\n part=\"body\"\n role=\"rowgroup\"\n style=${styleMap({ blockSize: `${String(totalSize)}px` })}\n >\n ${repeat(\n rows,\n (r) => r.slot,\n (r) =>\n renderRow(\n r,\n columns,\n r.index === active?.index ? active.col : undefined,\n firstRowIndex,\n loading,\n ),\n )}\n </div>`;\n}\n\n/**\n * One body row. Every cell is focusable (`tabindex=-1`) so clicks focus it; the\n * active one is the grid's single tab stop (roving tabindex). A row whose data\n * isn't loaded shows skeleton bars, and a Retry button if its page failed.\n */\nfunction renderRow<T>(\n row: WindowRow,\n columns: Columns<T>,\n activeCol: string | undefined,\n firstRowIndex: number,\n loading: Loading | undefined,\n) {\n const state = loading?.stateAt(row.index) ?? 'loaded';\n let parts = row.index % 2 === 0 ? 'row row-even' : 'row row-odd';\n if (state !== 'loaded') parts += ' row-loading';\n const retry = state === 'error' ? loading?.retry.get(row.index) : undefined;\n return html`<div\n part=${parts}\n class=\"row\"\n role=\"row\"\n aria-rowindex=${row.index + firstRowIndex}\n aria-busy=${state === 'loading' ? 'true' : nothing}\n style=${styleMap({ transform: `translateY(${String(row.start)}px)` })}\n >\n ${repeat(\n columns,\n (c) => c.id,\n (c) =>\n renderCell(\n c,\n c.id === activeCol,\n cellSlot(row.slot, c.colIndex),\n false,\n placeholder(state, c.colIndex === 1 ? retry : undefined, row.index, loading),\n ),\n )}\n </div>`;\n}\n\n/**\n * A body or pinned-row cell. Every cell is focusable (`tabindex=-1`) so clicks\n * focus it; `tabStop` marks the grid's single tab stop. `before` goes ahead of\n * the slot (a loading row's skeleton bar or Retry button).\n */\nexport function renderCell<T>(\n c: ColumnView<T, CellContent>,\n tabStop: boolean,\n slot: string,\n pinnedRow: boolean,\n before: unknown = nothing,\n) {\n return html`<div\n part=${cellParts(c, pinnedRow)}\n role=\"gridcell\"\n aria-colindex=${c.colIndex}\n tabindex=${tabStop ? 0 : -1}\n data-col=${c.id}\n data-align=${c.align}\n data-pin=${c.pin ?? nothing}\n style=${pinStyle(c) ?? nothing}\n >\n ${before}<slot name=${slot}></slot>\n </div>`;\n}\n\n/** What an unloaded cell shows: a skeleton bar, or the Retry button in a failed page's first cell. */\nfunction placeholder(\n state: RowState,\n retryLabel: string | undefined,\n index: number,\n loading: Loading | undefined,\n) {\n if (state === 'loaded') return nothing;\n if (retryLabel !== undefined && loading) {\n return html`<button\n part=\"retry\"\n type=\"button\"\n tabindex=\"-1\"\n data-row=${index}\n aria-label=${retryLabel}\n @click=${loading.onRetry}\n >\n Retry\n </button>`;\n }\n return html`<div\n part=${state === 'error' ? 'skeleton skeleton-error' : 'skeleton'}\n aria-hidden=\"true\"\n ></div>`;\n}\n","import { html, render } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { ColumnView, RowPin, TableModel } from '@argus-table/core';\nimport type { WindowRow } from '../controllers/virtual-controller.js';\nimport type { CellContent } from '../types.js';\nimport { cellSlot, formatValue, headerSlot, pinnedSlot, toChild } from './content.js';\n\ntype Column<T> = ColumnView<T, CellContent>;\n\n/**\n * Renders header and cell content into the host's light DOM, as direct children\n * (a slot only takes the host's own children). Keyed and ordered by pool slot,\n * so recycled content updates in place instead of moving (ADR 0001). The part\n * ends at `renderBefore`, so the host's other children (`<argus-column>`) stay\n * outside it, wherever they are added.\n */\nexport function renderLightDom<T>(\n host: HTMLElement,\n model: TableModel<T, CellContent>,\n rows: readonly WindowRow[],\n renderBefore: ChildNode,\n): void {\n const columns = model.columns;\n render(\n html`${repeat(\n columns,\n (c) => c.id,\n (c) => html`<div slot=${headerSlot(c.colIndex)}>${headerContent(c)}</div>`,\n )}${pinnedContent(model, 'top')}${repeat(\n rows,\n (r) => r.slot,\n (r) =>\n repeat(\n columns,\n (c) => c.id,\n (c) =>\n html`<div slot=${cellSlot(r.slot, c.colIndex)}>${cellContent(model, r.index, c)}</div>`,\n ),\n )}${pinnedContent(model, 'bottom')}`,\n host,\n { host, renderBefore },\n );\n}\n\nfunction headerContent<T>(column: Column<T>): unknown {\n const { header } = column;\n return toChild(typeof header === 'function' ? header() : header);\n}\n\n/** Content of the rows pinned to one side, slotted by side, index and column. */\nfunction pinnedContent<T>(model: TableModel<T, CellContent>, side: RowPin) {\n const columns = model.columns;\n const rows = Array.from({ length: model.pinnedCount(side) }, (_, i) => i);\n return rows.map((i) =>\n repeat(\n columns,\n (c) => c.id,\n (c) =>\n html`<div slot=${pinnedSlot(side, i, c.colIndex)}>${pinnedCell(model, side, i, c)}</div>`,\n ),\n );\n}\n\nfunction pinnedCell<T>(\n model: TableModel<T, CellContent>,\n side: RowPin,\n index: number,\n column: Column<T>,\n) {\n if (column.cell) {\n const context = model.pinnedCellContext(side, index, column.id);\n return context ? toChild(column.cell(context.row, context)) : '';\n }\n return column.hasAccessor ? formatValue(model.pinnedValueAt(side, index, column.id)) : '';\n}\n\nfunction cellContent<T>(model: TableModel<T, CellContent>, index: number, column: Column<T>) {\n if (column.cell) {\n const context = model.cellContext(index, column.id);\n return context ? toChild(column.cell(context.row, context)) : '';\n }\n return column.hasAccessor ? formatValue(model.valueAt(index, column.id)) : '';\n}\n","import { html, nothing } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { ColumnView } from '@argus-table/core';\nimport type { DropTarget } from '../controllers/reorder-drag.js';\nimport type { CellContent } from '../types.js';\nimport { ariaSort, headerSlot, pinStyle } from './content.js';\n\n/** A column header being dragged, and where it would land (`undefined`: where it is). */\nexport interface HeaderDrag {\n columnId: string;\n target: DropTarget | undefined;\n}\n\nexport interface HeaderHandlers {\n click: (event: MouseEvent) => void;\n pointerdown: (event: PointerEvent) => void;\n dblclick: (event: MouseEvent) => void;\n}\n\n/**\n * The sticky header row. Header content is slotted from the light DOM. Pinned\n * header cells use the same private `data-pin` hooks as body cells, but no parts.\n * Every header carries `data-col` (its column id) and sortable ones also\n * `data-sort-col`; the element's delegated handlers read them. Headers take part\n * in the grid's roving tabindex: the active one is the tab stop (`activeCol`).\n * Resizable columns get a `resize-handle` on the header's inline-end edge; a\n * double-click on it fits the column to its content. It is not focusable: the\n * focused header resizes with Alt+Arrow.\n *\n * Reorderable columns carry `data-move-col`: a drag on the header moves the\n * column. While one is dragged (`drag`), its header adds `header-cell-dragging`\n * and the target header shows a `drop-indicator` on the edge it would land at.\n */\nexport function renderHeader<T>(\n columns: readonly ColumnView<T, CellContent>[],\n handlers: HeaderHandlers,\n activeCol: string | undefined,\n drag?: HeaderDrag,\n) {\n return html`<div part=\"header\" role=\"rowgroup\">\n <div\n part=\"header-row\"\n class=\"row\"\n role=\"row\"\n aria-rowindex=\"1\"\n @click=${handlers.click}\n @pointerdown=${handlers.pointerdown}\n @dblclick=${handlers.dblclick}\n >\n ${repeat(\n columns,\n (c) => c.id,\n (c) =>\n html`<div\n part=${headerParts(c, drag)}\n role=\"columnheader\"\n aria-colindex=${c.colIndex}\n aria-sort=${ariaSort(c.sorted) ?? nothing}\n data-col=${c.id}\n data-sort-col=${c.sortable ? c.id : nothing}\n data-move-col=${c.reorderable ? c.id : nothing}\n tabindex=${c.id === activeCol ? 0 : -1}\n data-align=${c.align}\n data-pin=${c.pin ?? nothing}\n style=${pinStyle(c) ?? nothing}\n >\n <slot name=${headerSlot(c.colIndex)}></slot>\n ${c.sortable ? html`<span class=\"sort-indicator\" aria-hidden=\"true\"></span>` : nothing}\n ${c.resizable ? resizeHandle(c) : nothing}\n ${\n drag?.target?.columnId === c.id\n ? html`<span\n part=\"drop-indicator\"\n data-edge=${drag.target.edge}\n aria-hidden=\"true\"\n ></span>`\n : nothing\n }\n </div>`,\n )}\n </div>\n </div>`;\n}\n\nfunction headerParts<T>(c: ColumnView<T, CellContent>, drag: HeaderDrag | undefined): string {\n let parts = c.sorted ? 'header-cell header-cell-sorted' : 'header-cell';\n if (drag?.columnId === c.id) parts += ' header-cell-dragging';\n return parts;\n}\n\n/**\n * A vertical separator with the column's width as its value. A flex column has no\n * fixed width until it is resized, so it reports none.\n */\nfunction resizeHandle<T>(c: ColumnView<T, CellContent>) {\n return html`<div\n part=\"resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize column\"\n aria-valuenow=${c.flex === undefined ? Math.round(c.width) : nothing}\n aria-valuemin=${c.minWidth}\n aria-valuemax=${Number.isFinite(c.maxWidth) ? c.maxWidth : nothing}\n data-resize-col=${c.id}\n ></div>`;\n}\n","import { html, nothing } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { ColumnView, RowPin } from '@argus-table/core';\nimport type { CellContent } from '../types.js';\nimport { renderCell, type ActiveCell } from './body.js';\nimport { pinnedSlot } from './content.js';\n\n/**\n * The rows pinned to one side: a sticky row group below the header (`top`) or\n * at the bottom of the view (`bottom`). They are few and never recycled, so\n * they aren't pooled; content is slotted from the light DOM like body cells.\n * Cells take part in the grid's roving tabindex (`active.index` is the row's\n * index in its list). `firstRowIndex` is the `aria-rowindex` of the first row.\n */\nexport function renderPinnedRows<T>(\n side: RowPin,\n count: number,\n columns: readonly ColumnView<T, CellContent>[],\n firstRowIndex: number,\n active: ActiveCell | undefined,\n) {\n if (count === 0) return nothing;\n const rows = Array.from({ length: count }, (_, i) => i);\n return html`<div class=\"pinned\" data-side=${side} role=\"rowgroup\">\n ${rows.map(\n (i) =>\n html`<div\n part=${`row row-pinned row-pinned-${side}`}\n class=\"row\"\n role=\"row\"\n aria-rowindex=${firstRowIndex + i}\n >\n ${repeat(\n columns,\n (c) => c.id,\n (c) =>\n renderCell(\n c,\n active?.index === i && c.id === active.col,\n pinnedSlot(side, i, c.colIndex),\n true,\n ),\n )}\n </div>`,\n )}\n </div>`;\n}\n","import { css } from 'lit';\n\n/**\n * Base styles. Everything sits in `@layer argus-base`, and every value reads a\n * public token with a neutral fallback, so themes and page CSS always win.\n * `--_*` properties are private.\n */\nexport const baseStyles = css`\n @layer argus-base {\n :host {\n display: block;\n /* A table that virtualizes needs a bounded height; set your own on the element. */\n block-size: 400px;\n box-sizing: border-box;\n contain: content;\n color-scheme: light dark;\n color: var(--argus-fg, CanvasText);\n background: var(--argus-bg, Canvas);\n font: var(--argus-font, inherit);\n /* contain: content clips the header, rows and pinned shadows to the rounded corners. */\n border: var(--argus-outline, none);\n border-radius: var(--argus-radius, 0);\n --_row-height: var(--argus-row-height, 40px);\n --_pad: var(--argus-cell-padding-inline, 12px);\n --_border: var(--argus-border-width, 1px) solid\n var(--argus-border-color, light-dark(#e5e7eb, #374151));\n /* 1 in LTR, -1 in RTL: mirrors the pinned-edge shadow. */\n --_dir: 1;\n }\n :host(:dir(rtl)) {\n --_dir: -1;\n }\n :host([density='compact']) {\n --_row-height: var(--argus-row-height, 32px);\n --_pad: var(--argus-cell-padding-inline, 8px);\n }\n :host([density='spacious']) {\n --_row-height: var(--argus-row-height, 52px);\n --_pad: var(--argus-cell-padding-inline, 16px);\n }\n :host([hidden]) {\n display: none;\n }\n\n [part~='table'] {\n position: relative;\n block-size: 100%;\n overflow: auto;\n overscroll-behavior: contain;\n /*\n * A cell moved to by keyboard scrolls clear of the sticky header, the pinned\n * rows and the pinned columns.\n */\n scroll-padding-block-start: calc((1 + var(--_pin-top-rows, 0)) * var(--_row-height));\n scroll-padding-block-end: calc(var(--_pin-bottom-rows, 0) * var(--_row-height));\n scroll-padding-inline: var(--_pin-start, 0) var(--_pin-end, 0);\n }\n\n .row {\n display: grid;\n grid-template-columns: var(--_cols);\n inline-size: var(--_width);\n min-inline-size: 100%;\n block-size: var(--_row-height);\n box-sizing: border-box;\n }\n\n [part~='header'] {\n position: sticky;\n inset-block-start: 0;\n z-index: 2;\n }\n\n [part~='body'] {\n position: relative;\n contain: layout;\n }\n [part~='body'] > .row {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n [part~='row'] {\n --_row-bg: var(--argus-bg, Canvas);\n --_row-surface: var(--_row-bg);\n background: var(--_row-surface);\n }\n [part~='row-odd'] {\n --_row-bg: var(--argus-row-stripe-bg, var(--argus-bg, Canvas));\n }\n [part~='row']:hover {\n --_row-surface: var(--argus-row-hover-bg, var(--_row-bg));\n }\n\n /*\n * Pinned rows: a sticky row group below the header and one at the bottom of\n * the view. The header is one row tall. They keep their place in the flow,\n * so body row i still starts i rows below the top group.\n */\n .pinned {\n position: sticky;\n z-index: 2;\n }\n .pinned[data-side='top'] {\n inset-block-start: var(--_row-height);\n }\n .pinned[data-side='bottom'] {\n inset-block-end: 0;\n }\n [part~='row-pinned'] {\n --_row-bg: var(--argus-pinned-row-bg, var(--argus-bg, Canvas));\n }\n\n [part~='cell'],\n [part~='header-cell'] {\n display: flex;\n align-items: center;\n min-inline-size: 0;\n box-sizing: border-box;\n padding-inline: var(--_pad);\n overflow: hidden;\n white-space: nowrap;\n border-block-end: var(--_border);\n }\n [part~='header-cell'] {\n background: var(--argus-header-bg, light-dark(#f9fafb, #111827));\n color: var(--argus-header-fg, inherit);\n font-weight: 600;\n }\n [part~='header-cell'] {\n position: relative;\n }\n [part~='resize-handle'] {\n position: absolute;\n inset-block: 0;\n inset-inline-end: 0;\n inline-size: 8px;\n z-index: 1;\n cursor: col-resize;\n touch-action: none;\n }\n [part~='resize-handle']::after {\n content: '';\n position: absolute;\n inset-block: 25%;\n inset-inline-end: 0;\n inline-size: 2px;\n background: var(--argus-resize-handle-color, light-dark(#9ca3af, #6b7280));\n opacity: 0;\n }\n [part~='header-cell']:hover [part~='resize-handle']::after,\n [part~='header-cell']:focus-visible [part~='resize-handle']::after,\n [part~='resize-handle'][data-active]::after {\n opacity: 1;\n }\n [data-sort-col] {\n cursor: pointer;\n user-select: none;\n }\n /* A drag on a reorderable header moves the column, so its text isn't selectable. */\n [data-move-col] {\n user-select: none;\n }\n [data-dragging],\n [data-dragging] [part~='header-cell'] {\n cursor: grabbing;\n }\n [part~='header-cell-dragging'] {\n opacity: 0.5;\n }\n /* The line where a dragged column would land, on the target header's logical edge. */\n [part~='drop-indicator'] {\n position: absolute;\n inset-block: 0;\n inline-size: 2px;\n z-index: 2;\n background: var(--argus-drop-indicator-color, Highlight);\n pointer-events: none;\n }\n [part~='drop-indicator'][data-edge='start'] {\n inset-inline-start: 0;\n }\n [part~='drop-indicator'][data-edge='end'] {\n inset-inline-end: 0;\n }\n [part~='header-cell']:focus-visible,\n [part~='cell']:focus-visible {\n outline: var(--argus-focus-ring, 2px solid Highlight);\n outline-offset: -2px;\n }\n /* A small chevron after the header content; only the sorted column shows it. */\n .sort-indicator {\n flex: none;\n inline-size: 0.35em;\n block-size: 0.35em;\n margin-inline-start: 0.4em;\n /* Physical sides on purpose: the chevron is rotated, so it must not mirror in RTL. */\n border-right: 0.12em solid currentColor;\n border-bottom: 0.12em solid currentColor;\n visibility: hidden;\n }\n [aria-sort] .sort-indicator {\n visibility: visible;\n }\n [aria-sort='ascending'] .sort-indicator {\n transform: translateY(0.1em) rotate(-135deg);\n }\n [aria-sort='descending'] .sort-indicator {\n transform: translateY(-0.1em) rotate(45deg);\n }\n [data-align='end'] .sort-indicator {\n order: -1;\n margin-inline: 0 0.4em;\n }\n /*\n * Pinned columns: sticky inside the scroll container, with offsets from the\n * table model. Logical insets make RTL work without extra rules.\n */\n [data-pin] {\n position: sticky;\n z-index: 1;\n }\n [data-pin='start'] {\n inset-inline-start: var(--_pin-offset);\n }\n [data-pin='end'] {\n inset-inline-end: var(--_pin-offset);\n }\n /*\n * Pinned body cells are sticky only while the table scrolls sideways\n * (data-hscroll on the scroller). At rest they are plain cells shifted by the\n * horizontal scroll offset, which vertical scrolling never changes: a sticky\n * cell per row is a compositing layer each, and Safari stutters moving them\n * (PinScrollController). Both place the cells at the same spot.\n */\n [part~='row'] > [data-pin] {\n position: relative;\n inset-inline: auto;\n }\n [part~='row'] > [data-pin='start'] {\n transform: translateX(var(--_sx, 0px));\n }\n [part~='row'] > [data-pin='end'] {\n transform: translateX(calc(var(--_sx, 0px) - var(--_dir) * var(--_max-x, 0px)));\n }\n [data-hscroll] [part~='row'] > [data-pin] {\n position: sticky;\n transform: none;\n }\n [data-hscroll] [part~='row'] > [data-pin='start'] {\n inset-inline-start: var(--_pin-offset);\n }\n [data-hscroll] [part~='row'] > [data-pin='end'] {\n inset-inline-end: var(--_pin-offset);\n }\n [part~='cell-pinned'] {\n background: var(--_row-surface);\n }\n /*\n * The edge shadow, once per pinned side (.pin-shadow, beside the scroller).\n * --argus-pinned-shadow is written for a shadow falling toward the end side;\n * the start edge in RTL and the end edge in LTR mirror it.\n */\n .pin-shadow {\n position: absolute;\n inset-block-start: 0;\n block-size: min(var(--_view-h, 100%), var(--_content-h, 100%));\n z-index: 3;\n pointer-events: none;\n }\n .pin-shadow[data-side='start'] {\n inset-inline-start: 0;\n }\n .pin-shadow[data-side='end'] {\n inset-inline-end: var(--_sb-x, 0px);\n }\n .pin-shadow::after {\n content: '';\n position: absolute;\n inset: 0;\n box-shadow: var(\n --argus-pinned-shadow,\n 4px 0 6px -4px light-dark(rgb(0 0 0 / 0.2), rgb(0 0 0 / 0.6))\n );\n transform: scaleX(var(--_dir));\n }\n .pin-shadow[data-side='end']::after {\n transform: scaleX(calc(-1 * var(--_dir)));\n }\n\n [data-align='center'] {\n justify-content: center;\n text-align: center;\n }\n [data-align='end'] {\n justify-content: flex-end;\n text-align: end;\n }\n ::slotted(*) {\n min-inline-size: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n /* Fitting a column to its content: set for one synchronous measurement, never painted. */\n [data-measure] {\n inline-size: max-content;\n }\n\n /* Rows of a data source that haven't loaded: a bar per cell, pulsing gently. */\n [part~='skeleton'] {\n flex: none;\n inline-size: min(60%, 8em);\n block-size: 0.6em;\n border-radius: 0.3em;\n background: var(--argus-skeleton-bg, color-mix(in srgb, currentColor 12%, transparent));\n animation: argus-skeleton-pulse 1.6s ease-in-out infinite;\n }\n [part~='skeleton-error'] {\n animation: none;\n opacity: 0.5;\n }\n @keyframes argus-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n [part~='skeleton'] {\n animation: none;\n }\n }\n [part~='retry'] {\n font: inherit;\n color: inherit;\n cursor: pointer;\n }\n\n [part~='empty'] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-block-size: calc(\n 100% - (1 + var(--_pin-top-rows, 0) + var(--_pin-bottom-rows, 0)) * var(--_row-height)\n );\n padding: var(--_pad);\n box-sizing: border-box;\n }\n\n /* Measures the resolved row height in px for the virtualizer. */\n .probe {\n position: absolute;\n inset-block-start: 0;\n inline-size: 0;\n block-size: var(--_row-height);\n visibility: hidden;\n pointer-events: none;\n }\n }\n`;\n","import {\n LitElement,\n html,\n nothing,\n type CSSResultGroup,\n type PropertyValues,\n type TemplateResult,\n} from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport {\n controllable,\n RowLayout,\n type ColumnReorderDetail,\n type ColumnResizeDetail,\n type ColumnView,\n type GridRow,\n type TableModel,\n} from '@argus-table/core';\nimport { announce } from './announce.js';\nimport { AutoWidths, measureColumns } from './controllers/auto-width.js';\nimport { ColumnChildrenController } from './controllers/column-children.js';\nimport { DataController } from './controllers/data-controller.js';\nimport { PinScrollController } from './controllers/pin-scroll-controller.js';\nimport {\n canStartReorder,\n dropTarget,\n startReorderDrag,\n type DropSlot,\n} from './controllers/reorder-drag.js';\nimport { startResizeDrag } from './controllers/resize-drag.js';\nimport { TableController } from './controllers/table-controller.js';\nimport { VirtualController, type VirtualWindow } from './controllers/virtual-controller.js';\nimport {\n CELL_CLICK,\n COLUMN_REORDER,\n COLUMN_RESIZE,\n fire,\n LOAD_ERROR,\n RANGE_CHANGE,\n ROW_CLICK,\n SORT_CHANGE,\n} from './events.js';\nimport { bodyCap, watchMaxElementHeight } from './max-height.js';\nimport { renderBody, type ActiveCell, type Loading } from './render/body.js';\nimport { renderLightDom } from './render/cells.js';\nimport { renderHeader, type HeaderDrag } from './render/header.js';\nimport { renderPinnedRows } from './render/pinned-rows.js';\nimport { baseStyles } from './styles/base.js';\nimport type {\n CellContent,\n ColumnDef,\n ColumnOrderState,\n ColumnSizingState,\n DataSource,\n Density,\n PinnedRows,\n SortState,\n} from './types.js';\n\n/**\n * The host carries the grid role, so rows rendered in the shadow root become\n * its children in the accessibility tree. ElementInternals sets the default;\n * `connectedCallback` also adds a `role` attribute, because tools such as\n * axe-core can't see the ElementInternals role. A `role` the page sets wins.\n */\nfunction attachGridInternals(host: HTMLElement): ElementInternals {\n const internals = host.attachInternals();\n internals.role = 'grid';\n return internals;\n}\n\n/**\n * The sortable column a header click came from, if any. Works for slotted content\n * too. Clicks on a resize handle never sort, so a click that ends a drag doesn't.\n */\nfunction sortColumnOf(event: Event): string | undefined {\n for (const target of event.composedPath()) {\n if (!(target instanceof HTMLElement)) continue;\n if (target.dataset.resizeCol !== undefined) return undefined;\n if (target.dataset.sortCol !== undefined) return target.dataset.sortCol;\n if (target.getAttribute('part') === 'header-row') return undefined;\n }\n return undefined;\n}\n\nconst RESIZE_STEP = 10;\n\n/**\n * The cell holding the grid's single tab stop: a row (its section, and its index\n * there: in the row model for the body, in its list for a pinned row) and a\n * column. `rowId` keeps it on the same body row when the order changes.\n */\ninterface Active extends GridRow {\n rowId: string | undefined;\n col: string;\n}\n\nconst HEADER: GridRow = { section: 'header', index: 0 };\n\n/** Where the rows sit in the grid: header, pinned top, body, pinned bottom. */\nfunction layoutOf<T>(model: TableModel<T, CellContent>): RowLayout {\n return new RowLayout(model.pinnedCount('top'), model.rowCount, model.pinnedCount('bottom'));\n}\n\n/** The grid cell or column header an element is, if any. */\nfunction gridCell(target: EventTarget): HTMLElement | undefined {\n if (!(target instanceof HTMLElement) || target.dataset.col === undefined) return undefined;\n const role = target.getAttribute('role');\n return role === 'gridcell' || role === 'columnheader' ? target : undefined;\n}\n\n/** The grid row a rendered row element is, from its `aria-rowindex`. */\nfunction gridRowOf(row: Element | null, layout: RowLayout): GridRow | undefined {\n const index = row?.getAttribute('aria-rowindex');\n return index ? layout.fromAriaRowIndex(Number(index)) : undefined;\n}\n\n/**\n * The pinned edge's shadow, drawn once per side over the scroller rather than\n * per row: a shadow on every pinned cell repaints on every scroll frame. It\n * covers the pinned columns and casts `--argus-pinned-shadow` onto the rest;\n * PinScrollController sizes it to the visible area.\n */\nfunction pinShadow(side: 'start' | 'end', width: number, rows: number, rowPx: number) {\n if (width === 0) return nothing;\n return html`<div\n class=\"pin-shadow\"\n data-side=${side}\n aria-hidden=\"true\"\n style=${styleMap({\n inlineSize: `${String(width)}px`,\n '--_content-h': `${String((rows + 1) * rowPx)}px`,\n })}\n ></div>`;\n}\n\n/** CSS grid track for a column: fixed px, or a flex share with the min width as floor. */\nfunction track<T>(column: ColumnView<T, CellContent>): string {\n return column.flex === undefined\n ? `${String(column.width)}px`\n : `minmax(${String(column.minWidth)}px, ${String(column.flex)}fr)`;\n}\n\n/**\n * A virtualized data table.\n *\n * Set `columns`, and `data` or `dataSource`, as properties. Columns can also be\n * written as `<argus-column>` children; a non-empty `columns` wins over them.\n * Header and cell content is rendered into the element's light DOM and slotted\n * into the cells, so page CSS and the page's own components work inside cells.\n *\n * Any number of rows scrolls to the end. Browsers limit an element's height\n * (about 800k rows of 40 px in Chromium and Safari, 400k in Firefox), so a taller\n * body renders shorter and its scroll position is scaled onto the rows: the\n * scrollbar still spans every row, and a wheel step covers a few more of them.\n * Use `scrollToRow()` rather than setting the scroll container's `scrollTop`.\n *\n * @summary Data table with pinned rows and columns and infinite loading.\n *\n * @fires {CustomEvent<SortChangeDetail>} argus-sort-change - A sortable header was clicked, or activated with Enter or Space. `detail: { sorting }`: the new order, or the proposed one when `sorting` is controlled.\n * @fires {CustomEvent<ColumnResizeDetail>} argus-column-resize - A column was resized: by dragging its handle, with Alt+Arrow on its header, by a double-click on its handle (fit to content) or by `autosizeColumns()`. `detail: { columnId, width, sizing }`: the new widths, or the proposed ones when `columnSizing` is controlled. Fires on every frame of a drag, and once per column that `autosizeColumns()` changes.\n * @fires {CustomEvent<ColumnReorderDetail>} argus-column-reorder - A column was moved: by dragging its header, or with Alt+Shift+Arrow on its focused header. Columns move within their own group (start-pinned, scrolling, end-pinned). `detail: { columnId, order }`: the new order, or the proposed one when `columnOrder` is controlled. Fires once per move, on drop.\n * @fires {CustomEvent<CellClickDetail<T>>} argus-cell-click - A body or pinned-row cell was clicked, or Enter was pressed on it. `detail: { row, columnId, value, pinned? }`; `pinned` is `'top'` or `'bottom'` for a pinned row. Fires before `argus-row-click`.\n * @fires {CustomEvent<RowClickDetail<T>>} argus-row-click - A body or pinned row was clicked, or Enter was pressed on one of its cells. `detail: { row, rowId, index, pinned? }`; for a pinned row, `index` is its index in its list.\n * @fires {CustomEvent<RangeChangeDetail>} argus-range-change - The visible rows changed. `detail: { start, end }` (row indices, inclusive).\n * @fires {CustomEvent<LoadErrorDetail>} argus-load-error - A `dataSource` page failed to load: `getRows()` rejected or threw. `detail: { error, start, end }` (`end` exclusive). The rows show a Retry button.\n *\n * @slot empty - Shown instead of the body when there are no rows. Default: \"No rows\".\n *\n * @csspart table - The scroll container that holds header and body.\n * @csspart header - The sticky header row group.\n * @csspart header-row - The header row.\n * @csspart header-cell - Every header cell.\n * @csspart header-cell-sorted - The header of the sorted column. The direction is in `aria-sort`.\n * @csspart header-cell-dragging - Added to `header-cell` on the header being dragged to a new position.\n * @csspart drop-indicator - The line on the edge of the header where a dragged column would land.\n * @csspart resize-handle - The drag handle on the inline-end edge of a resizable column's header. A double-click fits the column to its content.\n * @csspart body - The row group holding the rendered body rows.\n * @csspart row - Every body row.\n * @csspart row-even - Body rows with an even index (0-based).\n * @csspart row-odd - Body rows with an odd index.\n * @csspart row-loading - Body rows whose `dataSource` page hasn't loaded yet, or failed.\n * @csspart row-pinned - Every row from `pinnedRows`, on either side. Also has `row`, but no `row-even`/`row-odd`.\n * @csspart row-pinned-top - The rows pinned below the header.\n * @csspart row-pinned-bottom - The rows pinned to the bottom.\n * @csspart cell-pinned-row - Every cell of a pinned row (next to `cell`).\n * @csspart cell - Every body cell.\n * @csspart cell-sorted - Body cells in the sorted column.\n * @csspart cell-pinned - Body cells in a pinned column, on either side.\n * @csspart cell-pinned-edge - The pinned body cell next to the scrolling columns (one per pinned side).\n * @csspart skeleton - The placeholder bar in each cell of a row that is still loading.\n * @csspart skeleton-error - Added to `skeleton` in a row whose page failed to load.\n * @csspart retry - The Retry button in the first cell of a failed page's first visible row.\n * @csspart empty - The empty-state container.\n *\n * @cssprop [--argus-bg=Canvas] - Background of the table and rows.\n * @cssprop [--argus-fg=CanvasText] - Text colour.\n * @cssprop [--argus-font=inherit] - Font shorthand for the table.\n * @cssprop [--argus-header-bg] - Header background.\n * @cssprop [--argus-header-fg=inherit] - Header text colour.\n * @cssprop [--argus-border-color] - Colour of the row borders.\n * @cssprop [--argus-border-width=1px] - Width of the row borders.\n * @cssprop [--argus-outline=none] - Border around the whole table, as a `border` shorthand (`1px solid …`). Inside the element's size.\n * @cssprop [--argus-radius=0] - Corner radius of the table. Header, rows and pinned columns are clipped to it.\n * @cssprop [--argus-row-height] - Height of a row. Default per density: 32px, 40px, 52px.\n * @cssprop [--argus-cell-padding-inline] - Inline padding of cells. Default per density: 8px, 12px, 16px.\n * @cssprop [--argus-row-stripe-bg] - Background of odd rows. Default: no stripes.\n * @cssprop [--argus-pinned-shadow] - Shadow on the pinned edge, as a `box-shadow` falling toward the end side (`4px 0 6px -4px …`). Mirrored for the end edge and in RTL; `none` removes it.\n * @cssprop [--argus-resize-handle-color] - Colour of the resize handle's line, shown on hover, focus and drag.\n * @cssprop [--argus-focus-ring=2px solid Highlight] - Outline of the focused header or cell.\n * @cssprop [--argus-drop-indicator-color=Highlight] - Colour of the line that marks where a dragged column would land.\n * @cssprop [--argus-row-hover-bg] - Background of the hovered row. Default: no change.\n * @cssprop [--argus-pinned-row-bg=var(--argus-bg)] - Background of the pinned rows, pinned columns included.\n * @cssprop [--argus-skeleton-bg] - Colour of the skeleton bars in rows still loading. Default: the text colour at low opacity.\n * @cssprop [--argus-row-selected-bg] - Reserved for row selection, which comes after v0.1. The table doesn't read it yet.\n */\n@customElement('argus-table')\nexport class ArgusTable<T = unknown> extends LitElement {\n static override styles: CSSResultGroup = baseStyles;\n\n /**\n * Column definitions. Property only: functions can't be attributes. While empty,\n * the table reads its `<argus-column>` children instead. `null` or `undefined`\n * means `[]`.\n */\n @property({ attribute: false })\n get columns(): readonly ColumnDef<T>[] {\n return this.#columnsProp;\n }\n set columns(value: readonly ColumnDef<T>[] | null | undefined) {\n // Framework bindings set `undefined` when a prop goes away.\n this.#columnsProp = value ?? [];\n }\n\n /**\n * The rows to show. Replace the array to update; changes inside it aren't\n * detected. `null` or `undefined` means `[]`.\n */\n @property({ attribute: false })\n get data(): readonly T[] {\n return this.#dataProp;\n }\n set data(value: readonly T[] | null | undefined) {\n this.#dataProp = value ?? [];\n }\n\n /**\n * Loads rows page by page as they scroll into view, instead of `data`:\n * `{ getRows({ start, end, sorting, signal }), pageSize? }`, where `end` is\n * exclusive and `getRows` resolves to `{ rows, total? }`. Without a `total`,\n * the table grows as pages arrive and a short page marks the end. Sorting\n * happens on the server: a new order reloads from the top. While set, it wins\n * over `data`. Replace the object to change `getRows` or `pageSize`.\n */\n @property({ attribute: false })\n dataSource?: DataSource<T>;\n\n /**\n * Rows fixed below the header (`top`) and at the bottom of the view (`bottom`),\n * such as a totals row: `{ top?: T[], bottom?: T[] }`. They are separate\n * objects, not rows of `data`: columns read them the same way, but they are\n * never sorted and work the same with a `dataSource`. A `cell` function gets\n * `pinned: 'top' | 'bottom'` in its context. Replace the object to update.\n */\n @property({ attribute: false })\n pinnedRows?: PinnedRows<T>;\n\n /** Returns a stable id for a row. Default: the row's index (in `data`, or among all `dataSource` rows). */\n @property({ attribute: false })\n getRowId?: (row: T, index: number) => string;\n\n /** Row height in px. Unset: the density (or the `--argus-row-height` token) decides. */\n @property({ attribute: 'row-height', type: Number })\n rowHeight?: number;\n\n /** Row density: `compact`, `comfortable` or `spacious`. */\n @property({ reflect: true })\n density: Density = 'comfortable';\n\n /** Rows rendered above and below the visible ones. `null` or `undefined` means the default, 6. */\n @property({ type: Number })\n get overscan(): number {\n return this.#overscan;\n }\n set overscan(value: number | null | undefined) {\n this.#overscan = value ?? 6;\n }\n\n /**\n * The sort order, e.g. `[{ id: 'total', desc: true }]`; `[]` when unsorted. Unset,\n * the table keeps it itself and header clicks change it. Once set, it is\n * controlled: a click only fires `argus-sort-change` with the proposed order,\n * and nothing changes until you set the property. Set `undefined` to hand it back.\n */\n @property({ attribute: false })\n get sorting(): SortState {\n return this.#sorting.value;\n }\n set sorting(value: SortState | undefined) {\n // Lit wraps this accessor and requests the update with the old value.\n this.#sorting.set(value);\n }\n\n /**\n * Resized widths in px by column id, e.g. `{ name: 240 }`. A resized flex column\n * becomes fixed. Uncontrolled until set, like `sorting`: once set, a resize only\n * fires `argus-column-resize` with the proposed widths. `undefined` hands it back.\n */\n @property({ attribute: false })\n get columnSizing(): ColumnSizingState {\n return this.#sizing.value;\n }\n set columnSizing(value: ColumnSizingState | undefined) {\n this.#sizing.set(value);\n }\n\n /**\n * The column order: column ids as the table shows them, e.g.\n * `['id', 'total', 'customer']`. `[]` (the default) keeps the order of `columns`.\n * Each pin group (start-pinned, scrolling, end-pinned) takes its columns in this\n * order; unknown ids are ignored and columns it doesn't list follow the listed\n * ones of their group. After a move it holds every column id. Uncontrolled\n * until set, like `sorting`: once set, a move only fires `argus-column-reorder`\n * with the proposed order. `undefined` hands it back.\n */\n @property({ attribute: false })\n get columnOrder(): ColumnOrderState {\n return this.#order.value;\n }\n set columnOrder(value: ColumnOrderState | undefined) {\n this.#order.set(value);\n }\n\n #columnsProp: readonly ColumnDef<T>[] = [];\n #dataProp: readonly T[] = [];\n #overscan = 6;\n readonly #sorting = controllable<SortState>([]);\n readonly #sizing = controllable<ColumnSizingState>({});\n readonly #order = controllable<ColumnOrderState>([]);\n /** Moves the table applied itself, by column; their events fire once the update is done. */\n readonly #appliedReorders = new Map<string, ColumnReorderDetail>();\n /** The header being dragged to a new position, if any. */\n #drag: HeaderDrag | undefined;\n /** A move from the keyboard, announced once it has rendered: the column and its old position. */\n #announceMove: { id: string; from: number } | undefined;\n /** Resizes the table applied itself, by column; their events fire once the update is done. */\n readonly #appliedResizes = new Map<string, ColumnResizeDetail>();\n /** Measured widths of `width: 'auto'` columns. */\n readonly #autoWidths = new AutoWidths(() => {\n this.requestUpdate();\n });\n /** The auto widths last passed to the model; a change re-measures the pinned columns' offsets. */\n #pushedAutoWidths: ColumnSizingState | undefined;\n #autoWidthsChanged = false;\n /** A sort the table applied itself; its event fires once the update is done. */\n #appliedSort: SortState | undefined;\n readonly #internals = attachGridInternals(this);\n readonly #table = new TableController<T>();\n readonly #children = new ColumnChildrenController<T>(this);\n /** The columns last passed to the model: `columns`, or the `<argus-column>` children. */\n #columns: readonly ColumnDef<T>[] = [];\n #columnsChanged = false;\n #warnedColumns = false;\n /** End of the light-DOM part holding cell content, so later children stay outside it. */\n #contentEnd: Comment | undefined;\n readonly #data = new DataController<T>(this);\n /** Scroll back to the top after the update (a new sort order for a data source). */\n #scrollToTop = false;\n // Looked up lazily: the virtualizer's hostUpdated runs before firstUpdated.\n readonly #virtual = new VirtualController(this, () =>\n this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]'),\n );\n readonly #pinScroll = new PinScrollController(this, () =>\n this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]'),\n );\n #rowPx = 40;\n #probeObserver?: ResizeObserver;\n #window: VirtualWindow = { rows: [], totalSize: 0, range: null };\n #active: Active | undefined;\n /** Move focus to the active cell after the next update (keyboard navigation). */\n #focusPending = false;\n #lastRange = '';\n #unwatchMaxHeight: (() => void) | undefined;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute('role')) this.setAttribute('role', 'grid');\n if (this.hasUpdated) this.#observeProbe();\n // A zoom change changes the tallest body the engine renders.\n this.#unwatchMaxHeight = watchMaxElementHeight(() => {\n this.requestUpdate();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#probeObserver?.disconnect();\n this.#unwatchMaxHeight?.();\n this.#unwatchMaxHeight = undefined;\n }\n\n /**\n * `columns` when it has any, otherwise the `<argus-column>` children. Keeps its\n * identity while neither changes, so the model is only rebuilt on a change.\n */\n #effectiveColumns(): readonly ColumnDef<T>[] {\n if (this.columns.length === 0) return this.#children.defs;\n if (!this.#warnedColumns && this.#children.present) {\n this.#warnedColumns = true;\n console.warn(\n 'argus-table: the columns property is set, so <argus-column> children are ignored.',\n );\n }\n return this.columns;\n }\n\n /**\n * The node the light-DOM content is rendered before. Lit's part then ends there,\n * so children appended later (an `<argus-column>`) never land inside it. If the\n * marker was removed (say by `innerHTML`), a new one starts a fresh part.\n */\n #lightDomEnd(): Comment {\n if (this.#contentEnd?.parentNode !== this) {\n this.#contentEnd = document.createComment('');\n this.append(this.#contentEnd);\n }\n return this.#contentEnd;\n }\n\n /**\n * With a `dataSource`, drops every loaded page and loads the rows in view\n * again, keeping the scroll position. With `data`, re-renders the cells (after\n * changing row objects in place). Resolves once the table has re-rendered;\n * reloaded rows arrive as their pages load.\n */\n async refresh(): Promise<void> {\n this.#data.refresh();\n this.requestUpdate();\n await this.updateComplete;\n }\n\n /**\n * Fits columns to their content: the header, the pinned rows and the body rows\n * rendered now (rows out of view aren't measured). It resizes them like a drag\n * would, so `argus-column-resize` fires for each column that changes, and with a\n * controlled `columnSizing` nothing changes until you set it. Without `ids`, fits\n * every resizable column; columns with `resizable: false` keep their width.\n * Resolves once the table has re-rendered.\n */\n async autosizeColumns(ids?: readonly string[]): Promise<void> {\n await this.updateComplete;\n const targets = this.#table.model.columns\n .filter((c) => c.resizable && (ids === undefined || ids.includes(c.id)))\n .map((c) => c.id);\n this.#requestResizes(measureColumns(this.renderRoot, targets));\n await this.updateComplete;\n }\n\n /** Scrolls so that the row at `index` (in the current row order) is at the top. */\n async scrollToRow(index: number): Promise<void> {\n await this.updateComplete;\n this.#virtual.scrollToIndex(index);\n await this.updateComplete;\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n const columns = this.#effectiveColumns();\n this.#columnsChanged = columns !== this.#columns;\n this.#columns = columns;\n if (changed.has('dataSource') || changed.has('sorting') || changed.has('getRowId')) {\n this.#data.configure({\n source: this.dataSource,\n sorting: this.#sorting.value,\n getRowId: this.getRowId,\n });\n // A new order starts over from the first row, so show it.\n if (this.dataSource && this.hasUpdated && changed.has('sorting')) {\n this.#scrollToTop = !changed.has('dataSource');\n }\n }\n if (\n this.#columnsChanged ||\n changed.has('data') ||\n changed.has('getRowId') ||\n changed.has('sorting') ||\n changed.has('columnSizing') ||\n changed.has('columnOrder') ||\n changed.has('pinnedRows')\n ) {\n if (this.#columnsChanged) {\n this.#autoWidths.sync(columns.filter((c) => c.width === 'auto').map((c) => c.id));\n }\n this.#table.update({\n columns,\n data: this.data,\n getRowId: this.getRowId,\n sorting: this.#sorting.value,\n columnSizing: this.#sizing.value,\n columnOrder: this.#order.value,\n pinnedRows: this.pinnedRows,\n });\n }\n // A new page cache (new source, sort order or refresh) or none, and new measured widths.\n const autoWidths = this.#autoWidths.widths;\n this.#autoWidthsChanged = autoWidths !== this.#pushedAutoWidths;\n this.#pushedAutoWidths = autoWidths;\n this.#table.update({ remote: this.#data.rows, autoWidths });\n const model = this.#table.model;\n this.#reconcileActive(model);\n const active = this.#active;\n // -1 tells assistive tech the total is unknown (a data source still growing).\n const unknownTotal = this.#data.rows?.totalKnown === false;\n const layout = layoutOf(model);\n this.#internals.ariaRowCount = unknownTotal ? '-1' : String(layout.total);\n this.#internals.ariaColCount = String(model.columns.length);\n // The header and pinned rows scroll with the body, one row each.\n const extra = (1 + layout.top + layout.bottom) * this.#rowPx;\n this.#virtual.configure({\n count: model.rowCount,\n rowHeight: this.#rowPx,\n cap: bodyCap(model.rowCount * this.#rowPx, extra),\n overscan: Math.max(0, this.overscan),\n rowIdAt: (index) => this.#rowId(model, index),\n // The active body row stays rendered, so the tab stop and focus survive scrolling.\n keep:\n active?.section !== 'body' || active.rowId === undefined\n ? undefined\n : { id: active.rowId, index: active.index },\n });\n }\n\n protected override render(): TemplateResult {\n const model = this.#table.model;\n const columns = model.columns;\n this.#window = this.#virtual.computeWindow();\n const pinnedWidth = (side: 'start' | 'end') =>\n columns.reduce((sum, c) => (c.pin === side ? sum + c.width : sum), 0);\n const pinned = (side: 'start' | 'end') => `${String(pinnedWidth(side))}px`;\n const layout = layoutOf(model);\n const style: Record<string, string> = {\n '--_cols': columns.map(track).join(' '),\n '--_width': `${String(model.totalWidth)}px`,\n '--_pin-start': pinned('start'),\n '--_pin-end': pinned('end'),\n '--_pin-top-rows': String(layout.top),\n '--_pin-bottom-rows': String(layout.bottom),\n };\n const active = this.#active;\n const activeIn = (section: GridRow['section']): ActiveCell | undefined =>\n active?.section === section ? { index: active.index, col: active.col } : undefined;\n const firstIndex = (section: GridRow['section']) => layout.ariaRowIndex({ section, index: 0 });\n if (this.rowHeight !== undefined && this.rowHeight > 0) {\n style['--_row-height'] = `${String(this.rowHeight)}px`;\n }\n return html`<div\n part=\"table\"\n role=\"presentation\"\n style=${styleMap(style)}\n ?data-dragging=${this.#drag !== undefined}\n @keydown=${this.#onKeydown}\n @focusin=${this.#onFocusin}\n @click=${this.#onClick}\n >\n ${renderHeader(columns, this.#headerHandlers, activeIn('header')?.col, this.#drag)}\n ${renderPinnedRows('top', layout.top, columns, firstIndex('top'), activeIn('top'))}\n ${\n model.rowCount === 0\n ? html`<div part=\"empty\"><slot name=\"empty\">No rows</slot></div>`\n : renderBody(\n this.#window.rows,\n columns,\n this.#window.totalSize,\n activeIn('body'),\n firstIndex('body'),\n this.#loading(),\n )\n }\n ${renderPinnedRows('bottom', layout.bottom, columns, firstIndex('bottom'), activeIn('bottom'))}\n <div class=\"probe\" aria-hidden=\"true\"></div>\n </div>\n ${pinShadow('start', pinnedWidth('start'), layout.total - 1, this.#rowPx)}\n ${pinShadow('end', pinnedWidth('end'), layout.total - 1, this.#rowPx)}`;\n }\n\n protected override firstUpdated(): void {\n this.#observeProbe();\n this.#measureRowHeight();\n }\n\n protected override updated(changed: PropertyValues<this>): void {\n const model = this.#table.model;\n renderLightDom(this, model, this.#window.rows, this.#lightDomEnd());\n this.#measureAutoWidths(model);\n if (this.#scrollToTop) {\n this.#scrollToTop = false;\n const scroller = this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]');\n if (scroller) scroller.scrollTop = 0;\n }\n if (\n this.#columnsChanged ||\n changed.has('columnSizing') ||\n changed.has('columnOrder') ||\n this.#autoWidthsChanged\n ) {\n this.#pinScroll.measure();\n }\n if (this.#focusPending) {\n this.#focusPending = false;\n this.#focusActive();\n }\n if (changed.has('density') || changed.has('rowHeight')) this.#measureRowHeight();\n if (this.#appliedResizes.size > 0) {\n const details = [...this.#appliedResizes.values()];\n this.#appliedResizes.clear();\n for (const detail of details) fire(this, COLUMN_RESIZE, detail);\n }\n if (this.#announceMove) {\n this.#announceMoved(model, this.#announceMove);\n this.#announceMove = undefined;\n }\n if (this.#appliedReorders.size > 0) {\n const details = [...this.#appliedReorders.values()];\n this.#appliedReorders.clear();\n for (const detail of details) fire(this, COLUMN_REORDER, detail);\n }\n if (this.#appliedSort) {\n const sorting = this.#appliedSort;\n this.#appliedSort = undefined;\n fire(this, SORT_CHANGE, { sorting });\n }\n const { range } = this.#window;\n const key = range ? `${String(range.start)}:${String(range.end)}` : '';\n if (range && key !== this.#lastRange) {\n this.#lastRange = key;\n fire(this, RANGE_CHANGE, { start: range.start, end: range.end });\n }\n if (range) {\n // The rendered rows: visible plus overscan, end exclusive.\n const over = Math.max(0, this.overscan);\n this.#data.request(Math.max(0, range.start - over), range.end + 1 + over);\n }\n for (const detail of this.#data.takeErrors()) fire(this, LOAD_ERROR, detail);\n }\n\n /**\n * Measures the `width: 'auto'` columns once loaded body rows render, or right\n * away when there are no rows (the header and pinned rows only). While a data\n * source's first rows load, they keep the default width. A changed width\n * renders once more.\n */\n #measureAutoWidths(model: TableModel<T, CellContent>): void {\n const loaded = this.#window.rows.some((r) => model.rowAt(r.index) !== undefined);\n if (!loaded && model.rowCount > 0) return;\n if (this.#autoWidths.measure(this.renderRoot, model.columns, loaded)) this.requestUpdate();\n }\n\n /**\n * Loading state for the body while a data source is set: the state of each\n * row, and a Retry button on the first visible row of each failed page.\n */\n #loading(): Loading | undefined {\n const cache = this.#data.rows;\n if (!cache) return undefined;\n const top = this.#window.range?.start ?? 0;\n const firstByPage = new Map<number, number>();\n for (const { index } of this.#window.rows) {\n if (index < top || cache.stateAt(index) !== 'error') continue;\n const page = cache.pageOf(index);\n const first = firstByPage.get(page);\n if (first === undefined || index < first) firstByPage.set(page, index);\n }\n const retry = new Map<number, string>();\n for (const [page, index] of firstByPage) {\n const start = page * cache.pageSize;\n const end = Math.min(start + cache.pageSize, cache.rowCount);\n retry.set(index, `Retry loading rows ${String(start + 1)} to ${String(end)}`);\n }\n return { stateAt: (index) => cache.stateAt(index), retry, onRetry: this.#onRetry };\n }\n\n readonly #onRetry = (event: Event) => {\n const button = event.currentTarget as HTMLElement;\n // The button goes away with the retry; keep focus in the grid, on its cell.\n if (button.matches(':focus')) button.parentElement?.focus({ preventScroll: true });\n this.#data.retry(Number(button.dataset.row));\n };\n\n /**\n * A row's id. A data source row that hasn't loaded gets a stand-in: the\n * active cell's row id if it sits there (so its DOM and focus stay put), else\n * the index, which is also its real id when there is no `getRowId`.\n */\n #rowId(model: TableModel<T, CellContent>, index: number): string {\n const id = model.rowAt(index)?.id;\n if (id !== undefined) return id;\n const active = this.#active;\n if (active?.index === index && active.rowId !== undefined) return active.rowId;\n return this.#placeholderId(index);\n }\n\n /** The id of an unloaded row: its index, or a reserved string if `getRowId` makes the ids. */\n #placeholderId(index: number): string {\n return this.getRowId ? `\\u0000${String(index)}` : String(index);\n }\n\n readonly #headerHandlers = {\n click: (event: MouseEvent) => {\n const id = sortColumnOf(event);\n if (id !== undefined) this.#requestSort(id);\n },\n pointerdown: (event: PointerEvent) => {\n if (event.button !== 0) return;\n const handle = event.composedPath()[0];\n if (!(handle instanceof HTMLElement)) return;\n const id = handle.dataset.resizeCol;\n const cell = handle.parentElement;\n if (id !== undefined && cell) {\n startResizeDrag(\n handle,\n event,\n cell.getBoundingClientRect().width,\n this.#direction(),\n (w) => {\n this.#requestResize(id, w);\n },\n );\n return;\n }\n this.#startReorder(event);\n },\n /** A double-click on a resize handle fits the column to its rendered content. */\n dblclick: (event: MouseEvent) => {\n const handle = event.composedPath()[0];\n const id = handle instanceof HTMLElement ? handle.dataset.resizeCol : undefined;\n if (id === undefined) return;\n this.#requestResizes(measureColumns(this.renderRoot, [id]));\n },\n };\n\n /**\n * Keys on a focused cell or header: arrows by cell, Home/End along the row,\n * PageUp/PageDown by a page of rows (the view scrolls with it), Ctrl+Home/End\n * (or Cmd) to the first header and the last cell. Keys from content inside a\n * cell (an input, a button) are left to that content.\n */\n readonly #onKeydown = (event: KeyboardEvent) => {\n const cell = gridCell(event.composedPath()[0] ?? event.target ?? this);\n const id = cell?.dataset.col;\n if (!cell || id === undefined) return;\n const scroller = event.currentTarget as HTMLElement;\n if (event.key === 'Tab' && event.shiftKey) {\n // Firefox makes the scroll container a tab stop, so Shift+Tab would stop\n // on it before leaving the grid. Take it out of the tab order for this\n // one move only: a tabindex there for good would expose it as a node of\n // its own between the grid and its rows.\n scroller.tabIndex = -1;\n // Put it back once focus has actually moved (a timer can run first).\n cell.addEventListener(\n 'focusout',\n () => {\n scroller.removeAttribute('tabindex');\n },\n { once: true },\n );\n return;\n }\n const inHeader = cell.getAttribute('role') === 'columnheader';\n const { key } = event;\n const arrow = key === 'ArrowLeft' || key === 'ArrowRight';\n if (inHeader && arrow && event.altKey && event.shiftKey) {\n event.preventDefault();\n // Logical: the arrow pointing toward the inline end moves the column that way.\n const towardEnd = (key === 'ArrowRight') === (this.#direction() === 1);\n this.#moveByKey(id, towardEnd ? 1 : -1);\n return;\n }\n if (inHeader && event.altKey && arrow) {\n event.preventDefault();\n // Logical: the arrow pointing toward the inline end grows the column.\n const towardEnd = (key === 'ArrowRight') === (this.#direction() === 1);\n this.#requestResize(\n id,\n this.#currentWidth(id, cell) + (towardEnd ? RESIZE_STEP : -RESIZE_STEP),\n );\n return;\n }\n if (inHeader && (key === 'Enter' || key === ' ') && cell.dataset.sortCol !== undefined) {\n event.preventDefault();\n this.#requestSort(id);\n return;\n }\n // Ctrl (Cmd on macOS) only goes with Home and End: to the corners.\n const corner = event.ctrlKey || event.metaKey;\n if (event.altKey || event.shiftKey || (corner && key !== 'Home' && key !== 'End')) return;\n const model = this.#table.model;\n const layout = layoutOf(model);\n const from = inHeader ? HEADER : gridRowOf(cell.parentElement, layout);\n if (!from) return;\n if (!inHeader && key === 'Enter') {\n // Enter on a body cell does what a click does; on a failed row, it retries.\n event.preventDefault();\n if (from.section === 'body' && this.#data.stateAt(from.index) === 'error') {\n this.#data.retry(from.index);\n } else {\n this.#activate(event.composedPath());\n }\n return;\n }\n const columns = model.columns;\n // Rows step by grid position: header, pinned top, body, pinned bottom.\n let pos = layout.position(from);\n const last = layout.total - 1;\n const bodyFirst = layout.position({ section: 'body', index: 0 });\n const bodyLast = bodyFirst + layout.body - 1;\n // Whole rows between the sticky header and pinned rows (each one row tall).\n const fit = Math.floor(scroller.clientHeight / this.#rowPx + 0.01);\n const page = Math.max(1, fit - 1 - layout.top - layout.bottom);\n let col = columns.findIndex((c) => c.id === id);\n switch (key) {\n case 'PageDown':\n // Pages through the body: from above it, a page into it; it stops at its last row.\n if (layout.body > 0 && pos <= bodyLast) {\n pos = Math.min(Math.max(pos, bodyFirst - 1) + page, bodyLast);\n }\n break;\n case 'PageUp':\n // Stays in the body; ArrowUp or Ctrl+Home goes on to the rows above it.\n if (layout.body > 0 && pos > bodyFirst) {\n pos = Math.max(Math.min(pos, bodyLast + 1) - page, bodyFirst);\n }\n break;\n case 'ArrowDown':\n pos = Math.min(pos + 1, last);\n break;\n case 'ArrowUp':\n pos = Math.max(pos - 1, 0);\n break;\n case 'ArrowRight':\n col += this.#direction();\n break;\n case 'ArrowLeft':\n col -= this.#direction();\n break;\n case 'Home':\n col = 0;\n if (corner) {\n pos = 0;\n scroller.scrollTop = 0;\n }\n break;\n case 'End':\n col = columns.length - 1;\n if (corner) pos = last;\n break;\n default:\n return;\n }\n event.preventDefault();\n const row = layout.at(pos) ?? HEADER;\n // PageUp/PageDown scroll by as many rows as focus moved, so the focused cell\n // keeps its place on screen. The ends clamp; focusing scrolls the rest of\n // the way. Through the virtualizer: a scaled body's px aren't rows.\n if (key.startsWith('Page') && from.section === 'body' && row.section === 'body') {\n this.#virtual.scrollBy((row.index - from.index) * this.#rowPx);\n }\n // Ctrl+End onto a bottom pinned row: show the end of the body too, as\n // Ctrl+Home shows its start.\n if (corner && key === 'End' && row.section === 'bottom') {\n scroller.scrollTop = scroller.scrollHeight;\n }\n const target = columns[Math.min(Math.max(col, 0), columns.length - 1)];\n if (target) this.#moveTo(row, target.id, model);\n };\n\n /** Focus that lands in a cell (a click, or content inside it) makes that cell active. */\n readonly #onFocusin = (event: FocusEvent) => {\n // Tab into the grid landed on the scroll container (Firefox makes it a tab\n // stop): move on to the grid's one tab stop, the active cell. Only when focus\n // came from outside the grid: coming from inside means the user is leaving,\n // and sending them back would trap the keyboard.\n const scroller = event.currentTarget as HTMLElement;\n if (event.composedPath()[0] === scroller) {\n const from = event.relatedTarget;\n if (!(from instanceof Node && scroller.contains(from))) {\n this.#focusPending = true;\n this.requestUpdate();\n }\n return;\n }\n for (const target of event.composedPath()) {\n const cell = gridCell(target);\n if (cell?.dataset.col !== undefined) {\n const model = this.#table.model;\n const row =\n cell.getAttribute('role') === 'columnheader'\n ? HEADER\n : gridRowOf(cell.parentElement, layoutOf(model));\n const { col } = cell.dataset;\n const prev = this.#active;\n if (\n row &&\n (row.section !== prev?.section || row.index !== prev.index || col !== prev.col)\n ) {\n this.#active = { ...row, rowId: this.#gridRowId(model, row), col };\n this.requestUpdate();\n }\n return;\n }\n if (target === event.currentTarget) return;\n }\n };\n\n /** `argus-cell-click`, then `argus-row-click`, for clicks in the body. */\n readonly #onClick = (event: MouseEvent) => {\n this.#activate(event.composedPath());\n };\n\n /**\n * Fires `argus-cell-click` (when a cell is on the path), then `argus-row-click`,\n * for the body or pinned row on an event path. Clicks and Enter on a cell use\n * it. Rows that haven't loaded and the header fire nothing.\n */\n #activate(path: EventTarget[]): void {\n let columnId: string | undefined;\n for (const target of path) {\n if (!(target instanceof HTMLElement)) continue;\n const role = target.getAttribute('role');\n if (role === 'gridcell') columnId = target.dataset.col;\n if (role !== 'row') continue;\n const model = this.#table.model;\n const at = gridRowOf(target, layoutOf(model));\n if (!at || at.section === 'header') return;\n const { index } = at;\n if (at.section === 'body') {\n const row = model.rowAt(index);\n if (!row) return;\n if (columnId !== undefined) {\n fire(this, CELL_CLICK, {\n row: row.original,\n columnId,\n value: model.valueAt(index, columnId),\n });\n }\n fire(this, ROW_CLICK, { row: row.original, rowId: row.id, index });\n return;\n }\n const pinned = at.section;\n const row = model.pinnedRowAt(pinned, index);\n if (!row) return;\n if (columnId !== undefined) {\n fire(this, CELL_CLICK, {\n row: row.original,\n columnId,\n value: model.pinnedValueAt(pinned, index, columnId),\n pinned,\n });\n }\n fire(this, ROW_CLICK, { row: row.original, rowId: row.id, index, pinned });\n return;\n }\n }\n\n /** The id of a grid row: a body or pinned row's id; none for the header. */\n #gridRowId(model: TableModel<T, CellContent>, row: GridRow): string | undefined {\n switch (row.section) {\n case 'header':\n return undefined;\n case 'body':\n return this.#rowId(model, row.index);\n default:\n return model.pinnedRowAt(row.section, row.index)?.id;\n }\n }\n\n /** Makes a cell active and focuses it after the update. The keep-rendered rule renders its row. */\n #moveTo(row: GridRow, col: string, model: TableModel<T, CellContent>): void {\n this.#active = { ...row, rowId: this.#gridRowId(model, row), col };\n this.#focusPending = true;\n this.requestUpdate();\n }\n\n #focusActive(): void {\n const active = this.#active;\n if (!active) return;\n const col = CSS.escape(active.col);\n // aria-rowindex is unique across the grid: header, pinned and body rows.\n const index = layoutOf(this.#table.model).ariaRowIndex(active);\n const cell = this.renderRoot.querySelector<HTMLElement>(\n `[role='row'][aria-rowindex=\"${String(index)}\"] > [data-col=\"${col}\"]`,\n );\n if (!cell) return;\n cell.focus({ preventScroll: true });\n // A scaled body moves `ratio` px of rows per px scrolled, so the browser can't\n // scroll a body row into view: the virtualizer does, and the next update\n // (from its scroll) shows the row and scrolls sideways.\n if (active.section === 'body' && this.#virtual.scaled) {\n const layout = layoutOf(this.#table.model);\n const before = (1 + layout.top) * this.#rowPx;\n if (this.#virtual.reveal(active.index, before, layout.bottom * this.#rowPx)) {\n this.#focusPending = true;\n return;\n }\n }\n cell.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n /**\n * Keeps the active cell valid after columns or rows change. In the body: on the\n * same row id when it still exists (it may have moved), else at the same\n * index, clamped. A data source row that isn't loaded (yet, or any more) keeps\n * its id. A pinned row stays at its index, clamped to its list. A row whose\n * section has no rows left gives way to the header, the default. If its row\n * went away while the grid had focus, focus follows to the replacement.\n */\n #reconcileActive(model: TableModel<T, CellContent>): void {\n const columns = model.columns;\n const first = columns[0];\n if (!first) {\n this.#active = undefined;\n return;\n }\n const prev = this.#active ?? { ...HEADER, rowId: undefined, col: first.id };\n const col = columns.some((c) => c.id === prev.col) ? prev.col : first.id;\n let { section, index, rowId } = prev;\n let moved = false;\n if (section === 'body' && rowId !== undefined) {\n const found = model.indexOf(rowId);\n const unloaded = index < model.rowCount && model.rowAt(index) === undefined;\n if (found !== undefined) {\n index = found;\n } else if (!unloaded) {\n index = Math.min(index, model.rowCount - 1);\n rowId = index >= 0 ? (model.rowAt(index)?.id ?? this.#placeholderId(index)) : undefined;\n moved = true;\n }\n } else if (section === 'top' || section === 'bottom') {\n const count = model.pinnedCount(section);\n if (index >= count) {\n index = count - 1;\n moved = true;\n }\n rowId = index >= 0 ? model.pinnedRowAt(section, index)?.id : undefined;\n }\n if (index < 0) {\n ({ section, index } = HEADER);\n rowId = undefined;\n }\n if (moved && this.matches(':focus-within')) this.#focusPending = true;\n if (\n section !== prev.section ||\n index !== prev.index ||\n rowId !== prev.rowId ||\n col !== prev.col ||\n !this.#active\n ) {\n this.#active = { section, index, rowId, col };\n }\n }\n\n /**\n * The width a resize starts from: the latest requested width (key presses can\n * come faster than renders), else the model's fixed width, else the rendered\n * width of a flex column.\n */\n #currentWidth(columnId: string, cell: HTMLElement): number {\n const sized = this.#sizing.value[columnId];\n if (sized !== undefined) return sized;\n const view = this.#table.model.columns.find((c) => c.id === columnId);\n return view && view.flex === undefined ? view.width : cell.getBoundingClientRect().width;\n }\n\n #direction(): 1 | -1 {\n return getComputedStyle(this).direction === 'rtl' ? -1 : 1;\n }\n\n /** Sets one column's width (clamped by core), through the controlled/uncontrolled rules. */\n #requestResize(columnId: string, width: number): void {\n this.#requestResizes(new Map([[columnId, width]]));\n }\n\n /**\n * Sets column widths (clamped by core) in one change, through the\n * controlled/uncontrolled rules. One `argus-column-resize` per column that\n * changes, each with the whole new sizing.\n */\n #requestResizes(widths: ReadonlyMap<string, number>): void {\n const model = this.#table.model;\n const old = this.#sizing.value;\n const targets: [string, number][] = [];\n for (const [columnId, width] of widths) {\n const target = model.nextSizing(columnId, width)?.[columnId];\n if (target !== undefined && target !== old[columnId]) targets.push([columnId, target]);\n }\n if (targets.length === 0) return;\n const { value, applied } = this.#sizing.request({ ...old, ...Object.fromEntries(targets) });\n const details = targets.map(([columnId, width]) => ({ columnId, width, sizing: value }));\n if (applied) {\n // Only the latest width per column fires, all with the latest sizing.\n for (const detail of this.#appliedResizes.values()) detail.sizing = value;\n for (const detail of details) this.#appliedResizes.set(detail.columnId, detail);\n this.requestUpdate('columnSizing', old);\n } else {\n for (const detail of details) fire(this, COLUMN_RESIZE, detail);\n }\n }\n\n /**\n * Moves a column to position `to` in the whole order (within its pin group),\n * through the controlled/uncontrolled rules. Starts from the latest requested\n * order, so moves can come faster than renders. `false` if it can't move there.\n */\n #requestReorder(columnId: string, to: number): boolean {\n const old = this.#order.value;\n const next = this.#table.model.nextOrder(columnId, to, old);\n if (!next) return false;\n const { value, applied } = this.#order.request(next);\n if (applied) {\n for (const detail of this.#appliedReorders.values()) detail.order = value;\n this.#appliedReorders.set(columnId, { columnId, order: value });\n this.requestUpdate('columnOrder', old);\n } else {\n fire(this, COLUMN_REORDER, { columnId, order: value });\n }\n return true;\n }\n\n /** Alt+Shift+Arrow on a header: one step toward the start (-1) or the end (1). */\n #moveByKey(columnId: string, step: 1 | -1): void {\n const model = this.#table.model;\n const from = model.orderOf(this.#order.value).indexOf(columnId);\n const view = model.columns.find((c) => c.id === columnId);\n if (from < 0 || !view) return;\n if (!this.#requestReorder(columnId, from + step)) return;\n // The header node moves, which drops its focus: focus it again once rendered.\n this.#focusPending = true;\n this.#announceMove ??= { id: columnId, from: view.colIndex };\n this.requestUpdate();\n }\n\n /** Tells screen readers where a column moved from the keyboard went. */\n #announceMoved(model: TableModel<T, CellContent>, move: { id: string; from: number }): void {\n const view = model.columns.find((c) => c.id === move.id);\n if (!view || view.colIndex === move.from) return;\n const header = this.renderRoot.querySelector(\n `[role='columnheader'][data-col=\"${CSS.escape(move.id)}\"] > slot`,\n );\n const name =\n header instanceof HTMLSlotElement\n ? header\n .assignedNodes({ flatten: true })\n .map((n) => n.textContent)\n .join('')\n .trim()\n : '';\n announce(\n this.ownerDocument,\n `${name || move.id} moved to column ${String(view.colIndex)} of ${String(model.columns.length)}`,\n );\n }\n\n /** A press on a reorderable header: becomes a drag once the pointer moves. */\n #startReorder(down: PointerEvent): void {\n const cell = down\n .composedPath()\n .find(\n (t): t is HTMLElement =>\n t instanceof HTMLElement && t.getAttribute('role') === 'columnheader',\n );\n const columnId = cell?.dataset.moveCol;\n if (!cell || columnId === undefined || !canStartReorder(down, cell)) return;\n const scroller = this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]');\n if (!scroller) return;\n const pin = this.#table.model.columns.find((c) => c.id === columnId)?.pin;\n startReorderDrag(cell, down, {\n scroller,\n targetAt: (x) => dropTarget(this.#dropSlots(pin), columnId, x, this.#direction()),\n scrollArea: () => (pin === undefined ? this.#scrollArea(scroller) : undefined),\n onStart: () => {\n this.#drag = { columnId, target: undefined };\n this.requestUpdate();\n },\n onTarget: (target) => {\n this.#drag = { columnId, target };\n this.requestUpdate();\n },\n onDrop: (target) => {\n this.#drag = undefined;\n if (target && this.#requestReorder(columnId, target.to)) {\n // The header node moves, which drops its focus: focus it again once rendered.\n if (this.matches(':focus-within')) this.#focusPending = true;\n }\n this.requestUpdate();\n },\n onCancel: () => {\n this.#drag = undefined;\n this.requestUpdate();\n },\n });\n }\n\n /** The rendered headers of one pin group, with their positions in the whole order. */\n #dropSlots(pin: ColumnView<T, CellContent>['pin']): DropSlot[] {\n const slots: DropSlot[] = [];\n this.#table.model.columns.forEach((c, index) => {\n if (c.pin !== pin) return;\n const cell = this.renderRoot.querySelector(\n `[role='columnheader'][data-col=\"${CSS.escape(c.id)}\"]`,\n );\n if (cell) slots.push({ id: c.id, index, rect: cell.getBoundingClientRect() });\n });\n return slots;\n }\n\n /** Where the scrolling columns show: the scroller's inside, less the pinned columns. */\n #scrollArea(scroller: HTMLElement): { left: number; right: number } {\n const columns = this.#table.model.columns;\n const width = (side: 'start' | 'end') =>\n columns.reduce((sum, c) => (c.pin === side ? sum + c.width : sum), 0);\n const ltr = this.#direction() === 1;\n const left = scroller.getBoundingClientRect().left + scroller.clientLeft;\n return {\n left: left + width(ltr ? 'start' : 'end'),\n right: left + scroller.clientWidth - width(ltr ? 'end' : 'start'),\n };\n }\n\n /** asc → desc → unsorted, through the controlled/uncontrolled rules. */\n #requestSort(columnId: string): void {\n const next = this.#table.model.nextSorting(columnId);\n if (!next) return;\n const old = this.#sorting.value;\n const { value, applied } = this.#sorting.request(next);\n if (applied) {\n this.#appliedSort = value;\n this.requestUpdate('sorting', old);\n } else {\n fire(this, SORT_CHANGE, { sorting: value });\n }\n }\n\n #observeProbe(): void {\n const probe = this.renderRoot.querySelector('.probe');\n if (!probe) return;\n this.#probeObserver ??= new ResizeObserver(() => {\n this.#measureRowHeight();\n });\n this.#probeObserver.observe(probe);\n }\n\n /** Reads the resolved row height, so themes and density change the virtualizer too. */\n #measureRowHeight(): void {\n const probe = this.renderRoot.querySelector('.probe');\n const px = probe?.getBoundingClientRect().height ?? 0;\n if (px > 0 && Math.abs(px - this.#rowPx) > 0.01) {\n this.#rowPx = px;\n this.requestUpdate();\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'argus-table': ArgusTable;\n }\n}\n"],"ignoreList":[0,1,2,3,4,5,6,7,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,64,65,66,67,68,69,73,74],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"argus-table.js","names":["t","e","s","o","n","r","i","S","c","i","e","h","r","o","n","a","c","l","p","d","u","f","b","y","t","s","t","i","s","e","h","o","n","r","l","c","u","d","f","v","m","p","M","j","s","i","t","e","r","o","t","o","e","t","r","n","t","e","i","o","r","e","n","t","ReactiveElement","templateContent","_decorate","property","customElement","n","i","o","e","r","s","t","memo","o","n","l","c","f","r","s","u","h","i","t","n","o","r","e","s","c","s","t","r","l","p","v","o","i","n","f","e","nothing","styleMap","repeat","nothing","live","e","t","i","AsyncDirective","PartType","nothing","directive","render","repeat","repeat","nothing","live","nothing","repeat","nothing","styleMap","LitElement","_decorate","property","customElement","t$4","e$4","s$4","o$7","n$6","o","t","e","s","r$5","i$6","S$1","n","c$5","i$5","e$3","h$3","r$4","o$6","n$5","a$1","c$4","l$3","p$2","d$2","u$3","i","f$3","b$1","y$1","h","r","t$3","i$4","s$3","e$2","h$2","o$5","n$4","r$3","l$2","c$3","a","u$2","d$1","f$2","v$1","_","m$1","p$1","g","$","y","b","E","C","P","V","N","l","c","u","d","f","x","S","v","I","L","z","H","M$1","R","k","Z","j$1","B","D","s$2","i$3","\"finalized\"","o$4","t$2","o$3","r$2","n$3","t$1","e$1","i$2","o$2","__decorate","target","desc","key","decorators","watchers","watchColumns","host","onChange","unwatchColumns","notify","parent","widthConverter","value","text","match","flagConverter","ArgusColumn","_args","#parent","#children","#def","name","old","template","n$2","i$1","o$1","FILTER_KINDS","pathCache","readPath","keys","path","source","finite","resolveColumns","seen","defs","def","index","minWidth","maxWidth","clamp","px","pin","flex","width","auto","pinnedWidth","base","getValue","accessor","row","groupOf","column","normalizeOrder","byId","columns","listed","groups","id","order","moveColumn","columnId","to","shown","current","visible","pinOf","group","first","last","next","before","functionalUpdate","updater","input","cloneState","proto","copy","makeObjectMap","hasOwn","obj","makeStateUpdater","instance","isPlainContainer","getEnumerableOwnKeys","MAX_STATE_COMPARE_DEPTH","stateSlicesEqual","stateSlicesEqualAtDepth","depth","keysA","keysB","recordA","recordB","setStateSlice","onChangeKey","isEqual","isFunction","flattenBy","flat","recurse","subArr","item","children","getChildren","arr","memo$1","deps","result","onBeforeCompare","newDeps","memoDeps","depArgs","depsChanged","onAfterCompare","onBeforeUpdate","fn","onAfterUpdate","skipFirstRun","hasRun","tableMemo","memoOptions","debugOptions","table","schedule","untrack","getFunctionNameInfo","parentName","fnKey","staticFnName","splitBy","assignTableAPIs","apis","assignPrototypeAPIs","memoKey","args","self","callMemoOrStaticFn","staticFn","cell_getValue","cell","cell_renderValue","cell_getContext","coreCellsFeature","prototype","getColumnPrototype","features","constructColumn","resolvedColumnDef","columnDef","accessorKey","accessorKeyString","accessorFn","originalRow","columnPrototype","initFns","getIsColumnVisible","getVisibleLeafColumns","orderLeafColumns","orderedTable","leafColumns","orderByColumnPinning","items","getColumnId","getItemsByColumnId","getPinnedVisibleLeafColumns","position","expandRowModel","rowModel","autoResetExpanded","autoResetPageIndex","autoResetSorting","autoResetCellSelection","column_getFlatColumns","col","column_getLeafColumns","table_getDefaultColumnDef","props","feature","constructColumns","columnDefs","groupingColumnDef","table_getAllColumns","table_getAllFlatColumns","table_getAllFlatColumnsById","flatColumns","table_getAllLeafColumns","table_getAllLeafColumnsById","table_getColumn","coreColumnsFeature","getHeaderPrototype","constructHeader","headerPrototype","header","options","getMaxHeaderDepth","maxDepth","formatHeaderGroupId","headerFamily","formatHeaderId","childHeaderId","countPendingHeadersForColumn","count","headers","constructHeaderGroup","headerGroup","pendingParentHeaders","headersToGroup","headerToGroup","latestPendingParentHeader","isLeafHeader","isPlaceholder","headerGroupInitFns","headerGroups","updateHeaderSpans","colSpan","j","child","rowSpan","chainChild","buildHeaderGroups","allColumns","bottomHeaders","columnsToGroup","collectLeafHeaders","leafHeaders","header_getLeafHeaders","header_getContext","table_getHeaderGroups","table_getFooterGroups","table_getFlatHeaders","table_getLeafHeaders","topHeaders","coreHeadersFeature","getRowPrototype","constructRow","rowPrototype","rowIndex","original","parentId","subRows","createCoreRowModel","_createCoreRowModel","accessRows","rows","originalRows","parentRow","data","table_getCoreRowModel","table_getPreFilteredRowModel","table_getFilteredRowModel","table_getPreGroupedRowModel","table_getGroupedRowModel","table_getPreSortedRowModel","table_getSortedRowModel","table_getPreExpandedRowModel","table_getExpandedRowModel","table_getPrePaginatedRowModel","table_getPaginatedRowModel","table_getRowModel","coreRowModelsFeature","getCellPrototype","constructCell","cellPrototype","row_getDisplayIndex","displayIndex","table_getRowsInDisplayOrder","row_getValue","row_getUniqueValues","row_renderValue","row_getLeafRows","table_getMaxSubRowDepth","row_getParentRow","row_getParentRows","parentRows","currentRow","row_getAllCells","cache","cells","row_getAllCellsByColumnId","table_getRowId","table_getRow","searchAll","rowId","coreRowsFeature","table_syncExternalStateToBaseAtoms","currentState","externalState","state","capturedState","baseAtom","rawExternalState","compare","table_publishExternalState","table_reset","snap","table_mergeOptions","newOptions","mergedOptions","descriptors","atoms","initialState","table_setOptions","coreFeatures","tableFeatures","atomToStore","store","atom","createReactiveSystem","link","prevDep","sub","dep","nextDep","version","prevSub","newLink","unlink","nextSub","unwatched","propagate","stack","flags","isValidLink","subSubs","checkDirty","checkDepth","dirty","update","subs","shallowPropagate","firstSub","hasMultipleSubs","checkLink","toObserver","isObserver","nextHandler","errorHandler","completionHandler","queuedEffects","cycle","effect","purgeDeps","notifyIndex","queuedEffectsLength","activeSub","batchDepth","batch","flush","depsTail","createAtom","isComputed","valueOrFn","getter","obs","observerOrFn","observed","oldValue","newValue","run","effectObj","shallow","objA","objB","getOwnKeys","getInitialTableState","constructTable","_reactivity","tableOptions","_columnMeta","_filterMeta","_tableMeta","featuresList","atomKey","_atom","wrappedAtom","syncExternal","syncAtomToWrappedSub","syncWrappedToAtomSub","stateKeys","externalAtom","reactiveState","controlledState","controlledValue","snapshot","getDefaultColumnSizingState","getDefaultColumnSizingColumnDef","column_getSize","defaultSizes","columnSizing","columnSize","buildColumnOffsets","starts","afters","sizes","start","size","after","table_getColumnOffsets","toOffsetsKey","column_getStart","column_getAfter","column_resetSize","table_setColumnSizing","rest","columnIds","sumHeaderSize","sum","header_getSize","header_getStart","prevSiblingHeader","table_resetColumnSizing","defaultState","sumColumnSizes","table_getTotalSize","table_getStartTotalSize","table_getCenterTotalSize","table_getEndTotalSize","columnSizingFeature","reSplitAlphaNumeric","constructSortFn","sortFn","dataValueA","rowA","dataValueB","rowB","resolveDataValue","sortFn_alphanumeric","toString","dataValue","compareAlphanumeric","sortFn_text","compareBasic","sortFn_datetime","toDateSortValue","sortFn_basic","ai","bi","aLen","aStr","bLen","bStr","aIsNumeric","isDigit","bIsNumeric","aEnd","findChunkEnd","bEnd","stringComparison","compareStringChunks","numericComparison","compareNumericChunks","countRemainingChunks","charCode","end","str","isNumeric","aLength","aStart","bLength","bStart","minLength","aCode","bCode","aSignificantStart","bSignificantStart","aSignificantLength","bSignificantLength","an","parseSmallInt","bn","getDefaultSortingState","table_setSorting","table_resetSorting","table_autoResetSorting","column_getAutoSortFn","sortFns","firstRows","sortFnName","isString","column_getAutoSortDir","column_getSortFn","column_toggleSorting","nextSortingOrder","column_getNextSortingOrder","multi","column_getCanMultiSort","hasManualValue","existingIndex","existingSorting","newSorting","sortAction","nextDesc","isMultiMode","column_getFirstSortDir","firstSortDirection","isSorted","column_getIsSorted","column_getCanSort","columnSort","column_getSortIndex","column_clearSorting","column_getToggleSortingHandler","canSort","rowSortingFeature","storeReactivityBindings","isEmptyValue","pad","isoDay","date","textOf","DAY","dayOf","day","time","numberOf","setValueOf","op","from","compileFilter","filter","needle","test","values","quickTerms","quickFilter","rowPredicate","tests","filters","except","filterFn","terms","quickColumns","textAt","term","texts","kindOrder","compareSetValues","distinctValues","truncated","keep","limit","valueVersions","valuesChanged","valueVersion","sortedRowModel","sorting","prev","model","sortRows","sortKeys","read","resolve","sortUndefined","sorted","sign","predicates","setRowPredicate","predicate","filteredRowModel","SELECTION_COLUMN_ID","defaultRowId","changedAccessors","selectionView","toTanStack","createTableModel","initial","resolved","tanStackById","views","pinning","hiddenOf","visibility","sizing","sizingState","merged","any","orderable","orderState","rowViews","indexById","ordered","orderedColumns","predicateFor","pinned","side","widthOf","view","sort","resized","colIndex","buildViews","lead","list","center","ends","allViews","buildAllViews","byShownId","shownViews","shownView","reread","pinningChanged","refilter","entry","clamped","hidden","othersShown","RowLayout","top","body","bottom","section","ariaRowIndex","controllable","controlled","sameSelection","ids","toggleRow","mode","selectRange","add","have","idAt","selectAll","clickSelection","modifiers","anchor","RowPool","#size","#pinned","#slots","slot","#free","entries","RowSizes","#count","#estimate","#sum","estimate","#step","highestPowerOfTwo","delta","#buffer","#build","#clear","#delta","#tree","tree","offset","step","ScrollScale","logical","#logical","cap","#cap","#landed","#pivot","total","range","inside","physical","landed","p","pivot","#pivotFor","max","maxVisibleRows","viewHeight","rowHeight","steadyWindow","maxVisible","endIndex","startIndex","overscan","visibleColumns","viewWidth","lo","hi","mid","scrollOffset","maxVisibleColumns","most","columnWindow","PageCache","#getRowId","#rowCount","#totalKnown","#pages","#indexById","page","#failed","pages","#inFlight","asked","#drop","#setCount","known","region","announce","doc","message","measureColumns","wanted","widths","root","AutoWidths","#state","#fontsPending","#requestUpdate","requestUpdate","kept","due","hasLoadedRows","measured","fontsLoading","#remeasureAfterFonts","ColumnChildrenController","#host","#dirty","#defs","ColumnWindowController","#scroller","scroller","#attach","#attached","#onScroll","#resize","#pool","#enabled","enabled","#key","#columns","#scrolling","#pinnedWidth","window","#window","keyOf","rendered","#maxVisible","DataController","#timer","#abortAll","#range","#cache","#config","#reset","moved","#load","errors","#errors","carry","controller","#requests","margin","#fetch","pending","error","response","SETTLE_MS","PinScrollController","shadow","#left","PluginController","#api","api","plugins","#plugins","#sync","plugin","#connected","#disconnect","memo","#memo","#version","output","#guard","sameItems","event","cleanup","hook","RowMeasure","#options","#all","observer","#observer","#onResize","element","#observed","#observe","#read","pinnedChanged","bodyIndex","sizeOf","minimum","fromInteractive","stop","dropTarget","dragged","slots","draggedId","at","direction","THRESHOLD","EDGE","MAX_SPEED","canStartReorder","down","startReorderDrag","startX","startY","dragging","frame","same","tick","area","speed","listeners","move","up","swallowClick","cancel","listen","remove","released","startResizeDrag","onWidth","startWidth","handle","TableController","getMeasurementKey","createLazyMeasurementsView","prop","receiver","opts","isInitial","memoizedFunction","getDeps","notUndefined","msg","approxEqual","debounce","timeoutId","targetWindow","ms","classifyScrollEvent","isScrolling","pendingWrite","elementMax","holdOffset","clampedMaxAtWrite","isAnimating","phase","externalRetiresCommand","kind","command","FLING_WINDOW_MS","flingSpedUp","samples","recent","flingCaught","_isIOSResult","isIOSWebKit","mtp","_iosMomentumOverridesWritesResult","iosMomentumOverridesWrites","momentumOverridesWrites","touchListenerOptions","IosGesture","ownReadBack","external","win","onTouchStart","onTouchEnd","tail","getRect","clientWidth","clientHeight","createFrameQueue","defaultKeyExtractor","defaultRangeExtractor","len","observeElementRect","handler","rect","cb","height","frames","addEventListenerOptions","supportsScrollend","observeOffset","registerScrollendEvent","fallback","readOffset","createHandler","endHandler","observeElementOffset","horizontal","el","isRtl","measureElement","box","cachedSize","elementScroll","_a","adjustedOffset","adjustments","isRtlElement","scrollElement","initialScrollPhase","behavior","atTarget","isSmoothScroll","isAppendWithTrim","nextCount","firstKey","getNextKey","removedKeys","removedCount","prevCount","getPreviousKey","retainedCount","Virtualizer","now","_b","_ro","_frames","delivering","observeQueued","pendingObservations","get","measureEntry","node","cacheKey","cachedNode","opts2","prevOptions","followOnAppend","edgeKeysChanged","measurements","previousItems","prevFirstKey","prevLastKey","anchorDelta","anchorKey","anchorOffset","newMeasurements","idx","getItemKey","anchorItem","newOffset","sync","cached","wasOverscrolled","elementOffset","prevOffset","prevDirection","queued","sample","maxAtWrite","lanes","itemSizeCache","min","need","runningStart","paddingStart","scrollMargin","prevIdx","gap","measuredSize","laneLastIndex","laneEnds","filledLanes","m","cachedLane","lane","shouldCacheLane","laneAssignmentMode","prevIndex","prevInLane","bestLane","bestEnd","bestIdx","outerSize","maxScrollOffset","listEnd","calculateRangeImpl","rangeExtractor","attributeName","indexStr","scrollIndex","bufferSize","minIndex","maxIndex","key2","prevNode","_c","itemStart","itemSize","wasAtEnd","prevTotalSize","defaultShouldAdjust","shouldAdjustScroll","adjustedSync","virtualItems","indexes","measurement","hold","useFlat","findNearestBinarySearch","write","lowMaxes","done","property","style","priority","crossSize","crossSizeBefore","threshold","align","toOffset","maxOffset","toOffset2","initialAlign","offsetInfo","lastIdx","endByLane","val","writtenOffset","targetOffset","STABLE_FRAMES","targetChanged","viewport","distance","keepSmooth","low","high","middle","currentValue","getCurrentValue","findNearestBinarySearchFlat","lastIndex","startIndex2","endIndex2","endPerLane","pos","startPerLane","VirtualizerControllerBase","changed","partial","VirtualizerController","COARSE_BODY","HOLD_MS","VirtualController","#getScrollElement","getScrollElement","#virtual","#element","report","#standIn","#top","#scale","#write","scale","#hold","#dropHold","round","#configureAuto","#heights","#sizes","#order","#rendered","wasScaled","#anchor","reset","#fit","#known","quantum","#quantumFor","#quantum","heights","prune","q","#listen","#unlisten","#listening","#resizeObserver","#holdTimer","#flushHold","#visible","#autoWindow","scaled","shift","rowIdAt","within","edge","RANGE_CHANGE","SORT_CHANGE","COLUMN_RESIZE","COLUMN_REORDER","COLUMN_PIN","COLUMN_HIDE","COLUMN_FILTER","ROW_CLICK","CELL_CLICK","ROW_SELECT","LOAD_ERROR","fire","HEIGHTS","SAFE_HEIGHT","MARGIN","dpr","onResize","listener","maxElementHeight","probe","sticky","filler","held","bodyCap","extra","watchMaxElementHeight","r$1","s$1","u$1","M","h$1","c$1","p$3","v$2","w","toChild","content","formatValue","cellSlot","colSlot","headerSlot","pinnedSlot","cellParts","parts","pinnedRow","ariaSort","cellStyle","place","renderBody","totalSize","renderRow","active","firstRowIndex","loading","selectedAt","checkboxes","inset","selected","retry","retryCol","firstDataColumn","renderCell","activeCol","rowCheckbox","placeholder","tabStop","retryLabel","warned","markDirty","set","renderer","flushContent","renderers","isForeign","ContentDirective","part","#release","#content","#renderer","#target","targetElement","renderLightDom","headerContent","pinnedContent","cellContent","pinnedCell","context","renderHeader","handlers","headerParts","drag","selectAllCheckbox","checkAll","resizeHandle","renderPinnedRows","baseStyles","attachGridInternals","internals","sortColumnOf","RESIZE_STEP","rowHeightConverter","HEADER","layoutOf","gridCell","role","gridRowOf","layout","pinShadow","contentPx","track","ArgusTable","#columnsProp","#dataProp","#overscan","#sorting","#sizing","#pinning","#visibility","#filters","#quickFilter","#selection","#pluginsProp","#appliedFilters","#announceRows","#appliedPins","#appliedHides","#selectionColumn","#selectionColumnChanged","#appliedReorders","#appliedResizes","#measureKeep","#autoWidths","#autoWidthsChanged","#internals","#table","#pluginHost","#columnInfo","info","#requestPin","#requestHide","#requestFilter","#cellTarget","#setSort","#moveTo","#columnsChanged","#warnedColumns","#lightConnected","#data","#scrollToTop","#pinScroll","#columnWindow","#rowPx","#rowsKey","#rowMeasure","#focusPending","#lastRange","#dropScrollTarget","#scrollTarget","#onRetry","button","#headerHandlers","#requestSort","#direction","#requestResize","#startReorder","#requestResizes","#onKeydown","pluginTarget","inHeader","arrow","towardEnd","#moveByKey","#currentWidth","#selectionKey","corner","#activate","#verticalStep","#onFocusin","#active","#gridRowId","#onClick","#mode","#selectableRowOf","inSelectionCell","#clickRow","#checkboxHandlers","#toggleAll","#onMousedown","type","#observeProbe","#lightPart","#unwatchMaxHeight","#probeObserver","#contentEnd","targets","#settled","#restore","scroll","#effectiveColumns","filtersChanged","autoWidths","#pushedAutoWidths","selectionColumn","#reconcileActive","unknownTotal","#pinnedPx","#rowId","#keptColumns","activeIn","firstIndex","#drag","#checkAllOf","#loading","#selectedAt","#measureRowHeight","#lightDomEnd","#measureAutoWidths","#measureRows","#chaseScrollTarget","#focusActive","details","detail","#announceMove","#announceMoved","#announceRowCount","#appliedSort","#appliedSelection","selection","over","loaded","firstByPage","#placeholderId","bodyFirst","bodyLast","#pageRows","fit","#selectAll","#requestSelection","fromId","#anchorAt","#checkAllState","#selectedSet","#checkAll","#selectedIds","applied","#columnInPlaceOf","found","unloaded","all","sized","#requestReorder","#dropSlots","#scrollArea","ltr","left","#applySorting","#columnsById"],"sources":["../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js","../../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/template-content.js","../../src/argus-column.ts","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/style-map.js","../../../core/src/columns/resolve-columns.ts","../../../core/src/columns/column-order.ts","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/columns/constructColumn.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/featureStubs.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/constructHeader.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/buildHeaderGroups.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/rows/constructRow.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/row-models/createCoreRowModel.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/cells/constructCell.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/coreFeatures.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/helpers/tableFeatures.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/reactivity/coreReactivityFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/alien.js","../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/atom.js","../../../../node_modules/.pnpm/@tanstack+store@0.11.2/node_modules/@tanstack/store/dist/shallow.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/core/table/constructTable.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/row-sorting/sortFns.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.utils.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.js","../../../../node_modules/.pnpm/@tanstack+table-core@9.3.1/node_modules/@tanstack/table-core/dist/store-reactivity-bindings.js","../../../core/src/filters/filter.ts","../../../core/src/table/sorted-row-model.ts","../../../core/src/table/filtered-row-model.ts","../../../core/src/table/create-table.ts","../../../core/src/grid/row-layout.ts","../../../core/src/state/controllable.ts","../../../core/src/state/selection.ts","../../../core/src/virtual/row-pool.ts","../../../core/src/virtual/row-sizes.ts","../../../core/src/virtual/scroll-scale.ts","../../../core/src/virtual/steady-window.ts","../../../core/src/virtual/column-window.ts","../../../core/src/data/page-cache.ts","../../src/announce.ts","../../src/controllers/auto-width.ts","../../src/controllers/column-children.ts","../../src/controllers/column-window.ts","../../src/controllers/data-controller.ts","../../src/controllers/pin-scroll-controller.ts","../../src/controllers/plugins.ts","../../src/controllers/row-measure.ts","../../src/interactive.ts","../../src/controllers/reorder-drag.ts","../../src/controllers/resize-drag.ts","../../src/controllers/table-controller.ts","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/utils.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/scroll-classifier.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/ios-gesture.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.19.11/node_modules/@tanstack/virtual-core/dist/esm/index.js","../../../../node_modules/.pnpm/@tanstack+lit-virtual@3.15.3_lit@3.3.3/node_modules/@tanstack/lit-virtual/dist/esm/index.js","../../src/controllers/virtual-controller.ts","../../src/events.ts","../../src/max-height.ts","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive-helpers.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/live.js","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/repeat.js","../../src/render/content.ts","../../src/render/body.ts","../../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/async-directive.js","../../src/render/content-directive.ts","../../src/render/cells.ts","../../src/render/header.ts","../../src/render/pinned-rows.ts","../../src/styles/base.ts","../../src/argus-table.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.3\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{noChange as t}from\"../lit-html.js\";import{directive as r,Directive as e,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=r(class extends e{constructor(t){if(super(t),t.type!==n.CHILD)throw Error(\"templateContent can only be used in child bindings\")}render(r){return this.vt===r?t:(this.vt=r,document.importNode(r.content,!0))}});export{o as templateContent};\n//# sourceMappingURL=template-content.js.map\n","import { html, ReactiveElement, type ComplexAttributeConverter } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { templateContent } from 'lit/directives/template-content.js';\nimport type {\n CellContent,\n CellContext,\n ColumnAlign,\n ColumnDef,\n ColumnPin,\n ColumnWidth,\n FilterKind,\n FilterValue,\n} from './types.js';\n\n/**\n * Tables watching their `<argus-column>` children, by table element. Columns\n * call their parent's entry when they connect, disconnect or change, so the\n * table needs no MutationObserver on its own children (which would fire on\n * every light-DOM cell render while scrolling).\n */\nconst watchers = new WeakMap<Element, () => void>();\n\n/** Calls `onChange` whenever an `<argus-column>` child of `host` is added, removed, moved or changed. */\nexport function watchColumns(host: Element, onChange: () => void): void {\n watchers.set(host, onChange);\n}\n\nexport function unwatchColumns(host: Element): void {\n watchers.delete(host);\n}\n\nfunction notify(parent: Element | null): void {\n if (parent) watchers.get(parent)?.();\n}\n\n/** `width` attribute: `\"90\"` or `\"90px\"` → 90, `\"auto\"`, `\"2fr\"` → `{ flex: 2 }`. */\nconst widthConverter: ComplexAttributeConverter<ColumnWidth | undefined> = {\n fromAttribute(value) {\n if (value === null) return undefined;\n const text = value.trim().toLowerCase();\n if (text === 'auto') return 'auto';\n const match = /^(\\d*\\.?\\d+)(px|fr)?$/.exec(text);\n if (!match) return undefined;\n const n = Number(match[1]);\n return match[2] === 'fr' ? { flex: n } : n;\n },\n};\n\n/**\n * Boolean attribute with a default that may be `true`: absent → unset (the\n * default applies), `\"false\"` → `false`, anything else → `true`.\n */\nconst flagConverter: ComplexAttributeConverter<boolean | undefined> = {\n fromAttribute(value) {\n return value === null ? undefined : value.trim().toLowerCase() !== 'false';\n },\n};\n\n/**\n * One column of the parent `<argus-table>`, written as markup instead of an entry in\n * its `columns` property. It is data only and renders nothing.\n *\n * Only direct children of the table count, in document order. A non-empty `columns`\n * property wins over the children. Adding, removing, moving or changing a column\n * updates the table; sizes, order and sorting are kept by `column-id`.\n *\n * A `<template>` child is the content of every cell in the column (static: the same\n * for each row). Set the `cell` property for content that depends on the row.\n *\n * The standard `hidden` attribute (or property) hides the column, like `hidden` in\n * `columns`; the table's `columnVisibility` overrides it.\n *\n * @summary Declarative column of an `<argus-table>`.\n */\n@customElement('argus-column')\nexport class ArgusColumn<T = unknown> extends ReactiveElement {\n /** Stable key, used in state objects, events and persistence. Must be unique within the table. */\n @property({ attribute: 'column-id' })\n columnId = '';\n\n /** Header content: text as an attribute; a Lit template, a node or a function as a property. */\n @property()\n header?: CellContent | (() => CellContent);\n\n /**\n * How to read the cell value: a property path such as `customer.name`, or (as a\n * property) a function of the row and its index.\n */\n @property()\n accessor?: string | ((row: T, index: number) => unknown);\n\n /**\n * A spreadsheet formula computed per row from other columns, such as\n * `[price] * [quantity]`. Needs the `formulas()` plugin from `@argus-table/formulas`.\n */\n @property()\n formula?: string;\n\n /** Cell content from the row: `(row, context) => content`. Property only; wins over a `<template>` child. */\n @property({ attribute: false })\n cell?: (row: T, context: CellContext<T>) => CellContent;\n\n /** Width: `90` (px), `auto` to fit the content, or `2fr` for a share of the free space. Default: 150 px. */\n @property({ converter: widthConverter })\n width?: ColumnWidth;\n\n /** Lower bound for resizing and for flex columns, in px. Default: 40. */\n @property({ attribute: 'min-width', type: Number })\n minWidth?: number;\n\n /** Upper bound for resizing, in px. Default: no limit. */\n @property({ attribute: 'max-width', type: Number })\n maxWidth?: number;\n\n /** Pins the column to the `start` or `end` side. The table's `columnPinning` overrides it. */\n @property()\n pin?: ColumnPin;\n\n /** Whether the user can pin or unpin the column. Default: `true`; `pinnable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n pinnable?: boolean;\n\n /** Whether the user can hide the column. Default: `true`; `hideable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n hideable?: boolean;\n\n /** Text alignment: `start`, `center` or `end`. Default: `start`. */\n @property()\n align?: ColumnAlign;\n\n /**\n * Wraps the cell text onto more lines instead of cutting it off. Default:\n * `false`. With a fixed row height, text that doesn't fit is clipped.\n */\n @property({ converter: flagConverter })\n wrap?: boolean;\n\n /** Whether the header can be clicked to sort. Default: `false`. */\n @property({ converter: flagConverter })\n sortable?: boolean;\n\n /** Whether the column can be resized. Default: `true`; `resizable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n resizable?: boolean;\n\n /** Whether the column can be moved. Default: `true`; `reorderable=\"false\"` turns it off. */\n @property({ converter: flagConverter })\n reorderable?: boolean;\n\n /**\n * The kind of filter users can set, e.g. from the column menu: `text`, `number`,\n * `date` or `set`. Unset: users can't filter the column.\n */\n @property()\n filter?: FilterKind;\n\n /** Replaces the built-in matching for this column's filter. Property only. */\n @property({ attribute: false })\n filterFn?: ColumnDef<T>['filterFn'];\n\n /** The values a `set` filter offers; needed with a `dataSource`. Property only. */\n @property({ attribute: false })\n filterOptions?: readonly FilterValue[];\n\n #parent: Element | null = null;\n #def: ColumnDef<T> | undefined;\n readonly #children = new MutationObserver(() => {\n this.#def = undefined;\n this.requestUpdate();\n });\n\n /** `hidden` is the standard attribute: it updates the column like its own properties. */\n static override get observedAttributes(): string[] {\n return [...super.observedAttributes, 'hidden'];\n }\n\n override attributeChangedCallback(name: string, old: string | null, value: string | null): void {\n super.attributeChangedCallback(name, old, value);\n if (name === 'hidden') this.requestUpdate();\n }\n\n /** Data only: no shadow root, nothing rendered. */\n protected override createRenderRoot(): HTMLElement {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#children.observe(this, { childList: true });\n this.#parent = this.parentElement;\n notify(this.#parent);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#children.disconnect();\n const parent = this.#parent;\n this.#parent = null;\n notify(parent);\n }\n\n /**\n * The column as the table reads it. Unset fields stay `undefined`, which the\n * table reads as its defaults. An unknown `pin` is ignored and an unknown\n * `align` falls back to `start`.\n */\n toColumnDef(): ColumnDef<T> {\n if (this.#def) return this.#def;\n const template = [...this.children].find((c) => c instanceof HTMLTemplateElement);\n return (this.#def = {\n id: this.columnId,\n header: this.header,\n accessor: this.accessor,\n formula: this.formula,\n cell: this.cell ?? (template && (() => html`${templateContent(template)}`)),\n width: this.width,\n minWidth: this.minWidth,\n maxWidth: this.maxWidth,\n pin: this.pin,\n hidden: this.hasAttribute('hidden'),\n pinnable: this.pinnable,\n hideable: this.hideable,\n align: this.align,\n wrap: this.wrap,\n sortable: this.sortable,\n resizable: this.resizable,\n reorderable: this.reorderable,\n filter: this.filter,\n filterFn: this.filterFn,\n filterOptions: this.filterOptions,\n });\n }\n\n protected override willUpdate(): void {\n this.#def = undefined;\n }\n\n protected override updated(): void {\n notify(this.#parent);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'argus-column': ArgusColumn;\n }\n}\n","import{noChange as t}from\"../lit-html.js\";import{directive as e,Directive as r,PartType as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const n=\"important\",i=\" !\"+n,o=e(class extends r{constructor(t){if(super(t),t.type!==s.ATTRIBUTE||\"style\"!==t.name||t.strings?.length>2)throw Error(\"The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.\")}render(t){return Object.keys(t).reduce((e,r)=>{const s=t[r];return null==s?e:e+`${r=r.includes(\"-\")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,\"-$&\").toLowerCase()}:${s};`},\"\")}update(e,[r]){const{style:s}=e.element;if(void 0===this.ft)return this.ft=new Set(Object.keys(r)),this.render(r);for(const t of this.ft)null==r[t]&&(this.ft.delete(t),t.includes(\"-\")?s.removeProperty(t):s[t]=null);for(const t in r){const e=r[t];if(null!=e){this.ft.add(t);const r=\"string\"==typeof e&&e.endsWith(i);t.includes(\"-\")||r?s.setProperty(t,r?e.slice(0,-11):e,r?n:\"\"):s[t]=e}}return t}});export{o as styleMap};\n//# sourceMappingURL=style-map.js.map\n","import type { ColumnAlign, ColumnDef, ColumnPin, FilterKind } from '../types.js';\n\n/** Width used when a column sets none. */\nexport const DEFAULT_WIDTH = 150;\n/** Lower bound used when a column sets no `minWidth`. */\nexport const DEFAULT_MIN_WIDTH = 40;\n\n/** A column after defaults, bounds and the accessor have been resolved. */\nexport interface ResolvedColumn<TData, TContent> {\n id: string;\n /** Position in the `columns` array. */\n index: number;\n header: ColumnDef<TData, TContent>['header'];\n cell: ColumnDef<TData, TContent>['cell'];\n /** Reads the cell value; returns `undefined` when the column has no accessor. */\n getValue: (row: TData, index: number) => unknown;\n hasAccessor: boolean;\n /** Base width in px. For a flex column this is its minimum track size. */\n width: number;\n /**\n * Share of free space for `{ flex }` columns, otherwise `undefined`. Kept for pinned\n * columns too: the model drops it while the column is pinned (see `pinnedWidth`).\n */\n flex: number | undefined;\n /**\n * Width in px while the column is pinned. Pinned columns need a known width for their\n * sticky offsets, so a flex column pinned (by its definition or by state) gets the\n * default width, within its bounds. Equal to `width` for every other column.\n */\n pinnedWidth: number;\n /** `true` for `width: 'auto'`: the table measures the content and passes the width in. */\n auto: boolean;\n minWidth: number;\n maxWidth: number;\n /** The pin of the definition; `columnPinning` state can override it. */\n pin: ColumnPin | undefined;\n /** Hidden by the definition; `columnVisibility` state can override it. */\n hidden: boolean;\n sortable: boolean;\n resizable: boolean;\n reorderable: boolean;\n pinnable: boolean;\n hideable: boolean;\n /** The kind of filter users can set, or `undefined` when they can't filter the column. */\n filter: FilterKind | undefined;\n filterFn: ColumnDef<TData, TContent>['filterFn'];\n filterOptions: ColumnDef<TData, TContent>['filterOptions'];\n align: ColumnAlign;\n wrap: boolean;\n}\n\nconst FILTER_KINDS: readonly unknown[] = ['text', 'number', 'date', 'set'] satisfies FilterKind[];\n\nconst pathCache = new Map<string, readonly string[]>();\n\n/**\n * Reads a dotted property path such as `'customer.name'`. Returns `undefined`\n * as soon as a step is `null` or `undefined`, like optional chaining.\n */\nexport function readPath(source: unknown, path: string): unknown {\n let keys = pathCache.get(path);\n if (!keys) {\n keys = path.split('.');\n pathCache.set(path, keys);\n }\n let value: unknown = source;\n for (const key of keys) {\n if (value === null || value === undefined) return undefined;\n value = (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\nfunction finite(value: number | undefined): number | undefined {\n return value !== undefined && Number.isFinite(value) ? value : undefined;\n}\n\n/**\n * Normalizes `ColumnDef`s: checks ids, applies defaults and clamps widths.\n *\n * @throws if an id is empty or used twice, because state and events are keyed by id.\n */\nexport function resolveColumns<TData, TContent>(\n defs: readonly ColumnDef<TData, TContent>[],\n): ResolvedColumn<TData, TContent>[] {\n const seen = new Set<string>();\n return defs.map((def, index) => {\n if (typeof def.id !== 'string' || def.id === '') {\n throw new Error(`argus-table: column at index ${String(index)} needs a non-empty string id.`);\n }\n if (seen.has(def.id)) {\n throw new Error(`argus-table: column id '${def.id}' is used more than once.`);\n }\n seen.add(def.id);\n\n const minWidth = Math.max(0, finite(def.minWidth) ?? DEFAULT_MIN_WIDTH);\n const maxWidth = Math.max(minWidth, finite(def.maxWidth) ?? Number.POSITIVE_INFINITY);\n const clamp = (px: number) => Math.min(maxWidth, Math.max(minWidth, px));\n\n const pin = def.pin === 'start' || def.pin === 'end' ? def.pin : undefined;\n const { width } = def;\n const flex =\n typeof width === 'object' && Number.isFinite(width.flex) && width.flex > 0\n ? width.flex\n : undefined;\n const auto = width === 'auto';\n // An auto column shows the default width until it is measured.\n const fixed = typeof width === 'number' ? finite(width) : undefined;\n const pinnedWidth = clamp(fixed ?? DEFAULT_WIDTH);\n const base = flex !== undefined ? minWidth : pinnedWidth;\n\n const { accessor } = def;\n const getValue: ResolvedColumn<TData, TContent>['getValue'] =\n typeof accessor === 'function'\n ? accessor\n : typeof accessor === 'string'\n ? (row) => readPath(row, accessor)\n : () => undefined;\n\n return {\n id: def.id,\n index,\n header: def.header,\n cell: def.cell,\n getValue,\n hasAccessor: accessor !== undefined,\n width: base,\n flex,\n pinnedWidth,\n auto,\n minWidth,\n maxWidth,\n pin,\n hidden: def.hidden === true,\n sortable: def.sortable === true,\n resizable: def.resizable !== false,\n reorderable: def.reorderable !== false,\n pinnable: def.pinnable !== false,\n hideable: def.hideable !== false,\n filter: FILTER_KINDS.includes(def.filter) ? def.filter : undefined,\n filterFn: def.filterFn,\n filterOptions: def.filterOptions,\n align: def.align ?? 'start',\n wrap: def.wrap === true,\n };\n });\n}\n","import type { ColumnOrderState, ColumnPin } from '../types.js';\n\n/** What ordering needs to know about a column. */\nexport interface OrderableColumn {\n id: string;\n pin: ColumnPin | undefined;\n reorderable: boolean;\n}\n\ntype Group = ColumnPin | 'center';\n\nconst groupOf = (column: OrderableColumn): Group => column.pin ?? 'center';\n\n/**\n * The order the table shows: start-pinned, scrolling, end-pinned columns, each\n * group in the sequence of `order`. Unknown and repeated ids are dropped; columns\n * the order doesn't list follow the listed ones of their group, in `columns` order.\n */\nexport function normalizeOrder(\n order: readonly string[],\n columns: readonly OrderableColumn[],\n): ColumnOrderState {\n const byId = new Map(columns.map((c) => [c.id, c]));\n const listed = new Set<string>();\n const groups: Record<Group, string[]> = { start: [], center: [], end: [] };\n for (const id of order) {\n const column = byId.get(id);\n if (!column || listed.has(id)) continue;\n listed.add(id);\n groups[groupOf(column)].push(id);\n }\n for (const column of columns) {\n if (!listed.has(column.id)) groups[groupOf(column)].push(column.id);\n }\n return [...groups.start, ...groups.center, ...groups.end];\n}\n\n/**\n * The order after moving a column to position `to`: 0-based among the columns\n * `shown` accepts (hidden columns don't count), in the order the table shows them,\n * counted after the move. The column lands just before the shown column now at `to`,\n * hidden columns keep their place among the others. `undefined` if the column can't\n * move or isn't shown, `to` is outside the column's group, or nothing changes.\n */\nexport function moveColumn(\n order: readonly string[],\n columns: readonly OrderableColumn[],\n columnId: string,\n to: number,\n shown: (id: string) => boolean = () => true,\n): ColumnOrderState | undefined {\n const column = columns.find((c) => c.id === columnId);\n if (!column?.reorderable || !Number.isInteger(to) || !shown(columnId)) return undefined;\n const current = normalizeOrder(order, columns);\n const visible = current.filter(shown);\n const from = visible.indexOf(columnId);\n if (to === from) return undefined;\n const pinOf = new Map(columns.map((c) => [c.id, groupOf(c)]));\n const group = groupOf(column);\n const first = visible.findIndex((id) => pinOf.get(id) === group);\n const last = visible.findLastIndex((id) => pinOf.get(id) === group);\n if (to < first || to > last) return undefined;\n const next = current.filter((id) => id !== columnId);\n const before = visible.filter((id) => id !== columnId)[to];\n // Before the shown column now at `to`: one of the next group's, at the end of a\n // group, and normalizing puts the column back at the end of its own.\n next.splice(before === undefined ? next.length : next.indexOf(before), 0, columnId);\n return normalizeOrder(next, columns);\n}\n","//#region src/utils.ts\n/**\n* Applies a TanStack updater to a value.\n*\n* If the updater is a function it is called with the previous value; otherwise the updater value is returned directly.\n*/\nfunction functionalUpdate(updater, input) {\n\treturn typeof updater === \"function\" ? updater(input) : updater;\n}\n/**\n* Clones table state values while preserving non-plain objects.\n*\n* Plain objects and arrays are copied recursively so state updates can avoid mutating existing references.\n*/\nfunction cloneState(value) {\n\tif (Array.isArray(value)) return value.map(cloneState);\n\tif (value && typeof value === \"object\") {\n\t\tconst proto = Object.getPrototypeOf(value);\n\t\tif (proto !== Object.prototype && proto !== null) return value;\n\t\tconst copy = proto === null ? makeObjectMap() : {};\n\t\tconst keys = Object.keys(value);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\tObject.defineProperty(copy, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: cloneState(value[key]),\n\t\t\t\twritable: true\n\t\t\t});\n\t\t}\n\t\treturn copy;\n\t}\n\treturn value;\n}\n/**\n* Copies prototype-instance own properties without carrying over lazy memo\n* closures or the per-row cell cache, both of which are bound to the source\n* instance (cached cells reference the source row).\n*/\nfunction copyInstancePropertiesWithoutMemos(target, source) {\n\tconst keys = Object.keys(source);\n\tconst targetRecord = target;\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tif (!key.startsWith(\"_memo_\") && key !== \"_cellsCache\") targetRecord[key] = source[key];\n\t}\n\treturn target;\n}\n/**\n* Creates an object intended only for string-keyed dictionary lookups.\n*\n* The null prototype keeps user-controlled ids such as `__proto__` and\n* `hasOwnProperty` as plain data keys.\n*/\nfunction makeObjectMap() {\n\treturn Object.create(null);\n}\n/**\n* Checks whether an object owns a key, including null-prototype dictionaries.\n*/\nfunction hasOwn(obj, key) {\n\treturn Object.prototype.hasOwnProperty.call(obj, key);\n}\n/**\n* Creates a table state updater for a single state slice.\n*\n* The updater writes through the table base atom for the slice and supports both value and functional updater forms.\n*/\nfunction makeStateUpdater(key, instance) {\n\treturn (updater) => {\n\t\t(instance.options.atoms?.[key] ?? instance.baseAtoms[key]).set((old) => functionalUpdate(updater, old));\n\t};\n}\n/**\n* Checks whether a value is an array or a plain (or null-prototype) object.\n* Class instances, dates, and other exotic values compare by reference only,\n* mirroring the `cloneState` plain-object policy.\n*/\nfunction isPlainContainer(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (Array.isArray(value)) return true;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n/**\n* Returns every enumerable own key, including symbols and non-index array\n* properties. Keeping key presence explicit distinguishes sparse array holes\n* from entries whose value is `undefined`.\n*/\nfunction getEnumerableOwnKeys(value) {\n\treturn Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));\n}\nconst MAX_STATE_COMPARE_DEPTH = 3;\n/**\n* Structurally compares two state slice values as deeply as stock feature\n* state can nest and no deeper.\n*\n* Three container levels cover flat maps and arrays, arrays of state objects,\n* array-valued filter values, and `columnResizing.columnSizingStart` tuples.\n* Deeper containers and non-plain values compare by reference. A `false`\n* result is always safe: the state update simply proceeds.\n*/\nfunction stateSlicesEqual(a, b) {\n\treturn stateSlicesEqualAtDepth(a, b, MAX_STATE_COMPARE_DEPTH);\n}\nfunction stateSlicesEqualAtDepth(a, b, depth) {\n\tif (Object.is(a, b)) return true;\n\tif (depth <= 0 || !isPlainContainer(a) || !isPlainContainer(b)) return false;\n\tif (Array.isArray(a) || Array.isArray(b)) {\n\t\tif (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n\t}\n\tconst keysA = getEnumerableOwnKeys(a);\n\tconst keysB = getEnumerableOwnKeys(b);\n\tif (keysA.length !== keysB.length) return false;\n\tconst recordA = a;\n\tconst recordB = b;\n\tfor (let i = 0; i < keysA.length; i++) {\n\t\tconst key = keysA[i];\n\t\tif (!Object.prototype.propertyIsEnumerable.call(b, key)) return false;\n\t\tif (!stateSlicesEqualAtDepth(recordA[key], recordB[key], depth - 1)) return false;\n\t}\n\treturn true;\n}\n/**\n* Routes a state slice update through the slice's `on<State>Change` handler,\n* preserving the owner's current reference for structural no-ops.\n*\n* Equality is evaluated inside the updater received by the state owner, never\n* against the table's potentially stale controlled snapshot. This keeps\n* same-tick updates composable in queued host containers such as React state,\n* evaluates the original updater only when the owner applies it, and lets atom\n* owners suppress notifications by returning their existing reference.\n*\n* A user-provided change handler is still invoked for a no-op because only that\n* handler's state container can know its latest queued value. The guarded\n* updater returns that container's previous reference, preventing a state write\n* or render in state containers with identity bailout semantics.\n*\n* Hot-path slices that skip guarding entirely (selection maps that scale with\n* row count, pointer-frequency resize state) call their change handler\n* directly instead of routing through this util. Custom feature slices with a\n* cheaper or semantic-aware comparison can pass `isEqual` to override the\n* structural default.\n*/\nfunction setStateSlice(instance, key, updater, isEqual = stateSlicesEqual) {\n\tconst onChangeKey = `on${key.charAt(0).toUpperCase()}${key.slice(1)}Change`;\n\tconst onChange = instance.options[onChangeKey];\n\tif (!onChange) return;\n\tonChange((current) => {\n\t\tconst next = functionalUpdate(updater, current);\n\t\treturn isEqual(current, next) ? current : next;\n\t});\n}\n/**\n* Returns whether a value is a function.\n*/\nfunction isFunction(d) {\n\treturn d instanceof Function;\n}\n/**\n* Flattens a tree of nodes by recursively reading child nodes.\n*\n* The original nodes are preserved in depth-first order.\n*/\nfunction flattenBy(arr, getChildren) {\n\tconst flat = [];\n\tconst recurse = (subArr) => {\n\t\tsubArr.forEach((item) => {\n\t\t\tflat.push(item);\n\t\t\tconst children = getChildren(item);\n\t\t\tif (children.length) recurse(children);\n\t\t});\n\t};\n\trecurse(arr);\n\treturn flat;\n}\n/**\n* Creates a dependency-tracked memoized function for table internals.\n*\n* The memo recomputes only when its dependency tuple changes and can emit debug timing information.\n*/\nconst memo = ({ fn, memoDeps, onAfterCompare, onAfterUpdate, onBeforeCompare, onBeforeUpdate }) => {\n\tlet deps = [];\n\tlet result;\n\tconst memoizedFn = (depArgs) => {\n\t\tonBeforeCompare?.();\n\t\tconst newDeps = memoDeps?.(depArgs);\n\t\tlet depsChanged = !newDeps || newDeps.length !== deps?.length;\n\t\tif (!depsChanged && newDeps) {\n\t\t\tfor (let i = 0; i < newDeps.length; i++) if (newDeps[i] !== deps[i]) {\n\t\t\t\tdepsChanged = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tonAfterCompare?.(depsChanged);\n\t\tif (!depsChanged) return result;\n\t\tdeps = newDeps;\n\t\tonBeforeUpdate?.();\n\t\tresult = fn(...newDeps ?? []);\n\t\tonAfterUpdate?.(result);\n\t\treturn result;\n\t};\n\treturn memoizedFn;\n};\n/**\n* Wraps a callback so that its first invocation is skipped.\n*\n* Row-model `onAfterUpdate` hooks schedule auto-resets when their inputs\n* change. The initial computation of a row model is not a change, so state\n* resets must not fire for it — otherwise merely reading a row model on mount\n* would wipe initial or controlled state.\n*/\nfunction skipFirstRun(fn) {\n\tlet hasRun = false;\n\treturn () => {\n\t\tif (!hasRun) {\n\t\t\thasRun = true;\n\t\t\treturn;\n\t\t}\n\t\tfn();\n\t};\n}\nconst pad = (str, num) => {\n\tstr = String(str);\n\twhile (str.length < num) str = \" \" + str;\n\treturn str;\n};\n/**\n* Creates a table-aware memoized function.\n*\n* This wraps `memo` with table debug options and feature metadata so row models and derived APIs can share consistent diagnostics.\n*/\nfunction tableMemo({ feature, fnName, objectId, onAfterUpdate, table, ...memoOptions }) {\n\tlet startCalcTime;\n\tlet endCalcTime;\n\tlet runCount = 0;\n\tlet debug;\n\tif (process.env.NODE_ENV === \"development\") {\n\t\tconst { debugAll } = table.options;\n\t\tconst { parentName } = getFunctionNameInfo(fnName, \".\");\n\t\tconst debugByParent = table.options[`debug${(parentName != \"table\" ? parentName + \"s\" : parentName).replace(parentName, parentName.charAt(0).toUpperCase() + parentName.slice(1))}`];\n\t\tconst debugByFeature = feature ? table.options[`debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`] : false;\n\t\tdebug = debugAll || debugByParent || debugByFeature;\n\t}\n\tfunction logTime(time, depsChanged) {\n\t\tconst runType = runCount === 0 ? \"(1st run)\" : depsChanged ? \"(rerun #\" + runCount + \")\" : \"(cache)\";\n\t\trunCount++;\n\t\tconsole.groupCollapsed(`%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split(\".\")[0]}Id: ${objectId})` : \"\"}`, `font-size: .6rem; font-weight: bold; ${depsChanged ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);` : \"\"} `, `color: ${runCount < 2 ? \"#FF00FF\" : \"#FF1493\"}`, \"color: #666\", \"color: #87CEEB\");\n\t\tconsole.info({\n\t\t\tfeature,\n\t\t\tstate: table.store.state,\n\t\t\tdeps: memoOptions.memoDeps?.toString()\n\t\t});\n\t\tconsole.trace();\n\t\tconsole.groupEnd();\n\t}\n\tconst onAfterUpdateHandler = onAfterUpdate ? () => {\n\t\tconst { schedule, untrack } = table._reactivity;\n\t\tschedule(() => untrack(() => onAfterUpdate()));\n\t} : void 0;\n\tconst debugOptions = process.env.NODE_ENV === \"development\" ? {\n\t\tonBeforeCompare: () => {},\n\t\tonAfterCompare: (depsChanged) => {},\n\t\tonBeforeUpdate: () => {\n\t\t\tif (debug) startCalcTime = performance.now();\n\t\t},\n\t\tonAfterUpdate: () => {\n\t\t\tif (debug) {\n\t\t\t\tendCalcTime = performance.now();\n\t\t\t\tlogTime(Math.round((endCalcTime - startCalcTime) * 100) / 100, true);\n\t\t\t}\n\t\t\tonAfterUpdateHandler?.();\n\t\t}\n\t} : { onAfterUpdate: onAfterUpdateHandler };\n\treturn memo({\n\t\t...memoOptions,\n\t\t...debugOptions\n\t});\n}\n/**\n* Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n*\n* Splits on the first separator only, so an internal API name such as\n* `table__expandRows` has the `fnKey` `_expandRows`.\n*/\nfunction getFunctionNameInfo(staticFnName, splitBy = \"_\") {\n\tconst [parentName, fnKey] = staticFnName.replace(splitBy, \" \").split(\" \");\n\treturn {\n\t\tfnKey,\n\t\tfnName: `${parentName}.${fnKey}`,\n\t\tparentName\n\t};\n}\n/**\n* Assigns Table API methods directly to the table instance.\n* Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n*/\nfunction assignTableAPIs(feature, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\ttable[fnKey] = memoDeps ? tableMemo({\n\t\t\tmemoDeps,\n\t\t\tfn,\n\t\t\tfnName,\n\t\t\ttable,\n\t\t\tfeature\n\t\t}) : fn;\n\t}\n}\n/**\n* Assigns API methods to a prototype object for memory-efficient method sharing.\n* All instances created with this prototype will share the same method references.\n*\n* For memoized methods, the memo state is lazily created and stored on each instance.\n* This provides the best of both worlds: shared method code + per-instance caching.\n*/\nfunction assignPrototypeAPIs(feature, prototype, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\tif (memoDeps) {\n\t\t\tconst memoKey = `_memo_${fnKey}`;\n\t\t\tprototype[fnKey] = function(...args) {\n\t\t\t\tif (!this[memoKey]) {\n\t\t\t\t\tconst self = this;\n\t\t\t\t\tthis[memoKey] = tableMemo({\n\t\t\t\t\t\tmemoDeps: (depArgs) => memoDeps(self, depArgs),\n\t\t\t\t\t\tfn: (...deps) => fn(self, ...deps),\n\t\t\t\t\t\tfnName,\n\t\t\t\t\t\tobjectId: self.id,\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tfeature\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this[memoKey](...args);\n\t\t\t};\n\t\t} else prototype[fnKey] = function(...args) {\n\t\t\treturn fn(this, ...args);\n\t\t};\n\t}\n}\n/**\n* Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fall back to the static method passed in.\n*/\nfunction callMemoOrStaticFn(obj, fnKey, staticFn, ...args) {\n\treturn obj[fnKey]?.(...args) ?? staticFn(obj, ...args);\n}\n\n//#endregion\nexport { assignPrototypeAPIs, assignTableAPIs, callMemoOrStaticFn, cloneState, copyInstancePropertiesWithoutMemos, flattenBy, functionalUpdate, getFunctionNameInfo, hasOwn, isFunction, makeObjectMap, makeStateUpdater, memo, setStateSlice, skipFirstRun, stateSlicesEqual, tableMemo };","//#region src/core/cells/coreCellsFeature.utils.ts\n/**\n* Reads this cell's accessor value from its owning row and column.\n*\n* This is the standalone implementation behind `cell.getValue()`, useful when\n* importing static APIs instead of calling methods from the cell prototype.\n*\n* @example\n* ```ts\n* const value = cell_getValue(cell)\n* ```\n*/\nfunction cell_getValue(cell) {\n\treturn cell.row.getValue(cell.column.id);\n}\n/**\n* Reads the value that should be rendered for this cell.\n*\n* Nullish accessor values are replaced with `table.options.renderFallbackValue`,\n* matching the behavior of `cell.renderValue()`.\n*\n* @example\n* ```ts\n* const rendered = cell_renderValue(cell)\n* ```\n*/\nfunction cell_renderValue(cell) {\n\treturn cell.getValue() ?? cell.table.options.renderFallbackValue;\n}\n/**\n* Builds the render context passed to a column's `cell` template.\n*\n* The returned object includes stable references to the table, row, column, and\n* cell, plus bound `getValue` and `renderValue` helpers for render functions.\n*\n* @example\n* ```ts\n* const context = cell_getContext(cell)\n* ```\n*/\nfunction cell_getContext(cell) {\n\treturn {\n\t\ttable: cell.table,\n\t\tcolumn: cell.column,\n\t\trow: cell.row,\n\t\tcell,\n\t\tgetValue: () => cell.getValue(),\n\t\trenderValue: () => cell.renderValue()\n\t};\n}\n\n//#endregion\nexport { cell_getContext, cell_getValue, cell_renderValue };","import { assignPrototypeAPIs } from \"../../utils.js\";\nimport { cell_getContext, cell_getValue, cell_renderValue } from \"./coreCellsFeature.utils.js\";\n\n//#region src/core/cells/coreCellsFeature.ts\n/**\n* Core feature that adds cell value, render, and context APIs.\n*/\nconst coreCellsFeature = { assignCellPrototype: (prototype, table) => {\n\tassignPrototypeAPIs(\"coreCellsFeature\", prototype, table, {\n\t\tcell_getValue: { fn: (cell) => cell_getValue(cell) },\n\t\tcell_renderValue: { fn: (cell) => cell_renderValue(cell) },\n\t\tcell_getContext: {\n\t\t\tfn: (cell) => cell_getContext(cell),\n\t\t\tmemoDeps: (cell) => [cell]\n\t\t}\n\t});\n} };\n\n//#endregion\nexport { coreCellsFeature };","//#region src/core/columns/constructColumn.ts\n/**\n* Creates or retrieves the column prototype for a table.\n* The prototype is cached on the table and shared by all column instances.\n*/\nfunction getColumnPrototype(table) {\n\tif (!table._columnPrototype) {\n\t\ttable._columnPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignColumnPrototype?.(table._columnPrototype, table);\n\t}\n\treturn table._columnPrototype;\n}\n/**\n* Constructs a column instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructColumn(table, columnDef, depth, parent) {\n\tconst resolvedColumnDef = {\n\t\t...table.getDefaultColumnDef(),\n\t\t...columnDef\n\t};\n\tconst accessorKey = resolvedColumnDef.accessorKey;\n\tconst accessorKeyString = accessorKey === void 0 ? void 0 : String(accessorKey);\n\tconst id = resolvedColumnDef.id ?? accessorKeyString?.replaceAll(\".\", \"_\") ?? (typeof resolvedColumnDef.header === \"string\" ? resolvedColumnDef.header : void 0);\n\tlet accessorFn;\n\tif (resolvedColumnDef.accessorFn) accessorFn = resolvedColumnDef.accessorFn;\n\telse if (accessorKey !== void 0) {\n\t\tif (typeof accessorKey === \"string\" && accessorKey.includes(\".\")) {\n\t\t\tconst keys = accessorKey.split(\".\");\n\t\t\taccessorFn = (originalRow) => {\n\t\t\t\tlet result = originalRow;\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tconst key = keys[i];\n\t\t\t\t\tresult = result?.[key];\n\t\t\t\t\tif (process.env.NODE_ENV === \"development\" && result === void 0) console.warn(`\"${key}\" in deeply nested key \"${accessorKey}\" returned undefined.`);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t};\n\t\t} else accessorFn = (originalRow) => originalRow[resolvedColumnDef.accessorKey];\n\t}\n\tif (!id) {\n\t\tif (process.env.NODE_ENV === \"development\") throw new Error(resolvedColumnDef.accessorFn ? `coreColumnsFeature require an id when using an accessorFn` : `coreColumnsFeature require an id when using a non-string header`);\n\t\tthrow new Error();\n\t}\n\tconst columnPrototype = getColumnPrototype(table);\n\tconst column = Object.create(columnPrototype);\n\tcolumn.accessorFn = accessorFn;\n\tcolumn.columnDef = resolvedColumnDef;\n\tcolumn.columns = [];\n\tcolumn.depth = depth;\n\tcolumn.id = `${String(id)}`;\n\tcolumn.parent = parent;\n\tconst initFns = table._columnInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](column);\n\treturn column;\n}\n\n//#endregion\nexport { constructColumn };","//#region src/core/featureStubs.ts\n/**\n* Stubs for optional features, used by the core and by any feature or row\n* model that reads another feature.\n*\n* Importing a feature's code from shared code would bundle that feature into\n* every table that uses the shared code, registered or not. A stub instead\n* calls a member the feature declares on its table, column, or row type and\n* assigns when it is registered, and otherwise behaves as if the feature were\n* absent. Members that only other features use are `_`-prefixed and marked\n* `@internal`, such as `table._expandRows`.\n*\n* How code in this package reaches other code:\n*\n* - Its own feature: call the static function, or `callMemoOrStaticFn` to use\n* the feature's memoized API.\n* - The core: import it. Every table bundles the core.\n* - Another feature's state: read `table.atoms.<slice>?.get()`.\n* - Another feature's APIs: call a stub from this file, adding one if needed.\n* - A feature it requires, such as column resizing requiring column sizing:\n* import it.\n*\n* Features assign functions, internal ones included, with `assignTableAPIs` or\n* `assignPrototypeAPIs`, and keep the `init*InstanceData` hooks for mutable\n* per-instance state. The `import/no-restricted-paths` lint rule rejects value\n* imports between feature folders outside an explicit list.\n*\n* Internal: not exported from any package entry point.\n*/\n/** Whether a column is visible; every column is without the feature. */\nfunction getIsColumnVisible(column) {\n\treturn column.getIsVisible?.() ?? true;\n}\n/** Visible leaf columns; all leaf columns without the feature. */\nfunction getVisibleLeafColumns(table) {\n\treturn table.getVisibleLeafColumns?.() ?? table.getAllLeafColumns();\n}\n/**\n* A row's visible cells; all cells, in leaf column order, without the\n* feature.\n*/\nfunction getVisibleCells(row) {\n\treturn row.getVisibleCells?.() ?? row.getAllCells();\n}\n/** A row's visible cells by column id; all cells without the feature. */\nfunction getVisibleCellsByColumnId(row) {\n\treturn row.getVisibleCellsByColumnId?.() ?? row.getAllCellsByColumnId();\n}\n/**\n* Orders leaf columns for display. The column ordering feature applies\n* `columnOrder` and moves grouped columns. Without it, the grouping feature\n* still moves grouped columns, and without either the order is unchanged.\n*/\nfunction orderLeafColumns(table, columns) {\n\tconst orderedTable = table;\n\tconst leafColumns = columns;\n\treturn orderedTable.getOrderColumnsFn?.()(leafColumns) ?? orderedTable._orderGroupedColumns?.(leafColumns) ?? columns;\n}\n/**\n* Orders items that each belong to a leaf column, such as visible leaf columns\n* or a row's visible cells, with start-pinned items first and end-pinned items\n* last. Without the feature, nothing is pinned and the order is unchanged.\n*/\nfunction orderByColumnPinning(table, items, getColumnId, getItemsByColumnId) {\n\treturn table._orderByColumnPinning?.(items, getColumnId, getItemsByColumnId) ?? items;\n}\n/**\n* Visible leaf columns in a pinning region. Without the feature, nothing is\n* pinned: the start and end regions are empty, and the center region and the\n* full list (`position` omitted) hold every visible leaf column.\n*/\nfunction getPinnedVisibleLeafColumns(table, position) {\n\treturn table.getPinnedVisibleLeafColumns?.(position) ?? (position && position !== \"center\" ? [] : getVisibleLeafColumns(table));\n}\n/** The resolved global filter function, if the feature is registered. */\nfunction getGlobalFilterFn(table) {\n\treturn table.getGlobalFilterFn?.();\n}\n/** Whether a column takes part in global filtering; none do without the feature. */\nfunction getCanGlobalFilter(column) {\n\treturn column.getCanGlobalFilter?.() ?? false;\n}\n/**\n* Lists expanded sub-rows inline below their parents. Without the feature no\n* row is expanded, so the row model is returned as is.\n*/\nfunction expandRowModel(table, rowModel) {\n\treturn table._expandRows?.(rowModel) ?? rowModel;\n}\n/**\n* Whether every parent of a row is expanded. Without the feature no row is\n* expanded, so only a top-level row qualifies.\n*/\nfunction getIsAllParentsExpanded(row) {\n\treturn row.getIsAllParentsExpanded?.() ?? !row.parentId;\n}\n/** Resets expanded state if row expanding is registered. */\nfunction autoResetExpanded(table) {\n\ttable.autoResetExpanded?.();\n}\n/** Resets the page index if row pagination is registered. */\nfunction autoResetPageIndex(table) {\n\ttable.autoResetPageIndex?.();\n}\n/** Resets sorting if row sorting is registered. */\nfunction autoResetSorting(table) {\n\ttable.autoResetSorting?.();\n}\n/** Resets cell selection if cell selection is registered. */\nfunction autoResetCellSelection(table) {\n\ttable.autoResetCellSelection?.();\n}\n/**\n* The aggregation executor `rowAggregationFeature` assigns to the table, or\n* `undefined` when the feature is not registered.\n*/\nfunction getAggregateColumnValue(table) {\n\treturn table._aggregateColumnValue;\n}\n\n//#endregion\nexport { autoResetCellSelection, autoResetExpanded, autoResetPageIndex, autoResetSorting, expandRowModel, getAggregateColumnValue, getCanGlobalFilter, getGlobalFilterFn, getIsAllParentsExpanded, getIsColumnVisible, getPinnedVisibleLeafColumns, getVisibleCells, getVisibleCellsByColumnId, getVisibleLeafColumns, orderByColumnPinning, orderLeafColumns };","import { makeObjectMap } from \"../../utils.js\";\nimport { orderLeafColumns } from \"../featureStubs.js\";\nimport { constructColumn } from \"./constructColumn.js\";\n\n//#region src/core/columns/coreColumnsFeature.utils.ts\n/**\n* Flattens this column and every descendant column into a single array.\n*\n* Group columns appear before their child columns, which matches the normalized\n* column hierarchy produced during table construction.\n*\n* @example\n* ```ts\n* const flatColumns = column_getFlatColumns(column)\n* ```\n*/\nfunction column_getFlatColumns(column) {\n\treturn [column, ...column.columns.flatMap((col) => col.getFlatColumns())];\n}\n/**\n* Collects the terminal leaf columns below this column.\n*\n* Group columns return their ordered descendants. Non-group columns return an\n* array containing only the column itself.\n*\n* @example\n* ```ts\n* const leafColumns = column_getLeafColumns(column)\n* ```\n*/\nfunction column_getLeafColumns(column) {\n\tif (column.columns.length) {\n\t\tconst leafColumns = column.columns.flatMap((col) => col.getLeafColumns());\n\t\treturn orderLeafColumns(column.table, leafColumns);\n\t}\n\treturn [column];\n}\n/**\n* Merges built-in, feature, and user default column definitions.\n*\n* Built-in defaults provide a header and fallback cell renderer, feature\n* defaults can add feature-specific column options, and\n* `options.defaultColumn` wins last.\n*\n* @example\n* ```ts\n* const defaultColumn = table_getDefaultColumnDef(table)\n* ```\n*/\nfunction table_getDefaultColumnDef(table) {\n\treturn {\n\t\theader: (props) => {\n\t\t\tconst resolvedColumnDef = props.header.column.columnDef;\n\t\t\tif (resolvedColumnDef.accessorKey) return resolvedColumnDef.accessorKey;\n\t\t\tif (resolvedColumnDef.accessorFn) return resolvedColumnDef.id;\n\t\t\treturn null;\n\t\t},\n\t\tcell: (props) => props.renderValue()?.toString?.() ?? null,\n\t\t...Object.values(table._features).reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultColumnDef?.());\n\t\t}, {}),\n\t\t...table.options.defaultColumn\n\t};\n}\nfunction constructColumns(table, columnDefs, parent, depth = 0) {\n\tconst columns = new Array(columnDefs.length);\n\tfor (let i = 0; i < columnDefs.length; i++) {\n\t\tif (!(i in columnDefs)) continue;\n\t\tconst columnDef = columnDefs[i];\n\t\tconst column = constructColumn(table, columnDef, depth, parent);\n\t\tconst groupingColumnDef = columnDef;\n\t\tcolumn.columns = groupingColumnDef.columns ? constructColumns(table, groupingColumnDef.columns, column, depth + 1) : [];\n\t\tcolumns[i] = column;\n\t}\n\treturn columns;\n}\n/**\n* Normalizes `options.columns` into the table's nested column tree.\n*\n* Each column definition is constructed with its parent and depth, and group\n* column children are recursively constructed.\n*\n* @example\n* ```ts\n* const columns = table_getAllColumns(table)\n* ```\n*/\nfunction table_getAllColumns(table) {\n\treturn constructColumns(table, table.options.columns);\n}\n/**\n* Flattens every table column, including group columns and leaf columns.\n*\n* Use this when parent/group columns must be included in addition to data leaf\n* columns.\n*\n* @example\n* ```ts\n* const flatColumns = table_getAllFlatColumns(table)\n* ```\n*/\nfunction table_getAllFlatColumns(table) {\n\treturn table.getAllColumns().flatMap((column) => column.getFlatColumns());\n}\n/**\n* Builds an id lookup for every flat column in the table.\n*\n* Group columns and leaf columns are included. Later columns with the same id\n* replace earlier entries.\n*\n* @example\n* ```ts\n* const columnsById = table_getAllFlatColumnsById(table)\n* ```\n*/\nfunction table_getAllFlatColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst flatColumns = table.getAllFlatColumns();\n\tfor (let i = 0; i < flatColumns.length; i++) {\n\t\tconst column = flatColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Collects all terminal leaf columns in their current table order.\n*\n* Column ordering features can reorder the collected leaves before the result\n* is returned.\n*\n* @example\n* ```ts\n* const leafColumns = table_getAllLeafColumns(table)\n* ```\n*/\nfunction table_getAllLeafColumns(table) {\n\tconst leafColumns = table.getAllColumns().flatMap((c) => c.getLeafColumns());\n\treturn orderLeafColumns(table, leafColumns);\n}\n/**\n* Builds an id lookup for terminal leaf columns only.\n*\n* Parent/group columns are excluded, making this lookup appropriate for row\n* cells and feature state keyed by data columns.\n*\n* @example\n* ```ts\n* const leavesById = table_getAllLeafColumnsById(table)\n* ```\n*/\nfunction table_getAllLeafColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst leafColumns = table.getAllLeafColumns();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst column = leafColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Looks up a column by id from the flat column map.\n*\n* The lookup can return group columns or leaf columns. In development, a\n* missing id logs a warning to help catch stale column references.\n*\n* @example\n* ```ts\n* const column = table_getColumn(table, 'firstName')\n* ```\n*/\nfunction table_getColumn(table, columnId) {\n\tconst column = table.getAllFlatColumnsById()[columnId];\n\tif (process.env.NODE_ENV === \"development\" && !column) console.warn(`[Table] Column with id '${columnId}' does not exist.`);\n\treturn column;\n}\n\n//#endregion\nexport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef } from \"./coreColumnsFeature.utils.js\";\n\n//#region src/core/columns/coreColumnsFeature.ts\n/**\n* Core feature that builds the column tree and exposes table/column APIs.\n*/\nconst coreColumnsFeature = {\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreColumnsFeature\", prototype, table, {\n\t\t\tcolumn_getFlatColumns: {\n\t\t\t\tfn: (column) => column_getFlatColumns(column),\n\t\t\t\tmemoDeps: (column) => [column.table.options.columns]\n\t\t\t},\n\t\t\tcolumn_getLeafColumns: {\n\t\t\t\tfn: (column) => column_getLeafColumns(column),\n\t\t\t\tmemoDeps: (column) => [\n\t\t\t\t\tcolumn.table.atoms.columnOrder?.get(),\n\t\t\t\t\tcolumn.table.atoms.grouping?.get(),\n\t\t\t\t\tcolumn.table.options.columns,\n\t\t\t\t\tcolumn.table.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreColumnsFeature\", table, {\n\t\t\ttable_getDefaultColumnDef: {\n\t\t\t\tfn: () => table_getDefaultColumnDef(table),\n\t\t\t\tmemoDeps: () => [table.options.defaultColumn]\n\t\t\t},\n\t\t\ttable_getAllColumns: {\n\t\t\t\tfn: () => table_getAllColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumns: {\n\t\t\t\tfn: () => table_getAllFlatColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumnsById: {\n\t\t\t\tfn: () => table_getAllFlatColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllLeafColumns: {\n\t\t\t\tfn: () => table_getAllLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getAllLeafColumnsById: {\n\t\t\t\tfn: () => table_getAllLeafColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.getAllLeafColumns()]\n\t\t\t},\n\t\t\ttable_getColumn: { fn: (columnId) => table_getColumn(table, columnId) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreColumnsFeature };","//#region src/core/headers/constructHeader.ts\n/**\n* Creates or retrieves the header prototype for a table.\n* The prototype is cached on the table and shared by all header instances.\n*/\nfunction getHeaderPrototype(table) {\n\tif (!table._headerPrototype) {\n\t\ttable._headerPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignHeaderPrototype?.(table._headerPrototype, table);\n\t}\n\treturn table._headerPrototype;\n}\n/**\n* Constructs a header instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructHeader(table, column, options) {\n\tconst headerPrototype = getHeaderPrototype(table);\n\tconst header = Object.create(headerPrototype);\n\theader.colSpan = 0;\n\theader.column = column;\n\theader.depth = options.depth;\n\theader.headerGroup = null;\n\theader.id = options.id ?? column.id;\n\theader.index = options.index;\n\theader.isPlaceholder = !!options.isPlaceholder;\n\theader.placeholderId = options.placeholderId;\n\theader.rowSpan = 0;\n\theader.subHeaders = [];\n\tconst initFns = table._headerInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](header);\n\treturn header;\n}\n\n//#endregion\nexport { constructHeader };","import { getIsColumnVisible } from \"../featureStubs.js\";\nimport { constructHeader } from \"./constructHeader.js\";\n\n//#region src/core/headers/buildHeaderGroups.ts\nfunction getMaxHeaderDepth(columns, depth = 1) {\n\tlet maxDepth = depth;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tif (getIsColumnVisible(column) && column.columns.length) maxDepth = Math.max(maxDepth, getMaxHeaderDepth(column.columns, depth + 1));\n\t}\n\treturn maxDepth;\n}\nfunction formatHeaderGroupId(headerFamily, depth) {\n\treturn headerFamily ? `${headerFamily}_${depth}` : String(depth);\n}\nfunction formatHeaderId(headerFamily, depth, columnId, childHeaderId) {\n\tlet id = headerFamily ?? \"\";\n\tif (depth) id = id ? `${id}_${depth}` : String(depth);\n\tif (columnId) id = id ? `${id}_${columnId}` : columnId;\n\tif (childHeaderId) id = id ? `${id}_${childHeaderId}` : childHeaderId;\n\treturn id;\n}\nfunction countPendingHeadersForColumn(headers, column) {\n\tlet count = 0;\n\tfor (let i = 0; i < headers.length; i++) if (headers[i].column === column) count++;\n\treturn count;\n}\nfunction constructHeaderGroup(headersToGroup, depth, table, headerFamily, headerGroups, headerGroupInitFns) {\n\tconst headerGroup = {\n\t\tdepth,\n\t\tid: formatHeaderGroupId(headerFamily, depth),\n\t\theaders: []\n\t};\n\tconst pendingParentHeaders = [];\n\tfor (let i = 0; i < headersToGroup.length; i++) {\n\t\tif (!(i in headersToGroup)) continue;\n\t\tconst headerToGroup = headersToGroup[i];\n\t\tconst latestPendingParentHeader = pendingParentHeaders[pendingParentHeaders.length - 1];\n\t\tconst isLeafHeader = headerToGroup.column.depth === headerGroup.depth;\n\t\tlet column;\n\t\tlet isPlaceholder = false;\n\t\tif (isLeafHeader && headerToGroup.column.parent) column = headerToGroup.column.parent;\n\t\telse {\n\t\t\tcolumn = headerToGroup.column;\n\t\t\tisPlaceholder = true;\n\t\t}\n\t\tif (latestPendingParentHeader && latestPendingParentHeader.column === column) latestPendingParentHeader.subHeaders.push(headerToGroup);\n\t\telse {\n\t\t\tconst header = constructHeader(table, column, {\n\t\t\t\tid: formatHeaderId(headerFamily, depth, column.id, headerToGroup.id),\n\t\t\t\tisPlaceholder,\n\t\t\t\tplaceholderId: isPlaceholder ? String(countPendingHeadersForColumn(pendingParentHeaders, column)) : void 0,\n\t\t\t\tdepth,\n\t\t\t\tindex: pendingParentHeaders.length\n\t\t\t});\n\t\t\theader.subHeaders.push(headerToGroup);\n\t\t\tpendingParentHeaders.push(header);\n\t\t}\n\t\theaderGroup.headers.push(headerToGroup);\n\t\theaderToGroup.headerGroup = headerGroup;\n\t}\n\tfor (let i = 0; i < headerGroupInitFns.length; i++) headerGroupInitFns[i](headerGroup);\n\theaderGroups.push(headerGroup);\n\tif (depth > 0) constructHeaderGroup(pendingParentHeaders, depth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n}\nfunction updateHeaderSpans(headers) {\n\tfor (let i = 0; i < headers.length; i++) {\n\t\tconst header = headers[i];\n\t\tif (!getIsColumnVisible(header.column)) continue;\n\t\tlet colSpan = 0;\n\t\tif (header.subHeaders.length) {\n\t\t\tupdateHeaderSpans(header.subHeaders);\n\t\t\tfor (let j = 0; j < header.subHeaders.length; j++) {\n\t\t\t\tconst child = header.subHeaders[j];\n\t\t\t\tif (!getIsColumnVisible(child.column)) continue;\n\t\t\t\tcolSpan += child.colSpan;\n\t\t\t}\n\t\t} else colSpan = 1;\n\t\theader.colSpan = colSpan;\n\t\tif (header.isPlaceholder && header.subHeaders.length === 1 && header.subHeaders[0].column === header.column) {\n\t\t\tlet rowSpan = 1;\n\t\t\tlet chainChild = header.subHeaders[0];\n\t\t\twhile (chainChild) {\n\t\t\t\tchainChild.rowSpan = 0;\n\t\t\t\trowSpan++;\n\t\t\t\tchainChild = chainChild.subHeaders.length === 1 && chainChild.subHeaders[0].column === header.column ? chainChild.subHeaders[0] : void 0;\n\t\t\t}\n\t\t\theader.rowSpan = rowSpan;\n\t\t} else header.rowSpan = 1;\n\t}\n}\n/**\n* Builds the nested header group structure for a table.\n*\n* The result accounts for visible leaf columns, pinned column groups, and placeholder headers needed to render multi-level headers.\n*/\nfunction buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {\n\tconst maxDepth = getMaxHeaderDepth(allColumns);\n\tconst headerGroups = [];\n\tconst headerGroupInitFns = table._headerGroupInstanceInitFns;\n\tconst bottomHeaders = new Array(columnsToGroup.length);\n\tfor (let i = 0; i < columnsToGroup.length; i++) {\n\t\tif (!(i in columnsToGroup)) continue;\n\t\tbottomHeaders[i] = constructHeader(table, columnsToGroup[i], {\n\t\t\tdepth: maxDepth,\n\t\t\tindex: i\n\t\t});\n\t}\n\tconstructHeaderGroup(bottomHeaders, maxDepth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n\theaderGroups.reverse();\n\tupdateHeaderSpans(headerGroups[0]?.headers ?? []);\n\treturn headerGroups;\n}\n\n//#endregion\nexport { buildHeaderGroups };","import { getVisibleLeafColumns, orderByColumnPinning } from \"../featureStubs.js\";\nimport { buildHeaderGroups } from \"./buildHeaderGroups.js\";\n\n//#region src/core/headers/coreHeadersFeature.utils.ts\nfunction collectLeafHeaders(header, leafHeaders) {\n\tfor (let i = 0; i < header.subHeaders.length; i++) collectLeafHeaders(header.subHeaders[i], leafHeaders);\n\tleafHeaders.push(header);\n}\n/**\n* Walks a header tree and collects all descendant leaf headers.\n*\n* The header itself is included after its descendants, matching the recursive\n* shape used by nested header groups.\n*\n* @example\n* ```ts\n* const leafHeaders = header_getLeafHeaders(header)\n* ```\n*/\nfunction header_getLeafHeaders(header) {\n\tconst leafHeaders = [];\n\tcollectLeafHeaders(header, leafHeaders);\n\treturn leafHeaders;\n}\n/**\n* Builds the render context passed to a column's `header` or `footer` template.\n*\n* The context contains the header, its column, and the owning table instance.\n*\n* @example\n* ```ts\n* const context = header_getContext(header)\n* ```\n*/\nfunction header_getContext(header) {\n\treturn {\n\t\tcolumn: header.column,\n\t\theader,\n\t\ttable: header.column.table\n\t};\n}\n/**\n* Builds visible header groups for the current column tree.\n*\n* Column visibility and pinning are applied before groups are built. When no\n* columns are pinned, the fast path skips pin partitioning.\n*\n* @example\n* ```ts\n* const headerGroups = table_getHeaderGroups(table)\n* ```\n*/\nfunction table_getHeaderGroups(table) {\n\treturn buildHeaderGroups(table.getAllColumns(), orderByColumnPinning(table, getVisibleLeafColumns(table), (column) => column.id), table);\n}\n/**\n* Builds footer groups by reversing the current header groups.\n*\n* Footer rendering uses the same header objects and grouping structure, but\n* renders them from leaf level back toward the root.\n*\n* @example\n* ```ts\n* const footerGroups = table_getFooterGroups(table)\n* ```\n*/\nfunction table_getFooterGroups(table) {\n\treturn [...table.getHeaderGroups()].reverse();\n}\n/**\n* Flattens every header from every header group into one array.\n*\n* The result includes parent headers and placeholder headers, in header-group\n* order from top to bottom.\n*\n* @example\n* ```ts\n* const flatHeaders = table_getFlatHeaders(table)\n* ```\n*/\nfunction table_getFlatHeaders(table) {\n\tconst headerGroups = table.getHeaderGroups();\n\tconst result = [];\n\tfor (let i = 0; i < headerGroups.length; i++) {\n\t\tconst headers = headerGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Collects only the leaf headers from the current header tree.\n*\n* Parent/group headers are skipped, making the result suitable for rendering\n* one header per visible leaf column.\n*\n* @example\n* ```ts\n* const leafHeaders = table_getLeafHeaders(table)\n* ```\n*/\nfunction table_getLeafHeaders(table) {\n\tconst topHeaders = table.getHeaderGroups()[0]?.headers ?? [];\n\tconst result = [];\n\tfor (let i = 0; i < topHeaders.length; i++) {\n\t\tconst leafHeaders = topHeaders[i].getLeafHeaders();\n\t\tfor (let j = 0; j < leafHeaders.length; j++) result.push(leafHeaders[j]);\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders } from \"./coreHeadersFeature.utils.js\";\n\n//#region src/core/headers/coreHeadersFeature.ts\n/**\n* Core feature that builds header groups and exposes header context APIs.\n*/\nconst coreHeadersFeature = {\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreHeadersFeature\", prototype, table, {\n\t\t\theader_getLeafHeaders: {\n\t\t\t\tfn: (header) => header_getLeafHeaders(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t},\n\t\t\theader_getContext: {\n\t\t\t\tfn: (header) => header_getContext(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreHeadersFeature\", table, {\n\t\t\ttable_getHeaderGroups: {\n\t\t\t\tfn: () => table_getHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getFooterGroups: {\n\t\t\t\tfn: () => table_getFooterGroups(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getFlatHeaders: {\n\t\t\t\tfn: () => table_getFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getLeafHeaders: {\n\t\t\t\tfn: () => table_getLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreHeadersFeature };","import { makeObjectMap } from \"../../utils.js\";\n\n//#region src/core/rows/constructRow.ts\n/**\n* Creates or retrieves the row prototype for a table.\n* The prototype is cached on the table and shared by all row instances.\n*/\nfunction getRowPrototype(table) {\n\tif (!table._rowPrototype) {\n\t\ttable._rowPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignRowPrototype?.(table._rowPrototype, table);\n\t}\n\treturn table._rowPrototype;\n}\n/**\n* Constructs a row instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nconst constructRow = (table, id, original, rowIndex, depth, subRows, parentId) => {\n\tconst rowPrototype = getRowPrototype(table);\n\tconst row = Object.create(rowPrototype);\n\trow._displayIndexCache = -1;\n\trow._uniqueValuesCache = makeObjectMap();\n\trow._valuesCache = makeObjectMap();\n\trow.depth = depth;\n\trow.id = id;\n\trow.index = rowIndex;\n\trow.original = original;\n\trow.parentId = parentId;\n\trow.subRows = subRows ?? [];\n\tconst initFns = table._rowInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](row);\n\treturn row;\n};\n\n//#endregion\nexport { constructRow };","import { makeObjectMap, skipFirstRun, tableMemo } from \"../../utils.js\";\nimport { autoResetCellSelection, autoResetExpanded, autoResetPageIndex, autoResetSorting } from \"../featureStubs.js\";\nimport { constructRow } from \"../rows/constructRow.js\";\n\n//#region src/core/row-models/createCoreRowModel.ts\n/**\n* Creates a memoized core row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*/\nfunction createCoreRowModel() {\n\treturn (table) => {\n\t\treturn tableMemo({\n\t\t\tfeature: \"coreRowModelsFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getCoreRowModel\",\n\t\t\tmemoDeps: () => [table.options.data],\n\t\t\tfn: () => _createCoreRowModel(table, table.options.data),\n\t\t\tonAfterUpdate: skipFirstRun(() => {\n\t\t\t\tautoResetExpanded(table);\n\t\t\t\tautoResetPageIndex(table);\n\t\t\t\tautoResetSorting(table);\n\t\t\t\tautoResetCellSelection(table);\n\t\t\t})\n\t\t});\n\t};\n}\nfunction accessRows(table, rowModel, originalRows, depth = 0, parentRow) {\n\tconst rows = [];\n\tfor (let i = 0; i < originalRows.length; i++) {\n\t\tconst originalRow = originalRows[i];\n\t\tconst row = constructRow(table, table.getRowId(originalRow, i, parentRow), originalRow, i, depth, void 0, parentRow?.id);\n\t\trowModel.flatRows.push(row);\n\t\trowModel.rowsById[row.id] = row;\n\t\trows.push(row);\n\t\tif (table.options.getSubRows) {\n\t\t\trow.originalSubRows = table.options.getSubRows(originalRow, i);\n\t\t\tif (row.originalSubRows?.length) row.subRows = accessRows(table, rowModel, row.originalSubRows, depth + 1, row);\n\t\t}\n\t}\n\treturn rows;\n}\nfunction _createCoreRowModel(table, data) {\n\tconst rowModel = {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\trowModel.rows = accessRows(table, rowModel, data);\n\treturn rowModel;\n}\n\n//#endregion\nexport { createCoreRowModel };","import { createCoreRowModel } from \"./createCoreRowModel.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.utils.ts\n/**\n* Resolves the table's unmodified core row model.\n*\n* The factory is created once per table, either from the `coreRowModel` slot on the `features` option\n* or the built-in `createCoreRowModel()`, then reused for later calls.\n*\n* @example\n* ```ts\n* const coreRows = table_getCoreRowModel(table)\n* ```\n*/\nfunction table_getCoreRowModel(table) {\n\tif (!table._rowModels.coreRowModel) table._rowModels.coreRowModel = table.options.features.coreRowModel?.(table) ?? createCoreRowModel()(table);\n\treturn table._rowModels.coreRowModel();\n}\n/**\n* Reads the row model immediately before column/global filtering.\n*\n* Filtering is the first derived row-model stage, so this currently aliases\n* `table.getCoreRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeFiltering = table_getPreFilteredRowModel(table)\n* ```\n*/\nfunction table_getPreFilteredRowModel(table) {\n\treturn table.getCoreRowModel();\n}\n/**\n* Resolves the row model after column and global filtering.\n*\n* When `manualFiltering` is enabled, or no filtered row-model factory was\n* registered, this returns the pre-filtered row model because filtering is\n* expected to happen outside the table.\n*\n* @example\n* ```ts\n* const filteredRows = table_getFilteredRowModel(table)\n* ```\n*/\nfunction table_getFilteredRowModel(table) {\n\tif (!table._rowModels.filteredRowModel) table._rowModels.filteredRowModel = table.options.features.filteredRowModel?.(table);\n\tif (table.options.manualFiltering || !table._rowModels.filteredRowModel) return table.getPreFilteredRowModel();\n\treturn table._rowModels.filteredRowModel();\n}\n/**\n* Reads the row model immediately before grouping.\n*\n* Grouping runs after filtering, so this aliases `table.getFilteredRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeGrouping = table_getPreGroupedRowModel(table)\n* ```\n*/\nfunction table_getPreGroupedRowModel(table) {\n\treturn table.getFilteredRowModel();\n}\n/**\n* Resolves the row model after grouping has produced grouped rows.\n*\n* When `manualGrouping` is enabled, or no grouped row-model factory was\n* registered, this returns the pre-grouped row model unchanged.\n*\n* @example\n* ```ts\n* const groupedRows = table_getGroupedRowModel(table)\n* ```\n*/\nfunction table_getGroupedRowModel(table) {\n\tif (!table._rowModels.groupedRowModel) table._rowModels.groupedRowModel = table.options.features.groupedRowModel?.(table);\n\tif (table.options.manualGrouping || !table._rowModels.groupedRowModel) return table.getPreGroupedRowModel();\n\treturn table._rowModels.groupedRowModel();\n}\n/**\n* Reads the row model immediately before sorting.\n*\n* Sorting runs after grouping, so this aliases `table.getGroupedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeSorting = table_getPreSortedRowModel(table)\n* ```\n*/\nfunction table_getPreSortedRowModel(table) {\n\treturn table.getGroupedRowModel();\n}\n/**\n* Resolves the row model after sorting has been applied.\n*\n* When `manualSorting` is enabled, or no sorted row-model factory was\n* registered, this returns the pre-sorted row model because sorted data is\n* expected to be supplied by the caller.\n*\n* @example\n* ```ts\n* const sortedRows = table_getSortedRowModel(table)\n* ```\n*/\nfunction table_getSortedRowModel(table) {\n\tif (!table._rowModels.sortedRowModel) table._rowModels.sortedRowModel = table.options.features.sortedRowModel?.(table);\n\tif (table.options.manualSorting || !table._rowModels.sortedRowModel) return table.getPreSortedRowModel();\n\treturn table._rowModels.sortedRowModel();\n}\n/**\n* Reads the row model immediately before row expansion.\n*\n* Expansion runs after sorting, so this aliases `table.getSortedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeExpansion = table_getPreExpandedRowModel(table)\n* ```\n*/\nfunction table_getPreExpandedRowModel(table) {\n\treturn table.getSortedRowModel();\n}\n/**\n* Resolves the row model after expanded rows have been flattened into view.\n*\n* When `manualExpanding` is enabled, or no expanded row-model factory was\n* registered, this returns the pre-expanded row model unchanged.\n*\n* @example\n* ```ts\n* const expandedRows = table_getExpandedRowModel(table)\n* ```\n*/\nfunction table_getExpandedRowModel(table) {\n\tif (!table._rowModels.expandedRowModel) table._rowModels.expandedRowModel = table.options.features.expandedRowModel?.(table);\n\tif (table.options.manualExpanding || !table._rowModels.expandedRowModel) return table.getPreExpandedRowModel();\n\treturn table._rowModels.expandedRowModel();\n}\n/**\n* Reads the row model immediately before pagination.\n*\n* Pagination is the final built-in row-model stage, so this aliases\n* `table.getExpandedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforePagination = table_getPrePaginatedRowModel(table)\n* ```\n*/\nfunction table_getPrePaginatedRowModel(table) {\n\treturn table.getExpandedRowModel();\n}\n/**\n* Resolves the row model after pagination has sliced rows for the current page.\n*\n* When `manualPagination` is enabled, or no paginated row-model factory was\n* registered, this returns the pre-paginated row model because pagination is\n* expected to happen before data reaches the table.\n*\n* @example\n* ```ts\n* const pageRows = table_getPaginatedRowModel(table)\n* ```\n*/\nfunction table_getPaginatedRowModel(table) {\n\tif (!table._rowModels.paginatedRowModel) table._rowModels.paginatedRowModel = table.options.features.paginatedRowModel?.(table);\n\tif (table.options.manualPagination || !table._rowModels.paginatedRowModel) return table.getPrePaginatedRowModel();\n\treturn table._rowModels.paginatedRowModel();\n}\n/**\n* Resolves the final row model consumed by renderers.\n*\n* This is the end of the built-in row-model pipeline: core -> filtering ->\n* grouping -> sorting -> expanding -> pagination.\n*\n* @example\n* ```ts\n* const visibleRows = table_getRowModel(table)\n* ```\n*/\nfunction table_getRowModel(table) {\n\treturn table.getPaginatedRowModel();\n}\n\n//#endregion\nexport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel } from \"./coreRowModelsFeature.utils.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.ts\n/**\n* Core feature that wires table row-model accessors and row-model caches.\n*/\nconst coreRowModelsFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreRowModelsFeature\", table, {\n\t\ttable_getCoreRowModel: { fn: () => table_getCoreRowModel(table) },\n\t\ttable_getPreFilteredRowModel: { fn: () => table_getPreFilteredRowModel(table) },\n\t\ttable_getFilteredRowModel: { fn: () => table_getFilteredRowModel(table) },\n\t\ttable_getPreGroupedRowModel: { fn: () => table_getPreGroupedRowModel(table) },\n\t\ttable_getGroupedRowModel: { fn: () => table_getGroupedRowModel(table) },\n\t\ttable_getPreSortedRowModel: { fn: () => table_getPreSortedRowModel(table) },\n\t\ttable_getSortedRowModel: { fn: () => table_getSortedRowModel(table) },\n\t\ttable_getPreExpandedRowModel: { fn: () => table_getPreExpandedRowModel(table) },\n\t\ttable_getExpandedRowModel: { fn: () => table_getExpandedRowModel(table) },\n\t\ttable_getPrePaginatedRowModel: { fn: () => table_getPrePaginatedRowModel(table) },\n\t\ttable_getPaginatedRowModel: { fn: () => table_getPaginatedRowModel(table) },\n\t\ttable_getRowModel: { fn: () => table_getRowModel(table) }\n\t});\n} };\n\n//#endregion\nexport { coreRowModelsFeature };","//#region src/core/cells/constructCell.ts\n/**\n* Creates or retrieves the cell prototype for a table.\n* The prototype is cached on the table and shared by all cell instances.\n*/\nfunction getCellPrototype(table) {\n\tif (!table._cellPrototype) {\n\t\ttable._cellPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignCellPrototype?.(table._cellPrototype, table);\n\t}\n\treturn table._cellPrototype;\n}\n/**\n* Constructs a cell instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructCell(column, row, table) {\n\tconst cellPrototype = getCellPrototype(table);\n\tconst cell = Object.create(cellPrototype);\n\tcell.column = column;\n\tcell.id = `${row.id}_${column.id}`;\n\tcell.row = row;\n\tconst initFns = table._cellInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](cell);\n\treturn cell;\n}\n\n//#endregion\nexport { constructCell };","import { flattenBy, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { expandRowModel } from \"../featureStubs.js\";\nimport { constructCell } from \"../cells/constructCell.js\";\n\n//#region src/core/rows/coreRowsFeature.utils.ts\n/**\n* Returns this row's zero-based position in the current pre-pagination row\n* model. Rows outside that model return `-1`.\n*/\nfunction row_getDisplayIndex(row) {\n\tconst rows = row.table.getRowsInDisplayOrder();\n\tconst displayIndex = row._displayIndexCache;\n\treturn rows[displayIndex] === row ? displayIndex : -1;\n}\n/**\n* Returns the rows in the current display order after assigning their\n* zero-based display indexes.\n*\n* When expanded rows bypass pagination, expanded descendants are inserted into\n* the returned order even though they are absent from the pre-pagination row\n* model.\n*/\nfunction table_getRowsInDisplayOrder(table) {\n\tconst rowModel = table.getPrePaginatedRowModel();\n\tconst rows = table.options.paginateExpandedRows === false ? expandRowModel(table, rowModel).rows : rowModel.rows;\n\tfor (let i = 0; i < rows.length; i++) rows[i]._displayIndexCache = i;\n\treturn rows;\n}\n/**\n* Reads and caches this row's value for a column.\n*\n* The value is produced by the column accessor. Missing columns or display\n* columns without an accessor return `undefined`.\n*\n* @example\n* ```ts\n* const firstName = row_getValue(row, 'firstName')\n* ```\n*/\nfunction row_getValue(row, columnId) {\n\tif (hasOwn(row._valuesCache, columnId)) return row._valuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\trow._valuesCache[columnId] = column.accessorFn(row.original, row.index);\n\treturn row._valuesCache[columnId];\n}\n/**\n* Reads and caches the values used by faceting/grouping for a column.\n*\n* If the column defines `getUniqueValues`, that result is used. Otherwise the\n* row's accessor value is wrapped in a single-item array.\n*\n* @example\n* ```ts\n* const values = row_getUniqueValues(row, 'tags')\n* ```\n*/\nfunction row_getUniqueValues(row, columnId) {\n\tif (hasOwn(row._uniqueValuesCache, columnId)) return row._uniqueValuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\tif (!column.columnDef.getUniqueValues) {\n\t\trow._uniqueValuesCache[columnId] = [row.getValue(columnId)];\n\t\treturn row._uniqueValuesCache[columnId];\n\t}\n\trow._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, row.index);\n\treturn row._uniqueValuesCache[columnId];\n}\n/**\n* Returns a renderable row value for a column.\n*\n* If the accessor value is nullish, the table's `renderFallbackValue` is used\n* instead.\n*\n* @example\n* ```ts\n* const value = row_renderValue(row, 'firstName')\n* ```\n*/\nfunction row_renderValue(row, columnId) {\n\treturn row.getValue(columnId) ?? row.table.options.renderFallbackValue;\n}\n/**\n* Flattens this row's descendant tree into leaf rows.\n*\n* The row itself is not included; only nested `subRows` are walked.\n*\n* @example\n* ```ts\n* const descendants = row_getLeafRows(row)\n* ```\n*/\nfunction row_getLeafRows(row) {\n\treturn flattenBy(row.subRows, (d) => d.subRows);\n}\n/**\n* Returns the deepest structural row depth in the core row model.\n* Root rows are depth `0`, their direct sub-rows are depth `1`, and so on.\n*/\nfunction table_getMaxSubRowDepth(table) {\n\tconst rows = table.getCoreRowModel().flatRows;\n\tlet maxDepth = 0;\n\tfor (let i = 0; i < rows.length; i++) maxDepth = Math.max(maxDepth, rows[i].depth);\n\treturn maxDepth;\n}\n/**\n* Looks up this row's direct parent, if it has one.\n*\n* Parent lookup prefers the core row model for structural parents, then falls\n* back to the pre-pagination row model for generated parent rows.\n*\n* @example\n* ```ts\n* const parent = row_getParentRow(row)\n* ```\n*/\nfunction row_getParentRow(row) {\n\tif (!row.parentId) return;\n\treturn row.table.getCoreRowModel().rowsById[row.parentId] ?? row.table.getRow(row.parentId, true);\n}\n/**\n* Collects this row's ancestor chain from root to direct parent.\n*\n* The current row is not included. Rows without a parent return an empty array.\n*\n* @example\n* ```ts\n* const ancestors = row_getParentRows(row)\n* ```\n*/\nfunction row_getParentRows(row) {\n\tconst parentRows = [];\n\tlet currentRow = row;\n\twhile (true) {\n\t\tconst parentRow = currentRow.getParentRow();\n\t\tif (!parentRow) break;\n\t\tparentRows.push(parentRow);\n\t\tcurrentRow = parentRow;\n\t}\n\treturn parentRows.reverse();\n}\n/**\n* Constructs one cell for each leaf column in this row.\n*\n* The result follows `table.getAllLeafColumns()` order and includes hidden\n* columns; visibility-specific APIs filter this list later.\n*\n* @example\n* ```ts\n* const cells = row_getAllCells(row)\n* ```\n*/\nfunction row_getAllCells(row) {\n\tconst columns = row.table.getAllLeafColumns();\n\tlet cache = row._cellsCache;\n\tif (!cache) cache = row._cellsCache = /* @__PURE__ */ new WeakMap();\n\tconst cells = new Array(columns.length);\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tlet cell = cache.get(column);\n\t\tif (!cell) {\n\t\t\tcell = constructCell(column, row, row.table);\n\t\t\tcache.set(column, cell);\n\t\t}\n\t\tcells[i] = cell;\n\t}\n\treturn cells;\n}\n/**\n* Builds a lookup map of this row's cells keyed by column id.\n*\n* This is the static implementation behind `row.getAllCellsByColumnId()`.\n*\n* @example\n* ```ts\n* const cellsById = row_getAllCellsByColumnId(row)\n* ```\n*/\nfunction row_getAllCellsByColumnId(row) {\n\tconst result = makeObjectMap();\n\tconst cells = row.getAllCells();\n\tfor (let i = 0; i < cells.length; i++) {\n\t\tconst cell = cells[i];\n\t\tresult[cell.column.id] = cell;\n\t}\n\treturn result;\n}\n/**\n* Resolves the stable id for a row.\n*\n* `options.getRowId` wins when provided. Otherwise root rows use their index\n* and child rows append their index to the parent id, such as `0.2`.\n*\n* @example\n* ```ts\n* const id = table_getRowId(originalRow, table, index, parentRow)\n* ```\n*/\nfunction table_getRowId(originalRow, table, index, parent) {\n\treturn table.options.getRowId?.(originalRow, index, parent) ?? (parent ? `${parent.id}.${index}` : String(index));\n}\n/**\n* Looks up a row by id from the current or full row model.\n*\n* By default this searches `table.getRowModel()`. Passing `searchAll` searches\n* the pre-pagination model first, then falls back to the core model.\n*\n* @example\n* ```ts\n* const row = table_getRow(table, rowId, true)\n* ```\n*/\nfunction table_getRow(table, rowId, searchAll) {\n\tlet row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel()).rowsById[rowId];\n\tif (!row) {\n\t\trow = table.getCoreRowModel().rowsById[rowId];\n\t\tif (!row) {\n\t\t\tif (process.env.NODE_ENV === \"development\") throw new Error(`getRow could not find row with ID: ${rowId}`);\n\t\t\tthrow new Error();\n\t\t}\n\t}\n\treturn row;\n}\n\n//#endregion\nexport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder } from \"./coreRowsFeature.utils.js\";\n\n//#region src/core/rows/coreRowsFeature.ts\n/**\n* Core feature that creates row APIs for values, cells, and tree traversal.\n*/\nconst coreRowsFeature = {\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreRowsFeature\", prototype, table, {\n\t\t\trow_getDisplayIndex: { fn: (row) => row_getDisplayIndex(row) },\n\t\t\trow_getAllCellsByColumnId: {\n\t\t\t\tfn: (row) => row_getAllCellsByColumnId(row),\n\t\t\t\tmemoDeps: (row) => [row.getAllCells()]\n\t\t\t},\n\t\t\trow_getAllCells: {\n\t\t\t\tfn: (row) => row_getAllCells(row),\n\t\t\t\tmemoDeps: (row) => [row.table.getAllLeafColumns()]\n\t\t\t},\n\t\t\trow_getLeafRows: {\n\t\t\t\tfn: (row) => row_getLeafRows(row),\n\t\t\t\tmemoDeps: (row) => [row.subRows]\n\t\t\t},\n\t\t\trow_getParentRow: { fn: (row) => row_getParentRow(row) },\n\t\t\trow_getParentRows: { fn: (row) => row_getParentRows(row) },\n\t\t\trow_getUniqueValues: { fn: (row, columnId) => row_getUniqueValues(row, columnId) },\n\t\t\trow_getValue: { fn: (row, columnId) => row_getValue(row, columnId) },\n\t\t\trow_renderValue: { fn: (row, columnId) => row_renderValue(row, columnId) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreRowsFeature\", table, {\n\t\t\ttable_getRowsInDisplayOrder: {\n\t\t\t\tfn: () => table_getRowsInDisplayOrder(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getPrePaginatedRowModel().rows,\n\t\t\t\t\ttable.options.paginateExpandedRows,\n\t\t\t\t\ttable.options.paginateExpandedRows === false ? table.atoms.expanded?.get() : void 0\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getRowId: { fn: (originalRow, index, parent) => table_getRowId(originalRow, table, index, parent) },\n\t\t\ttable_getRow: { fn: (id, searchAll) => table_getRow(table, id, searchAll) },\n\t\t\ttable_getMaxSubRowDepth: {\n\t\t\t\tfn: () => table_getMaxSubRowDepth(table),\n\t\t\t\tmemoDeps: () => [table.getCoreRowModel()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreRowsFeature };","import { cloneState, functionalUpdate } from \"../../utils.js\";\n\n//#region src/core/table/coreTablesFeature.utils.ts\n/**\n* Synchronizes externally controlled state slices into the table's base atoms.\n*\n* This keeps `options.state` values mirrored in the atom graph so derived\n* atoms, stores, and table APIs read a consistent snapshot.\n*\n* Adapters that update options during their host's render phase pass the\n* state snapshot captured by the committed render as `capturedState` — the\n* shared options object may already hold values from a newer render that\n* never commits. Pass `null` to publish nothing (a captured \"no controlled\n* state\"); omitting the argument reads the current `table.options.state`\n* instead. An optional `compare` suppresses semantically unchanged slice\n* writes; the default remains reference equality.\n*\n* @example\n* ```ts\n* table_syncExternalStateToBaseAtoms(table)\n* table_syncExternalStateToBaseAtoms(table, capturedState ?? null, shallow)\n* ```\n*/\nfunction table_syncExternalStateToBaseAtoms(table, capturedState, compare = (currentState, externalState) => currentState === externalState) {\n\tconst state = capturedState === void 0 ? table.options.state : capturedState;\n\ttable._reactivity.batch(() => {\n\t\tif (state) for (const key in state) {\n\t\t\tconst baseAtom = table.baseAtoms[key];\n\t\t\tif (!baseAtom) continue;\n\t\t\tconst rawExternalState = state[key];\n\t\t\tconst externalState = rawExternalState === void 0 ? table.initialState[key] : rawExternalState;\n\t\t\tif (!compare(table._reactivity.untrack(() => baseAtom.get()), externalState)) baseAtom.set(() => externalState);\n\t\t}\n\t});\n}\n/**\n* Publishes captured controlled state after a host framework commits.\n*\n* Render-phase adapters stage options without synchronizing base atoms, then\n* pass the state captured by the committed render here. The commit signal also\n* invalidates ownership changes when no base atom was written.\n*/\nfunction table_publishExternalState(table, state, compare = (currentState, externalState) => currentState === externalState) {\n\ttable._reactivity.batch(() => {\n\t\ttable_syncExternalStateToBaseAtoms(table, state, compare);\n\t\ttable._reactivity.commit?.();\n\t});\n}\n/**\n* Resets all internal table base atoms to `table.initialState`, then clears\n* transient instance data through registered feature reset hooks.\n*\n* This resets internally owned state slices in a single reactivity batch. Use\n* feature-specific reset APIs when a slice may be externally owned.\n*\n* @example\n* ```ts\n* table_reset(table)\n* ```\n*/\nfunction table_reset(table) {\n\tconst snap = cloneState(table.initialState);\n\ttable._reactivity.batch(() => {\n\t\tconst keys = Object.keys(snap);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\ttable.baseAtoms[key].set(snap[key]);\n\t\t}\n\t});\n\tconst features = Object.values(table._features);\n\tfor (let i = 0; i < features.length; i++) features[i].resetTableInstanceData?.(table);\n}\n/**\n* Merges new table options with the current resolved options.\n*\n* If `options.mergeOptions` is provided, it owns the merge behavior; otherwise\n* options are shallow-merged. Static options that should never change after\n* initialization are restored on a fresh object so framework merge helpers may\n* return readonly getter/proxy objects.\n*\n* @example\n* ```ts\n* const options = table_mergeOptions(table, nextOptions)\n* ```\n*/\nfunction table_mergeOptions(table, newOptions) {\n\tconst { features, atoms, initialState } = table.options;\n\tif (!table.options.mergeOptions) return {\n\t\t...table.options,\n\t\t...newOptions,\n\t\tfeatures,\n\t\tatoms,\n\t\tinitialState\n\t};\n\tconst mergedOptions = table.options.mergeOptions(table.options, newOptions);\n\tconst descriptors = { ...Object.getOwnPropertyDescriptors(mergedOptions) };\n\treturn Object.defineProperties(Object.create(Object.getPrototypeOf(mergedOptions)), {\n\t\t...descriptors,\n\t\tfeatures: {\n\t\t\tvalue: features,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tatoms: {\n\t\t\tvalue: atoms,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tinitialState: {\n\t\t\tvalue: initialState,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t}\n\t});\n}\n/**\n* Updates the table options object.\n*\n* The updater receives the current resolved options and the merged result is\n* immediately assigned to the table instance.\n*\n* @example\n* ```ts\n* table_setOptions(table, (old) => old)\n* table_setOptions(table, (old) => old, { syncExternalState: false })\n* ```\n*/\nfunction table_setOptions(table, updater, options) {\n\tconst mergedOptions = table_mergeOptions(table, functionalUpdate(updater, table.options));\n\tif (table.optionsStore) table.optionsStore.set(() => mergedOptions);\n\telse table.options = mergedOptions;\n\tif (options?.syncExternalState !== false) table_publishExternalState(table, mergedOptions.state ?? null);\n}\n\n//#endregion\nexport { table_mergeOptions, table_publishExternalState, table_reset, table_setOptions, table_syncExternalStateToBaseAtoms };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_reset, table_setOptions } from \"./coreTablesFeature.utils.js\";\n\n//#region src/core/table/coreTablesFeature.ts\n/**\n* Core feature that adds base table instance APIs such as reset and setOptions.\n*/\nconst coreTablesFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreTablesFeature\", table, {\n\t\ttable_reset: { fn: () => table_reset(table) },\n\t\ttable_setOptions: { fn: (updater) => table_setOptions(table, updater) }\n\t});\n} };\n\n//#endregion\nexport { coreTablesFeature };","import { coreCellsFeature } from \"./cells/coreCellsFeature.js\";\nimport { coreColumnsFeature } from \"./columns/coreColumnsFeature.js\";\nimport { coreHeadersFeature } from \"./headers/coreHeadersFeature.js\";\nimport { coreRowModelsFeature } from \"./row-models/coreRowModelsFeature.js\";\nimport { coreRowsFeature } from \"./rows/coreRowsFeature.js\";\nimport { coreTablesFeature } from \"./table/coreTablesFeature.js\";\n\n//#region src/core/coreFeatures.ts\n/**\n* The built-in core feature set required by every table.\n*\n* These features provide table, column, row, header, cell, and core row-model behavior before optional feature plugins are added.\n*/\nconst coreFeatures = {\n\tcoreCellsFeature,\n\tcoreColumnsFeature,\n\tcoreHeadersFeature,\n\tcoreRowModelsFeature,\n\tcoreRowsFeature,\n\tcoreTablesFeature\n};\n\n//#endregion\nexport { coreFeatures };","//#region src/helpers/tableFeatures.ts\n/**\n* A helper function to help define the features that are to be imported and applied to a table instance.\n* Use this utility to make it easier to have the correct type inference for the features that are being imported.\n* **Note:** It is recommended to use this utility statically outside of a component.\n*\n* Alongside feature modules, this object carries everything else that is\n* statically stitched into the table:\n*\n* - Row model factories (`sortedRowModel`, `filteredRowModel`, etc.)\n* - Row model function registries (`sortFns`, `filterFns`, `aggregationFns`),\n* whose keys become the valid string values for `sortFn`, `filterFn`,\n* `globalFilterFn`, and `aggregationFn` with full inference\n* - Type-only `tableMeta`/`columnMeta` slots for declaring per-table meta types\n* instead of using global declaration merging. The values are phantom\n* (ignored and stripped at runtime); only their types are used.\n* @example\n* ```\n* import {\n* columnFilteringFeature,\n* createFilteredRowModel,\n* createSortedRowModel,\n* filterFn_includesString,\n* rowSortingFeature,\n* sortFn_alphanumeric,\n* sortFn_text,\n* tableFeatures,\n* } from '@tanstack/react-table'\n* const features = tableFeatures({\n* columnFilteringFeature,\n* rowSortingFeature,\n* filteredRowModel: createFilteredRowModel(),\n* sortedRowModel: createSortedRowModel(),\n* filterFns: { includesString: filterFn_includesString, myCustomFilterFn },\n* sortFns: { alphanumeric: sortFn_alphanumeric, text: sortFn_text },\n* tableMeta: {} as { updateData: (rowIndex: number, columnId: string, value: unknown) => void },\n* columnMeta: {} as { align?: 'left' | 'right' },\n* });\n* const table = useTable({ features, columns, data });\n* ```\n*/\nfunction tableFeatures(features) {\n\treturn features;\n}\n\n//#endregion\nexport { tableFeatures };","//#region src/core/reactivity/coreReactivityFeature.utils.ts\n/**\n* Bridges atom instances to the `Store`/`ReadonlyStore` API by exposing\n* a `state` getter backed by `atom.get()`, and wiring `setState` for\n* writable atoms.\n*\n* @example\n* ```ts\n* const store = atomToStore(atom)\n* ```\n*/\nfunction atomToStore(atom) {\n\tconst store = atom;\n\tObject.defineProperty(atom, \"state\", { get() {\n\t\treturn atom.get();\n\t} });\n\tif (\"set\" in atom) store.setState = atom.set.bind(atom);\n\treturn store;\n}\n\n//#endregion\nexport { atomToStore };","//#region src/alien.ts\nconst NONE = 0;\nconst MUTABLE = 1;\nconst WATCHING = 2;\nconst RECURSED_CHECK = 4;\nconst RECURSED = 8;\nconst DIRTY = 16;\nconst PENDING = 32;\n/* @__NO_SIDE_EFFECTS__ */\nfunction createReactiveSystem({ update, notify, unwatched }) {\n\treturn {\n\t\tlink,\n\t\tunlink,\n\t\tpropagate,\n\t\tcheckDirty,\n\t\tshallowPropagate\n\t};\n\tfunction link(dep, sub, version) {\n\t\tconst prevDep = sub.depsTail;\n\t\tif (prevDep !== void 0 && prevDep.dep === dep) return;\n\t\tconst nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;\n\t\tif (nextDep !== void 0 && nextDep.dep === dep) {\n\t\t\tnextDep.version = version;\n\t\t\tsub.depsTail = nextDep;\n\t\t\treturn;\n\t\t}\n\t\tconst prevSub = dep.subsTail;\n\t\tif (prevSub !== void 0 && prevSub.version === version && prevSub.sub === sub) return;\n\t\tconst newLink = sub.depsTail = dep.subsTail = {\n\t\t\tversion,\n\t\t\tdep,\n\t\t\tsub,\n\t\t\tprevDep,\n\t\t\tnextDep,\n\t\t\tprevSub,\n\t\t\tnextSub: void 0\n\t\t};\n\t\tif (nextDep !== void 0) nextDep.prevDep = newLink;\n\t\tif (prevDep !== void 0) prevDep.nextDep = newLink;\n\t\telse sub.deps = newLink;\n\t\tif (prevSub !== void 0) prevSub.nextSub = newLink;\n\t\telse dep.subs = newLink;\n\t}\n\tfunction unlink(link, sub = link.sub) {\n\t\tconst dep = link.dep;\n\t\tconst prevDep = link.prevDep;\n\t\tconst nextDep = link.nextDep;\n\t\tconst nextSub = link.nextSub;\n\t\tconst prevSub = link.prevSub;\n\t\tif (nextDep !== void 0) nextDep.prevDep = prevDep;\n\t\telse sub.depsTail = prevDep;\n\t\tif (prevDep !== void 0) prevDep.nextDep = nextDep;\n\t\telse sub.deps = nextDep;\n\t\tif (nextSub !== void 0) nextSub.prevSub = prevSub;\n\t\telse dep.subsTail = prevSub;\n\t\tif (prevSub !== void 0) prevSub.nextSub = nextSub;\n\t\telse if ((dep.subs = nextSub) === void 0) unwatched(dep);\n\t\treturn nextDep;\n\t}\n\tfunction propagate(link) {\n\t\tlet next = link.nextSub;\n\t\tlet stack;\n\t\ttop: do {\n\t\t\tconst sub = link.sub;\n\t\t\tlet flags = sub.flags;\n\t\t\tif (!(flags & 60)) sub.flags = flags | 32;\n\t\t\telse if (!(flags & (4 | 8))) flags = 0;\n\t\t\telse if (!(flags & 4)) sub.flags = flags & ~8 | 32;\n\t\t\telse if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n\t\t\t\tsub.flags = flags | (8 | 32);\n\t\t\t\tflags &= 1;\n\t\t\t} else flags = 0;\n\t\t\tif (flags & 2) notify(sub);\n\t\t\tif (flags & 1) {\n\t\t\t\tconst subSubs = sub.subs;\n\t\t\t\tif (subSubs !== void 0) {\n\t\t\t\t\tconst nextSub = (link = subSubs).nextSub;\n\t\t\t\t\tif (nextSub !== void 0) {\n\t\t\t\t\t\tstack = {\n\t\t\t\t\t\t\tvalue: next,\n\t\t\t\t\t\t\tprev: stack\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnext = nextSub;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((link = next) !== void 0) {\n\t\t\t\tnext = link.nextSub;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twhile (stack !== void 0) {\n\t\t\t\tlink = stack.value;\n\t\t\t\tstack = stack.prev;\n\t\t\t\tif (link !== void 0) {\n\t\t\t\t\tnext = link.nextSub;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t} while (true);\n\t}\n\tfunction checkDirty(link, sub) {\n\t\tlet stack;\n\t\tlet checkDepth = 0;\n\t\tlet dirty = false;\n\t\ttop: do {\n\t\t\tconst dep = link.dep;\n\t\t\tconst flags = dep.flags;\n\t\t\tif (sub.flags & 16) dirty = true;\n\t\t\telse if ((flags & (1 | 16)) === (1 | 16)) {\n\t\t\t\tif (update(dep)) {\n\t\t\t\t\tconst subs = dep.subs;\n\t\t\t\t\tif (subs.nextSub !== void 0) shallowPropagate(subs);\n\t\t\t\t\tdirty = true;\n\t\t\t\t}\n\t\t\t} else if ((flags & (1 | 32)) === (1 | 32)) {\n\t\t\t\tif (link.nextSub !== void 0 || link.prevSub !== void 0) stack = {\n\t\t\t\t\tvalue: link,\n\t\t\t\t\tprev: stack\n\t\t\t\t};\n\t\t\t\tlink = dep.deps;\n\t\t\t\tsub = dep;\n\t\t\t\t++checkDepth;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!dirty) {\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (checkDepth--) {\n\t\t\t\tconst firstSub = sub.subs;\n\t\t\t\tconst hasMultipleSubs = firstSub.nextSub !== void 0;\n\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\tlink = stack.value;\n\t\t\t\t\tstack = stack.prev;\n\t\t\t\t} else link = firstSub;\n\t\t\t\tif (dirty) {\n\t\t\t\t\tif (update(sub)) {\n\t\t\t\t\t\tif (hasMultipleSubs) shallowPropagate(firstSub);\n\t\t\t\t\t\tsub = link.sub;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdirty = false;\n\t\t\t\t} else sub.flags &= ~32;\n\t\t\t\tsub = link.sub;\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dirty;\n\t\t} while (true);\n\t}\n\tfunction shallowPropagate(link) {\n\t\tdo {\n\t\t\tconst sub = link.sub;\n\t\t\tconst flags = sub.flags;\n\t\t\tif ((flags & (32 | 16)) === 32) {\n\t\t\t\tsub.flags = flags | 16;\n\t\t\t\tif ((flags & (2 | 4)) === 2) notify(sub);\n\t\t\t}\n\t\t} while ((link = link.nextSub) !== void 0);\n\t}\n\tfunction isValidLink(checkLink, sub) {\n\t\tlet link = sub.depsTail;\n\t\twhile (link !== void 0) {\n\t\t\tif (link === checkLink) return true;\n\t\t\tlink = link.prevDep;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n//#endregion\nexport { createReactiveSystem };\n//# sourceMappingURL=alien.js.map","import { createReactiveSystem } from \"./alien.js\";\n\n//#region src/atom.ts\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n\tconst isObserver = typeof nextHandler === \"object\";\n\tconst self = isObserver ? nextHandler : void 0;\n\treturn {\n\t\tnext: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n\t\terror: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n\t\tcomplete: (isObserver ? nextHandler.complete : completionHandler)?.bind(self)\n\t};\n}\nconst queuedEffects = [];\nlet cycle = 0;\nconst { link, unlink, propagate, checkDirty, shallowPropagate } = /* @__PURE__ */ createReactiveSystem({\n\tupdate(atom) {\n\t\treturn atom._update();\n\t},\n\tnotify(effect) {\n\t\tqueuedEffects[queuedEffectsLength++] = effect;\n\t\teffect.flags &= ~2;\n\t},\n\tunwatched(atom) {\n\t\tif (atom.depsTail !== void 0) {\n\t\t\tatom.depsTail = void 0;\n\t\t\tatom.flags = 1 | 16;\n\t\t\tpurgeDeps(atom);\n\t\t}\n\t}\n});\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub;\nlet batchDepth = 0;\nfunction batch(fn) {\n\ttry {\n\t\t++batchDepth;\n\t\tfn();\n\t} finally {\n\t\tif (!--batchDepth) flush();\n\t}\n}\nfunction purgeDeps(sub) {\n\tconst depsTail = sub.depsTail;\n\tlet dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;\n\twhile (dep !== void 0) dep = unlink(dep, sub);\n}\nfunction flush() {\n\tif (batchDepth > 0) return;\n\twhile (notifyIndex < queuedEffectsLength) {\n\t\tconst effect = queuedEffects[notifyIndex];\n\t\tqueuedEffects[notifyIndex++] = void 0;\n\t\teffect.notify();\n\t}\n\tnotifyIndex = 0;\n\tqueuedEffectsLength = 0;\n}\nfunction createAsyncAtom(getValue, options) {\n\tconst ref = {};\n\tconst atom = createAtom(() => {\n\t\tgetValue().then((data) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"done\",\n\t\t\t\tdata\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t}, (error) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn { status: \"pending\" };\n\t}, options);\n\tref.current = atom;\n\treturn atom;\n}\nfunction createAtom(valueOrFn, options) {\n\tconst isComputed = typeof valueOrFn === \"function\";\n\tconst getter = valueOrFn;\n\tconst atom = {\n\t\t_snapshot: isComputed ? void 0 : valueOrFn,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tflags: isComputed ? 0 : 1,\n\t\tget() {\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t},\n\t\tsubscribe(observerOrFn) {\n\t\t\tconst obs = toObserver(observerOrFn);\n\t\t\tconst observed = { current: false };\n\t\t\tconst e = effect(() => {\n\t\t\t\tatom.get();\n\t\t\t\tif (!observed.current) observed.current = true;\n\t\t\t\telse {\n\t\t\t\t\tactiveSub = void 0;\n\t\t\t\t\tobs.next?.(atom._snapshot);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn { unsubscribe: () => {\n\t\t\t\te.stop();\n\t\t\t} };\n\t\t},\n\t\t_update(getValue) {\n\t\t\tconst prevSub = activeSub;\n\t\t\tconst compare = options?.compare ?? Object.is;\n\t\t\tif (isComputed) {\n\t\t\t\tactiveSub = atom;\n\t\t\t\t++cycle;\n\t\t\t\tatom.depsTail = void 0;\n\t\t\t} else if (getValue === void 0) return false;\n\t\t\tif (isComputed) atom.flags = 1 | 4;\n\t\t\ttry {\n\t\t\t\tconst oldValue = atom._snapshot;\n\t\t\t\tconst newValue = typeof getValue === \"function\" ? getValue(oldValue) : getValue === void 0 && isComputed ? getter(oldValue) : getValue;\n\t\t\t\tif (oldValue === void 0 || !compare(oldValue, newValue)) {\n\t\t\t\t\tatom._snapshot = newValue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tactiveSub = prevSub;\n\t\t\t\tif (isComputed) atom.flags &= ~4;\n\t\t\t\tpurgeDeps(atom);\n\t\t\t}\n\t\t}\n\t};\n\tif (isComputed) {\n\t\tatom.flags = 1 | 16;\n\t\tatom.get = function() {\n\t\t\tconst flags = atom.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) {\n\t\t\t\tif (atom._update()) {\n\t\t\t\t\tconst subs = atom.subs;\n\t\t\t\t\tif (subs !== void 0) shallowPropagate(subs);\n\t\t\t\t}\n\t\t\t} else if (flags & 32) atom.flags = flags & ~32;\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t};\n\t} else atom.set = function(valueOrFn) {\n\t\tif (atom._update(valueOrFn)) {\n\t\t\tconst subs = atom.subs;\n\t\t\tif (subs !== void 0) {\n\t\t\t\tpropagate(subs);\n\t\t\t\tshallowPropagate(subs);\n\t\t\t\tflush();\n\t\t\t}\n\t\t}\n\t};\n\treturn atom;\n}\nfunction effect(fn) {\n\tconst run = () => {\n\t\tconst prevSub = activeSub;\n\t\tactiveSub = effectObj;\n\t\t++cycle;\n\t\teffectObj.depsTail = void 0;\n\t\teffectObj.flags = 2 | 4;\n\t\ttry {\n\t\t\treturn fn();\n\t\t} finally {\n\t\t\tactiveSub = prevSub;\n\t\t\teffectObj.flags &= ~4;\n\t\t\tpurgeDeps(effectObj);\n\t\t}\n\t};\n\tconst effectObj = {\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tflags: 2 | 4,\n\t\tnotify() {\n\t\t\tconst flags = this.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run();\n\t\t\telse this.flags = 2;\n\t\t},\n\t\tstop() {\n\t\t\tthis.flags = 0;\n\t\t\tthis.depsTail = void 0;\n\t\t\tpurgeDeps(this);\n\t\t}\n\t};\n\trun();\n\treturn effectObj;\n}\n\n//#endregion\nexport { batch, createAsyncAtom, createAtom, flush, toObserver };\n//# sourceMappingURL=atom.js.map","//#region src/shallow.ts\nfunction shallow(objA, objB) {\n\tif (Object.is(objA, objB)) return true;\n\tif (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) return false;\n\tif (objA instanceof Map && objB instanceof Map) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const [k, v] of objA) if (!objB.has(k) || !Object.is(v, objB.get(k))) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Set && objB instanceof Set) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const v of objA) if (!objB.has(v)) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Date && objB instanceof Date) {\n\t\tif (objA.getTime() !== objB.getTime()) return false;\n\t\treturn true;\n\t}\n\tconst keysA = getOwnKeys(objA);\n\tif (keysA.length !== getOwnKeys(objB).length) return false;\n\tfor (let i = 0; i < keysA.length; i++) if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) return false;\n\treturn true;\n}\nfunction getOwnKeys(obj) {\n\treturn Object.keys(obj).concat(Object.getOwnPropertySymbols(obj));\n}\n\n//#endregion\nexport { shallow };\n//# sourceMappingURL=shallow.js.map","import { cloneState, hasOwn } from \"../../utils.js\";\nimport { table_syncExternalStateToBaseAtoms } from \"./coreTablesFeature.utils.js\";\nimport { coreFeatures } from \"../coreFeatures.js\";\nimport { atomToStore } from \"../reactivity/coreReactivityFeature.utils.js\";\nimport { shallow } from \"@tanstack/store\";\n\n//#region src/core/table/constructTable.ts\n/**\n* Builds the initial table state from registered features and user initial state.\n*\n* Each feature contributes its default state before user-provided `initialState` values are merged in.\n*/\nfunction getInitialTableState(features, initialState = {}) {\n\tObject.values(features).forEach((feature) => {\n\t\tinitialState = feature.getInitialState?.(initialState) ?? initialState;\n\t});\n\treturn cloneState(initialState);\n}\n/**\n* Constructs a table instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructTable(tableOptions) {\n\tconst _reactivity = tableOptions.features.coreReactivityFeature;\n\tconst { aggregationFns, columnMeta: _columnMeta, coreRowModel, expandedRowModel, facetedMinMaxValues, facetedRowModel, facetedUniqueValues, filterFns, filterMeta: _filterMeta, filteredRowModel, groupedRowModel, paginatedRowModel, sortFns, sortedRowModel, tableMeta: _tableMeta, ...features } = tableOptions.features;\n\tconst table = {\n\t\t_cellInstanceInitFns: [],\n\t\t_columnInstanceInitFns: [],\n\t\t_features: {\n\t\t\t...coreFeatures,\n\t\t\t...features\n\t\t},\n\t\t_headerGroupInstanceInitFns: [],\n\t\t_headerInstanceInitFns: [],\n\t\t_reactivity,\n\t\t_rowInstanceInitFns: [],\n\t\t_rowModelFns: {\n\t\t\taggregationFns,\n\t\t\tfilterFns,\n\t\t\tsortFns\n\t\t},\n\t\t_rowModels: {},\n\t\tatoms: {},\n\t\tbaseAtoms: {}\n\t};\n\tconst featuresList = Object.values(table._features);\n\tconst mergedOptions = {\n\t\t...featuresList.reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultTableOptions?.(table));\n\t\t}, {}),\n\t\t...tableOptions\n\t};\n\tif (_reactivity.wrapExternalAtoms && mergedOptions.atoms) for (const [atomKey, _atom] of Object.entries(mergedOptions.atoms)) {\n\t\tconst atom = _atom;\n\t\tconst wrappedAtom = _reactivity.createWritableAtom(atom.get(), { debugName: `externalAtom/${atomKey}` });\n\t\tmergedOptions.atoms[atomKey] = wrappedAtom;\n\t\tlet syncExternal = false;\n\t\tconst syncAtomToWrappedSub = atom.subscribe((value) => {\n\t\t\tif (syncExternal) return;\n\t\t\twrappedAtom.set(value);\n\t\t});\n\t\tconst syncWrappedToAtomSub = wrappedAtom.subscribe((value) => {\n\t\t\tsyncExternal = true;\n\t\t\tatom.set(value);\n\t\t\tsyncExternal = false;\n\t\t});\n\t\t_reactivity.addSubscription(syncAtomToWrappedSub);\n\t\t_reactivity.addSubscription(syncWrappedToAtomSub);\n\t}\n\tif (_reactivity.createOptionsStore) {\n\t\ttable.optionsStore = _reactivity.createWritableAtom(mergedOptions, { debugName: \"table/optionsStore\" });\n\t\tObject.defineProperty(table, \"options\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tget() {\n\t\t\t\treturn table.optionsStore.get();\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\ttable.optionsStore.set(() => value);\n\t\t\t}\n\t\t});\n\t} else table.options = mergedOptions;\n\ttable.initialState = getInitialTableState(table._features, table.options.initialState);\n\tconst stateKeys = Object.keys(table.initialState);\n\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\tconst key = stateKeys[i];\n\t\ttable.baseAtoms[key] = _reactivity.createWritableAtom(table.initialState[key], { debugName: `table/baseAtoms/${key}` });\n\t\ttable.atoms[key] = _reactivity.createReadonlyAtom(() => {\n\t\t\tconst options = table.options;\n\t\t\tconst externalAtom = options.atoms?.[key];\n\t\t\tconst reactiveState = externalAtom ? externalAtom.get() : table.baseAtoms[key].get();\n\t\t\tif (externalAtom) return reactiveState;\n\t\t\tconst controlledState = options.state;\n\t\t\tif (controlledState && hasOwn(controlledState, key)) {\n\t\t\t\tconst controlledValue = controlledState[key];\n\t\t\t\treturn controlledValue === void 0 ? table.initialState[key] : controlledValue;\n\t\t\t}\n\t\t\treturn reactiveState;\n\t\t}, { debugName: `table/atoms/${key}` });\n\t}\n\ttable_syncExternalStateToBaseAtoms(table);\n\ttable.store = atomToStore(_reactivity.createReadonlyAtom(() => {\n\t\tconst snapshot = {};\n\t\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\t\tconst key = stateKeys[i];\n\t\t\tsnapshot[key] = table.atoms[key].get();\n\t\t}\n\t\treturn snapshot;\n\t}, {\n\t\tcompare: shallow,\n\t\tdebugName: \"table/store\"\n\t}));\n\tfor (let i = 0; i < featuresList.length; i++) {\n\t\tconst feature = featuresList[i];\n\t\tfeature.initTableInstanceData?.(table);\n\t\tif (feature.initCellInstanceData) table._cellInstanceInitFns.push(feature.initCellInstanceData.bind(feature));\n\t\tif (feature.initColumnInstanceData) table._columnInstanceInitFns.push(feature.initColumnInstanceData.bind(feature));\n\t\tif (feature.initHeaderGroupInstanceData) table._headerGroupInstanceInitFns.push(feature.initHeaderGroupInstanceData.bind(feature));\n\t\tif (feature.initHeaderInstanceData) table._headerInstanceInitFns.push(feature.initHeaderInstanceData.bind(feature));\n\t\tif (feature.initRowInstanceData) table._rowInstanceInitFns.push(feature.initRowInstanceData.bind(feature));\n\t\tfeature.constructTableAPIs?.(table);\n\t}\n\tif (process.env.NODE_ENV === \"development\" && (tableOptions.debugAll || tableOptions.debugTable)) {\n\t\tconst features = Object.keys(table._features);\n\t\tconst rowModels = Object.entries({\n\t\t\tcoreRowModel,\n\t\t\tfilteredRowModel,\n\t\t\tgroupedRowModel,\n\t\t\tsortedRowModel,\n\t\t\texpandedRowModel,\n\t\t\tpaginatedRowModel,\n\t\t\tfacetedRowModel,\n\t\t\tfacetedMinMaxValues,\n\t\t\tfacetedUniqueValues\n\t\t}).filter(([, factory]) => factory).map(([key]) => key);\n\t\tconst states = Object.keys(table.initialState);\n\t\tconsole.log(`Constructing Table Instance\n\n Features: ${features.join(\"\\n \")}\n\n Row Models: ${rowModels.length ? rowModels.join(\"\\n \") : \"(none)\"}\n\n States: ${states.join(\"\\n \")}\\n`, { table });\n\t}\n\treturn table;\n}\n\n//#endregion\nexport { constructTable, getInitialTableState };","import { callMemoOrStaticFn, cloneState, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { getPinnedVisibleLeafColumns } from \"../../core/featureStubs.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.utils.ts\n/**\n* Creates the default committed column sizing state.\n*\n* The feature default is an empty map, so columns fall back to their column def\n* size or the built-in sizing defaults.\n*\n* @example\n* ```ts\n* const sizing = getDefaultColumnSizingState()\n* ```\n*/\nfunction getDefaultColumnSizingState() {\n\treturn makeObjectMap();\n}\n/**\n* Creates the built-in sizing defaults for column definitions.\n*\n* Columns default to `size: 150`, `minSize: 20`, and\n* `maxSize: Number.MAX_SAFE_INTEGER` unless overridden by column definitions or\n* table defaults.\n*\n* @example\n* ```ts\n* const defaults = getDefaultColumnSizingColumnDef()\n* ```\n*/\nfunction getDefaultColumnSizingColumnDef() {\n\treturn {\n\t\tsize: 150,\n\t\tminSize: 20,\n\t\tmaxSize: Number.MAX_SAFE_INTEGER\n\t};\n}\n/**\n* Resolves a column's current pixel size.\n*\n* Committed `state.columnSizing[column.id]` wins over `columnDef.size`, then the\n* built-in default size. The result is clamped between min and max size.\n*\n* @example\n* ```ts\n* const width = column_getSize(column)\n* ```\n*/\nfunction column_getSize(column) {\n\tconst defaultSizes = getDefaultColumnSizingColumnDef();\n\tconst columnSizing = column.table.atoms.columnSizing?.get();\n\tconst columnSize = columnSizing && hasOwn(columnSizing, column.id) ? columnSizing[column.id] : void 0;\n\treturn Math.min(Math.max(column.columnDef.minSize ?? defaultSizes.minSize, columnSize ?? column.columnDef.size ?? defaultSizes.size), column.columnDef.maxSize ?? defaultSizes.maxSize);\n}\nfunction buildColumnOffsets(columns) {\n\tconst starts = makeObjectMap();\n\tconst afters = makeObjectMap();\n\tconst sizes = new Array(columns.length);\n\tlet start = 0;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tconst size = callMemoOrStaticFn(column, \"getSize\", column_getSize);\n\t\tsizes[i] = size;\n\t\tstarts[column.id] = start;\n\t\tstart += size;\n\t}\n\tlet after = 0;\n\tfor (let i = columns.length - 1; i >= 0; i--) {\n\t\tafters[columns[i].id] = after;\n\t\tafter += sizes[i];\n\t}\n\treturn {\n\t\tstarts,\n\t\tafters\n\t};\n}\n/**\n* Builds start and after offset maps for every visible leaf column, computed\n* once per pinning region plus the full visible list.\n*\n* A single table-level memo of this result backs all `column.getStart()` and\n* `column.getAfter()` calls with O(1) lookups.\n*\n* @example\n* ```ts\n* const offsets = table_getColumnOffsets(table)\n* const startOffset = offsets.start.starts[column.id]\n* ```\n*/\nfunction table_getColumnOffsets(table) {\n\treturn {\n\t\tall: buildColumnOffsets(getPinnedVisibleLeafColumns(table)),\n\t\tcenter: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"center\")),\n\t\tstart: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"start\")),\n\t\tend: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"end\"))\n\t};\n}\nfunction toOffsetsKey(position) {\n\treturn position === \"start\" ? \"start\" : position === \"end\" ? \"end\" : position === \"center\" ? \"center\" : \"all\";\n}\n/**\n* Computes the offset from the start edge of a pinning region to this column.\n*\n* The value is the sum of all previous visible leaf column sizes in the\n* requested `'start'`, `'center'`, or `'end'` region.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* const startOffset = column_getStart(column, 'start')\n* ```\n*/\nfunction column_getStart(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].starts[column.id] ?? 0;\n}\n/**\n* Computes the offset from the end edge of a pinning region after this column.\n*\n* The value is the sum of all following visible leaf column sizes in the\n* requested region.\n*\n* @example\n* ```ts\n* const endOffset = column_getAfter(column, 'end')\n* ```\n*/\nfunction column_getAfter(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].afters[column.id] ?? 0;\n}\n/**\n* Removes this column's committed size override.\n*\n* After reset, the column resolves size from `columnDef.size` or built-in\n* defaults again.\n*\n* @example\n* ```ts\n* column_resetSize(column)\n* ```\n*/\nfunction column_resetSize(column) {\n\ttable_setColumnSizing(column.table, (old) => {\n\t\tconst rest = makeObjectMap();\n\t\tconst columnIds = Object.keys(old);\n\t\tfor (let i = 0; i < columnIds.length; i++) {\n\t\t\tconst columnId = columnIds[i];\n\t\t\tif (columnId !== column.id) rest[columnId] = old[columnId];\n\t\t}\n\t\treturn rest;\n\t});\n}\nfunction sumHeaderSize(header) {\n\tif (!header.subHeaders.length) return column_getSize(header.column);\n\tlet sum = 0;\n\tfor (let i = 0; i < header.subHeaders.length; i++) sum += sumHeaderSize(header.subHeaders[i]);\n\treturn sum;\n}\n/**\n* Computes a header's rendered size from its leaf headers.\n*\n* Group headers sum the sizes of all descendant leaf columns. Leaf headers use\n* their column's current size.\n*\n* @example\n* ```ts\n* const width = header_getSize(header)\n* ```\n*/\nfunction header_getSize(header) {\n\treturn sumHeaderSize(header);\n}\n/**\n* Computes a header's offset from the start of its header group.\n*\n* The offset is the previous sibling header's start plus size, or `0` for the\n* first header in the group.\n*\n* @example\n* ```ts\n* const offset = header_getStart(header)\n* ```\n*/\nfunction header_getStart(header) {\n\tif (header.index > 0) {\n\t\tconst prevSiblingHeader = header.headerGroup?.headers[header.index - 1];\n\t\tif (prevSiblingHeader) return callMemoOrStaticFn(prevSiblingHeader, \"getStart\", header_getStart) + callMemoOrStaticFn(prevSiblingHeader, \"getSize\", header_getSize);\n\t}\n\treturn 0;\n}\n/**\n* Routes a committed column sizing updater through the table's sizing handler.\n*\n* The updater may be a next size map or a function of the previous map,\n* matching the instance `table.setColumnSizing` behavior.\n*\n* @example\n* ```ts\n* table_setColumnSizing(table, (old) => ({ ...old, age: 96 }))\n* ```\n*/\nfunction table_setColumnSizing(table, updater) {\n\ttable.options.onColumnSizingChange?.(updater);\n}\n/**\n* Resets `columnSizing` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnSizing` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetColumnSizing(table)\n* table_resetColumnSizing(table, true)\n* ```\n*/\nfunction table_resetColumnSizing(table, defaultState) {\n\ttable_setColumnSizing(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.columnSizing ?? {})));\n}\nfunction sumColumnSizes(columns) {\n\tlet sum = 0;\n\tfor (let i = 0; i < columns.length; i++) sum += callMemoOrStaticFn(columns[i], \"getSize\", column_getSize);\n\treturn sum;\n}\n/**\n* Sums the rendered size of the full table header row.\n*\n* This includes start, center, and end columns in the main header group.\n*\n* @example\n* ```ts\n* const width = table_getTotalSize(table)\n* ```\n*/\nfunction table_getTotalSize(table) {\n\treturn table.getHeaderGroups()[0]?.headers.reduce((sum, header) => {\n\t\treturn sum + header_getSize(header);\n\t}, 0) ?? 0;\n}\n/**\n* Sums the sizes of the visible leaf columns pinned to the logical start\n* region.\n*\n* An empty start pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getStartTotalSize(table)\n* ```\n*/\nfunction table_getStartTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"start\"));\n}\n/**\n* Sums the sizes of the visible leaf columns that are not pinned.\n*\n* An empty center region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getCenterTotalSize(table)\n* ```\n*/\nfunction table_getCenterTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"center\"));\n}\n/**\n* Sums the sizes of the visible leaf columns pinned to the logical end region.\n*\n* An empty end pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getEndTotalSize(table)\n* ```\n*/\nfunction table_getEndTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"end\"));\n}\n\n//#endregion\nexport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing } from \"./columnSizingFeature.utils.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.ts\n/**\n* Feature that adds column sizing state, defaults, and size measurement APIs.\n*/\nconst columnSizingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnSizing: getDefaultColumnSizingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef: () => {\n\t\treturn getDefaultColumnSizingColumnDef();\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnSizingChange: makeStateUpdater(\"columnSizing\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\tcolumn_getSize: {\n\t\t\t\tfn: (column) => column_getSize(column),\n\t\t\t\tmemoDeps: (column) => [table.options.columns, table.atoms.columnSizing?.get()?.[column.id]]\n\t\t\t},\n\t\t\tcolumn_getStart: { fn: (column, position) => column_getStart(column, position) },\n\t\t\tcolumn_getAfter: { fn: (column, position) => column_getAfter(column, position) },\n\t\t\tcolumn_resetSize: { fn: (column) => column_resetSize(column) }\n\t\t});\n\t},\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\theader_getSize: {\n\t\t\t\tfn: (header) => header_getSize(header),\n\t\t\t\tmemoDeps: (header) => [table.options.columns, header.column.columns.length > 0 ? table.atoms.columnSizing?.get() : table.atoms.columnSizing?.get()?.[header.column.id]]\n\t\t\t},\n\t\t\theader_getStart: {\n\t\t\t\tfn: (header) => header_getStart(header),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnSizingFeature\", table, {\n\t\t\ttable_getColumnOffsets: {\n\t\t\t\tfn: () => table_getColumnOffsets(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_setColumnSizing: { fn: (updater) => table_setColumnSizing(table, updater) },\n\t\t\ttable_resetColumnSizing: { fn: (defaultState) => table_resetColumnSizing(table, defaultState) },\n\t\t\ttable_getTotalSize: {\n\t\t\t\tfn: () => table_getTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getStartTotalSize: {\n\t\t\t\tfn: () => table_getStartTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getCenterTotalSize: {\n\t\t\t\tfn: () => table_getCenterTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getEndTotalSize: {\n\t\t\t\tfn: () => table_getEndTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnSizingFeature };","//#region src/features/row-sorting/sortFns.ts\n/**\n* Regular expression used to split mixed text and numeric chunks.\n*\n* The alphanumeric sort functions use these chunks for natural sorting of\n* strings like `item2` before `item10`.\n*/\nconst reSplitAlphaNumeric = /([0-9]+)/gm;\n/**\n* Builds a `SortFn` from a value-level comparator plus an optional\n* `resolveDataValue` normalizer.\n*\n* The `sort` comparator receives both rows' data values, each already passed\n* through `resolveDataValue` when one is defined. Keeping normalization in the\n* resolver means a variant of an existing sorting function only has to swap\n* the resolver, not re-implement the comparison.\n*\n* The definition is attached to the returned function, so a variant can be\n* created by spreading a built-in sorting function and overriding what\n* differs:\n*\n* ```ts\n* const stripDiacritics = (value: string) =>\n* value.normalize('NFD').replace(/\\p{Diacritic}/gu, '')\n*\n* const alphanumericIgnoreDiacritics = constructSortFn({\n* ...sortFn_alphanumeric,\n* resolveDataValue: (value) =>\n* stripDiacritics(sortFn_alphanumeric.resolveDataValue!(value)),\n* })\n* ```\n*/\n/* @__NO_SIDE_EFFECTS__ */\nfunction constructSortFn(def) {\n\tconst sortFn = Object.assign((rowA, rowB, columnId) => {\n\t\tlet dataValueA = rowA.getValue(columnId);\n\t\tlet dataValueB = rowB.getValue(columnId);\n\t\tconst resolveDataValue = sortFn.resolveDataValue;\n\t\tif (resolveDataValue) {\n\t\t\tdataValueA = resolveDataValue(dataValueA);\n\t\t\tdataValueB = resolveDataValue(dataValueB);\n\t\t}\n\t\treturn sortFn.sort(dataValueA, dataValueB, rowA, rowB, columnId);\n\t}, def);\n\treturn sortFn;\n}\n/**\n* Sorts rows with the built-in alphanumeric strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumeric = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in alphanumeric case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumericCaseSensitive = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_text = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_textCaseSensitive = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in datetime strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_datetime = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toDateSortValue(dataValue),\n\tsort: (dataValueA, dataValueB) => dataValueA > dataValueB ? 1 : dataValueA < dataValueB ? -1 : 0\n});\n/**\n* Sorts rows with the built-in basic strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_basic = /* @__PURE__ */ constructSortFn({ sort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB) });\nfunction compareBasic(a, b) {\n\treturn a === b ? 0 : a > b ? 1 : -1;\n}\nfunction toDateSortValue(value) {\n\treturn value instanceof Date ? value.getTime() : value;\n}\nfunction toString(a) {\n\tif (typeof a === \"number\") {\n\t\tif (isNaN(a) || a === Infinity || a === -Infinity) return \"\";\n\t\treturn String(a);\n\t}\n\tif (typeof a === \"string\") return a;\n\treturn \"\";\n}\nfunction compareAlphanumeric(aStr, bStr) {\n\tlet ai = 0;\n\tlet bi = 0;\n\tconst aLen = aStr.length;\n\tconst bLen = bStr.length;\n\twhile (ai < aLen && bi < bLen) {\n\t\tconst aIsNumeric = isDigit(aStr.charCodeAt(ai));\n\t\tconst bIsNumeric = isDigit(bStr.charCodeAt(bi));\n\t\tconst aEnd = findChunkEnd(aStr, ai, aIsNumeric);\n\t\tconst bEnd = findChunkEnd(bStr, bi, bIsNumeric);\n\t\tif (!aIsNumeric && !bIsNumeric) {\n\t\t\tconst stringComparison = compareStringChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\t\tif (stringComparison) return stringComparison;\n\t\t\tai = aEnd;\n\t\t\tbi = bEnd;\n\t\t\tcontinue;\n\t\t}\n\t\tif (aIsNumeric !== bIsNumeric) return aIsNumeric ? 1 : -1;\n\t\tconst numericComparison = compareNumericChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\tif (numericComparison) return numericComparison;\n\t\tai = aEnd;\n\t\tbi = bEnd;\n\t}\n\treturn countRemainingChunks(aStr, ai) - countRemainingChunks(bStr, bi);\n}\nfunction isDigit(charCode) {\n\treturn charCode >= 48 && charCode <= 57;\n}\nfunction findChunkEnd(str, start, isNumeric) {\n\tlet end = start + 1;\n\twhile (end < str.length && isDigit(str.charCodeAt(end)) === isNumeric) end++;\n\treturn end;\n}\nfunction compareStringChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tconst aLength = aEnd - aStart;\n\tconst bLength = bEnd - bStart;\n\tconst minLength = aLength < bLength ? aLength : bLength;\n\tfor (let i = 0; i < minLength; i++) {\n\t\tconst aCode = aStr.charCodeAt(aStart + i);\n\t\tconst bCode = bStr.charCodeAt(bStart + i);\n\t\tif (aCode > bCode) return 1;\n\t\tif (bCode > aCode) return -1;\n\t}\n\tif (aLength > bLength) return 1;\n\tif (bLength > aLength) return -1;\n\treturn 0;\n}\nfunction compareNumericChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tlet aSignificantStart = aStart;\n\twhile (aSignificantStart < aEnd && aStr.charCodeAt(aSignificantStart) === 48) aSignificantStart++;\n\tlet bSignificantStart = bStart;\n\twhile (bSignificantStart < bEnd && bStr.charCodeAt(bSignificantStart) === 48) bSignificantStart++;\n\tconst aSignificantLength = aEnd - aSignificantStart;\n\tconst bSignificantLength = bEnd - bSignificantStart;\n\tif (aSignificantLength === 0 && bSignificantLength === 0) return 0;\n\tif (aSignificantLength <= 15 && bSignificantLength <= 15) {\n\t\tconst an = parseSmallInt(aStr, aSignificantStart, aEnd);\n\t\tconst bn = parseSmallInt(bStr, bSignificantStart, bEnd);\n\t\tif (an > bn) return 1;\n\t\tif (bn > an) return -1;\n\t\treturn 0;\n\t}\n\tconst an = parseInt(aStr.slice(aStart, aEnd), 10);\n\tconst bn = parseInt(bStr.slice(bStart, bEnd), 10);\n\tif (an > bn) return 1;\n\tif (bn > an) return -1;\n\treturn 0;\n}\nfunction parseSmallInt(str, start, end) {\n\tlet result = 0;\n\tfor (let i = start; i < end; i++) result = result * 10 + str.charCodeAt(i) - 48;\n\treturn result;\n}\nfunction countRemainingChunks(str, start) {\n\tlet count = 0;\n\tlet index = start;\n\twhile (index < str.length) {\n\t\tcount++;\n\t\tindex = findChunkEnd(str, index, isDigit(str.charCodeAt(index)));\n\t}\n\treturn count;\n}\n/**\n* The built-in sorting function registry.\n*\n* Registering this full object opts out of tree-shaking: every built-in\n* sorting function ends up in your bundle. Prefer importing the `sortFn_*`\n* functions you actually use and registering just those in the `sortFns`\n* slot, or passing them directly to the `sortFn` column option.\n*\n* @deprecated Import individual `sortFn_*` functions instead for a smaller\n* bundle. This export still works and is not going away in v9, but built-in\n* name resolution (including `sortFn: 'auto'`) only finds functions you\n* register yourself.\n*/\nconst sortFns = {\n\talphanumeric: sortFn_alphanumeric,\n\talphanumericCaseSensitive: sortFn_alphanumericCaseSensitive,\n\tbasic: sortFn_basic,\n\tdatetime: sortFn_datetime,\n\ttext: sortFn_text,\n\ttextCaseSensitive: sortFn_textCaseSensitive\n};\n\n//#endregion\nexport { constructSortFn, reSplitAlphaNumeric, sortFn_alphanumeric, sortFn_alphanumericCaseSensitive, sortFn_basic, sortFn_datetime, sortFn_text, sortFn_textCaseSensitive, sortFns };","import { cloneState, isFunction, setStateSlice } from \"../../utils.js\";\nimport { reSplitAlphaNumeric, sortFn_basic } from \"./sortFns.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.utils.ts\n/**\n* Creates the default sorting state.\n*\n* The feature default is an empty array, meaning no columns are sorted. Reset\n* APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const sorting = getDefaultSortingState()\n* ```\n*/\nfunction getDefaultSortingState() {\n\treturn [];\n}\n/**\n* Routes a sorting updater through the table's sorting change handler.\n*\n* The updater may be a next `SortingState` array or a function of the previous\n* sorting state, matching the instance `table.setSorting` behavior. State\n* owners receive an equality-guarded updater so structurally equal sorting\n* values preserve the owner's existing reference.\n*\n* @example\n* ```ts\n* table_setSorting(table, (old) => [...old, { id: 'age', desc: true }])\n* ```\n*/\nfunction table_setSorting(table, updater) {\n\tsetStateSlice(table, \"sorting\", updater);\n}\n/**\n* Resets `sorting` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.sorting` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetSorting(table)\n* table_resetSorting(table, true)\n* ```\n*/\nfunction table_resetSorting(table, defaultState) {\n\ttable_setSorting(table, defaultState ? [] : cloneState(table.initialState.sorting ?? []));\n}\n/**\n* Resets sorting after the table data changes when explicitly enabled.\n*\n* Unlike other auto-reset behaviors, sorting is preserved by default. An\n* explicit `autoResetAll` value takes precedence over `autoResetSorting`.\n*\n* @example\n* ```ts\n* table_autoResetSorting(table)\n* ```\n*/\nfunction table_autoResetSorting(table) {\n\tif (!table.atoms.sorting) return;\n\tif (table.options.autoResetAll ?? table.options.autoResetSorting ?? false) table_resetSorting(table);\n}\n/**\n* Chooses a built-in sorting function from sampled filtered row values.\n*\n* Date-like values use `datetime`, mixed text/numeric strings use\n* `alphanumeric`, plain strings use `text`, and unknown values fall back to\n* `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getAutoSortFn(column)\n* ```\n*/\nfunction column_getAutoSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tlet sortFnName;\n\tlet isString = false;\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (Object.prototype.toString.call(value) === \"[object Date]\") {\n\t\t\tsortFnName = \"datetime\";\n\t\t\tbreak;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\tisString = true;\n\t\t\tif (value.split(reSplitAlphaNumeric).length > 1) {\n\t\t\t\tsortFnName = \"alphanumeric\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!sortFnName && isString) sortFnName = \"text\";\n\tif (sortFnName) {\n\t\tlet sortFn = sortFns?.[sortFnName];\n\t\tif (!sortFn) {\n\t\t\tif (process.env.NODE_ENV === \"development\") console.warn(`sortFn '${sortFnName}' (auto) for column '${column.id}' is not registered`);\n\t\t\tif (sortFnName === \"alphanumeric\") sortFn = sortFns?.text;\n\t\t}\n\t\tif (sortFn) return sortFn;\n\t}\n\treturn sortFn_basic;\n}\n/**\n* Chooses the default first sort direction from sampled filtered row values.\n*\n* The first non-nullish value among the sampled rows decides: string columns\n* start ascending so alphabetical order is natural; other value types (or\n* columns with no non-nullish sample) start descending. Sampling past leading\n* nullish values keeps the toggle cycle stable when sorting or a data swap\n* moves an empty value into the first row.\n*\n* @example\n* ```ts\n* const direction = column_getAutoSortDir(column)\n* ```\n*/\nfunction column_getAutoSortDir(column) {\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (value == null) continue;\n\t\treturn typeof value === \"string\" ? \"asc\" : \"desc\";\n\t}\n\treturn \"desc\";\n}\n/**\n* Resolves the sorting function configured for a column.\n*\n* Function-valued `columnDef.sortFn` is returned directly, `'auto'` delegates\n* to `column_getAutoSortFn`, and string values are looked up in the table's\n* sorting function registry before falling back to `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getSortFn(column)\n* ```\n*/\nfunction column_getSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tif (isFunction(column.columnDef.sortFn)) return column.columnDef.sortFn;\n\tif (column.columnDef.sortFn === \"auto\") return column_getAutoSortFn(column);\n\tconst sortFn = sortFns?.[column.columnDef.sortFn];\n\tif (process.env.NODE_ENV === \"development\" && !sortFn) console.warn(`sortFn '${String(column.columnDef.sortFn)}' for column '${column.id}' is not registered`);\n\treturn sortFn ?? sortFn_basic;\n}\n/**\n* Applies the next sorting state for this column.\n*\n* The toggle can add, replace, flip, or remove this column's sort entry. Multi\n* sorting respects `enableMultiSort`, `enableMultiRemove`,\n* `maxMultiSortColCount`, and the `multi` argument.\n*\n* @example\n* ```ts\n* column_toggleSorting(column, undefined, true)\n* ```\n*/\nfunction column_toggleSorting(column, desc, multi) {\n\tconst nextSortingOrder = column_getNextSortingOrder(column, multi && column_getCanMultiSort(column));\n\tconst hasManualValue = typeof desc !== \"undefined\";\n\ttable_setSorting(column.table, (old) => {\n\t\tconst existingIndex = old.findIndex((d) => d.id === column.id);\n\t\tconst existingSorting = existingIndex === -1 ? void 0 : old[existingIndex];\n\t\tlet newSorting = [];\n\t\tlet sortAction;\n\t\tconst nextDesc = hasManualValue ? desc : nextSortingOrder === \"desc\";\n\t\tconst isMultiMode = !!(old.length && column_getCanMultiSort(column) && multi);\n\t\tif (isMultiMode) {\n\t\t\tif (existingSorting) sortAction = \"toggle\";\n\t\t\telse sortAction = \"add\";\n\t\t} else if (existingSorting) sortAction = \"toggle\";\n\t\telse sortAction = \"replace\";\n\t\tif (sortAction === \"toggle\") {\n\t\t\tif (!hasManualValue) {\n\t\t\t\tif (!nextSortingOrder) sortAction = \"remove\";\n\t\t\t}\n\t\t}\n\t\tif (sortAction === \"add\") {\n\t\t\tnewSorting = [...old, {\n\t\t\t\tid: column.id,\n\t\t\t\tdesc: nextDesc\n\t\t\t}];\n\t\t\tnewSorting.splice(0, newSorting.length - (column.table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER));\n\t\t} else if (sortAction === \"toggle\") newSorting = isMultiMode ? old.map((d) => {\n\t\t\tif (d.id === column.id) return {\n\t\t\t\t...d,\n\t\t\t\tdesc: nextDesc\n\t\t\t};\n\t\t\treturn d;\n\t\t}) : [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\telse if (sortAction === \"remove\") newSorting = isMultiMode ? old.filter((d) => d.id !== column.id) : [];\n\t\telse newSorting = [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\treturn newSorting;\n\t});\n}\n/**\n* Resolves the first direction used when this column begins sorting.\n*\n* Column-level `sortDescFirst` wins, then table-level `sortDescFirst`, then the\n* auto direction inferred from sampled values.\n*\n* @example\n* ```ts\n* const firstDirection = column_getFirstSortDir(column)\n* ```\n*/\nfunction column_getFirstSortDir(column) {\n\treturn column.columnDef.sortDescFirst ?? column.table.options.sortDescFirst ?? column_getAutoSortDir(column) === \"desc\" ? \"desc\" : \"asc\";\n}\n/**\n* Resolves the next sort order for this column's toggle cycle.\n*\n* The cycle starts with the first sort direction, flips between `asc` and\n* `desc`, and can return `false` when sorting removal is enabled.\n*\n* @example\n* ```ts\n* const nextOrder = column_getNextSortingOrder(column)\n* ```\n*/\nfunction column_getNextSortingOrder(column, multi) {\n\tconst firstSortDirection = column_getFirstSortDir(column);\n\tconst isSorted = column_getIsSorted(column);\n\tif (!isSorted) return firstSortDirection;\n\tif (isSorted !== firstSortDirection && (column.table.options.enableSortingRemoval ?? true) && (multi ? column.table.options.enableMultiRemove ?? true : true)) return false;\n\treturn isSorted === \"desc\" ? \"asc\" : \"desc\";\n}\n/**\n* Checks whether this accessor column can participate in sorting.\n*\n* The column must have an accessor and sorting must be enabled by both the\n* column definition and table options.\n*\n* @example\n* ```ts\n* const canSort = column_getCanSort(column)\n* ```\n*/\nfunction column_getCanSort(column) {\n\treturn (column.columnDef.enableSorting ?? true) && (column.table.options.enableSorting ?? true) && !!column.accessorFn;\n}\n/**\n* Checks whether this column can be added to a multi-sort state.\n*\n* Column-level `enableMultiSort` wins over table-level `enableMultiSort`; if\n* neither is set, accessor columns can multi-sort by default.\n*\n* @example\n* ```ts\n* const canMultiSort = column_getCanMultiSort(column)\n* ```\n*/\nfunction column_getCanMultiSort(column) {\n\treturn column.columnDef.enableMultiSort ?? column.table.options.enableMultiSort ?? !!column.accessorFn;\n}\n/**\n* Reads this column's current sort direction.\n*\n* The result is `false` when the column is not sorted, otherwise `'asc'` or\n* `'desc'` based on the column's entry in `state.sorting`.\n*\n* @example\n* ```ts\n* const direction = column_getIsSorted(column)\n* ```\n*/\nfunction column_getIsSorted(column) {\n\tconst columnSort = column.table.atoms.sorting?.get()?.find((d) => d.id === column.id);\n\treturn !columnSort ? false : columnSort.desc ? \"desc\" : \"asc\";\n}\n/**\n* Finds this column's position in the ordered `state.sorting` array.\n*\n* The result is `-1` when the column is not sorted.\n*\n* @example\n* ```ts\n* const index = column_getSortIndex(column)\n* ```\n*/\nfunction column_getSortIndex(column) {\n\treturn column.table.atoms.sorting?.get()?.findIndex((d) => d.id === column.id) ?? -1;\n}\n/**\n* Removes this column from the sorting state.\n*\n* Other sorted columns are preserved, including their relative order.\n*\n* @example\n* ```ts\n* column_clearSorting(column)\n* ```\n*/\nfunction column_clearSorting(column) {\n\ttable_setSorting(column.table, (old) => old.length ? old.filter((d) => d.id !== column.id) : []);\n}\n/**\n* Creates a header event handler that toggles this column's sorting.\n*\n* The handler ignores events when the column cannot sort, and asks\n* `options.isMultiSortEvent` whether the event should add to a multi-sort.\n*\n* @example\n* ```ts\n* const onClick = column_getToggleSortingHandler(column)\n* ```\n*/\nfunction column_getToggleSortingHandler(column) {\n\tconst canSort = column_getCanSort(column);\n\treturn (e) => {\n\t\tif (!canSort) return;\n\t\tcolumn_toggleSorting(column, void 0, column_getCanMultiSort(column) ? column.table.options.isMultiSortEvent?.(e) : false);\n\t};\n}\n\n//#endregion\nexport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_autoResetSorting, table_resetSorting, table_setSorting };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_autoResetSorting, table_resetSorting, table_setSorting } from \"./rowSortingFeature.utils.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.ts\n/**\n* Feature that adds row sorting state, defaults, and column/table sorting APIs.\n*/\nconst rowSortingFeature = {\n\tgetInitialState(initialState) {\n\t\treturn {\n\t\t\tsorting: getDefaultSortingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef() {\n\t\treturn {\n\t\t\tsortFn: \"auto\",\n\t\t\tsortUndefined: 1\n\t\t};\n\t},\n\tgetDefaultTableOptions(table) {\n\t\treturn {\n\t\t\tautoResetSorting: false,\n\t\t\tonSortingChange: makeStateUpdater(\"sorting\", table),\n\t\t\tisMultiSortEvent: (e) => {\n\t\t\t\treturn e.shiftKey;\n\t\t\t}\n\t\t};\n\t},\n\tassignColumnPrototype(prototype, table) {\n\t\tassignPrototypeAPIs(\"rowSortingFeature\", prototype, table, {\n\t\t\tcolumn_getAutoSortFn: { fn: (column) => column_getAutoSortFn(column) },\n\t\t\tcolumn_getAutoSortDir: { fn: (column) => column_getAutoSortDir(column) },\n\t\t\tcolumn_getSortFn: { fn: (column) => column_getSortFn(column) },\n\t\t\tcolumn_toggleSorting: { fn: (column, desc, multi) => column_toggleSorting(column, desc, multi) },\n\t\t\tcolumn_getFirstSortDir: { fn: (column) => column_getFirstSortDir(column) },\n\t\t\tcolumn_getNextSortingOrder: { fn: (column, multi) => column_getNextSortingOrder(column, multi) },\n\t\t\tcolumn_getCanSort: { fn: (column) => column_getCanSort(column) },\n\t\t\tcolumn_getCanMultiSort: { fn: (column) => column_getCanMultiSort(column) },\n\t\t\tcolumn_getIsSorted: { fn: (column) => column_getIsSorted(column) },\n\t\t\tcolumn_getSortIndex: { fn: (column) => column_getSortIndex(column) },\n\t\t\tcolumn_clearSorting: { fn: (column) => column_clearSorting(column) },\n\t\t\tcolumn_getToggleSortingHandler: { fn: (column) => column_getToggleSortingHandler(column) }\n\t\t});\n\t},\n\tconstructTableAPIs(table) {\n\t\tassignTableAPIs(\"rowSortingFeature\", table, {\n\t\t\ttable_autoResetSorting: { fn: () => table_autoResetSorting(table) },\n\t\t\ttable_setSorting: { fn: (updater) => table_setSorting(table, updater) },\n\t\t\ttable_resetSorting: { fn: (defaultState) => table_resetSorting(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowSortingFeature };","import { batch, createAtom } from \"@tanstack/store\";\n\n//#region src/store-reactivity-bindings.ts\n/**\n* TanStack Store–based reactivity for vanilla / non-framework use of `constructTable`,\n* with `createOptionsStore: true` so `table.optionsStore` is available for subscriptions.\n*\n* @example\n* ```ts\n* import { constructTable, tableFeatures } from '@tanstack/table-core'\n* import { storeReactivityBindings } from '@tanstack/table-core/store-reactivity-bindings'\n*\n* const table = constructTable({\n* features: tableFeatures({ coreReactivityFeature: storeReactivityBindings() }),\n* // ...\n* })\n* ```\n*/\nfunction storeReactivityBindings() {\n\treturn {\n\t\tcreateOptionsStore: true,\n\t\twrapExternalAtoms: false,\n\t\taddSubscription: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tunmount: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tbatch,\n\t\tschedule: (fn) => queueMicrotask(fn),\n\t\tuntrack: (fn) => fn(),\n\t\tcreateReadonlyAtom: (fn, options) => {\n\t\t\treturn createAtom(() => fn(), { compare: options?.compare });\n\t\t},\n\t\tcreateWritableAtom: (value, options) => {\n\t\t\treturn createAtom(value, { compare: options?.compare });\n\t\t}\n\t};\n}\n\n//#endregion\nexport { storeReactivityBindings };","import type { ColumnFilter, ColumnFilterState, FilterValue, RangeFilterOp } from '../types.js';\n\n// Filtering rules, free of TanStack and the DOM: each filter compiles once into a\n// test of one value, and the tests of a filter state combine into one test of a row.\n\n/** A column as filtering sees it. */\nexport interface FilterColumn<TData> {\n id: string;\n getValue: (row: TData, index: number) => unknown;\n filterFn?: ((value: unknown, filter: ColumnFilter, row: TData) => boolean) | undefined;\n}\n\n/** Keeps a row (by its object and its index in `data`) or drops it. */\nexport type RowPredicate<TData> = (row: TData, index: number) => boolean;\n\n/** `true` for `undefined`, `null`, `''`, `NaN` and an invalid `Date`. */\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') return true;\n if (typeof value === 'number') return Number.isNaN(value);\n return value instanceof Date && Number.isNaN(value.getTime());\n}\n\nconst pad = (n: number, width = 2) => String(n).padStart(width, '0');\n\n/** A `Date` as its local day, `'2026-11-10'`. */\nfunction isoDay(date: Date): string {\n return `${pad(date.getFullYear(), 4)}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\n/**\n * A value as the text filters and the quick filter read it: strings as they are,\n * numbers and booleans as `String()` gives them, a `Date` as its local day\n * (`'2026-11-10'`), and anything else (empty values, objects) as `''`.\n */\nexport function textOf(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return Number.isNaN(value) ? '' : String(value);\n if (typeof value === 'boolean') return String(value);\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? '' : isoDay(value);\n return '';\n}\n\nconst DAY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\n/**\n * A value's local day as a sortable number (`20261110`), or `undefined`. Takes a `Date`,\n * a timestamp, an ISO date (`'2026-11-10'`, read as that day, not as UTC midnight) or\n * any other string `Date` can parse.\n */\nexport function dayOf(value: unknown): number | undefined {\n let date: Date;\n if (value instanceof Date) date = value;\n else if (typeof value === 'number') date = new Date(value);\n else if (typeof value === 'string') {\n const day = DAY.exec(value.trim());\n if (day) return Number(day[1]) * 10000 + Number(day[2]) * 100 + Number(day[3]);\n if (!value.trim()) return undefined;\n date = new Date(value);\n } else return undefined;\n const time = date.getTime();\n if (Number.isNaN(time)) return undefined;\n return date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();\n}\n\n/** A value as a number for the number filters: numbers, and strings that are numbers. */\nfunction numberOf(value: unknown): number | undefined {\n if (typeof value === 'number') return Number.isNaN(value) ? undefined : value;\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n return Number.isNaN(n) ? undefined : n;\n }\n return undefined;\n}\n\n/**\n * The value a `'set'` filter lists and compares: strings, numbers and booleans stay,\n * a `Date` becomes its local day, and empty values (and objects) become `null`.\n */\nexport function setValueOf(value: unknown): FilterValue {\n if (isEmptyValue(value)) return null;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n return value instanceof Date ? isoDay(value) : null;\n}\n\nfunction compare(\n op: RangeFilterOp,\n from: number | undefined,\n to: number | undefined,\n): ((n: number | undefined) => boolean) | undefined {\n if (op === 'empty') return (n) => n === undefined;\n if (op === 'notEmpty') return (n) => n !== undefined;\n if (op === 'between') {\n if (from === undefined && to === undefined) return undefined;\n return (n) =>\n n !== undefined && (from === undefined || n >= from) && (to === undefined || n <= to);\n }\n if (from === undefined) return undefined;\n switch (op) {\n case 'eq':\n return (n) => n === from;\n case 'ne':\n // Like a spreadsheet: an empty cell isn't equal to the number, so it stays.\n return (n) => n !== from;\n case 'lt':\n return (n) => n !== undefined && n < from;\n case 'le':\n return (n) => n !== undefined && n <= from;\n case 'gt':\n return (n) => n !== undefined && n > from;\n case 'ge':\n return (n) => n !== undefined && n >= from;\n }\n}\n\n/**\n * A test of one value for a filter, or `undefined` when the filter keeps every row\n * (no text to match, no bound to compare with). Text matching ignores case.\n */\nexport function compileFilter(filter: ColumnFilter): ((value: unknown) => boolean) | undefined {\n switch (filter.kind) {\n case 'text': {\n if (filter.op === 'empty') return (v) => textOf(v) === '';\n if (filter.op === 'notEmpty') return (v) => textOf(v) !== '';\n const needle = (filter.value ?? '').toLowerCase();\n if (!needle) return undefined;\n const op = filter.op;\n return (v) => {\n const text = textOf(v).toLowerCase();\n return op === 'equals'\n ? text === needle\n : op === 'startsWith'\n ? text.startsWith(needle)\n : text.includes(needle);\n };\n }\n case 'number': {\n const test = compare(filter.op, numberOf(filter.value), numberOf(filter.to));\n return test && ((v) => test(numberOf(v)));\n }\n case 'date': {\n const test = compare(filter.op, dayOf(filter.value), dayOf(filter.to));\n return test && ((v) => test(dayOf(v)));\n }\n case 'set': {\n const values = new Set(filter.values);\n return (v) => values.has(setValueOf(v));\n }\n }\n}\n\n/** The words of a quick filter, lowercased; empty when it keeps every row. */\nexport function quickTerms(quickFilter: string | undefined): string[] {\n return (quickFilter ?? '').toLowerCase().split(/\\s+/).filter(Boolean);\n}\n\n/**\n * One test of a row for the column filters and the quick filter, or `undefined` when\n * they keep every row. A row passes every column filter, and each word of the quick\n * filter is found in the text of one of `quickColumns` (ignoring case).\n *\n * Each value is read once per test through the column's `getValue`. A column with a\n * `filterFn` uses it in place of the built-in matching. Filters for unknown columns,\n * and `except` (for the values a column's own filter offers), are skipped.\n */\nexport function rowPredicate<TData>(\n columns: ReadonlyMap<string, FilterColumn<TData>>,\n filters: ColumnFilterState | undefined,\n quickFilter: string | undefined,\n quickColumns: readonly FilterColumn<TData>[],\n except?: string,\n): RowPredicate<TData> | undefined {\n const tests: RowPredicate<TData>[] = [];\n for (const [id, filter] of Object.entries(filters ?? {})) {\n const column = columns.get(id);\n if (!column || id === except) continue;\n const { getValue, filterFn } = column;\n if (filterFn) {\n tests.push((row, index) => filterFn(getValue(row, index), filter, row));\n continue;\n }\n const test = compileFilter(filter);\n if (test) tests.push((row, index) => test(getValue(row, index)));\n }\n const terms = quickTerms(quickFilter);\n if (terms.length && quickColumns.length) {\n const textAt = (c: FilterColumn<TData>, row: TData, index: number) =>\n textOf(c.getValue(row, index)).toLowerCase();\n const [term] = terms;\n tests.push(\n terms.length === 1 && term !== undefined\n ? (row, index) => quickColumns.some((c) => textAt(c, row, index).includes(term))\n : (row, index) => {\n const texts = quickColumns.map((c) => textAt(c, row, index));\n return terms.every((t) => texts.some((text) => text.includes(t)));\n },\n );\n }\n if (!tests.length) return undefined;\n if (tests.length === 1) return tests[0];\n return (row, index) => tests.every((test) => test(row, index));\n}\n\nconst kindOrder = (v: FilterValue) =>\n v === null ? 3 : typeof v === 'boolean' ? 2 : typeof v === 'number' ? 0 : 1;\n\n/** Orders set values: numbers, then text (by locale, numbers inside text by value), then booleans, then empty. */\nexport function compareSetValues(a: FilterValue, b: FilterValue): number {\n const kind = kindOrder(a) - kindOrder(b);\n if (kind) return kind;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });\n }\n return Number(a) - Number(b);\n}\n\n/**\n * The distinct values of `column` over the rows `keep` passes, as a `'set'` filter\n * lists them (see `setValueOf`), sorted. Stops after `limit` values (`truncated`).\n */\nexport function distinctValues<TData>(\n rows: Iterable<{ original: TData; index: number }>,\n column: FilterColumn<TData>,\n keep: RowPredicate<TData> | undefined,\n limit: number,\n): { values: FilterValue[]; truncated: boolean } {\n const seen = new Set<FilterValue>();\n let truncated = false;\n for (const { original, index } of rows) {\n if (keep && !keep(original, index)) continue;\n const value = setValueOf(column.getValue(original, index));\n if (seen.has(value)) continue;\n if (seen.size === limit) {\n truncated = true;\n break;\n }\n seen.add(value);\n }\n return { values: [...seen].sort(compareSetValues), truncated };\n}\n","import type {\n ColumnDef_RowSorting,\n RowData,\n RowModel,\n SortFnDef,\n Table,\n TableFeatures,\n} from '@tanstack/table-core';\nimport { column_getCanSort, column_getSortFn } from '@tanstack/table-core/static-functions';\n\ntype Sorting = readonly { id: string; desc: boolean }[];\n\n// Bumped per table when a column reads its values differently (same id, new\n// accessor): the rows and the sorting are the same, the sorted order is not.\nconst valueVersions = new WeakMap<object, number>();\n\n/** Makes the filtered and sorted row models of `table` filter and sort again on their next read. */\nexport function valuesChanged(table: object): void {\n valueVersions.set(table, (valueVersions.get(table) ?? 0) + 1);\n}\n\n/** The values version of `table`, bumped by `valuesChanged()`. */\nexport function valueVersion(table: object): number | undefined {\n return valueVersions.get(table);\n}\n\ninterface SortKey {\n /** Each row's value by its position in the unsorted rows, resolved for `compare`. */\n keys: unknown[];\n compare: (a: unknown, b: unknown) => number;\n /** -1 flips `compare` (descending, inverted). */\n sign: number;\n sortUndefined: false | -1 | 1 | 'first' | 'last' | undefined;\n}\n\n/**\n * The sorted row model, in place of TanStack's `createSortedRowModel()`, giving the\n * same order: the same sort functions (`auto` included), `sortUndefined`,\n * `invertSorting`, ties by row index.\n *\n * It reads each row's value once, through the column's accessor, and sorts the row\n * positions by those values. TanStack's model calls `row.getValue()` four times per\n * comparison, and its row methods take rest arguments (`function (...args)`): in\n * Firefox that slows a large sort down by orders of magnitude (750k rows: 176 s\n * against 0.9 s for the same comparator without rest arguments). Reading values\n * once is also faster everywhere, most of all for text, which is lowercased once\n * per row instead of twice per comparison.\n *\n * The registered sort functions come from `constructSortFn`: each carries a value\n * comparator (`sort`, which compares values only) and a normalizer\n * (`resolveDataValue`). The rows are flat (no sub-rows), so there is nothing to\n * sort below them.\n */\nexport function sortedRowModel<TFeatures extends TableFeatures, TData extends RowData>() {\n return (table: Table<TFeatures, TData>) => {\n let last:\n | {\n sorting: unknown;\n source: RowModel<TFeatures, TData>;\n version: number | undefined;\n model: RowModel<TFeatures, TData>;\n }\n | undefined;\n return (): RowModel<TFeatures, TData> => {\n const source = table.getPreSortedRowModel();\n const sorting = (table.options.state as { sorting?: Sorting } | undefined)?.sorting;\n const version = valueVersion(table);\n const prev = last;\n if (prev && prev.sorting === sorting && prev.source === source && prev.version === version) {\n return prev.model;\n }\n const model = sortRows(table, source, sorting ?? []);\n last = { sorting, source, version, model };\n return model;\n };\n };\n}\n\nfunction sortRows<TFeatures extends TableFeatures, TData extends RowData>(\n table: Table<TFeatures, TData>,\n source: RowModel<TFeatures, TData>,\n sorting: Sorting,\n): RowModel<TFeatures, TData> {\n const rows = source.rows;\n const sortKeys: SortKey[] = [];\n for (const { id, desc } of sorting) {\n const column = table.getColumn(id);\n if (!column || !column_getCanSort(column)) continue;\n const fn = column_getSortFn(column) as unknown as SortFnDef<TFeatures, TData>;\n const def = column.columnDef as ColumnDef_RowSorting<TFeatures, TData>;\n const read = column.accessorFn;\n const resolve = fn.resolveDataValue;\n const sortUndefined = def.sortUndefined;\n sortKeys.push({\n keys: rows.map((row) => {\n const value = read?.(row.original, row.index);\n // Undefined stays undefined where `sortUndefined` places it.\n return resolve && !(value === undefined && sortUndefined)\n ? (resolve(value) as unknown)\n : value;\n }),\n compare: fn.sort as (a: unknown, b: unknown) => number,\n sign: (desc ? -1 : 1) * (def.invertSorting ? -1 : 1),\n sortUndefined,\n });\n }\n if (!sortKeys.length || !rows.length) return source;\n\n const compare = (i: number, j: number): number => {\n for (const { keys, compare, sign, sortUndefined } of sortKeys) {\n const a = keys[i];\n const b = keys[j];\n let result = 0;\n if (sortUndefined && (a === undefined || b === undefined)) {\n if (a === undefined && b === undefined) continue;\n if (sortUndefined === 'first') return a === undefined ? -1 : 1;\n if (sortUndefined === 'last') return a === undefined ? 1 : -1;\n result = a === undefined ? sortUndefined : -sortUndefined;\n }\n if (result === 0) result = compare(a, b);\n if (result !== 0) return result * sign;\n }\n return (rows[i]?.index ?? i) - (rows[j]?.index ?? j);\n };\n\n const sorted = rows\n .map((_, i) => i)\n .sort(compare)\n .map((i) => rows[i])\n .filter((row) => row !== undefined);\n return { rows: sorted, flatRows: sorted, rowsById: source.rowsById };\n}\n","import type { RowData, RowModel, Table, TableFeatures } from '@tanstack/table-core';\nimport type { RowPredicate } from '../filters/filter.js';\nimport { valueVersion } from './sorted-row-model.js';\n\n// The row test of each table, set by the model whenever filters, the quick filter or\n// the columns change: a new function filters again, `undefined` keeps every row.\nconst predicates = new WeakMap<object, RowPredicate<never> | undefined>();\n\n/** Sets the test the filtered row model of `table` keeps rows by. */\nexport function setRowPredicate<TData>(\n table: object,\n predicate: RowPredicate<TData> | undefined,\n): void {\n predicates.set(table, predicate);\n}\n\n/**\n * The filtered row model, in place of TanStack's column filtering feature, which\n * would cost bundle size and read values through `row.getValue()` (slow in Firefox,\n * see sorted-row-model.ts). The model compiles the filters into one row test\n * (`rowPredicate` in filters/filter.ts) and this keeps the rows it passes, reading\n * values through the columns' accessors.\n *\n * It filters again when the test, the rows or the values (`valuesChanged`) change;\n * the sorted row model then sorts again, since its source is new. The rows are the\n * same `Row` objects. `rowsById` stays the unfiltered map: only TanStack's\n * `getRow(id)` reads it, and the model finds rows by their index instead.\n */\nexport function filteredRowModel<TFeatures extends TableFeatures, TData extends RowData>() {\n return (table: Table<TFeatures, TData>) => {\n let last:\n | {\n predicate: unknown;\n source: RowModel<TFeatures, TData>;\n version: number | undefined;\n model: RowModel<TFeatures, TData>;\n }\n | undefined;\n return (): RowModel<TFeatures, TData> => {\n const source = table.getPreFilteredRowModel();\n const predicate = predicates.get(table) as RowPredicate<TData> | undefined;\n if (!predicate) return source;\n const version = valueVersion(table);\n const prev = last;\n if (prev?.predicate === predicate && prev.source === source && prev.version === version) {\n return prev.model;\n }\n const rows = source.rows.filter((row) => predicate(row.original, row.index));\n const model = { rows, flatRows: rows, rowsById: source.rowsById };\n last = { predicate, source, version, model };\n return model;\n };\n };\n}\n","import {\n columnSizingFeature,\n constructTable,\n rowSortingFeature,\n sortFn_alphanumeric,\n sortFn_basic,\n sortFn_datetime,\n sortFn_text,\n tableFeatures,\n type ColumnDef as TanStackColumnDef,\n type Row,\n type Table,\n type TableOptions,\n} from '@tanstack/table-core';\nimport { storeReactivityBindings } from '@tanstack/table-core/store-reactivity-bindings';\nimport { moveColumn, normalizeOrder } from '../columns/column-order.js';\nimport { resolveColumns, type ResolvedColumn } from '../columns/resolve-columns.js';\nimport { distinctValues, rowPredicate } from '../filters/filter.js';\nimport { filteredRowModel, setRowPredicate } from './filtered-row-model.js';\nimport { sortedRowModel, valuesChanged } from './sorted-row-model.js';\nimport type {\n CellContext,\n ColumnAlign,\n ColumnDef,\n ColumnFilter,\n ColumnFilterState,\n ColumnOrderState,\n ColumnPin,\n ColumnPinningState,\n ColumnSizingState,\n ColumnVisibilityState,\n FilterKind,\n FilterValue,\n PinnedRows,\n RowPin,\n SortState,\n} from '../types.js';\n\n// The TanStack adapter. Everything TanStack stays in this module: callers only see\n// the view types below, so TanStack can be upgraded or replaced without touching\n// `argus-table`'s public API.\n\nconst features = tableFeatures({\n // Vanilla (framework-free) reactivity; required by `constructTable`.\n coreReactivityFeature: storeReactivityBindings(),\n // No pinning, ordering or visibility feature: the model groups, orders and hides\n // columns itself (see `buildViews`), so they cost no bundle size.\n columnSizingFeature,\n rowSortingFeature,\n // Our own filtering, without TanStack's filtering feature (see filtered-row-model.ts).\n // TanStack's types tie this slot to that feature; at runtime the core row models read it.\n ...({ filteredRowModel: filteredRowModel() } as object),\n // Our own: TanStack's is very slow in Firefox at scale (see sorted-row-model.ts).\n sortedRowModel: sortedRowModel(),\n // Registered by name so `sortFn: 'auto'` can pick one by value type.\n sortFns: {\n alphanumeric: sortFn_alphanumeric,\n basic: sortFn_basic,\n datetime: sortFn_datetime,\n text: sortFn_text,\n },\n});\ntype Features = typeof features;\ntype AnyRow = Record<string, unknown>;\n\n/** Sort direction of a column, or `false` when it isn't sorted. */\nexport type SortDirection = 'asc' | 'desc' | false;\n\n/**\n * Id of the selection column, the checkbox column the model adds first when\n * `selectionColumn` is set. Not a column of `columns`: it never appears in the\n * column order, sizing or events.\n */\nexport const SELECTION_COLUMN_ID = '--argus-selection';\n\n/** Width of the selection column in px. */\nexport const SELECTION_COLUMN_WIDTH = 40;\n\n/** A column as the renderer sees it, in visual order: start-pinned, scrolling, end-pinned. */\nexport interface ColumnView<TData, TContent> {\n id: string;\n /** `'data'` for a column of `columns`; `'selection'` for the checkbox column. */\n kind: 'data' | 'selection';\n /** 1-based position in visual order, for `aria-colindex`. `0` for a hidden column. */\n colIndex: number;\n /** The pin in effect: `columnPinning`'s, else the column's own. */\n pin: ColumnPin | undefined;\n /**\n * Sticky inset in px: from the start edge for `'start'` columns, from the end edge\n * for `'end'` columns. For scrolling columns, the start within the scrolling area.\n */\n offset: number;\n /** `true` on the pinned column next to the scrolling area (one per pinned side). */\n pinEdge: boolean;\n /**\n * `true` for a hidden column. Only `allColumns` lists hidden columns; `columns`\n * holds the ones the table shows.\n */\n hidden: boolean;\n /** Current width in px (a resized width wins over the column's own). */\n width: number;\n /** Share of free space, or `undefined` for a fixed width. A resized column stops flexing. */\n flex: number | undefined;\n /**\n * `true` for a `width: 'auto'` column that hasn't been resized: the table measures\n * its content and passes the width in as `autoWidths`.\n */\n auto: boolean;\n minWidth: number;\n maxWidth: number;\n sortable: boolean;\n resizable: boolean;\n reorderable: boolean;\n pinnable: boolean;\n hideable: boolean;\n /** The kind of filter users can set, or `undefined` when they can't filter the column. */\n filter: FilterKind | undefined;\n /** `true` when `columnFilters` has a filter for the column. */\n filtered: boolean;\n align: ColumnAlign;\n /** Whether the cell text wraps (`ColumnDef.wrap`). */\n wrap: boolean;\n sorted: SortDirection;\n header: ColumnDef<TData, TContent>['header'];\n cell: ColumnDef<TData, TContent>['cell'];\n hasAccessor: boolean;\n}\n\n/** A row of the current (filtered and sorted) row model. */\nexport interface RowView<TData> {\n id: string;\n /** Index in the current row model, 0-based. */\n index: number;\n original: TData;\n}\n\n/**\n * Rows that live outside the model, loaded page by page (`dataSource`). The\n * source sorts them, so the model reads them as they are. `PageCache` implements it.\n */\nexport interface RemoteRows<TData> {\n readonly rowCount: number;\n /** The loaded row at an index, with its id; `undefined` while it isn't loaded. */\n entryAt(index: number): { id: string; row: TData } | undefined;\n /** The index of a loaded row's id, or `undefined`. */\n indexOf(rowId: string): number | undefined;\n /** The ids of every loaded row, in row order. */\n loadedIds(): string[];\n}\n\nexport interface TableModelOptions<TData, TContent> {\n columns: readonly ColumnDef<TData, TContent>[];\n data: readonly TData[];\n /**\n * Remote rows. When set, rows come from here instead of `data`, and the model\n * doesn't sort them (the source does).\n */\n remote?: RemoteRows<TData> | undefined;\n /** Row id function. Default: the row's index in `data`, as a string. */\n getRowId: ((row: TData, index: number) => string) | undefined;\n /** Current sort state; its owner is the caller (see `controllable`). */\n sorting: SortState;\n /** Current resized widths; its owner is the caller. */\n columnSizing: ColumnSizingState;\n /**\n * Current column order; its owner is the caller. Each pin group follows it; an\n * empty array (the default) keeps the order of `columns`.\n */\n columnOrder?: ColumnOrderState | undefined;\n /** Pins set at runtime, over the columns' own `pin`; its owner is the caller. */\n columnPinning?: ColumnPinningState | undefined;\n /** Visibility set at runtime, over the columns' own `hidden`; its owner is the caller. */\n columnVisibility?: ColumnVisibilityState | undefined;\n /**\n * Column filters; its owner is the caller. Rows that fail one leave the row model.\n * Remote rows aren't filtered: the source does it.\n */\n columnFilters?: ColumnFilterState | undefined;\n /**\n * Words to find in the shown columns' values as text, ignoring case: a row stays\n * when each word is in one of its values. Remote rows aren't filtered.\n */\n quickFilter?: string | undefined;\n /**\n * Measured widths of `width: 'auto'` columns, in px by id. Clamped to the column's\n * bounds; a resized width wins. Ids of other columns are ignored.\n */\n autoWidths?: ColumnSizingState | undefined;\n /** Rows fixed above or below the body. They stay out of the row model: never sorted, not counted. */\n pinnedRows?: PinnedRows<TData> | undefined;\n /**\n * Adds the selection (checkbox) column first among the start-pinned columns. It\n * has the id `SELECTION_COLUMN_ID`, a fixed width, and no part in sorting,\n * sizing or the column order.\n */\n selectionColumn?: boolean | undefined;\n}\n\nexport interface TableModel<TData, TContent> {\n /** Updates any subset of the options. Unchanged references are ignored. */\n update(options: Partial<TableModelOptions<TData, TContent>>): void;\n /** The columns the table shows, in visual order. */\n readonly columns: readonly ColumnView<TData, TContent>[];\n /**\n * Every column of `columns`, hidden ones included (with `hidden: true` and\n * `colIndex: 0`), in the order of `orderOf()`. Not the selection column.\n */\n readonly allColumns: readonly ColumnView<TData, TContent>[];\n /** Number of rows in the current row model. */\n readonly rowCount: number;\n /**\n * Changes identity whenever the row at an index may have changed: new data, a\n * sort, a filter, a new remote source. Compare it by identity only.\n */\n readonly rowOrder: object;\n /** Sum of the shown columns' widths in px (flex columns count their minimum). */\n readonly totalWidth: number;\n /** The row at an index of the current row model; `undefined` for a remote row not loaded yet. */\n rowAt(index: number): RowView<TData> | undefined;\n /** The index of a row id in the current row model (after filtering and sorting), or `undefined`. */\n indexOf(rowId: string): number | undefined;\n /**\n * The ids of the rows that can be selected, in row order: every row of the row\n * model, or only the loaded ones for remote rows.\n */\n selectableIds(): string[];\n /** The value a column reads from the row at `index`. */\n valueAt(index: number, columnId: string): unknown;\n /** What a column's `cell` function receives for the row at `index`. */\n cellContext(index: number, columnId: string): CellContext<TData> | undefined;\n /**\n * The sort state that clicking this column's header would produce:\n * asc → desc → unsorted, one column at a time. `undefined` if it can't sort.\n */\n nextSorting(columnId: string): SortState | undefined;\n /**\n * The sizing state after setting a column to `width` px, clamped to its bounds.\n * `undefined` if the column can't be resized.\n */\n nextSizing(columnId: string, width: number): ColumnSizingState | undefined;\n /**\n * The full column order as the table shows it: start-pinned, scrolling and\n * end-pinned ids. `base` defaults to the current `columnOrder`.\n */\n orderOf(base?: readonly string[]): ColumnOrderState;\n /**\n * The order after moving a column to position `to` (0-based among the shown data\n * columns, in visual order, counted after the move; hidden columns keep their place),\n * starting from `base` (default: the current order). `undefined` if the column can't\n * move or is hidden, `to` is outside its pin group, or nothing changes.\n */\n nextOrder(columnId: string, to: number, base?: readonly string[]): ColumnOrderState | undefined;\n /**\n * The pinning state after pinning a column to a side, or unpinning it with `false`,\n * starting from `base` (default: the current `columnPinning`). `undefined` for an\n * unknown column, one with `pinnable: false`, or no change.\n */\n nextPinning(\n columnId: string,\n pin: ColumnPin | false,\n base?: ColumnPinningState,\n ): ColumnPinningState | undefined;\n /**\n * The visibility state after hiding or showing a column, starting from `base`\n * (default: the current `columnVisibility`). `undefined` for an unknown column,\n * hiding one with `hideable: false` or the last one shown, or no change.\n */\n nextVisibility(\n columnId: string,\n hidden: boolean,\n base?: ColumnVisibilityState,\n ): ColumnVisibilityState | undefined;\n /**\n * The filter state after setting a column's filter, or clearing it with `undefined`,\n * starting from `base` (default: the current `columnFilters`). `undefined` for an\n * unknown column, setting a filter on a column without `filter`, or no change.\n */\n nextFilters(\n columnId: string,\n filter: ColumnFilter | undefined,\n base?: ColumnFilterState,\n ): ColumnFilterState | undefined;\n /**\n * The values a `'set'` filter on the column offers: its `filterOptions`, else (not for\n * remote rows) the distinct values of the rows the other filters keep, sorted, at most\n * `limit` of them (`truncated` when there are more). `undefined` for an unknown column,\n * or remote rows without `filterOptions`.\n */\n filterValues(\n columnId: string,\n limit?: number,\n ): { values: FilterValue[]; truncated: boolean } | undefined;\n /** Number of rows pinned to a side. */\n pinnedCount(side: RowPin): number;\n /**\n * A pinned row, `index` counted within its side. Its id comes from `getRowId`,\n * else it is `'top-{index}'` or `'bottom-{index}'`, apart from the data rows' index ids.\n */\n pinnedRowAt(side: RowPin, index: number): RowView<TData> | undefined;\n /** The value a column reads from a pinned row. */\n pinnedValueAt(side: RowPin, index: number, columnId: string): unknown;\n /** What a column's `cell` function receives for a pinned row (with `pinned` set). */\n pinnedCellContext(side: RowPin, index: number, columnId: string): CellContext<TData> | undefined;\n}\n\nconst defaultRowId = (_row: unknown, index: number) => String(index);\n\n/**\n * Ids of the columns kept from `before` whose accessor changed: a new function,\n * or a different path. A new column has nothing cached and isn't listed.\n */\nfunction changedAccessors<TData, TContent>(\n before: readonly ColumnDef<TData, TContent>[],\n after: readonly ColumnDef<TData, TContent>[],\n): string[] {\n const old = new Map(before.map((c) => [c.id, c.accessor]));\n return after.filter((c) => old.has(c.id) && old.get(c.id) !== c.accessor).map((c) => c.id);\n}\n\n/** The selection column's view: first, pinned to the start, fixed, and inert to sorting, sizing and moves. */\nfunction selectionView<TData, TContent>(pinEdge: boolean): ColumnView<TData, TContent> {\n return {\n id: SELECTION_COLUMN_ID,\n kind: 'selection',\n colIndex: 1,\n pin: 'start',\n offset: 0,\n pinEdge,\n hidden: false,\n width: SELECTION_COLUMN_WIDTH,\n flex: undefined,\n auto: false,\n minWidth: SELECTION_COLUMN_WIDTH,\n maxWidth: SELECTION_COLUMN_WIDTH,\n sortable: false,\n resizable: false,\n reorderable: false,\n pinnable: false,\n hideable: false,\n filter: undefined,\n filtered: false,\n align: 'center',\n wrap: false,\n sorted: false,\n header: undefined,\n cell: undefined,\n hasAccessor: false,\n };\n}\n\nfunction toTanStack<TData, TContent>(\n column: ResolvedColumn<TData, TContent>,\n): TanStackColumnDef<Features, AnyRow> {\n return {\n id: column.id,\n accessorFn: column.getValue as (row: AnyRow, index: number) => unknown,\n size: column.width,\n minSize: column.minWidth,\n maxSize: column.maxWidth,\n enableSorting: column.sortable,\n sortUndefined: 'last',\n };\n}\n\n/**\n * Creates the table model over TanStack Table. It owns no state: sorting, sizing, order,\n * pinning and visibility come in through `update()`, and the `next*()` methods only propose\n * changes, so the caller decides (controlled or uncontrolled) whether to apply them.\n *\n * Hidden columns stay in TanStack, so their values still sort and read; only the\n * views leave them out. Pin groups, sticky offsets and the order are the model's own.\n */\nexport function createTableModel<TData, TContent>(\n initial: TableModelOptions<TData, TContent>,\n): TableModel<TData, TContent> {\n let options = initial;\n let resolved = resolveColumns(options.columns);\n let byId = new Map(resolved.map((c) => [c.id, c]));\n // TanStack column defs by id, kept between updates that don't change `columns`.\n let tanStackById = new Map(resolved.map((c) => [c.id, toTanStack(c)]));\n let views: ColumnView<TData, TContent>[] | undefined;\n // The pin and visibility in effect: the state's, else the column's own.\n const pinOf = (\n column: ResolvedColumn<TData, TContent>,\n pinning = options.columnPinning,\n ): ColumnPin | undefined => {\n const state = pinning?.[column.id];\n if (state === 'start' || state === 'end') return state;\n return state === false ? undefined : column.pin;\n };\n const hiddenOf = (\n column: ResolvedColumn<TData, TContent>,\n visibility = options.columnVisibility,\n ): boolean => {\n const state = visibility?.[column.id];\n return typeof state === 'boolean' ? !state : column.hidden;\n };\n const shown = (id: string) => {\n const column = byId.get(id);\n return column !== undefined && !hiddenOf(column);\n };\n // TanStack's sizing state: measured auto widths and the widths of pinned flex columns\n // under the resized ones. Kept stable between updates that don't touch them.\n let sizing: ColumnSizingState | undefined;\n const sizingState = (): ColumnSizingState => {\n if (sizing) return sizing;\n const auto = options.autoWidths;\n const merged: ColumnSizingState = {};\n let any = false;\n for (const column of resolved) {\n // A pinned column can't flex: it takes a fixed width for its sticky offsets.\n if (column.flex !== undefined && pinOf(column) !== undefined) {\n merged[column.id] = column.pinnedWidth;\n any = true;\n }\n const px = auto?.[column.id];\n if (!column.auto || px === undefined || !Number.isFinite(px)) continue;\n merged[column.id] = Math.min(column.maxWidth, Math.max(column.minWidth, px));\n any = true;\n }\n return (sizing = any ? { ...merged, ...options.columnSizing } : options.columnSizing);\n };\n // What ordering needs, with the pin in effect.\n const orderable = () =>\n resolved.map((c) => ({ id: c.id, pin: pinOf(c), reorderable: c.reorderable }));\n // The normalized order, kept stable between updates that touch neither columns,\n // order nor pinning.\n let order: ColumnOrderState | undefined;\n const orderState = (): ColumnOrderState =>\n (order ??= normalizeOrder(options.columnOrder ?? [], orderable()));\n const rowViews = new WeakMap<Row<Features, AnyRow>, RowView<TData>>();\n // Built lazily per row model (sorting or new data gives a new array).\n let indexById: { rows: readonly Row<Features, AnyRow>[]; map: Map<string, number> } | undefined;\n\n // TanStack gets its column defs in the order, hidden ones included. Rebuilt only when\n // the order changes: a new columns array makes TanStack rebuild its columns, though\n // not its row models, which depend on data and sorting alone.\n let ordered:\n { order: ColumnOrderState; columns: TanStackColumnDef<Features, AnyRow>[] } | undefined;\n const orderedColumns = () => {\n const current = orderState();\n if (ordered?.order !== current) {\n ordered = { order: current, columns: current.flatMap((id) => tanStackById.get(id) ?? []) };\n }\n return ordered;\n };\n\n const tableOptions = (): TableOptions<Features, AnyRow> => ({\n features,\n columns: orderedColumns().columns,\n // Remote rows bypass TanStack's row models; it still handles columns and state.\n data: (options.remote ? [] : options.data) as AnyRow[],\n getRowId: (options.getRowId ?? defaultRowId) as (row: AnyRow, index: number) => string,\n state: {\n sorting: options.sorting,\n columnSizing: sizingState(),\n },\n // State is owned by the caller; TanStack's own setters must not change it.\n onSortingChange: () => undefined,\n onColumnSizingChange: () => undefined,\n });\n\n const table: Table<Features, AnyRow> = constructTable(tableOptions());\n\n // The row test of the filters, the quick filter and the shown columns (which the quick\n // filter reads). Remote rows are filtered by their source.\n const predicateFor = (except?: string) =>\n options.remote\n ? undefined\n : rowPredicate(\n byId,\n options.columnFilters,\n options.quickFilter,\n resolved.filter((c) => c.hasAccessor && !hiddenOf(c)),\n except,\n );\n setRowPredicate(table, predicateFor());\n\n const rows = () => table.getRowModel().rows;\n const pinned = (side: RowPin): readonly TData[] => options.pinnedRows?.[side] ?? [];\n\n const widthOf = (id: string) => table.getColumn(id)?.getSize() ?? 0;\n const view = (\n def: ResolvedColumn<TData, TContent>,\n colIndex: number,\n offset: number,\n pinEdge: boolean,\n width: number,\n ): ColumnView<TData, TContent> => {\n const sort = options.sorting.find((s) => s.id === def.id);\n const pin = pinOf(def);\n const resized = options.columnSizing[def.id] !== undefined;\n return {\n id: def.id,\n kind: 'data',\n colIndex,\n pin,\n offset,\n pinEdge,\n hidden: colIndex === 0,\n width,\n flex: pin === undefined && !resized ? def.flex : undefined,\n auto: def.auto && !resized,\n minWidth: def.minWidth,\n maxWidth: def.maxWidth,\n sortable: def.sortable,\n resizable: def.resizable,\n reorderable: def.reorderable,\n pinnable: def.pinnable,\n hideable: def.hideable,\n filter: def.filter,\n filtered: options.columnFilters?.[def.id] !== undefined,\n align: def.align,\n wrap: def.wrap,\n sorted: sort ? (sort.desc ? 'desc' : 'asc') : false,\n header: def.header,\n cell: def.cell,\n hasAccessor: def.hasAccessor,\n };\n };\n\n const buildViews = (): ColumnView<TData, TContent>[] => {\n const groups: Record<ColumnPin | 'center', ResolvedColumn<TData, TContent>[]> = {\n start: [],\n center: [],\n end: [],\n };\n for (const id of orderState()) {\n const def = byId.get(id);\n if (def && !hiddenOf(def)) groups[pinOf(def) ?? 'center'].push(def);\n }\n const { start, center, end } = groups;\n // The selection column comes first: it shifts every column one place on, and\n // the other start-pinned columns its width further from the start edge.\n const lead = options.selectionColumn ? 1 : 0;\n if (lead && byId.has(SELECTION_COLUMN_ID)) {\n throw new Error(`argus-table: the column id '${SELECTION_COLUMN_ID}' is reserved.`);\n }\n // Offsets: start columns from the start edge (after the selection column), the\n // scrolling ones within the scrolling area, end columns from the end edge.\n let x = lead * SELECTION_COLUMN_WIDTH;\n const list = start.map((def, i) => {\n const width = widthOf(def.id);\n const v = view(def, lead + i + 1, x, i === start.length - 1, width);\n x += width;\n return v;\n });\n x = 0;\n for (const [i, def] of center.entries()) {\n const width = widthOf(def.id);\n list.push(view(def, lead + start.length + i + 1, x, false, width));\n x += width;\n }\n const ends: ColumnView<TData, TContent>[] = [];\n x = 0;\n for (const [i, def] of [...end.entries()].reverse()) {\n const width = widthOf(def.id);\n ends.unshift(view(def, lead + start.length + center.length + i + 1, x, i === 0, width));\n x += width;\n }\n list.push(...ends);\n if (lead) list.unshift(selectionView(start.length === 0));\n return list;\n };\n\n let allViews: ColumnView<TData, TContent>[] | undefined;\n const buildAllViews = (shownViews: readonly ColumnView<TData, TContent>[]) => {\n const byShownId = new Map(shownViews.map((v) => [v.id, v]));\n return orderState().flatMap((id) => {\n const shownView = byShownId.get(id);\n if (shownView) return [shownView];\n const def = byId.get(id);\n return def ? [view(def, 0, 0, false, widthOf(id))] : [];\n });\n };\n\n return {\n update(next) {\n const merged = { ...options, ...next };\n const changed = (Object.keys(next) as (keyof typeof next)[]).some(\n (key) => next[key] !== options[key],\n );\n if (!changed) return;\n let reread: string[] = [];\n if (next.columns && next.columns !== options.columns) {\n reread = changedAccessors(options.columns, next.columns);\n resolved = resolveColumns(next.columns);\n byId = new Map(resolved.map((c) => [c.id, c]));\n tanStackById = new Map(resolved.map((c) => [c.id, toTanStack(c)]));\n }\n const pinningChanged = merged.columnPinning !== options.columnPinning;\n if (\n merged.columns !== options.columns ||\n merged.columnSizing !== options.columnSizing ||\n merged.autoWidths !== options.autoWidths ||\n pinningChanged\n ) {\n sizing = undefined;\n }\n if (\n merged.columns !== options.columns ||\n merged.columnOrder !== options.columnOrder ||\n pinningChanged\n ) {\n order = undefined;\n }\n const refilter =\n merged.columns !== options.columns ||\n merged.columnFilters !== options.columnFilters ||\n merged.quickFilter !== options.quickFilter ||\n merged.columnVisibility !== options.columnVisibility ||\n merged.remote !== options.remote;\n options = merged;\n views = undefined;\n allViews = undefined;\n if (refilter) setRowPredicate(table, predicateFor());\n table.setOptions((prev) => ({ ...prev, ...tableOptions() }));\n if (reread.length && !options.remote) {\n // TanStack caches each value on its row by column id, and keeps rows\n // while the data is the same: drop the values of the columns that now\n // read differently, and sort again.\n for (const row of table.getCoreRowModel().rows) {\n for (const id of reread) Reflect.deleteProperty(row._valuesCache, id);\n }\n valuesChanged(table);\n }\n },\n\n get columns() {\n return (views ??= buildViews());\n },\n\n get allColumns() {\n return (allViews ??= buildAllViews(this.columns));\n },\n\n get rowCount() {\n return options.remote?.rowCount ?? rows().length;\n },\n get rowOrder() {\n return options.remote ?? rows();\n },\n\n get totalWidth() {\n return this.columns.reduce((sum, column) => sum + column.width, 0);\n },\n\n rowAt(index) {\n if (options.remote) {\n const entry = options.remote.entryAt(index);\n return entry && { id: entry.id, index, original: entry.row };\n }\n const row = rows()[index];\n if (!row) return undefined;\n let view = rowViews.get(row);\n if (view?.index !== index) {\n view = { id: row.id, index, original: row.original as TData };\n rowViews.set(row, view);\n }\n return view;\n },\n\n indexOf(rowId) {\n if (options.remote) return options.remote.indexOf(rowId);\n const current = rows();\n if (indexById?.rows !== current) {\n indexById = { rows: current, map: new Map(current.map((r, i) => [r.id, i])) };\n }\n return indexById.map.get(rowId);\n },\n\n selectableIds() {\n if (options.remote) return options.remote.loadedIds();\n return rows().map((r) => r.id);\n },\n\n valueAt(index, columnId) {\n if (options.remote) {\n const entry = options.remote.entryAt(index);\n return entry && byId.get(columnId)?.getValue(entry.row, index);\n }\n return rows()[index]?.getValue(columnId);\n },\n\n cellContext(index, columnId) {\n if (options.remote) {\n const entry = options.remote.entryAt(index);\n const column = byId.get(columnId);\n if (!entry || !column) return undefined;\n return {\n row: entry.row,\n rowId: entry.id,\n index,\n columnId,\n value: column.getValue(entry.row, index),\n };\n }\n const row = rows()[index];\n if (!row || !byId.has(columnId)) return undefined;\n return {\n row: row.original as TData,\n rowId: row.id,\n index,\n columnId,\n value: row.getValue(columnId),\n };\n },\n\n nextSorting(columnId) {\n if (byId.get(columnId)?.sortable !== true) return undefined;\n const current = options.sorting.find((s) => s.id === columnId);\n if (!current) return [{ id: columnId, desc: false }];\n return current.desc ? [] : [{ id: columnId, desc: true }];\n },\n\n nextSizing(columnId, width) {\n const column = byId.get(columnId);\n if (!column?.resizable || !Number.isFinite(width)) return undefined;\n const clamped = Math.round(Math.min(column.maxWidth, Math.max(column.minWidth, width)));\n return { ...options.columnSizing, [columnId]: clamped };\n },\n\n orderOf(base) {\n return base === undefined ? orderState() : normalizeOrder(base, orderable());\n },\n\n nextOrder(columnId, to, base) {\n return moveColumn(base ?? orderState(), orderable(), columnId, to, shown);\n },\n\n nextPinning(columnId, pin, base = options.columnPinning) {\n const column = byId.get(columnId);\n if (!column?.pinnable || (pinOf(column, base) ?? false) === pin) return undefined;\n return { ...base, [columnId]: pin };\n },\n\n nextVisibility(columnId, hidden, base = options.columnVisibility) {\n const column = byId.get(columnId);\n if (!column || hiddenOf(column, base) === hidden) return undefined;\n const othersShown = resolved.some((c) => c !== column && !hiddenOf(c, base));\n if (hidden && (!column.hideable || !othersShown)) return undefined;\n return { ...base, [columnId]: !hidden };\n },\n\n nextFilters(columnId, filter, base = options.columnFilters ?? {}) {\n const column = byId.get(columnId);\n if (!column) return undefined;\n const current = base[columnId];\n if (filter === undefined) {\n if (current === undefined) return undefined;\n const next = { ...base };\n Reflect.deleteProperty(next, columnId);\n return next;\n }\n if (column.filter === undefined) return undefined;\n if (current && JSON.stringify(current) === JSON.stringify(filter)) return undefined;\n return { ...base, [columnId]: filter };\n },\n\n filterValues(columnId, limit = 1000) {\n const column = byId.get(columnId);\n if (!column) return undefined;\n if (column.filterOptions) return { values: [...column.filterOptions], truncated: false };\n if (options.remote) return undefined;\n const rows = table.getCoreRowModel().rows as unknown as Iterable<{\n original: TData;\n index: number;\n }>;\n return distinctValues(rows, column, predicateFor(columnId), limit);\n },\n\n pinnedCount(side) {\n return pinned(side).length;\n },\n\n pinnedRowAt(side, index) {\n if (index < 0 || index >= pinned(side).length) return undefined;\n const row = pinned(side)[index] as TData;\n const id = options.getRowId ? options.getRowId(row, index) : `${side}-${String(index)}`;\n return { id, index, original: row };\n },\n\n pinnedValueAt(side, index, columnId) {\n if (index < 0 || index >= pinned(side).length) return undefined;\n return byId.get(columnId)?.getValue(pinned(side)[index] as TData, index);\n },\n\n pinnedCellContext(side, index, columnId) {\n const row = this.pinnedRowAt(side, index);\n const column = byId.get(columnId);\n if (!row || !column) return undefined;\n return {\n row: row.original,\n rowId: row.id,\n index,\n columnId,\n value: column.getValue(row.original, index),\n pinned: side,\n };\n },\n };\n}\n","/** The row groups of the grid, top to bottom. */\nexport type GridSection = 'header' | 'top' | 'body' | 'bottom';\n\n/** A row of the grid: its section and its index within it (the header is index 0). */\nexport interface GridRow {\n section: GridSection;\n index: number;\n}\n\n/**\n * Where each row sits in the grid as a whole: the header row, then the rows\n * pinned to the top, the body rows, and the rows pinned to the bottom. The\n * position is 0-based and `aria-rowindex` is one more. Keyboard navigation\n * steps through positions, so it crosses sections without special cases.\n */\nexport class RowLayout {\n readonly top: number;\n readonly body: number;\n readonly bottom: number;\n\n constructor(top: number, body: number, bottom: number) {\n this.top = top;\n this.body = body;\n this.bottom = bottom;\n }\n\n /** Number of rows, the header included (`aria-rowcount`). */\n get total(): number {\n return 1 + this.top + this.body + this.bottom;\n }\n\n /** 0-based position of a row in the grid. */\n position({ section, index }: GridRow): number {\n switch (section) {\n case 'header':\n return 0;\n case 'top':\n return 1 + index;\n case 'body':\n return 1 + this.top + index;\n case 'bottom':\n return 1 + this.top + this.body + index;\n }\n }\n\n /** The row at a 0-based position, or `undefined` outside the grid. */\n at(position: number): GridRow | undefined {\n if (!Number.isInteger(position) || position < 0 || position >= this.total) return undefined;\n if (position === 0) return { section: 'header', index: 0 };\n let index = position - 1;\n if (index < this.top) return { section: 'top', index };\n index -= this.top;\n if (index < this.body) return { section: 'body', index };\n return { section: 'bottom', index: index - this.body };\n }\n\n ariaRowIndex(row: GridRow): number {\n return this.position(row) + 1;\n }\n\n fromAriaRowIndex(ariaRowIndex: number): GridRow | undefined {\n return this.at(ariaRowIndex - 1);\n }\n}\n","/**\n * State that works like a form input: uncontrolled until the host sets it,\n * controlled from then on. See `docs/plan/code-architecture/04-state-and-events.md`.\n *\n * - **Uncontrolled:** `request()` applies the change. The caller then fires the change event.\n * - **Controlled:** `request()` changes nothing and returns the proposed value for the\n * event. The value only changes when the host calls `set()` again.\n * - `set(undefined)` hands ownership back to the table and keeps the last value.\n */\nexport interface Controllable<T> {\n /** The current value. */\n readonly value: T;\n /** `true` once the host has set a value (and not handed it back with `undefined`). */\n readonly controlled: boolean;\n /** Called when the host sets the property. */\n set(value: T | undefined): void;\n /**\n * Called when the table wants to change the state, for example after a header click.\n * Returns the proposed value and whether it was applied.\n */\n request(next: T): { value: T; applied: boolean };\n}\n\nexport function controllable<T>(initial: T): Controllable<T> {\n let value = initial;\n let controlled = false;\n return {\n get value() {\n return value;\n },\n get controlled() {\n return controlled;\n },\n set(next) {\n if (next === undefined) {\n controlled = false;\n return;\n }\n controlled = true;\n value = next;\n },\n request(next) {\n if (!controlled) value = next;\n return { value: next, applied: !controlled };\n },\n };\n}\n","import type { SelectionMode, SelectionState } from '../types.js';\n\n/**\n * Row selection rules, DOM-free. The element owns the state (through\n * `controllable`) and the anchor; these functions only compute the next ones.\n *\n * The anchor is the row a range starts from: the last row clicked or toggled\n * without Shift. Ranges are by index in the current row order, so they follow\n * sorting; `idAt` returns `undefined` for a row that can't be selected (a\n * `dataSource` row not loaded), and such rows are left out.\n */\n\n/** The selection after a step, and the row later ranges start from. */\nexport interface SelectionStep {\n selection: SelectionState;\n anchor: string | undefined;\n}\n\n/** The row a click or key acts on: its id and its index in the current row order. */\nexport interface SelectionTarget {\n id: string;\n index: number;\n}\n\n/** Modifier keys of a click: Ctrl or Cmd toggles, Shift selects a range. */\nexport interface SelectionModifiers {\n toggle: boolean;\n range: boolean;\n}\n\n/** Whether two selections hold the same ids, in any order. */\nexport function sameSelection(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const ids = new Set(a);\n return b.every((id) => ids.has(id));\n}\n\n/**\n * Selects or deselects one row and makes it the anchor. In `'single'` mode,\n * selecting a row replaces the selection.\n */\nexport function toggleRow(\n current: readonly string[],\n mode: SelectionMode,\n id: string,\n): SelectionStep | undefined {\n if (mode === 'none') return undefined;\n if (current.includes(id)) return { selection: current.filter((s) => s !== id), anchor: id };\n return { selection: mode === 'single' ? [id] : [...current, id], anchor: id };\n}\n\n/**\n * The rows from index `from` to `to` (either order, both inclusive), in row\n * order. With `add`, they join the current selection instead of replacing it.\n * The anchor stays where it was.\n */\nexport function selectRange(\n current: readonly string[],\n from: number,\n to: number,\n idAt: (index: number) => string | undefined,\n add: boolean,\n): SelectionState {\n const ids: string[] = add ? [...current] : [];\n const have = new Set(ids);\n const step = to >= from ? 1 : -1;\n const [first, last] = step === 1 ? [from, to] : [to, from];\n for (let index = first; index <= last; index++) {\n const id = idAt(index);\n if (id === undefined || have.has(id)) continue;\n have.add(id);\n ids.push(id);\n }\n return ids;\n}\n\n/**\n * Every row of `ids` selected, keeping the rows already selected (with a\n * `dataSource`, `ids` are only the loaded rows: selected rows elsewhere stay).\n */\nexport function selectAll(current: readonly string[], ids: readonly string[]): SelectionState {\n const have = new Set(current);\n return [...current, ...ids.filter((id) => !have.has(id))];\n}\n\n/**\n * A click on a row, desktop style. A plain click selects only that row; Ctrl or\n * Cmd toggles it. In `'multi'` mode, Shift selects the range from the anchor\n * (at `anchorIndex`) to the row, and Ctrl+Shift adds that range. Without an\n * anchor in the current rows, Shift acts like a plain click. `undefined` in\n * `'none'` mode. The selection may come back unchanged (a click on the one\n * selected row): check with `sameSelection` before reporting a change.\n */\nexport function clickSelection(\n current: readonly string[],\n mode: SelectionMode,\n target: SelectionTarget,\n anchor: { id: string; index: number } | undefined,\n modifiers: SelectionModifiers,\n idAt: (index: number) => string | undefined,\n): SelectionStep | undefined {\n if (mode === 'none') return undefined;\n if (mode === 'multi' && modifiers.range && anchor) {\n return {\n selection: selectRange(current, anchor.index, target.index, idAt, modifiers.toggle),\n anchor: anchor.id,\n };\n }\n if (modifiers.toggle) return toggleRow(current, mode, target.id);\n return { selection: [target.id], anchor: target.id };\n}\n","/** A rendered row and the pool slot whose DOM it uses. */\nexport interface PoolEntry {\n id: string;\n slot: number;\n}\n\n/**\n * Assigns pool slots to rendered rows (ADR 0001), and with `virtualizeColumns`\n * to rendered columns too (the ids are then column ids).\n *\n * A row keeps its slot while it stays rendered. A row entering the window takes a\n * slot freed by a row that left, so its DOM is updated in place rather than created.\n * Rows are returned in slot order (\"pool order\"); the ADR 0001 addendum ruled out\n * re-sorting them by row index, so assistive tech gets row positions from\n * `aria-rowindex` instead.\n */\nexport class RowPool {\n #slots = new Map<string, number>();\n #free: number[] = [];\n #size = 0;\n #pinned: string | undefined;\n\n /** Number of slots created so far: the most rows rendered at once. */\n get size(): number {\n return this.#size;\n }\n\n /** The row id whose slot is kept while it is out of range, if any. */\n get pinned(): string | undefined {\n return this.#pinned;\n }\n\n /**\n * Keeps one row's slot, and keeps it rendered, while it is outside the rendered\n * range. Used for the row holding focus. `undefined` releases it.\n */\n pin(id: string | undefined): void {\n this.#pinned = id;\n }\n\n /** The slot a row holds, or `undefined` when it isn't rendered. */\n slotOf(id: string): number | undefined {\n return this.#slots.get(id);\n }\n\n /**\n * Updates the pool for the rows that should be rendered and returns them, plus the\n * pinned row if it isn't among them, in slot order.\n */\n update(ids: Iterable<string>): PoolEntry[] {\n const keep = new Set(ids);\n if (this.#pinned !== undefined) keep.add(this.#pinned);\n\n for (const [id, slot] of this.#slots) {\n if (!keep.has(id)) {\n this.#slots.delete(id);\n this.#free.push(slot);\n }\n }\n for (const id of keep) {\n if (!this.#slots.has(id)) this.#slots.set(id, this.#free.pop() ?? this.#size++);\n }\n\n const entries: PoolEntry[] = [];\n for (const [id, slot] of this.#slots) entries.push({ id, slot });\n return entries.sort((a, b) => a.slot - b.slot);\n }\n\n /** Frees every slot, for example when the data is replaced. */\n clear(): void {\n this.#slots.clear();\n this.#free = [];\n this.#size = 0;\n this.#pinned = undefined;\n }\n}\n","/**\n * Row heights for rows that aren't all the same height (`rowHeight: 'auto'`):\n * every row is `estimate` px until it is measured. Offsets, the row at an\n * offset and the total take O(log n), so measuring a row near the top of a\n * million rows doesn't recompute every row below it.\n *\n * A Fenwick tree over each row's difference from the estimate. Nothing is\n * allocated until a row differs from the estimate: one-line rows cost nothing.\n */\nexport class RowSizes {\n #count = 0;\n #estimate = 1;\n /** Each row's difference from the estimate; `undefined` while every row is the estimate. */\n #delta: Float64Array | undefined;\n /** Fenwick tree over `#delta`, 1-based. */\n #tree: Float64Array | undefined;\n /** The highest power of two at most `#count`, for `indexAt`. */\n #step = 0;\n /** The sum of all differences. */\n #sum = 0;\n\n /** Number of rows. */\n get count(): number {\n return this.#count;\n }\n\n /** The height of a row not measured, in px. */\n get estimate(): number {\n return this.#estimate;\n }\n\n /** The height of all rows. */\n get total(): number {\n return this.#count * this.#estimate + this.#sum;\n }\n\n /**\n * Starts over: `count` rows of `estimate` px, then the heights in `sizes`\n * (`[index, px]`; indexes out of range are ignored). O(count).\n */\n reset(count: number, estimate: number, sizes: Iterable<readonly [number, number]> = []): void {\n this.#count = Math.max(0, Math.floor(count));\n this.#estimate = estimate > 0 ? estimate : 1;\n this.#step = highestPowerOfTwo(this.#count);\n this.#sum = 0;\n let delta: Float64Array | undefined;\n for (const [index, px] of sizes) {\n if (index < 0 || index >= this.#count || !Number.isFinite(px)) continue;\n const d = px - this.#estimate;\n if (d === 0) continue;\n delta ??= this.#buffer(this.#count);\n this.#sum += d - (delta[index] ?? 0);\n delta[index] = d;\n }\n if (delta) this.#build(delta);\n else this.#clear();\n }\n\n /**\n * Changes the number of rows (a data source counting more), keeping the\n * heights of the rows that stay. O(count) when any row was measured.\n */\n resize(count: number): void {\n count = Math.max(0, Math.floor(count));\n if (count === this.#count) return;\n const old = this.#delta;\n this.#count = count;\n this.#step = highestPowerOfTwo(count);\n if (!old) return;\n const delta = new Float64Array(count);\n delta.set(old.subarray(0, Math.min(count, old.length)));\n this.#sum = 0;\n for (const d of delta) this.#sum += d;\n this.#build(delta);\n }\n\n /** The height of the row at `index`. */\n sizeOf(index: number): number {\n return this.#estimate + (this.#delta?.[index] ?? 0);\n }\n\n /** Sets the height of the row at `index`. Returns how much it changed by. */\n set(index: number, px: number): number {\n if (index < 0 || index >= this.#count || !Number.isFinite(px)) return 0;\n const d = px - this.sizeOf(index);\n if (Math.abs(d) < 1e-6) return 0;\n if (!this.#delta || !this.#tree) this.#build(this.#buffer(this.#count));\n const delta = this.#delta;\n const tree = this.#tree;\n if (!delta || !tree) return 0;\n delta[index] = (delta[index] ?? 0) + d;\n for (let i = index + 1; i <= this.#count; i += i & -i) tree[i] = (tree[i] ?? 0) + d;\n this.#sum += d;\n return d;\n }\n\n /** The offset of the row at `index` from the first row's top: the heights of the rows before it. */\n startOf(index: number): number {\n const i = Math.min(Math.max(Math.floor(index), 0), this.#count);\n let start = i * this.#estimate;\n const tree = this.#tree;\n if (tree) for (let j = i; j > 0; j -= j & -j) start += tree[j] ?? 0;\n return start;\n }\n\n /** The row at `offset` px from the first row's top, clamped to the rows. 0 when there are none. */\n indexAt(offset: number): number {\n const count = this.#count;\n if (count === 0 || !(offset > 0)) return 0;\n const estimate = this.#estimate;\n const tree = this.#tree;\n let index: number;\n if (!tree) {\n index = Math.floor(offset / estimate);\n } else {\n // The most rows whose heights add up to at most `offset`: that many rows\n // end at or above it, so the row at it is the next one.\n index = 0;\n let rest = offset;\n for (let step = this.#step; step > 0; step >>= 1) {\n const next = index + step;\n if (next > count) continue;\n const size = step * estimate + (tree[next] ?? 0);\n if (size <= rest) {\n index = next;\n rest -= size;\n }\n }\n }\n return Math.min(index, count - 1);\n }\n\n /** A zeroed buffer for `count` differences, reusing the current one when it fits. */\n #buffer(count: number): Float64Array {\n const delta = this.#delta;\n if (delta?.length === count) {\n delta.fill(0);\n return delta;\n }\n return new Float64Array(count);\n }\n\n /** Builds the tree over `delta` in O(count). */\n #build(delta: Float64Array): void {\n const count = this.#count;\n let tree = this.#tree;\n if (tree?.length !== count + 1) tree = new Float64Array(count + 1);\n tree.set(delta, 1);\n tree[0] = 0;\n for (let i = 1; i <= count; i++) {\n const parent = i + (i & -i);\n if (parent <= count) tree[parent] = (tree[parent] ?? 0) + (tree[i] ?? 0);\n }\n this.#delta = delta;\n this.#tree = tree;\n }\n\n #clear(): void {\n this.#delta = undefined;\n this.#tree = undefined;\n }\n}\n\nfunction highestPowerOfTwo(n: number): number {\n let step = 1;\n while (step * 2 <= n) step *= 2;\n return n > 0 ? step : 0;\n}\n","/**\n * Maps the scroll position of a body that is too tall to render onto the rows.\n *\n * Engines limit an element's height (about 33.5M px in Chromium and WebKit, less\n * when zoomed; about 17.9M px in Firefox, which drops a taller element to 0, and\n * lets go of sticky elements past 8.95M px of scrolling, so 8M px there). A\n * body taller than `cap` renders `cap` px tall, and the scroll position is scaled\n * linearly: the top of the physical scroll range is the first row, its bottom the\n * last. Offsets the virtualizer works with are logical (unscaled) px; the\n * scroller's `scrollTop` is physical. Under the cap the mapping is the identity.\n *\n * The scroll range is the scroller's: the body plus what scrolls with it (header,\n * pinned rows) minus the viewport, so pass the physical range,\n * `scrollHeight - clientHeight`. The logical range is longer by `excess`.\n */\nexport class ScrollScale {\n #logical = 0;\n #cap = Infinity;\n /** The logical offset last written and the physical offset it landed on. */\n #landed: { physical: number; logical: number } | undefined;\n /** A point the mapping passes through instead of the straight line (see `pivot`). */\n #pivot: { physical: number; logical: number; range: number } | undefined;\n\n /**\n * `logical`: the height of all body rows in px. `cap`: the tallest body the\n * engine renders. Returns whether anything changed.\n */\n configure(logical: number, cap: number): boolean {\n if (logical === this.#logical && cap === this.#cap) return false;\n this.#logical = logical;\n this.#cap = cap;\n this.#landed = undefined;\n this.#pivot = undefined;\n return true;\n }\n\n /**\n * Bends the mapping so that the physical offset `physical` maps to `logical`:\n * linear from the top to that point and from there to the bottom. Measured row\n * heights change the logical height of a scaled body while it scrolls; pivoting\n * at the current offset keeps the rows in view where they are, without writing\n * the scroll position (which would cut a scroll short). Call after\n * `configure()`, which drops the pivot. Ignored at the ends of the range,\n * where the straight line keeps the first and the last row reachable.\n */\n pivot(physical: number, logical: number, range: number): void {\n this.#landed = undefined;\n const total = range + this.excess;\n const inside =\n this.scaled && physical > 1 && physical < range - 1 && logical > 0 && logical < total;\n this.#pivot = inside ? { physical, logical, range } : undefined;\n }\n\n /** Whether the body is taller than the cap, so offsets are scaled. */\n get scaled(): boolean {\n return this.#logical > this.#cap;\n }\n\n /** The body's rendered height in px. */\n get size(): number {\n return Math.min(this.#logical, this.#cap);\n }\n\n /** How much longer the logical scroll range is than the physical one. */\n get excess(): number {\n return this.#logical - this.size;\n }\n\n /** The logical offset for a physical one, given the physical scroll range. */\n toLogical(physical: number, range: number): number {\n if (!this.scaled || range <= 0) return physical;\n const landed = this.#landed;\n if (landed?.physical === physical) return landed.logical;\n const total = range + this.excess;\n const p = clamp(physical, range);\n const pivot = this.#pivotFor(range);\n if (!pivot) return (p * total) / range;\n if (p <= pivot.physical) return (p * pivot.logical) / pivot.physical;\n return (\n pivot.logical + ((p - pivot.physical) * (total - pivot.logical)) / (range - pivot.physical)\n );\n }\n\n /** The physical offset for a logical one, given the physical scroll range. */\n toPhysical(logical: number, range: number): number {\n if (!this.scaled || range <= 0) return logical;\n const total = range + this.excess;\n const l = clamp(logical, total);\n const pivot = this.#pivotFor(range);\n if (!pivot) return (l * range) / total;\n if (l <= pivot.logical) return (l * pivot.physical) / pivot.logical;\n return (\n pivot.physical + ((l - pivot.logical) * (range - pivot.physical)) / (total - pivot.logical)\n );\n }\n\n /** The pivot, if it was set for this range and is still inside it. */\n #pivotFor(range: number) {\n const pivot = this.#pivot;\n if (pivot?.range !== range || pivot.logical >= range + this.excess) return undefined;\n return pivot;\n }\n\n /**\n * Records that a write of the logical offset `logical` left the scroller at\n * `physical` (read back, after the engine's rounding), so reading that physical\n * offset gives the exact logical one again. Without it a scaled offset could be\n * off by up to the scale ratio, and a row scrolled to the top would sit under\n * the header by a few px.\n */\n land(logical: number, physical: number): void {\n this.#landed = this.scaled ? { physical, logical } : undefined;\n }\n}\n\nconst clamp = (value: number, max: number) => Math.min(Math.max(value, 0), max);\n","/** The visible rows as the virtualizer reports them: indexes inclusive. */\nexport interface VisibleRange {\n startIndex: number;\n endIndex: number;\n overscan: number;\n count: number;\n}\n\n/**\n * The most rows of `rowHeight` px a view `viewHeight` px tall can show at once,\n * partly: one more than fit, when the view starts inside a row.\n */\nexport function maxVisibleRows(viewHeight: number, rowHeight: number): number {\n return viewHeight > 0 && rowHeight > 0 ? Math.ceil(viewHeight / rowHeight) + 1 : 0;\n}\n\n/**\n * The row indexes to render: the visible rows plus `overscan` on each side,\n * always the same number of rows (`maxVisible` plus twice the overscan, or all\n * rows when there are fewer). At either end the overscan that has no room goes to\n * the other side.\n *\n * The usual window is cut off at the ends instead: at the top it holds only the\n * overscan below, and the row pool grows by a row, its cells and their slots,\n * with every row scrolled until the overscan above is full. WebKit cancels a\n * wheel scroll's animation when slot assignment changes inside the scroller, so\n * from the top each wheel step moved a few px instead of a full step. A window of\n * one size fills the pool on the first render, and scrolling only reuses it.\n */\nexport function steadyWindow(\n { startIndex, endIndex, overscan, count }: VisibleRange,\n maxVisible: number,\n): number[] {\n const visible = Math.max(maxVisible, endIndex - startIndex + 1);\n const size = Math.min(count, visible + 2 * overscan);\n const first = Math.max(0, Math.min(startIndex - overscan, count - size));\n return Array.from({ length: size }, (_, i) => first + i);\n}\n","import { steadyWindow } from './steady-window.js';\n\n/** Where a scrolling column sits: its start within the scrolling area and its width, in px. */\nexport interface ColumnExtent {\n offset: number;\n width: number;\n}\n\n/**\n * The scrolling columns a view `viewWidth` px wide shows when scrolled\n * `scrollOffset` px (always positive, RTL included), indexes inclusive.\n * `undefined` when there are no columns or the view has no width. `columns`\n * are in visual order, so their offsets ascend.\n */\nexport function visibleColumns(\n columns: readonly ColumnExtent[],\n scrollOffset: number,\n viewWidth: number,\n): { startIndex: number; endIndex: number } | undefined {\n const count = columns.length;\n if (count === 0 || viewWidth <= 0) return undefined;\n // The first column that ends past the scroll offset.\n let lo = 0;\n let hi = count - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n const c = columns[mid];\n if (c && c.offset + c.width > scrollOffset) hi = mid;\n else lo = mid + 1;\n }\n const startIndex = lo;\n // The last column that starts before the view's end.\n const end = scrollOffset + viewWidth;\n lo = startIndex;\n hi = count - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n const c = columns[mid];\n if (c && c.offset < end) lo = mid;\n else hi = mid - 1;\n }\n return { startIndex, endIndex: lo };\n}\n\n/**\n * The most columns a view `viewWidth` px wide can show at once, partly ones\n * included, wherever it is scrolled. The view shows the most columns when it\n * starts just before some column's end, so that is the only place to try.\n */\nexport function maxVisibleColumns(columns: readonly ColumnExtent[], viewWidth: number): number {\n if (viewWidth <= 0) return 0;\n let most = 0;\n let j = 0;\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i];\n if (!c) continue;\n const limit = c.offset + c.width + viewWidth;\n j = Math.max(j, i);\n for (let next = columns[j + 1]; next && next.offset < limit; next = columns[j + 1]) j++;\n most = Math.max(most, j - i + 1);\n }\n return most;\n}\n\n/**\n * The scrolling columns to render, as indexes: the visible ones plus `overscan`\n * on each side, always the same number of them for one set of widths (like\n * rows, see `steadyWindow`: in WebKit, a column pool that grows while scrolling\n * cuts a wheel scroll short). Empty while the view has no width.\n * `maxVisible` is `maxVisibleColumns()` for these columns and this view.\n */\nexport function columnWindow(\n columns: readonly ColumnExtent[],\n scrollOffset: number,\n viewWidth: number,\n overscan: number,\n maxVisible: number,\n): number[] {\n const visible = visibleColumns(columns, scrollOffset, viewWidth);\n if (!visible) return [];\n return steadyWindow({ ...visible, overscan, count: columns.length }, maxVisible);\n}\n","/** Whether a row's data is there: loaded, still to come, or its page failed. */\nexport type RowState = 'loaded' | 'loading' | 'error';\n\n/** A loaded row and its id. */\nexport interface CachedRow<TData> {\n id: string;\n row: TData;\n}\n\nexport interface PageCacheOptions<TData> {\n /** Rows per page, at least 1. */\n pageSize: number;\n /** Row id function, given the absolute index. Default: the index as a string. */\n getRowId?: ((row: TData, index: number) => string) | undefined;\n /** Row count to start with (carried over from a previous cache). Default: one page. */\n rowCount?: number;\n /** Whether `rowCount` is the real total. Default: `false`. */\n totalKnown?: boolean;\n}\n\n/**\n * Pages kept loaded on each side of the requested range; pages further away are\n * dropped, so memory stays bounded however far the table scrolls.\n */\nexport const KEEP_PAGES = 10;\n\n/**\n * The row cache behind `dataSource`: which pages are loaded, in flight or failed,\n * and how many rows the table has. Bookkeeping only: no timers and no fetching,\n * so the caller (the element's DataController) decides when to load.\n *\n * Without a known total, the row count stays one page past the last loaded row,\n * so the next page shows as skeletons and loads when it scrolls into view. A page\n * shorter than asked for marks the end.\n */\nexport class PageCache<TData> {\n readonly pageSize: number;\n readonly #getRowId: (row: TData, index: number) => string;\n readonly #pages = new Map<number, CachedRow<TData>[]>();\n /** In-flight pages and the `end` they asked for. */\n readonly #inFlight = new Map<number, number>();\n readonly #failed = new Set<number>();\n readonly #indexById = new Map<string, number>();\n #rowCount: number;\n #totalKnown: boolean;\n\n constructor(options: PageCacheOptions<TData>) {\n this.pageSize = Math.max(1, Math.floor(options.pageSize));\n this.#getRowId = options.getRowId ?? ((_row, index) => String(index));\n this.#rowCount = Math.max(0, Math.floor(options.rowCount ?? this.pageSize));\n this.#totalKnown = options.totalKnown ?? false;\n }\n\n /** Number of rows, loaded or not. */\n get rowCount(): number {\n return this.#rowCount;\n }\n\n /** `true` once the total is known (given by the server, or found from a short page). */\n get totalKnown(): boolean {\n return this.#totalKnown;\n }\n\n pageOf(index: number): number {\n return Math.floor(index / this.pageSize);\n }\n\n /** The loaded row at an index, with its id; `undefined` until its page has loaded. */\n entryAt(index: number): CachedRow<TData> | undefined {\n if (index < 0 || index >= this.#rowCount) return undefined;\n return this.#pages.get(this.pageOf(index))?.[index % this.pageSize];\n }\n\n /** The index of a loaded row's id, or `undefined`. */\n indexOf(rowId: string): number | undefined {\n return this.#indexById.get(rowId);\n }\n\n /** The ids of every loaded row, in row order. */\n loadedIds(): string[] {\n const pages = [...this.#pages.keys()].sort((a, b) => a - b);\n return pages.flatMap((page) => (this.#pages.get(page) ?? []).map((entry) => entry.id));\n }\n\n stateAt(index: number): RowState {\n if (this.entryAt(index)) return 'loaded';\n return this.#failed.has(this.pageOf(index)) ? 'error' : 'loading';\n }\n\n /** Pages touching the rows `start` to `end` (exclusive) that still need a request. */\n missingPages(start: number, end: number): number[] {\n const last = Math.min(end, this.#rowCount) - 1;\n const pages: number[] = [];\n if (last < 0) return pages;\n for (let page = this.pageOf(Math.max(0, start)); page <= this.pageOf(last); page++) {\n if (!this.#pages.has(page) && !this.#inFlight.has(page) && !this.#failed.has(page)) {\n pages.push(page);\n }\n }\n return pages;\n }\n\n /** Marks a page as in flight and returns the rows to ask for. */\n begin(page: number): { start: number; end: number } {\n const start = page * this.pageSize;\n let end = start + this.pageSize;\n if (this.#totalKnown) end = Math.min(end, this.#rowCount);\n this.#failed.delete(page);\n this.#inFlight.set(page, end);\n return { start, end };\n }\n\n /** Stores a page's rows and updates the row count. Ignored unless the page is in flight. */\n resolve(page: number, rows: readonly TData[], total?: number): boolean {\n const end = this.#inFlight.get(page);\n if (end === undefined) return false;\n this.#inFlight.delete(page);\n const start = page * this.pageSize;\n const asked = end - start;\n const entries = rows.slice(0, asked).map((row, i) => ({\n id: this.#getRowId(row, start + i),\n row,\n }));\n this.#drop(page);\n if (entries.length > 0) this.#pages.set(page, entries);\n entries.forEach((entry, i) => this.#indexById.set(entry.id, start + i));\n\n if (total !== undefined && Number.isFinite(total) && total >= 0) {\n this.#setCount(Math.floor(total), true);\n } else if (entries.length < asked) {\n this.#setCount(start + entries.length, true);\n } else if (!this.#totalKnown) {\n this.#setCount(Math.max(this.#rowCount, end + this.pageSize), false);\n }\n return true;\n }\n\n /** Marks an in-flight page as failed. Ignored unless the page is in flight. */\n fail(page: number): boolean {\n if (!this.#inFlight.delete(page)) return false;\n this.#failed.add(page);\n return true;\n }\n\n /** Lets a failed page be requested again. */\n retry(page: number): void {\n this.#failed.delete(page);\n }\n\n /** Forgets an in-flight page (its request was aborted), so it can be requested again. */\n cancel(page: number): void {\n this.#inFlight.delete(page);\n }\n\n /** `true` if a page failed and hasn't been retried or evicted since. */\n isFailed(page: number): boolean {\n return this.#failed.has(page);\n }\n\n /** In-flight pages entirely outside rows `start` to `end` (exclusive). */\n inFlightOutside(start: number, end: number): number[] {\n const first = this.pageOf(Math.max(0, start));\n const last = this.pageOf(Math.max(0, end - 1));\n return [...this.#inFlight.keys()].filter((page) => page < first || page > last);\n }\n\n /**\n * Drops loaded and failed pages more than `KEEP_PAGES` pages away from rows\n * `start` to `end` (exclusive). Failed pages that come back into view load again.\n */\n evictOutside(start: number, end: number): void {\n const first = this.pageOf(Math.max(0, start)) - KEEP_PAGES;\n const last = this.pageOf(Math.max(0, end - 1)) + KEEP_PAGES;\n for (const page of [...this.#pages.keys()]) {\n if (page < first || page > last) this.#drop(page);\n }\n for (const page of [...this.#failed]) {\n if (page < first || page > last) this.#failed.delete(page);\n }\n }\n\n /** Number of pages holding rows: bounded by eviction. */\n get loadedPages(): number {\n return this.#pages.size;\n }\n\n #setCount(count: number, known: boolean): void {\n this.#rowCount = count;\n this.#totalKnown = known;\n // Rows past the end are gone; drop pages that start there.\n for (const page of [...this.#pages.keys()]) {\n if (page * this.pageSize >= count) this.#drop(page);\n }\n }\n\n #drop(page: number): void {\n const entries = this.#pages.get(page);\n if (!entries) return;\n const start = page * this.pageSize;\n entries.forEach((entry, i) => {\n if (this.#indexById.get(entry.id) === start + i) this.#indexById.delete(entry.id);\n });\n this.#pages.delete(page);\n }\n}\n","let region: HTMLElement | undefined;\n\n/**\n * Says something to screen readers through a polite live region. The region\n * lives in the document body, not in the table: a grid may only own rows, so a\n * status element inside it would break the grid's structure. One region serves\n * every table on the page. It is visually hidden with inline styles, so page\n * CSS can't reveal it.\n */\nexport function announce(doc: Document, message: string): void {\n if (!region?.isConnected || region.ownerDocument !== doc) {\n region = doc.createElement('div');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.dataset.argusAnnouncer = '';\n region.style.cssText =\n 'position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap';\n doc.body.append(region);\n }\n const target = region;\n // A new text node each time, so the same message twice is still announced.\n target.textContent = '';\n setTimeout(() => {\n target.textContent = message;\n }, 50);\n}\n","import type { ColumnSizingState } from '@argus-table/core';\n\n/**\n * The width each column's content needs, in px, from the cells rendered now:\n * the header, the pinned rows and the rendered body rows. Rows that haven't\n * loaded are skipped (their skeleton bars say nothing about the content).\n *\n * Every cell of the columns gets `data-measure`, which sizes it to its\n * `max-content` (base styles), so the browser accounts for padding, the sort\n * indicator and whatever the content is. One forced layout, no paint: the\n * attribute is gone before the frame ends. A column with nothing laid out\n * (the table is hidden) is left out.\n */\nexport function measureColumns(root: ParentNode, ids: Iterable<string>): Map<string, number> {\n const wanted = new Set(ids);\n const widths = new Map<string, number>();\n if (wanted.size === 0) return widths;\n const cells = [...root.querySelectorAll<HTMLElement>('[data-col]')].filter(\n (cell) =>\n wanted.has(cell.dataset.col ?? '') && !cell.parentElement?.matches('[part~=\"row-loading\"]'),\n );\n for (const cell of cells) cell.setAttribute('data-measure', '');\n for (const cell of cells) {\n const id = cell.dataset.col ?? '';\n const px = Math.ceil(cell.getBoundingClientRect().width);\n if (px > 0 && px > (widths.get(id) ?? 0)) widths.set(id, px);\n }\n for (const cell of cells) cell.removeAttribute('data-measure');\n return widths;\n}\n\n/**\n * - `provisional`: measured without loaded body rows (the header and pinned rows only).\n * - `final`: measured with loaded rows; kept until the column goes away.\n * - `fonts`: measured while web fonts were loading; measured again once they are ready.\n */\ntype State = 'provisional' | 'final' | 'fonts';\n\n/**\n * Widths of `width: 'auto'` columns. A column measures once its first loaded\n * rows render, and before that fits the header and pinned rows. So each column\n * is measured at most twice (three times if fonts were still loading), and a\n * table that stays empty doesn't measure on every update. State is keyed by\n * column id, so new `columns` arrays with the same ids don't measure again.\n */\nexport class AutoWidths {\n /** Measured widths by column id; a new object whenever one changes. */\n widths: ColumnSizingState = {};\n readonly #state = new Map<string, State>();\n #fontsPending = false;\n readonly #requestUpdate: () => void;\n\n constructor(requestUpdate: () => void) {\n this.#requestUpdate = requestUpdate;\n }\n\n /** Forgets columns that are gone or no longer `'auto'`, given the ids of the auto columns. */\n sync(ids: Iterable<string>): void {\n const auto = new Set(ids);\n for (const id of this.#state.keys()) {\n if (!auto.has(id)) this.#state.delete(id);\n }\n const kept = Object.entries(this.widths).filter(([id]) => auto.has(id));\n if (kept.length !== Object.keys(this.widths).length) this.widths = Object.fromEntries(kept);\n }\n\n /**\n * The auto columns still to be measured: never, or without loaded rows yet.\n * With `virtualizeColumns` they render out of view until they are.\n */\n pending(columns: readonly { id: string; auto: boolean }[]): string[] {\n return columns\n .filter((c) => {\n if (!c.auto) return false;\n const state = this.#state.get(c.id);\n return state === undefined || state === 'provisional';\n })\n .map((c) => c.id);\n }\n\n /**\n * Measures the auto columns that need it. Returns `true` if a width changed;\n * the caller then renders again (the one extra pass of the render cycle).\n */\n measure(\n root: ParentNode,\n columns: readonly { id: string; auto: boolean }[],\n hasLoadedRows: boolean,\n ): boolean {\n const due = columns\n .filter((c) => c.auto)\n .map((c) => c.id)\n .filter((id) => {\n const state = this.#state.get(id);\n return state === undefined || (state === 'provisional' && hasLoadedRows);\n });\n if (due.length === 0) return false;\n const measured = measureColumns(root, due);\n const fontsLoading = typeof document !== 'undefined' && document.fonts.status === 'loading';\n let next: ColumnSizingState | undefined;\n for (const [id, px] of measured) {\n this.#state.set(id, fontsLoading ? 'fonts' : hasLoadedRows ? 'final' : 'provisional');\n if (this.widths[id] !== px) (next ??= { ...this.widths })[id] = px;\n }\n if (fontsLoading && measured.size > 0) this.#remeasureAfterFonts();\n if (next) this.widths = next;\n return next !== undefined;\n }\n\n /** Once web fonts are ready, columns measured meanwhile measure again. */\n #remeasureAfterFonts(): void {\n if (this.#fontsPending) return;\n this.#fontsPending = true;\n void document.fonts.ready.then(() => {\n this.#fontsPending = false;\n let any = false;\n for (const [id, state] of this.#state) {\n if (state === 'fonts') {\n this.#state.delete(id);\n any = true;\n }\n }\n if (any) this.#requestUpdate();\n });\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { ArgusColumn, unwatchColumns, watchColumns } from '../argus-column.js';\nimport type { ColumnDef } from '../types.js';\n\n/**\n * Reads the host's `<argus-column>` children into `ColumnDef`s. The columns tell\n * the host when they change (`watchColumns`); the list is rebuilt only then, so\n * `defs` keeps its identity between changes.\n */\nexport class ColumnChildrenController<T> implements ReactiveController {\n readonly #host: ReactiveControllerHost & HTMLElement;\n #defs: readonly ColumnDef<T>[] = [];\n #dirty = true;\n\n constructor(host: ReactiveControllerHost & HTMLElement) {\n this.#host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n this.#dirty = true;\n watchColumns(this.#host, () => {\n this.#dirty = true;\n this.#host.requestUpdate();\n });\n }\n\n hostDisconnected(): void {\n unwatchColumns(this.#host);\n }\n\n /** Whether the host has any `<argus-column>` child. */\n get present(): boolean {\n return this.defs.length > 0;\n }\n\n /** The children's columns, in document order. */\n get defs(): readonly ColumnDef<T>[] {\n if (this.#dirty) {\n this.#dirty = false;\n this.#defs = [...this.#host.children]\n .filter((c): c is ArgusColumn<T> => c instanceof ArgusColumn)\n .map((c) => c.toColumnDef());\n }\n return this.#defs;\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { columnWindow, maxVisibleColumns, RowPool, type ColumnView } from '@argus-table/core';\nimport type { CellContent } from '../types.js';\n\n/** Scrolling columns rendered beyond each side of the visible ones. */\nexport const COLUMN_OVERSCAN = 2;\n\n/**\n * A rendered column: the column, the slot its cells and light-DOM content use\n * (`h-{slot}`, `c-{row}-{slot}`), the key its cells are rendered by, and with\n * `virtualizeColumns` the grid track it is placed in.\n */\nexport type RenderedColumn<T> = ColumnView<T, CellContent> & {\n slot: number;\n key: unknown;\n /** Grid column the cells are placed in; `undefined`: in DOM order. */\n place: number | undefined;\n};\n\ntype Column<T> = ColumnView<T, CellContent>;\n\n/**\n * Column virtualization (`virtualizeColumns`): which columns render, and which\n * pool slot's DOM each one uses.\n *\n * Off, every column renders in visual order, its slot is its `colIndex` and\n * its cells are keyed by column id: the DOM is what it always was.\n *\n * On, the scrolling columns in view render, plus `COLUMN_OVERSCAN` on each\n * side, and the pinned columns, the checkbox column and the columns the table\n * keeps (the active one, one being dragged, auto widths still to measure)\n * whatever the scroll position. They are pooled like rows (ADR 0001): a column\n * entering the view reuses the cells, slots and content of one that left, so\n * the DOM is updated in place, and the window has one size, so the pool fills\n * on the first render and scrolling only reuses it (in WebKit, new slots\n * while scrolling cut a wheel scroll short; see `steadyWindow`). DOM order is\n * then pool order: each cell is placed in its grid column explicitly, and\n * `aria-colindex` carries the position, as `aria-rowindex` does for rows.\n */\nexport class ColumnWindowController<T> implements ReactiveController {\n readonly #host: ReactiveControllerHost & HTMLElement;\n readonly #scroller: () => HTMLElement | null;\n readonly #pool = new RowPool();\n #attached: HTMLElement | undefined;\n #resize: ResizeObserver | undefined;\n #enabled = false;\n /** The columns of the last render, and what the window was computed from. */\n #columns: readonly Column<T>[] = [];\n #scrolling: Column<T>[] = [];\n #pinnedWidth = 0;\n #maxVisible: { columns: readonly Column<T>[]; view: number; value: number } | undefined;\n /** First index and size of the last window rendered. */\n #key = '';\n\n constructor(host: ReactiveControllerHost & HTMLElement, scroller: () => HTMLElement | null) {\n this.#host = host;\n this.#scroller = scroller;\n host.addController(this);\n }\n\n hostConnected(): void {\n this.#attach();\n }\n\n hostUpdated(): void {\n this.#attach();\n }\n\n hostDisconnected(): void {\n this.#attached?.removeEventListener('scroll', this.#onScroll);\n this.#resize?.disconnect();\n this.#attached = undefined;\n }\n\n /** Number of column pool slots created so far. */\n get poolSize(): number {\n return this.#pool.size;\n }\n\n /**\n * The columns to render, given the model's columns in visual order. With\n * `enabled`, `keep` names columns to render wherever they are. Call once per\n * render.\n */\n compute(\n columns: readonly Column<T>[],\n enabled: boolean,\n keep: Iterable<string | undefined>,\n ): RenderedColumn<T>[] {\n this.#enabled = enabled;\n if (!enabled) {\n this.#pool.clear();\n this.#key = '';\n return columns.map((c) => ({ ...c, slot: c.colIndex, key: c.id, place: undefined }));\n }\n if (columns !== this.#columns) {\n this.#columns = columns;\n this.#scrolling = columns.filter((c) => c.kind === 'data' && c.pin === undefined);\n this.#pinnedWidth = columns.reduce((sum, c) => (c.pin ? sum + c.width : sum), 0);\n }\n const wanted = new Set<string | undefined>(keep);\n const window = this.#window();\n for (const i of window) wanted.add(this.#scrolling[i]?.id);\n this.#key = keyOf(window);\n // In visual order, so the first render's slots (and DOM order) follow the columns.\n const ids: string[] = [];\n const byId = new Map<string, Column<T>>();\n for (const c of columns) {\n if (c.pin !== undefined || c.kind !== 'data' || wanted.has(c.id)) {\n ids.push(c.id);\n byId.set(c.id, c);\n }\n }\n const rendered: RenderedColumn<T>[] = [];\n for (const { id, slot } of this.#pool.update(ids)) {\n const c = byId.get(id);\n if (c) rendered.push({ ...c, slot, key: slot, place: c.colIndex });\n }\n return rendered;\n }\n\n /** The window's indexes in the scrolling columns, for the scroller as it is now. */\n #window(): number[] {\n // Before the first render there is no scroller: the host is as wide.\n const s = this.#attached ?? this.#scroller();\n const view = Math.max(0, (s ?? this.#host).clientWidth - this.#pinnedWidth);\n const columns = this.#scrolling;\n let max = this.#maxVisible;\n if (max?.columns !== this.#columns || max.view !== view) {\n max = { columns: this.#columns, view, value: maxVisibleColumns(columns, view) };\n this.#maxVisible = max;\n }\n // Negative in RTL.\n const offset = Math.abs(s?.scrollLeft ?? 0);\n return columnWindow(columns, offset, view, COLUMN_OVERSCAN, max.value);\n }\n\n #attach(): void {\n const s = this.#scroller();\n if (!s || s === this.#attached) return;\n this.#attached?.removeEventListener('scroll', this.#onScroll);\n this.#attached = s;\n s.addEventListener('scroll', this.#onScroll, { passive: true });\n this.#resize ??= new ResizeObserver(() => {\n this.#onScroll();\n });\n this.#resize.disconnect();\n this.#resize.observe(s);\n }\n\n /** Renders again when the window moves: not on every scroll event. */\n readonly #onScroll = () => {\n if (!this.#enabled) return;\n const window = this.#window();\n if (keyOf(window) !== this.#key) this.#host.requestUpdate();\n };\n}\n\nfunction keyOf(window: readonly number[]): string {\n return `${String(window[0] ?? -1)}:${String(window.length)}`;\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport {\n PageCache,\n type ColumnFilterState,\n type DataSource,\n type LoadErrorDetail,\n type RowState,\n type SortState,\n} from '@argus-table/core';\n\n/** Rows per request when the data source sets no `pageSize`. */\nexport const DEFAULT_PAGE_SIZE = 100;\n\n/** Quiet time after the last range change before pages load, so fast scrolling loads only where it stops. */\nexport const LOAD_DEBOUNCE_MS = 50;\n\nexport interface DataConfig<T> {\n source: DataSource<T> | undefined;\n sorting: SortState;\n filters: ColumnFilterState;\n quickFilter: string;\n getRowId: ((row: T, index: number) => string) | undefined;\n}\n\n/**\n * Loads `dataSource` pages for the rendered rows (infinite loading). It owns the\n * page cache: a new source, sort order, filter or row id function starts a fresh one, and\n * answers for an old cache are dropped. Requests wait until the range has been\n * quiet for `LOAD_DEBOUNCE_MS`; pages that scrolled away are aborted.\n */\nexport class DataController<T> implements ReactiveController {\n readonly #host: ReactiveControllerHost;\n #config: DataConfig<T> = {\n source: undefined,\n sorting: [],\n filters: {},\n quickFilter: '',\n getRowId: undefined,\n };\n #cache: PageCache<T> | undefined;\n readonly #requests = new Map<number, AbortController>();\n #range: { start: number; end: number } | undefined;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #errors: LoadErrorDetail[] = [];\n\n constructor(host: ReactiveControllerHost) {\n this.#host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n this.#abortAll();\n }\n\n hostConnected(): void {\n // Requests aborted on disconnect load again on the next range request.\n this.#range = undefined;\n }\n\n /** The page cache, while a data source is set: the model reads rows from it. */\n get rows(): PageCache<T> | undefined {\n return this.#cache;\n }\n\n /**\n * Takes the source, sort order, filters and row id function. Any change starts a\n * fresh cache; a sort or row id change keeps the row count (the rows are the same),\n * a new source or filter doesn't (the rows aren't).\n */\n configure(next: DataConfig<T>): void {\n const prev = this.#config;\n this.#config = next;\n if (!next.source) {\n this.#reset(undefined);\n return;\n }\n if (\n next.source !== prev.source ||\n !this.#cache ||\n next.filters !== prev.filters ||\n next.quickFilter !== prev.quickFilter\n ) {\n this.#reset({ rowCount: undefined, totalKnown: false });\n } else if (next.sorting !== prev.sorting || next.getRowId !== prev.getRowId) {\n this.#reset({ rowCount: this.#cache.rowCount, totalKnown: this.#cache.totalKnown });\n }\n }\n\n /** Drops every loaded page and loads the rendered ones again. The row count stays until pages answer. */\n refresh(): void {\n if (!this.#cache) return;\n this.#reset({ rowCount: this.#cache.rowCount, totalKnown: false });\n this.#host.requestUpdate();\n }\n\n stateAt(index: number): RowState {\n return this.#cache?.stateAt(index) ?? 'loaded';\n }\n\n /**\n * The rendered rows, `start` to `end` (exclusive). Loads what's missing once the\n * range has been quiet for a moment. Call after every update.\n */\n request(start: number, end: number): void {\n const cache = this.#cache;\n if (!cache) return;\n const prev = this.#range;\n const moved = prev?.start !== start || prev.end !== end;\n this.#range = { start, end };\n if (moved) {\n clearTimeout(this.#timer);\n } else if (this.#timer !== undefined || cache.missingPages(start, end).length === 0) {\n return;\n }\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n this.#load();\n }, LOAD_DEBOUNCE_MS);\n }\n\n /** Requests the failed page holding row `index` again (the Retry button, or Enter on a failed row). */\n retry(index: number): void {\n const cache = this.#cache;\n const page = cache?.pageOf(index);\n if (!cache || page === undefined || !cache.isFailed(page)) return;\n cache.retry(page);\n this.#range = undefined;\n this.#host.requestUpdate();\n }\n\n /** Load errors since the last call, to fire as `argus-load-error` after the update. */\n takeErrors(): LoadErrorDetail[] {\n const errors = this.#errors;\n this.#errors = [];\n return errors;\n }\n\n #reset(carry: { rowCount: number | undefined; totalKnown: boolean } | undefined): void {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n this.#abortAll();\n this.#range = undefined;\n this.#errors = [];\n const { source, getRowId } = this.#config;\n this.#cache =\n source && carry\n ? new PageCache<T>({\n pageSize: source.pageSize ?? DEFAULT_PAGE_SIZE,\n getRowId,\n rowCount: carry.rowCount,\n totalKnown: carry.totalKnown,\n })\n : undefined;\n }\n\n #abortAll(): void {\n for (const [page, controller] of this.#requests) {\n controller.abort();\n this.#cache?.cancel(page);\n }\n this.#requests.clear();\n }\n\n #load(): void {\n const cache = this.#cache;\n const range = this.#range;\n if (!cache || !range) return;\n // Keep a page of margin, so a small scroll back doesn't abort a page about to land.\n const margin = cache.pageSize;\n for (const page of cache.inFlightOutside(range.start - margin, range.end + margin)) {\n this.#requests.get(page)?.abort();\n this.#requests.delete(page);\n cache.cancel(page);\n }\n cache.evictOutside(range.start, range.end);\n for (const page of cache.missingPages(range.start, range.end)) this.#fetch(cache, page);\n }\n\n #fetch(cache: PageCache<T>, page: number): void {\n const source = this.#config.source;\n if (!source) return;\n const { start, end } = cache.begin(page);\n const controller = new AbortController();\n this.#requests.set(page, controller);\n const current = () => !controller.signal.aborted && cache === this.#cache;\n let pending: Promise<unknown>;\n try {\n pending = Promise.resolve(\n source.getRows({\n start,\n end,\n sorting: this.#config.sorting,\n filters: this.#config.filters,\n quickFilter: this.#config.quickFilter,\n signal: controller.signal,\n }),\n );\n } catch (error) {\n pending = Promise.reject(error instanceof Error ? error : new Error(String(error)));\n }\n pending\n .then((response) => {\n if (!current()) return;\n const { rows, total } = (response ?? {}) as { rows?: unknown; total?: unknown };\n if (!Array.isArray(rows)) {\n throw new TypeError('argus-table: getRows() must resolve to { rows: [], total? }.');\n }\n this.#requests.delete(page);\n cache.resolve(page, rows as T[], typeof total === 'number' ? total : undefined);\n this.#host.requestUpdate();\n })\n .catch((error: unknown) => {\n if (!current()) return;\n this.#requests.delete(page);\n cache.fail(page);\n this.#errors.push({ error, start, end });\n this.#host.requestUpdate();\n });\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\n/** How long after the last sideways scroll pinned cells stay sticky. */\nconst SETTLE_MS = 150;\n\n/**\n * Keeps pinned body cells in place without making them sticky while the table\n * only scrolls up and down.\n *\n * Safari gives every sticky element a compositing layer of its own and moves\n * each one on every scroll frame; with a sticky cell per pinned column per row\n * that is dozens of layers, and vertical scrolling stutters (ADR 0001, \"Pinned\n * columns in Safari\"). At rest, pinned body cells are plain cells shifted by the\n * horizontal scroll offset (`--_sx`, and `--_max-x` for the end side), which\n * only changes when the table scrolls sideways. While it does, the scroller\n * carries `data-hscroll` and the cells are sticky, so they don't lag behind\n * the scroll; once it settles they go back to the transform, at the same place.\n * It also sizes the pinned edges' shadow overlays (`.pin-shadow`) to the\n * scroller's visible area.\n */\nexport class PinScrollController implements ReactiveController {\n readonly #scroller: () => HTMLElement | null;\n #attached: HTMLElement | undefined;\n #left = 0;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #resize: ResizeObserver | undefined;\n\n constructor(host: ReactiveControllerHost, scroller: () => HTMLElement | null) {\n this.#scroller = scroller;\n host.addController(this);\n }\n\n hostConnected(): void {\n // After a move in the DOM; before the first render there is no scroller yet.\n this.#attach();\n }\n\n hostUpdated(): void {\n this.#attach();\n }\n\n hostDisconnected(): void {\n this.#attached?.removeEventListener('scroll', this.#onScroll);\n this.#resize?.disconnect();\n clearTimeout(this.#timer);\n this.#attached = undefined;\n }\n\n /** Re-reads how far the table scrolls sideways: call when column widths change. */\n measure(): void {\n const s = this.#attached;\n if (!s) return;\n s.style.setProperty('--_max-x', `${String(Math.max(0, s.scrollWidth - s.clientWidth))}px`);\n // The edge shadows sit over the scroller, clear of its scrollbars.\n for (const shadow of s.parentNode?.querySelectorAll<HTMLElement>(':scope > .pin-shadow') ??\n []) {\n shadow.style.setProperty('--_view-h', `${String(s.clientHeight)}px`);\n shadow.style.setProperty('--_sb-x', `${String(s.offsetWidth - s.clientWidth)}px`);\n }\n this.#left = s.scrollLeft;\n s.style.setProperty('--_sx', `${String(this.#left)}px`);\n }\n\n #attach(): void {\n const s = this.#scroller();\n if (!s || s === this.#attached) return;\n this.#attached = s;\n s.addEventListener('scroll', this.#onScroll, { passive: true });\n this.#resize ??= new ResizeObserver(() => {\n this.measure();\n });\n this.#resize.observe(s);\n this.measure();\n }\n\n readonly #onScroll = () => {\n const s = this.#attached;\n if (!s || s.scrollLeft === this.#left) return;\n this.#left = s.scrollLeft;\n s.toggleAttribute('data-hscroll', true);\n clearTimeout(this.#timer);\n this.#timer = setTimeout(() => {\n this.measure();\n s.removeAttribute('data-hscroll');\n }, SETTLE_MS);\n };\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { ArgusPlugin, CellTarget, PluginHost } from '../plugins.js';\nimport type { ColumnDef } from '../types.js';\n\ntype Hook = 'connect' | 'cleanup' | 'columns' | 'keydown';\n\n/**\n * Runs the table's plugins: connects them while the table is connected (in\n * array order, cleaning up in reverse), chains their column transforms, and\n * offers keys to them before the table handles them. A hook that throws is\n * reported and skipped, so a broken plugin can't break the update.\n */\nexport class PluginController<T> implements ReactiveController {\n readonly #host: ReactiveControllerHost & HTMLElement;\n readonly #api: PluginHost<T>;\n #plugins: readonly ArgusPlugin<T>[] = [];\n /** Connected plugins and their cleanups. */\n readonly #connected = new Map<ArgusPlugin<T>, (() => void) | undefined>();\n /** Plugins whose `connect` threw: off until `plugins` changes. */\n readonly #failed = new Set<ArgusPlugin<T>>();\n #version = 0;\n #memo:\n | {\n input: readonly ColumnDef<T>[];\n plugins: readonly ArgusPlugin<T>[];\n version: number;\n output: readonly ColumnDef<T>[];\n }\n | undefined;\n\n constructor(host: ReactiveControllerHost & HTMLElement, api: PluginHost<T>) {\n this.#host = host;\n this.#api = api;\n host.addController(this);\n }\n\n /** Takes a new plugin list; connects and cleans up to match it if the host is connected. */\n set(plugins: readonly ArgusPlugin<T>[]): void {\n if (plugins === this.#plugins) return;\n this.#plugins = plugins;\n this.#failed.clear();\n if (this.#host.isConnected) this.#sync();\n }\n\n hostConnected(): void {\n this.#sync();\n }\n\n hostDisconnected(): void {\n for (const plugin of [...this.#connected.keys()].reverse()) this.#disconnect(plugin);\n }\n\n /** The plugins' `columns` transforms applied in order; the same array while nothing changed. */\n transform(input: readonly ColumnDef<T>[]): readonly ColumnDef<T>[] {\n const memo = this.#memo;\n if (memo?.input === input && memo.plugins === this.#plugins && memo.version === this.#version) {\n return memo.output;\n }\n let output = input;\n for (const plugin of this.#plugins) {\n if (!plugin.columns || this.#failed.has(plugin)) continue;\n const before = output;\n const result = this.#guard(plugin, 'columns', () => plugin.columns?.(before, this.#api));\n if (result.ok && result.value) output = result.value;\n }\n // Plugins may return a fresh array each time: keep the old one when its items are the same.\n if (memo && sameItems(memo.output, output)) output = memo.output;\n this.#memo = { input, plugins: this.#plugins, version: this.#version, output };\n return output;\n }\n\n /** Runs the transforms again on the next `transform()`. */\n invalidate(): void {\n this.#version++;\n }\n\n /** Offers a key to the plugins in order; `true` once one claims it. */\n keydown(event: KeyboardEvent, target: CellTarget): boolean {\n for (const plugin of this.#plugins) {\n if (!plugin.keydown || this.#failed.has(plugin)) continue;\n const result = this.#guard(plugin, 'keydown', () =>\n plugin.keydown?.(event, target, this.#api),\n );\n if (result.ok && result.value === true) return true;\n }\n return false;\n }\n\n #sync(): void {\n const wanted = new Set(this.#plugins);\n for (const plugin of [...this.#connected.keys()].reverse()) {\n if (!wanted.has(plugin)) this.#disconnect(plugin);\n }\n for (const plugin of this.#plugins) {\n if (this.#connected.has(plugin) || this.#failed.has(plugin)) continue;\n const result = this.#guard(plugin, 'connect', () => plugin.connect?.(this.#api));\n if (result.ok) this.#connected.set(plugin, result.value);\n else this.#failed.add(plugin);\n }\n }\n\n #disconnect(plugin: ArgusPlugin<T>): void {\n const cleanup = this.#connected.get(plugin);\n this.#connected.delete(plugin);\n if (cleanup) this.#guard(plugin, 'cleanup', cleanup);\n }\n\n #guard<R>(\n plugin: ArgusPlugin<T>,\n hook: Hook,\n run: () => R,\n ): { ok: true; value: R } | { ok: false } {\n try {\n return { ok: true, value: run() };\n } catch (error) {\n console.error(`argus-table: plugin \"${plugin.name}\" threw in ${hook}`, error);\n return { ok: false };\n }\n }\n}\n\n/** Whether two lists hold the same items in the same order. */\nexport function sameItems<V>(a: readonly V[], b: readonly V[]): boolean {\n return a.length === b.length && a.every((item, i) => item === b[i]);\n}\n","import type { ReactiveControllerHost } from 'lit';\n\n/** The heights of the pinned row groups, in px. */\nexport interface PinnedHeights {\n top: number;\n bottom: number;\n}\n\nexport interface RowMeasureOptions {\n /** A body row element's index in the row order; `undefined` to leave it out (a row still loading). */\n bodyIndex: (row: Element) => number | undefined;\n /** The height the virtualizer has for a body row now. */\n sizeOf: (index: number) => number;\n /** The least a row is (the row height). */\n minimum: () => number;\n}\n\n/**\n * Rows of different heights (`rowHeight: 'auto'`): reads the heights of the\n * rendered body rows and of the pinned row groups once their content has\n * rendered, and watches them for changes the table doesn't render (an image\n * loading, a web font, a framework component updating), which request an\n * update that reads them again. Pooled rows show other rows as the body\n * scrolls, so every update reads every rendered row: one that now shows a row\n * of the same height doesn't resize, and the observer wouldn't report it.\n */\nexport class RowMeasure {\n readonly #host: ReactiveControllerHost;\n readonly #options: RowMeasureOptions;\n #observer: ResizeObserver | undefined;\n readonly #observed = new Set<Element>();\n #pinned: PinnedHeights = { top: 0, bottom: 0 };\n /** The row each body row element showed when it was last read. */\n #read = new WeakMap<Element, number>();\n /** Read every row next time, not only those that show another row now. */\n #all = true;\n\n constructor(host: ReactiveControllerHost, options: RowMeasureOptions) {\n this.#host = host;\n this.#options = options;\n }\n\n /** The pinned groups' heights from the last `read()`. */\n get pinned(): PinnedHeights {\n return this.#pinned;\n }\n\n /**\n * The next `read()` reads every row: their content may have changed size\n * (new data or columns, a resize, content that grew).\n */\n invalidate(): void {\n this.#all = true;\n }\n\n /**\n * Reads the rows in `root` (the shadow root): the body rows' heights as\n * `[index, px]`, and whether the pinned groups changed height. Scrolling,\n * only the pooled rows that now show another row are read.\n */\n read(root: ParentNode): { rows: [number, number][]; pinnedChanged: boolean } {\n const observer = (this.#observer ??= new ResizeObserver(this.#onResize));\n for (const element of this.#observed) {\n if (!element.isConnected) {\n observer.unobserve(element);\n this.#observed.delete(element);\n }\n }\n const rows: [number, number][] = [];\n const due: [Element, number][] = [];\n for (const row of root.querySelectorAll('[part~=\"body\"] > .row')) {\n this.#observe(row);\n const index = this.#options.bodyIndex(row);\n if (index === undefined) {\n this.#read.delete(row);\n } else if (this.#all || this.#read.get(row) !== index) {\n due.push([row, index]);\n }\n }\n this.#all = false;\n // Body rows render at least their measured height (on the px grid): drop it\n // for one synchronous read, so rows can shrink too. Never painted.\n for (const [row] of due) row.setAttribute('data-measure-row', '');\n for (const [row, index] of due) {\n rows.push([index, row.getBoundingClientRect().height]);\n this.#read.set(row, index);\n }\n for (const [row] of due) row.removeAttribute('data-measure-row');\n const group = (side: 'top' | 'bottom') => {\n const element = root.querySelector(`.pinned[data-side=\"${side}\"]`);\n if (element) this.#observe(element);\n return element ? element.getBoundingClientRect().height : 0;\n };\n const pinned = { top: group('top'), bottom: group('bottom') };\n const pinnedChanged =\n Math.abs(pinned.top - this.#pinned.top) > 0.01 ||\n Math.abs(pinned.bottom - this.#pinned.bottom) > 0.01;\n if (pinnedChanged) this.#pinned = pinned;\n return { rows, pinnedChanged };\n }\n\n /** Stops watching (fixed row heights again, or the table left the page). */\n stop(): void {\n this.#observer?.disconnect();\n this.#observed.clear();\n this.#pinned = { top: 0, bottom: 0 };\n this.#all = true;\n }\n\n #observe(element: Element): void {\n if (this.#observed.has(element)) return;\n this.#observed.add(element);\n this.#observer?.observe(element);\n }\n\n /** Requests an update only for a height the table doesn't have yet. */\n readonly #onResize = (entries: ResizeObserverEntry[]) => {\n const { bodyIndex, sizeOf, minimum } = this.#options;\n for (const entry of entries) {\n const target = entry.target;\n if (!target.isConnected) continue;\n const px = entry.borderBoxSize[0]?.blockSize ?? target.getBoundingClientRect().height;\n let known: number | undefined;\n if (target.classList.contains('pinned')) {\n known = target.getAttribute('data-side') === 'top' ? this.#pinned.top : this.#pinned.bottom;\n } else {\n const index = bodyIndex(target);\n if (index === undefined) continue;\n known = sizeOf(index);\n // Rows render at least their known height: only growing shows here.\n if (px < minimum() || px <= known + 0.01) continue;\n }\n if (Math.abs(px - known) > 0.01) {\n this.#all = true;\n this.#host.requestUpdate();\n return;\n }\n }\n };\n}\n","/**\n * Interactive content a page may put in a header or cell. A press on it belongs\n * to that content: it doesn't sort, start a column drag or select a row. A\n * popover or a dialog (a menu or an editor a plugin opens from a header) counts\n * as a whole, padding included.\n */\nexport const INTERACTIVE =\n 'button,input,select,textarea,a[href],label,[contenteditable],[popover],dialog';\n\n/**\n * Whether an event path reaches interactive content before `stop` (the cell or\n * row the table handles the event for).\n */\nexport function fromInteractive(path: readonly EventTarget[], stop: Element): boolean {\n for (const target of path) {\n if (target === stop) return false;\n if (target instanceof Element && target.matches(INTERACTIVE)) return true;\n }\n return false;\n}\n","import { INTERACTIVE } from '../interactive.js';\n\n/** Where a dragged column would land: its new position and the header that shows the drop line. */\nexport interface DropTarget {\n /** Position in the whole column order after the move, 0-based. */\n to: number;\n /** The header that draws the drop line. */\n columnId: string;\n /** The edge of that header the line is on, in logical terms. */\n edge: 'start' | 'end';\n}\n\n/** A header of the dragged column's group, in visual order. */\nexport interface DropSlot {\n id: string;\n /** Its position in the whole column order, 0-based. */\n index: number;\n rect: { left: number; right: number };\n}\n\n/**\n * The drop target for a pointer at `x`: the gap between headers nearest to it,\n * decided by each header's midpoint. `undefined` where the column would stay\n * put. `direction` is 1 in LTR and -1 in RTL, where the group runs right to left.\n * The slots needn't be next to each other in the order: with\n * `virtualizeColumns`, headers out of view aren't rendered.\n */\nexport function dropTarget(\n slots: readonly DropSlot[],\n draggedId: string,\n x: number,\n direction: 1 | -1,\n): DropTarget | undefined {\n const dragged = slots.find((s) => s.id === draggedId);\n const last = slots.at(-1);\n if (!dragged || !last) return undefined;\n // The gap before the first header whose middle is past the pointer, in reading order.\n const at = slots.find((s) => (x - (s.rect.left + s.rect.right) / 2) * direction < 0);\n // Taking the column out shifts the ones after it one place back.\n const to = at\n ? at.index > dragged.index\n ? at.index - 1\n : at.index\n : last.index >= dragged.index\n ? last.index\n : last.index + 1;\n if (to === dragged.index) return undefined;\n return at ? { to, columnId: at.id, edge: 'start' } : { to, columnId: last.id, edge: 'end' };\n}\n\nexport interface ReorderDragOptions {\n /** The scroll container: it scrolls while the pointer is near its edges. */\n scroller: HTMLElement;\n /** The drop target for a pointer at `x` (client coordinates). */\n targetAt: (x: number) => DropTarget | undefined;\n /**\n * Where the dragged column's group is visible, in client x, if it can scroll\n * (the scrolling columns). Near these edges the scroller scrolls with the drag.\n */\n scrollArea: () => { left: number; right: number } | undefined;\n onStart: () => void;\n /** The target changed (`undefined`: the column would stay put). */\n onTarget: (target: DropTarget | undefined) => void;\n /** The pointer was released over a target, or `undefined` when it would stay put. */\n onDrop: (target: DropTarget | undefined) => void;\n /** Escape, a cancelled pointer, or a release without a drag. */\n onCancel: () => void;\n}\n\n/** Movement before a press becomes a drag, so a click still sorts. */\nconst THRESHOLD = 4;\n/** Width of the band at the scroll area's edges that scrolls, and the top speed there. */\nconst EDGE = 40;\nconst MAX_SPEED = 16;\n\n/**\n * Whether a press on a header may start a reorder drag: the primary button of a\n * mouse or pen (a touch pans the table instead), not on a resize handle, and not\n * in interactive content slotted into the header.\n */\nexport function canStartReorder(down: PointerEvent, cell: HTMLElement): boolean {\n if (down.button !== 0 || down.pointerType === 'touch') return false;\n for (const target of down.composedPath()) {\n if (target === cell) return true;\n if (!(target instanceof Element)) continue;\n if (target instanceof HTMLElement && target.dataset.resizeCol !== undefined) return false;\n if (target.matches(INTERACTIVE)) return false;\n }\n return false;\n}\n\n/**\n * One pointer drag of a column header. It becomes a drag after a few pixels of\n * movement; until then the press is a click. While dragging, the pointer is\n * captured by the header, the target follows the pointer once per frame, and the\n * scroll area scrolls near its edges. Escape cancels. The click that ends a drag\n * is swallowed, so it neither sorts nor counts as a cell click.\n */\nexport function startReorderDrag(\n cell: HTMLElement,\n down: PointerEvent,\n options: ReorderDragOptions,\n): void {\n const view = cell.ownerDocument.defaultView ?? window;\n const startX = down.clientX;\n const startY = down.clientY;\n let x = startX;\n let dragging = false;\n let frame = 0;\n let target: DropTarget | undefined;\n\n const same = (a: DropTarget | undefined, b: DropTarget | undefined) =>\n a?.to === b?.to && a?.columnId === b?.columnId && a?.edge === b?.edge;\n\n const tick = () => {\n frame = 0;\n if (!dragging) return;\n const area = options.scrollArea();\n if (area) {\n const speed =\n x < area.left + EDGE\n ? -Math.min(1, (area.left + EDGE - x) / EDGE)\n : x > area.right - EDGE\n ? Math.min(1, (x - (area.right - EDGE)) / EDGE)\n : 0;\n // A visual delta: scrollLeft runs the same way in LTR and RTL.\n if (speed !== 0) options.scroller.scrollLeft += Math.round(speed * MAX_SPEED);\n // Targets past the visible part would be hidden under pinned columns.\n x = Math.min(Math.max(x, area.left), area.right);\n }\n const next = options.targetAt(x);\n if (!same(next, target)) {\n target = next;\n options.onTarget(target);\n }\n // Keep running while dragging: the view may still be scrolling.\n frame = view.requestAnimationFrame(tick);\n };\n\n const listeners = new AbortController();\n const cleanup = (event?: PointerEvent) => {\n if (frame) view.cancelAnimationFrame(frame);\n frame = 0;\n listeners.abort();\n if (event && cell.hasPointerCapture(event.pointerId)) {\n cell.releasePointerCapture(event.pointerId);\n }\n };\n\n const move = (event: PointerEvent) => {\n if (event.pointerId !== down.pointerId) return;\n x = event.clientX;\n if (!dragging) {\n if (Math.hypot(x - startX, event.clientY - startY) < THRESHOLD) return;\n dragging = true;\n try {\n cell.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic pointers can't be captured; the window listeners still see the moves.\n }\n options.onStart();\n }\n // No text selection while dragging.\n event.preventDefault();\n frame ||= view.requestAnimationFrame(tick);\n };\n\n const up = (event: PointerEvent) => {\n if (event.pointerId !== down.pointerId) return;\n cleanup(event);\n if (!dragging) return;\n x = event.clientX;\n const area = options.scrollArea();\n if (area) x = Math.min(Math.max(x, area.left), area.right);\n swallowClick(view);\n options.onDrop(options.targetAt(x));\n };\n\n const cancel = (event: PointerEvent) => {\n if (event.pointerId !== down.pointerId) return;\n cleanup(event);\n if (dragging) options.onCancel();\n };\n\n const key = (event: KeyboardEvent) => {\n if (!dragging || event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n cleanup();\n // The pointer is still down: its release must not count as a click.\n swallowClick(view, false);\n options.onCancel();\n };\n\n const listen = { capture: true, signal: listeners.signal };\n view.addEventListener('pointermove', move, listen);\n view.addEventListener('pointerup', up, listen);\n view.addEventListener('pointercancel', cancel, listen);\n view.addEventListener('keydown', key, listen);\n}\n\n/**\n * Stops the click that follows the release of a drag, if one comes. It comes in\n * the same task as the release, so the guard goes once that task is over. After\n * Escape the pointer is still down (`released: false`): the guard waits for its release.\n */\nfunction swallowClick(view: Window, released = true): void {\n const stop = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n const remove = () => {\n setTimeout(() => {\n view.removeEventListener('click', stop, { capture: true });\n });\n };\n view.addEventListener('click', stop, { capture: true, once: true });\n if (released) remove();\n else view.addEventListener('pointerup', remove, { capture: true, once: true });\n}\n","/**\n * One pointer drag on a resize handle. The pointer is captured, so the drag keeps\n * working outside the handle, and moves are batched to one `onWidth` call per\n * animation frame (TanStack's `onChange` mode: the width updates while dragging).\n *\n * `direction` is 1 in LTR and -1 in RTL: the handle sits on the inline-end edge,\n * so moving toward the inline end always grows the column.\n */\nexport function startResizeDrag(\n handle: HTMLElement,\n down: PointerEvent,\n startWidth: number,\n direction: 1 | -1,\n onWidth: (width: number) => void,\n): void {\n const startX = down.clientX;\n let frame = 0;\n let pending: number | undefined;\n\n const flush = () => {\n frame = 0;\n if (pending !== undefined) onWidth(pending);\n pending = undefined;\n };\n // A press and release without moving (or the clicks of a double-click) changes nothing.\n let moved = false;\n const move = (event: PointerEvent) => {\n moved ||= event.clientX !== startX;\n if (!moved) return;\n pending = startWidth + (event.clientX - startX) * direction;\n frame ||= requestAnimationFrame(flush);\n };\n const end = (event: PointerEvent) => {\n if (event.type === 'pointerup') move(event);\n if (frame) cancelAnimationFrame(frame);\n flush();\n handle.removeAttribute('data-active');\n handle.removeEventListener('pointermove', move);\n handle.removeEventListener('pointerup', end);\n handle.removeEventListener('pointercancel', end);\n if (handle.hasPointerCapture(event.pointerId)) handle.releasePointerCapture(event.pointerId);\n };\n\n down.preventDefault();\n try {\n handle.setPointerCapture(down.pointerId);\n } catch {\n // Synthetic or already released pointers can't be captured; moves on the handle still work.\n }\n handle.setAttribute('data-active', '');\n handle.addEventListener('pointermove', move);\n handle.addEventListener('pointerup', end);\n handle.addEventListener('pointercancel', end);\n}\n","import { createTableModel, type TableModel, type TableModelOptions } from '@argus-table/core';\nimport type { CellContent } from '../types.js';\n\n/**\n * Owns the table model (core's TanStack adapter). The element pushes its\n * properties in from `willUpdate`; render functions read `model`. It needs no\n * lifecycle hooks yet: the model is pull-based and owns no state.\n */\nexport class TableController<T> {\n readonly model: TableModel<T, CellContent>;\n\n constructor() {\n this.model = createTableModel<T, CellContent>({\n columns: [],\n data: [],\n getRowId: undefined,\n sorting: [],\n columnSizing: {},\n columnOrder: [],\n });\n }\n\n update(options: Partial<TableModelOptions<T, CellContent>>): void {\n this.model.update(options);\n }\n}\n","function getMeasurementKey(item) {\n return typeof item === \"object\" ? item.key : item;\n}\nfunction createLazyMeasurementsView(cache, flat) {\n const count = cache.length;\n return new Proxy(cache, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\") {\n const c = prop.charCodeAt(0);\n if (c >= 48 && c <= 57) {\n const i = +prop;\n if (Number.isInteger(i) && i >= 0 && i < count) {\n let v = target[i];\n if (typeof v !== \"object\") {\n const s = flat[i * 2];\n v = target[i] = {\n index: i,\n key: v,\n start: s,\n size: flat[i * 2 + 1],\n end: s + flat[i * 2 + 1],\n lane: 0\n };\n }\n return v;\n }\n }\n if (prop === \"length\") return count;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nexport {\n createLazyMeasurementsView,\n getMeasurementKey\n};\n//# sourceMappingURL=lazy-measurements.js.map\n","function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n let isInitial = true;\n function memoizedFunction() {\n var _a;\n const debugEnabled = process.env.NODE_ENV !== \"production\" && !!opts.key && !!((_a = opts.debug) == null ? void 0 : _a.call(opts));\n let depTime = 0;\n if (debugEnabled) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime = 0;\n if (debugEnabled) resultTime = Date.now();\n result = fn(...newDeps);\n if (debugEnabled) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result);\n }\n isInitial = false;\n return result;\n }\n memoizedFunction.updateDeps = (newDeps) => {\n deps = newDeps;\n };\n return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return Object.assign(\n function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n },\n {\n // The handle is closure-local, so a caller that has already\n // unsubscribed has no way to stop a queued call. Teardown paths use\n // this to drop the pending invocation instead of letting it land.\n cancel: () => {\n targetWindow.clearTimeout(timeoutId);\n }\n }\n );\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { approxEqual } from \"./utils.js\";\nfunction classifyScrollEvent({\n offset,\n isScrolling,\n elementMax,\n holdOffset,\n scrollOffset,\n pendingWrite,\n clampedMaxAtWrite\n}) {\n var _a;\n if (isScrolling && pendingWrite === null && offset === scrollOffset) {\n return \"spurious\";\n }\n if (pendingWrite !== null && Math.abs(offset - pendingWrite.target) < 1.5) {\n return \"readBack\";\n }\n if (pendingWrite !== null && !pendingWrite.smooth && elementMax !== null && pendingWrite.target > elementMax + holdOffset + 0.5 && Math.abs(offset - (elementMax + holdOffset)) < 1.5) {\n return \"clampedReadBack\";\n }\n if (pendingWrite !== null && !pendingWrite.smooth && ((_a = pendingWrite.lowMaxes) == null ? void 0 : _a.some((max) => Math.abs(offset - max) < 1.5))) {\n return \"clampedReadBack\";\n }\n if (clampedMaxAtWrite !== null && Math.abs(offset - clampedMaxAtWrite) < 1.5) {\n return \"clampedEcho\";\n }\n return \"external\";\n}\nconst isAnimating = (phase) => phase === \"smooth\" || phase === \"smoothFinishing\";\nfunction externalRetiresCommand({\n kind,\n offset,\n command,\n target\n}) {\n return kind !== \"spurious\" && kind !== \"readBack\" && // Our own write, clamped (`clampedReadBack`, #1310): the command is not\n // retired by it, and reconcile retargets below the new max.\n kind !== \"clampedReadBack\" && (command == null ? void 0 : command.index) != null && // Nothing has been written for a command waiting for the tail; these\n // are the fling's events.\n command.phase !== \"queued\" && // A non-smooth write lands at once, so any other scroll event is the\n // user's, even before reconcile saw the target reached (the target may\n // keep moving, or iOS ignored the write under a finger). A write the\n // browser clamped because the sizer hasn't grown yet reads back at the\n // max, which is also where the fresh target clamps, so the check below\n // keeps it reconciling (#1294). While a smooth scroll's animation may\n // still report, its events look like a user's, so it yields only once it\n // has landed.\n !isAnimating(command.phase) && !approxEqual(offset, command.lastTargetOffset) && !approxEqual(offset, target()) && // A compensation write's clamped echo (#1258) keeps the command. The\n // order is deliberate, not tidiness: this clause stays after `target()`\n // (and `clampedReadBack` before it) because `target()` can rebuild the\n // measurements, so it must run for exactly the events it always did.\n kind !== \"clampedEcho\";\n}\nconst FLING_WINDOW_MS = 40;\nfunction flingSpedUp(samples) {\n const last = samples[samples.length - 1];\n if (last === void 0) return false;\n let j = samples.length - 2;\n while (j >= 0 && last.t - samples[j].t < FLING_WINDOW_MS) j--;\n if (j < 0) return false;\n const mid = samples[j];\n let k = j - 1;\n while (k >= 0 && mid.t - samples[k].t < FLING_WINDOW_MS) k--;\n if (k < 0) return false;\n const first = samples[k];\n const recent = (last.offset - mid.offset) / (last.t - mid.t);\n const before = (mid.offset - first.offset) / (mid.t - first.t);\n return recent * before >= 0 && Math.abs(recent) >= 2 * Math.abs(before) && Math.abs(recent) - Math.abs(before) >= 0.8;\n}\nfunction flingCaught(samples) {\n const last = samples[samples.length - 1];\n if (last === void 0) return false;\n let j = samples.length - 2;\n while (j >= 0 && last.t - samples[j].t < FLING_WINDOW_MS) j--;\n if (j < 0) return false;\n const from = samples[j];\n return Math.abs(last.offset - from.offset) / (last.t - from.t) >= 0.05;\n}\nexport {\n classifyScrollEvent,\n externalRetiresCommand,\n flingCaught,\n flingSpedUp\n};\n//# sourceMappingURL=scroll-classifier.js.map\n","let _isIOSResult;\nconst isIOSWebKit = () => {\n if (_isIOSResult !== void 0) return _isIOSResult;\n if (typeof navigator === \"undefined\") return _isIOSResult = false;\n if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;\n const mtp = navigator.maxTouchPoints;\n return _isIOSResult = navigator.platform === \"MacIntel\" && mtp !== void 0 && mtp > 0;\n};\nlet _iosMomentumOverridesWritesResult;\nconst iosMomentumOverridesWrites = () => {\n if (_iosMomentumOverridesWritesResult !== void 0) {\n return _iosMomentumOverridesWritesResult;\n }\n return _iosMomentumOverridesWritesResult = isIOSWebKit() && typeof CSS !== \"undefined\" && typeof CSS.supports === \"function\" && CSS.supports(\"overflow-anchor: auto\");\n};\nconst momentumOverridesWrites = () => !isIOSWebKit() || iosMomentumOverridesWrites();\nconst _resetIOSDetectionForTests = () => {\n _isIOSResult = void 0;\n _iosMomentumOverridesWritesResult = void 0;\n};\nconst touchListenerOptions = {\n capture: true,\n passive: true\n};\nclass IosGesture {\n constructor(host) {\n this.host = host;\n this._touch = null;\n this.inMotion = () => this._touch !== null && this._touch.phase !== \"lateFling\";\n this.dragging = () => {\n var _a;\n return ((_a = this._touch) == null ? void 0 : _a.phase) === \"down\" && this._touch.moved;\n };\n this.tail = () => {\n var _a;\n return ((_a = this._touch) == null ? void 0 : _a.phase) === \"tail\" ? this._touch.moved ? \"fling\" : \"tap\" : null;\n };\n this.onScroll = ({\n isScrolling,\n ownReadBack,\n moved,\n external\n }) => {\n var _a, _b, _c;\n if (isScrolling && ((_a = this._touch) == null ? void 0 : _a.phase) === \"tail\") {\n this._openTail(this._touch.moved || !ownReadBack, false);\n } else if (((_b = this._touch) == null ? void 0 : _b.phase) === \"lateFling\") {\n if (this.host.now() > this._touch.until) {\n this._touch = null;\n } else if (external && isScrolling && moved) {\n this._openTail(true, false);\n }\n }\n if (!ownReadBack && isScrolling && moved && ((_c = this._touch) == null ? void 0 : _c.phase) === \"down\") {\n this._touch.moved = true;\n return true;\n }\n return false;\n };\n this.touchStart = () => {\n this.end();\n this._touch = { phase: \"down\", moved: false };\n };\n this.touchEnd = () => {\n var _a;\n const moved = ((_a = this._touch) == null ? void 0 : _a.phase) === \"down\" && this._touch.moved;\n this.end();\n this._openTail(moved, moved);\n };\n this.end = () => {\n var _a;\n const win = this.host.getWindow();\n if (((_a = this._touch) == null ? void 0 : _a.phase) === \"tail\" && win != null) {\n win.clearTimeout(this._touch.timerId);\n }\n this._touch = null;\n };\n this.listen = (target) => {\n const onTouchStart = () => this.touchStart();\n const onTouchEnd = () => this.touchEnd();\n target.addEventListener(\"touchstart\", onTouchStart, touchListenerOptions);\n target.addEventListener(\"touchend\", onTouchEnd, touchListenerOptions);\n target.addEventListener(\"touchcancel\", onTouchEnd, touchListenerOptions);\n return () => {\n target.removeEventListener(\n \"touchstart\",\n onTouchStart,\n touchListenerOptions\n );\n target.removeEventListener(\"touchend\", onTouchEnd, touchListenerOptions);\n target.removeEventListener(\n \"touchcancel\",\n onTouchEnd,\n touchListenerOptions\n );\n this.end();\n };\n };\n this._openTail = (moved, awaitingFling) => {\n const win = this.host.getWindow();\n if (win == null) return;\n this.end();\n const tail = {\n phase: \"tail\",\n moved,\n awaitingFling,\n // Only fires while this tail is current: `end` clears it otherwise.\n timerId: win.setTimeout(() => {\n if (this.host.tailStillMoving()) {\n this._openTail(tail.moved, tail.awaitingFling);\n return;\n }\n this._touch = tail.awaitingFling ? { phase: \"lateFling\", until: this.host.now() + 1e3 } : null;\n this.host.onTailClosed();\n }, 150)\n };\n this._touch = tail;\n };\n }\n get touch() {\n return this._touch;\n }\n}\nexport {\n IosGesture,\n _resetIOSDetectionForTests,\n iosMomentumOverridesWrites,\n isIOSWebKit,\n momentumOverridesWrites\n};\n//# sourceMappingURL=ios-gesture.js.map\n","import { createLazyMeasurementsView, getMeasurementKey } from \"./lazy-measurements.js\";\nimport { memo, approxEqual, notUndefined, debounce } from \"./utils.js\";\nimport { flingCaught, externalRetiresCommand, flingSpedUp, classifyScrollEvent } from \"./scroll-classifier.js\";\nimport { IosGesture, isIOSWebKit, momentumOverridesWrites } from \"./ios-gesture.js\";\nimport { _resetIOSDetectionForTests } from \"./ios-gesture.js\";\nconst getRect = (element) => {\n const { clientWidth, clientHeight } = element;\n return { width: clientWidth, height: clientHeight };\n};\nconst createFrameQueue = (targetWindow) => {\n const ids = /* @__PURE__ */ new Set();\n return {\n schedule: (fn) => {\n const id = targetWindow.requestAnimationFrame(() => {\n ids.delete(id);\n fn();\n });\n ids.add(id);\n },\n cancel: () => {\n ids.forEach((id) => targetWindow.cancelAnimationFrame(id));\n ids.clear();\n }\n };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const overscan = range.overscan * Math.max(range.lanes ?? 1, 1);\n const start = Math.max(range.startIndex - overscan, 0);\n const end = Math.min(range.endIndex + overscan, range.count - 1);\n const len = end - start + 1;\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = start + i;\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(getRect(element));\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const frames = createFrameQueue(targetWindow);\n const observer = new targetWindow.ResizeObserver(() => {\n const run = () => {\n handler(getRect(element));\n };\n instance.options.useAnimationFrameWithResizeObserver ? frames.schedule(run) : run();\n });\n observer.observe(element, { box: \"content-box\" });\n return () => {\n observer.unobserve(element);\n frames.cancel();\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeOffset = (instance, cb, readOffset) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n let offset = 0;\n const fallback = registerScrollendEvent ? null : debounce(\n targetWindow,\n () => cb(readOffset(element), false),\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = readOffset(element);\n fallback == null ? void 0 : fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n fallback == null ? void 0 : fallback.cancel();\n };\n};\nconst observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {\n const { horizontal, isRtl } = instance.options;\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n});\nconst observeWindowOffset = (instance, cb) => observeOffset(\n instance,\n cb,\n (win) => instance.options.horizontal ? win.scrollX : win.scrollY\n);\nconst measureElement = (element, entry, instance) => {\n if (instance.options.useCachedMeasurements) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n return instance.itemSizeCache.get(key) ?? instance.options.estimateSize(index);\n }\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n if (!entry) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n const cachedSize = instance.itemSizeCache.get(key);\n if (cachedSize !== void 0) {\n return cachedSize;\n }\n }\n return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst scrollWithAdjustments = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a;\n const { scrollElement, options } = instance;\n const adjustedOffset = offset + adjustments;\n const isRtlElement = options.horizontal && options.isRtl && scrollElement !== null && \"ownerDocument\" in scrollElement;\n (_a = scrollElement == null ? void 0 : scrollElement.scrollTo) == null ? void 0 : _a.call(scrollElement, {\n [options.horizontal ? \"left\" : \"top\"]: isRtlElement ? -adjustedOffset : adjustedOffset,\n behavior\n });\n};\nconst windowScroll = scrollWithAdjustments;\nconst elementScroll = scrollWithAdjustments;\nconst initialScrollPhase = (behavior, atTarget) => behavior === \"smooth\" ? atTarget ? \"smoothLanded\" : \"smooth\" : \"instant\";\nconst isSmoothScroll = (state) => (state == null ? void 0 : state.phase) === \"smooth\" || (state == null ? void 0 : state.phase) === \"smoothLanded\";\nfunction isAppendWithTrim(prevCount, nextCount, getPreviousKey, getNextKey) {\n if (nextCount === 0) return false;\n const firstKey = getNextKey(0);\n const removedKeys = /* @__PURE__ */ new Set();\n let removedCount = 0;\n while (removedCount < prevCount) {\n const key = getPreviousKey(removedCount);\n if (key === firstKey) break;\n removedKeys.add(key);\n removedCount++;\n }\n const retainedCount = prevCount - removedCount;\n if (retainedCount === 0 || retainedCount >= nextCount) return false;\n for (let i = 0; i < retainedCount; i++) {\n if (getNextKey(i) !== getPreviousKey(removedCount + i)) return false;\n }\n for (let i = retainedCount; i < nextCount; i++) {\n if (removedKeys.has(getNextKey(i))) return false;\n }\n return true;\n}\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.scrollState = null;\n this.measurementsCache = [];\n this._singleLaneMeasurements = null;\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.itemSizeCacheVersion = 0;\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.pendingMin = null;\n this.prevLanes = void 0;\n this.lanesChangedFlag = false;\n this.lanesSettling = false;\n this.pendingScrollAnchor = null;\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this._holdOffset = 0;\n this._reportedOverscroll = false;\n this._iosGesture = new IosGesture({\n getWindow: () => this.targetWindow,\n now: () => this.now(),\n // The end of a fling can move less than a pixel per scroll event, so\n // events can stop for 150ms while the fling is still running (seen on\n // an iPhone, 27.0.1). A command waiting for it would then be written\n // into the fling and overridden. The element having moved since the\n // last event means it has not ended: wait again. Not while our own\n // write has yet to report: that moved it.\n tailStillMoving: () => {\n const state = this.scrollState;\n if ((state == null ? void 0 : state.phase) !== \"queued\" || this.pendingWrite !== null) {\n return false;\n }\n const now = this._readElementOffset();\n if (now === null || this._lastElementOffset === null || Math.abs(now - this._lastElementOffset) < 1) {\n return false;\n }\n this._lastElementOffset = now;\n state.samples = [...state.samples ?? [], { t: this.now(), offset: now }];\n return true;\n },\n onTailClosed: () => {\n const state = this.scrollState;\n if ((state == null ? void 0 : state.phase) === \"queued\" && flingCaught(state.samples ?? [])) {\n this.scrollState = null;\n }\n this._flushHoldIfReady(true);\n this._writeAwaitingCommand();\n this._retryClampedAdjustment();\n }\n });\n this._lastElementOffset = null;\n this.pendingWrite = null;\n this._clampedAdjustment = null;\n this.elementsCache = /* @__PURE__ */ new Map();\n this._resizeBatch = null;\n this.now = () => {\n var _a, _b, _c;\n return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();\n };\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n let _frames = null;\n let delivering = false;\n let observeQueued = false;\n const pendingObservations = /* @__PURE__ */ new Set();\n const get = () => {\n if (_ro) {\n return _ro;\n }\n const targetWindow = this.targetWindow;\n if (!targetWindow || !targetWindow.ResizeObserver) {\n return null;\n }\n const frames = _frames = createFrameQueue(targetWindow);\n return _ro = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const batch = { sync: false };\n this._resizeBatch = batch;\n try {\n entries.forEach(measureEntry);\n } finally {\n this._resizeBatch = null;\n if (batch.notify) {\n this.notify(batch.sync);\n this._noteClampMax();\n this._flushHoldIfReady(true);\n this._retryClampedAdjustment();\n this.measureElement(null);\n }\n }\n };\n if (this.options.useAnimationFrameWithResizeObserver) {\n frames.schedule(run);\n } else {\n delivering = true;\n try {\n run();\n } finally {\n delivering = false;\n }\n }\n });\n };\n const measureEntry = (entry) => {\n const node = entry.target;\n const index = this.indexFromElement(node);\n if (!node.isConnected) {\n this.observer.unobserve(node);\n for (const [cacheKey, cachedNode] of this.elementsCache) {\n if (cachedNode === node) {\n this.elementsCache.delete(cacheKey);\n break;\n }\n }\n return;\n }\n if (!this.isIndexInRange(index)) return;\n if (this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, entry, this));\n }\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _frames == null ? void 0 : _frames.cancel();\n pendingObservations.clear();\n observeQueued = false;\n _ro = null;\n _frames = null;\n },\n observe: (target) => {\n const observer = get();\n if (!observer) return;\n if (!delivering) {\n observer.observe(target, { box: \"border-box\" });\n return;\n }\n pendingObservations.add(target);\n if (!observeQueued) {\n observeQueued = true;\n _frames == null ? void 0 : _frames.schedule(() => {\n observeQueued = false;\n pendingObservations.forEach((node) => {\n if (node.isConnected) _ro == null ? void 0 : _ro.observe(node, { box: \"border-box\" });\n });\n pendingObservations.clear();\n });\n }\n },\n unobserve: (target) => {\n var _a;\n pendingObservations.delete(target);\n (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n var _a;\n const merged = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n anchorTo: \"start\",\n followOnAppend: false,\n scrollEndThreshold: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n laneAssignmentMode: \"estimate\",\n useCachedMeasurements: false\n };\n for (const key in opts2) {\n const v = opts2[key];\n if (v !== void 0) merged[key] = v;\n }\n const prevOptions = this.options;\n let anchor = null;\n let followOnAppend = null;\n let edgeKeysChanged = false;\n if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === \"end\" && this.scrollElement !== null) {\n const prevCount = prevOptions.count;\n const nextCount = merged.count;\n const measurements = this.getMeasurements();\n const previousItems = ((_a = this._singleLaneMeasurements) == null ? void 0 : _a.items) ?? measurements;\n const getPreviousKey = (index) => getMeasurementKey(previousItems[index]);\n const prevFirstKey = prevCount > 0 ? getPreviousKey(0) : null;\n const prevLastKey = prevCount > 0 ? getPreviousKey(prevCount - 1) : null;\n const didCountChange = nextCount !== prevCount;\n const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);\n if (didEdgeKeysChange) {\n edgeKeysChanged = true;\n const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;\n if (item) {\n anchor = [item.key, this.getScrollOffset() - item.start];\n }\n const behavior = merged.followOnAppend === true ? \"auto\" : merged.followOnAppend || null;\n if (behavior && nextCount > 0 && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {\n if (nextCount > prevCount || isAppendWithTrim(\n prevCount,\n nextCount,\n getPreviousKey,\n merged.getItemKey\n )) {\n followOnAppend = behavior;\n }\n }\n }\n }\n this.options = merged;\n if (edgeKeysChanged) {\n this.pendingMin = 0;\n this.itemSizeCacheVersion++;\n }\n let anchorDelta = null;\n if (anchor && this.scrollOffset !== null && !this._awaitingCommandReadBack()) {\n const [anchorKey, anchorOffset] = anchor;\n const newMeasurements = this.getMeasurements();\n const { count, getItemKey } = this.options;\n let idx = 0;\n while (idx < count && getItemKey(idx) !== anchorKey) {\n idx++;\n }\n if (idx < count) {\n const anchorItem = newMeasurements[idx];\n if (anchorItem) {\n const newOffset = Math.max(0, anchorItem.start + anchorOffset);\n if (!followOnAppend && newOffset !== this.scrollOffset) {\n anchorDelta = newOffset - this.scrollOffset;\n this.scrollOffset = newOffset;\n }\n }\n }\n }\n if (followOnAppend) {\n this.pendingScrollAnchor = { kind: \"follow\", behavior: followOnAppend };\n } else if (anchorDelta !== null) {\n if (this._canWriteScroll()) {\n this.pendingScrollAnchor = { kind: \"anchor\", delta: anchorDelta };\n } else {\n this._holdOffset += anchorDelta;\n this._followOffsetTarget(anchorDelta);\n }\n }\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n var _a;\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n (_a = this._momentumStop) == null ? void 0 : _a.restore();\n this._momentumStop = null;\n this.isScrolling = false;\n this.scrollDirection = null;\n this._holdOffset = 0;\n this._reportedOverscroll = false;\n this._clampedAdjustment = null;\n this.pendingWrite = null;\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n var _a2, _b, _c, _d;\n const elementMax = isScrolling ? this._elementMaxScrollOffset() : null;\n const wasOverscrolled = this._reportedOverscroll;\n this._reportedOverscroll = offset < 0 || elementMax !== null && offset > elementMax + 1;\n const elementOffset = offset;\n this._lastElementOffset = elementOffset;\n offset = this._toLayoutOffset(offset);\n const kind = this._classifyScrollEvent(\n offset,\n isScrolling,\n elementMax\n );\n if (kind === \"spurious\") return;\n if (kind === \"readBack\") {\n offset = this.pendingWrite.target;\n } else if (kind === \"clampedReadBack\" && ((_a2 = this.scrollState) == null ? void 0 : _a2.index) != null && // Not `elementMax`: an adapter can report the read-back at rest.\n offset < this.getMaxScrollOffset() - 1.5) {\n this.scrollState.lastTargetOffset = offset;\n } else if (externalRetiresCommand({\n kind,\n offset,\n command: this.scrollState,\n target: () => this.getScrollStateTarget(this.scrollState)\n })) {\n this.scrollState = null;\n }\n this.pendingWrite = null;\n if (this._clampedAdjustment !== null && Math.abs(offset - this._clampedAdjustment.maxAtWrite) >= 1.5) {\n this._clampedAdjustment = null;\n }\n const prevOffset = this.getScrollOffset();\n const prevDirection = this.scrollDirection;\n this.scrollDirection = isScrolling ? prevOffset === offset ? this.scrollDirection : prevOffset < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n const queued = this.scrollState;\n if ((queued == null ? void 0 : queued.phase) === \"queued\" && kind === \"external\" && isScrolling) {\n if (wasOverscrolled || this._reportedOverscroll) {\n queued.samples = [];\n } else {\n const t = this.now();\n queued.samples = [\n ...(queued.samples ?? []).filter(\n (sample) => t - sample.t <= 200\n ),\n { t, offset: elementOffset }\n ];\n if (prevDirection !== null && this.scrollDirection !== prevDirection || flingSpedUp(queued.samples)) {\n this.scrollState = null;\n }\n }\n }\n if (this._iosGesture.onScroll({\n isScrolling,\n ownReadBack: kind === \"readBack\",\n moved: offset !== prevOffset,\n // Neither our write's read-back nor a frame of our smooth\n // animation: the user or a fling moved it.\n external: kind === \"external\" && ((_b = this.scrollState) == null ? void 0 : _b.phase) !== \"smooth\" && ((_c = this.scrollState) == null ? void 0 : _c.phase) !== \"smoothFinishing\"\n }) && // The user scrolls: a command still waiting for the tail is\n // theirs to override, like a written one would be.\n ((_d = this.scrollState) == null ? void 0 : _d.phase) === \"queued\") {\n this.scrollState = null;\n }\n this._flushHoldIfReady(true);\n if (this.scrollState) {\n this.scheduleScrollReconcile();\n }\n this.maybeNotify();\n })\n );\n if (\"addEventListener\" in this.scrollElement) {\n this.unsubs.push(\n this._iosGesture.listen(this.scrollElement)\n );\n }\n this._scrollToOffset(this.getScrollOffset());\n }\n this._noteClampMax();\n const anchor = this.pendingScrollAnchor;\n this.pendingScrollAnchor = null;\n if (anchor && this.scrollElement && this.options.enabled) {\n if (anchor.kind === \"anchor\") {\n if (!this._canWriteScroll()) {\n this._holdOffset += anchor.delta;\n this._followOffsetTarget(anchor.delta);\n this.notify(false);\n } else if (isSmoothScroll(this.scrollState) && !approxEqual(\n this.getScrollOffset() - anchor.delta,\n this.scrollState.lastTargetOffset\n )) ;\n else {\n this._followOffsetTarget(anchor.delta);\n this._scrollToOffset(this.getScrollOffset());\n }\n } else {\n this.scrollToEnd({ behavior: anchor.behavior });\n }\n }\n this._flushHoldIfReady(false);\n this._retryClampedAdjustment();\n };\n this._classifyScrollEvent = (offset, isScrolling, elementMax) => {\n var _a;\n return classifyScrollEvent({\n offset,\n isScrolling,\n elementMax,\n holdOffset: this._holdOffset,\n scrollOffset: this.scrollOffset,\n pendingWrite: this.pendingWrite,\n clampedMaxAtWrite: ((_a = this._clampedAdjustment) == null ? void 0 : _a.maxAtWrite) ?? null\n });\n };\n this._retryClampedAdjustment = () => {\n if (this._clampedAdjustment === null || !this.scrollElement || !this.options.enabled || !this._canWriteScroll()) {\n return;\n }\n const { target, maxAtWrite } = this._clampedAdjustment;\n const max = this.getMaxScrollOffset();\n if (max > maxAtWrite + 0.5) {\n this._clampedAdjustment = target > max + 0.5 ? { target, maxAtWrite: max } : null;\n this._scrollToOffset(target);\n }\n };\n this._writeAwaitingCommand = () => {\n const state = this.scrollState;\n if (state === null || state.phase !== \"queued\") return;\n const { behavior } = state;\n this.getMeasurements();\n const offset = this.getScrollStateTarget(state);\n state.lastTargetOffset = offset;\n this._clampedAdjustment = null;\n state.phase = initialScrollPhase(\n behavior,\n state.index != null && approxEqual(offset, this.getScrollOffset())\n );\n this._scrollToOffset(offset, { behavior });\n this.scheduleScrollReconcile();\n };\n this._readElementOffset = () => {\n const el = this.scrollElement;\n if (el == null) return null;\n const { horizontal, isRtl } = this.options;\n if (typeof el.scrollTop === \"number\") {\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n }\n if (typeof el.scrollY === \"number\") {\n return horizontal ? el.scrollX : el.scrollY;\n }\n return null;\n };\n this._canWriteScroll = () => !(isIOSWebKit() && this._iosGesture.inMotion()) && !this._reportedOverscroll;\n this._flushHoldIfReady = (sync) => {\n var _a;\n if (this._holdOffset === 0) return;\n if (!this.scrollElement || !this.options.enabled) return;\n if (!this._canWriteScroll()) return;\n if (((_a = this.scrollState) == null ? void 0 : _a.phase) === \"smooth\") return;\n this._holdOffset = 0;\n if (this.scrollOffset !== null && this.scrollOffset < 0) {\n this.scrollOffset = 0;\n }\n this.notify(sync);\n const target = this.getCommandWrittenOffset() ?? this.getScrollOffset();\n this._clampedAdjustment = this._clampedBy(target);\n this._scrollToOffset(target);\n };\n this.rafId = null;\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes,\n this.options.laneAssignmentMode,\n this.options.gap\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode, gap) => {\n const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n if (lanesChanged) {\n this.lanesChangedFlag = true;\n }\n this.prevLanes = lanes;\n this.pendingMin = null;\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode,\n gap\n };\n },\n {\n key: false\n }\n );\n this.isIndexInRange = (index) => index >= 0 && index < this.options.count;\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],\n ({\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode,\n gap\n }, _itemSizeCacheVersion) => {\n var _a;\n const itemSizeCache = this.itemSizeCache;\n if (!enabled) {\n this.measurementsCache = [];\n this._singleLaneMeasurements = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n return [];\n }\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index);\n }\n }\n }\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false;\n this.lanesSettling = true;\n this.measurementsCache = [];\n this._singleLaneMeasurements = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.pendingMin = null;\n }\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;\n this.pendingMin = null;\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false;\n }\n if (lanes === 1) {\n const need = count * 2;\n let flat = (_a = this._singleLaneMeasurements) == null ? void 0 : _a.flat;\n if (!flat || flat.length < need) {\n const next = new Float64Array(need);\n if (flat && min > 0) next.set(flat.subarray(0, min * 2));\n flat = next;\n }\n const items = min === 0 ? new Array(count) : this._singleLaneMeasurements.items.slice();\n let runningStart;\n if (min === 0) {\n runningStart = paddingStart + scrollMargin;\n } else {\n const prevIdx = min - 1;\n runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n items[i] = key;\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n flat[i * 2] = runningStart;\n flat[i * 2 + 1] = size;\n runningStart += size + gap;\n }\n this._singleLaneMeasurements = { flat, items };\n const view = createLazyMeasurementsView(items, flat);\n this.measurementsCache = view;\n return view;\n }\n const measurements = this.measurementsCache.slice(0, min);\n const laneLastIndex = new Array(lanes).fill(\n void 0\n );\n const laneEnds = new Float64Array(lanes);\n let filledLanes = 0;\n for (let m = 0; m < min; m++) {\n const item = measurements[m];\n if (item) {\n if (laneLastIndex[item.lane] === void 0) filledLanes++;\n laneLastIndex[item.lane] = m;\n laneEnds[item.lane] = item.end;\n }\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const cachedLane = this.laneAssignments.get(i);\n let lane;\n let start;\n const shouldCacheLane = laneAssignmentMode === \"estimate\" || itemSizeCache.has(key);\n if (cachedLane !== void 0 && this.options.lanes > 1) {\n lane = cachedLane;\n const prevIndex = laneLastIndex[lane];\n const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n start = prevInLane ? prevInLane.end + gap : paddingStart + scrollMargin;\n } else if (filledLanes === lanes) {\n let bestLane = 0;\n let bestEnd = laneEnds[0];\n let bestIdx = laneLastIndex[0];\n for (let l = 1; l < lanes; l++) {\n const e = laneEnds[l];\n if (e < bestEnd || e === bestEnd && laneLastIndex[l] < bestIdx) {\n bestLane = l;\n bestEnd = e;\n bestIdx = laneLastIndex[l];\n }\n }\n lane = bestLane;\n start = bestEnd + gap;\n if (shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n } else {\n lane = i % this.options.lanes;\n start = paddingStart + scrollMargin;\n if (shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n }\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n if (laneLastIndex[lane] === void 0) filledLanes++;\n laneLastIndex[lane] = i;\n laneEnds[lane] = end;\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes,\n // scrollOffset is measured in the scroll element and the layout total\n // from the list start, so the list ends scrollMargin further down.\n this._getLayoutTotalSize() + this.options.scrollMargin\n ],\n (measurements, outerSize, scrollOffset, lanes, listEnd) => {\n if (measurements.length === 0 || outerSize === 0) {\n this.range = null;\n return null;\n }\n const maxScrollOffset = Math.max(listEnd - outerSize, 0);\n this.range = calculateRangeImpl(\n measurements,\n outerSize,\n Math.min(scrollOffset, maxScrollOffset),\n lanes,\n // Pass the typed array so binary search + forward-walk can read\n // start/end directly from Float64Array, skipping the Proxy traps.\n lanes === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null\n );\n return this.range;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex,\n this.options.lanes\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex, lanes) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count,\n lanes\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this.shouldMeasureDuringScroll = (index) => {\n var _a;\n if (!isSmoothScroll(this.scrollState)) {\n return true;\n }\n const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);\n if (scrollIndex !== void 0 && this.range) {\n const bufferSize = Math.max(\n this.options.overscan,\n Math.ceil((this.range.endIndex - this.range.startIndex) / 2)\n );\n const minIndex = Math.max(0, scrollIndex - bufferSize);\n const maxIndex = Math.min(\n this.options.count - 1,\n scrollIndex + bufferSize\n );\n return index >= minIndex && index <= maxIndex;\n }\n return true;\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key2) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key2);\n }\n });\n return;\n }\n const index = this.indexFromElement(node);\n if (!this.isIndexInRange(index)) return;\n const key = this.options.getItemKey(index);\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if (node.isConnected && (!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, void 0, this));\n }\n };\n this.resizeItem = (index, size) => {\n var _a, _b, _c;\n if (!this.isIndexInRange(index)) return;\n if ((_a = this._resizeBatch) == null ? void 0 : _a.sync) this.getMeasurements();\n let cachedSize;\n let itemStart;\n let key;\n const flat = (_b = this._singleLaneMeasurements) == null ? void 0 : _b.flat;\n if (this.options.lanes === 1 && flat != null) {\n key = this.options.getItemKey(index);\n itemStart = flat[index * 2];\n cachedSize = flat[index * 2 + 1];\n } else {\n const item = this.measurementsCache[index];\n if (!item) return;\n key = item.key;\n itemStart = item.start;\n cachedSize = item.size;\n }\n const itemSize = this.itemSizeCache.get(key) ?? cachedSize;\n const delta = size - itemSize;\n if (delta !== 0) {\n const wasAtEnd = this.options.anchorTo === \"end\" && !isSmoothScroll(this.scrollState) && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;\n const prevTotalSize = wasAtEnd ? this._getLayoutTotalSize() : 0;\n const scrollOffset = this.getScrollOffset();\n const isFirstMeasure = !this.itemSizeCache.has(key);\n const defaultShouldAdjust = isFirstMeasure ? (\n // First measurement: compensate any item whose top sits above the\n // fold — the estimate→actual delta must be corrected regardless of\n // scroll direction, since the whole estimated block was above it.\n itemStart < scrollOffset\n ) : (\n // Re-measurement: only compensate an item that is ENTIRELY above the\n // fold. An item that merely *spans* the fold (top above, bottom\n // below — e.g. a streaming chat message growing at its bottom)\n // changes size *below* the anchor point, so shifting scrollTop by the\n // delta would drag the viewport downward on every growth (#1218).\n // Also skip during backward scroll to avoid the \"items jump while\n // scrolling up\" cascade.\n itemStart + itemSize <= scrollOffset && this.scrollDirection !== \"backward\"\n );\n const shouldAdjustScroll = !isSmoothScroll(this.scrollState) && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(\n // The callback expects a VirtualItem; build one lazily only\n // when the consumer actually supplied a custom predicate.\n this.measurementsCache[index] ?? {\n index,\n key,\n start: itemStart,\n size: cachedSize,\n end: itemStart + cachedSize,\n lane: 0\n },\n delta,\n this\n ) : defaultShouldAdjust);\n if (this.pendingMin === null || index < this.pendingMin) {\n this.pendingMin = index;\n }\n this.itemSizeCache.set(key, size);\n this.itemSizeCacheVersion++;\n let adjustedSync = false;\n if (!this._awaitingCommandReadBack()) {\n if (wasAtEnd) {\n adjustedSync = this.applyScrollAdjustment(\n this._getLayoutTotalSize() - prevTotalSize\n );\n } else if (shouldAdjustScroll) {\n adjustedSync = this.applyScrollAdjustment(delta);\n }\n }\n if (this._resizeBatch) {\n this._resizeBatch.notify = true;\n (_c = this._resizeBatch).sync || (_c.sync = adjustedSync);\n return;\n }\n this.notify(adjustedSync);\n this._noteClampMax();\n this._flushHoldIfReady(true);\n this._retryClampedAdjustment();\n }\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements(), this._holdOffset],\n (indexes, measurements, hold) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(\n hold === 0 ? measurement : {\n ...measurement,\n start: measurement.start - hold,\n end: measurement.end - hold\n }\n );\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n var _a;\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n const flat = (_a = this._singleLaneMeasurements) == null ? void 0 : _a.flat;\n const useFlat = this.options.lanes === 1 && flat != null;\n const idx = findNearestBinarySearch(\n 0,\n measurements.length - 1,\n useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,\n offset\n );\n return notUndefined(measurements[idx]);\n };\n this._noteClampMax = () => {\n if (!this._awaitingCommandReadBack()) return;\n const elementMax = this._elementMaxScrollOffset();\n if (elementMax === null) return;\n const write = this.pendingWrite;\n const max = Math.max(elementMax, 0) + this._holdOffset;\n if (max >= write.target) return;\n const lowMaxes = write.lowMaxes ?? (write.lowMaxes = []);\n if (lowMaxes[lowMaxes.length - 1] !== max) lowMaxes.push(max);\n };\n this.getMaxScrollOffset = () => (this._elementMaxScrollOffset() ?? 0) + this._holdOffset;\n this._toLayoutOffset = (elementOffset) => {\n var _a;\n let offset = elementOffset + this._holdOffset;\n if (((_a = this.pendingScrollAnchor) == null ? void 0 : _a.kind) === \"anchor\") {\n offset += this.pendingScrollAnchor.delta;\n }\n return offset;\n };\n this._elementMaxScrollOffset = () => {\n const el = this.scrollElement;\n if (el === null) return null;\n if (\"scrollHeight\" in el) {\n return this.options.horizontal ? el.scrollWidth - el.clientWidth : el.scrollHeight - el.clientHeight;\n }\n if (\"document\" in el) {\n const doc = el.document.documentElement;\n return this.options.horizontal ? doc.scrollWidth - el.innerWidth : doc.scrollHeight - el.innerHeight;\n }\n return null;\n };\n this._momentumStop = null;\n this._stopMomentum = (done) => {\n const el = this.scrollElement;\n const win = this.targetWindow;\n if (el === null || win === null) return;\n const scroller = \"document\" in el ? el.document.scrollingElement : el;\n if (!(scroller == null ? void 0 : scroller.style)) return;\n if (this._momentumStop) {\n this._momentumStop.done = done;\n return;\n }\n const { style } = scroller;\n const property = this.options.horizontal ? \"overflow-x\" : \"overflow-y\";\n const value = style.getPropertyValue(property);\n const priority = style.getPropertyPriority(property);\n const crossSize = () => this.options.horizontal ? scroller.clientHeight : scroller.clientWidth;\n const crossSizeBefore = crossSize();\n style.setProperty(property, \"hidden\", \"important\");\n if (crossSize() !== crossSizeBefore) {\n style.setProperty(property, value, priority);\n return;\n }\n const stop = {\n // False when the app replaced the hidden value: the fling may not\n // have stopped.\n restore: () => {\n if (style.getPropertyValue(property) !== \"hidden\" || style.getPropertyPriority(property) !== \"important\") {\n return false;\n }\n style.setProperty(property, value, priority);\n return true;\n },\n done\n };\n this._momentumStop = stop;\n win.requestAnimationFrame(\n () => win.requestAnimationFrame(() => {\n if (this._momentumStop !== stop) return;\n this._momentumStop = null;\n if (stop.restore()) stop.done();\n })\n );\n };\n this._clampedBy = (target) => {\n const elementMax = this._elementMaxScrollOffset();\n if (elementMax === null) return null;\n const maxAtWrite = elementMax + this._holdOffset;\n return target > maxAtWrite + 0.5 ? { target, maxAtWrite } : null;\n };\n this.getVirtualDistanceFromEnd = () => {\n return Math.max(\n this._getLayoutTotalSize() + this.options.scrollMargin - this.getSize() - this.getScrollOffset(),\n 0\n );\n };\n this.getDistanceFromEnd = () => {\n return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);\n };\n this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {\n return this.getDistanceFromEnd() <= threshold;\n };\n this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n if (!this.scrollElement) return 0;\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n }\n if (align === \"center\") {\n toOffset += (itemSize - size) / 2;\n } else if (align === \"end\") {\n toOffset -= size;\n }\n const maxOffset = this.getMaxScrollOffset();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n const item = this.getMeasurements()[index];\n if (!item) return;\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n if (align === \"end\" && index === this.options.count - 1) {\n const maxOffset = this.getMaxScrollOffset();\n const toOffset2 = maxOffset - this.options.paddingEnd + this.options.scrollPaddingEnd;\n return [Math.max(Math.min(toOffset2, maxOffset), 0), align];\n }\n const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align\n ];\n };\n this.scrollToOffset = (toOffset, { align = \"start\", behavior = \"auto\" } = {}) => {\n this._startScroll(\n { index: null, align },\n this.getOffsetForAlignment(toOffset, align),\n behavior,\n \"absolute\"\n );\n };\n this.scrollToIndex = (index, {\n align: initialAlign = \"auto\",\n behavior = \"auto\"\n } = {}) => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const offsetInfo = this.getOffsetForIndex(index, initialAlign);\n if (!offsetInfo) return;\n const [offset, align] = offsetInfo;\n this._startScroll({ index, align }, offset, behavior, \"absolute\");\n };\n this.scrollBy = (delta, { behavior = \"auto\" } = {}) => {\n const offset = this.getOffsetForAlignment(\n (this.getCommandWrittenOffset() ?? this.getScrollOffset()) + delta,\n \"start\"\n );\n this._startScroll(\n { index: null, align: \"start\" },\n offset,\n behavior,\n \"relative\"\n );\n };\n this.scrollToEnd = ({ behavior = \"auto\" } = {}) => {\n if (this.options.count > 0) {\n this._startScroll(\n { index: this.options.count - 1, align: \"end\", toEnd: true },\n Math.max(this.getMaxScrollOffset(), 0),\n behavior,\n \"absolute\"\n );\n return;\n }\n this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {\n behavior\n });\n };\n this.cancelScroll = () => {\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n };\n this.getTotalSize = () => Math.max(this._getLayoutTotalSize() - this._holdOffset, 0);\n this._getLayoutTotalSize = () => {\n var _a, _b;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else if (this.options.lanes === 1) {\n const lastIdx = measurements.length - 1;\n const flat = (_a = this._singleLaneMeasurements) == null ? void 0 : _a.flat;\n if (flat != null) {\n end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];\n } else {\n end = ((_b = measurements[lastIdx]) == null ? void 0 : _b.end) ?? 0;\n }\n } else {\n const endByLane = Array(this.options.lanes).fill(null);\n let endIndex = measurements.length - 1;\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex];\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end;\n }\n endIndex--;\n }\n end = Math.max(...endByLane.filter((val) => val !== null));\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this.takeSnapshot = () => {\n const snapshot = [];\n if (this.itemSizeCache.size === 0) return snapshot;\n const m = this.getMeasurements();\n for (const item of m) {\n if (item && this.itemSizeCache.has(item.key)) {\n snapshot.push({\n index: item.index,\n key: item.key,\n start: item.start,\n size: item.size,\n end: item.end,\n lane: item.lane\n });\n }\n }\n return snapshot;\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n } = {}) => {\n const write = {\n target: offset + (adjustments ?? 0),\n smooth: behavior === \"smooth\"\n };\n this.pendingWrite = write;\n this.options.scrollToFn(\n offset - this._holdOffset,\n { behavior, adjustments },\n this\n );\n return write;\n };\n this.getCommandWrittenOffset = () => this.scrollState !== null && this.pendingWrite !== null && !this.pendingWrite.smooth ? this.pendingWrite.target : null;\n this._awaitingCommandReadBack = () => {\n const writtenOffset = this.getCommandWrittenOffset();\n return !(isIOSWebKit() && this._iosGesture.dragging()) && writtenOffset !== null && !approxEqual(writtenOffset, this.getScrollOffset());\n };\n this._followOffsetTarget = (delta) => {\n if (this.scrollState !== null && this.scrollState.index == null) {\n this.scrollState.lastTargetOffset += delta;\n }\n };\n this.measure = () => {\n this.pendingMin = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.itemSizeCacheVersion++;\n this.notify(false);\n };\n this.setOptions(opts);\n }\n /**\n * @deprecated Always 0: a scroll correction is folded into `scrollOffset`\n * at once, so there is never an outstanding adjustment to add to it. Read\n * `scrollOffset` alone.\n */\n get scrollAdjustments() {\n return 0;\n }\n // Returns `true` when it performed a synchronous `scrollTop` write this\n // tick, `false` when the delta was zero or the write was deferred (iOS).\n // `resizeItem` uses that to decide whether the follow-up `notify` must be\n // synchronous so the grown transforms commit in the same paint (#1227).\n applyScrollAdjustment(delta, behavior) {\n if (delta === 0) return false;\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n this._followOffsetTarget(delta);\n if (!this._canWriteScroll()) {\n this._holdOffset += delta;\n if (this.scrollOffset !== null) this.scrollOffset += delta;\n return true;\n } else {\n const offset = this.getScrollOffset();\n this._clampedAdjustment = this._clampedBy(offset + delta);\n const write = this._scrollToOffset(offset, {\n adjustments: delta,\n behavior\n });\n if (this.scrollOffset !== null) {\n if (this.pendingWrite === write) this.scrollOffset += delta;\n if (this.scrollOffset < 0) this.scrollOffset = 0;\n }\n return true;\n }\n }\n scheduleScrollReconcile() {\n if (!this.targetWindow) {\n this.scrollState = null;\n return;\n }\n if (this.rafId != null) return;\n this.rafId = this.targetWindow.requestAnimationFrame(() => {\n this.rafId = null;\n this.reconcileScroll();\n });\n }\n getScrollStateTarget(state) {\n const offsetInfo = state.toEnd ? [Math.max(this.getMaxScrollOffset(), 0)] : state.index != null ? this.getOffsetForIndex(state.index, state.align) : void 0;\n return offsetInfo ? offsetInfo[0] : state.lastTargetOffset;\n }\n reconcileScroll() {\n if (!this.scrollState) return;\n const el = this.scrollElement;\n if (!el) return;\n const MAX_RECONCILE_MS = 5e3;\n if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n this.scrollState = null;\n return;\n }\n if (this.scrollState.phase === \"queued\") {\n this.scheduleScrollReconcile();\n return;\n }\n this.getMeasurements();\n const targetOffset = this.getScrollStateTarget(this.scrollState);\n const STABLE_FRAMES = this.scrollState.index == null ? 1 : this.options.useAnimationFrameWithResizeObserver ? 3 : 2;\n const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;\n if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n if (this.scrollState.phase === \"smooth\") {\n this.scrollState.phase = \"smoothLanded\";\n } else if (this.scrollState.phase === \"smoothFinishing\") {\n this.scrollState.phase = \"instant\";\n }\n this.scrollState.stableFrames++;\n if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n if (this.getScrollOffset() !== targetOffset) {\n this._scrollToOffset(targetOffset, { behavior: \"auto\" });\n }\n this.scrollState = null;\n return;\n }\n } else {\n this.scrollState.stableFrames = 0;\n if (targetChanged) {\n const viewport = this.getSize() || 600;\n const distance = Math.abs(targetOffset - this.getScrollOffset());\n const keepSmooth = isSmoothScroll(this.scrollState) && distance > viewport;\n this.scrollState.lastTargetOffset = targetOffset;\n if (keepSmooth) {\n this.scrollState.phase = \"smooth\";\n } else if (this.scrollState.phase === \"smooth\") {\n this.scrollState.phase = \"smoothFinishing\";\n } else if (this.scrollState.phase === \"smoothLanded\") {\n this.scrollState.phase = \"instant\";\n }\n this._scrollToOffset(targetOffset, {\n behavior: keepSmooth ? \"smooth\" : \"auto\"\n });\n }\n }\n this.scheduleScrollReconcile();\n }\n // Every scroll command starts here: it becomes the in-flight command,\n // writes its first target and leaves reconcile to retarget and retire it.\n //\n // Targets are layout offsets. A held correction is not dropped by a\n // command: the write lands the element `_holdOffset` short of the target,\n // under the rows exposed shifted by the same amount, and the flush moves\n // both together once a write is possible.\n //\n // An index or end target that is already at its offset starts a smooth\n // scroll as landed; an offset target never does, so its first scroll\n // event is read as the user's (see the scroll handler in `_willUpdate`).\n _startScroll(target, offset, behavior, kind) {\n this.pendingScrollAnchor = null;\n this._clampedAdjustment = null;\n const tail = this._iosGesture.tail();\n if (kind === \"absolute\" && tail !== null) {\n if (tail === \"fling\" && momentumOverridesWrites()) {\n this._stopMomentum(() => {\n const state = this.scrollState;\n if ((state == null ? void 0 : state.phase) !== \"queued\" || // A finger came down: it owns the scroll until it lifts.\n this._iosGesture.tail() !== \"fling\" || // In a bounce WebKit can drop the write (#1287): the tail\n // decides, as without the stop. (Not `flingCaught`: our stop\n // also ends the fling at speed, so a slow frame would read as\n // a catch and the tail would drop the command.)\n this._reportedOverscroll) {\n return;\n }\n this._iosGesture.end();\n this._flushHoldIfReady(true);\n this._writeAwaitingCommand();\n });\n this.scrollState = {\n ...target,\n startedAt: this.now(),\n lastTargetOffset: offset,\n stableFrames: 0,\n phase: \"queued\",\n behavior,\n samples: []\n };\n this.scheduleScrollReconcile();\n return;\n }\n this._iosGesture.end();\n }\n this.scrollState = {\n ...target,\n startedAt: this.now(),\n lastTargetOffset: offset,\n stableFrames: 0,\n behavior,\n phase: initialScrollPhase(\n behavior,\n target.index != null && approxEqual(offset, this.getScrollOffset())\n )\n };\n this._scrollToOffset(offset, { behavior });\n this.scheduleScrollReconcile();\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction findNearestBinarySearchFlat(flat, high, value) {\n let low = 0;\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = flat[middle * 2];\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n return low > 0 ? low - 1 : 0;\n}\nfunction calculateRangeImpl(measurements, outerSize, scrollOffset, lanes, flat) {\n const lastIndex = measurements.length - 1;\n if (measurements.length <= lanes) {\n return { startIndex: 0, endIndex: lastIndex };\n }\n if (lanes === 1 && flat !== null) {\n const startIndex2 = findNearestBinarySearchFlat(\n flat,\n lastIndex,\n scrollOffset\n );\n let endIndex2 = startIndex2;\n const limit = scrollOffset + outerSize;\n while (endIndex2 < lastIndex && flat[endIndex2 * 2] + flat[endIndex2 * 2 + 1] < limit) {\n endIndex2++;\n }\n return { startIndex: startIndex2, endIndex: endIndex2 };\n }\n const getStart = (index) => measurements[index].start;\n let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);\n let endIndex = startIndex;\n if (lanes === 1) {\n while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {\n endIndex++;\n }\n } else if (lanes > 1) {\n const endPerLane = Array(lanes).fill(0);\n while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n const item = measurements[endIndex];\n endPerLane[item.lane] = item.end;\n endIndex++;\n }\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex];\n startPerLane[item.lane] = item.start;\n startIndex--;\n }\n startIndex = Math.max(0, startIndex - startIndex % lanes);\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n _resetIOSDetectionForTests,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import { elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect, Virtualizer } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nclass VirtualizerControllerBase {\n constructor(host, options) {\n this.cleanup = () => {\n };\n this.host = host;\n this.options = { ...options };\n this.virtualizer = new Virtualizer(this.resolveOptions(this.options));\n this.host.addController(this);\n }\n getVirtualizer() {\n return this.virtualizer;\n }\n /**\n * Merge a partial options update into the options this controller already\n * holds, push them to the virtualizer, and request a host update. Lit folds\n * a request made from `willUpdate` into the update already in progress.\n *\n * Keys set to `undefined` are ignored, matching core `setOptions`, so a\n * partial update cannot wipe an option stored earlier. Defaults supplied by\n * `VirtualizerController` / `WindowVirtualizerController` stay in place\n * unless a later call replaces them.\n */\n setOptions(options) {\n if (!this.applyOptions(options)) return;\n this.virtualizer.setOptions(this.resolveOptions(this.options));\n this.virtualizer._willUpdate();\n this.host.requestUpdate();\n }\n hostConnected() {\n this.cleanup = this.virtualizer._didMount();\n this.virtualizer._willUpdate();\n this.host.requestUpdate();\n }\n hostUpdated() {\n this.virtualizer._willUpdate();\n }\n hostDisconnected() {\n this.cleanup();\n }\n applyOptions(partial) {\n const next = {\n ...this.options\n };\n let changed = false;\n for (const key in partial) {\n if (!Object.prototype.hasOwnProperty.call(partial, key)) continue;\n const value = partial[key];\n if (value === void 0) continue;\n if (!Object.is(next[key], value)) {\n changed = true;\n Object.assign(next, { [key]: value });\n }\n }\n if (changed) this.options = next;\n return changed;\n }\n resolveOptions(options) {\n return {\n ...options,\n onChange: (instance, sync) => {\n var _a;\n this.host.updateComplete.then(() => this.host.requestUpdate());\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance, sync);\n }\n };\n }\n}\nclass VirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n }\n}\nclass WindowVirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n }\n}\nexport {\n VirtualizerController,\n WindowVirtualizerController\n};\n//# sourceMappingURL=index.js.map\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { VirtualizerController } from '@tanstack/lit-virtual';\nimport { RowPool, RowSizes, ScrollScale, maxVisibleRows, steadyWindow } from '@argus-table/core';\n\n/** A rendered body row: its pool slot, its index in the row model and its offset. */\nexport interface WindowRow {\n slot: number;\n index: number;\n /** Offset in the rendered body, in px (scaled bodies: relative to the scroll position). */\n start: number;\n /** Measured row heights (`auto`): the row's height, the least it renders at. */\n size?: number;\n}\n\n/**\n * Engines place elements in a body taller than this (2^24 px) only to 2 px:\n * positions are 32-bit floats. Measured rows are whole px below it and an even\n * number of px above it, so every row starts on the grid and they stay flush.\n */\nconst COARSE_BODY = 16_000_000;\n\n/** How long scrolling has to be quiet before a held correction is written (see `#hold`). */\nconst HOLD_MS = 150;\n\nexport interface VirtualWindow {\n /** Rendered rows, in pool order (ADR 0001 addendum). */\n rows: WindowRow[];\n /** Rendered height of the body in px: all rows, or the cap. */\n totalSize: number;\n /** Visible rows, without overscan; `null` before the first layout. */\n range: { start: number; end: number } | null;\n}\n\n/** Measured row heights (`rowHeight: 'auto'`). */\nexport interface AutoRows {\n /** Changes identity whenever the row at an index may have changed (the model's `rowOrder`). */\n order: object;\n /** The index of a row id in the current order. */\n indexOf: (id: string) => number | undefined;\n}\n\nexport interface VirtualConfig {\n count: number;\n /** The row height; with `auto`, the least a row is and what an unmeasured row counts as. */\n rowHeight: number;\n overscan: number;\n /** Row id at an index of the row model; pool slots follow row ids. */\n rowIdAt: (index: number) => string;\n /**\n * The row to keep rendered outside the range (the one holding the grid's tab\n * stop), so its DOM and focus survive scrolling. `undefined`: none.\n */\n keep?: { id: string; index: number } | undefined;\n /** The tallest the body may render when it is `logical` px tall (`bodyCap()`); a taller one scrolls scaled. */\n cap: (logical: number) => number;\n /** Rows of different heights, measured as they render (`measureRows`). */\n auto?: AutoRows | undefined;\n}\n\n/**\n * Row virtualization (TanStack Virtual) plus the row pool: which rows render,\n * where, and which pool slot's DOM each one uses. The virtualizer registers itself\n * with the host and requests updates on scroll.\n *\n * Scroll scaling: engines limit an element's height, so a body taller than the\n * cap renders at the cap and its scroll position maps linearly onto the rows\n * (`ScrollScale`). The virtualizer works in logical offsets: it gets a stand-in\n * for the scroller whose `scrollTop`, `scrollHeight` and `scrollTo()` are\n * logical, and everything else passes through. Rows render relative to the\n * scroll position (`start` minus the difference between the logical and the\n * physical offset). Scroll through this controller (`scrollBy`, `reveal`,\n * `scrollToIndex`): physical px no longer match rows once the body is scaled.\n *\n * Rows of different heights (`auto`): TanStack's own measuring recomputes every\n * row below a measured one, too slow for a million rows, so in this mode the\n * virtualizer sits idle (no rows) and the controller does its part: the window\n * from `RowSizes` (heights by index, O(log n) offsets), a scroll listener that\n * re-renders when the window moves, and anchoring. Heights follow row ids, so\n * a sort or filter keeps them. A measured row above the top row would move\n * the rows in view: unscaled, the rows render shifted by the difference until\n * scrolling stops (`#hold`); scaled, the mapping pivots at the current offset.\n * Neither writes the scroll position while the user scrolls.\n */\nexport class VirtualController implements ReactiveController {\n readonly #virtual: VirtualizerController<HTMLElement, Element>;\n readonly #pool = new RowPool();\n readonly #scale = new ScrollScale();\n readonly #host: ReactiveControllerHost;\n readonly #getScrollElement: () => HTMLElement | null;\n #element: HTMLElement | undefined;\n #standIn: HTMLElement | undefined;\n #config: VirtualConfig = {\n count: 0,\n rowHeight: 40,\n overscan: 6,\n rowIdAt: String,\n cap: () => Infinity,\n };\n /** A logical offset to restore after the update, once the body has its new height. */\n #anchor: number | undefined;\n // Auto mode only.\n readonly #sizes = new RowSizes();\n /** Measured heights by row id (as read), so they follow rows through a sort or filter. */\n readonly #heights = new Map<string, number>();\n /** Rows are whole multiples of this many px (see `COARSE_BODY`). */\n #quantum = 1;\n /**\n * Unscaled: the logical offset less the scroller's. Rows measured above the\n * top row would move the rows in view; instead of writing the scroll position\n * (which cancels a wheel or touch scroll in progress, in WebKit at once) the\n * rows render shifted by this much, and it is written once scrolling has been\n * quiet for `HOLD_MS`.\n */\n #hold = 0;\n #holdTimer: ReturnType<typeof setTimeout> | undefined;\n /** The `order` the sizes are indexed for. */\n #order: object | undefined;\n /** The visible rows last rendered, and the logical offset they were rendered for. */\n #rendered: { start: number; end: number; top: number } | undefined;\n /** The scroller this controller listens to (auto mode). */\n #listening: HTMLElement | undefined;\n #resizeObserver: ResizeObserver | undefined;\n\n constructor(host: ReactiveControllerHost, getScrollElement: () => HTMLElement | null) {\n this.#host = host;\n this.#getScrollElement = getScrollElement;\n this.#virtual = new VirtualizerController<HTMLElement, Element>(host, {\n count: 0,\n getScrollElement: () => this.#scroller(),\n // The real element: a ResizeObserver can't observe the stand-in.\n observeElementRect: (_instance, cb) => {\n const element = this.#element;\n if (!element) return undefined;\n const report = () => {\n cb({ width: element.clientWidth, height: element.clientHeight });\n };\n report();\n const observer = new ResizeObserver(report);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n },\n estimateSize: () => this.#config.rowHeight,\n overscan: this.#config.overscan,\n // One window size from the first render: the pool never grows while scrolling\n // (in WebKit, new rows' slots would cut a wheel scroll short; see steadyWindow).\n rangeExtractor: (range) =>\n steadyWindow(\n range,\n maxVisibleRows(this.#element?.clientHeight ?? 0, this.#config.rowHeight),\n ),\n });\n host.addController(this);\n }\n\n /** The scroller's stand-in for the virtualizer: vertical offsets and height in logical px. */\n #scroller(): HTMLElement | null {\n const element = this.#getScrollElement();\n if (!element) return null;\n if (this.#element !== element || !this.#standIn) {\n this.#element = element;\n this.#standIn = new Proxy(element, {\n get: (target, key) => {\n if (key === 'scrollTop') return this.#top(target);\n if (key === 'scrollHeight') return target.scrollHeight + this.#scale.excess;\n if (key === 'scrollTo') {\n return (options: ScrollToOptions) => {\n if (options.top === undefined) target.scrollTo(options);\n else this.#write(target, options.top, options.behavior);\n };\n }\n const value: unknown = Reflect.get(target, key);\n // Methods run on the element itself (DOM methods reject the proxy).\n return typeof value === 'function'\n ? (value as (...args: unknown[]) => unknown).bind(target)\n : value;\n },\n });\n }\n return this.#standIn;\n }\n\n /** The scroller's logical offset. */\n #top(element: HTMLElement): number {\n const top = element.scrollTop;\n const scale = this.#scale;\n return scale.scaled\n ? scale.toLogical(top, element.scrollHeight - element.clientHeight)\n : top + this.#hold;\n }\n\n /**\n * Scrolls to a logical offset. `round` rounds the physical one, so that a\n * scaled offset moves the scroller at all.\n */\n #write(\n element: HTMLElement,\n logical: number,\n behavior?: ScrollBehavior,\n round?: (px: number) => number,\n ): void {\n const scale = this.#scale;\n if (!scale.scaled) {\n this.#dropHold();\n element.scrollTo({ top: logical, behavior });\n return;\n }\n const range = element.scrollHeight - element.clientHeight;\n const target = Math.min(Math.max(logical, 0), range + scale.excess);\n const physical = scale.toPhysical(target, range);\n element.scrollTo({ top: round ? round(physical) : physical, behavior });\n if (behavior !== 'smooth') scale.land(target, element.scrollTop);\n }\n\n configure(next: VirtualConfig): void {\n const prev = this.#config;\n this.#config = next;\n if (next.auto) {\n this.#configureAuto(next.auto, prev);\n return;\n }\n if (prev.auto) {\n // Back to fixed heights: the virtualizer takes over again.\n this.#heights.clear();\n this.#sizes.reset(0, next.rowHeight);\n this.#order = undefined;\n this.#rendered = undefined;\n this.#dropHold();\n this.#virtual.setOptions({ count: next.count, overscan: next.overscan });\n this.#virtual.getVirtualizer().measure();\n } else if (\n next.count !== prev.count ||\n next.overscan !== prev.overscan ||\n next.rowHeight !== prev.rowHeight\n ) {\n this.#virtual.setOptions({ count: next.count, overscan: next.overscan });\n if (next.rowHeight !== prev.rowHeight) this.#virtual.getVirtualizer().measure();\n }\n // Not `scaled`: TypeScript would take it for unchanged after `configure()`.\n const wasScaled = this.#scale.excess > 0;\n const offset = this.#virtual.getVirtualizer().scrollOffset;\n const logical = next.count * next.rowHeight;\n if (this.#scale.configure(logical, next.cap(logical))) {\n // A new mapping would move the rows under a scaled scroll position (a data\n // source growing, a zoom change): keep the logical offset once the body\n // has its new height.\n if ((wasScaled || this.#scale.scaled) && offset !== null && offset > 0) {\n this.#anchor = offset;\n }\n }\n }\n\n #configureAuto(auto: AutoRows, prev: VirtualConfig): void {\n const next = this.#config;\n if (!prev.auto) this.#virtual.setOptions({ count: 0 });\n const sizes = this.#sizes;\n if (!prev.auto || next.rowHeight !== prev.rowHeight) {\n // A new minimum height (density, a theme): every row measures again.\n this.#heights.clear();\n this.#order = undefined;\n }\n const reset = () => {\n sizes.reset(next.count, this.#fit(0), this.#known(auto, next.count));\n };\n if (auto.order !== this.#order) {\n this.#order = auto.order;\n reset();\n } else if (next.count !== sizes.count) {\n // A data source counting more rows: they keep their indexes.\n sizes.resize(next.count);\n }\n // A body past 2^24 px needs even heights: fit the rows to the new grid.\n const quantum = this.#quantumFor(sizes.total);\n if (quantum !== this.#quantum) {\n this.#quantum = quantum;\n reset();\n }\n const element = this.#element;\n const wasScaled = this.#scale.excess > 0;\n const offset = element ? this.#top(element) : 0;\n const logical = sizes.total;\n if (this.#scale.configure(logical, next.cap(logical))) {\n if ((wasScaled || this.#scale.scaled) && offset > 0) this.#anchor = offset;\n }\n }\n\n /** The measured heights by index in the current order. Forgets rows long gone. */\n *#known(auto: AutoRows, count: number): Generator<[number, number]> {\n const heights = this.#heights;\n const prune = heights.size > 2 * count + 1000;\n for (const [id, px] of heights) {\n const index = auto.indexOf(id);\n if (index !== undefined && index < count) yield [index, this.#fit(px)];\n else if (prune) heights.delete(id);\n }\n }\n\n /** The px grid rows are on for a body `logical` px tall (see `COARSE_BODY`). */\n #quantumFor(logical: number): number {\n return Math.min(logical, this.#config.cap(logical)) > COARSE_BODY ? 2 : 1;\n }\n\n /** A measured height as a row renders it: on the grid, at least the row height. */\n #fit(px: number): number {\n const q = this.#quantum;\n const up = (value: number) => Math.ceil(value / q - 0.01) * q;\n return Math.max(up(px), up(this.#config.rowHeight));\n }\n\n hostUpdated(): void {\n this.#listen();\n const anchor = this.#anchor;\n if (anchor === undefined) return;\n this.#anchor = undefined;\n if (this.#element) this.#write(this.#element, anchor);\n // The logical offset is the same, so the virtualizer sees no change; the\n // rows still have to move to the new physical one.\n this.#host.requestUpdate();\n }\n\n hostDisconnected(): void {\n this.#unlisten();\n }\n\n /**\n * Auto mode: the virtualizer has no rows, so it reports neither scrolling nor\n * a new viewport size. Listen to the scroller here.\n */\n #listen(): void {\n const element = this.#config.auto ? this.#getScrollElement() : null;\n if (element === (this.#listening ?? null)) return;\n this.#unlisten();\n if (!element) return;\n this.#scroller();\n this.#listening = element;\n element.addEventListener('scroll', this.#onScroll, { passive: true });\n this.#resizeObserver ??= new ResizeObserver(this.#onScroll);\n // Reports the size once right away, which renders the first rows.\n this.#resizeObserver.observe(element);\n }\n\n #unlisten(): void {\n this.#listening?.removeEventListener('scroll', this.#onScroll);\n this.#resizeObserver?.disconnect();\n this.#listening = undefined;\n this.#dropHold();\n }\n\n #dropHold(): void {\n clearTimeout(this.#holdTimer);\n this.#holdTimer = undefined;\n this.#hold = 0;\n }\n\n /** Writes the held correction: the rows stay where they are on screen. */\n readonly #flushHold = () => {\n this.#holdTimer = undefined;\n const element = this.#element;\n if (!element || this.#hold === 0) return;\n const logical = this.#top(element);\n this.#hold = 0;\n element.scrollTo({ top: logical });\n this.#host.requestUpdate();\n };\n\n /** Re-renders when the visible rows have changed. */\n readonly #onScroll = () => {\n if (this.#holdTimer !== undefined) {\n clearTimeout(this.#holdTimer);\n this.#holdTimer = setTimeout(this.#flushHold, HOLD_MS);\n }\n const visible = this.#visible();\n const rendered = this.#rendered;\n if (visible?.start !== rendered?.start || visible?.end !== rendered?.end) {\n this.#host.requestUpdate();\n }\n };\n\n /** Auto mode: the visible rows (without overscan) and the logical offset, or `undefined` before layout. */\n #visible(): { start: number; end: number; top: number } | undefined {\n const element = this.#element;\n const sizes = this.#sizes;\n const view = element?.clientHeight ?? 0;\n if (!element || sizes.count === 0 || view <= 0) return undefined;\n const top = this.#top(element);\n const start = sizes.indexAt(top);\n // The last row that starts above the bottom edge.\n const end = Math.max(start, sizes.indexAt(top + view - 0.5));\n return { start, end, top };\n }\n\n /**\n * Computes the rendered window and updates the pool. Call once per render.\n */\n computeWindow(): VirtualWindow {\n if (this.#config.auto) return this.#autoWindow();\n const v = this.#virtual.getVirtualizer();\n const items = v.getVirtualItems();\n // Scaled: rows render relative to the scroll position. The physical offset is\n // read now, so rows for the virtualizer's offset fill the view even if the\n // scroller has moved on since its last scroll event.\n const scaled = this.#scale.scaled;\n const size = this.#scale.size;\n const shift = scaled ? (v.scrollOffset ?? 0) - (this.#element?.scrollTop ?? 0) : 0;\n const byId = new Map<string, { index: number; start: number }>();\n for (const item of items) {\n byId.set(this.#config.rowIdAt(item.index), { index: item.index, start: item.start - shift });\n }\n const { keep, rowHeight } = this.#config;\n this.#pool.pin(keep?.id);\n if (keep && !byId.has(keep.id)) {\n // Fixed row heights: the virtualizer would place it here too. Scaled, it is\n // out of view: keep it inside the body (or just above it, under the header),\n // so it doesn't stretch the scroll range past the cap.\n const start = keep.index * rowHeight - shift;\n byId.set(keep.id, {\n index: keep.index,\n start: scaled ? Math.min(Math.max(start, -rowHeight), size) : start,\n });\n }\n const rows: WindowRow[] = [];\n for (const { id, slot } of this.#pool.update(byId.keys())) {\n const item = byId.get(id);\n if (item) rows.push({ slot, ...item });\n }\n const range = v.range;\n return {\n rows,\n totalSize: scaled ? size : v.getTotalSize(),\n range: range ? { start: range.startIndex, end: range.endIndex } : null,\n };\n }\n\n /** `computeWindow()` for rows of different heights. */\n #autoWindow(): VirtualWindow {\n const { count, overscan, rowHeight, keep, rowIdAt } = this.#config;\n const sizes = this.#sizes;\n const scale = this.#scale;\n const element = this.#element;\n const visible = this.#visible();\n this.#rendered = visible;\n // Scaled: rows render relative to the scroll position. Unscaled: shifted by the held correction.\n const shift = visible && element ? visible.top - element.scrollTop : 0;\n const byId = new Map<string, { index: number; start: number; size?: number }>();\n if (visible && element) {\n const indexes = steadyWindow(\n { startIndex: visible.start, endIndex: visible.end, overscan, count },\n maxVisibleRows(element.clientHeight, rowHeight),\n );\n const first = indexes[0];\n let start = first === undefined ? 0 : sizes.startOf(first);\n for (const index of indexes) {\n const size = sizes.sizeOf(index);\n byId.set(rowIdAt(index), { index, start: start - shift, size });\n start += size;\n }\n }\n this.#pool.pin(keep?.id);\n if (keep && !byId.has(keep.id) && keep.index < count) {\n // Scaled, it is out of view: keep it inside the body (or just above it).\n const size = sizes.sizeOf(keep.index);\n const start = sizes.startOf(keep.index) - shift;\n byId.set(keep.id, {\n index: keep.index,\n start: scale.scaled ? Math.min(Math.max(start, -size), scale.size) : start,\n size,\n });\n }\n const rows: WindowRow[] = [];\n for (const { id, slot } of this.#pool.update(byId.keys())) {\n const item = byId.get(id);\n if (item) rows.push({ slot, ...item });\n }\n return {\n rows,\n totalSize: scale.scaled ? scale.size : sizes.total,\n range: visible ? { start: visible.start, end: visible.end } : null,\n };\n }\n\n /**\n * Auto mode: records the heights of rendered body rows (`[index, px]`), read\n * once their content has rendered. Heights under the row height count as it.\n * Returns whether any changed; the controller then requests the update that\n * places the rows. Rows above the top row keep the rows in view in place.\n */\n measureRows(measured: Iterable<readonly [number, number]>): boolean {\n const { auto, rowIdAt, cap } = this.#config;\n if (!auto) return false;\n const sizes = this.#sizes;\n const element = this.#element;\n const top = element ? this.#top(element) : 0;\n const anchor = sizes.indexAt(top);\n const within = top - sizes.startOf(anchor);\n let changed = false;\n for (const [index, px] of measured) {\n if (index < 0 || index >= sizes.count || !(px > 0)) continue;\n this.#heights.set(rowIdAt(index), px);\n if (sizes.set(index, this.#fit(px)) !== 0) changed = true;\n }\n if (!changed) return false;\n const target = sizes.startOf(anchor) + within;\n const scale = this.#scale;\n const wasScaled = scale.excess > 0;\n const logical = sizes.total;\n if (scale.configure(logical, cap(logical)) && element) {\n if (wasScaled && scale.scaled) {\n // Keep the rows in view where they are without moving the scroller.\n scale.pivot(element.scrollTop, target, element.scrollHeight - element.clientHeight);\n } else if (wasScaled !== scale.scaled) {\n // Once the body has its new height (the write would clamp to the old one).\n this.#anchor = target;\n } else if (Math.abs(target - top) > 0.01) {\n this.#hold += target - top;\n clearTimeout(this.#holdTimer);\n this.#holdTimer = setTimeout(this.#flushHold, HOLD_MS);\n }\n }\n this.#host.requestUpdate();\n return true;\n }\n\n /** The height of the row at `index` (auto mode: measured, or the row height). */\n sizeOf(index: number): number {\n return this.#config.auto ? this.#sizes.sizeOf(index) : this.#config.rowHeight;\n }\n\n /** The logical offset of the row at `index` in the body. */\n startOf(index: number): number {\n return this.#config.auto ? this.#sizes.startOf(index) : index * this.#config.rowHeight;\n }\n\n /**\n * Auto mode: how many rows a page moves from row `from`, the rows that fit in\n * `view` px below it (`down`) or above it. At least one.\n */\n pageRows(from: number, down: boolean, view: number): number {\n const sizes = this.#sizes;\n const start = sizes.startOf(from);\n if (down) return Math.max(1, sizes.indexAt(start + view + 0.01) - from);\n // The first row that starts at most `view` px above this one.\n let to = sizes.indexAt(start - view);\n if (sizes.startOf(to) < start - view - 0.01) to += 1;\n return Math.max(1, from - to);\n }\n\n /** Number of pool slots created so far: bounded by the most rows rendered at once. */\n get poolSize(): number {\n return this.#pool.size;\n }\n\n /** Whether the body is taller than the cap and scrolls scaled. */\n get scaled(): boolean {\n return this.#scale.scaled;\n }\n\n /** The index of the row at the top of the body (0 before the first layout). */\n get topRow(): number {\n const element = this.#element;\n const { count, rowHeight } = this.#config;\n if (!element || count === 0 || rowHeight <= 0) return 0;\n if (this.#config.auto) return this.#sizes.indexAt(this.#top(element) + 0.5);\n // Half a px of slack: engines round scroll offsets to device pixels.\n const row = Math.floor((this.#top(element) + 0.5) / rowHeight);\n return Math.min(Math.max(row, 0), count - 1);\n }\n\n /** `'start'` puts the row at the top; `'auto'` scrolls only as far as needed to show it. */\n scrollToIndex(index: number, align: 'start' | 'auto' = 'start'): void {\n if (this.#config.auto) {\n const element = this.#element;\n if (!element) return;\n if (align === 'auto') {\n this.reveal(index, 0, 0);\n } else {\n this.#write(element, this.#sizes.startOf(Math.min(Math.max(index, 0), this.#sizes.count)));\n }\n this.#host.requestUpdate();\n return;\n }\n this.#virtual.getVirtualizer().scrollToIndex(index, { align });\n }\n\n /** Scrolls by `delta` px of rows (logical px). */\n scrollBy(delta: number): void {\n const element = this.#element;\n if (element) this.#write(element, this.#top(element) + delta);\n }\n\n /** Scrolls to the start or the end of the body. */\n scrollToEdge(edge: 'start' | 'end'): void {\n const element = this.#element;\n // The end: #write clamps to the last logical offset.\n if (element) this.#write(element, edge === 'start' ? 0 : Number.MAX_SAFE_INTEGER);\n }\n\n /**\n * Scrolls the least distance that shows row `index` in full, between the\n * content above the body (`before` px: the header and top pinned rows) and\n * below it (`after` px). Returns whether the rows are yet to move there (with\n * the update after the scroll event): until then the row's DOM isn't where it\n * will be.\n */\n reveal(index: number, before: number, after: number): boolean {\n const element = this.#element;\n if (!element) return false;\n const auto = this.#config.auto !== undefined;\n const offset = this.#top(element);\n const view = element.clientHeight - before - after;\n const start = this.startOf(index);\n const size = this.sizeOf(index);\n let target: number;\n let round: ((px: number) => number) | undefined;\n // A row taller than the view shows its start.\n if (start < offset || (auto && size > view)) {\n target = start;\n round = Math.floor;\n } else if (start + size > offset + view) {\n target = start + size - view;\n round = Math.ceil;\n } else {\n target = offset;\n }\n if (target !== offset) this.#write(element, target, undefined, round);\n // Rendered for an offset the scroller has since left: they move with the\n // update after the scroll event.\n const rendered = auto ? this.#rendered?.top : this.#virtual.getVirtualizer().scrollOffset;\n return rendered !== this.#top(element);\n }\n}\n","import type {\n CellClickDetail,\n ColumnFilterDetail,\n ColumnHideDetail,\n ColumnPinDetail,\n ColumnReorderDetail,\n ColumnResizeDetail,\n LoadErrorDetail,\n RangeChangeDetail,\n RowClickDetail,\n RowSelectDetail,\n SortChangeDetail,\n} from '@argus-table/core';\n\n/** Fired after an update when the visible row range changed. */\nexport const RANGE_CHANGE = 'argus-range-change';\n\n/** Fired after the sort order changed (uncontrolled), or with the proposed order (controlled). */\nexport const SORT_CHANGE = 'argus-sort-change';\n\n/** Fired when a column was resized (uncontrolled), or with the proposed widths (controlled). */\nexport const COLUMN_RESIZE = 'argus-column-resize';\n\n/** Fired when a column was moved (uncontrolled), or with the proposed order (controlled). */\nexport const COLUMN_REORDER = 'argus-column-reorder';\n\n/** Fired when a column was pinned or unpinned (uncontrolled), or with the proposed pins (controlled). */\nexport const COLUMN_PIN = 'argus-column-pin';\n\n/** Fired when a column was hidden or shown (uncontrolled), or with the proposed visibility (controlled). */\nexport const COLUMN_HIDE = 'argus-column-hide';\n\n/** Fired when a column's filter was set, changed or cleared (uncontrolled), or with the proposed filters (controlled). */\nexport const COLUMN_FILTER = 'argus-column-filter';\n\n/** Fired when a body row was clicked, after `argus-cell-click`. */\nexport const ROW_CLICK = 'argus-row-click';\n\n/** Fired when a body cell was clicked, before `argus-row-click`. */\nexport const CELL_CLICK = 'argus-cell-click';\n\n/** Fired when the selected rows changed (uncontrolled), or with the proposed ids (controlled). */\nexport const ROW_SELECT = 'argus-row-select';\n\n/** Fired after the update when a `dataSource` page failed to load. */\nexport const LOAD_ERROR = 'argus-load-error';\n\ndeclare global {\n interface HTMLElementEventMap {\n 'argus-range-change': CustomEvent<RangeChangeDetail>;\n 'argus-sort-change': CustomEvent<SortChangeDetail>;\n 'argus-column-resize': CustomEvent<ColumnResizeDetail>;\n 'argus-column-reorder': CustomEvent<ColumnReorderDetail>;\n 'argus-column-pin': CustomEvent<ColumnPinDetail>;\n 'argus-column-hide': CustomEvent<ColumnHideDetail>;\n 'argus-column-filter': CustomEvent<ColumnFilterDetail>;\n 'argus-row-click': CustomEvent<RowClickDetail<unknown>>;\n 'argus-cell-click': CustomEvent<CellClickDetail<unknown>>;\n 'argus-load-error': CustomEvent<LoadErrorDetail>;\n 'argus-row-select': CustomEvent<RowSelectDetail>;\n }\n}\n\n/** Dispatches a bubbling, composed `CustomEvent`, the shape of every public event. */\nexport function fire(host: HTMLElement, name: string, detail: unknown): boolean {\n return host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n}\n","/**\n * The tallest body the engine handles, measured once per page.\n *\n * Chromium and WebKit clamp a taller element at about 33.5M px (fewer CSS px\n * when the page is zoomed in), and Firefox drops anything over about 17.9M px\n * to 0. Firefox also lets go of an element stuck to the top of a scroller (the\n * header, the top pinned rows) once the scroll offset passes about 8.95M px\n * (2^29 of its 1/60 px units). A hidden probe tries a few heights and keeps the\n * first that renders at full size and keeps a sticky element in place when\n * scrolled that far: 32M px in Chromium and WebKit, 8M px in Firefox. A zoom\n * change (a new `devicePixelRatio` on resize) measures again and tells the\n * tables, so a scaled body stays within the new limit.\n */\nconst HEIGHTS = [32_000_000, 16_000_000, 8_000_000, 4_000_000, 2_000_000];\n\n/** Content below this never needs the probe: every engine renders it. */\nconst SAFE_HEIGHT = 2_000_000;\n/** Room left for the scrollbar and rounding. */\nconst MARGIN = 1000;\n\nlet measured: number | undefined;\nlet forced: number | undefined;\nlet dpr = 0;\nconst listeners = new Set<() => void>();\n\nfunction onResize() {\n if (window.devicePixelRatio === dpr) return;\n dpr = window.devicePixelRatio;\n measured = undefined;\n for (const listener of listeners) listener();\n}\n\n/**\n * The tallest body height in px the engine renders and scrolls with its header\n * in place.\n */\nfunction maxElementHeight(): number {\n if (forced !== undefined) return forced;\n if (measured !== undefined) return measured;\n // Fixed, so the probe never makes the page scroll. A scroller (overflow:\n // hidden still scrolls from script) with a sticky element and a filler.\n const probe = document.createElement('div');\n probe.setAttribute('aria-hidden', 'true');\n probe.style.cssText =\n 'position:fixed;inset-block-start:0;inset-inline-start:0;inline-size:1px;block-size:10px;overflow:hidden;visibility:hidden;pointer-events:none';\n const sticky = document.createElement('div');\n sticky.style.cssText = 'position:sticky;inset-block-start:0;block-size:1px';\n const filler = document.createElement('div');\n probe.append(sticky, filler);\n document.body.append(probe);\n measured =\n HEIGHTS.find((height) => {\n filler.style.blockSize = `${String(height)}px`;\n if (filler.offsetHeight < height - 1) return false;\n probe.scrollTop = height;\n const held = sticky.getBoundingClientRect().top - probe.getBoundingClientRect().top;\n return Math.abs(held) < 1;\n }) ?? SAFE_HEIGHT;\n probe.remove();\n return measured;\n}\n\n/**\n * The tallest the body may render: the engine's maximum less what scrolls with\n * it (`extra`: the header and pinned rows). `Infinity` for a body of `logical`\n * px that is far from any limit, without measuring.\n */\nexport function bodyCap(logical: number, extra: number): number {\n if (forced === undefined && logical + extra < SAFE_HEIGHT) return Infinity;\n return Math.max(maxElementHeight() - extra - MARGIN, 0);\n}\n\n/** Calls `listener` when the maximum may have changed (the page was zoomed). Returns the unsubscribe. */\nexport function watchMaxElementHeight(listener: () => void): () => void {\n if (listeners.size === 0) {\n dpr = window.devicePixelRatio;\n window.addEventListener('resize', onResize, { passive: true });\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) window.removeEventListener('resize', onResize);\n };\n}\n\n/** Tests: pretend the engine renders at most `height` px (`undefined` measures again). */\nexport function setMaxElementHeightForTests(height: number | undefined): void {\n forced = height;\n}\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as r,nothing as e}from\"../lit-html.js\";import{directive as i,Directive as t,PartType as n}from\"../directive.js\";import{isSingleExpression as o,setCommittedValue as s}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const l=i(class extends t{constructor(r){if(super(r),r.type!==n.PROPERTY&&r.type!==n.ATTRIBUTE&&r.type!==n.BOOLEAN_ATTRIBUTE)throw Error(\"The `live` directive is not allowed on child or event bindings\");if(!o(r))throw Error(\"`live` bindings can only contain a single expression\")}render(r){return r}update(i,[t]){if(t===r||t===e)return t;const o=i.element,l=i.name;if(i.type===n.PROPERTY){if(t===o[l])return r}else if(i.type===n.BOOLEAN_ATTRIBUTE){if(!!t===o.hasAttribute(l))return r}else if(i.type===n.ATTRIBUTE&&o.getAttribute(l)===t+\"\")return r;return s(i),t}});export{l as live};\n//# sourceMappingURL=live.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","import { nothing } from 'lit';\nimport type { CellContent } from '../types.js';\n\n/** Turns header or cell content into a Lit child. */\nexport function toChild(content: CellContent | null | undefined): unknown {\n if (content === null || content === undefined) return nothing;\n return typeof content === 'number' ? String(content) : content;\n}\n\n/** Default cell text for an accessor value. */\nexport function formatValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (value instanceof Date) return value.toLocaleString();\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- objects are handled above\n return typeof value === 'object' ? JSON.stringify(value) : String(value);\n}\n\n/**\n * Private slot names (ADR 0001): cells by row pool slot and column slot,\n * headers by column slot, pinned rows by side, index and column slot. A\n * column's slot is its `colIndex`, or its pool slot with `virtualizeColumns`.\n */\nexport const cellSlot = (slot: number, colSlot: number) => `c-${String(slot)}-${String(colSlot)}`;\nexport const headerSlot = (colSlot: number) => `h-${String(colSlot)}`;\nexport const pinnedSlot = (side: 'top' | 'bottom', index: number, colSlot: number) =>\n `${side === 'top' ? 't' : 'b'}-${String(index)}-${String(colSlot)}`;\n\ninterface Pinnable {\n pin: 'start' | 'end' | undefined;\n pinEdge: boolean;\n}\n\n/**\n * Part list of a body or pinned-row cell: state is in the part name (`::part()`\n * can't take attribute selectors).\n */\nexport function cellParts(\n column: Pinnable & { sorted: 'asc' | 'desc' | false; kind: 'data' | 'selection' },\n pinnedRow = false,\n): string {\n let parts = pinnedRow ? 'cell cell-pinned-row' : 'cell';\n if (column.kind === 'selection') parts += ' cell-selection';\n if (column.pin) parts += column.pinEdge ? ' cell-pinned cell-pinned-edge' : ' cell-pinned';\n if (column.sorted) parts += ' cell-sorted';\n return parts;\n}\n\n/** Handlers of the selection checkboxes (`selectionCheckboxes`). */\nexport interface CheckboxHandlers {\n /** A row's checkbox; it carries the row index in `data-row`. */\n row: (event: MouseEvent) => void;\n /** The header's select-all checkbox. */\n all: (event: MouseEvent) => void;\n /** A press on any of them: keeps focus on its cell, not the checkbox. */\n press: (event: MouseEvent) => void;\n}\n\n/** `aria-sort` for a header: only the sorted column carries it (WAI-ARIA APG). */\nexport function ariaSort(sorted: 'asc' | 'desc' | false): 'ascending' | 'descending' | undefined {\n if (!sorted) return undefined;\n return sorted === 'asc' ? 'ascending' : 'descending';\n}\n\n/**\n * Inline style of a cell or header: a pinned one's sticky inset, from the\n * start or the end edge, and with `virtualizeColumns` the grid cell it is\n * placed in. Cells are in pool order there, not in column order, so the row is\n * explicit too: auto-placement would wrap a cell that comes after one of a\n * later column into a new grid row.\n */\nexport function cellStyle(\n column: Pinnable & { offset: number; place: number | undefined },\n): string | undefined {\n const pin = column.pin ? `--_pin-offset: ${String(column.offset)}px` : undefined;\n if (column.place === undefined) return pin;\n const place = `grid-area: 1 / ${String(column.place)}`;\n return pin ? `${pin}; ${place}` : place;\n}\n","import { html, nothing } from 'lit';\nimport { live } from 'lit/directives/live.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport type { RowState } from '@argus-table/core';\nimport type { RenderedColumn } from '../controllers/column-window.js';\nimport type { WindowRow } from '../controllers/virtual-controller.js';\nimport { cellParts, cellSlot, cellStyle, type CheckboxHandlers } from './content.js';\n\ntype Columns<T> = readonly RenderedColumn<T>[];\n\n/** The cell holding the grid's tab stop: a row index and a column id. */\nexport interface ActiveCell {\n index: number;\n col: string;\n}\n\n/** Row loading state for `dataSource` tables. */\nexport interface Loading {\n /** Whether a row's data is loaded, still loading, or its page failed. */\n stateAt(index: number): RowState;\n /** Rows that show a Retry button (one per failed page in view), with its accessible label. */\n retry: ReadonlyMap<number, string>;\n /** Click handler of the Retry buttons; the button carries the row index in `data-row`. */\n onRetry: (event: Event) => void;\n}\n\n/**\n * Whether the row at an index is selected; `undefined` when it can't be\n * selected (selection is off, or the row hasn't loaded).\n */\nexport type SelectedAt = (index: number) => boolean | undefined;\n\n/**\n * The virtualized body. Rows are keyed by pool slot, so a row entering the window\n * reuses the DOM of one that left (ADR 0001), and they stay in pool order: screen\n * readers get the position from `aria-rowindex`. `firstRowIndex` is the\n * `aria-rowindex` of row 0: after the header and the rows pinned to the top.\n * `inset`: rows of different heights (`rowHeight: 'auto'`) are placed with\n * `inset-block-start` and render at least their measured `size`, which is on\n * the controller's px grid, so they stay flush however far down they are.\n */\nexport function renderBody<T>(\n rows: readonly WindowRow[],\n columns: Columns<T>,\n totalSize: number,\n active: ActiveCell | undefined,\n firstRowIndex: number,\n loading?: Loading,\n selectedAt?: SelectedAt,\n checkboxes?: CheckboxHandlers,\n inset = false,\n) {\n return html`<div\n part=\"body\"\n role=\"rowgroup\"\n style=${styleMap({ blockSize: `${String(totalSize)}px` })}\n >\n ${repeat(\n rows,\n (r) => r.slot,\n (r) =>\n renderRow(\n r,\n columns,\n r.index === active?.index ? active.col : undefined,\n firstRowIndex,\n loading,\n selectedAt?.(r.index),\n checkboxes,\n inset,\n ),\n )}\n </div>`;\n}\n\n/**\n * One body row. Every cell is focusable (`tabindex=-1`) so clicks focus it; the\n * active one is the grid's single tab stop (roving tabindex). A row whose data\n * isn't loaded shows skeleton bars, and a Retry button if its page failed.\n * `selected` is `undefined` for a row that can't be selected: it then has no\n * `aria-selected`, and no checkbox in the selection column.\n */\nfunction renderRow<T>(\n row: WindowRow,\n columns: Columns<T>,\n activeCol: string | undefined,\n firstRowIndex: number,\n loading: Loading | undefined,\n selected: boolean | undefined,\n checkboxes: CheckboxHandlers | undefined,\n inset: boolean,\n) {\n const state = loading?.stateAt(row.index) ?? 'loaded';\n let parts = row.index % 2 === 0 ? 'row row-even' : 'row row-odd';\n if (state !== 'loaded') parts += ' row-loading';\n if (selected) parts += ' row-selected';\n const retry = state === 'error' ? loading?.retry.get(row.index) : undefined;\n // The Retry button goes in the first data column, after a selection column.\n const retryCol = firstDataColumn(columns);\n return html`<div\n part=${parts}\n class=\"row\"\n role=\"row\"\n aria-rowindex=${row.index + firstRowIndex}\n aria-busy=${state === 'loading' ? 'true' : nothing}\n aria-selected=${selected === undefined ? nothing : String(selected)}\n style=${styleMap(\n inset\n ? {\n insetBlockStart: `${String(row.start)}px`,\n minBlockSize: row.size === undefined ? undefined : `${String(row.size)}px`,\n }\n : { transform: `translateY(${String(row.start)}px)` },\n )}\n >\n ${repeat(\n columns,\n (c) => c.key,\n (c) =>\n renderCell(\n c,\n c.id === activeCol,\n cellSlot(row.slot, c.slot),\n false,\n c.kind === 'selection'\n ? rowCheckbox(row.index, selected, checkboxes)\n : placeholder(state, c.id === retryCol ? retry : undefined, row.index, loading),\n ),\n )}\n </div>`;\n}\n\n/**\n * A body or pinned-row cell. Every cell is focusable (`tabindex=-1`) so clicks\n * focus it; `tabStop` marks the grid's single tab stop. `before` goes ahead of\n * the slot (a loading row's skeleton bar or Retry button).\n */\nexport function renderCell<T>(\n c: RenderedColumn<T>,\n tabStop: boolean,\n slot: string,\n pinnedRow: boolean,\n before: unknown = nothing,\n) {\n return html`<div\n part=${cellParts(c, pinnedRow)}\n role=\"gridcell\"\n aria-colindex=${c.colIndex}\n tabindex=${tabStop ? 0 : -1}\n data-col=${c.id}\n data-align=${c.align}\n data-wrap=${c.wrap ? '' : nothing}\n data-pin=${c.pin ?? nothing}\n style=${cellStyle(c) ?? nothing}\n >\n ${before}<slot name=${slot}></slot>\n </div>`;\n}\n\n/**\n * The id of the leftmost rendered data column (in reading order). Rendered\n * columns are in pool order with `virtualizeColumns`.\n */\nfunction firstDataColumn<T>(columns: Columns<T>): string | undefined {\n let first: RenderedColumn<T> | undefined;\n for (const c of columns) {\n if (c.kind === 'data' && (!first || c.colIndex < first.colIndex)) first = c;\n }\n return first?.id;\n}\n\n/**\n * A row's checkbox in the selection column, for a row that can be selected.\n * It isn't focusable: the cell holds focus. `live()` keeps it showing the\n * selection when a controlled host turns a change down.\n */\nfunction rowCheckbox(\n index: number,\n selected: boolean | undefined,\n checkboxes: CheckboxHandlers | undefined,\n) {\n if (selected === undefined || !checkboxes) return nothing;\n return html`<input\n type=\"checkbox\"\n part=\"selection-checkbox\"\n tabindex=\"-1\"\n aria-label=\"Select row\"\n data-row=${index}\n .checked=${live(selected)}\n @click=${checkboxes.row}\n @mousedown=${checkboxes.press}\n />`;\n}\n\n/** What an unloaded cell shows: a skeleton bar, or the Retry button in a failed page's first cell. */\nfunction placeholder(\n state: RowState,\n retryLabel: string | undefined,\n index: number,\n loading: Loading | undefined,\n) {\n if (state === 'loaded') return nothing;\n if (retryLabel !== undefined && loading) {\n return html`<button\n part=\"retry\"\n type=\"button\"\n tabindex=\"-1\"\n data-row=${index}\n aria-label=${retryLabel}\n @click=${loading.onRetry}\n >\n Retry\n </button>`;\n }\n return html`<div\n part=${state === 'error' ? 'skeleton skeleton-error' : 'skeleton'}\n aria-hidden=\"true\"\n ></div>`;\n}\n","import{isSingleExpression as i}from\"./directive-helpers.js\";import{Directive as t,PartType as e}from\"./directive.js\";export{directive}from\"./directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=(i,t)=>{const e=i._$AN;if(void 0===e)return!1;for(const i of e)i._$AO?.(t,!1),s(i,t);return!0},o=i=>{let t,e;do{if(void 0===(t=i._$AM))break;e=t._$AN,e.delete(i),i=t}while(0===e?.size)},r=i=>{for(let t;t=i._$AM;i=t){let e=t._$AN;if(void 0===e)t._$AN=e=new Set;else if(e.has(i))break;e.add(i),c(t)}};function h(i){void 0!==this._$AN?(o(this),this._$AM=i,r(this)):this._$AM=i}function n(i,t=!1,e=0){const r=this._$AH,h=this._$AN;if(void 0!==h&&0!==h.size)if(t)if(Array.isArray(r))for(let i=e;i<r.length;i++)s(r[i],!1),o(r[i]);else null!=r&&(s(r,!1),o(r));else s(this,i)}const c=i=>{i.type==e.CHILD&&(i._$AP??=n,i._$AQ??=h)};class f extends t{constructor(){super(...arguments),this._$AN=void 0}_$AT(i,t,e){super._$AT(i,t,e),r(this),this.isConnected=i._$AU}_$AO(i,t=!0){i!==this.isConnected&&(this.isConnected=i,i?this.reconnected?.():this.disconnected?.()),t&&(s(this,i),o(this))}setValue(t){if(i(this._$Ct))this._$Ct._$AI(t,this);else{const i=[...this._$Ct._$AH];i[this._$Ci]=t,this._$Ct._$AI(i,this,0)}}disconnected(){}reconnected(){}}export{f as AsyncDirective,t as Directive,e as PartType};\n//# sourceMappingURL=async-directive.js.map\n","import { nothing, type ChildPart } from 'lit';\nimport { AsyncDirective, directive, PartType, type PartInfo } from 'lit/async-directive.js';\nimport { toChild } from './content.js';\nimport type { CellContent } from '../types.js';\n\n/**\n * Renders content the table doesn't render itself, such as React elements, Vue\n * VNodes or Angular templates, into a target element the table keeps. Set it as the\n * table's `contentRenderer`; the framework wrappers do.\n */\nexport interface ContentRenderer {\n /**\n * Renders `content` into `target`, or updates what is there. Called on every update\n * for each header and cell showing foreign content. A target is reused: when the\n * table scrolls, the same target shows other rows.\n */\n render(target: HTMLElement, content: unknown): void;\n /**\n * `target` shows no foreign content any more: its cell scrolled away and wasn't\n * reused, its row isn't loaded, its column left, or the table was disconnected.\n * Unmount what `render` put there.\n */\n release(target: HTMLElement): void;\n /**\n * Called once after each update in which `render` or `release` ran, before the\n * table measures content (`width: 'auto'`). Commit batched work here, synchronously.\n */\n flush?(): void;\n}\n\n/** What the directive reads from the table it renders into. */\ninterface ContentHost {\n readonly contentRenderer?: ContentRenderer | undefined;\n}\n\n/** Renderers that rendered or released since the last flush, per table. */\nconst dirty = new WeakMap<object, Set<ContentRenderer>>();\nlet warned = false;\n\nfunction markDirty(host: object, renderer: ContentRenderer): void {\n let set = dirty.get(host);\n if (!set) dirty.set(host, (set = new Set()));\n set.add(renderer);\n}\n\n/** Calls `flush()` on the renderers that rendered or released for `host` since the last call. */\nexport function flushContent(host: object): void {\n const set = dirty.get(host);\n if (!set?.size) return;\n const renderers = [...set];\n set.clear();\n for (const renderer of renderers) renderer.flush?.();\n}\n\n/**\n * Whether the table renders `value` itself: strings, numbers, Lit templates and\n * directive results, DOM nodes, `nothing` and empty values, and arrays of those.\n * Anything else is foreign: it goes to the `contentRenderer`.\n */\nexport function isForeign(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n if (Array.isArray(value)) return value.some(isForeign);\n if (value instanceof Node) return false;\n return !('_$litType$' in value) && !('_$litDirective$' in value);\n}\n\n/**\n * Header and cell content. Foreign content renders through the table's\n * `contentRenderer` into a target element kept while this part lives, so a pooled\n * cell updates its framework content in place as it shows other rows.\n */\nclass ContentDirective extends AsyncDirective {\n #target: HTMLElement | undefined;\n /** The renderer that rendered into the target, and the table it belongs to. */\n #renderer: ContentRenderer | undefined;\n #host: object | undefined;\n /** The last foreign content, rendered again on reconnect. */\n #content: unknown;\n\n constructor(part: PartInfo) {\n super(part);\n if (part.type !== PartType.CHILD) {\n throw new Error('argus-table: content() only works in child positions.');\n }\n }\n\n render(value: unknown): unknown {\n return isForeign(value) ? nothing : toChild(value as CellContent | null | undefined);\n }\n\n override update(part: ChildPart, [value]: [unknown]): unknown {\n if (!isForeign(value)) {\n this.#release();\n this.#content = undefined;\n return this.render(value);\n }\n const host = part.options?.host;\n const renderer = (host as ContentHost | undefined)?.contentRenderer;\n if (!host || !renderer) {\n this.#release();\n if (!warned) {\n warned = true;\n console.warn(\n 'argus-table: a header or cell returned content the table can’t render (set contentRenderer, or use a framework wrapper).',\n );\n }\n return nothing;\n }\n if (renderer !== this.#renderer) this.#release();\n const target = (this.#target ??= targetElement());\n this.#renderer = renderer;\n this.#host = host;\n this.#content = value;\n renderer.render(target, value);\n markDirty(host, renderer);\n return target;\n }\n\n protected override disconnected(): void {\n const content = this.#content;\n this.#release();\n // Kept for reconnected(): the part is the same, and so is its content.\n this.#content = content;\n }\n\n protected override reconnected(): void {\n const host = this.#host;\n const renderer = (host as ContentHost | undefined)?.contentRenderer;\n if (!host || !renderer || this.#content === undefined || !this.#target) return;\n this.#renderer = renderer;\n renderer.render(this.#target, this.#content);\n markDirty(host, renderer);\n }\n\n #release(): void {\n const renderer = this.#renderer;\n const host = this.#host;\n if (!renderer || !host || !this.#target) return;\n this.#renderer = undefined;\n renderer.release(this.#target);\n markDirty(host, renderer);\n }\n}\n\n/** A target: invisible to layout, so the content lays out as the cell's own. */\nfunction targetElement(): HTMLElement {\n const target = document.createElement('div');\n target.className = 'argus-content';\n target.style.display = 'contents';\n return target;\n}\n\n/**\n * Header or cell content for a template of your own. The table renders what\n * `header` and `cell` return through it already; a plugin that nests a column's\n * content in its own template (`html\\`<b>${content(own)}</b>\\``) wraps it, so\n * framework content (React elements, Vue VNodes) still reaches the\n * `contentRenderer`. Only in templates the table renders.\n */\nexport const content = directive(ContentDirective);\n","import { html, render, type RootPart } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { ColumnView, RowPin, TableModel } from '@argus-table/core';\nimport type { RenderedColumn } from '../controllers/column-window.js';\nimport type { WindowRow } from '../controllers/virtual-controller.js';\nimport type { CellContent } from '../types.js';\nimport { cellSlot, formatValue, headerSlot, pinnedSlot } from './content.js';\nimport { content } from './content-directive.js';\n\ntype Column<T> = ColumnView<T, CellContent>;\n\n/**\n * Renders header and cell content into the host's light DOM, as direct children\n * (a slot only takes the host's own children). Keyed and ordered by pool slot,\n * so recycled content updates in place instead of moving (ADR 0001). The part\n * ends at `renderBefore`, so the host's other children (`<argus-column>`) stay\n * outside it, wherever they are added. `rendered` are the columns the shadow\n * root renders, with their slots and keys. What `header` and `cell` return goes\n * through `content()`, so foreign content reaches the table's `contentRenderer`.\n * Returns the part, which the table disconnects when it is disconnected.\n */\nexport function renderLightDom<T>(\n host: HTMLElement,\n model: TableModel<T, CellContent>,\n rows: readonly WindowRow[],\n rendered: readonly RenderedColumn<T>[],\n renderBefore: ChildNode,\n): RootPart {\n // The selection column renders its checkboxes in the shadow root: no content here.\n const columns = rendered.filter((c) => c.kind === 'data');\n return render(\n html`${repeat(\n columns,\n (c) => c.key,\n (c) => html`<div slot=${headerSlot(c.slot)}>${headerContent(c)}</div>`,\n )}${pinnedContent(model, columns, 'top')}${repeat(\n rows,\n (r) => r.slot,\n (r) =>\n repeat(\n columns,\n (c) => c.key,\n (c) =>\n html`<div slot=${cellSlot(r.slot, c.slot)}>${cellContent(model, r.index, c)}</div>`,\n ),\n )}${pinnedContent(model, columns, 'bottom')}`,\n host,\n { host, renderBefore },\n );\n}\n\nfunction headerContent<T>(column: Column<T>): unknown {\n const { header } = column;\n return content(typeof header === 'function' ? header() : header);\n}\n\n/** Content of the rows pinned to one side, slotted by side, index and column. */\nfunction pinnedContent<T>(\n model: TableModel<T, CellContent>,\n columns: readonly RenderedColumn<T>[],\n side: RowPin,\n) {\n const rows = Array.from({ length: model.pinnedCount(side) }, (_, i) => i);\n return rows.map((i) =>\n repeat(\n columns,\n (c) => c.key,\n (c) => html`<div slot=${pinnedSlot(side, i, c.slot)}>${pinnedCell(model, side, i, c)}</div>`,\n ),\n );\n}\n\nfunction pinnedCell<T>(\n model: TableModel<T, CellContent>,\n side: RowPin,\n index: number,\n column: Column<T>,\n) {\n if (column.cell) {\n const context = model.pinnedCellContext(side, index, column.id);\n return context ? content(column.cell(context.row, context)) : '';\n }\n return column.hasAccessor ? formatValue(model.pinnedValueAt(side, index, column.id)) : '';\n}\n\nfunction cellContent<T>(model: TableModel<T, CellContent>, index: number, column: Column<T>) {\n if (column.cell) {\n const context = model.cellContext(index, column.id);\n return context ? content(column.cell(context.row, context)) : '';\n }\n return column.hasAccessor ? formatValue(model.valueAt(index, column.id)) : '';\n}\n","import { html, nothing } from 'lit';\nimport { live } from 'lit/directives/live.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { RenderedColumn } from '../controllers/column-window.js';\nimport type { DropTarget } from '../controllers/reorder-drag.js';\nimport { ariaSort, cellStyle, headerSlot, type CheckboxHandlers } from './content.js';\n\n/** A column header being dragged, and where it would land (`undefined`: where it is). */\nexport interface HeaderDrag {\n columnId: string;\n target: DropTarget | undefined;\n}\n\nexport interface HeaderHandlers {\n click: (event: MouseEvent) => void;\n pointerdown: (event: PointerEvent) => void;\n dblclick: (event: MouseEvent) => void;\n}\n\n/**\n * The select-all checkbox in the selection column's header, with\n * `selectionMode` `'multi'`: checked when every selectable row is, mixed when\n * some are.\n */\nexport interface CheckAll {\n state: 'all' | 'some' | 'none';\n handlers: CheckboxHandlers;\n}\n\n/**\n * The sticky header row. Header content is slotted from the light DOM. Pinned\n * header cells use the same private `data-pin` hooks as body cells, but no parts.\n * Every header carries `data-col` (its column id) and sortable ones also\n * `data-sort-col`; the element's delegated handlers read them. Headers take part\n * in the grid's roving tabindex: the active one is the tab stop (`activeCol`).\n * Resizable columns get a `resize-handle` on the header's inline-end edge; a\n * double-click on it fits the column to its content. It is not focusable: the\n * focused header resizes with Alt+Arrow.\n *\n * Reorderable columns carry `data-move-col`: a drag on the header moves the\n * column. While one is dragged (`drag`), its header adds `header-cell-dragging`\n * and the target header shows a `drop-indicator` on the edge it would land at.\n */\nexport function renderHeader<T>(\n columns: readonly RenderedColumn<T>[],\n handlers: HeaderHandlers,\n activeCol: string | undefined,\n drag?: HeaderDrag,\n checkAll?: CheckAll,\n) {\n return html`<div part=\"header\" role=\"rowgroup\">\n <div\n part=\"header-row\"\n class=\"row\"\n role=\"row\"\n aria-rowindex=\"1\"\n @click=${handlers.click}\n @pointerdown=${handlers.pointerdown}\n @dblclick=${handlers.dblclick}\n >\n ${repeat(\n columns,\n (c) => c.key,\n (c) =>\n html`<div\n part=${headerParts(c, drag)}\n role=\"columnheader\"\n aria-colindex=${c.colIndex}\n aria-sort=${ariaSort(c.sorted) ?? nothing}\n aria-description=${c.filtered ? 'Filtered' : nothing}\n data-col=${c.id}\n data-sort-col=${c.sortable ? c.id : nothing}\n data-move-col=${c.reorderable ? c.id : nothing}\n tabindex=${c.id === activeCol ? 0 : -1}\n data-align=${c.align}\n data-pin=${c.pin ?? nothing}\n style=${cellStyle(c) ?? nothing}\n >\n ${\n c.kind === 'selection'\n ? selectAllCheckbox(checkAll)\n : html`<slot name=${headerSlot(c.slot)}></slot>`\n }\n ${c.sortable ? html`<span class=\"sort-indicator\" aria-hidden=\"true\"></span>` : nothing}\n ${c.filtered ? html`<span part=\"filter-indicator\" aria-hidden=\"true\"></span>` : nothing}\n ${c.resizable ? resizeHandle(c) : nothing}\n ${\n drag?.target?.columnId === c.id\n ? html`<span\n part=\"drop-indicator\"\n data-edge=${drag.target.edge}\n aria-hidden=\"true\"\n ></span>`\n : nothing\n }\n </div>`,\n )}\n </div>\n </div>`;\n}\n\nfunction headerParts<T>(c: RenderedColumn<T>, drag: HeaderDrag | undefined): string {\n let parts = c.sorted ? 'header-cell header-cell-sorted' : 'header-cell';\n if (c.filtered) parts += ' header-cell-filtered';\n if (c.kind === 'selection') parts += ' header-cell-selection';\n if (drag?.columnId === c.id) parts += ' header-cell-dragging';\n return parts;\n}\n\n/** The header's select-all checkbox: not focusable, like the rows' (the header cell holds focus). */\nfunction selectAllCheckbox(checkAll: CheckAll | undefined) {\n if (!checkAll) return nothing;\n return html`<input\n type=\"checkbox\"\n part=\"selection-checkbox\"\n tabindex=\"-1\"\n aria-label=\"Select all rows\"\n .checked=${live(checkAll.state === 'all')}\n .indeterminate=${live(checkAll.state === 'some')}\n @click=${checkAll.handlers.all}\n @mousedown=${checkAll.handlers.press}\n />`;\n}\n\n/**\n * A vertical separator with the column's width as its value. A flex column has no\n * fixed width until it is resized, so it reports none.\n */\nfunction resizeHandle<T>(c: RenderedColumn<T>) {\n return html`<div\n part=\"resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize column\"\n aria-valuenow=${c.flex === undefined ? Math.round(c.width) : nothing}\n aria-valuemin=${c.minWidth}\n aria-valuemax=${Number.isFinite(c.maxWidth) ? c.maxWidth : nothing}\n data-resize-col=${c.id}\n ></div>`;\n}\n","import { html, nothing } from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { RowPin } from '@argus-table/core';\nimport type { RenderedColumn } from '../controllers/column-window.js';\nimport { renderCell, type ActiveCell } from './body.js';\nimport { pinnedSlot } from './content.js';\n\n/**\n * The rows pinned to one side: a sticky row group below the header (`top`) or\n * at the bottom of the view (`bottom`). They are few and never recycled, so\n * they aren't pooled; content is slotted from the light DOM like body cells.\n * Cells take part in the grid's roving tabindex (`active.index` is the row's\n * index in its list). `firstRowIndex` is the `aria-rowindex` of the first row.\n */\nexport function renderPinnedRows<T>(\n side: RowPin,\n count: number,\n columns: readonly RenderedColumn<T>[],\n firstRowIndex: number,\n active: ActiveCell | undefined,\n) {\n if (count === 0) return nothing;\n const rows = Array.from({ length: count }, (_, i) => i);\n return html`<div class=\"pinned\" data-side=${side} role=\"rowgroup\">\n ${rows.map(\n (i) =>\n html`<div\n part=${`row row-pinned row-pinned-${side}`}\n class=\"row\"\n role=\"row\"\n aria-rowindex=${firstRowIndex + i}\n >\n ${repeat(\n columns,\n (c) => c.key,\n (c) =>\n renderCell(\n c,\n active?.index === i && c.id === active.col,\n pinnedSlot(side, i, c.slot),\n true,\n ),\n )}\n </div>`,\n )}\n </div>`;\n}\n","import { css } from 'lit';\n\n/**\n * Base styles. Everything sits in `@layer argus-base`, and every value reads a\n * public token with a neutral fallback, so themes and page CSS always win.\n * `--_*` properties are private.\n */\nexport const baseStyles = css`\n @layer argus-base {\n :host {\n display: block;\n /* A table that virtualizes needs a bounded height; set your own on the element. */\n block-size: 400px;\n box-sizing: border-box;\n contain: content;\n color-scheme: light dark;\n color: var(--argus-fg, CanvasText);\n background: var(--argus-bg, Canvas);\n font: var(--argus-font, inherit);\n /* contain: content clips the header, rows and pinned shadows to the rounded corners. */\n border: var(--argus-outline, none);\n border-radius: var(--argus-radius, 0);\n --_row-height: var(--argus-row-height, 40px);\n --_pad: var(--argus-cell-padding-inline, 12px);\n --_border: var(--argus-border-width, 1px) solid\n var(--argus-border-color, light-dark(#e5e7eb, #374151));\n /* 1 in LTR, -1 in RTL: mirrors the pinned-edge shadow. */\n --_dir: 1;\n }\n :host(:dir(rtl)) {\n --_dir: -1;\n }\n :host([density='compact']) {\n --_row-height: var(--argus-row-height, 32px);\n --_pad: var(--argus-cell-padding-inline, 8px);\n }\n :host([density='spacious']) {\n --_row-height: var(--argus-row-height, 52px);\n --_pad: var(--argus-cell-padding-inline, 16px);\n }\n :host([hidden]) {\n display: none;\n }\n\n [part~='table'] {\n position: relative;\n block-size: 100%;\n overflow: auto;\n overscroll-behavior: contain;\n }\n\n /*\n * A cell focused or moved to by keyboard scrolls clear of the sticky header, the\n * pinned rows and the pinned columns: scroll margins on the cells that scroll.\n * Not scroll padding on the scroller: Chromium and WebKit measure the sticky\n * header and pinned rows against it too, so focusing one of them (a click, Tab,\n * an arrow key) scrolled the body.\n */\n [part~='body'] > .row > [role='gridcell'] {\n scroll-margin-block: calc((1 + var(--_pin-top-rows, 0)) * var(--_row-height))\n calc(var(--_pin-bottom-rows, 0) * var(--_row-height));\n }\n [role='gridcell']:not([data-pin]),\n [role='columnheader']:not([data-pin]) {\n scroll-margin-inline: var(--_pin-start, 0) var(--_pin-end, 0);\n }\n\n .row {\n display: grid;\n grid-template-columns: var(--_cols);\n inline-size: var(--_width);\n min-inline-size: 100%;\n block-size: var(--_row-height);\n box-sizing: border-box;\n }\n\n [part~='header'] {\n position: sticky;\n inset-block-start: 0;\n z-index: 2;\n }\n\n [part~='body'] {\n position: relative;\n contain: layout;\n }\n [part~='body'] > .row {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n [part~='row'] {\n --_row-bg: var(--argus-bg, Canvas);\n --_row-surface: var(--_row-bg);\n background: var(--_row-surface);\n }\n [part~='row-odd'] {\n --_row-bg: var(--argus-row-stripe-bg, var(--argus-bg, Canvas));\n }\n [part~='row']:hover {\n --_row-surface: var(--argus-row-hover-bg, var(--_row-bg));\n }\n /* Selected wins over stripes and hover. */\n [part~='row-selected'],\n [part~='row-selected']:hover {\n --_row-bg: var(\n --argus-row-selected-bg,\n color-mix(in srgb, Highlight 22%, var(--argus-bg, Canvas))\n );\n --_row-surface: var(--_row-bg);\n }\n @media (forced-colors: active) {\n [part~='row-selected'] {\n forced-color-adjust: none;\n --_row-bg: Highlight;\n color: HighlightText;\n }\n }\n\n /*\n * Pinned rows: a sticky row group below the header and one at the bottom of\n * the view. The header is one row tall. They keep their place in the flow,\n * so body row i still starts i rows below the top group.\n */\n .pinned {\n position: sticky;\n z-index: 2;\n }\n .pinned[data-side='top'] {\n inset-block-start: var(--_row-height);\n }\n .pinned[data-side='bottom'] {\n inset-block-end: 0;\n }\n [part~='row-pinned'] {\n --_row-bg: var(--argus-pinned-row-bg, var(--argus-bg, Canvas));\n }\n\n [part~='cell'],\n [part~='header-cell'] {\n display: flex;\n align-items: center;\n min-inline-size: 0;\n box-sizing: border-box;\n padding-inline: var(--_pad);\n overflow: hidden;\n white-space: nowrap;\n border-block-end: var(--_border);\n }\n /* The checkbox column: the checkbox centred, no padding to squeeze it. */\n [part~='cell-selection'],\n [part~='header-cell-selection'] {\n justify-content: center;\n padding-inline: 0;\n }\n [part~='selection-checkbox'] {\n margin: 0;\n cursor: pointer;\n }\n [part~='header-cell'] {\n background: var(--argus-header-bg, light-dark(#f9fafb, #111827));\n color: var(--argus-header-fg, inherit);\n font-weight: 600;\n }\n [part~='header-cell'] {\n position: relative;\n }\n [part~='resize-handle'] {\n position: absolute;\n inset-block: 0;\n inset-inline-end: 0;\n inline-size: 8px;\n z-index: 1;\n cursor: col-resize;\n touch-action: none;\n }\n [part~='resize-handle']::after {\n content: '';\n position: absolute;\n inset-block: 25%;\n inset-inline-end: 0;\n inline-size: 2px;\n background: var(--argus-resize-handle-color, light-dark(#9ca3af, #6b7280));\n opacity: 0;\n }\n [part~='header-cell']:hover [part~='resize-handle']::after,\n [part~='header-cell']:focus-visible [part~='resize-handle']::after,\n [part~='resize-handle'][data-active]::after {\n opacity: 1;\n }\n [data-sort-col] {\n cursor: pointer;\n user-select: none;\n }\n /* A drag on a reorderable header moves the column, so its text isn't selectable. */\n [data-move-col] {\n user-select: none;\n }\n [data-dragging],\n [data-dragging] [part~='header-cell'] {\n cursor: grabbing;\n }\n [part~='header-cell-dragging'] {\n opacity: 0.5;\n }\n /* The line where a dragged column would land, on the target header's logical edge. */\n [part~='drop-indicator'] {\n position: absolute;\n inset-block: 0;\n inline-size: 2px;\n z-index: 2;\n background: var(--argus-drop-indicator-color, Highlight);\n pointer-events: none;\n }\n [part~='drop-indicator'][data-edge='start'] {\n inset-inline-start: 0;\n }\n [part~='drop-indicator'][data-edge='end'] {\n inset-inline-end: 0;\n }\n [part~='header-cell']:focus-visible,\n [part~='cell']:focus-visible {\n outline: var(--argus-focus-ring, 2px solid Highlight);\n outline-offset: -2px;\n }\n /* A small chevron after the header content; only the sorted column shows it. */\n .sort-indicator {\n flex: none;\n inline-size: 0.35em;\n block-size: 0.35em;\n margin-inline-start: 0.4em;\n /* Physical sides on purpose: the chevron is rotated, so it must not mirror in RTL. */\n border-right: 0.12em solid currentColor;\n border-bottom: 0.12em solid currentColor;\n visibility: hidden;\n }\n [aria-sort] .sort-indicator {\n visibility: visible;\n }\n [aria-sort='ascending'] .sort-indicator {\n transform: translateY(0.1em) rotate(-135deg);\n }\n [aria-sort='descending'] .sort-indicator {\n transform: translateY(-0.1em) rotate(45deg);\n }\n [data-align='end'] .sort-indicator {\n order: -1;\n margin-inline: 0 0.4em;\n }\n /* A funnel: the column is filtered. */\n [part~='filter-indicator'] {\n flex: none;\n inline-size: 0.7em;\n block-size: 0.7em;\n margin-inline-start: 0.35em;\n background: var(--argus-filter-indicator-color, currentColor);\n clip-path: polygon(0 0, 100% 0, 62% 48%, 62% 100%, 38% 82%, 38% 48%);\n }\n [data-align='end'] [part~='filter-indicator'] {\n order: -2;\n margin-inline: 0 0.35em;\n }\n @media (forced-colors: active) {\n /* Backgrounds are forced to Canvas there, which would hide the funnel. */\n [part~='filter-indicator'] {\n forced-color-adjust: none;\n background: CanvasText;\n }\n }\n /*\n * Pinned columns: sticky inside the scroll container, with offsets from the\n * table model. Logical insets make RTL work without extra rules.\n */\n [data-pin] {\n position: sticky;\n z-index: 1;\n }\n [data-pin='start'] {\n inset-inline-start: var(--_pin-offset);\n }\n [data-pin='end'] {\n inset-inline-end: var(--_pin-offset);\n }\n /*\n * Pinned body cells are sticky only while the table scrolls sideways\n * (data-hscroll on the scroller). At rest they are plain cells shifted by the\n * horizontal scroll offset, which vertical scrolling never changes: a sticky\n * cell per row is a compositing layer each, and Safari stutters moving them\n * (PinScrollController). Both place the cells at the same spot.\n */\n [part~='row'] > [data-pin] {\n position: relative;\n inset-inline: auto;\n }\n [part~='row'] > [data-pin='start'] {\n transform: translateX(var(--_sx, 0px));\n }\n [part~='row'] > [data-pin='end'] {\n transform: translateX(calc(var(--_sx, 0px) - var(--_dir) * var(--_max-x, 0px)));\n }\n [data-hscroll] [part~='row'] > [data-pin] {\n position: sticky;\n transform: none;\n }\n [data-hscroll] [part~='row'] > [data-pin='start'] {\n inset-inline-start: var(--_pin-offset);\n }\n [data-hscroll] [part~='row'] > [data-pin='end'] {\n inset-inline-end: var(--_pin-offset);\n }\n [part~='cell-pinned'] {\n background: var(--_row-surface);\n }\n /*\n * The edge shadow, once per pinned side (.pin-shadow, beside the scroller).\n * --argus-pinned-shadow is written for a shadow falling toward the end side;\n * the start edge in RTL and the end edge in LTR mirror it.\n */\n .pin-shadow {\n position: absolute;\n inset-block-start: 0;\n block-size: min(var(--_view-h, 100%), var(--_content-h, 100%));\n z-index: 3;\n pointer-events: none;\n }\n .pin-shadow[data-side='start'] {\n inset-inline-start: 0;\n }\n .pin-shadow[data-side='end'] {\n inset-inline-end: var(--_sb-x, 0px);\n }\n .pin-shadow::after {\n content: '';\n position: absolute;\n inset: 0;\n box-shadow: var(\n --argus-pinned-shadow,\n 4px 0 6px -4px light-dark(rgb(0 0 0 / 0.2), rgb(0 0 0 / 0.6))\n );\n transform: scaleX(var(--_dir));\n }\n .pin-shadow[data-side='end']::after {\n transform: scaleX(calc(-1 * var(--_dir)));\n }\n\n [data-align='center'] {\n justify-content: center;\n text-align: center;\n }\n [data-align='end'] {\n justify-content: flex-end;\n text-align: end;\n }\n /*\n * Wrapped text (ColumnDef.wrap). In a fixed-height row, text taller than the row\n * starts at the top (safe) and is clipped below.\n */\n [part~='cell'][data-wrap] {\n white-space: normal;\n overflow-wrap: anywhere;\n align-items: center;\n align-items: safe center;\n }\n\n /*\n * rowHeight: 'auto'. Body and pinned rows fit their content, at least one row\n * tall; the header keeps its height. Content sits at the top of the cell, with\n * the block padding that centres one line in a one-row cell, so one-line rows\n * look as they do with a fixed height. The rows' heights are measured and\n * placed by the table: the browser's scroll anchoring would fight it.\n */\n [data-auto-rows] {\n overflow-anchor: none;\n }\n [data-auto-rows] > [part~='body'] > .row,\n [data-auto-rows] > .pinned > .row {\n block-size: auto;\n min-block-size: var(--_row-height);\n grid-template-rows: minmax(var(--_row-height), auto);\n }\n /* Reading the rows' own heights: without the height each row renders at. */\n [data-auto-rows] > [part~='body'] > .row[data-measure-row] {\n min-block-size: var(--_row-height) !important;\n }\n [data-auto-rows] [part~='cell'] {\n align-items: start;\n padding-block: var(\n --argus-cell-padding-block,\n max(0px, (var(--_row-height) - 1lh - var(--argus-border-width, 1px)) / 2)\n );\n }\n /* Skeleton bars and the Retry button, centred in a one-row row as before. */\n [data-auto-rows] [part~='row-loading'] > [part~='cell'] {\n align-items: center;\n padding-block: 0;\n }\n [data-auto-rows] > [part~='body'] > .row > [role='gridcell'] {\n scroll-margin-block: calc(var(--_row-height) + var(--_pin-top-h, 0px))\n var(--_pin-bottom-h, 0px);\n }\n [data-auto-rows] > [part~='empty'] {\n min-block-size: calc(\n 100% - var(--_row-height) - var(--_pin-top-h, 0px) - var(--_pin-bottom-h, 0px)\n );\n }\n ::slotted(*) {\n min-inline-size: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n /* Fitting a column to its content: set for one synchronous measurement, never painted. */\n [data-measure] {\n inline-size: max-content;\n }\n\n /* Rows of a data source that haven't loaded: a bar per cell, pulsing gently. */\n [part~='skeleton'] {\n flex: none;\n inline-size: min(60%, 8em);\n block-size: 0.6em;\n border-radius: 0.3em;\n background: var(--argus-skeleton-bg, color-mix(in srgb, currentColor 12%, transparent));\n animation: argus-skeleton-pulse 1.6s ease-in-out infinite;\n }\n [part~='skeleton-error'] {\n animation: none;\n opacity: 0.5;\n }\n @keyframes argus-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n [part~='skeleton'] {\n animation: none;\n }\n }\n [part~='retry'] {\n font: inherit;\n color: inherit;\n cursor: pointer;\n }\n\n [part~='empty'] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-block-size: calc(\n 100% - (1 + var(--_pin-top-rows, 0) + var(--_pin-bottom-rows, 0)) * var(--_row-height)\n );\n padding: var(--_pad);\n box-sizing: border-box;\n }\n\n /* Measures the resolved row height in px for the virtualizer. */\n .probe {\n position: absolute;\n inset-block-start: 0;\n inline-size: 0;\n block-size: var(--_row-height);\n visibility: hidden;\n pointer-events: none;\n }\n }\n`;\n","import {\n LitElement,\n html,\n nothing,\n type CSSResultGroup,\n type PropertyValues,\n type RootPart,\n type TemplateResult,\n} from 'lit';\nimport type { ComplexAttributeConverter } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport {\n clickSelection,\n controllable,\n RowLayout,\n sameSelection,\n selectAll,\n selectRange,\n SELECTION_COLUMN_ID,\n toggleRow,\n type ColumnFilterDetail,\n type ColumnHideDetail,\n type ColumnPinDetail,\n type ColumnReorderDetail,\n type ColumnResizeDetail,\n type ColumnView,\n type Controllable,\n type GridRow,\n type SelectionStep,\n type SelectionTarget,\n type TableModel,\n} from '@argus-table/core';\nimport { announce } from './announce.js';\nimport { AutoWidths, measureColumns } from './controllers/auto-width.js';\nimport { ColumnChildrenController } from './controllers/column-children.js';\nimport { ColumnWindowController, type RenderedColumn } from './controllers/column-window.js';\nimport { DataController } from './controllers/data-controller.js';\nimport { PinScrollController } from './controllers/pin-scroll-controller.js';\nimport { PluginController, sameItems } from './controllers/plugins.js';\nimport { RowMeasure } from './controllers/row-measure.js';\nimport {\n canStartReorder,\n dropTarget,\n startReorderDrag,\n type DropSlot,\n} from './controllers/reorder-drag.js';\nimport { startResizeDrag } from './controllers/resize-drag.js';\nimport { TableController } from './controllers/table-controller.js';\nimport { VirtualController, type VirtualWindow } from './controllers/virtual-controller.js';\nimport {\n CELL_CLICK,\n COLUMN_FILTER,\n COLUMN_HIDE,\n COLUMN_PIN,\n COLUMN_REORDER,\n COLUMN_RESIZE,\n fire,\n LOAD_ERROR,\n RANGE_CHANGE,\n ROW_CLICK,\n ROW_SELECT,\n SORT_CHANGE,\n} from './events.js';\nimport { fromInteractive, INTERACTIVE } from './interactive.js';\nimport { bodyCap, watchMaxElementHeight } from './max-height.js';\nimport { renderBody, type ActiveCell, type Loading, type SelectedAt } from './render/body.js';\nimport { renderLightDom } from './render/cells.js';\nimport { content, flushContent, type ContentRenderer } from './render/content-directive.js';\nimport { renderHeader, type CheckAll, type HeaderDrag } from './render/header.js';\nimport type { CheckboxHandlers } from './render/content.js';\nimport { renderPinnedRows } from './render/pinned-rows.js';\nimport type { ArgusPlugin, CellTarget, ColumnInfo, PluginHost } from './plugins.js';\nimport { baseStyles } from './styles/base.js';\nimport type {\n CellContent,\n ColumnDef,\n ColumnFilter,\n ColumnFilterState,\n ColumnOrderState,\n ColumnPin,\n ColumnPinningState,\n ColumnSizingState,\n ColumnVisibilityState,\n DataSource,\n Density,\n PinnedRows,\n SelectionMode,\n SelectionState,\n SortState,\n TableState,\n} from './types.js';\n\n/**\n * The host carries the grid role, so rows rendered in the shadow root become\n * its children in the accessibility tree. ElementInternals sets the default;\n * `connectedCallback` also adds a `role` attribute, because tools such as\n * axe-core can't see the ElementInternals role. A `role` the page sets wins.\n */\nfunction attachGridInternals(host: HTMLElement): ElementInternals {\n const internals = host.attachInternals();\n internals.role = 'grid';\n return internals;\n}\n\n/**\n * The sortable column a header click came from, if any. Works for slotted content\n * too. Clicks on a resize handle never sort, so a click that ends a drag doesn't,\n * and neither do clicks on interactive content in the header (a button, an input).\n */\nfunction sortColumnOf(event: Event): string | undefined {\n for (const target of event.composedPath()) {\n if (!(target instanceof HTMLElement)) continue;\n if (target.dataset.resizeCol !== undefined) return undefined;\n if (target.matches(INTERACTIVE)) return undefined;\n if (target.dataset.sortCol !== undefined) return target.dataset.sortCol;\n if (target.getAttribute('part') === 'header-row') return undefined;\n }\n return undefined;\n}\n\nconst RESIZE_STEP = 10;\n\n/** `row-height`: px (`48` or `48px`) or `auto`; anything else is unset. */\nconst rowHeightConverter: ComplexAttributeConverter<number | 'auto' | undefined> = {\n fromAttribute(value) {\n if (value === null) return undefined;\n const text = value.trim().toLowerCase();\n if (text === 'auto') return 'auto';\n const px = Number(text.replace(/px$/, ''));\n return text !== '' && px > 0 ? px : undefined;\n },\n};\n\n/**\n * The cell holding the grid's single tab stop: a row (its section, and its index\n * there: in the row model for the body, in its list for a pinned row) and a\n * column. `rowId` keeps it on the same body row when the order changes.\n */\ninterface Active extends GridRow {\n rowId: string | undefined;\n col: string;\n}\n\nconst HEADER: GridRow = { section: 'header', index: 0 };\n\n/** Where the rows sit in the grid: header, pinned top, body, pinned bottom. */\nfunction layoutOf<T>(model: TableModel<T, CellContent>): RowLayout {\n return new RowLayout(model.pinnedCount('top'), model.rowCount, model.pinnedCount('bottom'));\n}\n\n/** The grid cell or column header an element is, if any. */\nfunction gridCell(target: EventTarget): HTMLElement | undefined {\n if (!(target instanceof HTMLElement) || target.dataset.col === undefined) return undefined;\n const role = target.getAttribute('role');\n return role === 'gridcell' || role === 'columnheader' ? target : undefined;\n}\n\n/** The grid row a rendered row element is, from its `aria-rowindex`. */\nfunction gridRowOf(row: Element | null, layout: RowLayout): GridRow | undefined {\n const index = row?.getAttribute('aria-rowindex');\n return index ? layout.fromAriaRowIndex(Number(index)) : undefined;\n}\n\n/**\n * The pinned edge's shadow, drawn once per side over the scroller rather than\n * per row: a shadow on every pinned cell repaints on every scroll frame. It\n * covers the pinned columns and casts `--argus-pinned-shadow` onto the rest;\n * PinScrollController sizes it to the visible area.\n */\nfunction pinShadow(side: 'start' | 'end', width: number, contentPx: number) {\n if (width === 0) return nothing;\n return html`<div\n class=\"pin-shadow\"\n data-side=${side}\n aria-hidden=\"true\"\n style=${styleMap({\n inlineSize: `${String(width)}px`,\n '--_content-h': `${String(contentPx)}px`,\n })}\n ></div>`;\n}\n\n/** CSS grid track for a column: fixed px, or a flex share with the min width as floor. */\nfunction track<T>(column: ColumnView<T, CellContent>): string {\n return column.flex === undefined\n ? `${String(column.width)}px`\n : `minmax(${String(column.minWidth)}px, ${String(column.flex)}fr)`;\n}\n\n/**\n * A virtualized data table.\n *\n * Set `columns`, and `data` or `dataSource`, as properties. Columns can also be\n * written as `<argus-column>` children; a non-empty `columns` wins over them.\n * Header and cell content is rendered into the element's light DOM and slotted\n * into the cells, so page CSS and the page's own components work inside cells.\n *\n * Any number of rows scrolls to the end. Browsers limit an element's height\n * (about 800k rows of 40 px in Chromium and Safari, 400k in Firefox), so a taller\n * body renders shorter and its scroll position is scaled onto the rows: the\n * scrollbar still spans every row, and a wheel step covers a few more of them.\n * Use `scrollToRow()` rather than setting the scroll container's `scrollTop`.\n *\n * @summary Data table with pinned rows and columns and infinite loading.\n *\n * @fires {CustomEvent<SortChangeDetail>} argus-sort-change - A sortable header was clicked, or activated with Enter or Space. `detail: { sorting }`: the new order, or the proposed one when `sorting` is controlled.\n * @fires {CustomEvent<ColumnResizeDetail>} argus-column-resize - A column was resized: by dragging its handle, with Alt+Arrow on its header, by a double-click on its handle (fit to content) or by `autosizeColumns()`. `detail: { columnId, width, sizing }`: the new widths, or the proposed ones when `columnSizing` is controlled. Fires on every frame of a drag, and once per column that `autosizeColumns()` changes.\n * @fires {CustomEvent<ColumnReorderDetail>} argus-column-reorder - A column was moved: by dragging its header, or with Alt+Shift+Arrow on its focused header. Columns move within their own group (start-pinned, scrolling, end-pinned). `detail: { columnId, order }`: the new order, or the proposed one when `columnOrder` is controlled. Fires once per move, on drop.\n * @fires {CustomEvent<ColumnPinDetail>} argus-column-pin - A column was pinned to a side or unpinned, through a plugin such as the column menu. `detail: { columnId, pin, pinning }`: `pin` is `'start'`, `'end'` or `false`; `pinning` is the new state, or the proposed one when `columnPinning` is controlled.\n * @fires {CustomEvent<ColumnHideDetail>} argus-column-hide - A column was hidden or shown, through a plugin such as the column menu. `detail: { columnId, hidden, visibility }`: `hidden` is `true` when it was hidden; `visibility` is the new state, or the proposed one when `columnVisibility` is controlled.\n * @fires {CustomEvent<ColumnFilterDetail>} argus-column-filter - A column's filter was set, changed or cleared, through a plugin such as the column menu. `detail: { columnId, filter, filters }`: `filter` is the column's new filter, or `undefined` when it was cleared; `filters` is the new state, or the proposed one when `columnFilters` is controlled.\n * @fires {CustomEvent<CellClickDetail<T>>} argus-cell-click - A body or pinned-row cell was clicked, or Enter was pressed on it. `detail: { row, columnId, value, pinned? }`; `pinned` is `'top'` or `'bottom'` for a pinned row. Fires before `argus-row-click`.\n * @fires {CustomEvent<RowClickDetail<T>>} argus-row-click - A body or pinned row was clicked, or Enter was pressed on one of its cells. `detail: { row, rowId, index, pinned? }`; for a pinned row, `index` is its index in its list.\n * @fires {CustomEvent<RangeChangeDetail>} argus-range-change - The visible rows changed. `detail: { start, end }` (row indices, inclusive).\n * @fires {CustomEvent<RowSelectDetail>} argus-row-select - The selected rows changed: by a click on a row (Ctrl/Cmd toggles, Shift selects a range), with Space, Shift+Arrow or Shift+PageUp/PageDown on a body cell, or with Ctrl/Cmd+A. Only with a `selectionMode`. `detail: { selection }`: the new row ids, or the proposed ones when `selection` is controlled.\n * @fires {CustomEvent<LoadErrorDetail>} argus-load-error - A `dataSource` page failed to load: `getRows()` rejected or threw. `detail: { error, start, end }` (`end` exclusive). The rows show a Retry button.\n *\n * @slot empty - Shown instead of the body when there are no rows. Default: \"No rows\".\n *\n * @csspart table - The scroll container that holds header and body.\n * @csspart header - The sticky header row group.\n * @csspart header-row - The header row.\n * @csspart header-cell - Every header cell.\n * @csspart header-cell-sorted - The header of the sorted column. The direction is in `aria-sort`.\n * @csspart header-cell-filtered - Added to `header-cell` on the headers of filtered columns.\n * @csspart filter-indicator - The mark in the header of a filtered column, after the sort indicator.\n * @csspart header-cell-dragging - Added to `header-cell` on the header being dragged to a new position.\n * @csspart drop-indicator - The line on the edge of the header where a dragged column would land.\n * @csspart resize-handle - The drag handle on the inline-end edge of a resizable column's header. A double-click fits the column to its content.\n * @csspart body - The row group holding the rendered body rows.\n * @csspart row - Every body row.\n * @csspart row-even - Body rows with an even index (0-based).\n * @csspart row-odd - Body rows with an odd index.\n * @csspart row-loading - Body rows whose `dataSource` page hasn't loaded yet, or failed.\n * @csspart row-selected - Body rows whose id is in `selection`.\n * @csspart cell-selection - Added to `cell` in the checkbox column (`selectionCheckboxes`), pinned rows included.\n * @csspart header-cell-selection - Added to `header-cell` on the checkbox column's header.\n * @csspart selection-checkbox - The checkboxes of the checkbox column: one per selectable row, and the select-all one in the header (`multi` mode).\n * @csspart row-pinned - Every row from `pinnedRows`, on either side. Also has `row`, but no `row-even`/`row-odd`.\n * @csspart row-pinned-top - The rows pinned below the header.\n * @csspart row-pinned-bottom - The rows pinned to the bottom.\n * @csspart cell-pinned-row - Every cell of a pinned row (next to `cell`).\n * @csspart cell - Every body cell.\n * @csspart cell-sorted - Body cells in the sorted column.\n * @csspart cell-pinned - Body cells in a pinned column, on either side.\n * @csspart cell-pinned-edge - The pinned body cell next to the scrolling columns (one per pinned side).\n * @csspart skeleton - The placeholder bar in each cell of a row that is still loading.\n * @csspart skeleton-error - Added to `skeleton` in a row whose page failed to load.\n * @csspart retry - The Retry button in the first cell of a failed page's first visible row.\n * @csspart empty - The empty-state container.\n *\n * @cssprop [--argus-bg=Canvas] - Background of the table and rows.\n * @cssprop [--argus-fg=CanvasText] - Text colour.\n * @cssprop [--argus-font=inherit] - Font shorthand for the table.\n * @cssprop [--argus-header-bg] - Header background.\n * @cssprop [--argus-header-fg=inherit] - Header text colour.\n * @cssprop [--argus-border-color] - Colour of the row borders.\n * @cssprop [--argus-border-width=1px] - Width of the row borders.\n * @cssprop [--argus-outline=none] - Border around the whole table, as a `border` shorthand (`1px solid …`). Inside the element's size.\n * @cssprop [--argus-radius=0] - Corner radius of the table. Header, rows and pinned columns are clipped to it.\n * @cssprop [--argus-row-height] - Height of a row. Default per density: 32px, 40px, 52px. With `rowHeight: 'auto'`: the header's height and the least a body or pinned row is.\n * @cssprop [--argus-cell-padding-inline] - Inline padding of cells. Default per density: 8px, 12px, 16px.\n * @cssprop [--argus-cell-padding-block] - Block padding of body and pinned-row cells with `rowHeight: 'auto'`, where content sits at the top of the cell. Default: what centres one line of text in `--argus-row-height`.\n * @cssprop [--argus-row-stripe-bg] - Background of odd rows. Default: no stripes.\n * @cssprop [--argus-pinned-shadow] - Shadow on the pinned edge, as a `box-shadow` falling toward the end side (`4px 0 6px -4px …`). Mirrored for the end edge and in RTL; `none` removes it.\n * @cssprop [--argus-resize-handle-color] - Colour of the resize handle's line, shown on hover, focus and drag.\n * @cssprop [--argus-focus-ring=2px solid Highlight] - Outline of the focused header or cell.\n * @cssprop [--argus-filter-indicator-color=currentColor] - Colour of the mark in the header of a filtered column.\n * @cssprop [--argus-drop-indicator-color=Highlight] - Colour of the line that marks where a dragged column would land.\n * @cssprop [--argus-row-hover-bg] - Background of the hovered row. Default: no change.\n * @cssprop [--argus-pinned-row-bg=var(--argus-bg)] - Background of the pinned rows, pinned columns included.\n * @cssprop [--argus-skeleton-bg] - Colour of the skeleton bars in rows still loading. Default: the text colour at low opacity.\n * @cssprop [--argus-row-selected-bg] - Background of selected rows, pinned columns included. Default: the system highlight colour, mixed into `--argus-bg`. It wins over `--argus-row-hover-bg`.\n */\n@customElement('argus-table')\nexport class ArgusTable<T = unknown> extends LitElement {\n static override styles: CSSResultGroup = baseStyles;\n\n /**\n * Column definitions. Property only: functions can't be attributes. While empty,\n * the table reads its `<argus-column>` children instead. `null` or `undefined`\n * means `[]`.\n */\n @property({ attribute: false })\n get columns(): readonly ColumnDef<T>[] {\n return this.#columnsProp;\n }\n set columns(value: readonly ColumnDef<T>[] | null | undefined) {\n // Framework bindings set `undefined` when a prop goes away.\n this.#columnsProp = value ?? [];\n }\n\n /**\n * The rows to show. Replace the array to update; changes inside it aren't\n * detected. `null` or `undefined` means `[]`.\n */\n @property({ attribute: false })\n get data(): readonly T[] {\n return this.#dataProp;\n }\n set data(value: readonly T[] | null | undefined) {\n this.#dataProp = value ?? [];\n }\n\n /**\n * Loads rows page by page as they scroll into view, instead of `data`:\n * `{ getRows({ start, end, sorting, signal }), pageSize? }`, where `end` is\n * exclusive and `getRows` resolves to `{ rows, total? }`. Without a `total`,\n * the table grows as pages arrive and a short page marks the end. Sorting\n * happens on the server: a new order reloads from the top. While set, it wins\n * over `data`. Replace the object to change `getRows` or `pageSize`.\n */\n @property({ attribute: false })\n dataSource?: DataSource<T>;\n\n /**\n * Rows fixed below the header (`top`) and at the bottom of the view (`bottom`),\n * such as a totals row: `{ top?: T[], bottom?: T[] }`. They are separate\n * objects, not rows of `data`: columns read them the same way, but they are\n * never sorted and work the same with a `dataSource`. A `cell` function gets\n * `pinned: 'top' | 'bottom'` in its context. Replace the object to update.\n */\n @property({ attribute: false })\n pinnedRows?: PinnedRows<T>;\n\n /** Returns a stable id for a row. Default: the row's index (in `data`, or among all `dataSource` rows). */\n @property({ attribute: false })\n getRowId?: (row: T, index: number) => string;\n\n /**\n * Row height in px, or `'auto'` to fit each row to its content (`row-height=\"auto\"`).\n * Unset: the density (or the `--argus-row-height` token) decides. With\n * `'auto'`, that height is the header's and the least a body or pinned row is;\n * rows grow to fit wrapped text (`wrap` columns) and taller content, and cell\n * content sits at the top. Rows are measured as they render: a row's height\n * counts the columns rendered (see `virtualizeColumns`), and rows not seen yet\n * count as one line. Give images a size, so rows don't move when they load.\n */\n @property({ attribute: 'row-height', converter: rowHeightConverter })\n rowHeight?: number | 'auto';\n\n /** Row density: `compact`, `comfortable` or `spacious`. */\n @property({ reflect: true })\n density: Density = 'comfortable';\n\n /** Rows rendered above and below the visible ones. `null` or `undefined` means the default, 6. */\n @property({ type: Number })\n get overscan(): number {\n return this.#overscan;\n }\n set overscan(value: number | null | undefined) {\n this.#overscan = value ?? 6;\n }\n\n /**\n * Renders only the scrolling columns in view (plus two on each side), for\n * wide tables: a few dozen columns and more. Pinned columns, the checkbox\n * column and the focused cell's column always render. Off by default: then\n * every column renders, as before. Cells are placed in their grid column\n * explicitly, so page CSS that relies on their order in the DOM (`:nth-child`\n * on cells) doesn't apply. `autosizeColumns()` and `width: 'auto'` columns\n * still measure columns out of view: they render for the measurement.\n */\n @property({ attribute: 'virtualize-columns', type: Boolean })\n virtualizeColumns = false;\n\n /**\n * The sort order, e.g. `[{ id: 'total', desc: true }]`; `[]` when unsorted. Unset,\n * the table keeps it itself and header clicks change it. Once set, it is\n * controlled: a click only fires `argus-sort-change` with the proposed order,\n * and nothing changes until you set the property. Set `undefined` to hand it back.\n */\n @property({ attribute: false })\n get sorting(): SortState {\n return this.#sorting.value;\n }\n set sorting(value: SortState | undefined) {\n // Lit wraps this accessor and requests the update with the old value.\n this.#sorting.set(value);\n }\n\n /**\n * Resized widths in px by column id, e.g. `{ name: 240 }`. A resized flex column\n * becomes fixed. Uncontrolled until set, like `sorting`: once set, a resize only\n * fires `argus-column-resize` with the proposed widths. `undefined` hands it back.\n */\n @property({ attribute: false })\n get columnSizing(): ColumnSizingState {\n return this.#sizing.value;\n }\n set columnSizing(value: ColumnSizingState | undefined) {\n this.#sizing.set(value);\n }\n\n /**\n * The column order: column ids as the table shows them, e.g.\n * `['id', 'total', 'customer']`. `[]` (the default) keeps the order of `columns`.\n * Each pin group (start-pinned, scrolling, end-pinned) takes its columns in this\n * order; unknown ids are ignored and columns it doesn't list follow the listed\n * ones of their group. After a move it holds every column id. Uncontrolled\n * until set, like `sorting`: once set, a move only fires `argus-column-reorder`\n * with the proposed order. `undefined` hands it back.\n */\n @property({ attribute: false })\n get columnOrder(): ColumnOrderState {\n return this.#order.value;\n }\n set columnOrder(value: ColumnOrderState | undefined) {\n this.#order.set(value);\n }\n\n /**\n * Pins by column id, over the columns' own `pin`: `'start'` or `'end'` pins a\n * column, `false` unpins one whose definition pins it, e.g.\n * `{ total: 'end', id: false }`. Columns it doesn't list keep their `pin`. A pinned\n * column joins the edge of its group nearest its place in `columnOrder`, and stops\n * flexing. Uncontrolled until set, like `sorting`: once set, pinning from a plugin\n * only fires `argus-column-pin` with the proposed pins. `undefined` hands it back.\n */\n @property({ attribute: false })\n get columnPinning(): ColumnPinningState {\n return this.#pinning.value;\n }\n set columnPinning(value: ColumnPinningState | undefined) {\n this.#pinning.set(value);\n }\n\n /**\n * Visibility by column id, over the columns' own `hidden`: `false` hides a column,\n * `true` shows one defined as `hidden`, e.g. `{ email: false }`. Columns it\n * doesn't list keep their `hidden`. A hidden column isn't rendered, but sorting by\n * it still works and it keeps its place in `columnOrder`. Uncontrolled until set,\n * like `sorting`: once set, hiding or showing from a plugin only fires\n * `argus-column-hide` with the proposed visibility. `undefined` hands it back.\n */\n @property({ attribute: false })\n get columnVisibility(): ColumnVisibilityState {\n return this.#visibility.value;\n }\n set columnVisibility(value: ColumnVisibilityState | undefined) {\n this.#visibility.set(value);\n }\n\n /**\n * Filters by column id, e.g. `{ city: { kind: 'set', values: ['Berlin'] } }` or\n * `{ total: { kind: 'number', op: 'gt', value: 100 } }`. A row shows when it passes\n * every filter and `quickFilter`. Filters on hidden columns still apply; unknown ids\n * are ignored. A column's `filterFn` replaces the built-in matching. With a\n * `dataSource`, the filters go to `getRows()` and the server filters. Users set\n * filters through plugins (the column menu) on columns with a `filter` kind.\n * Uncontrolled until set, like `sorting`: once set, a change from a plugin only\n * fires `argus-column-filter` with the proposed filters. `undefined` hands it back.\n */\n @property({ attribute: false })\n get columnFilters(): ColumnFilterState {\n return this.#filters.value;\n }\n set columnFilters(value: ColumnFilterState | undefined) {\n this.#filters.set(value);\n }\n\n /**\n * Shows only rows that contain each word of this text in one of their shown\n * columns, ignoring case, e.g. from a search box. Values are matched as text\n * (dates as `2026-11-10`); objects aren't searched. With a `dataSource`, it goes\n * to `getRows()` and the server filters. `''` (the default) shows every row.\n */\n @property({ attribute: 'quick-filter' })\n get quickFilter(): string {\n return this.#quickFilter;\n }\n set quickFilter(value: string | null | undefined) {\n this.#quickFilter = value ?? '';\n }\n\n /**\n * How rows can be selected: `none` (the default), `single` or `multi`. A click\n * on a body row selects it; in `multi` mode Ctrl/Cmd+click toggles a row,\n * Shift+click selects the range from the last clicked row, and Ctrl/Cmd+A\n * selects every row. Space toggles the focused row. Clicks on buttons, links\n * and inputs inside cells don't select. Pinned rows, and `dataSource` rows not\n * loaded yet, can't be selected.\n */\n @property({ attribute: 'selection-mode' })\n selectionMode: SelectionMode = 'none';\n\n /**\n * Adds a checkbox column, pinned first at the start, while `selectionMode` is\n * `single` or `multi`. A row's checkbox toggles it (Shift+click adds the range\n * from the last row clicked); in `multi` mode the header's checkbox selects\n * every row, or clears the selection when all are selected. Space on a\n * focused checkbox cell does the same. The column isn't part of `columns`,\n * `columnOrder` or `columnSizing`, and it fires no `argus-cell-click`.\n */\n @property({ attribute: 'selection-checkboxes', type: Boolean })\n selectionCheckboxes = false;\n\n /**\n * The selected rows, as row ids (from `getRowId`, or the row's index as a\n * string), e.g. `['p4', 'p7']`. Uncontrolled until set, like `sorting`: once\n * set, a click only fires `argus-row-select` with the proposed ids.\n * `undefined` hands it back. The table never drops ids on its own: they stay\n * through sorting, a new `data` or reloaded pages. With a `dataSource`,\n * Ctrl/Cmd+A selects the loaded rows only.\n */\n @property({ attribute: false })\n get selection(): SelectionState {\n return this.#selection.value;\n }\n set selection(value: SelectionState | undefined) {\n this.#selection.set(value);\n }\n\n /**\n * Renders header and cell content the table can't render itself, such as React\n * elements, Vue VNodes or Angular templates: `{ render(target, content),\n * release(target), flush?() }`. A `header` or `cell` that returns anything other\n * than a string, a number, a DOM node or a Lit template hands it to the renderer,\n * with a target element the table keeps while the cell is reused for other rows.\n * The framework wrappers set it; set it yourself only for another framework.\n */\n @property({ attribute: false })\n contentRenderer?: ContentRenderer;\n\n /**\n * Add-ons, such as `headerMenu()` from `@argus-table/header-menu`. Each one can\n * change the column definitions, handle keys on a focused header or cell, and\n * use the table through a small API. They run in array order. Replace the\n * array to change them; an array with the same plugins in the same order\n * changes nothing. `null` or `undefined` means `[]`.\n */\n @property({ attribute: false })\n get plugins(): readonly ArgusPlugin<T>[] {\n return this.#pluginsProp;\n }\n set plugins(value: readonly ArgusPlugin<T>[] | null | undefined) {\n const next = value ?? [];\n // The same plugins in a new array (a framework re-render) keep their connection.\n if (!sameItems(next, this.#pluginsProp)) this.#pluginsProp = next;\n }\n\n #columnsProp: readonly ColumnDef<T>[] = [];\n #pluginsProp: readonly ArgusPlugin<T>[] = [];\n #dataProp: readonly T[] = [];\n #overscan = 6;\n readonly #sorting = controllable<SortState>([]);\n readonly #sizing = controllable<ColumnSizingState>({});\n readonly #order = controllable<ColumnOrderState>([]);\n readonly #pinning = controllable<ColumnPinningState>({});\n readonly #visibility = controllable<ColumnVisibilityState>({});\n readonly #filters = controllable<ColumnFilterState>({});\n #quickFilter = '';\n /** Filters the table applied itself, by column; their events fire once the update is done. */\n readonly #appliedFilters = new Map<string, ColumnFilterDetail>();\n /** Announce the row count after the update: the filters changed. */\n #announceRows = false;\n /** Pins the table applied itself, by column; their events fire once the update is done. */\n readonly #appliedPins = new Map<string, ColumnPinDetail>();\n /** Hidden or shown columns the table applied itself; their events fire once the update is done. */\n readonly #appliedHides = new Map<string, ColumnHideDetail>();\n readonly #selection = controllable<SelectionState>([]);\n /** `selection` as a set, for the rows rendered; rebuilt when `selection` changes. */\n #selectedIds: { of: SelectionState; ids: ReadonlySet<string> } | undefined;\n /** The row a Shift range starts from: the last row clicked or toggled without Shift. */\n #anchor: string | undefined;\n /** A selection the table applied itself; its event fires once the update is done. */\n #appliedSelection: SelectionState | undefined;\n /** Whether the checkbox column was last shown; a change re-measures the pinned columns. */\n #selectionColumn = false;\n #selectionColumnChanged = false;\n /** The select-all checkbox's state, kept until `selection`, `data` or `getRowId` change. */\n #checkAll: { key: readonly unknown[]; state: CheckAll['state'] } | undefined;\n /** Moves the table applied itself, by column; their events fire once the update is done. */\n readonly #appliedReorders = new Map<string, ColumnReorderDetail>();\n /** The header being dragged to a new position, if any. */\n #drag: HeaderDrag | undefined;\n /** A move from the keyboard, announced once it has rendered: the column and its old position. */\n #announceMove: { id: string; from: number } | undefined;\n /** Resizes the table applied itself, by column; their events fire once the update is done. */\n readonly #appliedResizes = new Map<string, ColumnResizeDetail>();\n /** Columns `autosizeColumns()` renders out of view for its measurement. */\n #measureKeep: readonly string[] = [];\n /** Measured widths of `width: 'auto'` columns. */\n readonly #autoWidths = new AutoWidths(() => {\n this.requestUpdate();\n });\n /** The auto widths last passed to the model; a change re-measures the pinned columns' offsets. */\n #pushedAutoWidths: ColumnSizingState | undefined;\n #autoWidthsChanged = false;\n /** A sort the table applied itself; its event fires once the update is done. */\n #appliedSort: SortState | undefined;\n readonly #internals = attachGridInternals(this);\n readonly #table = new TableController<T>();\n readonly #children = new ColumnChildrenController<T>(this);\n /** What plugins get: closures over the table's private state. */\n readonly #pluginHost: PluginHost<T> = {\n element: this,\n column: (id) => this.#columnInfo(id),\n columns: () =>\n this.#table.model.allColumns.flatMap((c) => {\n const info = this.#columnInfo(c.id);\n return info ? [info] : [];\n }),\n setPin: (columnId, pin) => {\n this.#requestPin(columnId, pin);\n },\n setHidden: (columnId, hidden) => {\n this.#requestHide(columnId, hidden);\n },\n setFilter: (columnId, filter) => {\n this.#requestFilter(columnId, filter);\n },\n filterValues: (columnId, limit) => this.#table.model.filterValues(columnId, limit),\n cellOf: (event) => this.#cellTarget(event),\n setSort: (columnId, direction) => {\n this.#setSort(columnId, direction);\n },\n focusHeader: (columnId) => {\n this.#moveTo(HEADER, columnId, this.#table.model);\n },\n announce: (message) => {\n announce(this.ownerDocument, message);\n },\n invalidateColumns: () => {\n this.#plugins.invalidate();\n this.requestUpdate();\n },\n requestUpdate: () => {\n this.requestUpdate();\n },\n row: (index) => this.#table.model.rowAt(index)?.original,\n content: (value) => content(value),\n };\n readonly #plugins = new PluginController<T>(this, this.#pluginHost);\n #columnsById:\n | {\n of: readonly ColumnView<T, CellContent>[];\n byId: ReadonlyMap<string, ColumnView<T, CellContent>>;\n }\n | undefined;\n /** The columns last passed to the model: `columns`, or the `<argus-column>` children. */\n #columns: readonly ColumnDef<T>[] = [];\n #columnsChanged = false;\n #warnedColumns = false;\n /** End of the light-DOM part holding cell content, so later children stay outside it. */\n #contentEnd: Comment | undefined;\n /** The light-DOM part: disconnected with the table, so foreign content is released. */\n #lightPart: RootPart | undefined;\n #lightConnected = true;\n readonly #data = new DataController<T>(this);\n /** Scroll back to the top after the update (a new sort order for a data source). */\n #scrollToTop = false;\n // Looked up lazily: the virtualizer's hostUpdated runs before firstUpdated.\n readonly #virtual = new VirtualController(this, () =>\n this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]'),\n );\n readonly #pinScroll = new PinScrollController(this, () =>\n this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]'),\n );\n readonly #columnWindow = new ColumnWindowController<T>(this, () =>\n this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]'),\n );\n /** The columns the last render rendered (all of them, unless `virtualizeColumns`). */\n #rendered: RenderedColumn<T>[] = [];\n #rowPx = 40;\n #probeObserver?: ResizeObserver;\n /** The column template and row height the rows were last read for. */\n #rowsKey = '';\n /** Rows of different heights: reads the rendered rows (`rowHeight: 'auto'` only). */\n readonly #rowMeasure = new RowMeasure(this, {\n bodyIndex: (row) => {\n const at = gridRowOf(row, layoutOf(this.#table.model));\n return at?.section === 'body' && this.#data.stateAt(at.index) === 'loaded'\n ? at.index\n : undefined;\n },\n sizeOf: (index) => this.#virtual.sizeOf(index),\n minimum: () => this.#rowPx,\n });\n #window: VirtualWindow = { rows: [], totalSize: 0, range: null };\n #active: Active | undefined;\n /** Move focus to the active cell after the next update (keyboard navigation). */\n #focusPending = false;\n #lastRange = '';\n #unwatchMaxHeight: (() => void) | undefined;\n\n /**\n * The row `setState()` still has to scroll to: a data source's rows that far\n * aren't counted yet. Scrolled to again whenever the row count changes.\n */\n #scrollTarget: { row: number; count: number } | undefined;\n\n constructor() {\n super();\n // The user's own scrolling (or a click, or a key) wins over a restored position.\n for (const type of ['wheel', 'touchstart', 'pointerdown', 'keydown'] as const) {\n this.addEventListener(type, this.#dropScrollTarget, { passive: true });\n }\n }\n\n readonly #dropScrollTarget = () => {\n this.#scrollTarget = undefined;\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute('role')) this.setAttribute('role', 'grid');\n if (this.hasUpdated) this.#observeProbe();\n if (this.#lightPart && !this.#lightConnected) {\n this.#lightConnected = true;\n this.#lightPart.setConnected(true);\n flushContent(this);\n }\n // A zoom change changes the tallest body the engine renders.\n this.#unwatchMaxHeight = watchMaxElementHeight(() => {\n this.requestUpdate();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#probeObserver?.disconnect();\n this.#rowMeasure.stop();\n // Framework content in the cells is unmounted until the table comes back.\n if (this.#lightPart && this.#lightConnected) {\n this.#lightConnected = false;\n this.#lightPart.setConnected(false);\n flushContent(this);\n }\n this.#unwatchMaxHeight?.();\n this.#unwatchMaxHeight = undefined;\n }\n\n /**\n * `columns` when it has any, otherwise the `<argus-column>` children. Keeps its\n * identity while neither changes, so the model is only rebuilt on a change.\n */\n #effectiveColumns(): readonly ColumnDef<T>[] {\n if (this.columns.length === 0) return this.#children.defs;\n if (!this.#warnedColumns && this.#children.present) {\n this.#warnedColumns = true;\n console.warn(\n 'argus-table: the columns property is set, so <argus-column> children are ignored.',\n );\n }\n return this.columns;\n }\n\n /**\n * The node the light-DOM content is rendered before. Lit's part then ends there,\n * so children appended later (an `<argus-column>`) never land inside it. If the\n * marker was removed (say by `innerHTML`), a new one starts a fresh part.\n */\n #lightDomEnd(): Comment {\n if (this.#contentEnd?.parentNode !== this) {\n this.#contentEnd = document.createComment('');\n this.append(this.#contentEnd);\n }\n return this.#contentEnd;\n }\n\n /**\n * With a `dataSource`, drops every loaded page and loads the rows in view\n * again, keeping the scroll position. With `data`, re-renders the cells (after\n * changing row objects in place). Resolves once the table has re-rendered;\n * reloaded rows arrive as their pages load.\n */\n async refresh(): Promise<void> {\n this.#data.refresh();\n this.requestUpdate();\n await this.updateComplete;\n }\n\n /**\n * Fits columns to their content: the header, the pinned rows and the body rows\n * rendered now (rows out of view aren't measured). It resizes them like a drag\n * would, so `argus-column-resize` fires for each column that changes, and with a\n * controlled `columnSizing` nothing changes until you set it. Without `ids`, fits\n * every resizable column; columns with `resizable: false` keep their width.\n * With `virtualizeColumns`, columns out of view render for the measurement.\n * Resolves once the table has re-rendered.\n */\n async autosizeColumns(ids?: readonly string[]): Promise<void> {\n await this.updateComplete;\n const targets = this.#table.model.columns\n .filter((c) => c.resizable && (ids === undefined || ids.includes(c.id)))\n .map((c) => c.id);\n if (this.virtualizeColumns) {\n this.#measureKeep = targets;\n this.requestUpdate();\n await this.updateComplete;\n }\n const widths = measureColumns(this.renderRoot, targets);\n if (this.#measureKeep.length > 0) {\n this.#measureKeep = [];\n this.requestUpdate();\n }\n this.#requestResizes(widths);\n await this.updateComplete;\n }\n\n /** Scrolls so that the row at `index` (in the current row order) is at the top. */\n async scrollToRow(index: number): Promise<void> {\n await this.updateComplete;\n this.#virtual.scrollToIndex(index);\n await this.#settled();\n }\n\n /**\n * Waits for the update, and with `rowHeight: 'auto'` for the ones measured\n * rows request (a few at most: heights don't depend on positions).\n */\n async #settled(): Promise<void> {\n let done = await this.updateComplete;\n for (let i = 0; i < 8 && !done && this.rowHeight === 'auto'; i++) {\n done = await this.updateComplete;\n }\n }\n\n /**\n * The state users change, as one object of plain JSON for saving a user's\n * layout: `sorting`, `columnSizing`, `columnOrder`, `columnPinning`,\n * `columnVisibility`, `columnFilters`, `selection`, `quickFilter`, and `scroll`\n * (the row at the top and the horizontal offset). Controlled properties are\n * included with the values you set. The object is a copy: changing it changes\n * nothing in the table.\n */\n getState(): Required<TableState> {\n const scroller = this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]');\n return structuredClone({\n sorting: this.#sorting.value,\n columnSizing: this.#sizing.value,\n columnOrder: this.#order.value,\n columnPinning: this.#pinning.value,\n columnVisibility: this.#visibility.value,\n columnFilters: this.#filters.value,\n selection: this.#selection.value,\n quickFilter: this.#quickFilter,\n // Negative in RTL.\n scroll: { row: this.#virtual.topRow, left: Math.abs(scroller?.scrollLeft ?? 0) },\n });\n }\n\n /**\n * Restores state from `getState()`, for example a layout saved in\n * `localStorage`. Only the keys given change; ids of columns that no longer\n * exist are ignored. Properties you control are left alone (set them\n * yourself), and the others stay uncontrolled. No change events fire.\n * `quickFilter` is set like the property: a search box of yours shows it only\n * if you read it back. `scroll` is applied after the rest, so with a\n * `dataSource` the restored rows load where it points. Resolves once the table\n * has re-rendered there.\n */\n async setState(state: TableState): Promise<void> {\n this.#restore('sorting', this.#sorting, state.sorting);\n this.#restore('columnSizing', this.#sizing, state.columnSizing);\n this.#restore('columnOrder', this.#order, state.columnOrder);\n this.#restore('columnPinning', this.#pinning, state.columnPinning);\n this.#restore('columnVisibility', this.#visibility, state.columnVisibility);\n this.#restore('columnFilters', this.#filters, state.columnFilters);\n // A Shift range starts over from the restored selection.\n if (this.#restore('selection', this.#selection, state.selection)) this.#anchor = undefined;\n if (state.quickFilter !== undefined) this.quickFilter = state.quickFilter;\n this.#scrollTarget = undefined;\n await this.updateComplete;\n const { scroll } = state;\n if (!scroll) return;\n this.#virtual.scrollToIndex(scroll.row);\n // A data source counts one page past its loaded rows until it knows the\n // total: scroll on as the count grows.\n const count = this.#table.model.rowCount;\n if (this.#data.rows?.totalKnown === false && scroll.row >= count) {\n this.#scrollTarget = { row: scroll.row, count };\n }\n const scroller = this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]');\n if (scroller) scroller.scrollLeft = scroll.left * this.#direction();\n // The scroll event comes before the next frame, and the rows move with its update.\n await new Promise(requestAnimationFrame);\n await this.#settled();\n }\n\n /** Scrolls on toward the row `setState()` restored once more rows are counted. */\n #chaseScrollTarget(count: number): void {\n const target = this.#scrollTarget;\n if (!target || target.count === count) return;\n target.count = count;\n this.#virtual.scrollToIndex(target.row);\n if (target.row < count || this.#data.rows?.totalKnown !== false) this.#scrollTarget = undefined;\n }\n\n /**\n * Applies a restored value to uncontrolled state without an event, as a user\n * change would without the event. Returns whether it changed.\n */\n #restore<V>(name: keyof TableState, state: Controllable<V>, value: V | undefined): boolean {\n if (value === undefined || state.controlled) return false;\n // The same value restored again doesn't reload a data source.\n if (JSON.stringify(value) === JSON.stringify(state.value)) return false;\n const old = state.value;\n state.request(structuredClone(value));\n this.requestUpdate(name, old);\n return true;\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('plugins')) this.#plugins.set(this.plugins);\n const columns = this.#plugins.transform(this.#effectiveColumns());\n this.#columnsChanged = columns !== this.#columns;\n this.#columns = columns;\n const filtersChanged = changed.has('columnFilters') || changed.has('quickFilter');\n if (\n changed.has('dataSource') ||\n changed.has('sorting') ||\n changed.has('getRowId') ||\n filtersChanged\n ) {\n this.#data.configure({\n source: this.dataSource,\n sorting: this.#sorting.value,\n filters: this.#filters.value,\n quickFilter: this.#quickFilter,\n getRowId: this.getRowId,\n });\n // A new order or filter starts over from the first row, so show it.\n if (this.dataSource && this.hasUpdated && (changed.has('sorting') || filtersChanged)) {\n this.#scrollToTop = !changed.has('dataSource');\n }\n // Other rows: a position restored for the old ones no longer applies.\n this.#scrollTarget = undefined;\n }\n if (filtersChanged && this.hasUpdated) this.#announceRows = true;\n if (\n this.#columnsChanged ||\n changed.has('data') ||\n changed.has('getRowId') ||\n changed.has('sorting') ||\n changed.has('columnSizing') ||\n changed.has('columnOrder') ||\n changed.has('columnPinning') ||\n changed.has('columnVisibility') ||\n changed.has('columnFilters') ||\n changed.has('quickFilter') ||\n changed.has('pinnedRows')\n ) {\n if (this.#columnsChanged) {\n this.#autoWidths.sync(columns.filter((c) => c.width === 'auto').map((c) => c.id));\n }\n this.#table.update({\n columns,\n data: this.data,\n getRowId: this.getRowId,\n sorting: this.#sorting.value,\n columnSizing: this.#sizing.value,\n columnOrder: this.#order.value,\n columnPinning: this.#pinning.value,\n columnVisibility: this.#visibility.value,\n columnFilters: this.#filters.value,\n quickFilter: this.#quickFilter,\n pinnedRows: this.pinnedRows,\n });\n }\n // A new page cache (new source, sort order or refresh) or none, and new measured widths.\n const autoWidths = this.#autoWidths.widths;\n this.#autoWidthsChanged = autoWidths !== this.#pushedAutoWidths;\n this.#pushedAutoWidths = autoWidths;\n const selectionColumn = this.selectionCheckboxes && this.#mode() !== 'none';\n this.#selectionColumnChanged = selectionColumn !== this.#selectionColumn;\n this.#selectionColumn = selectionColumn;\n this.#table.update({ remote: this.#data.rows, autoWidths, selectionColumn });\n const model = this.#table.model;\n this.#reconcileActive(model);\n const active = this.#active;\n // -1 tells assistive tech the total is unknown (a data source still growing).\n const unknownTotal = this.#data.rows?.totalKnown === false;\n const layout = layoutOf(model);\n this.#internals.ariaRowCount = unknownTotal ? '-1' : String(layout.total);\n this.#internals.ariaColCount = String(model.columns.length);\n this.#internals.ariaMultiSelectable = this.#mode() === 'multi' ? 'true' : null;\n // The header and pinned rows scroll with the body.\n const extra = this.#rowPx + this.#pinnedPx('top', layout) + this.#pinnedPx('bottom', layout);\n const auto = this.rowHeight === 'auto';\n if (!auto) this.#rowMeasure.stop();\n // Anything but a scroll may change what rows hold (data, columns, widths).\n else if (changed.size > 0 || this.#columnsChanged) this.#rowMeasure.invalidate();\n this.#virtual.configure({\n count: model.rowCount,\n rowHeight: this.#rowPx,\n cap: (logical) => bodyCap(logical, extra),\n auto: auto ? { order: model.rowOrder, indexOf: (id) => model.indexOf(id) } : undefined,\n overscan: Math.max(0, this.overscan),\n rowIdAt: (index) => this.#rowId(model, index),\n // The active body row stays rendered, so the tab stop and focus survive scrolling.\n keep:\n active?.section !== 'body' || active.rowId === undefined\n ? undefined\n : { id: active.rowId, index: active.index },\n });\n }\n\n protected override render(): TemplateResult {\n const model = this.#table.model;\n const columns = model.columns;\n this.#window = this.#virtual.computeWindow();\n const rendered = this.#columnWindow.compute(\n columns,\n this.virtualizeColumns,\n this.virtualizeColumns ? this.#keptColumns(model) : [],\n );\n this.#rendered = rendered;\n const pinnedWidth = (side: 'start' | 'end') =>\n columns.reduce((sum, c) => (c.pin === side ? sum + c.width : sum), 0);\n const pinned = (side: 'start' | 'end') => `${String(pinnedWidth(side))}px`;\n const layout = layoutOf(model);\n const style: Record<string, string> = {\n '--_cols': columns.map(track).join(' '),\n '--_width': `${String(model.totalWidth)}px`,\n '--_pin-start': pinned('start'),\n '--_pin-end': pinned('end'),\n '--_pin-top-rows': String(layout.top),\n '--_pin-bottom-rows': String(layout.bottom),\n };\n const auto = this.rowHeight === 'auto';\n if (auto) {\n // New column widths or a new row height rewrap rows: read them all again.\n const key = `${style['--_cols'] ?? ''}|${String(this.#rowPx)}`;\n if (key !== this.#rowsKey) {\n this.#rowsKey = key;\n this.#rowMeasure.invalidate();\n }\n style['--_pin-top-h'] = `${String(this.#pinnedPx('top', layout))}px`;\n style['--_pin-bottom-h'] = `${String(this.#pinnedPx('bottom', layout))}px`;\n }\n const active = this.#active;\n const activeIn = (section: GridRow['section']): ActiveCell | undefined =>\n active?.section === section ? { index: active.index, col: active.col } : undefined;\n const firstIndex = (section: GridRow['section']) => layout.ariaRowIndex({ section, index: 0 });\n if (typeof this.rowHeight === 'number' && this.rowHeight > 0) {\n style['--_row-height'] = `${String(this.rowHeight)}px`;\n }\n // The header, the pinned rows and the body: what the pinned-column shadows cover.\n const contentPx =\n this.#rowPx +\n this.#pinnedPx('top', layout) +\n this.#pinnedPx('bottom', layout) +\n (model.rowCount === 0 ? 0 : this.#window.totalSize);\n return html`<div\n part=\"table\"\n role=\"presentation\"\n style=${styleMap(style)}\n ?data-dragging=${this.#drag !== undefined}\n ?data-auto-rows=${auto}\n @keydown=${this.#onKeydown}\n @focusin=${this.#onFocusin}\n @mousedown=${this.#onMousedown}\n @click=${this.#onClick}\n >\n ${renderHeader(\n rendered,\n this.#headerHandlers,\n activeIn('header')?.col,\n this.#drag,\n this.#checkAllOf(model),\n )}\n ${renderPinnedRows('top', layout.top, rendered, firstIndex('top'), activeIn('top'))}\n ${\n model.rowCount === 0\n ? html`<div part=\"empty\"><slot name=\"empty\">No rows</slot></div>`\n : renderBody(\n this.#window.rows,\n rendered,\n this.#window.totalSize,\n activeIn('body'),\n firstIndex('body'),\n this.#loading(),\n this.#selectedAt(model),\n this.#selectionColumn ? this.#checkboxHandlers : undefined,\n auto,\n )\n }\n ${renderPinnedRows('bottom', layout.bottom, rendered, firstIndex('bottom'), activeIn('bottom'))}\n <div class=\"probe\" aria-hidden=\"true\"></div>\n </div>\n ${pinShadow('start', pinnedWidth('start'), contentPx)}\n ${pinShadow('end', pinnedWidth('end'), contentPx)}`;\n }\n\n protected override firstUpdated(): void {\n this.#observeProbe();\n this.#measureRowHeight();\n }\n\n protected override updated(changed: PropertyValues<this>): void {\n const model = this.#table.model;\n const part = renderLightDom(\n this,\n model,\n this.#window.rows,\n this.#rendered,\n this.#lightDomEnd(),\n );\n // A new marker starts a new part (the old one was removed): its content is gone.\n if (this.#lightPart && this.#lightPart !== part) this.#lightPart.setConnected(false);\n this.#lightPart = part;\n // Foreign content is committed before anything measures it.\n flushContent(this);\n this.#measureAutoWidths(model);\n // Rows of different heights: placed by the update this requests.\n const resized = this.rowHeight === 'auto' && this.#measureRows();\n if (this.#scrollToTop) {\n this.#scrollToTop = false;\n const scroller = this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]');\n if (scroller) scroller.scrollTop = 0;\n }\n this.#chaseScrollTarget(model.rowCount);\n if (\n this.#columnsChanged ||\n changed.has('columnSizing') ||\n changed.has('columnOrder') ||\n changed.has('columnPinning') ||\n changed.has('columnVisibility') ||\n this.#autoWidthsChanged ||\n this.#selectionColumnChanged\n ) {\n this.#pinScroll.measure();\n }\n // Rows that just changed height move with the next update: focus them there.\n if (this.#focusPending && !resized) {\n this.#focusPending = false;\n this.#focusActive();\n }\n if (changed.has('density') || changed.has('rowHeight')) this.#measureRowHeight();\n if (this.#appliedResizes.size > 0) {\n const details = [...this.#appliedResizes.values()];\n this.#appliedResizes.clear();\n for (const detail of details) fire(this, COLUMN_RESIZE, detail);\n }\n if (this.#announceMove) {\n this.#announceMoved(model, this.#announceMove);\n this.#announceMove = undefined;\n }\n if (this.#appliedReorders.size > 0) {\n const details = [...this.#appliedReorders.values()];\n this.#appliedReorders.clear();\n for (const detail of details) fire(this, COLUMN_REORDER, detail);\n }\n if (this.#appliedPins.size > 0) {\n const details = [...this.#appliedPins.values()];\n this.#appliedPins.clear();\n for (const detail of details) fire(this, COLUMN_PIN, detail);\n }\n if (this.#appliedHides.size > 0) {\n const details = [...this.#appliedHides.values()];\n this.#appliedHides.clear();\n for (const detail of details) fire(this, COLUMN_HIDE, detail);\n }\n if (this.#appliedFilters.size > 0) {\n const details = [...this.#appliedFilters.values()];\n this.#appliedFilters.clear();\n for (const detail of details) fire(this, COLUMN_FILTER, detail);\n }\n if (this.#announceRows) {\n this.#announceRows = false;\n this.#announceRowCount(model);\n }\n if (this.#appliedSort) {\n const sorting = this.#appliedSort;\n this.#appliedSort = undefined;\n fire(this, SORT_CHANGE, { sorting });\n }\n if (this.#appliedSelection) {\n const selection = this.#appliedSelection;\n this.#appliedSelection = undefined;\n fire(this, ROW_SELECT, { selection });\n }\n const { range } = this.#window;\n const key = range ? `${String(range.start)}:${String(range.end)}` : '';\n if (range && key !== this.#lastRange) {\n this.#lastRange = key;\n fire(this, RANGE_CHANGE, { start: range.start, end: range.end });\n }\n if (range) {\n // The rendered rows: visible plus overscan, end exclusive.\n const over = Math.max(0, this.overscan);\n this.#data.request(Math.max(0, range.start - over), range.end + 1 + over);\n }\n for (const detail of this.#data.takeErrors()) fire(this, LOAD_ERROR, detail);\n }\n\n /**\n * Columns to render wherever they are, with `virtualizeColumns`: the active\n * cell's (its tab stop and focus survive scrolling sideways, and keyboard\n * moves land on a rendered cell), one being dragged, auto widths still to\n * measure, the targets of `autosizeColumns()`, and with a `dataSource` the\n * first data column, which holds the Retry buttons.\n */\n #keptColumns(model: TableModel<T, CellContent>): (string | undefined)[] {\n return [\n this.#active?.col,\n this.#drag?.columnId,\n this.dataSource ? model.columns.find((c) => c.kind === 'data')?.id : undefined,\n ...this.#autoWidths.pending(model.columns),\n ...this.#measureKeep,\n ];\n }\n\n /**\n * Measures the `width: 'auto'` columns once loaded body rows render, or right\n * away when there are no rows (the header and pinned rows only). While a data\n * source's first rows load, they keep the default width. A changed width\n * renders once more.\n */\n #measureAutoWidths(model: TableModel<T, CellContent>): void {\n const loaded = this.#window.rows.some((r) => model.rowAt(r.index) !== undefined);\n if (!loaded && model.rowCount > 0) return;\n if (this.#autoWidths.measure(this.renderRoot, model.columns, loaded)) this.requestUpdate();\n }\n\n /**\n * Loading state for the body while a data source is set: the state of each\n * row, and a Retry button on the first visible row of each failed page.\n */\n #loading(): Loading | undefined {\n const cache = this.#data.rows;\n if (!cache) return undefined;\n const top = this.#window.range?.start ?? 0;\n const firstByPage = new Map<number, number>();\n for (const { index } of this.#window.rows) {\n if (index < top || cache.stateAt(index) !== 'error') continue;\n const page = cache.pageOf(index);\n const first = firstByPage.get(page);\n if (first === undefined || index < first) firstByPage.set(page, index);\n }\n const retry = new Map<number, string>();\n for (const [page, index] of firstByPage) {\n const start = page * cache.pageSize;\n const end = Math.min(start + cache.pageSize, cache.rowCount);\n retry.set(index, `Retry loading rows ${String(start + 1)} to ${String(end)}`);\n }\n return { stateAt: (index) => cache.stateAt(index), retry, onRetry: this.#onRetry };\n }\n\n readonly #onRetry = (event: Event) => {\n const button = event.currentTarget as HTMLElement;\n // The button goes away with the retry; keep focus in the grid, on its cell.\n if (button.matches(':focus')) button.parentElement?.focus({ preventScroll: true });\n this.#data.retry(Number(button.dataset.row));\n };\n\n /**\n * A row's id. A data source row that hasn't loaded gets a stand-in: the\n * active cell's row id if it sits there (so its DOM and focus stay put), else\n * the index, which is also its real id when there is no `getRowId`.\n */\n #rowId(model: TableModel<T, CellContent>, index: number): string {\n const id = model.rowAt(index)?.id;\n if (id !== undefined) return id;\n const active = this.#active;\n if (active?.index === index && active.rowId !== undefined) return active.rowId;\n return this.#placeholderId(index);\n }\n\n /** The id of an unloaded row: its index, or a reserved string if `getRowId` makes the ids. */\n #placeholderId(index: number): string {\n return this.getRowId ? `\\u0000${String(index)}` : String(index);\n }\n\n readonly #headerHandlers = {\n click: (event: MouseEvent) => {\n const id = sortColumnOf(event);\n if (id !== undefined) this.#requestSort(id);\n },\n pointerdown: (event: PointerEvent) => {\n if (event.button !== 0) return;\n const handle = event.composedPath()[0];\n if (!(handle instanceof HTMLElement)) return;\n const id = handle.dataset.resizeCol;\n const cell = handle.parentElement;\n if (id !== undefined && cell) {\n startResizeDrag(\n handle,\n event,\n cell.getBoundingClientRect().width,\n this.#direction(),\n (w) => {\n this.#requestResize(id, w);\n },\n );\n return;\n }\n this.#startReorder(event);\n },\n /** A double-click on a resize handle fits the column to its rendered content. */\n dblclick: (event: MouseEvent) => {\n const handle = event.composedPath()[0];\n const id = handle instanceof HTMLElement ? handle.dataset.resizeCol : undefined;\n if (id === undefined) return;\n this.#requestResizes(measureColumns(this.renderRoot, [id]));\n },\n };\n\n /**\n * Keys on a focused cell or header: arrows by cell, Home/End along the row,\n * PageUp/PageDown by a page of rows (the view scrolls with it), Ctrl+Home/End\n * (or Cmd) to the first header and the last cell. Keys from content inside a\n * cell (an input, a button) are left to that content.\n */\n readonly #onKeydown = (event: KeyboardEvent) => {\n const cell = gridCell(event.composedPath()[0] ?? event.target ?? this);\n const id = cell?.dataset.col;\n if (!cell || id === undefined) return;\n const scroller = event.currentTarget as HTMLElement;\n if (event.key === 'Tab' && event.shiftKey) {\n // Firefox makes the scroll container a tab stop, so Shift+Tab would stop\n // on it before leaving the grid. Take it out of the tab order for this\n // one move only: a tabindex there for good would expose it as a node of\n // its own between the grid and its rows.\n scroller.tabIndex = -1;\n // Put it back once focus has actually moved (a timer can run first).\n cell.addEventListener(\n 'focusout',\n () => {\n scroller.removeAttribute('tabindex');\n },\n { once: true },\n );\n return;\n }\n const pluginTarget = id === SELECTION_COLUMN_ID ? undefined : this.#cellTarget(event);\n if (pluginTarget && this.#plugins.keydown(event, pluginTarget)) return;\n const inHeader = cell.getAttribute('role') === 'columnheader';\n const { key } = event;\n const arrow = key === 'ArrowLeft' || key === 'ArrowRight';\n if (inHeader && arrow && event.altKey && event.shiftKey) {\n event.preventDefault();\n // Logical: the arrow pointing toward the inline end moves the column that way.\n const towardEnd = (key === 'ArrowRight') === (this.#direction() === 1);\n this.#moveByKey(id, towardEnd ? 1 : -1);\n return;\n }\n if (inHeader && event.altKey && arrow) {\n event.preventDefault();\n // Logical: the arrow pointing toward the inline end grows the column.\n const towardEnd = (key === 'ArrowRight') === (this.#direction() === 1);\n this.#requestResize(\n id,\n this.#currentWidth(id, cell) + (towardEnd ? RESIZE_STEP : -RESIZE_STEP),\n );\n return;\n }\n if (inHeader && (key === 'Enter' || key === ' ') && cell.dataset.sortCol !== undefined) {\n event.preventDefault();\n this.#requestSort(id);\n return;\n }\n if (this.#selectionKey(event, cell, id, inHeader, scroller)) return;\n // Ctrl (Cmd on macOS) only goes with Home and End: to the corners.\n const corner = event.ctrlKey || event.metaKey;\n if (event.altKey || event.shiftKey || (corner && key !== 'Home' && key !== 'End')) return;\n const model = this.#table.model;\n const layout = layoutOf(model);\n const from = inHeader ? HEADER : gridRowOf(cell.parentElement, layout);\n if (!from) return;\n if (!inHeader && key === 'Enter') {\n // Enter on a body cell does what a click does; on a failed row, it retries.\n event.preventDefault();\n if (from.section === 'body' && this.#data.stateAt(from.index) === 'error') {\n this.#data.retry(from.index);\n } else {\n this.#activate(event.composedPath());\n }\n return;\n }\n const columns = model.columns;\n // Rows step by grid position: header, pinned top, body, pinned bottom.\n let pos = layout.position(from);\n const last = layout.total - 1;\n let col = columns.findIndex((c) => c.id === id);\n switch (key) {\n case 'PageDown':\n case 'PageUp':\n case 'ArrowDown':\n case 'ArrowUp':\n pos = this.#verticalStep(key, pos, layout, scroller);\n break;\n case 'ArrowRight':\n col += this.#direction();\n break;\n case 'ArrowLeft':\n col -= this.#direction();\n break;\n case 'Home':\n col = 0;\n if (corner) {\n pos = 0;\n this.#virtual.scrollToEdge('start');\n }\n break;\n case 'End':\n col = columns.length - 1;\n if (corner) pos = last;\n break;\n default:\n return;\n }\n event.preventDefault();\n const row = layout.at(pos) ?? HEADER;\n // PageUp/PageDown scroll by as many rows as focus moved, so the focused cell\n // keeps its place on screen. The ends clamp; focusing scrolls the rest of\n // the way. Through the virtualizer: a scaled body's px aren't rows.\n if (key.startsWith('Page') && from.section === 'body' && row.section === 'body') {\n this.#virtual.scrollBy(this.#virtual.startOf(row.index) - this.#virtual.startOf(from.index));\n }\n // Ctrl+End onto a bottom pinned row: show the end of the body too, as\n // Ctrl+Home shows its start.\n if (corner && key === 'End' && row.section === 'bottom') {\n this.#virtual.scrollToEdge('end');\n }\n const target = columns[Math.min(Math.max(col, 0), columns.length - 1)];\n if (target) this.#moveTo(row, target.id, model);\n };\n\n /**\n * The grid position ArrowUp/ArrowDown (one row) or PageUp/PageDown (a page of\n * the body) moves to from `pos`. PageDown from above the body lands a page\n * into it and stops at its last row; PageUp stays in the body.\n */\n #verticalStep(\n key: 'PageDown' | 'PageUp' | 'ArrowDown' | 'ArrowUp',\n pos: number,\n layout: RowLayout,\n scroller: HTMLElement,\n ): number {\n const bodyFirst = layout.position({ section: 'body', index: 0 });\n const bodyLast = bodyFirst + layout.body - 1;\n const page = this.#pageRows(key, pos, layout, scroller);\n switch (key) {\n case 'PageDown':\n return layout.body > 0 && pos <= bodyLast\n ? Math.min(Math.max(pos, bodyFirst - 1) + page, bodyLast)\n : pos;\n case 'PageUp':\n return layout.body > 0 && pos > bodyFirst\n ? Math.max(Math.min(pos, bodyLast + 1) - page, bodyFirst)\n : pos;\n case 'ArrowDown':\n return Math.min(pos + 1, layout.total - 1);\n case 'ArrowUp':\n return Math.max(pos - 1, 0);\n }\n }\n\n /** How many rows PageUp/PageDown move from grid position `pos`. */\n #pageRows(key: string, pos: number, layout: RowLayout, scroller: HTMLElement): number {\n if (this.rowHeight !== 'auto') {\n // Whole rows between the sticky header and pinned rows (each one row tall).\n const fit = Math.floor(scroller.clientHeight / this.#rowPx + 0.01);\n return Math.max(1, fit - 1 - layout.top - layout.bottom);\n }\n // The body rows that fit between the header and the pinned rows, from the\n // focused body row (or the body's first or last row).\n const view =\n scroller.clientHeight -\n this.#rowPx -\n this.#pinnedPx('top', layout) -\n this.#pinnedPx('bottom', layout);\n const bodyFirst = layout.position({ section: 'body', index: 0 });\n const from = Math.min(Math.max(pos - bodyFirst, 0), Math.max(layout.body - 1, 0));\n return this.#virtual.pageRows(from, key === 'PageDown', view);\n }\n\n /**\n * Selection keys, with a `selectionMode`: Space (or Shift+Space) toggles the\n * focused body row; in `multi` mode, Shift+ArrowUp/ArrowDown and\n * Shift+PageUp/PageDown move focus through the body and select from the\n * anchor to it, and Ctrl/Cmd+A selects every row. `true` if it took the key.\n */\n #selectionKey(\n event: KeyboardEvent,\n cell: HTMLElement,\n col: string,\n inHeader: boolean,\n scroller: HTMLElement,\n ): boolean {\n const mode = this.#mode();\n if (mode === 'none' || event.altKey) return false;\n const { key } = event;\n const command = event.ctrlKey || event.metaKey;\n const model = this.#table.model;\n if (command && !event.shiftKey && key.toLowerCase() === 'a') {\n if (mode !== 'multi') return false;\n // Not the page's text: the rows.\n event.preventDefault();\n this.#selectAll();\n return true;\n }\n if (command) return false;\n if (inHeader) {\n // Space on the select-all header does what its checkbox does.\n if (key !== ' ' || col !== SELECTION_COLUMN_ID || mode !== 'multi') return false;\n event.preventDefault();\n this.#toggleAll();\n return true;\n }\n const layout = layoutOf(model);\n const from = gridRowOf(cell.parentElement, layout);\n if (from?.section !== 'body') return false;\n if (key === ' ') {\n // Space would scroll the table.\n event.preventDefault();\n const id = model.rowAt(from.index)?.id;\n if (id !== undefined) this.#requestSelection(toggleRow(this.#selection.value, mode, id));\n return true;\n }\n if (\n !event.shiftKey ||\n mode !== 'multi' ||\n (key !== 'ArrowDown' && key !== 'ArrowUp' && key !== 'PageDown' && key !== 'PageUp')\n ) {\n return false;\n }\n event.preventDefault();\n // A range stays in the body: the header and pinned rows can't be selected.\n const bodyFirst = layout.position({ section: 'body', index: 0 });\n const pos = this.#verticalStep(key, layout.position(from), layout, scroller);\n const to = layout.at(Math.min(Math.max(pos, bodyFirst), bodyFirst + layout.body - 1));\n if (to?.section !== 'body' || to.index === from.index) return true;\n if (key.startsWith('Page')) {\n this.#virtual.scrollBy(this.#virtual.startOf(to.index) - this.#virtual.startOf(from.index));\n }\n const fromId = model.rowAt(from.index)?.id;\n const anchor =\n this.#anchorAt(model) ??\n (fromId === undefined ? undefined : { id: fromId, index: from.index });\n if (anchor) {\n const idAt = (index: number) => model.rowAt(index)?.id;\n const selection = selectRange([], anchor.index, to.index, idAt, false);\n this.#requestSelection({ selection, anchor: anchor.id });\n }\n this.#moveTo(to, col, model);\n return true;\n }\n\n /** Focus that lands in a cell (a click, or content inside it) makes that cell active. */\n readonly #onFocusin = (event: FocusEvent) => {\n // Tab into the grid landed on the scroll container (Firefox makes it a tab\n // stop): move on to the grid's one tab stop, the active cell. Only when focus\n // came from outside the grid: coming from inside means the user is leaving,\n // and sending them back would trap the keyboard.\n const scroller = event.currentTarget as HTMLElement;\n if (event.composedPath()[0] === scroller) {\n const from = event.relatedTarget;\n if (!(from instanceof Node && scroller.contains(from))) {\n this.#focusPending = true;\n this.requestUpdate();\n }\n return;\n }\n for (const target of event.composedPath()) {\n const cell = gridCell(target);\n if (cell?.dataset.col !== undefined) {\n const model = this.#table.model;\n const row =\n cell.getAttribute('role') === 'columnheader'\n ? HEADER\n : gridRowOf(cell.parentElement, layoutOf(model));\n const { col } = cell.dataset;\n const prev = this.#active;\n if (\n row &&\n (row.section !== prev?.section || row.index !== prev.index || col !== prev.col)\n ) {\n this.#active = { ...row, rowId: this.#gridRowId(model, row), col };\n this.requestUpdate();\n }\n return;\n }\n if (target === event.currentTarget) return;\n }\n };\n\n /**\n * `argus-cell-click`, then `argus-row-click`, for clicks in the body; then,\n * with a `selectionMode`, the click selects its row.\n */\n readonly #onClick = (event: MouseEvent) => {\n const path = event.composedPath();\n this.#activate(path);\n const mode = this.#mode();\n const target = mode === 'none' ? undefined : this.#selectableRowOf(path);\n if (!target) return;\n // A click in the checkbox column, beside the checkbox, toggles like it.\n const inSelectionCell = path.some(\n (t) => t instanceof HTMLElement && t.dataset.col === SELECTION_COLUMN_ID,\n );\n this.#clickRow(target, event, inSelectionCell || event.ctrlKey || event.metaKey);\n };\n\n /** Selects for a click on a row, through `clickSelection`. */\n #clickRow(target: SelectionTarget, event: MouseEvent, toggle: boolean): void {\n const model = this.#table.model;\n this.#requestSelection(\n clickSelection(\n this.#selection.value,\n this.#mode(),\n target,\n this.#anchorAt(model),\n { toggle, range: event.shiftKey },\n (index) => model.rowAt(index)?.id,\n ),\n );\n }\n\n /**\n * The checkboxes' handlers. The table owns their state: a click asks for a new\n * selection, and the render that always follows sets every box back to the\n * selection (`live()`), so a change a controlled host turns down unticks it\n * again. Not `preventDefault()`: for a real click the browser runs that render\n * inside the dispatch, then undoes the toggle after it, over the render. A\n * press leaves focus on the cell, so the grid's keys keep working.\n */\n readonly #checkboxHandlers: CheckboxHandlers = {\n row: (event) => {\n const index = Number((event.currentTarget as HTMLElement).dataset.row);\n const id = this.#table.model.rowAt(index)?.id;\n if (id !== undefined) this.#clickRow({ id, index }, event, true);\n this.requestUpdate();\n },\n all: () => {\n this.#toggleAll();\n this.requestUpdate();\n },\n press: (event) => {\n event.preventDefault();\n (event.currentTarget as HTMLElement).parentElement?.focus({ preventScroll: true });\n },\n };\n\n /** Selects every selectable row, keeping the others (with a `dataSource`: the loaded ones). */\n #selectAll(): void {\n const ids = this.#table.model.selectableIds();\n this.#requestSelection({\n selection: selectAll(this.#selection.value, ids),\n anchor: this.#anchor,\n });\n }\n\n /** The select-all checkbox: clears the selection when every row is selected, else selects all. */\n #toggleAll(): void {\n if (this.#checkAllState(this.#table.model) === 'all') {\n this.#requestSelection({ selection: [], anchor: this.#anchor });\n } else {\n this.#selectAll();\n }\n }\n\n /** The select-all checkbox, in the checkbox column of a `multi` table. */\n #checkAllOf(model: TableModel<T, CellContent>): CheckAll | undefined {\n if (!this.#selectionColumn || this.#mode() !== 'multi') return undefined;\n return { state: this.#checkAllState(model), handlers: this.#checkboxHandlers };\n }\n\n /**\n * Whether all, some or none of the selectable rows are selected. With `data`\n * it's worked out once per `selection`, `data` and `getRowId`, not on scroll;\n * with a `dataSource` every time, over the loaded rows, which eviction keeps few.\n */\n #checkAllState(model: TableModel<T, CellContent>): CheckAll['state'] {\n const count = (): CheckAll['state'] => {\n const ids = model.selectableIds();\n const selected = this.#selectedSet();\n const n = ids.reduce((sum, id) => (selected.has(id) ? sum + 1 : sum), 0);\n if (n === 0) return 'none';\n return n === ids.length ? 'all' : 'some';\n };\n if (this.#data.rows) return count();\n // Everything the rows of the model depend on: the data and what filters it.\n const key = [\n this.#selection.value,\n this.data,\n this.getRowId,\n this.#columns,\n this.#filters.value,\n this.#quickFilter,\n this.#visibility.value,\n ];\n const cached = this.#checkAll;\n if (cached?.key.length !== key.length || key.some((k, i) => k !== cached.key[i])) {\n this.#checkAll = { key, state: count() };\n }\n return this.#checkAll?.state ?? 'none';\n }\n\n /**\n * A Shift+press on a row in `multi` mode selects a range of rows, not the\n * page's text from the last click: no text selection, and the cell still\n * takes focus.\n */\n readonly #onMousedown = (event: MouseEvent) => {\n if (!event.shiftKey || event.button !== 0 || this.#mode() !== 'multi') return;\n const path = event.composedPath();\n if (!this.#selectableRowOf(path)) return;\n event.preventDefault();\n for (const target of path) {\n const cell = gridCell(target);\n if (cell) {\n cell.focus({ preventScroll: true });\n return;\n }\n }\n };\n\n /** `selectionMode`, with anything unknown read as `none`. */\n #mode(): SelectionMode {\n const mode = this.selectionMode;\n return mode === 'single' || mode === 'multi' ? mode : 'none';\n }\n\n /** Whether each rendered body row is selected; `undefined` without a `selectionMode`. */\n #selectedAt(model: TableModel<T, CellContent>): SelectedAt | undefined {\n if (this.#mode() === 'none') return undefined;\n const ids = this.#selectedSet();\n return (index) => {\n const id = model.rowAt(index)?.id;\n return id === undefined ? undefined : ids.has(id);\n };\n }\n\n /** `selection` as a set, rebuilt only when `selection` changes. */\n #selectedSet(): ReadonlySet<string> {\n const selection = this.#selection.value;\n if (this.#selectedIds?.of !== selection) {\n this.#selectedIds = { of: selection, ids: new Set(selection) };\n }\n return this.#selectedIds.ids;\n }\n\n /**\n * The loaded body row a pointer event is on, as a selection target. None for\n * the header, pinned rows, rows still loading, and presses on interactive\n * content in a cell (a button, a link, an input).\n */\n #selectableRowOf(path: readonly EventTarget[]): SelectionTarget | undefined {\n const row = path.find(\n (t): t is HTMLElement => t instanceof HTMLElement && t.getAttribute('role') === 'row',\n );\n if (!row || fromInteractive(path, row)) return undefined;\n const model = this.#table.model;\n const at = gridRowOf(row, layoutOf(model));\n if (at?.section !== 'body') return undefined;\n const id = model.rowAt(at.index)?.id;\n return id === undefined ? undefined : { id, index: at.index };\n }\n\n /** The anchor row and where it is now; `undefined` if it isn't in the rows (or not loaded). */\n #anchorAt(model: TableModel<T, CellContent>): SelectionTarget | undefined {\n const id = this.#anchor;\n const index = id === undefined ? undefined : model.indexOf(id);\n return id === undefined || index === undefined ? undefined : { id, index };\n }\n\n /**\n * Changes the selection through the controlled/uncontrolled rules, and moves\n * the anchor. A step that leaves the same rows selected fires nothing.\n */\n #requestSelection(step: SelectionStep | undefined): void {\n if (!step) return;\n this.#anchor = step.anchor;\n const old = this.#selection.value;\n if (sameSelection(step.selection, old)) return;\n const { value, applied } = this.#selection.request(step.selection);\n if (applied) {\n this.#appliedSelection = value;\n this.requestUpdate('selection', old);\n } else {\n fire(this, ROW_SELECT, { selection: value });\n }\n }\n\n /**\n * Fires `argus-cell-click` (when a cell is on the path), then `argus-row-click`,\n * for the body or pinned row on an event path. Clicks and Enter on a cell use\n * it. Rows that haven't loaded, the header and the checkbox column fire nothing.\n */\n #activate(path: EventTarget[]): void {\n let columnId: string | undefined;\n for (const target of path) {\n if (!(target instanceof HTMLElement)) continue;\n const role = target.getAttribute('role');\n if (role === 'gridcell') columnId = target.dataset.col;\n if (columnId === SELECTION_COLUMN_ID) return;\n if (role !== 'row') continue;\n const model = this.#table.model;\n const at = gridRowOf(target, layoutOf(model));\n if (!at || at.section === 'header') return;\n const { index } = at;\n if (at.section === 'body') {\n const row = model.rowAt(index);\n if (!row) return;\n if (columnId !== undefined) {\n fire(this, CELL_CLICK, {\n row: row.original,\n columnId,\n value: model.valueAt(index, columnId),\n });\n }\n fire(this, ROW_CLICK, { row: row.original, rowId: row.id, index });\n return;\n }\n const pinned = at.section;\n const row = model.pinnedRowAt(pinned, index);\n if (!row) return;\n if (columnId !== undefined) {\n fire(this, CELL_CLICK, {\n row: row.original,\n columnId,\n value: model.pinnedValueAt(pinned, index, columnId),\n pinned,\n });\n }\n fire(this, ROW_CLICK, { row: row.original, rowId: row.id, index, pinned });\n return;\n }\n }\n\n /** The id of a grid row: a body or pinned row's id; none for the header. */\n #gridRowId(model: TableModel<T, CellContent>, row: GridRow): string | undefined {\n switch (row.section) {\n case 'header':\n return undefined;\n case 'body':\n return this.#rowId(model, row.index);\n default:\n return model.pinnedRowAt(row.section, row.index)?.id;\n }\n }\n\n /** Makes a cell active and focuses it after the update. The keep-rendered rule renders its row. */\n #moveTo(row: GridRow, col: string, model: TableModel<T, CellContent>): void {\n this.#active = { ...row, rowId: this.#gridRowId(model, row), col };\n this.#focusPending = true;\n this.requestUpdate();\n }\n\n #focusActive(): void {\n const active = this.#active;\n if (!active) return;\n const col = CSS.escape(active.col);\n // aria-rowindex is unique across the grid: header, pinned and body rows.\n const index = layoutOf(this.#table.model).ariaRowIndex(active);\n const cell = this.renderRoot.querySelector<HTMLElement>(\n `[role='row'][aria-rowindex=\"${String(index)}\"] > [data-col=\"${col}\"]`,\n );\n if (!cell) return;\n cell.focus({ preventScroll: true });\n // A scaled body moves `ratio` px of rows per px scrolled, so the browser can't\n // scroll a body row into view: the virtualizer does, and the next update\n // (from its scroll) shows the row and scrolls sideways. Rows of different\n // heights too: rows measured on the way can move the row again, so it\n // scrolls until they're done.\n if (active.section === 'body' && (this.#virtual.scaled || this.rowHeight === 'auto')) {\n const layout = layoutOf(this.#table.model);\n const before = this.#rowPx + this.#pinnedPx('top', layout);\n if (this.#virtual.reveal(active.index, before, this.#pinnedPx('bottom', layout))) {\n this.#focusPending = true;\n return;\n }\n }\n cell.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n /**\n * Keeps the active cell valid after columns or rows change. In the body: on the\n * same row id when it still exists (it may have moved), else at the same\n * index, clamped. A data source row that isn't loaded (yet, or any more) keeps\n * its id. A pinned row stays at its index, clamped to its list. A row whose\n * section has no rows left gives way to the header, the default. If its row\n * went away while the grid had focus, focus follows to the replacement.\n */\n #reconcileActive(model: TableModel<T, CellContent>): void {\n const columns = model.columns;\n const first = columns[0];\n if (!first) {\n this.#active = undefined;\n return;\n }\n const prev = this.#active ?? { ...HEADER, rowId: undefined, col: first.id };\n const col = columns.some((c) => c.id === prev.col)\n ? prev.col\n : this.#columnInPlaceOf(model, prev.col, first.id);\n let { section, index, rowId } = prev;\n // The cell went away with its column while focused: focus its replacement.\n let moved = col !== prev.col && this.#active !== undefined;\n if (section === 'body' && rowId !== undefined) {\n const found = model.indexOf(rowId);\n const unloaded = index < model.rowCount && model.rowAt(index) === undefined;\n if (found !== undefined) {\n index = found;\n } else if (!unloaded) {\n index = Math.min(index, model.rowCount - 1);\n rowId = index >= 0 ? (model.rowAt(index)?.id ?? this.#placeholderId(index)) : undefined;\n moved = true;\n }\n } else if (section === 'top' || section === 'bottom') {\n const count = model.pinnedCount(section);\n if (index >= count) {\n index = count - 1;\n moved = true;\n }\n rowId = index >= 0 ? model.pinnedRowAt(section, index)?.id : undefined;\n }\n if (index < 0) {\n ({ section, index } = HEADER);\n rowId = undefined;\n }\n if (moved && this.matches(':focus-within')) this.#focusPending = true;\n if (\n section !== prev.section ||\n index !== prev.index ||\n rowId !== prev.rowId ||\n col !== prev.col ||\n !this.#active\n ) {\n this.#active = { section, index, rowId, col };\n }\n }\n\n /**\n * The shown column that takes a hidden column's place: the next one in the\n * column order, else the one before it. `fallback` for a column that is gone\n * altogether.\n */\n #columnInPlaceOf(model: TableModel<T, CellContent>, id: string, fallback: string): string {\n const all = model.allColumns;\n const at = all.findIndex((c) => c.id === id);\n if (at < 0) return fallback;\n const shown = (c: ColumnView<T, CellContent>) => !c.hidden;\n return (all.slice(at + 1).find(shown) ?? all.slice(0, at).findLast(shown))?.id ?? fallback;\n }\n\n /**\n * The width a resize starts from: the latest requested width (key presses can\n * come faster than renders), else the model's fixed width, else the rendered\n * width of a flex column.\n */\n #currentWidth(columnId: string, cell: HTMLElement): number {\n const sized = this.#sizing.value[columnId];\n if (sized !== undefined) return sized;\n const view = this.#table.model.columns.find((c) => c.id === columnId);\n return view && view.flex === undefined ? view.width : cell.getBoundingClientRect().width;\n }\n\n #direction(): 1 | -1 {\n return getComputedStyle(this).direction === 'rtl' ? -1 : 1;\n }\n\n /** Sets one column's width (clamped by core), through the controlled/uncontrolled rules. */\n #requestResize(columnId: string, width: number): void {\n this.#requestResizes(new Map([[columnId, width]]));\n }\n\n /**\n * Sets column widths (clamped by core) in one change, through the\n * controlled/uncontrolled rules. One `argus-column-resize` per column that\n * changes, each with the whole new sizing.\n */\n #requestResizes(widths: ReadonlyMap<string, number>): void {\n const model = this.#table.model;\n const old = this.#sizing.value;\n const targets: [string, number][] = [];\n for (const [columnId, width] of widths) {\n const target = model.nextSizing(columnId, width)?.[columnId];\n if (target !== undefined && target !== old[columnId]) targets.push([columnId, target]);\n }\n if (targets.length === 0) return;\n const { value, applied } = this.#sizing.request({ ...old, ...Object.fromEntries(targets) });\n const details = targets.map(([columnId, width]) => ({ columnId, width, sizing: value }));\n if (applied) {\n // Only the latest width per column fires, all with the latest sizing.\n for (const detail of this.#appliedResizes.values()) detail.sizing = value;\n for (const detail of details) this.#appliedResizes.set(detail.columnId, detail);\n this.requestUpdate('columnSizing', old);\n } else {\n for (const detail of details) fire(this, COLUMN_RESIZE, detail);\n }\n }\n\n /**\n * Pins or unpins a column through the controlled/uncontrolled rules. Starts\n * from the latest requested pins, so requests can come faster than renders.\n */\n #requestPin(columnId: string, pin: ColumnPin | false): void {\n const old = this.#pinning.value;\n const next = this.#table.model.nextPinning(columnId, pin, old);\n if (!next) return;\n const { value, applied } = this.#pinning.request(next);\n if (applied) {\n for (const detail of this.#appliedPins.values()) detail.pinning = value;\n this.#appliedPins.set(columnId, { columnId, pin, pinning: value });\n this.requestUpdate('columnPinning', old);\n } else {\n fire(this, COLUMN_PIN, { columnId, pin, pinning: value });\n }\n }\n\n /** Hides or shows a column through the controlled/uncontrolled rules. */\n #requestHide(columnId: string, hidden: boolean): void {\n const old = this.#visibility.value;\n const next = this.#table.model.nextVisibility(columnId, hidden, old);\n if (!next) return;\n const { value, applied } = this.#visibility.request(next);\n if (applied) {\n for (const detail of this.#appliedHides.values()) detail.visibility = value;\n this.#appliedHides.set(columnId, { columnId, hidden, visibility: value });\n this.requestUpdate('columnVisibility', old);\n } else {\n fire(this, COLUMN_HIDE, { columnId, hidden, visibility: value });\n }\n }\n\n /** Sets or clears a column's filter through the controlled/uncontrolled rules. */\n #requestFilter(columnId: string, filter: ColumnFilter | undefined): void {\n const old = this.#filters.value;\n const next = this.#table.model.nextFilters(columnId, filter, old);\n if (!next) return;\n const { value, applied } = this.#filters.request(next);\n if (applied) {\n for (const detail of this.#appliedFilters.values()) detail.filters = value;\n this.#appliedFilters.set(columnId, { columnId, filter, filters: value });\n this.requestUpdate('columnFilters', old);\n } else {\n fire(this, COLUMN_FILTER, { columnId, filter, filters: value });\n }\n }\n\n /**\n * Says how many rows the filters leave (\"42 rows\"). With a `dataSource` the count\n * isn't known until the first page answers, so nothing is said.\n */\n #announceRowCount(model: TableModel<T, CellContent>): void {\n if (this.#data.rows) return;\n const n = model.rowCount;\n announce(this.ownerDocument, n === 1 ? '1 row' : `${String(n)} rows`);\n }\n\n /**\n * Moves a column to position `to` among the shown data columns (within its pin group),\n * through the controlled/uncontrolled rules. Starts from the latest requested\n * order, so moves can come faster than renders. `false` if it can't move there.\n */\n #requestReorder(columnId: string, to: number): boolean {\n const old = this.#order.value;\n const next = this.#table.model.nextOrder(columnId, to, old);\n if (!next) return false;\n const { value, applied } = this.#order.request(next);\n if (applied) {\n for (const detail of this.#appliedReorders.values()) detail.order = value;\n this.#appliedReorders.set(columnId, { columnId, order: value });\n this.requestUpdate('columnOrder', old);\n } else {\n fire(this, COLUMN_REORDER, { columnId, order: value });\n }\n return true;\n }\n\n /** Alt+Shift+Arrow on a header: one step toward the start (-1) or the end (1). */\n #moveByKey(columnId: string, step: 1 | -1): void {\n const model = this.#table.model;\n // From the latest requested order, so presses can come faster than renders.\n // Positions count the shown columns: hidden ones keep their place.\n const shown = new Set(model.columns.map((c) => c.id));\n const from = model\n .orderOf(this.#order.value)\n .filter((id) => shown.has(id))\n .indexOf(columnId);\n const view = model.columns.find((c) => c.id === columnId);\n if (from < 0 || !view) return;\n if (!this.#requestReorder(columnId, from + step)) return;\n // The header node moves, which drops its focus: focus it again once rendered.\n this.#focusPending = true;\n this.#announceMove ??= { id: columnId, from: view.colIndex };\n this.requestUpdate();\n }\n\n /** Tells screen readers where a column moved from the keyboard went. */\n #announceMoved(model: TableModel<T, CellContent>, move: { id: string; from: number }): void {\n const view = model.columns.find((c) => c.id === move.id);\n if (!view || view.colIndex === move.from) return;\n const header = this.renderRoot.querySelector(\n `[role='columnheader'][data-col=\"${CSS.escape(move.id)}\"] > slot`,\n );\n const name =\n header instanceof HTMLSlotElement\n ? header\n .assignedNodes({ flatten: true })\n .map((n) => n.textContent)\n .join('')\n .trim()\n : '';\n announce(\n this.ownerDocument,\n `${name || move.id} moved to column ${String(view.colIndex)} of ${String(model.columns.length)}`,\n );\n }\n\n /** A press on a reorderable header: becomes a drag once the pointer moves. */\n #startReorder(down: PointerEvent): void {\n const cell = down\n .composedPath()\n .find(\n (t): t is HTMLElement =>\n t instanceof HTMLElement && t.getAttribute('role') === 'columnheader',\n );\n const columnId = cell?.dataset.moveCol;\n if (!cell || columnId === undefined || !canStartReorder(down, cell)) return;\n const scroller = this.renderRoot.querySelector<HTMLElement>('[part~=\"table\"]');\n if (!scroller) return;\n const pin = this.#table.model.columns.find((c) => c.id === columnId)?.pin;\n startReorderDrag(cell, down, {\n scroller,\n targetAt: (x) => dropTarget(this.#dropSlots(pin), columnId, x, this.#direction()),\n scrollArea: () => (pin === undefined ? this.#scrollArea(scroller) : undefined),\n onStart: () => {\n this.#drag = { columnId, target: undefined };\n this.requestUpdate();\n },\n onTarget: (target) => {\n this.#drag = { columnId, target };\n this.requestUpdate();\n },\n onDrop: (target) => {\n this.#drag = undefined;\n if (target && this.#requestReorder(columnId, target.to)) {\n // The header node moves, which drops its focus: focus it again once rendered.\n if (this.matches(':focus-within')) this.#focusPending = true;\n }\n this.requestUpdate();\n },\n onCancel: () => {\n this.#drag = undefined;\n this.requestUpdate();\n },\n });\n }\n\n /**\n * The rendered headers of one pin group, with their positions in the whole\n * order (which leaves out the checkbox column).\n */\n #dropSlots(pin: ColumnView<T, CellContent>['pin']): DropSlot[] {\n const slots: DropSlot[] = [];\n const columns = this.#table.model.columns.filter((c) => c.kind === 'data');\n columns.forEach((c, index) => {\n if (c.pin !== pin) return;\n const cell = this.renderRoot.querySelector(\n `[role='columnheader'][data-col=\"${CSS.escape(c.id)}\"]`,\n );\n if (cell) slots.push({ id: c.id, index, rect: cell.getBoundingClientRect() });\n });\n return slots;\n }\n\n /** Where the scrolling columns show: the scroller's inside, less the pinned columns. */\n #scrollArea(scroller: HTMLElement): { left: number; right: number } {\n const columns = this.#table.model.columns;\n const width = (side: 'start' | 'end') =>\n columns.reduce((sum, c) => (c.pin === side ? sum + c.width : sum), 0);\n const ltr = this.#direction() === 1;\n const left = scroller.getBoundingClientRect().left + scroller.clientLeft;\n return {\n left: left + width(ltr ? 'start' : 'end'),\n right: left + scroller.clientWidth - width(ltr ? 'end' : 'start'),\n };\n }\n\n /** asc → desc → unsorted, through the controlled/uncontrolled rules. */\n #requestSort(columnId: string): void {\n const next = this.#table.model.nextSorting(columnId);\n if (next) this.#applySorting(next);\n }\n\n /**\n * A plugin's sort: by a column in a direction, or (`null`) cleared if it is by\n * that column. Only sortable columns, and only a change.\n */\n #setSort(columnId: string, direction: 'asc' | 'desc' | null): void {\n const view = this.#table.model.columns.find((c) => c.id === columnId);\n if (view?.kind !== 'data' || !view.sortable) return;\n const sorted = view.sorted === false ? null : view.sorted;\n if (direction === sorted) return;\n if (direction === null) this.#applySorting([]);\n else this.#applySorting([{ id: columnId, desc: direction === 'desc' }]);\n }\n\n /** A new sort order, through the controlled/uncontrolled rules. */\n #applySorting(next: SortState): void {\n const old = this.#sorting.value;\n const { value, applied } = this.#sorting.request(next);\n if (applied) {\n this.#appliedSort = value;\n this.requestUpdate('sorting', old);\n } else {\n fire(this, SORT_CHANGE, { sorting: value });\n }\n }\n\n /**\n * A data column as plugins see it. Header functions call this on every\n * render, so the views are indexed by id once per new column list.\n */\n #columnInfo(id: string): ColumnInfo | undefined {\n const columns = this.#table.model.allColumns;\n if (this.#columnsById?.of !== columns) {\n this.#columnsById = { of: columns, byId: new Map(columns.map((c) => [c.id, c])) };\n }\n const view = this.#columnsById.byId.get(id);\n if (view?.kind !== 'data') return undefined;\n return {\n id,\n sortable: view.sortable,\n resizable: view.resizable,\n pinnable: view.pinnable,\n hideable: view.hideable,\n pin: view.pin,\n hidden: view.hidden,\n width: view.width,\n sorted: view.sorted === false ? undefined : view.sorted,\n filter: view.filter,\n filterValue: this.#filters.value[id],\n };\n }\n\n /** The header or cell an event happened in, for plugins. */\n #cellTarget(event: Event): CellTarget | undefined {\n for (const target of event.composedPath()) {\n const cell = gridCell(target);\n const columnId = cell?.dataset.col;\n if (!cell || columnId === undefined) continue;\n const model = this.#table.model;\n const row =\n cell.getAttribute('role') === 'columnheader'\n ? HEADER\n : gridRowOf(cell.parentElement, layoutOf(model));\n if (!row) return undefined;\n return {\n section: row.section,\n columnId,\n rowIndex: row.index,\n rowId: this.#gridRowId(model, row),\n };\n }\n return undefined;\n }\n\n #observeProbe(): void {\n const probe = this.renderRoot.querySelector('.probe');\n if (!probe) return;\n this.#probeObserver ??= new ResizeObserver(() => {\n this.#measureRowHeight();\n });\n this.#probeObserver.observe(probe);\n }\n\n /** The height of the rows pinned to one side: one row each, or measured with `rowHeight: 'auto'`. */\n #pinnedPx(side: 'top' | 'bottom', layout: RowLayout): number {\n const count = side === 'top' ? layout.top : layout.bottom;\n if (this.rowHeight !== 'auto' || count === 0) return count * this.#rowPx;\n return Math.max(this.#rowMeasure.pinned[side], count * this.#rowPx);\n }\n\n /**\n * `rowHeight: 'auto'`: reads the heights of the rendered rows, after their\n * content has rendered. Returns whether any changed (an update is requested).\n */\n #measureRows(): boolean {\n const { rows, pinnedChanged } = this.#rowMeasure.read(this.renderRoot);\n const resized = this.#virtual.measureRows(rows);\n if (pinnedChanged) this.requestUpdate();\n return resized || pinnedChanged;\n }\n\n /** Reads the resolved row height, so themes and density change the virtualizer too. */\n #measureRowHeight(): void {\n const probe = this.renderRoot.querySelector('.probe');\n const px = probe?.getBoundingClientRect().height ?? 0;\n if (px > 0 && Math.abs(px - this.#rowPx) > 0.01) {\n this.#rowPx = px;\n this.requestUpdate();\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'argus-table': ArgusTable;\n }\n}\n"],"ignoreList":[0,1,2,3,4,5,6,7,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,70,71,72,73,74,75,79,80,81,84],"mappings":"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"}
|