comins-table 0.2.2 → 0.2.3

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["pathKey","getRegisteredTransferSnapshot","createCominsTableState","serializeCominsColumnLayout","valuesCore.getCominsColumnFilterOptions","valuesCore.setCominsColumnFilterValues","core.normalizeCominsColumnFilterModel","core.getCominsFilteredRowIndexes","_Fragment","_Fragment","bounds","rangeOf","getNestedFieldValue","normalizeCominsRowGrouping","createCominsGroupModel","orderCominsGroupModel","core.normalizeCominsRowGrouping","core.createCominsGroupModel","core.orderCominsGroupModel","getBrowserSnapshot","reduceCominsViewportData","reduceCoreViewportData","reduceCominsViewportData","_Fragment","getRegisteredTransferSnapshot","getReactTransferSnapshot","getCrossTableTransferHit","getBrowserTransferHit","projectReactRows","isNativeEditor","resolveCominsColumnPinning","normalizeColumns","serializeCominsColumnLayout$1","getCominsPinnedBlockResizeMaxWidth","normalizeColumnGroups","getCominsColumnPinningSpanFragments","clampColumnWidth","parseCominsClipboardText","getEffectiveColumnMinWidth","createCominsTableState$1","setColumnWidthInsideParentGroup","getEffectiveColumnMaxWidth","setNestedFieldValue","projectReactGroup","pasteCominsCell","serializeCominsColumnLayout","isCominsCellInSelectedRange","moveCominsColumnGroup","moveCominsColumn","replaceCominsRows","setCominsHeaderVisible","setCominsColumnGroupWidth","selectCell","setCominsSortState","setCominsPagination","selectCellRange","pasteCominsRow","pasteCominsText","moveCominsRow","queryCominsRows","projectReactColumn","selectRow","isCominsCellDisabled","isCominsRowSelected","setCominsColumnHidden","setCominsColumnGroupHidden","setCominsColumnWidth","sortCominsRows","setCominsTableTheme","updateCominsRows","getCominsPageRows","clearCominsSortState","getCominsVirtualRows","copyCominsRow","fillCominsCellRange","projectReactState","formatCominsCellValue","getCominsHeaderRows","getCominsCellValue","clearCominsSelection","pasteCominsCellRange","moveCominsRowToGroup","createCominsTableState","getCominsCellStyle","applyCominsColumnLayout","copyCominsCell","getCominsCellClassName","setCominsSortModel","clearCominsCellRange","copyCominsCellRange","addCominsRows","deleteCominsRows","getCominsSelectedCellRange","isCominsCellSelected","getCominsVisibleColumns","getCominsSortedRowIndexes","selectRows","getCominsFilteredRowIndexes$1","createCominsTreeExportOptions","exportCominsRowsToJson","getCominsColumnFilterOperators","importCominsRowsFromCsv","searchFilterOptions","normalizeCominsColumnFilterModel$1","setCominsColumnFilterValues$1","createCominsGroupedExportOptions","getCominsColumnFilterOptions$1","exportCominsRowsToCsv","React","Fragment$1","getCominsColumnMouseIntent","horizontalDelta","clientX","startX","verticalDelta","clientY","startY","getCominsDragAutoScrollVelocity","height","bottom","top","edgeBand","getCominsDragAutoScrollTop","maxScrollTop","scrollHeight","clientHeight","scrollTop","deltaMs","velocity","getCoreCellBounds","a","rows","range","b","c","columns","d","getCoreCellRange","box","resolveCoreFillTarget","source","rowIds","columnIds","row","address","column","dy","dx","extended","planCoreSelectionCopy","order","kind","target","cells","selectedRowIds","selectedRows","rowPositions","id","index","columnPositions","selected","positions","cell","firstRow","lastRow","firstColumn","lastColumn","position","pathKey$1","path","resolveCoreTreeDropContext","entries","entry","sourceId","targetId","parentPath","parent","nextSibling","resolveCoreTreePointerPosition","fraction","allowReparent","captureCominsPointer","pointerId","released","registerCominsPointerListeners","input","move","up","cancel","blur","key","keyCapture","startCominsPointerFrames","stopped","tick","onFrame","time","host","frame","focusCominsPointerTarget","applyCominsDragScroll","next","viewport","isCominsNativeEditor","createCrossTableAutoScroll","animationFrame","lastTimestamp","stop","runFrame","currentViewport","timestamp","bounds","nextScrollTop","moved","resolveTarget","valid","nextViewport","nextClientY","nextClientX","measureCominsElement","rect","element","createMeasurementObserver","targets","observer","generation","disposed","deliver","measurement","options","disconnect","activeGeneration","hasCominsResizeObserver","observeCominsViewport","onMeasure","observeCominsFontChanges","fonts","onChange","getCominsElementRect","setCominsScrollTop","setCominsScrollLeft","left","scrollCominsRowIntoView","focusCominsElement","createCominsDetailFocusRestorer","frames","restoreFocus","toggle","getToggle","writeCominsClipboardText","text","readCominsClipboardEvent","data","writeCominsClipboardEvent","createTableTransferRegistry","scopes","tables","scope","registrations","tableId","registration","getRegisteredTransferSnapshot$1","snapshot","registry","coordinator","getCrossTableTransferHit","sourceSnapshot","root","setCominsNestedInputValue","field","value","getNextSort","current","columnId","getNextSortModel","currentIndex","rule","nextRule","additive","getSortRule","getSortIndicatorState","currentRule","getAriaSortState","areSortStatesEqual","right","areSortModelsEqual","areRowIdSequencesEqual","insertDeclaredColumnsIntoOrder","declaredIndex","declaredOrder","followingColumnId","candidate","precedingColumnId","reconcileColumnOrderHistory","merged","history","currentIds","currentOrder","currentColumnId","canPreserveSelection","nextColumnIds","selectedCell","selectedCells","selectedRange","reconcileCoreState","declaredColumnOrder","nextInput","historicalOrder","columnOrderHistory","nextState","dataChanged","state","viewportIndices","reconcileCoreViewportSelection","invalidatedDetailRowIds","getRowIdChanged","previousRowById","rowId","selection","indices","getCoreStateChanges","reconcileReactState","columnGroups","result","notifyReactStateChanges","changes","callbacks","notifyReactInputChanges","hasCellTooltipContent","content","useCominsCellTooltip","active","setActive","useState","activeRef","useRef","hovered","focused","dismissed","leaveTimer","focusTimer","useId","clearLeave","clearFocus","close","dismiss","settleFocus","useLayoutEffect","useEffect","doc","onKeyDown","event","onScroll","onResize","anchor","CominsCellTooltip","surface","setPosition","controller","visible","win","updatePosition","theme","token","below","previous","ids","createPortal","getPathKey","createCominsTreeNodeIndex","byId","idByPath","itemIndex","visit","childIndex","getRowId","node","nodes","updateCominsTreeNodeAtPath","targetIndex","remainingPath","update","moveCominsTreeNode","sourcePath","destination","beforePath","samePath","i","sourceParent","siblingsAt","siblings","tree","part","sourceSiblings","sourceIndex","removed","detached","nextIndex","nextParent","nextBefore","children","flattenCominsTree","visibleRows","hasChildren","expanded","depth","getCominsTreeLeafItems","toggleCominsTreeNode","updateCominsTreeItem","sortCominsTreeSiblings","compare","getCorePageProjection","pageSize","pagination","maxPageIndex","visibleRowCount","effectivePageIndex","projectCoreViewportWindow","byIndex","loaded","rowCount","projectCoreRows","dataIndexes","dataIndex","absoluteIndex","page","getTreeNestedFieldValue","compareTreeValues","getSortedCoreTree","sortModel","leftValue","leftRow","rightValue","rightRow","getSortedReactTree","selectedRowData","selectedCellValues","encodeTsv","copySelectionData","plan","columnsById","getCominsColumnFilterOptions","setCominsColumnFilterValues","normalizeCominsColumnFilterModel","originals","getCominsFilteredRowIndexes","bindRef","cleanup","install","user","eventHandler","internal","visual","base","extra","partProps","params","createFilterButtonGetter","getProps","shared","aria","props","createCheckboxGetter","useValueFilter","query","setQuery","searchRef","readOnly","onChangeModel","open","enabled","useMemo","apply","actions","getOptionProps","getter","option","checked","custom","ValueFilterPanel","renderFilterTrigger","fallback","getFilterTriggerVisual","icons","DragHandleDots2Icon","ChevronRightIcon","MagnifyingGlassIcon","CaretSortIcon","CominsTableIcon","Icon","name","className","CominsTableIconButton","buttonProps","icon","operatorLabels","getDefaultOperator","getRuleInputValue","getRuleInputValueTo","isValidDateInput","year","month","day","date","CominsColumnFilterControl","buttonRef","onOpenChangeRef","onOpenChange","popoverRef","popoverId","operator","setOperator","setValue","valueTo","setValueTo","pendingRuleKeyRef","ruleKey","inputValue","appliedRuleKey","onChangeRule","requiresValue","valuesMode","values","valueSource","portalContainer","getPortalContainer","triggerParams","columnLabel","panel","controls","candidates","style","alive","inside","button","popover","width","handlePointerDown","handleKeyDown","handleFocusOut","positionFrame","trackPosition","emitRule","nextKey","renderPopover","commitRule","nextOperator","nextValue","firstValue","secondValue","nextValueTo","mergeClassName","resolveComponentProps","payload","resolveComponentOptions","resolveComponentMenuItems","resolveVirtualListItems","toSearchableText","isMenuSelectableItem","item","isNodeInside","stopComponentEvent","preventAndStopComponentEvent","toComponentInputValue","CominsInputComponent","component","_propsOnChange","inputProps","propValue","defaultValue","draftValue","setDraftValue","lastCommittedValueRef","commitValue","onBlur","onClick","onMouseDown","onPointerDown","CominsCheckboxComponent","optimisticChecked","setOptimisticChecked","defaultChecked","CominsToggleComponent","restButtonProps","buttonChildren","nextChecked","CominsHeaderMenuComponent","setOpen","menuId","triggerRef","menuRef","menuPosition","setMenuPosition","items","updateMenuPosition","trigger","menuWidth","requestOpen","nextOpen","menu","CominsCellVirtualListComponent","itemHeightProp","limitProp","rootProps","limit","itemHeight","defaultHeight","hasExplicitHeight","setExpanded","setScrollTop","selectedValue","setSelectedValue","viewportHeight","setViewportHeight","itemsViewportRef","isSingleRowSelected","searchEnabled","searchable","activeQuery","measuredHeight","filteredEntries","normalizedQuery","hasOverflow","virtualized","more","showOverflowControl","overscan","safeViewportHeight","visibleStart","visibleEnd","renderedEntries","topSpacerHeight","bottomSpacerHeight","listId","rootStyle","selectItem","interaction","renderCominsBuiltInComponent","selectProps","groupName","_value","divProps","max","percent","CominsRowDetailToggle","CominsRowDetailRow","contentRef","getToggleElementRef","restoreFocusRef","onContentElementRef","automatic","useCominsCellFill","latest","cancelRef","suppressClick","preview","setPreview","setMenu","closeMenu","focus","scroll","fillSelection","from","direction","begin","releasePointer","initial","initialSource","x","y","targetKey","lastTime","validSnapshot","horizontal","stopFrames","removeListeners","commit","previewBox","COMINS_ROW_GROUP_AGGREGATIONS","getNestedFieldValue$1","getColumnValue","createAggregateState","aggregation","updateAggregateState","getCominsAggregateValue","getCominsGroupSlotKey","groupId","normalizeCominsRowGrouping$1","columnById","aggregations","aggregationColumns","groupIds","groupsById","suppliedGroups","group","normalizedGroup","createCominsGroupModel$1","aggregationState","sourceRow","aggregateState","configuredColumn","defaultCompare","orderCominsGroupModel$1","orderedLeafSourceIndexesById","sortLeafIndexes","rowIndexes","leftIndex","rightIndex","projectCominsGroups","expandedGroupIds","visibleLeafRowIds","visibleLeafIndex","moveCominsRowGroup","nextGroups","sourceGroup","insertIndex","normalizeCominsRowGrouping","labels","normalized","render","label","createCominsGroupModel","orderCominsGroupModel","model","findRowIndex","endpoint","isGroupedEndpoint","getRowEndpoint","getGroupEndpoint","groupIndex","resolveConflict","resolver","conflict","copyGroups","groups","transferCominsRowBetweenTables","sourceGrouped","targetGrouped","sourceRowEndpoint","targetRowIndex","movedRow","targetGroupId","sourceGroupId","targetData","conflicts","duplicateIndex","normalizedTargetRowIndex","targetRowEndpoint","policy","lastGroupIndex","transferCominsGroupBetweenTables","sourceGroupIndex","sourceGroupEndpoint","targetGroups","duplicateGroupIndex","overwriteDataInsertIndex","overwriteGroupInsertIndex","targetGroupEndpoint","targetMemberIndexes","firstMemberIndex","sourceRowIds","duplicateRows","duplicate","duplicateRowIds","groupInsertIndex","targetGroupIndex","memberRows","dataInsertIndex","sourceMemberIndexes","coordinatorStates","getCoordinatorState","createCominsTableTransferCoordinator","isCominsTableTransferCoordinator","registerCominsTableTransfer","getRegisteredTransferSnapshot","useCominsTableTransferRegistration","emitCominsTableTransfer","emitCominsTableTransferRejected","rejection","CominsTooltipSurface","tone","CominsPointerTooltip","tooltipRef","maxLeft","preferredTop","fitsBelow","placement","normalizeCominsViewportInteger","createCominsViewportData","intersects","trim","required","block","request","protectedBlocks","others","blocks","loading","errors","protectedErrors","otherErrors","remaining","reduceCominsViewportData$1","startIndex","endIndex","clock","change","accepted","changed","requests","currentBlock","reduceCominsViewportData","normalizeCominsRowHeight","resolveCominsRowHeight","auto","CominsViewportHeightIndex","estimate","blockSize","maxBlocks","count","end","endExclusive","total","offset","low","high","middle","delta","first","last","requiredCount","planViewportRequests","needed","wanted","cancelRequestIds","releaseRequestIds","activeStarts","retryStarts","consumedRetryStarts","startRanges","retry","createViewportRequestExecutor","requestId","descriptor","runViewportRequest","dispatch","nextRequestId","useCominsViewportRequests","executor","retryBlocks","version","setVersion","start","onRequest","retained","onChangeData","nextRange","pathKey","useCominsTreeDrag","committed","gesture","navigateRef","pendingFocus","pendingScrollTop","announcement","setAnnouncement","targetPayload","finish","focusId","reason","handle","choose","context","disabled","draggable","lastEvent","pointer","insideX","now","keyboard","moveByKeyboard","getNumericValues","getBuiltinSummaryValue","numericValues","getNestedFieldValue","resolveCominsSummaryValues","renderedColumnIds","summary","valuesByColumnId","config","aggregate","formattedValue","rendered","getCominsSummaryValues","COMINS_MAX_PHYSICAL_TOTAL_HEIGHT","getCominsDataSlotKey","createCominsDataVirtualSlot","normalizeCominsDetailEstimate","fallbackHeight","normalizeCominsDetailHeight","CominsHeightIndex","heights","cursor","treeIndex","prefix","bit","nextPrefix","getCominsSlotHeight","slot","rowHeight","getCominsScrollScale","physicalScrollHeight","logicalTotalHeight","logicalScrollableHeight","physicalScrollableHeight","getCominsMixedVirtualRange","metrics","physicalScrollTop","logicalScrollTop","firstVisibleIndex","lastVisibleIndex","logicalStartOffset","resolveCominsMeasuredDetailHeight","cache","reconcileCominsDetailMeasurements","captureCominsScrollAnchor","previousIndex","slotStart","resolveCominsAnchorTarget","getCominsPhysicalScrollTop","useCominsViewport","setState","activeInitial","mounted","useCallback","onViewportRequest","isCominsGroupedTransferEndpoint","getCominsTransferIdentity","areCominsRowDragTargetsEqual","getCominsColumnDropStatus","orderChanged","selectRowForContextMenu","getCominsVirtualProjectionKeys","projection","captureCominsVirtualAnchor","previousKeys","previousLogicalScrollTop","toClassName","resolveRowProp","resolveRowProps","rowProps","getRowCustomBackground","background","getResolvedRowStyle","resolvedStyle","customBackground","createEventRow","createEventColumn","createRowPayload","createCellPayload","columnIndex","createComponentColumnPayload","createCellComponentPayload","rowDisabled","rowSelected","resolveRenderableCellProps","stopTreeSlotControlEvent","control","resolveDefaultRender","defaultContent","resolveTreeSlotContent","renderTreeSlot","resolveRenderableCellGuard","guard","isRenderableCellDisabled","getRenderableCellClassName","getRenderableCellStyle","formatRenderableCellValue","rawValue","createHeaderComponentPayload","columnState","sortRule","isCominsCellComponentPayload","shouldRenderCominsComponent","getRenderableCominsComponents","components","renderCominsComponentSlots","blockCominsColumnPlaceholderInteraction","blurCominsColumnPlaceholderFocus","cominsColumnPlaceholderNativeBoundaries","bindCominsColumnPlaceholderNativeBoundary","blockActiveInput","COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS","getCominsColumnPlaceholderText","collectPlainText","isValidElement","renderCominsContentWithComponents","showContent","renderableComponents","leftSlots","rightSlots","setCominsTreeExpansion","nodeIds","idByNode","ancestorIds","requestedIds","requestedBranchIds","expandedById","defaultExpandAll","ancestorsAllowExpand","ancestorId","currentExpanded","applyChanges","nextNodes","nextExpanded","nextChildren","CominsTableInner","bufferSize","dataTestId","providedRowHeight","detailFocusRestorer","containerRef","footerRef","headerRef","horizontalScrollbarRef","tableRootRef","cellTooltip","activeCellTooltipContent","copiedCellRef","copiedRangeRef","copiedRowRef","detailMeasurementsRef","rowMeasurementsRef","committedViewportIndexRef","viewportMeasurementAnchorRef","detailElementsRef","fallbackMeasuredDetailElementsRef","detailObserverRef","committedDetailObserverSnapshotRef","rowDetailToggleElementsRef","activePointerGestureCleanupRef","columnPointerInteractionRef","columnMoveAnimationCleanupRef","columnMoveAnimationSnapshotRef","headerRendererBodyRef","lastCellAnchorRef","lazyAbortControllerRef","lazyLoadingReasonRef","onLazyLoadRef","onLazyLoad","lazyRequestIdRef","lastLoadMoreRowCountRef","lastRowAnchorRef","rangeDragAnchorRef","rangeDragLastAddressRef","rangeDragMovedRef","rowMoveStateRef","pendingRowMoveScrollTopRef","rowGroupMoveStateRef","transferSnapshotRef","externalDropMarkerRef","transferRejectionTargetRef","transferRejectionTimerRef","pendingTransferFocusFrameRef","groupDisclosureElementsRef","pendingGroupDisclosureFocusRef","focusedLeafDataIndexRef","previousGroupedDataIndexesRef","anchorRevisionRef","logicalAnchorTransactionRef","pendingDetailAnchorRef","pendingScrollTopRef","previousVirtualProjectionRef","scrollCommitTimeoutRef","scrollFrameRef","suppressedSortClickRef","containerHeight","setContainerHeight","containerWidth","setContainerWidth","horizontalScrollContentWidth","setHorizontalScrollContentWidth","horizontalViewportOuterWidth","setHorizontalViewportOuterWidth","horizontalViewportWidth","setHorizontalViewportWidth","detailLayoutVersion","setDetailLayoutVersion","rowFontRevision","setRowFontRevision","movingColumnId","setMovingColumnId","movingGroupId","setMovingGroupId","columnMovePointer","setColumnMovePointer","columnMoveTarget","setColumnMoveTarget","logicalAnchorTransaction","setLogicalAnchorTransaction","resizingColumnId","setResizingColumnId","rowMoveState","setRowMoveState","rowGroupMoveState","setRowGroupMoveState","transferRejectionFeedback","setTransferRejectionFeedback","tableInstanceId","rowDetailIdPrefix","effectiveData","groupingRequested","treeContext","rowGrouping","filteringRequested","columnFiltering","normalizedTableTransfer","infiniteScroll","lazyLoad","tableTransfer","effectivePagination","effectiveRowProps","stateRef","columnOrderHistoryRef","stateInputRef","virtualBufferSize","resolvedLazyLoadBatchSize","lazyLoadBatchSize","resolvedLazyLoadThreshold","lazyLoadThreshold","infiniteScrollThreshold","hasLazyLoadHandler","resolvedRowDetailRender","rowDetail","renderRowDetail","rowDetailEnabled","viewportContext","normalizedExpandedRowIds","seen","expandedRowIds","expandedRowIdSet","toggleRowDetail","expandable","onChangeExpandedRowIds","clearActivePointerGesture","registerActivePointerGesture","clearExternalDropMarker","marker","clearTransferRejectionFeedback","updateState","showTransferRejectionFeedback","feedback","targetSnapshot","duplicateId","renderedContent","requestedDuration","duration","setExternalDropMarker","getRegisteredTransferSnapshot$2","getCrossTableTransferHit$1","scheduleTransferFocus","remainingAttempts","attemptFocus","targetTableId","identity","focusTarget","requestLazyLoad","lazyLoadHandler","lazyLoadMode","currentRowsLength","hasMoreRows","loadingMore","previousInput","showHeader","getRowHeight","updateMixedProjectionDetailHeight","slotIndex","nextSlotHeight","applyDetailMeasurementUpdates","updates","currentPendingDetailAnchor","viewportIndex","logical","pendingAnchor","updatedActiveIndex","revision","createDetailObserver","observed","disconnectDetailObserverIfIdle","registerDetailElement","currentElement","mode","notifyChanges","commitState","updater","visibleColumns","renderedHeaderRendererBodies","columnWidths","columnCount","configuredWidths","fallbackWidth","fixedTotal","flexibleColumns","flexibleWidth","minWidth","maxWidth","columnPinningBlocks","groupIdByColumnId","visibleColumnIds","widthByColumnId","emittedGroups","columnPinning","getPinnedColumnAttributes","pin","columnWidthTotal","totalWidth","tableWidth","detailContentWidth","headerRows","normalizedColumnFilters","filteringActive","normalizedColumnFilterById","filterSourceRows","filteredDataIndexes","filteredRows","summaryValues","summaryCells","requestedColSpan","colSpan","groupingAggregations","groupingGetGroupId","groupingGetGroupLabel","groupingLabelRender","groupingGetRowGroupId","groupingGroups","normalizedGrouping","groupModel","orderedGroupModel","normalizedExpandedGroupIds","expandedGroupIdSet","toggleRowGroup","onChangeExpandedGroupIds","groupingProjection","groupingActive","transferEndpoint","pendingGroupId","disclosure","nextDataIndexes","previousDataIndexes","focusedDataIndex","activeElement","fallbackGroupId","sortedRowIndexes","projectedDataIndexes","selectionRowIds","visibleSlotCount","visibleRowIds","cellHidden","visibleSelectedCells","cellsHidden","rangeHidden","effectiveExpandedRowIdSet","pageStartIndex","visibleIndex","isRowExpandable","rowLayoutKey","rowContentRevision","viewportIndexById","rowProjection","fullProjectionSlots","safeRowHeight","projectionEntry","detail","resolvedHeight","estimatedRowHeight","getRowDetailHeight","estimatedRowDetailHeight","mixedProjection","slots","heightIndex","slotIndexByRowId","scale","logicalTop","viewportConfigurationKey","viewportIndexKey","viewportHeightIndex","previousViewportIndex","viewportAnchor","physical","viewportAnchorLogical","targetLogical","requestedPhysical","transaction","detailObserverSnapshotCandidate","currentObserver","rowWindow","activeAnchorTransaction","totalHeight","physicalTotalHeight","scrollScale","logicalTopSpacerHeight","viewportRenderedRange","lastViewportSlot","retryViewport","currentVirtualProjection","previousVirtualProjection","pendingDetailAnchor","pendingVirtualAnchor","pendingAnchorTransaction","treeMoveScrollTop","rowMoveScrollTop","nextKeys","anchorLogicalScrollTop","nextLogicalTotalHeight","nextViewportHeight","nextLogicalScrollTop","nextPhysicalScrollTop","actualPhysicalScrollTop","nextAnchorTransaction","currentTheme","densityClass","selectedRowIdSet","hasHorizontalOverflow","nextContentWidth","nextViewportOuterWidth","nextViewportWidth","synchronizedHorizontalViewportWidth","synchronizedHorizontalScrollbarWidth","synchronizedHorizontalContentWidth","resolvedHasMoreRows","resolvedLoading","resolvedLoadingMore","isEmpty","shouldRenderSkeleton","shouldRenderEmpty","shouldRenderInfiniteLoadingRow","resolvedSkeletonRowCount","skeletonRowCount","stateRowCount","renderedRowsHeight","emptyFillerHeight","renderedHeaderVisible","persistHeaderWhenEmpty","isCopyPasteKey","getVisibleEntryByRenderedIndex","getVisibleRowIdsBetween","anchorIndex","anchorRowId","focusIndex","focusRowId","visibleEntries","selectRowRangeByIds","selectRowsByVisibleIndexes","indexes","clearSuppressedSortClick","suppressed","suppressNextSortClick","scheduleSuppressedSortClickClear","keepSuppressedSortClickUntilPointerEnd","handlePointerUp","handlePointerCancel","handleWindowBlur","consumeSuppressedSortClick","activateHeaderSort","nextModel","multiSort","header","getColumnMoveTarget","targetHeader","getColumnMoveTargetIndex","targetColumnId","childId","getColumnMoveHeaderPinned","ref","prepareSelectionCopy","cellFill","getSelectionRowOrder","nextGroupIds","nextGroupIdSet","groupIdSet","layout","sourceRowId","sourceIdx","targetIdx","nextVisibleRowIds","targetPosition","rowById","nextRows","sort","fillHandle","cellSelection","onClipboardError","clearColumnPointerInteraction","captureColumnMoveAnimationSnapshot","elements","animatedElements","previousLeft","timeout","beginColumnPointerInteraction","pointerType","isMousePointer","suppressPendingSort","activateCurrent","handlePointerMove","intent","moveEvent","upEvent","keyEvent","beginHeaderPointerInteraction","beginGroupPointerInteraction","selectRowFromInteraction","handleRowKeyDown","onKeyDownRow","getClipboardState","visibleIndexes","applicationPayload","original","resolved","isLoadedCellRange","min","handleCellKeyDown","onKeyDownCell","clipboard","clipboardState","clipboardPaste","beginCellRangeDrag","anchorId","getCellAddressFromPoint","updateCellRangeDrag","endCellRangeDrag","beginCellRangePointerDrag","nextAddress","beginRowHandlePointerDrag","sourceTableId","onBeforeRowDrag","crossTarget","autoScroll","finished","lastPointerEvent","lastTarget","registeredCleanup","notifyTarget","onRowDrag","pointerEvent","onAfterDragRow","setActiveRowMoveState","resolveCrossTarget","hit","sourceEndpoint","targetEndpoint","sourceDataIndex","rowElement","groupElement","targetRowId","structurallyValid","targetDataIndex","targetRow","targetGroup","updateTarget","pointElement","targetTableInstanceId","moveState","finalCrossTarget","rejectedConflict","currentRow","cancelEvent","beginRowGroupHandlePointerDrag","onChangeGroups","crossTableEnabled","setActiveGroupMoveState","currentGroups","fromIndex","toIndex","movingColumn","visibleColumn","movingGroup","movingHeaderLabel","changeColumnFilterRule","filtering","currentModel","renderHeaderCell","isDropTarget","isGroupPlaceholder","groupPositionLocked","groupColumnIds","firstGroupPin","lastGroupPin","groupPinned","groupPinStyle","groupPinBoundary","groupPlaceholderLabel","showColumnMoveHandle","measuredWidth","visibleWidthSnapshot","measuredColumnWidth","fallbackGroupWidth","sum","startWidth","resizeMaxWidth","visibleColumnId","visibleColumnWidth","safeIndex","fallbackIndex","pinnedColumn","headerProps","sortIndicatorState","sortIndicatorVisible","showSortPriority","isMovingGroupChild","isColumnPlaceholder","columnPlaceholderLabel","headerClassName","headerPayload","headerRenderer","headerRendererKind","cachedHeaderRendererBody","shouldRefreshHeaderRendererBody","headerRendererBody","useDefaultHeader","headerLeftSlots","headerRightSlots","hasHeaderComponents","columnPositionLocked","columnFilterKind","columnFilterable","renderColumnSizing","commitPendingScrollTop","requestInfiniteLoadIfNeeded","bodyViewport","onLoadMore","safeThreshold","currentRowCount","syncHorizontalScrollLeft","scrollContainers","sharedMaxScrollLeft","nextScrollLeft","requestedScrollLeft","handleBodyScroll","overlay","handleBodyWheel","rawDelta","deltaScale","previousScrollLeft","editingRowIds","editingColumnIds","editingEnabled","reportClipboardError","error","canEditRange","matrix","absolute","expected","headerRow","cellIndex","rowIndex","skeletonIndex","emptyContent","emptyComponent","isLastRenderedSlot","entryIndex","isLastLogicalSlot","virtualContentFillsViewport","isViewportEndRow","aggregateValues","groupRenderParams","groupRowProps","groupRender","customContent","useDefaultGroupContent","aggregateContent","groupDraggable","groupDropPosition","isRowDropTarget","actualRowStyleHeight","rowRuntimeProps","isRowSelected","isLastLogicalRow","rowCustomBackground","rowRenderKey","rowDetailParams","rowDetailExpandable","rowDetailExpanded","rowDetailFixedHeight","rowDetailMode","rowDetailIdToken","rowDetailId","rowDetailContentId","rowDetailToggleId","Fragment","rowSelectionOnClick","onClickRow","onContextMenuRow","isCellInRange","isCellSelected","cellPayload","cellProps","cellDisabled","componentInteraction","cellClassName","cellStyle","hasCellComponents","formattedCellValue","cellComponents","onValueChange","visibleCellComponents","cellRender","customCellContent","cellContent","tooltip","tooltipConfig","customTooltip","tooltipKey","treeEntry","treeSlots","treeSlotParams","hasTreeSlots","renderedCellContent","onClickCell","alreadySelected","onContextMenuCell","onDoubleClickCell","loadingContent","loadingComponent","fragmentStyle","fragment","fragmentIndex","CominsTreeTableInner","_columnFiltering","_estimatedRowDetailHeight","_expandedRowIds","_getRowDetailHeight","_hasMoreRows","_infiniteScroll","_infiniteScrollThreshold","_lazyLoad","_lazyLoadBatchSize","_lazyLoadMode","_lazyLoadThreshold","_loadingMore","_onChangeExpandedRowIds","_onLazyLoad","_onLoadMore","_rowGrouping","_tableTransfer","_isRowExpandable","_renderRowDetail","_rowDetail","_tree","initialDefaultExpandAll","treeSortModel","setTreeSortModel","treeColumns","treeColumnId","sortedTree","visibleTreeRows","entriesByRowId","treeDrag","treeRowDrag","nextData","handleFlatDataChange","nextTree","nextItem","flatProps","nextSortModel","onChangeSortModel","ForwardedCominsTableInner","forwardRef","ForwardedCominsTreeTableInner","CominsViewportTableInner","previousEnd","updated","ForwardedCominsViewportTableInner","CominsTableAdapter","CominsTable","cominsTablePackage"],"sources":["../src/column-pointer.ts","../src/drag-autoscroll.ts","../src/core/selection/navigation.ts","../src/browser/pointer.ts","../src/browser/measurements.ts","../src/browser/scroll.ts","../src/browser/clipboard.ts","../src/browser/table-transfer.ts","../src/row-value.ts","../src/table-state.ts","../src/core/state/reconcile.ts","../src/core/state/changes.ts","../src/react/state.ts","../src/react/cell-tooltip.tsx","../src/tree.ts","../src/core/rows/projection.ts","../src/react/rows.ts","../src/selection-data.ts","../src/filtering.ts","../src/react/value-filter.tsx","../src/table-icons.tsx","../src/column-filter.tsx","../src/component-renderer.tsx","../src/row-detail.tsx","../src/cell-fill.tsx","../src/core/rows/grouping.ts","../src/grouping.ts","../src/core/transfer/policy.ts","../src/react/table-transfer.ts","../src/tooltip.tsx","../src/core/viewport/data.ts","../src/viewport-data.ts","../src/core/layout/row-height.ts","../src/core/layout/viewport.ts","../src/core/viewport/requests.ts","../src/browser/viewport-requests.ts","../src/react/viewport.ts","../src/tree-drag.tsx","../src/core/rows/summary.ts","../src/summary.ts","../src/core/layout/virtual.ts","../src/use-viewport.ts","../src/index.tsx"],"sourcesContent":["export const COMINS_COLUMN_MOUSE_DRAG_THRESHOLD = 6;\n\nexport type CominsColumnMouseIntent = \"activate\" | \"cancel\" | \"pending\";\n\nexport function getCominsColumnMouseIntent({\n clientX,\n clientY,\n startX,\n startY,\n}: {\n clientX: number;\n clientY: number;\n startX: number;\n startY: number;\n}): CominsColumnMouseIntent {\n const horizontalDelta = Math.abs(clientX - startX);\n const verticalDelta = Math.abs(clientY - startY);\n\n if (horizontalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && horizontalDelta > verticalDelta) {\n return \"activate\";\n }\n\n if (verticalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && verticalDelta >= horizontalDelta) {\n return \"cancel\";\n }\n\n return \"pending\";\n}\n","export const COMINS_DRAG_AUTO_SCROLL_MAX_SPEED = 720;\nexport const COMINS_DRAG_AUTO_SCROLL_MAX_FRAME_MS = 32;\n\nexport type CominsDragAutoScrollMetrics = {\n bottom: number;\n clientY: number;\n top: number;\n};\n\nexport type CominsDragAutoScrollStep = {\n clientHeight: number;\n deltaMs: number;\n scrollHeight: number;\n scrollTop: number;\n velocity: number;\n};\n\nexport function getCominsDragAutoScrollVelocity({\n bottom,\n clientY,\n top,\n}: CominsDragAutoScrollMetrics) {\n const height = Math.max(0, bottom - top);\n const edgeBand = Math.min(40, height / 2);\n\n if (edgeBand <= 0 || clientY < top || clientY > bottom) {\n return 0;\n }\n\n if (clientY < top + edgeBand) {\n return -COMINS_DRAG_AUTO_SCROLL_MAX_SPEED * (1 - (clientY - top) / edgeBand);\n }\n\n if (clientY > bottom - edgeBand) {\n return COMINS_DRAG_AUTO_SCROLL_MAX_SPEED * (1 - (bottom - clientY) / edgeBand);\n }\n\n return 0;\n}\n\nexport function getCominsDragAutoScrollTop({\n clientHeight,\n deltaMs,\n scrollHeight,\n scrollTop,\n velocity,\n}: CominsDragAutoScrollStep) {\n const maxScrollTop = Math.max(0, scrollHeight - clientHeight);\n const normalizedScrollTop = Math.max(0, Math.min(scrollTop, maxScrollTop));\n const normalizedDeltaMs = Math.max(0, Math.min(deltaMs, COMINS_DRAG_AUTO_SCROLL_MAX_FRAME_MS));\n\n return Math.max(\n 0,\n Math.min(\n maxScrollTop,\n normalizedScrollTop + velocity * (normalizedDeltaMs / 1000),\n ),\n );\n}\n","import type { CominsCellAddress, CominsCellRange, CominsRowId } from \"../model\";\nimport type { CominsTreeDropPosition } from \"../../tree\";\nexport { getCominsColumnMouseIntent } from \"../../column-pointer\";\nexport { getCominsDragAutoScrollTop, getCominsDragAutoScrollVelocity } from \"../../drag-autoscroll\";\n\nexport type CoreCellBounds = { top: number; bottom: number; left: number; right: number };\nexport function getCoreCellBounds(range: CominsCellRange, rows: readonly CominsRowId[], columns: readonly string[]): CoreCellBounds | null {\n const a = rows.indexOf(range.anchor.rowId), b = rows.indexOf(range.focus.rowId);\n const c = columns.indexOf(range.anchor.columnId), d = columns.indexOf(range.focus.columnId);\n return Math.min(a, b, c, d) < 0 ? null : { top: Math.min(a, b), bottom: Math.max(a, b), left: Math.min(c, d), right: Math.max(c, d) };\n}\nexport function getCoreCellRange(box: CoreCellBounds, rows: readonly CominsRowId[], columns: readonly string[]): CominsCellRange {\n return { anchor: { rowId: rows[box.top]!, columnId: columns[box.left]! }, focus: { rowId: rows[box.bottom]!, columnId: columns[box.right]! } };\n}\nexport function resolveCoreFillTarget({ source, address, rowIds, columnIds }: {\n source: CominsCellRange; address: CominsCellAddress | null; rowIds: readonly CominsRowId[]; columnIds: readonly string[];\n}): CominsCellRange | null {\n const box = getCoreCellBounds(source, rowIds, columnIds);\n const row = address ? rowIds.indexOf(address.rowId) : -1, column = address ? columnIds.indexOf(address.columnId) : -1;\n if (!box || row < 0 || column < 0) return null;\n const dy = Math.max(box.top - row, row - box.bottom, 0), dx = Math.max(box.left - column, column - box.right, 0);\n if (!dy && !dx) return null;\n const extended = dy >= dx ? { ...box, top: Math.min(box.top, row), bottom: Math.max(box.bottom, row) }\n : { ...box, left: Math.min(box.left, column), right: Math.max(box.right, column) };\n return (extended.bottom - extended.top + 1) * (extended.right - extended.left + 1) <= 100000 ? getCoreCellRange(extended, rowIds, columnIds) : null;\n}\n\nexport function planCoreSelectionCopy({ cells, selectedRowIds, rowIds: order, columnIds, target }: {\n cells: readonly CominsCellAddress[]; selectedRowIds: readonly CominsRowId[]; rowIds: readonly CominsRowId[]; columnIds: readonly string[]; target: \"auto\" | \"cells\" | \"rows\";\n}) {\n const kind = target === \"auto\" ? (cells.length > 1 ? \"cells\" : selectedRowIds.length ? \"rows\" : \"cells\") : target;\n const selectedRows = new Set(selectedRowIds);\n const rowPositions = new Map(order.map((id, index) => [id, index]));\n const columnPositions = new Map(columnIds.map((id, index) => [id, index]));\n let rowIds: readonly CominsRowId[], columns = columnIds;\n const selected = new Map<CominsRowId, Set<string>>();\n if (kind === \"rows\") rowIds = order.filter(id => selectedRows.has(id));\n else {\n const positions = cells.filter(cell => rowPositions.has(cell.rowId)).map(cell => ({ row: rowPositions.get(cell.rowId)!, column: columnPositions.get(cell.columnId)! }));\n if (!positions.length) return null;\n let firstRow = Infinity, lastRow = -1, firstColumn = Infinity, lastColumn = -1;\n for (const position of positions) {\n firstRow = Math.min(firstRow, position.row); lastRow = Math.max(lastRow, position.row);\n firstColumn = Math.min(firstColumn, position.column); lastColumn = Math.max(lastColumn, position.column);\n }\n rowIds = order.slice(firstRow, lastRow + 1); columns = columnIds.slice(firstColumn, lastColumn + 1);\n for (const cell of cells) {\n if (!selected.has(cell.rowId)) selected.set(cell.rowId, new Set());\n selected.get(cell.rowId)!.add(cell.columnId);\n }\n }\n return !rowIds.length || !columns.length ? null : { target: kind, rowIds, columnIds: columns, selected };\n}\n\nconst pathKey = (path: readonly number[]) => path.join(\".\");\nexport function resolveCoreTreeDropContext<TEntry extends { rowId: CominsRowId; path: readonly number[] }>({ entries, sourceId, targetId, position }: {\n entries: readonly TEntry[]; sourceId: CominsRowId; targetId: CominsRowId; position: CominsTreeDropPosition;\n}) {\n const source = entries.find(entry => entry.rowId === sourceId), target = entries.find(entry => entry.rowId === targetId);\n if (!source || !target) return null;\n const parentPath = target.path.slice(0, -1);\n const parent = entries.find(entry => pathKey(entry.path) === pathKey(parentPath));\n const nextSibling = entries.find(entry => pathKey(entry.path.slice(0, -1)) === pathKey(parentPath) && entry.path[entry.path.length - 1] === target.path[target.path.length - 1]! + 1);\n return { source, target, position, destination: position === \"inside\"\n ? { parentId: target.rowId, beforeRowId: null }\n : { parentId: parent?.rowId ?? null, beforeRowId: position === \"before\" ? target.rowId : nextSibling?.rowId ?? null } };\n}\nexport function resolveCoreTreePointerPosition(fraction: number, allowReparent: boolean | undefined): CominsTreeDropPosition {\n return fraction < .25 ? \"before\" : fraction > .75 ? \"after\" : allowReparent ? \"inside\" : fraction < .5 ? \"before\" : \"after\";\n}\n","import { getCominsDragAutoScrollTop, getCominsDragAutoScrollVelocity } from \"../core/selection/navigation\";\n\nexport function captureCominsPointer(element: Pick<Element, \"setPointerCapture\" | \"releasePointerCapture\">, pointerId: number) {\n try { element.setPointerCapture(pointerId); } catch { /* Synthetic pointer or detached control. */ }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n try { element.releasePointerCapture(pointerId); } catch { /* Already released or detached. */ }\n };\n}\nexport function registerCominsPointerListeners(input: {\n move: (event: PointerEvent) => void; up: (event: PointerEvent) => void; cancel: (event: PointerEvent) => void;\n blur: () => void; key: (event: KeyboardEvent) => void; keyCapture?: boolean;\n}) {\n const { move, up, cancel, blur, key, keyCapture = false } = input;\n window.addEventListener(\"pointermove\", move); window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", cancel); window.addEventListener(\"blur\", blur); window.addEventListener(\"keydown\", key, keyCapture);\n return () => {\n window.removeEventListener(\"pointermove\", move); window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", cancel); window.removeEventListener(\"blur\", blur); window.removeEventListener(\"keydown\", key, keyCapture);\n };\n}\nexport function startCominsPointerFrames(onFrame: FrameRequestCallback, host: Pick<Window, \"requestAnimationFrame\" | \"cancelAnimationFrame\"> = window) {\n let stopped = false;\n const tick: FrameRequestCallback = time => {\n if (stopped) return;\n onFrame(time);\n if (!stopped) frame = host.requestAnimationFrame(tick);\n };\n let frame = host.requestAnimationFrame(tick);\n return () => { if (!stopped) { stopped = true; host.cancelAnimationFrame(frame); } };\n}\nexport function focusCominsPointerTarget(element: HTMLElement | null) {\n element?.focus({ preventScroll: true });\n}\nexport function applyCominsDragScroll(viewport: HTMLElement, input: { top: number; bottom: number; clientY: number; deltaMs: number; onlyIfChanged?: boolean; enabled?: boolean }) {\n const next = getCominsDragAutoScrollTop({ scrollTop: viewport.scrollTop, scrollHeight: viewport.scrollHeight, clientHeight: viewport.clientHeight, velocity: input.enabled === false ? 0 : getCominsDragAutoScrollVelocity(input), deltaMs: input.deltaMs });\n if (!input.onlyIfChanged || next !== viewport.scrollTop) viewport.scrollTop = next;\n}\nexport function isCominsNativeEditor(target: EventTarget | null) {\n return target instanceof Element && Boolean(target.closest('input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), textarea, select, [contenteditable]:not([contenteditable=\"false\"])'));\n}\n\nexport const createCrossTableAutoScroll = (\n resolveTarget: (clientX: number, clientY: number) => void,\n ) => {\n let animationFrame: number | null = null;\n let clientX = 0;\n let clientY = 0;\n let lastTimestamp: number | null = null;\n let viewport: HTMLElement | null = null;\n\n const stop = () => {\n if (animationFrame !== null) {\n window.cancelAnimationFrame(animationFrame);\n }\n\n animationFrame = null;\n lastTimestamp = null;\n viewport = null;\n };\n const runFrame = (timestamp: number) => {\n animationFrame = null;\n const currentViewport = viewport;\n\n if (!currentViewport?.isConnected) {\n stop();\n return;\n }\n\n if (lastTimestamp === null) {\n lastTimestamp = timestamp;\n animationFrame = window.requestAnimationFrame(runFrame);\n return;\n }\n\n const bounds = currentViewport.getBoundingClientRect();\n const velocity = getCominsDragAutoScrollVelocity({ bottom: Math.min(window.innerHeight, bounds.bottom), clientY, top: Math.max(0, bounds.top) });\n const nextScrollTop = getCominsDragAutoScrollTop({\n clientHeight: currentViewport.clientHeight,\n deltaMs: timestamp - lastTimestamp,\n scrollHeight: currentViewport.scrollHeight,\n scrollTop: currentViewport.scrollTop,\n velocity,\n });\n const moved = Math.abs(nextScrollTop - currentViewport.scrollTop) > 0.01;\n\n lastTimestamp = timestamp;\n\n if (!moved) {\n stop();\n return;\n }\n\n currentViewport.scrollTop = nextScrollTop;\n resolveTarget(clientX, clientY);\n };\n const update = (\n nextViewport: HTMLElement | null,\n nextClientX: number,\n nextClientY: number,\n valid: boolean,\n ) => {\n if (!valid || !nextViewport?.isConnected) {\n stop();\n return;\n }\n\n const bounds = nextViewport.getBoundingClientRect();\n const velocity = getCominsDragAutoScrollVelocity({\n bottom: Math.min(window.innerHeight, bounds.bottom),\n clientY: nextClientY,\n top: Math.max(0, bounds.top),\n });\n const maxScrollTop = Math.max(0, nextViewport.scrollHeight - nextViewport.clientHeight);\n const canScroll = velocity < 0\n ? nextViewport.scrollTop > 0\n : velocity > 0 && nextViewport.scrollTop < maxScrollTop;\n\n if (!canScroll) {\n stop();\n return;\n }\n\n if (viewport !== nextViewport) {\n lastTimestamp = null;\n }\n\n viewport = nextViewport;\n clientX = nextClientX;\n clientY = nextClientY;\n\n if (animationFrame === null) {\n animationFrame = window.requestAnimationFrame(runFrame);\n }\n };\n\n return { stop, update };\n };\n","export type CominsElementMeasurement = {\n element: Element;\n height: number;\n rectHeight: number;\n width: number;\n};\n\nexport function measureCominsElement(element: Element, entry?: ResizeObserverEntry): CominsElementMeasurement {\n const rect = element.getBoundingClientRect();\n const borderBox = Array.isArray(entry?.borderBoxSize) ? entry.borderBoxSize[0] : entry?.borderBoxSize;\n return { element, height: borderBox?.blockSize ?? rect.height, rectHeight: rect.height, width: Math.round(rect.width) };\n}\n\n/** Owns DOM targets only; adapters map measurements to rows and flush a batch once. */\nexport function createMeasurementObserver(options: {\n onMeasure: (measurement: CominsElementMeasurement) => void;\n onBatchComplete?: () => void;\n}) {\n const targets = new Set<Element>();\n let observer: ResizeObserver | null = null;\n let generation = 0;\n let disposed = false;\n const deliver = (measurement: CominsElementMeasurement) => {\n if ((Number.isFinite(measurement.height) && measurement.height > 0) || (Number.isFinite(measurement.rectHeight) && measurement.rectHeight > 0)) options.onMeasure(measurement);\n };\n const disconnect = () => { generation++; observer?.disconnect(); observer = null; };\n return {\n observe(element: Element) {\n if (disposed || targets.has(element)) return;\n targets.add(element);\n if (typeof ResizeObserver === \"undefined\") {\n deliver(measureCominsElement(element));\n options.onBatchComplete?.();\n return;\n }\n if (!observer) {\n const activeGeneration = ++generation;\n observer = new ResizeObserver(entries => {\n if (disposed || generation !== activeGeneration) return;\n for (const entry of entries) {\n if (targets.has(entry.target)) deliver(measureCominsElement(entry.target, entry));\n }\n options.onBatchComplete?.();\n });\n }\n observer.observe(element);\n },\n unobserve(element: Element) {\n if (!targets.delete(element)) return;\n observer?.unobserve(element);\n if (!targets.size) disconnect();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n disconnect();\n targets.clear();\n },\n };\n}\n\nexport function hasCominsResizeObserver() { return typeof ResizeObserver !== \"undefined\"; }\n\nexport function observeCominsViewport(element: HTMLElement, onMeasure: (value: {\n height: number; width: number; scrollWidth: number; outerWidth: number; viewportWidth: number;\n}) => void) {\n if (!hasCominsResizeObserver()) return () => {};\n const observer = new ResizeObserver(([entry]) => {\n if (entry) onMeasure({ height: entry.contentRect.height, width: entry.contentRect.width, scrollWidth: element.scrollWidth, outerWidth: element.offsetWidth, viewportWidth: element.clientWidth });\n });\n observer.observe(element);\n return () => observer.disconnect();\n}\n\nexport function observeCominsFontChanges(onChange: () => void) {\n const fonts = document.fonts;\n fonts?.addEventListener(\"loadingdone\", onChange);\n return () => fonts?.removeEventListener(\"loadingdone\", onChange);\n}\n\nexport function getCominsElementRect(element: Element): DOMRect;\nexport function getCominsElementRect(element: Element | null | undefined): DOMRect | undefined;\nexport function getCominsElementRect(element: Element | null | undefined) { return element?.getBoundingClientRect(); }\n","export function setCominsScrollTop(element: HTMLElement, top: number) {\n element.scrollTop = top;\n}\n\nexport function setCominsScrollLeft(element: HTMLElement, left: number) {\n element.scrollLeft = left;\n}\n\nexport function scrollCominsRowIntoView(viewport: HTMLElement, index: number) {\n viewport.querySelector<HTMLElement>(`[data-comins-row-data-index=\"${index}\"]`)?.scrollIntoView?.({ block: \"nearest\" });\n}\n\nexport function focusCominsElement(element: HTMLElement | null | undefined, options?: FocusOptions) {\n element?.focus(options);\n}\n\nexport function createCominsDetailFocusRestorer() {\n const frames = new Set<number>();\n return {\n restore(element: HTMLElement | null, getToggle: () => HTMLButtonElement | null) {\n if (!element?.contains(document.activeElement)) return;\n const restoreFocus = () => {\n const toggle = getToggle();\n if (toggle?.isConnected) toggle.focus();\n };\n restoreFocus();\n // Retry after the disclosure update, but only while the owning Table lives.\n const frame = window.requestAnimationFrame(() => { frames.delete(frame); restoreFocus(); });\n frames.add(frame);\n },\n dispose() {\n for (const frame of frames) window.cancelAnimationFrame(frame);\n frames.clear();\n },\n };\n}\n","export async function writeCominsClipboardText(text: string) {\n if (!navigator.clipboard?.writeText) throw new Error(\"Clipboard writing is unavailable.\");\n await navigator.clipboard.writeText(text);\n}\n\nexport function readCominsClipboardEvent(data: Pick<DataTransfer, \"types\" | \"getData\">) {\n return data.types.includes(\"text/plain\") ? data.getData(\"text/plain\") : null;\n}\n\nexport function writeCominsClipboardEvent(data: Pick<DataTransfer, \"setData\">, text: string) {\n data.setData(\"text/plain\", text);\n}\n","/** The registry only observes identity and DOM fields; adapter metadata stays opaque. */\nexport type BrowserTransferSnapshot = {\n config: { coordinator: object; scope: string; tableId: string };\n endpoint: { tableId: string };\n instanceId: string;\n root: HTMLElement | null;\n viewport: HTMLElement | null;\n};\ntype Registration<TSnapshot> = { getSnapshot: () => TSnapshot | null };\n\nexport function createTableTransferRegistry<TSnapshot extends BrowserTransferSnapshot>() {\n const scopes = new Map<string, Map<string, Set<Registration<TSnapshot>>>>();\n return {\n register(scope: string, tableId: string, registration: Registration<TSnapshot>) {\n let tables = scopes.get(scope);\n if (!tables) { tables = new Map(); scopes.set(scope, tables); }\n let registrations = tables.get(tableId);\n if (!registrations) { registrations = new Set(); tables.set(tableId, registrations); }\n registrations.add(registration);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n registrations.delete(registration);\n if (registrations.size === 0) tables.delete(tableId);\n if (tables.size === 0) scopes.delete(scope);\n };\n },\n get(scope: string, tableId: string) {\n const registrations = scopes.get(scope)?.get(tableId);\n return registrations?.size === 1 ? [...registrations][0] ?? null : null;\n },\n };\n}\n\nexport function getRegisteredTransferSnapshot<TSnapshot extends BrowserTransferSnapshot>(\n registry: ReturnType<typeof createTableTransferRegistry<TSnapshot>>,\n coordinator: object, scope: string, tableId: string,\n) {\n const snapshot = registry.get(scope, tableId)?.getSnapshot() ?? null;\n if (!snapshot || snapshot.config.coordinator !== coordinator || snapshot.config.scope !== scope || snapshot.config.tableId !== tableId || snapshot.endpoint.tableId !== tableId) return null;\n return snapshot;\n}\n\nexport function getCrossTableTransferHit<TSnapshot extends BrowserTransferSnapshot>(input: {\n sourceTableId: string;\n scope: string;\n instanceId: string;\n root: HTMLElement | null;\n clientX: number;\n clientY: number;\n document: Pick<Document, \"elementFromPoint\">;\n getSnapshot: (tableId: string) => TSnapshot | null;\n}) {\n const sourceSnapshot = input.getSnapshot(input.sourceTableId);\n const element = input.document.elementFromPoint(input.clientX, input.clientY) as HTMLElement | null;\n const root = element?.closest<HTMLElement>(\"[data-comins-table-instance-id]\") ?? null;\n const tableId = root?.dataset.cominsTransferTableId;\n if (!sourceSnapshot || sourceSnapshot.instanceId !== input.instanceId || sourceSnapshot.root !== input.root || !element || !root || !tableId || tableId === input.sourceTableId || root.dataset.cominsTransferScope !== input.scope) return null;\n const snapshot = input.getSnapshot(tableId);\n if (!snapshot || snapshot.root !== root || snapshot.instanceId !== root.dataset.cominsTableInstanceId || !snapshot.viewport || !root.contains(snapshot.viewport)) return null;\n return { element, root, snapshot };\n}\n","import { setNestedFieldValue } from \"./core/editing/cells\";\n\nexport function setCominsNestedInputValue<TData>(row: TData, field: string, value: string): TData {\n return setNestedFieldValue(row, field, value);\n}\n","import type { CominsRowId, CominsSelectionState, CominsSortModel, CominsSortState } from \"./model\";\n\ntype CominsSelectionSnapshot = {\n rowIds: readonly CominsRowId[];\n columns: readonly { id: string }[];\n selection: CominsSelectionState;\n};\n\nexport function getNextSort(current: CominsSortState | null, columnId: string): CominsSortState | null {\n if (current?.columnId !== columnId) {\n return { columnId, direction: \"asc\" };\n }\n\n if (current.direction === \"asc\") {\n return { columnId, direction: \"desc\" };\n }\n\n return null;\n}\nexport function getNextSortModel(current: CominsSortModel, columnId: string, additive: boolean): CominsSortState[] {\n const currentIndex = current.findIndex((rule) => rule.columnId === columnId);\n const currentRule = currentIndex < 0 ? null : current[currentIndex] ?? null;\n const nextRule = getNextSort(currentRule, columnId);\n\n if (!additive) {\n return nextRule ? [nextRule] : [];\n }\n\n if (!nextRule) {\n return current.filter((rule) => rule.columnId !== columnId);\n }\n\n if (currentIndex < 0) {\n return [...current, nextRule];\n }\n\n return current.map((rule, index) => (index === currentIndex ? nextRule : rule));\n}\n\nexport function getSortRule(current: CominsSortModel, columnId: string) {\n const index = current.findIndex((rule) => rule.columnId === columnId);\n\n return index < 0 ? null : { priority: index + 1, rule: current[index]! };\n}\n\nexport function getSortIndicatorState(current: CominsSortModel, columnId: string) {\n const currentRule = getSortRule(current, columnId)?.rule;\n\n if (!currentRule) {\n return \"none\";\n }\n\n return currentRule.direction;\n}\n\nexport function getAriaSortState(current: CominsSortModel, columnId: string) {\n const currentRule = getSortRule(current, columnId);\n\n if (!currentRule) {\n return current.length > 1 ? undefined : \"none\";\n }\n\n if (currentRule.priority > 1) {\n return undefined;\n }\n\n return currentRule.rule.direction === \"asc\" ? \"ascending\" : \"descending\";\n}\n\nexport function areSortStatesEqual(left: CominsSortState | null, right: CominsSortState | null) {\n if (!left || !right) {\n return left === right;\n }\n\n return left.columnId === right.columnId && left.direction === right.direction;\n}\n\nexport function areSortModelsEqual(left: CominsSortModel, right: CominsSortModel) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every(\n (rule, index) => rule.columnId === right[index]?.columnId && rule.direction === right[index]?.direction,\n );\n}\n\nexport function areRowIdSequencesEqual(left: readonly CominsRowId[], right: readonly CominsRowId[]) {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nexport function insertDeclaredColumnsIntoOrder(\n order: readonly string[],\n declaredOrder: readonly string[],\n) {\n const next = [...order];\n\n for (let declaredIndex = 0; declaredIndex < declaredOrder.length; declaredIndex += 1) {\n const columnId = declaredOrder[declaredIndex];\n\n if (columnId === undefined || next.includes(columnId)) {\n continue;\n }\n\n const followingColumnId = declaredOrder\n .slice(declaredIndex + 1)\n .find((candidate) => next.includes(candidate));\n\n if (followingColumnId !== undefined) {\n next.splice(next.indexOf(followingColumnId), 0, columnId);\n continue;\n }\n\n const precedingColumnId = [...declaredOrder.slice(0, declaredIndex)]\n .reverse()\n .find((candidate) => next.includes(candidate));\n\n if (precedingColumnId === undefined) {\n next.push(columnId);\n } else {\n next.splice(next.lastIndexOf(precedingColumnId) + 1, 0, columnId);\n }\n }\n\n return next;\n}\n\nexport function reconcileColumnOrderHistory(\n history: readonly string[],\n currentOrder: readonly string[],\n declaredOrder: readonly string[],\n) {\n const merged = insertDeclaredColumnsIntoOrder(history, declaredOrder);\n const currentIds = new Set(currentOrder);\n let currentIndex = 0;\n\n return merged.map((columnId) => {\n if (!currentIds.has(columnId)) {\n return columnId;\n }\n\n const currentColumnId = currentOrder[currentIndex];\n currentIndex += 1;\n return currentColumnId ?? columnId;\n });\n}\n\nexport function canPreserveSelection(\n current: CominsSelectionSnapshot,\n next: Pick<CominsSelectionSnapshot, \"rowIds\" | \"columns\">,\n) {\n if (!areRowIdSequencesEqual(current.rowIds, next.rowIds)) {\n return false;\n }\n\n const nextColumnIds = new Set(next.columns.map((column) => column.id));\n const selectedCell = current.selection.cell;\n const selectedCells = current.selection.cells ?? [];\n const selectedRange = current.selection.range;\n\n if (selectedCell && !nextColumnIds.has(selectedCell.columnId)) {\n return false;\n }\n\n if (selectedCells.some((cell) => !nextColumnIds.has(cell.columnId))) {\n return false;\n }\n\n if (\n selectedRange &&\n (!nextColumnIds.has(selectedRange.anchor.columnId) || !nextColumnIds.has(selectedRange.focus.columnId))\n ) {\n return false;\n }\n\n return true;\n}\n","import type { CominsRowId, CominsSelectionState, CominsTableState, CominsTableStateInput } from \"../model\";\nimport { serializeCominsColumnLayout } from \"../layout/columns\";\nimport { canPreserveSelection, insertDeclaredColumnsIntoOrder, reconcileColumnOrderHistory } from \"../../table-state\";\nimport { createCominsTableState } from \"./table\";\n\nexport type CoreReconciliationInput<TData> = Pick<CominsTableStateInput<TData>,\n \"columnGroups\" | \"columns\" | \"rows\" | \"getRowId\" | \"pagination\" | \"showHeader\">;\n\nexport type CoreReconciliationOptions<TData> = {\n current: CominsTableState<TData>;\n nextInput: CoreReconciliationInput<TData>;\n columnOrderHistory: readonly string[];\n dataChanged: boolean;\n getRowIdChanged: boolean;\n viewportIndices?: readonly number[];\n};\n\n/** Reconcile inputs without applying state, clearing caches, or notifying consumers. */\nexport function reconcileCoreState<TData>({ current, nextInput, columnOrderHistory, dataChanged, getRowIdChanged, viewportIndices }: CoreReconciliationOptions<TData>): {\n state: CominsTableState<TData>;\n columnOrderHistory: string[];\n invalidatedDetailRowIds: CominsRowId[];\n} {\n const declaredColumnOrder = nextInput.columns.map(column => String(column.id ?? column.field));\n const historicalOrder = reconcileColumnOrderHistory(columnOrderHistory, current.columnOrder, current.columns.map(column => column.id));\n const nextState = createCominsTableState({\n ...nextInput,\n columnLayout: {\n ...serializeCominsColumnLayout(current),\n order: insertDeclaredColumnsIntoOrder(historicalOrder, declaredColumnOrder),\n },\n // Only the adapter knows whether the original external data reference changed.\n rows: dataChanged ? nextInput.rows : current.rows,\n sortModel: current.sortModel,\n });\n const state = viewportIndices\n ? { ...nextState, selection: reconcileCoreViewportSelection(current.selection, nextState.rowIds, viewportIndices, nextState.columns.map(column => column.id)) }\n : canPreserveSelection(current, nextState) || (\n // An already empty selection is unchanged even if the visible row IDs change.\n current.selection.rowIds.length === 0 && current.selection.cell === null &&\n current.selection.range === null && !current.selection.cells?.length\n )\n ? { ...nextState, selection: current.selection }\n : nextState;\n const invalidatedDetailRowIds: CominsRowId[] = [];\n if (getRowIdChanged) {\n const previousRowById = new Map(current.rowIds.map((rowId, index) => [rowId, current.rows[index]]));\n state.rowIds.forEach((rowId, index) => {\n if (previousRowById.has(rowId) && previousRowById.get(rowId) !== state.rows[index]) invalidatedDetailRowIds.push(rowId);\n });\n }\n return {\n state,\n columnOrderHistory: reconcileColumnOrderHistory(historicalOrder, state.columnOrder, declaredColumnOrder),\n invalidatedDetailRowIds,\n };\n}\n\n// Kept separate from the Browser-owned request model (which requires AbortSignal).\nexport function reconcileCoreViewportSelection(selection: CominsSelectionState, rowIds: readonly CominsRowId[], indices: readonly number[], columnIds: readonly string[]): CominsSelectionState {\n const positions = new Map(rowIds.map((id, index) => [id, index]));\n const columns = new Set(columnIds);\n const valid = (address: { rowId: CominsRowId; columnId: string }) => positions.has(address.rowId) && columns.has(address.columnId);\n const cell = selection.cell && valid(selection.cell) ? selection.cell : null;\n let range = selection.range;\n if (range) {\n if (!valid(range.anchor) || !valid(range.focus)) range = null;\n else {\n const a = positions.get(range.anchor.rowId)!, b = positions.get(range.focus.rowId)!;\n for (let index = Math.min(a, b); index < Math.max(a, b); index++) if (indices[index + 1] !== indices[index]! + 1) { range = null; break; }\n }\n }\n const cells = selection.cells?.filter(valid);\n if (cell === selection.cell && range === selection.range && cells?.length === selection.cells?.length) return selection;\n return { ...selection, cell, range, ...(cells ? { cells } : {}) };\n}\n","import type { CominsTableState } from \"../model\";\nimport { areSortModelsEqual, areSortStatesEqual } from \"../../table-state\";\n\ntype ChangeSnapshot<TData> = Pick<CominsTableState<TData>, \"rows\" | \"selection\" | \"sort\" | \"sortModel\">;\n\n/** Read only the shared data fields, preserving adapter reference identities. */\nexport function getCoreStateChanges<TData>(current: ChangeSnapshot<TData>, next: ChangeSnapshot<TData>, options: { columnLayoutChanged?: boolean } = {}) {\n return {\n data: next.rows !== current.rows,\n selection: next.selection !== current.selection,\n columnLayout: options.columnLayoutChanged === true,\n sort: !areSortStatesEqual(next.sort, current.sort),\n sortModel: !areSortModelsEqual(next.sortModel, current.sortModel),\n };\n}\n","import type { CominsColumnLayout, CominsSelectionState, CominsSortModel, CominsSortState } from \"../model\";\nimport type { CominsTableState, CominsTableStateInput } from \"../react-types\";\nimport { normalizeColumns, normalizeColumnGroups } from \"../core/layout/columns\";\nimport { reconcileCoreState, type CoreReconciliationOptions } from \"../core/state/reconcile\";\nimport { getCoreStateChanges } from \"../core/state/changes\";\nimport { projectReactColumn, projectReactGroup, projectReactState } from \"./model\";\nimport { serializeCominsColumnLayout } from \"./core-compat\";\n\ntype ReactReconciliationOptions<TData> = Omit<CoreReconciliationOptions<TData>, \"current\" | \"nextInput\"> & {\n current: CominsTableState<TData>;\n nextInput: Pick<CominsTableStateInput<TData>, \"columnGroups\" | \"columns\" | \"rows\" | \"getRowId\" | \"pagination\" | \"showHeader\">;\n};\n\nexport function reconcileReactState<TData>(options: ReactReconciliationOptions<TData>) {\n const columns = normalizeColumns(options.nextInput.columns);\n const columnGroups = normalizeColumnGroups(columns, options.nextInput.columnGroups);\n const result = reconcileCoreState({\n ...options,\n current: projectReactState(options.current).core,\n nextInput: { ...options.nextInput, columns: columns.map(projectReactColumn), columnGroups: columnGroups.map(projectReactGroup) },\n });\n // New definitions do not belong to the old bridge. Restore their React metadata directly.\n return { ...result, state: { ...result.state, columns, columnGroups, theme: options.current.theme } };\n}\n\ntype ChangeCallbacks<TData> = {\n onChangeData?: (data: TData[]) => void;\n onChangeSelection?: (selection: CominsSelectionState) => void;\n onChangeColumnLayout?: (layout: CominsColumnLayout) => void;\n onChangeSort?: (sort: CominsSortState | null) => void;\n onChangeSortModel?: (sortModel: CominsSortModel) => void;\n};\n\nexport function notifyReactStateChanges<TData>(current: CominsTableState<TData>, next: CominsTableState<TData>, callbacks: ChangeCallbacks<TData>, options: { columnLayoutChanged?: boolean } = {}) {\n const changes = getCoreStateChanges(current, next, options);\n if (changes.data) callbacks.onChangeData?.(next.rows);\n if (changes.selection) callbacks.onChangeSelection?.(next.selection);\n if (changes.columnLayout) callbacks.onChangeColumnLayout?.(serializeCominsColumnLayout(next));\n if (changes.sort) callbacks.onChangeSort?.(next.sort);\n if (changes.sortModel) callbacks.onChangeSortModel?.(next.sortModel);\n}\n\n/** Prop synchronization deliberately does not notify data or column layout. */\nexport function notifyReactInputChanges<TData>(current: CominsTableState<TData>, next: CominsTableState<TData>, callbacks: ChangeCallbacks<TData>) {\n const changes = getCoreStateChanges(current, next);\n if (changes.selection) callbacks.onChangeSelection?.(next.selection);\n if (changes.sort) callbacks.onChangeSort?.(next.sort);\n if (changes.sortModel) callbacks.onChangeSortModel?.(next.sortModel);\n}\n","import { useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype ActiveCell = { key: string; anchor: HTMLElement; ready: boolean };\n\nexport function hasCellTooltipContent(content: ReactNode): boolean {\n return content !== undefined && content !== null && typeof content !== \"boolean\" && content !== \"\";\n}\n\n/** Table-local controller; owns no cell data or framework-neutral state. */\nexport function useCominsCellTooltip() {\n const [active, setActive] = useState<ActiveCell | null>(null);\n const activeRef = useRef<ActiveCell | null>(null);\n const hovered = useRef(false);\n const focused = useRef(false);\n const dismissed = useRef<string | null>(null);\n const leaveTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const focusTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const id = useId();\n\n const clearLeave = () => { if (leaveTimer.current !== undefined) clearTimeout(leaveTimer.current); leaveTimer.current = undefined; };\n const clearFocus = () => { if (focusTimer.current !== undefined) clearTimeout(focusTimer.current); focusTimer.current = undefined; };\n const close = (dismiss = false) => {\n clearLeave(); clearFocus(); hovered.current = false; focused.current = false;\n dismissed.current = dismiss ? activeRef.current?.key ?? null : null;\n activeRef.current = null; setActive(null);\n };\n const settleFocus = () => {\n clearFocus();\n // Let browser focus scrolling settle before showing keyboard information.\n focusTimer.current = setTimeout(() => {\n focusTimer.current = undefined;\n const current = activeRef.current;\n if (!current || !focused.current || !current.anchor.isConnected || !current.anchor.contains(current.anchor.ownerDocument.activeElement)) {\n close(); return;\n }\n activeRef.current = { ...current, ready: true }; setActive(activeRef.current);\n }, 50);\n };\n const enter = (key: string, anchor: HTMLElement, kind: \"hover\" | \"focus\") => {\n clearLeave();\n if (dismissed.current === key) return;\n if (activeRef.current?.key !== key || activeRef.current?.anchor !== anchor) {\n hovered.current = false; focused.current = false;\n clearFocus();\n activeRef.current = { key, anchor, ready: kind === \"hover\" }; setActive(activeRef.current);\n }\n if (kind === \"hover\") {\n hovered.current = true;\n if (activeRef.current && !activeRef.current.ready) {\n activeRef.current = { ...activeRef.current, ready: true }; setActive(activeRef.current);\n }\n } else {\n focused.current = true;\n if (!activeRef.current?.ready) settleFocus();\n }\n };\n const leave = (key: string, kind: \"hover\" | \"focus\") => {\n if (dismissed.current === key) dismissed.current = null;\n if (activeRef.current?.key !== key) return;\n if (kind === \"hover\") hovered.current = false; else { focused.current = false; clearFocus(); }\n clearLeave();\n if (!hovered.current && !focused.current) leaveTimer.current = setTimeout(() => {\n activeRef.current = null; setActive(null); leaveTimer.current = undefined;\n }, 80);\n };\n\n useLayoutEffect(() => {\n if (active && (!active.anchor.isConnected || active.anchor.dataset.cominsTooltipKey !== active.key)) close();\n });\n useEffect(() => {\n if (!active) return;\n const doc = active.anchor.ownerDocument;\n const onKeyDown = (event: KeyboardEvent) => { if (event.key === \"Escape\") close(true); };\n const onScroll = () => {\n if (activeRef.current && !activeRef.current.ready && focused.current) settleFocus();\n else close();\n };\n const onResize = () => close();\n doc.addEventListener(\"keydown\", onKeyDown, true);\n doc.addEventListener(\"scroll\", onScroll, true);\n doc.defaultView?.addEventListener(\"resize\", onResize);\n return () => {\n doc.removeEventListener(\"keydown\", onKeyDown, true);\n doc.removeEventListener(\"scroll\", onScroll, true);\n doc.defaultView?.removeEventListener(\"resize\", onResize);\n };\n }, [active]);\n useEffect(() => () => { clearLeave(); clearFocus(); }, []);\n return { active, id: `comins-cell-tooltip-${id}`, enter, leave };\n}\n\nexport function CominsCellTooltip({ controller, content }: { controller: ReturnType<typeof useCominsCellTooltip>; content: ReactNode }) {\n const surface = useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const active = controller.active;\n const visible = Boolean(active?.ready && hasCellTooltipContent(content));\n\n useLayoutEffect(() => {\n if (!visible || !active || !surface.current) return;\n const win = active.anchor.ownerDocument.defaultView;\n if (!win) return;\n const element = surface.current;\n const updatePosition = () => {\n const theme = win.getComputedStyle(active.anchor);\n for (const token of [\"--comins-table-surface\", \"--comins-table-foreground\", \"--comins-table-border\"]) {\n const value = theme.getPropertyValue(token);\n if (value) element.style.setProperty(token, value);\n else element.style.removeProperty(token);\n }\n element.style.fontFamily = theme.fontFamily;\n const anchor = active.anchor.getBoundingClientRect();\n const bounds = element.getBoundingClientRect();\n const margin = 8;\n const left = Math.max(margin, Math.min(anchor.left, win.innerWidth - bounds.width - margin));\n const below = anchor.bottom + 6;\n const top = below + bounds.height <= win.innerHeight - margin ? below : Math.max(margin, anchor.top - bounds.height - 6);\n setPosition(previous => previous.left === left && previous.top === top ? previous : { left, top });\n };\n updatePosition();\n const observer = typeof win.ResizeObserver === \"function\" ? new win.ResizeObserver(updatePosition) : undefined;\n observer?.observe(element); observer?.observe(active.anchor);\n return () => observer?.disconnect();\n }, [active, content, visible]);\n useLayoutEffect(() => {\n if (!visible || !active) return;\n const anchor = active.anchor;\n const ids = new Set((anchor.getAttribute(\"aria-describedby\") ?? \"\").split(/\\s+/).filter(Boolean));\n ids.add(controller.id); anchor.setAttribute(\"aria-describedby\", [...ids].join(\" \"));\n return () => {\n const current = (anchor.getAttribute(\"aria-describedby\") ?? \"\").split(/\\s+/).filter(id => id && id !== controller.id);\n if (current.length) anchor.setAttribute(\"aria-describedby\", current.join(\" \"));\n else anchor.removeAttribute(\"aria-describedby\");\n };\n }, [active, controller.id, visible]);\n\n if (!visible || !active) return null;\n return createPortal(<div ref={surface} role=\"tooltip\" id={controller.id} className=\"comins-cell-tooltip\"\n style={{ left: position.left, top: position.top }}\n onPointerEnter={() => controller.enter(active.key, active.anchor, \"hover\")}\n onPointerLeave={() => controller.leave(active.key, \"hover\")}>\n {content}\n </div>, active.anchor.ownerDocument.body);\n}\n","import type { CominsRowId } from \"./model\";\n\nexport type CominsTreeNode<TItem> = {\n children?: readonly CominsTreeNode<TItem>[];\n expand?: boolean;\n item: TItem;\n};\n\nexport type CominsTreeExpansionOptions = {\n defaultExpandAll?: boolean;\n};\n\nexport type CominsTreeMoveDestination = {\n parentId: CominsRowId | null;\n beforeRowId: CominsRowId | null;\n};\n\nexport type CominsTreeDropPosition = \"before\" | \"after\" | \"inside\";\n\nexport type CominsTreeDropContext<TItem> = {\n source: CominsVisibleTreeRow<TItem>;\n target: CominsVisibleTreeRow<TItem>;\n destination: CominsTreeMoveDestination;\n position: CominsTreeDropPosition;\n};\n\nexport type CominsTreeRowDragConfig<TItem> = {\n allowReparent?: boolean;\n canDrop?: (context: CominsTreeDropContext<TItem>) => boolean;\n};\n\nexport type CominsVisibleTreeRow<TItem> = {\n depth: number;\n expanded: boolean;\n hasChildren: boolean;\n item: TItem;\n path: readonly number[];\n rowId: CominsRowId;\n};\n\ntype CominsTreeNodeIndex<TItem> = {\n byId: Map<CominsRowId, readonly number[]>;\n idByPath: Map<string, CominsRowId>;\n};\n\nfunction getPathKey(path: readonly number[]) {\n return path.join(\".\");\n}\n\nfunction createCominsTreeNodeIndex<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n getRowId: (item: TItem, index: number) => CominsRowId,\n): CominsTreeNodeIndex<TItem> {\n const byId = new Map<CominsRowId, readonly number[]>();\n const idByPath = new Map<string, CominsRowId>();\n let itemIndex = 0;\n\n const visit = (currentNodes: readonly CominsTreeNode<TItem>[], parentPath: readonly number[]) => {\n currentNodes.forEach((node, childIndex) => {\n const path = [...parentPath, childIndex];\n const rowId = getRowId(node.item, itemIndex);\n itemIndex += 1;\n\n if (byId.has(rowId)) {\n throw new Error(`Duplicate tree row id: ${String(rowId)}`);\n }\n\n byId.set(rowId, path);\n idByPath.set(getPathKey(path), rowId);\n\n if (node.children?.length) {\n visit(node.children, path);\n }\n });\n };\n\n visit(nodes, []);\n\n return { byId, idByPath };\n}\n\nfunction updateCominsTreeNodeAtPath<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n path: readonly number[],\n update: (node: CominsTreeNode<TItem>) => CominsTreeNode<TItem>,\n): CominsTreeNode<TItem>[] {\n const [targetIndex, ...remainingPath] = path;\n\n if (targetIndex === undefined) {\n return [...nodes];\n }\n\n return nodes.map((node, index) => {\n if (index !== targetIndex) {\n return node;\n }\n\n if (remainingPath.length === 0) {\n return update(node);\n }\n\n if (!node.children) {\n return node;\n }\n\n return {\n ...node,\n children: updateCominsTreeNodeAtPath(node.children, remainingPath, update),\n };\n });\n}\n\n/** Move a complete subtree. Invalid and unchanged moves retain the input reference. */\nexport function moveCominsTreeNode<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n destination: CominsTreeMoveDestination,\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: { allowReparent?: boolean } = {},\n): readonly CominsTreeNode<TItem>[] {\n const index = createCominsTreeNodeIndex(nodes, getRowId);\n const sourcePath = index.byId.get(rowId);\n const parentPath = destination.parentId === null ? [] : index.byId.get(destination.parentId);\n const beforePath = destination.beforeRowId === null ? undefined : index.byId.get(destination.beforeRowId);\n if (!sourcePath || !parentPath || (destination.beforeRowId !== null && !beforePath)) return nodes;\n const samePath = (a: readonly number[], b: readonly number[]) => a.length === b.length && a.every((value, i) => value === b[i]);\n const sourceParent = sourcePath.slice(0, -1);\n if (!options.allowReparent && !samePath(sourceParent, parentPath)) return nodes;\n if (sourcePath.length <= parentPath.length && sourcePath.every((value, i) => value === parentPath[i])) return nodes;\n if (beforePath && !samePath(beforePath.slice(0, -1), parentPath)) return nodes;\n if (destination.beforeRowId === rowId) return nodes;\n const siblingsAt = (tree: readonly CominsTreeNode<TItem>[], path: readonly number[]) => {\n let siblings = tree;\n for (const part of path) siblings = siblings[part]?.children ?? [];\n return siblings;\n };\n const sourceSiblings = siblingsAt(nodes, sourceParent);\n const sourceIndex = sourcePath[sourcePath.length - 1]!;\n const source = sourceSiblings[sourceIndex]!;\n const targetIndex = beforePath?.[beforePath.length - 1] ?? siblingsAt(nodes, parentPath).length;\n if (samePath(sourceParent, parentPath) && (targetIndex === sourceIndex || targetIndex === sourceIndex + 1)) return nodes;\n const removed = sourceSiblings.filter((_node, i) => i !== sourceIndex);\n const detached = sourceParent.length === 0 ? removed : updateCominsTreeNodeAtPath(nodes, sourceParent, node => ({ ...node, children: removed }));\n const nextIndex = createCominsTreeNodeIndex(detached, getRowId);\n const nextParent = destination.parentId === null ? [] : nextIndex.byId.get(destination.parentId);\n const nextBefore = destination.beforeRowId === null ? undefined : nextIndex.byId.get(destination.beforeRowId);\n if (!nextParent) return nodes;\n const children = [...siblingsAt(detached, nextParent)];\n children.splice(nextBefore?.[nextBefore.length - 1] ?? children.length, 0, source);\n return nextParent.length === 0 ? children : updateCominsTreeNodeAtPath(detached, nextParent, node => ({ ...node, children }));\n}\n\nexport function flattenCominsTree<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: CominsTreeExpansionOptions = {},\n): CominsVisibleTreeRow<TItem>[] {\n const index = createCominsTreeNodeIndex(nodes, getRowId);\n const visibleRows: CominsVisibleTreeRow<TItem>[] = [];\n\n const visit = (currentNodes: readonly CominsTreeNode<TItem>[], depth: number, parentPath: readonly number[]) => {\n currentNodes.forEach((node, childIndex) => {\n const path = [...parentPath, childIndex];\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n const expanded = node.expand ?? options.defaultExpandAll ?? false;\n const rowId = index.idByPath.get(getPathKey(path));\n\n if (rowId === undefined) {\n return;\n }\n\n visibleRows.push({ depth, expanded, hasChildren, item: node.item, path, rowId });\n\n if (hasChildren && expanded) {\n visit(children, depth + 1, path);\n }\n });\n };\n\n visit(nodes, 0, []);\n\n return visibleRows;\n}\n\nexport function getCominsTreeLeafItems<TItem>(nodes: readonly CominsTreeNode<TItem>[]): TItem[] {\n return nodes.flatMap((node) => (node.children?.length ? getCominsTreeLeafItems(node.children) : [node.item]));\n}\n\nexport function toggleCominsTreeNode<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: CominsTreeExpansionOptions = {},\n): CominsTreeNode<TItem>[] {\n const path = createCominsTreeNodeIndex(nodes, getRowId).byId.get(rowId);\n\n if (!path) {\n return [...nodes];\n }\n\n return updateCominsTreeNodeAtPath(nodes, path, (node) => ({\n ...node,\n expand: !(node.expand ?? options.defaultExpandAll ?? false),\n }));\n}\n\nexport function updateCominsTreeItem<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n getRowId: (item: TItem, index: number) => CominsRowId,\n update: (item: TItem) => TItem,\n): CominsTreeNode<TItem>[] {\n const path = createCominsTreeNodeIndex(nodes, getRowId).byId.get(rowId);\n\n if (!path) {\n return [...nodes];\n }\n\n return updateCominsTreeNodeAtPath(nodes, path, (node) => ({ ...node, item: update(node.item) }));\n}\n\nexport function sortCominsTreeSiblings<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n compare: (left: TItem, right: TItem) => number,\n): CominsTreeNode<TItem>[] {\n return [...nodes]\n .sort((left, right) => compare(left.item, right.item))\n .map((node) => ({\n ...node,\n children: node.children ? sortCominsTreeSiblings(node.children, compare) : undefined,\n }));\n}\n","import type { CominsPaginationState, CominsRowId, CominsSortModel, CominsTableColumn } from \"../model\";\nimport type { CominsGroupingProjectionEntry, projectCominsGroups } from \"./grouping\";\nimport { sortCominsTreeSiblings, type CominsTreeNode } from \"../../tree\";\n\ntype Source<TData> = { rows: readonly TData[]; rowIds: readonly CominsRowId[] };\nexport type CoreDataEntry<TData> = {\n kind: \"data\"; key: string; row: TData; rowId: CominsRowId; dataIndex: number;\n visibleLeafIndex: number; absoluteIndex?: number;\n};\nexport type CoreProjectionEntry<TData> = CoreDataEntry<TData>\n | Extract<CominsGroupingProjectionEntry, { kind: \"group\" }>\n | { kind: \"placeholder\"; key: string; absoluteIndex: number };\nexport type CoreProjectionInput<TData, TGroup = unknown> = Source<TData> & (\n | { mode: \"flat\"; dataIndexes: number[]; pagination?: CominsPaginationState; virtualized?: boolean }\n | { mode: \"tree\"; dataIndexes: number[] }\n | { mode: \"grouped\"; projection: ReturnType<typeof projectCominsGroups<TGroup>> }\n | { mode: \"viewport\"; dataIndexes: number[]; absoluteIndexById: ReadonlyMap<CominsRowId, number>; rowCount: number; range?: { startIndex: number; endIndex: number } }\n);\nexport type CoreProjection<TData> = {\n entries: CoreProjectionEntry<TData>[];\n dataIndexes: number[];\n visibleRowIds: CominsRowId[];\n pageDataIndexes: number[];\n pageStartIndex: number;\n};\n\nexport function getCorePageProjection(visibleRowCount: number, pagination: CominsPaginationState) {\n const pageSize = Math.max(1, pagination.pageSize);\n const maxPageIndex = Math.max(0, Math.ceil(visibleRowCount / pageSize) - 1);\n const effectivePageIndex = Math.min(Math.max(0, pagination.pageIndex), maxPageIndex);\n return { pageSize, maxPageIndex, effectivePageIndex, pageStartIndex: effectivePageIndex * pageSize };\n}\n\nexport function projectCoreViewportWindow<TEntry extends { kind: \"data\"; absoluteIndex?: number }>(loaded: readonly TEntry[], range: { startIndex: number; endIndex: number }, rowCount: number) {\n const byIndex = new Map(loaded.flatMap(entry => entry.absoluteIndex === undefined ? [] : [[entry.absoluteIndex, entry] as const]));\n const entries: Array<TEntry | { kind: \"placeholder\"; key: string; absoluteIndex: number }> = [];\n for (let index = range.startIndex; index < Math.min(rowCount, range.endIndex); index++) {\n entries.push(byIndex.get(index) ?? { kind: \"placeholder\", key: `viewport:${index}`, absoluteIndex: index });\n }\n return entries;\n}\n\n/** Inputs are prepared by the separately memoized filter/sort/group phases. */\nexport function projectCoreRows<TData, TGroup = unknown>(input: CoreProjectionInput<TData, TGroup>): CoreProjection<TData> {\n const dataIndexes = input.mode === \"grouped\"\n ? input.projection.entries.flatMap(entry => entry.kind === \"data\" ? [entry.dataIndex] : [])\n : input.dataIndexes;\n const sourceEntries: readonly CominsGroupingProjectionEntry[] = input.mode === \"grouped\" ? input.projection.entries\n : dataIndexes.flatMap((dataIndex, visibleLeafIndex) => {\n const rowId = input.rowIds[dataIndex];\n return rowId === undefined ? [] : [{ kind: \"data\" as const, key: `data:${typeof rowId}:${encodeURIComponent(String(rowId))}`, rowId, dataIndex, visibleLeafIndex }];\n });\n const loaded = sourceEntries.flatMap<CoreProjectionEntry<TData>>(entry => {\n if (entry.kind === \"group\") return [entry];\n const row = input.rows[entry.dataIndex];\n if (row === undefined) return [];\n if (input.mode === \"viewport\") {\n const absoluteIndex = input.absoluteIndexById.get(entry.rowId);\n return absoluteIndex === undefined ? [] : [{ ...entry, row, absoluteIndex }];\n }\n return [{ ...entry, row }];\n });\n let entries = loaded;\n if (input.mode === \"viewport\" && input.range) {\n entries = projectCoreViewportWindow(loaded.filter((entry): entry is CoreDataEntry<TData> => entry.kind === \"data\"), input.range, input.rowCount);\n }\n const page = input.mode === \"flat\" && input.pagination ? getCorePageProjection(dataIndexes.length, input.pagination) : { pageStartIndex: 0, pageSize: dataIndexes.length };\n return { entries, dataIndexes,\n visibleRowIds: entries.flatMap(entry => entry.kind === \"data\" ? [entry.rowId] : []),\n pageStartIndex: page.pageStartIndex,\n pageDataIndexes: input.mode === \"flat\" && !input.virtualized ? dataIndexes.slice(page.pageStartIndex, page.pageStartIndex + page.pageSize) : dataIndexes,\n };\n}\n\nfunction getTreeNestedFieldValue(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, key) => value == null || typeof value !== \"object\" ? undefined : (value as Record<string, unknown>)[key], row);\n}\nfunction compareTreeValues(left: unknown, right: unknown) {\n return typeof left === \"number\" && typeof right === \"number\" ? left - right : String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\nexport function getSortedCoreTree<TData>(data: readonly CominsTreeNode<TData>[], columns: readonly CominsTableColumn<TData>[], sortModel: CominsSortModel) {\n if (sortModel.length === 0) return data;\n return sortCominsTreeSiblings(data, (leftRow, rightRow) => {\n for (const rule of sortModel) {\n const column = columns.find(candidate => (candidate.id ?? candidate.field) === rule.columnId);\n if (!column?.sort) continue;\n const leftValue = getTreeNestedFieldValue(leftRow, column.field);\n const rightValue = getTreeNestedFieldValue(rightRow, column.field);\n const result = typeof column.sort === \"function\" ? column.sort(leftValue, rightValue, leftRow, rightRow) : compareTreeValues(leftValue, rightValue);\n if (result !== 0) return rule.direction === \"desc\" ? result * -1 : result;\n }\n return 0;\n });\n}\n","import type { CominsTableColumn } from \"../react-types\";\nimport type { CominsSortModel } from \"../model\";\nimport type { CominsTreeNode } from \"../tree\";\nimport { getSortedCoreTree } from \"../core/rows/projection\";\nimport { projectReactColumn } from \"./model\";\n\nexport { projectCoreRows as projectReactRows, projectCoreViewportWindow, getCorePageProjection } from \"../core/rows/projection\";\n\nexport function getSortedReactTree<TData>(data: readonly CominsTreeNode<TData>[], columns: readonly CominsTableColumn<TData>[], sortModel: CominsSortModel) {\n if (sortModel.length === 0) return data;\n // Bind comparator receivers to the original definitions, including columns without an explicit id.\n return getSortedCoreTree(data, columns.map(column => ({\n ...projectReactColumn({ ...column, id: column.id ?? column.field }),\n sort: typeof column.sort === \"function\" ? (left, right, leftRow, rightRow) => {\n const compare = column.sort;\n return typeof compare === \"function\" ? compare.call(column, left, right, leftRow, rightRow) : 0;\n } : column.sort,\n })), sortModel);\n}\n","import { planCoreSelectionCopy } from \"./core/selection/navigation\";\nimport {\n copyCominsCell, getCominsCellValue, getCominsSelectedCellRange, getCominsVisibleColumns,\n} from \"./react/core-compat\";\nimport type { CominsCellAddress, CominsCopiedCellRange, CominsRowId } from \"./model\";\nimport type { CominsTableState } from \"./react-types\";\n\nexport type CominsSelectedCell = CominsCellAddress & { value: unknown };\nexport type CominsCopyTarget = \"auto\" | \"cells\" | \"rows\";\nexport type CominsSelectionCopy = { target: \"cells\" | \"rows\"; text: string; data: CominsCopiedCellRange };\n\nexport function selectedRowData<T>(state: CominsTableState<T>): T[] {\n const selected = new Set(state.selection.rowIds);\n return state.rows.filter((_, index) => selected.has(state.rowIds[index]!));\n}\n\nexport function selectedCellValues<T>(state: CominsTableState<T>, order: readonly CominsRowId[] = state.rowIds): CominsSelectedCell[] {\n const cells = state.selection.range ? getCominsSelectedCellRange(state, state.selection.range, order)\n : state.selection.cells ?? (state.selection.cell ? [state.selection.cell] : []);\n const rows = new Map(state.rowIds.map((id, index) => [id, state.rows[index]]));\n const columns = new Set(getCominsVisibleColumns(state).map(column => column.id));\n return cells.flatMap(cell => {\n const row = rows.get(cell.rowId);\n return row === undefined || !columns.has(cell.columnId) ? [] : [{ ...cell, value: getCominsCellValue(state, row, cell.columnId) }];\n });\n}\n\nfunction encodeTsv(value: unknown): string {\n let text = value == null ? \"\" : String(value);\n if (typeof value === \"string\" && /^[\\t\\r\\n ]*[=+@-]/u.test(text)) text = `'${text}`;\n return /[\"\\t\\n\\r]/u.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n\n// Enumeration happens on demand; rendering does not materialize the selected rectangle.\nexport function copySelectionData<T>(state: CominsTableState<T>, target: CominsCopyTarget = \"auto\", order: readonly CominsRowId[] = state.rowIds): CominsSelectionCopy | null {\n const cells = selectedCellValues(state, order);\n const visible = getCominsVisibleColumns(state);\n const plan = planCoreSelectionCopy({ cells, selectedRowIds: state.selection.rowIds, rowIds: order, columnIds: visible.map(column => column.id), target });\n if (!plan) return null;\n const { target: kind, rowIds, selected } = plan;\n const columnsById = new Map(visible.map(column => [column.id, column]));\n const columns = plan.columnIds.map(id => columnsById.get(id)!);\n const rows = rowIds.map(rowId => columns.map(column => {\n if (kind === \"cells\" && !selected.get(rowId)?.has(column.id)) return null;\n const cell = copyCominsCell(state, { rowId, columnId: column.id });\n return cell ? { columnId: column.id, value: cell.value, text: encodeTsv(cell.value) } : null;\n }));\n if (!rows.some(row => row.some(Boolean))) return null;\n const text = rows.map(row => row.map(cell => cell?.text ?? \"\").join(\"\\t\")).join(\"\\n\");\n return { target: kind, text, data: { kind: \"cell-range\", rows, text } };\n}\n","import type { CominsValueFilterPart, CominsValueFilterTriggerRenderParams, CominsValueFilterOptionRenderParams, CominsValueFilterPanelRenderParams } from \"./react/value-filter-types\";\nimport type {\n CominsCellFormatParams,\n CominsTableRuntimeColumn,\n} from \"./react-types\";\nimport type { CominsColumnFilterConfig as CoreFilterConfig, CominsColumnFilterKind } from \"./core/model\";\n\nexport type { CominsColumnFilterKind } from \"./core/model\";\n\nexport type {\n CominsColumnConditionFilterOperator, CominsColumnFilterOperator,\n CominsColumnConditionFilterRule, CominsColumnValueFilterRule,\n CominsColumnFilterRule, CominsColumnFilterModel, CominsColumnFilteringConfig,\n CominsColumnFilteringSourceRow,\n} from \"./core/rows/filtering\";\nexport type { CominsColumnFilterValue } from \"./core/model\";\nexport type { CominsColumnFilterOption, CominsColumnFilterOptionsResult, CominsColumnFilterValuesAction } from \"./core/rows/values-filter\";\nimport type { CominsNormalizedColumnFilterRule as CoreNormalizedRule } from \"./core/rows/filtering\";\nimport type { CominsColumnFilterOptionsInput as CoreOptionsInput, CominsColumnFilterValuesAction } from \"./core/rows/values-filter\";\nimport type { CominsColumnFilteringSourceRow } from \"./core/rows/filtering\";\nimport * as valuesCore from \"./core/rows/values-filter\";\n\nexport type CominsColumnFilterConfig<TData, TValue = unknown> = Omit<CoreFilterConfig<TData, TValue>, \"getValue\"> & {\n mode?: \"condition\" | \"values\";\n trigger?: CominsValueFilterPart<CominsValueFilterTriggerRenderParams<TData>>;\n option?: CominsValueFilterPart<CominsValueFilterOptionRenderParams<TData>>;\n panel?: CominsValueFilterPart<CominsValueFilterPanelRenderParams<TData>>;\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n};\n\ntype RestoreRule<TData, TRule> = TRule extends unknown ? Omit<TRule, \"column\" | \"config\"> & {\n column: CominsTableRuntimeColumn<TData>; config: CominsColumnFilterConfig<TData>;\n} : never;\nexport type CominsNormalizedColumnFilterRule<TData> = RestoreRule<TData, CoreNormalizedRule<TData>>;\nexport type CominsColumnFilterOptionsInput<TData> = Omit<CoreOptionsInput<TData>, \"columns\"> & {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n};\nexport function getCominsColumnFilterOptions<TData>(input: CominsColumnFilterOptionsInput<TData>) {\n return valuesCore.getCominsColumnFilterOptions({ ...input, columns: input.columns.map(projectReactColumn) });\n}\nexport function setCominsColumnFilterValues<TData>(input: CominsColumnFilterOptionsInput<TData> & { action: CominsColumnFilterValuesAction }) {\n return valuesCore.setCominsColumnFilterValues({ ...input, columns: input.columns.map(projectReactColumn) });\n}\n\nexport { getCominsColumnFilterOperators } from \"./core/rows/filtering\";\nimport * as core from \"./core/rows/filtering\";\nimport { projectReactColumn } from \"./react/model\";\n\nexport function normalizeCominsColumnFilterModel<TData>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; model: unknown }): CominsNormalizedColumnFilterRule<TData>[] {\n const originals = new Map(input.columns.map(column => [column.id, column]));\n return core.normalizeCominsColumnFilterModel({ ...input, columns: input.columns.map(projectReactColumn) }).map(rule => {\n const column = originals.get(rule.column.id)!;\n return { ...rule, column, config: column.filter! };\n });\n}\nexport function getCominsFilteredRowIndexes<TData>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; model: unknown; rows: readonly CominsColumnFilteringSourceRow<TData>[] }) {\n return core.getCominsFilteredRowIndexes({ ...input, columns: input.columns.map(projectReactColumn) });\n}\n\nexport type { CominsValueFilterTriggerRenderParams, CominsValueFilterOptionRenderParams, CominsValueFilterPanelRenderParams, CominsValueFilterActions, CominsValueFilterPart, CominsFilterButtonGetter, CominsFilterCheckboxGetter, CominsFilterNativeOptions, CominsFilterCustomOptions, CominsFilterBinding } from \"./react/value-filter-types\";\n","import { useEffect, useMemo, useRef, useState, type ButtonHTMLAttributes, type HTMLAttributes, type InputHTMLAttributes, type Ref, type SyntheticEvent } from \"react\";\nimport { getCominsColumnFilterOptions, setCominsColumnFilterValues, type CominsColumnFilterOptionsInput, type CominsColumnFilterRule, type CominsColumnFilterOption } from \"../filtering\";\nimport { searchFilterOptions } from \"../core/rows/values-filter\";\nimport type { CominsTableRuntimeColumn } from \"../react-types\";\nimport type { CominsFilterButtonGetter, CominsFilterCheckboxGetter, CominsFilterCustomOptions, CominsFilterNativeOptions, CominsValueFilterPanelRenderParams, CominsValueFilterPart, CominsValueFilterTriggerRenderParams } from \"./value-filter-types\";\n\nfunction bindRef<E extends HTMLElement>(user: Ref<E> | undefined, install?: (node: E | null) => void) {\n let cleanup: (() => void) | undefined;\n return (node: E | null) => {\n install?.(node);\n if (cleanup) { cleanup(); cleanup = undefined; if (!node) return; }\n if (typeof user === \"function\") { const next = user(node); if (typeof next === \"function\") cleanup = next; }\n else if (user) user.current = node;\n };\n}\nfunction eventHandler<E extends SyntheticEvent>(user: ((event: E) => void) | undefined, internal: (event: E) => void) {\n return (event: E) => { user?.(event); if (!event.defaultPrevented) internal(event); };\n}\nfunction visual<P extends { className?: string; style?: React.CSSProperties }, Q extends { className?: string; style?: React.CSSProperties }>(base: P, extra?: Q) {\n return { ...base, ...extra, className: [base.className, extra?.className].filter(Boolean).join(\" \"), style: { ...base.style, ...extra?.style } };\n}\nfunction partProps<P>(part: CominsValueFilterPart<P> | undefined, params: P) {\n return typeof part?.props === \"function\" ? part.props(params) : part?.props;\n}\n\nexport function createFilterButtonGetter(input: { label: string; disabled: boolean; click: () => void; className?: string; style?: React.CSSProperties; open?: boolean; controls?: string; install?: (node: HTMLElement | null) => void }): CominsFilterButtonGetter {\n function getProps(options?: CominsFilterNativeOptions<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>): React.ButtonHTMLAttributes<HTMLButtonElement> & { ref: React.RefCallback<HTMLButtonElement> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterCustomOptions<E>): HTMLAttributes<E> & { ref: React.RefCallback<E> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterNativeOptions<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>> | CominsFilterCustomOptions<E> = {}) {\n const shared = { className: input.className, style: input.style };\n const aria = { \"aria-label\": input.label, \"aria-expanded\": input.open, \"aria-controls\": input.controls, \"aria-disabled\": input.disabled || undefined };\n if (options.element === \"custom\") {\n const props = options.props;\n return { ...visual(shared, props), ...aria, role: \"button\", tabIndex: input.disabled ? -1 : 0,\n ref: bindRef(options.ref, input.install),\n onClick: eventHandler(props?.onClick, () => { if (!input.disabled) input.click(); }),\n onKeyDown: eventHandler(props?.onKeyDown, event => {\n if (event.key === \"Enter\" || event.key === \" \") { event.preventDefault(); if (!event.repeat && !input.disabled) input.click(); }\n }) };\n }\n const props = options.props;\n return { ...visual(shared, props), ...aria, type: \"button\" as const, disabled: input.disabled,\n ref: bindRef(options.ref, input.install), onClick: eventHandler(props?.onClick, () => { if (!input.disabled) input.click(); }) };\n }\n return getProps;\n}\n\nfunction createCheckboxGetter(input: { id: string; label: string; checked: boolean | \"mixed\"; disabled: boolean; change: (checked: boolean) => void }): CominsFilterCheckboxGetter {\n function getProps(options?: CominsFilterNativeOptions<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>): InputHTMLAttributes<HTMLInputElement> & { ref: React.RefCallback<HTMLInputElement> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterCustomOptions<E>): HTMLAttributes<E> & { ref: React.RefCallback<E> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterNativeOptions<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>> | CominsFilterCustomOptions<E> = {}) {\n if (options.element === \"custom\") {\n const props = options.props;\n return { ...props, id: input.id, role: \"checkbox\", tabIndex: input.disabled ? -1 : 0,\n \"aria-label\": input.label, \"aria-checked\": input.checked, \"aria-disabled\": input.disabled || undefined,\n ref: bindRef(options.ref), onClick: eventHandler(props?.onClick, () => { if (!input.disabled) input.change(input.checked !== true); }),\n onKeyDown: eventHandler(props?.onKeyDown, event => { if (event.key === \" \") { event.preventDefault(); if (!event.repeat && !input.disabled) input.change(input.checked !== true); } }) };\n }\n const props = options.props;\n return { ...props, id: input.id, type: \"checkbox\" as const, \"aria-label\": input.label,\n checked: input.checked === true, disabled: input.disabled,\n ref: bindRef(options.ref, node => { if (node) node.indeterminate = input.checked === \"mixed\"; }),\n onChange: eventHandler(props?.onChange, event => { if (!input.disabled) input.change(event.currentTarget.checked); }) };\n }\n return getProps;\n}\n\nexport function useValueFilter<TData>(input: {\n column: CominsTableRuntimeColumn<TData>; source: CominsColumnFilterOptionsInput<TData>; enabled: boolean;\n open: boolean; onChangeModel?: (model: CominsColumnFilterRule[]) => void; close: () => void; id: string;\n}) {\n const { column, source, open, enabled, onChangeModel, close, id } = input;\n const [query, setQuery] = useState(\"\");\n const searchRef = useRef<HTMLInputElement | null>(null);\n const readOnly = !onChangeModel;\n useEffect(() => { if (!open || !enabled) setQuery(\"\"); }, [open, enabled]);\n const base = useMemo(() => open && enabled ? getCominsColumnFilterOptions({ ...source, query: \"\" }) : null,\n [open, enabled, source.columnId, source.columns, source.rows, source.model]);\n const result = useMemo(() => base ? searchFilterOptions(base, query) : null, [base, query]);\n const apply = (action: Parameters<typeof setCominsColumnFilterValues<TData>>[0][\"action\"]) => {\n if (readOnly) return;\n const next = setCominsColumnFilterValues({ ...source, query, action });\n if (next !== source.model) onChangeModel?.([...next]);\n };\n if (!result) return { params: null, searchRef };\n const actions = { setQuery, setOptionSelected: (id: string, checked: boolean) => apply({ type: \"setOption\", id, checked }),\n setVisibleSelected: (checked: boolean) => apply({ type: \"setVisible\", checked }), clear: () => { if (!readOnly) { apply({ type: \"clear\" }); setQuery(\"\"); } }, close };\n const getOptionProps: CominsValueFilterPanelRenderParams<TData>[\"getOptionProps\"] = (option: CominsColumnFilterOption, options?: CominsFilterNativeOptions<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>> | CominsFilterCustomOptions<HTMLElement>) => {\n const getter = createCheckboxGetter({ id: `${id}-option-${encodeURIComponent(option.id)}`, label: option.label, checked: option.selected, disabled: readOnly, change: checked => actions.setOptionSelected(option.id, checked) });\n return options?.element === \"custom\" ? getter(options) : getter(options);\n };\n const params: CominsValueFilterPanelRenderParams<TData> = { ...result, column, query, readOnly, actions,\n getSearchInputProps: (options = {}) => ({ ...options.props, type: \"search\", value: query, \"aria-label\": \"Search filter values\", className: [\"comins-column-filter__search\", options.props?.className].filter(Boolean).join(\" \"),\n ref: bindRef(options.ref, node => { searchRef.current = node; }), onChange: eventHandler(options.props?.onChange, event => setQuery(event.currentTarget.value)) }),\n getOptionProps,\n getOptionContainerProps: (option, options) => ({ ...visual(visual({ className: \"comins-column-filter__option\" }, partProps(column.filter?.option, { column, option, query, readOnly })), options?.props), \"data-selected\": option.selected ? \"true\" : undefined, \"data-present\": option.present ? \"true\" : \"false\" }),\n getSelectAllProps: createCheckboxGetter({ id: `${id}-all`, label: \"Select all matching values\", checked: result.visibleSelection, disabled: readOnly || !result.visibleOptionCount, change: actions.setVisibleSelected }),\n getClearProps: createFilterButtonGetter({ label: \"Clear filter\", disabled: readOnly || result.selectionMode === \"all\", click: actions.clear, className: \"comins-column-filter__clear\" }),\n getCloseProps: createFilterButtonGetter({ label: \"Close filter\", disabled: false, click: close, className: \"comins-column-filter__clear\" }),\n renderOption: option => {\n const custom = column.filter?.option?.render?.({ column, option, query, readOnly });\n return custom !== undefined ? custom : <><span>{option.label}</span><small className=\"comins-column-filter__count\">{option.count}</small></>;\n },\n };\n return { params, searchRef };\n}\n\nexport function ValueFilterPanel<TData>({ params }: { params: CominsValueFilterPanelRenderParams<TData> }) {\n const custom = params.column.filter?.panel?.render?.(params);\n return <div {...visual({ className: \"comins-column-filter__values\" }, partProps(params.column.filter?.panel, params))} data-readonly={params.readOnly ? \"true\" : undefined}>\n {custom !== undefined ? custom : <>\n <input {...params.getSearchInputProps()} />\n <label className=\"comins-column-filter__select-all\"><input {...params.getSelectAllProps()} />Select all matching values</label>\n <div className=\"comins-column-filter__options\">\n {params.visibleOptions.map(option => <label key={option.id} {...params.getOptionContainerProps(option)}><input {...params.getOptionProps(option)} />{params.renderOption(option)}</label>)}\n {!params.visibleOptions.length ? <span className=\"comins-column-filter__no-results\">No matching values</span> : null}\n </div>\n <div className=\"comins-column-filter__actions\"><button {...params.getClearProps()}>Clear</button><button {...params.getCloseProps()}>Close</button></div>\n </>}\n </div>;\n}\n\nexport function renderFilterTrigger<TData>(params: CominsValueFilterTriggerRenderParams<TData>, fallback: React.ReactNode) {\n const custom = params.column.filter?.trigger?.render?.(params);\n return custom !== undefined ? custom : fallback;\n}\nexport function getFilterTriggerVisual<TData>(params: CominsValueFilterTriggerRenderParams<TData>) {\n return visual({ className: \"comins-column-filter__trigger\" }, partProps(params.column.filter?.trigger, params));\n}\n","import {\n CaretSortIcon,\n ChevronRightIcon,\n DragHandleDots2Icon,\n MagnifyingGlassIcon,\n} from \"@radix-ui/react-icons\";\nimport * as React from \"react\";\n\nexport type CominsTableIconName =\n | \"columnMove\"\n | \"disclosureCollapsed\"\n | \"disclosureExpanded\"\n | \"filter\"\n | \"sortAscending\"\n | \"sortDescending\"\n | \"sortUnsorted\";\n\nconst icons = {\n columnMove: DragHandleDots2Icon,\n disclosureCollapsed: ChevronRightIcon,\n disclosureExpanded: ChevronRightIcon,\n filter: MagnifyingGlassIcon,\n sortAscending: ChevronRightIcon,\n sortDescending: ChevronRightIcon,\n sortUnsorted: CaretSortIcon,\n} as const;\n\nexport function CominsTableIcon({ className, name }: { className?: string; name: CominsTableIconName }) {\n const Icon = icons[name];\n\n return (\n <Icon\n aria-hidden=\"true\"\n className={[\"comins-table-icon\", className].filter(Boolean).join(\" \")}\n data-comins-icon={name}\n focusable=\"false\"\n />\n );\n}\n\nexport type CominsTableIconButtonProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"aria-label\" | \"children\"\n> & {\n \"aria-label\": string;\n icon: CominsTableIconName;\n};\n\nexport const CominsTableIconButton = React.forwardRef<HTMLButtonElement, CominsTableIconButtonProps>(\n function CominsTableIconButton({ className, icon, type = \"button\", ...buttonProps }, ref) {\n return (\n <button\n className={[\"comins-table-icon-button\", className].filter(Boolean).join(\" \")}\n ref={ref}\n type={type}\n {...buttonProps}\n >\n <CominsTableIcon name={icon} />\n </button>\n );\n },\n);\n","import { createFilterButtonGetter, useValueFilter, ValueFilterPanel, renderFilterTrigger, getFilterTriggerVisual } from \"./react/value-filter\";\nimport type { CominsTableRuntimeColumn } from \"./react-types\";\nimport type { CominsColumnFilterOptionsInput } from \"./filtering\";\nimport type { CominsValueFilterTriggerRenderParams } from \"./react/value-filter-types\";\nimport {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n getCominsColumnFilterOperators,\n type CominsColumnFilterKind,\n type CominsColumnConditionFilterOperator,\n type CominsColumnFilterRule,\n type CominsNormalizedColumnFilterRule,\n} from \"./filtering\";\nimport { CominsTableIconButton } from \"./table-icons\";\n\nconst operatorLabels: Record<CominsColumnConditionFilterOperator, string> = {\n between: \"Between\",\n contains: \"Contains\",\n endsWith: \"Ends with\",\n equals: \"Equals\",\n greaterThan: \"Greater than\",\n greaterThanOrEqual: \"Greater than or equal\",\n isEmpty: \"Is empty\",\n isNotEmpty: \"Is not empty\",\n lessThan: \"Less than\",\n lessThanOrEqual: \"Less than or equal\",\n notContains: \"Does not contain\",\n notEquals: \"Does not equal\",\n startsWith: \"Starts with\",\n};\n\nfunction getDefaultOperator(kind: CominsColumnFilterKind): CominsColumnConditionFilterOperator {\n return kind === \"text\" ? \"contains\" : \"equals\";\n}\n\nfunction getRuleInputValue<TData>(\n rule: CominsNormalizedColumnFilterRule<TData> | undefined,\n kind: CominsColumnFilterKind,\n) {\n const value = rule?.value;\n\n if (value === undefined) {\n return kind === \"boolean\" ? \"true\" : \"\";\n }\n\n if (kind === \"date\" && typeof value === \"number\") {\n return new Date(value).toISOString().slice(0, 10);\n }\n\n return String(value);\n}\n\nfunction getRuleInputValueTo<TData>(\n rule: CominsNormalizedColumnFilterRule<TData> | undefined,\n kind: CominsColumnFilterKind,\n) {\n const value = rule?.valueTo;\n\n if (value === undefined) {\n return \"\";\n }\n\n return kind === \"date\" ? new Date(value).toISOString().slice(0, 10) : String(value);\n}\n\nfunction isValidDateInput(value: string) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/u.test(value)) {\n return false;\n }\n\n const [year, month, day] = value.split(\"-\").map(Number);\n const date = new Date(Date.UTC(year!, month! - 1, day!));\n\n return date.getUTCFullYear() === year && date.getUTCMonth() === month! - 1 && date.getUTCDate() === day;\n}\n\nexport function CominsColumnFilterControl<TData>({\n column, valueSource, onChangeModel,\n columnId,\n columnLabel,\n kind,\n getPortalContainer,\n onChangeRule,\n onOpenChange,\n open,\n rule,\n}: {\n column: CominsTableRuntimeColumn<TData>;\n valueSource: CominsColumnFilterOptionsInput<TData>;\n onChangeModel?: (model: CominsColumnFilterRule[]) => void;\n columnId: string;\n columnLabel: string;\n kind: CominsColumnFilterKind;\n getPortalContainer?: () => HTMLElement | null;\n onChangeRule?: (rule: CominsColumnFilterRule | null) => void;\n onOpenChange?: (columnId: string | null) => void;\n open: boolean;\n rule?: CominsNormalizedColumnFilterRule<TData>;\n}) {\n const buttonRef = useRef<HTMLElement | null>(null);\n const onOpenChangeRef = useRef(onOpenChange);\n const popoverRef = useRef<HTMLSpanElement | null>(null);\n const popoverId = useId();\n const [operator, setOperator] = useState<CominsColumnConditionFilterOperator>(\n (rule?.operator !== \"in\" ? rule?.operator : undefined) ?? getDefaultOperator(kind),\n );\n const [value, setValue] = useState(() => getRuleInputValue(rule, kind));\n const [valueTo, setValueTo] = useState(() => getRuleInputValueTo(rule, kind));\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const pendingRuleKeyRef = useRef<string | null>(null);\n const ruleKey = (next: CominsColumnFilterRule | CominsNormalizedColumnFilterRule<TData> | null | undefined) => {\n const inputValue = (value: unknown) => value === undefined ? \"\" : kind === \"date\" && typeof value === \"number\"\n ? new Date(value).toISOString().slice(0, 10) : String(value);\n return JSON.stringify([next?.operator, inputValue(next?.value), inputValue(next?.valueTo)]);\n };\n const appliedRuleKey = ruleKey(rule);\n const active = rule !== undefined;\n const readOnly = typeof onChangeRule !== \"function\";\n const requiresValue = operator !== \"isEmpty\" && operator !== \"isNotEmpty\";\n\n const valuesMode = rule?.operator === \"in\" || (!rule && column.filter?.mode === \"values\");\n const close = () => { onOpenChange?.(null); if (buttonRef.current?.isConnected) buttonRef.current.focus(); };\n const values = useValueFilter({ column, source: valueSource, open, enabled: valuesMode, onChangeModel, close, id: popoverId });\n const portalContainer = getPortalContainer?.() ?? null;\n const triggerParams: CominsValueFilterTriggerRenderParams<TData> = {\n column, columnLabel, open, active, readOnly, canOpen: !!onOpenChange,\n selection: valuesMode ? values.params ?? undefined : undefined,\n getTriggerProps: createFilterButtonGetter({ label: `Filter ${columnLabel}`, disabled: !onOpenChange, click: () => onOpenChange?.(open ? null : columnId), open, controls: open ? popoverId : undefined, install: node => { buttonRef.current = node; } }),\n };\n triggerParams.getTriggerProps = createFilterButtonGetter({ label: `Filter ${columnLabel}`, disabled: !onOpenChange, click: () => onOpenChange?.(open ? null : columnId), open, controls: open ? popoverId : undefined, install: node => { buttonRef.current = node; }, ...getFilterTriggerVisual(triggerParams) });\n useLayoutEffect(() => {\n if (!open || !valuesMode) return;\n const panel = popoverRef.current;\n if (!panel) return;\n const controls = panel.querySelectorAll<HTMLElement>('input,button,select,textarea,a[href],[tabindex],[contenteditable]');\n const candidates = [values.searchRef.current, ...controls];\n for (const candidate of candidates) {\n if (!candidate || !candidate.isConnected || !panel.contains(candidate) || candidate.matches(':disabled')\n || candidate.closest('[hidden],[inert],[aria-disabled=\"true\"]') || (candidate.tabIndex < 0 && !candidate.isContentEditable)) continue;\n let visible = true;\n for (let element: HTMLElement | null = candidate; element; element = element.parentElement) {\n const style = element.ownerDocument.defaultView?.getComputedStyle(element);\n if (style?.display === \"none\" || style?.visibility === \"hidden\") { visible = false; break; }\n }\n if (!visible) continue;\n candidate.focus({ preventScroll: true });\n if (candidate.ownerDocument.activeElement === candidate || candidate.matches(':focus')) return;\n }\n panel.focus({ preventScroll: true });\n }, [open, valuesMode, portalContainer]);\n\n useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n }, [onOpenChange]);\n\n useEffect(() => {\n if (!open) {\n pendingRuleKeyRef.current = null;\n return;\n }\n\n // Acknowledging our incomplete draft must not reset the chosen operator.\n if (pendingRuleKeyRef.current === appliedRuleKey) {\n pendingRuleKeyRef.current = null;\n return;\n }\n pendingRuleKeyRef.current = null;\n setOperator((rule?.operator !== \"in\" ? rule?.operator : undefined) ?? getDefaultOperator(kind));\n setValue(getRuleInputValue(rule, kind));\n setValueTo(getRuleInputValueTo(rule, kind));\n }, [kind, open, appliedRuleKey]);\n\n useLayoutEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const doc = (buttonRef.current ?? popoverRef.current)?.ownerDocument;\n const win = doc?.defaultView;\n if (!doc || !win) return;\n let alive = true;\n const inside = (target: EventTarget | null) => target instanceof win.Node && (buttonRef.current?.contains(target) || popoverRef.current?.contains(target));\n const updatePosition = () => {\n const button = buttonRef.current;\n const popover = popoverRef.current;\n\n if (!button) {\n return;\n }\n\n const bounds = button.getBoundingClientRect();\n const width = popover?.offsetWidth || 260;\n const height = popover?.offsetHeight || 220;\n const left = Math.min(\n Math.max(8, bounds.left),\n Math.max(8, win.innerWidth - width - 8),\n );\n const below = bounds.bottom + 6;\n const top = below + height <= win.innerHeight - 8\n ? below\n : Math.max(8, bounds.top - height - 6);\n\n setPosition(current => current.left === left && current.top === top ? current : { left, top });\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target;\n\n if (\n inside(target)\n ) {\n return;\n }\n\n onOpenChangeRef.current?.(null);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n event.preventDefault();\n onOpenChangeRef.current?.(null);\n buttonRef.current?.focus();\n };\n\n let focusTimer: number | undefined;\n const handleFocusOut = (event: FocusEvent) => {\n if (!inside(event.target) || inside(event.relatedTarget)) return;\n if (focusTimer !== undefined) win.clearTimeout(focusTimer);\n if (event.relatedTarget) { onOpenChangeRef.current?.(null); return; }\n // Native pointer focus can leave activeElement at body between blur and focusin.\n focusTimer = win.setTimeout(() => {\n if (alive && !inside(doc.activeElement)) onOpenChangeRef.current?.(null);\n }, 0);\n };\n doc.addEventListener(\"focusout\", handleFocusOut);\n // Layout shifts can move the anchor without a scroll or resize event.\n let positionFrame: number;\n const trackPosition = () => {\n updatePosition();\n positionFrame = win.requestAnimationFrame(trackPosition);\n };\n trackPosition();\n win.addEventListener(\"resize\", updatePosition);\n win.addEventListener(\"scroll\", updatePosition, true);\n doc.addEventListener(\"pointerdown\", handlePointerDown, true);\n win.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n alive = false; doc.removeEventListener(\"focusout\", handleFocusOut);\n if (focusTimer !== undefined) win.clearTimeout(focusTimer);\n win.cancelAnimationFrame(positionFrame);\n win.removeEventListener(\"resize\", updatePosition);\n win.removeEventListener(\"scroll\", updatePosition, true);\n doc.removeEventListener(\"pointerdown\", handlePointerDown, true);\n win.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [open]);\n\n const emitRule = (nextRule: CominsColumnFilterRule | null) => {\n const nextKey = ruleKey(nextRule);\n pendingRuleKeyRef.current = nextKey === appliedRuleKey ? null : nextKey;\n onChangeRule?.(nextRule);\n };\n const renderPopover = (content: ReactNode) => {\n return portalContainer ? createPortal(content, portalContainer) : content;\n };\n const commitRule = (\n nextOperator: CominsColumnConditionFilterOperator,\n nextValue: string,\n nextValueTo: string,\n ) => {\n if (!onChangeRule) {\n return;\n }\n\n if (nextOperator === \"isEmpty\" || nextOperator === \"isNotEmpty\") {\n emitRule({ columnId, operator: nextOperator });\n return;\n }\n\n if (kind === \"text\") {\n emitRule(nextValue.length > 0\n ? { columnId, operator: nextOperator, value: nextValue }\n : null);\n return;\n }\n\n if (kind === \"boolean\") {\n emitRule(nextValue === \"true\" || nextValue === \"false\"\n ? { columnId, operator: nextOperator, value: nextValue === \"true\" }\n : null);\n return;\n }\n\n const firstValue = kind === \"date\"\n ? (isValidDateInput(nextValue) ? nextValue : null)\n : (nextValue !== \"\" && Number.isFinite(Number(nextValue)) ? Number(nextValue) : null);\n\n if (firstValue === null) {\n if (nextOperator === \"between\") {\n return;\n }\n\n emitRule(null);\n return;\n }\n\n if (nextOperator === \"between\") {\n const secondValue = kind === \"date\"\n ? (isValidDateInput(nextValueTo) ? nextValueTo : null)\n : (nextValueTo !== \"\" && Number.isFinite(Number(nextValueTo)) ? Number(nextValueTo) : null);\n\n if (secondValue === null) {\n return;\n }\n\n emitRule({ columnId, operator: nextOperator, value: firstValue, valueTo: secondValue });\n return;\n }\n\n emitRule({ columnId, operator: nextOperator, value: firstValue });\n };\n\n return (\n <span\n className=\"comins-column-filter\"\n data-active={active ? \"true\" : undefined}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation();\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onOpenChange?.(null);\n buttonRef.current?.focus();\n }\n }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {renderFilterTrigger(triggerParams, <CominsTableIconButton\n {...triggerParams.getTriggerProps()} aria-label={`Filter ${columnLabel}`} data-active={active ? \"true\" : undefined}\n data-testid={`column-filter-trigger-${columnId}`} icon=\"filter\" />)}\n {open ? renderPopover(\n <span\n aria-label={`Filter ${columnLabel}`}\n className=\"comins-column-filter__popover\"\n data-testid={`column-filter-popover-${columnId}`}\n id={popoverId}\n ref={popoverRef}\n role=\"dialog\"\n tabIndex={-1}\n style={position}\n >\n <strong className=\"comins-column-filter__title\">{columnLabel}</strong>\n {valuesMode && values.params ? <ValueFilterPanel params={values.params} /> : <>\n <label className=\"comins-column-filter__field\">\n <span>Operator</span>\n <select\n data-testid={`column-filter-operator-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextOperator = event.currentTarget.value as CominsColumnConditionFilterOperator;\n setOperator(nextOperator);\n commitRule(nextOperator, value, valueTo);\n }}\n value={operator}\n >\n {getCominsColumnFilterOperators(kind).map((option) => (\n <option key={option} value={option}>{operatorLabels[option]}</option>\n ))}\n </select>\n </label>\n {requiresValue && kind === \"boolean\" ? (\n <label className=\"comins-column-filter__field\">\n <span>Value</span>\n <select\n data-testid={`column-filter-value-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextValue = event.currentTarget.value;\n setValue(nextValue);\n commitRule(operator, nextValue, valueTo);\n }}\n value={value}\n >\n <option value=\"true\">True</option>\n <option value=\"false\">False</option>\n </select>\n </label>\n ) : null}\n {requiresValue && kind !== \"boolean\" ? (\n <label className=\"comins-column-filter__field\">\n <span>{operator === \"between\" ? \"From\" : \"Value\"}</span>\n <input\n data-testid={`column-filter-value-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextValue = event.currentTarget.value;\n setValue(nextValue);\n commitRule(operator, nextValue, valueTo);\n }}\n type={kind === \"date\" ? \"date\" : kind === \"number\" ? \"number\" : \"text\"}\n value={value}\n />\n </label>\n ) : null}\n {requiresValue && operator === \"between\" ? (\n <label className=\"comins-column-filter__field\">\n <span>To</span>\n <input\n data-testid={`column-filter-value-to-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextValueTo = event.currentTarget.value;\n setValueTo(nextValueTo);\n commitRule(operator, value, nextValueTo);\n }}\n type={kind === \"date\" ? \"date\" : \"number\"}\n value={valueTo}\n />\n </label>\n ) : null}\n <button\n className=\"comins-column-filter__clear\"\n data-testid={`column-filter-clear-${columnId}`}\n disabled={readOnly || !active}\n onClick={() => {\n setOperator(getDefaultOperator(kind));\n setValue(kind === \"boolean\" ? \"true\" : \"\");\n setValueTo(\"\");\n emitRule(null);\n }}\n type=\"button\"\n >\n Clear\n </button>\n </>}\n </span>\n ) : null}\n </span>\n );\n}\n","import { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type React from \"react\";\n\nimport type {\n CominsCellComponentConfig,\n CominsCellComponentPayload,\n CominsTableComponentOption,\n CominsTableMenuItem,\n CominsHeaderComponentConfig,\n CominsHeaderComponentPayload,\n CominsVirtualListItem,\n} from \"./react/core-compat\";\n\ntype CominsAnyComponentPayload<TData, TValue> =\n | CominsCellComponentPayload<TData, TValue>\n | CominsHeaderComponentPayload<TData, TValue>;\ntype CominsAnyComponentConfig<TData, TValue> =\n | CominsCellComponentConfig<TData, TValue>\n | CominsHeaderComponentConfig<TData, TValue>;\n\nfunction mergeClassName(...values: Array<string | undefined>) {\n return values.filter(Boolean).join(\" \");\n}\n\nfunction resolveComponentProps<TProps>(value: unknown, payload: unknown): TProps {\n return (typeof value === \"function\" ? (value as (payload: unknown) => TProps)(payload) : value ?? {}) as TProps;\n}\n\nfunction resolveComponentOptions(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\"\n ? (value as (payload: unknown) => CominsTableComponentOption[])(payload)\n : value\n ) as CominsTableComponentOption[];\n}\n\nfunction resolveComponentMenuItems(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\" ? (value as (payload: unknown) => CominsTableMenuItem[])(payload) : value\n ) as CominsTableMenuItem[];\n}\n\nfunction resolveVirtualListItems(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\" ? (value as (payload: unknown) => CominsVirtualListItem[])(payload) : value\n ) as CominsVirtualListItem[];\n}\n\nfunction toSearchableText(value: React.ReactNode): string {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.map(toSearchableText).join(\" \");\n }\n\n return \"\";\n}\n\nfunction isMenuSelectableItem(\n item: CominsTableMenuItem,\n): item is Extract<CominsTableMenuItem, { value: string | number | boolean }> {\n return item.type !== \"divider\" && item.type !== \"label\";\n}\n\nfunction isNodeInside(element: HTMLElement | null, target: EventTarget | null) {\n return Boolean(element && target instanceof Node && element.contains(target));\n}\n\nfunction stopComponentEvent(event: React.SyntheticEvent | Event) {\n event.stopPropagation();\n}\n\nfunction preventAndStopComponentEvent(event: React.SyntheticEvent | Event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nfunction toComponentInputValue(value: unknown) {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\nfunction CominsInputComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"input\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.InputHTMLAttributes<HTMLInputElement>>(component.props, payload);\n const {\n defaultValue,\n onBlur,\n onChange: _propsOnChange,\n onClick,\n onKeyDown,\n onMouseDown,\n onPointerDown,\n value,\n ...inputProps\n } = props;\n const propValue = toComponentInputValue(value ?? defaultValue);\n const [draftValue, setDraftValue] = useState(propValue);\n const lastCommittedValueRef = useRef(propValue);\n\n useEffect(() => {\n setDraftValue(propValue);\n lastCommittedValueRef.current = propValue;\n }, [propValue]);\n\n const commitValue = (event: React.FocusEvent<HTMLInputElement> | React.KeyboardEvent<HTMLInputElement>) => {\n if (draftValue === lastCommittedValueRef.current) {\n return;\n }\n\n lastCommittedValueRef.current = draftValue;\n component.onChange?.({ ...payload, event, value: draftValue } as never);\n component.onValueChange?.({ ...payload, value: draftValue } as never);\n };\n\n return (\n <input\n {...inputProps}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-input\", props.className)}\n onBlur={(event) => {\n onBlur?.(event);\n stopComponentEvent(event);\n commitValue(event);\n }}\n onChange={(event) => {\n stopComponentEvent(event);\n setDraftValue(event.currentTarget.value);\n }}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n\n if (event.key === \"Enter\") {\n event.preventDefault();\n commitValue(event);\n event.currentTarget.blur();\n }\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n value={draftValue}\n />\n );\n}\n\nfunction CominsCheckboxComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"checkbox\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.InputHTMLAttributes<HTMLInputElement>>(component.props, payload);\n const { checked, defaultChecked, onChange, onClick, onKeyDown, onMouseDown, onPointerDown, style, ...inputProps } = props;\n const [optimisticChecked, setOptimisticChecked] = useState(Boolean(checked ?? defaultChecked));\n\n useEffect(() => {\n if (checked !== undefined) {\n setOptimisticChecked(Boolean(checked));\n }\n }, [checked]);\n\n return (\n <input\n {...inputProps}\n checked={optimisticChecked}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-checkbox\", props.className)}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onChange={(event) => {\n onChange?.(event);\n stopComponentEvent(event);\n setOptimisticChecked(event.currentTarget.checked);\n component.onCheckedChange?.({ ...payload, checked: event.currentTarget.checked } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n style={{ height: 20, width: 20, ...style }}\n type=\"checkbox\"\n />\n );\n}\n\nfunction CominsToggleComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"toggle\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement> & { checked?: boolean }>(\n component.props,\n payload,\n );\n const { checked, ...buttonProps } = props;\n const { onClick, onKeyDown, onMouseDown, onPointerDown, ...restButtonProps } = buttonProps;\n const [optimisticChecked, setOptimisticChecked] = useState(Boolean(checked));\n\n useEffect(() => {\n if (checked !== undefined) {\n setOptimisticChecked(Boolean(checked));\n }\n }, [checked]);\n\n const buttonChildren =\n typeof buttonProps.children === \"string\" && (buttonProps.children === \"ON\" || buttonProps.children === \"OFF\")\n ? optimisticChecked\n ? \"ON\"\n : \"OFF\"\n : buttonProps.children;\n\n return (\n <button\n {...restButtonProps}\n aria-pressed={optimisticChecked}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-toggle\",\n buttonProps.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n const nextChecked = !optimisticChecked;\n setOptimisticChecked(nextChecked);\n component.onCheckedChange?.({ ...payload, checked: nextChecked } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n type={buttonProps.type ?? \"button\"}\n >\n {buttonChildren}\n </button>\n );\n}\n\nfunction CominsHeaderMenuComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsHeaderComponentConfig<TData, TValue>, { type: \"menu\" }>;\n payload: CominsHeaderComponentPayload<TData, TValue>;\n}) {\n const [open, setOpen] = useState(false);\n const menuId = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [menuPosition, setMenuPosition] = useState<React.CSSProperties>({\n left: 0,\n position: \"fixed\",\n top: 0,\n });\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement>>(component.props, payload);\n const items = useMemo(() => resolveComponentMenuItems(component.items, payload), [component.items, payload]);\n\n const updateMenuPosition = () => {\n const trigger = triggerRef.current;\n\n if (!trigger || typeof window === \"undefined\") {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const menuWidth = Math.max(menuRef.current?.offsetWidth ?? 136, 136);\n\n setMenuPosition({\n left: Math.max(8, Math.min(rect.left, window.innerWidth - menuWidth - 8)),\n position: \"fixed\",\n top: Math.min(rect.bottom + 4, window.innerHeight - 8),\n zIndex: 9999,\n });\n };\n\n const requestOpen = (nextOpen: boolean, event?: Event | React.SyntheticEvent) => {\n if (nextOpen === open) {\n return;\n }\n\n const beforeResult = component.onBeforeChange?.({ ...payload, event, open: nextOpen } as never);\n\n if (beforeResult === false) {\n return;\n }\n\n setOpen(nextOpen);\n component.onOpenChange?.({ ...payload, event, open: nextOpen } as never);\n };\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n if (isNodeInside(triggerRef.current, event.target) || isNodeInside(menuRef.current, event.target)) {\n return;\n }\n\n requestOpen(false, event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n requestOpen(false, event);\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [open]);\n\n useLayoutEffect(() => {\n if (!open) {\n return undefined;\n }\n\n updateMenuPosition();\n\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n window.addEventListener(\"resize\", updateMenuPosition);\n window.addEventListener(\"scroll\", updateMenuPosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updateMenuPosition);\n window.removeEventListener(\"scroll\", updateMenuPosition, true);\n };\n }, [open]);\n\n const menu = open ? (\n <span\n aria-label=\"Header menu\"\n className=\"comins-table__component-menu-popover\"\n id={menuId}\n ref={menuRef}\n role=\"menu\"\n style={menuPosition}\n >\n {items.map((item, index) => {\n if (item.type === \"divider\") {\n return (\n <span\n aria-orientation=\"horizontal\"\n className=\"comins-table__component-menu-divider\"\n key={`divider-${index}`}\n role=\"separator\"\n />\n );\n }\n\n if (item.type === \"label\") {\n return (\n <span className=\"comins-table__component-menu-label\" key={`label-${index}`} role=\"presentation\">\n {item.label}\n </span>\n );\n }\n\n return (\n <button\n className=\"comins-table__component-menu-item\"\n disabled={item.disabled}\n key={`${String(item.value)}-${index}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n\n if (item.disabled || !isMenuSelectableItem(item)) {\n return;\n }\n\n requestOpen(false, event);\n component.onSelect?.({ ...payload, event, item, value: item.value } as never);\n }}\n onKeyDown={(event) => {\n stopComponentEvent(event);\n if (event.key === \"Escape\") {\n event.preventDefault();\n requestOpen(false, event);\n triggerRef.current?.focus();\n }\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"menuitem\"\n type=\"button\"\n >\n {item.label}\n </button>\n );\n })}\n </span>\n ) : null;\n\n return (\n <span className=\"comins-table__component comins-table__component-menu\">\n <button\n {...props}\n aria-controls={open ? menuId : undefined}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label={props[\"aria-label\"] ?? \"Header menu\"}\n className={mergeClassName(\"comins-table__component-menu-trigger\", props.className)}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n requestOpen(!open, event);\n }}\n onKeyDown={(event) => {\n props.onKeyDown?.(event);\n\n if (event.key === \"Escape\" && open) {\n preventAndStopComponentEvent(event);\n requestOpen(false, event);\n return;\n }\n\n stopComponentEvent(event);\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={(event) => {\n props.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n ref={triggerRef}\n type={props.type ?? \"button\"}\n >\n {props.children ?? \"메뉴\"}\n </button>\n {menu}\n </span>\n );\n}\n\nfunction CominsCellVirtualListComponent<TData, TValue>({\n component,\n interaction,\n payload,\n}: {\n component: Extract<CominsCellComponentConfig<TData, TValue>, { type: \"virtual-list\" }>;\n interaction?: CominsBuiltInComponentInteraction;\n payload: CominsCellComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<\n React.HTMLAttributes<HTMLDivElement> & {\n height?: number | string;\n itemHeight?: number;\n limit?: number;\n more?: boolean;\n searchable?: boolean;\n }\n >(component.props, payload);\n const {\n height,\n itemHeight: itemHeightProp,\n limit: limitProp,\n more = false,\n searchable = false,\n style,\n ...rootProps\n } = props;\n const items = useMemo(() => resolveVirtualListItems(component.items, payload), [component.items, payload]);\n const limit = Math.max(1, Number(limitProp ?? 5));\n const itemHeight = Math.max(1, Number(itemHeightProp ?? 28));\n const defaultHeight = itemHeight * 5;\n const hasExplicitHeight = height !== undefined || style?.height !== undefined;\n const [query, setQuery] = useState(\"\");\n const [expanded, setExpanded] = useState(false);\n const [scrollTop, setScrollTop] = useState(0);\n const [selectedValue, setSelectedValue] = useState<string | number | boolean | null>(null);\n const [viewportHeight, setViewportHeight] = useState(defaultHeight);\n const itemsViewportRef = useRef<HTMLDivElement>(null);\n const isSingleRowSelected = payload.row.selected && payload.selection.selectedRowCount === 1;\n const searchEnabled = Boolean(searchable && isSingleRowSelected);\n const activeQuery = searchEnabled ? query : \"\";\n\n useEffect(() => {\n setExpanded(false);\n setScrollTop(0);\n }, [items.length, limit]);\n\n useLayoutEffect(() => {\n const viewport = itemsViewportRef.current;\n\n if (!viewport) {\n return;\n }\n\n const measuredHeight = viewport.clientHeight > 0 ? viewport.clientHeight : defaultHeight;\n\n setViewportHeight(hasExplicitHeight ? measuredHeight : Math.min(measuredHeight, defaultHeight));\n }, [defaultHeight, expanded, activeQuery, hasExplicitHeight]);\n\n useEffect(() => {\n const viewport = itemsViewportRef.current;\n\n if (!viewport) {\n return;\n }\n\n viewport.scrollTop = 0;\n setScrollTop(0);\n }, [activeQuery]);\n\n useEffect(() => {\n if (isSingleRowSelected) {\n return;\n }\n\n const viewport = itemsViewportRef.current;\n\n if (viewport) {\n viewport.scrollTop = 0;\n }\n\n setExpanded(false);\n setQuery(\"\");\n setScrollTop(0);\n }, [isSingleRowSelected]);\n\n const filteredEntries = useMemo(() => {\n const normalizedQuery = activeQuery.trim().toLowerCase();\n\n return items\n .map((item, itemIndex) => ({ item, itemIndex }))\n .filter(({ item, itemIndex }) => {\n if (!normalizedQuery) {\n return true;\n }\n\n if (component.searchFilter) {\n return component.searchFilter({ item, itemIndex, value: activeQuery });\n }\n\n return toSearchableText(item.label).toLowerCase().includes(normalizedQuery);\n });\n }, [activeQuery, component, items]);\n const hasOverflow = filteredEntries.length > limit;\n const virtualized = Boolean(\n isSingleRowSelected && (expanded || activeQuery.trim().length > 0 || (!more && hasOverflow)),\n );\n const showOverflowControl = hasOverflow && !virtualized;\n const overscan = searchEnabled && !expanded ? 0 : 2;\n const safeViewportHeight = Math.max(\n itemHeight,\n hasExplicitHeight ? viewportHeight || defaultHeight : Math.min(viewportHeight || defaultHeight, defaultHeight),\n );\n const visibleStart = Math.max(0, Math.floor(Math.max(0, scrollTop) / itemHeight) - overscan);\n const visibleEnd = Math.min(\n filteredEntries.length,\n Math.ceil((Math.max(0, scrollTop) + safeViewportHeight) / itemHeight) + overscan,\n );\n const renderedEntries = virtualized\n ? filteredEntries.slice(visibleStart, visibleEnd)\n : filteredEntries.slice(0, hasOverflow ? limit : filteredEntries.length);\n const topSpacerHeight = virtualized ? visibleStart * itemHeight : 0;\n const bottomSpacerHeight = virtualized ? Math.max(0, filteredEntries.length - visibleEnd) * itemHeight : 0;\n const listId = `${String(payload.row.id)}-${payload.column.id}`;\n const rootStyle = {\n ...style,\n \"--comins-table-virtual-list-item-height\": `${itemHeight}px`,\n height: height ?? style?.height ?? defaultHeight,\n } as React.CSSProperties;\n\n const selectItem = (\n item: CominsVirtualListItem,\n itemIndex: number,\n event: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>,\n ) => {\n if (item.disabled) {\n return;\n }\n\n const accepted = interaction?.requestRowSelection?.({ event, mode: \"row-click\" });\n\n if (accepted === false) {\n return;\n }\n\n setSelectedValue(item.value);\n component.onClickItem?.({ ...payload, event, item, itemIndex, value: item.value } as never);\n };\n\n return (\n <div\n {...rootProps}\n aria-label={rootProps[\"aria-label\"] ?? \"Virtual list\"}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-virtual-list\", rootProps.className)}\n data-comins-virtual-list-expanded={virtualized ? \"true\" : undefined}\n data-comins-virtual-list-visible-count={renderedEntries.length}\n data-testid={`virtual-list-${listId}`}\n onClick={(event) => {\n rootProps.onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onContextMenu={stopComponentEvent}\n onDoubleClick={stopComponentEvent}\n onMouseUp={stopComponentEvent}\n onPointerUp={stopComponentEvent}\n onPointerMove={stopComponentEvent}\n onPointerEnter={stopComponentEvent}\n onMouseOver={stopComponentEvent}\n onMouseOut={stopComponentEvent}\n onPointerLeave={stopComponentEvent}\n onBlur={stopComponentEvent}\n onFocus={stopComponentEvent}\n onInput={stopComponentEvent}\n onChange={stopComponentEvent}\n onMouseMove={stopComponentEvent}\n onMouseEnter={stopComponentEvent}\n onMouseLeave={stopComponentEvent}\n onTouchStart={stopComponentEvent}\n onTouchMove={stopComponentEvent}\n onTouchEnd={stopComponentEvent}\n onWheel={(event) => {\n rootProps.onWheel?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n rootProps.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n role=\"listbox\"\n style={rootStyle}\n >\n <div\n className=\"comins-table__component-virtual-list-items\"\n onScroll={(event) => {\n stopComponentEvent(event);\n setScrollTop(event.currentTarget.scrollTop);\n const measuredHeight = event.currentTarget.clientHeight > 0 ? event.currentTarget.clientHeight : defaultHeight;\n setViewportHeight(hasExplicitHeight ? measuredHeight : Math.min(measuredHeight, defaultHeight));\n }}\n ref={itemsViewportRef}\n role=\"presentation\"\n >\n {topSpacerHeight > 0 ? (\n <span aria-hidden=\"true\" className=\"comins-table__component-virtual-list-spacer\" style={{ height: topSpacerHeight }} />\n ) : null}\n {renderedEntries.map(({ item, itemIndex }) => (\n <button\n aria-selected={selectedValue === item.value}\n className=\"comins-table__component-virtual-list-item\"\n data-comins-virtual-list-item=\"true\"\n disabled={item.disabled}\n key={`${String(item.value)}-${itemIndex}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n selectItem(item, itemIndex, event);\n }}\n onContextMenu={(event) => {\n stopComponentEvent(event);\n\n if (item.disabled) {\n return;\n }\n\n component.onContextMenuItem?.({ ...payload, event, item, itemIndex, value: item.value } as never);\n }}\n onKeyDown={(event) => {\n stopComponentEvent(event);\n\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n selectItem(item, itemIndex, event);\n }\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"option\"\n type=\"button\"\n >\n <span className=\"comins-table__component-virtual-list-item-label\">{item.label}</span>\n </button>\n ))}\n {bottomSpacerHeight > 0 ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-table__component-virtual-list-spacer\"\n style={{ height: bottomSpacerHeight }}\n />\n ) : null}\n </div>\n <div className=\"comins-table__component-virtual-list-controls\">\n {more && hasOverflow ? (\n <button\n aria-expanded={virtualized}\n aria-label=\"전체 목록 보기\"\n className=\"comins-table__component-virtual-list-overflow comins-table__component-virtual-list-more\"\n data-testid={`virtual-list-overflow-${listId}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n\n if (interaction?.requestRowSelection?.({ event, mode: \"exclusive\" }) === false) {\n return;\n }\n\n setExpanded(true);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n type=\"button\"\n >\n ...\n </button>\n ) : showOverflowControl ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-table__component-virtual-list-overflow comins-table__component-virtual-list-more\"\n data-testid={`virtual-list-overflow-${listId}`}\n >\n ...\n </span>\n ) : null}\n {searchEnabled ? (\n <input\n aria-label={`${rootProps[\"aria-label\"] ?? \"Virtual list\"} 검색`}\n className=\"comins-table__component-virtual-list-search\"\n data-testid={`virtual-list-search-${listId}`}\n onChange={(event) => {\n stopComponentEvent(event);\n setQuery(event.currentTarget.value);\n }}\n onClick={stopComponentEvent}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n placeholder=\"검색\"\n value={query}\n />\n ) : null}\n </div>\n </div>\n );\n}\n\nexport type CominsBuiltInComponentInteraction = {\n requestRowSelection?: (request: {\n event: React.KeyboardEvent<HTMLButtonElement> | React.MouseEvent<HTMLButtonElement>;\n mode: \"exclusive\" | \"row-click\";\n }) => boolean;\n};\n\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsCellComponentConfig<TData, TValue>,\n payload: CominsCellComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsHeaderComponentConfig<TData, TValue>,\n payload: CominsHeaderComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsAnyComponentConfig<TData, TValue>,\n payload: CominsAnyComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode {\n if (component.type === \"menu\") {\n return <CominsHeaderMenuComponent component={component} payload={payload as CominsHeaderComponentPayload<TData, TValue>} />;\n }\n\n if (component.type === \"virtual-list\") {\n return (\n <CominsCellVirtualListComponent\n component={component}\n interaction={interaction}\n payload={payload as CominsCellComponentPayload<TData, TValue>}\n />\n );\n }\n\n if (component.type === \"button\") {\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement>>(component.props, payload);\n const { onClick, onKeyDown, onMouseDown, onPointerDown, ...buttonProps } = props;\n\n return (\n <button\n {...buttonProps}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-button\",\n props.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n component.onClick?.({ ...payload, event } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n type={props.type ?? \"button\"}\n />\n );\n }\n\n if (component.type === \"input\") {\n return <CominsInputComponent component={component} payload={payload} />;\n }\n\n if (component.type === \"checkbox\") {\n return <CominsCheckboxComponent component={component} payload={payload} />;\n }\n\n if (component.type === \"select\") {\n const props = resolveComponentProps<React.SelectHTMLAttributes<HTMLSelectElement>>(component.props, payload);\n const options = resolveComponentOptions(component.options, payload);\n const { onChange, onClick, onKeyDown, onMouseDown, onPointerDown, ...selectProps } = props;\n\n return (\n <select\n {...selectProps}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-select\",\n props.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onChange={(event) => {\n onChange?.(event);\n stopComponentEvent(event);\n component.onValueChange?.({ ...payload, value: event.currentTarget.value } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n >\n {options.map((option) => (\n <option disabled={option.disabled} key={String(option.value)} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n if (component.type === \"radio\") {\n const props = resolveComponentProps<\n React.HTMLAttributes<HTMLDivElement> & { value?: string | number | boolean }\n >(component.props, payload);\n const options = resolveComponentOptions(component.options, payload);\n const selectedValue =\n props.value ?? (\"value\" in payload ? (payload as CominsCellComponentPayload<TData, TValue>).value : undefined);\n const groupName =\n \"row\" in payload\n ? `${payload.column.id}-${String((payload as CominsCellComponentPayload<TData, TValue>).row.id)}-radio`\n : `${payload.column.id}-header-radio`;\n const { value: _value, ...divProps } = props;\n\n return (\n <div\n {...divProps}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-radio\", divProps.className)}\n onClick={(event) => {\n divProps.onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={(event) => {\n divProps.onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n divProps.onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n divProps.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n role=\"radiogroup\"\n >\n {options.map((option) => (\n <label key={String(option.value)} onClick={stopComponentEvent} onMouseDown={stopComponentEvent}>\n <input\n checked={selectedValue === undefined ? undefined : String(selectedValue) === String(option.value)}\n disabled={option.disabled}\n name={groupName}\n onClick={stopComponentEvent}\n onChange={(event) => {\n stopComponentEvent(event);\n\n if (event.currentTarget.checked) {\n component.onValueChange?.({ ...payload, value: String(option.value) } as never);\n }\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n style={{ height: 20, width: 20 }}\n type=\"radio\"\n value={String(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n );\n }\n\n if (component.type === \"toggle\") {\n return <CominsToggleComponent component={component} payload={payload} />;\n }\n\n const props = resolveComponentProps<React.HTMLAttributes<HTMLDivElement> & { max?: number; value?: number }>(\n component.props,\n payload,\n );\n const value = Number(props.value ?? 0);\n const max = Math.max(1, Number(props.max ?? 100));\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div\n {...props}\n aria-valuemax={max}\n aria-valuemin={0}\n aria-valuenow={value}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-progress\", props.className)}\n onClick={stopComponentEvent}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"progressbar\"\n >\n <span style={{ width: `${percent}%` }} />\n </div>\n );\n}\n","import { useLayoutEffect, useRef } from \"react\";\nimport type * as React from \"react\";\nimport type { createCominsDetailFocusRestorer } from \"./browser/scroll\";\n\nimport { CominsTableIconButton } from \"./table-icons\";\n\nexport function CominsRowDetailToggle(props: {\n controlsId?: string;\n disabled: boolean;\n expanded: boolean;\n id: string;\n label: string;\n onElement: (element: HTMLButtonElement | null) => void;\n onToggle: () => void;\n testId: string;\n}) {\n return (\n <CominsTableIconButton\n aria-controls={props.expanded ? props.controlsId : undefined}\n aria-expanded={props.expanded}\n aria-label={props.label}\n className=\"comins-row-detail-expander\"\n data-comins-row-leading-control=\"disclosure\"\n data-testid={props.testId}\n disabled={props.disabled}\n icon={props.expanded ? \"disclosureExpanded\" : \"disclosureCollapsed\"}\n id={props.id}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.onToggle();\n }}\n onKeyDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n ref={props.onElement}\n />\n );\n}\n\nexport function CominsRowDetailRow(props: {\n children: React.ReactNode;\n colSpan: number;\n contentId: string;\n fixedHeight?: number;\n labelId: string;\n onContentElement: (element: HTMLDivElement | null) => void;\n ownerId: string;\n testId: string;\n getToggleElement: () => HTMLButtonElement | null;\n restoreFocus: ReturnType<typeof createCominsDetailFocusRestorer>[\"restore\"];\n}) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const getToggleElementRef = useRef(props.getToggleElement);\n const restoreFocusRef = useRef(props.restoreFocus);\n const onContentElementRef = useRef(props.onContentElement);\n const automatic = props.fixedHeight === undefined;\n\n getToggleElementRef.current = props.getToggleElement;\n restoreFocusRef.current = props.restoreFocus;\n onContentElementRef.current = props.onContentElement;\n\n useLayoutEffect(() => {\n const element = contentRef.current;\n\n onContentElementRef.current(element);\n\n return () => onContentElementRef.current(null);\n }, [automatic]);\n\n useLayoutEffect(() => {\n const element = contentRef.current;\n\n return () => {\n restoreFocusRef.current(element, () => getToggleElementRef.current());\n };\n }, []);\n\n return (\n <tr className=\"comins-table__detail-row\" data-detail-for={props.ownerId}>\n <td className=\"comins-table__detail-cell\" colSpan={Math.max(1, props.colSpan)}>\n <div\n aria-labelledby={props.labelId}\n className=\"comins-table__detail-content\"\n data-testid={props.testId}\n id={props.contentId}\n ref={contentRef}\n role=\"region\"\n style={props.fixedHeight === undefined ? undefined : { height: props.fixedHeight }}\n >\n {props.children}\n </div>\n </td>\n </tr>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type PointerEvent as ReactPointerEvent, type RefObject } from \"react\";\nimport type { CominsCellAddress, CominsCellRange, CominsRowId, CominsTableState } from \"./react/core-compat\";\nimport { getCominsDragAutoScrollVelocity, getCoreCellBounds as bounds, getCoreCellRange as rangeOf, resolveCoreFillTarget } from \"./core/selection/navigation\";\nimport { applyCominsDragScroll, captureCominsPointer, focusCominsPointerTarget, registerCominsPointerListeners, startCominsPointerFrames } from \"./browser/pointer\";\n\n/** Private gesture controller. All writes go through the owning Table's batch callback. */\nexport function useCominsCellFill<TData>(options: {\n enabled: boolean;\n state: CominsTableState<TData>;\n rowIds: readonly CominsRowId[];\n columnIds: readonly string[];\n root: RefObject<HTMLDivElement | null>;\n viewport: RefObject<HTMLDivElement | null>;\n addressAtPoint: (x: number, y: number) => CominsCellAddress | null;\n canUseRange: (range: CominsCellRange) => boolean;\n onFill: (source: CominsCellRange, target: CominsCellRange) => boolean;\n registerGesture: (cleanup: () => void) => void;\n releaseGesture: (cleanup: () => void) => void;\n scrollHorizontal: (delta: number) => void;\n}) {\n const latest = useRef(options); latest.current = options;\n const cancelRef = useRef<(() => void) | null>(null);\n const suppressClick = useRef(false);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [preview, setPreview] = useState<CominsCellRange | null>(null);\n const [menu, setMenu] = useState<{ x: number; y: number } | null>(null);\n const selection = options.state.selection;\n const source = options.enabled ? selection.range ?? ((selection.cells?.length ?? 0) > 1 || !selection.cell ? null : { anchor: selection.cell, focus: selection.cell }) : null;\n const box = source ? bounds(source, options.rowIds, options.columnIds) : null;\n const closeMenu = (focus = true) => { setMenu(null); if (focus) focusCominsPointerTarget(triggerRef.current); };\n useEffect(() => () => cancelRef.current?.(), []);\n useEffect(() => {\n if (!menu) return;\n menuRef.current?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus();\n const dismiss = (event: Event) => { if (!menuRef.current?.contains(event.target as Node) && !triggerRef.current?.contains(event.target as Node)) closeMenu(false); };\n const key = (event: KeyboardEvent) => { if (event.key === \"Escape\") { event.preventDefault(); closeMenu(); } };\n const scroll = () => closeMenu(false);\n document.addEventListener(\"pointerdown\", dismiss); document.addEventListener(\"keydown\", key);\n window.addEventListener(\"scroll\", scroll, true); window.addEventListener(\"blur\", scroll);\n return () => { document.removeEventListener(\"pointerdown\", dismiss); document.removeEventListener(\"keydown\", key); window.removeEventListener(\"scroll\", scroll, true); window.removeEventListener(\"blur\", scroll); };\n }, [menu]);\n useEffect(() => { cancelRef.current?.(); setMenu(null); }, [options.enabled, options.state.rows, options.state.columnOrder, options.state.selection, options.rowIds]);\n\n const fillSelection = (direction: \"down\" | \"right\") => {\n // Imperative callers may retain a method from an earlier render.\n const current = latest.current, selection = current.state.selection;\n const source = current.enabled ? selection.range ?? ((selection.cells?.length ?? 0) > 1 || !selection.cell ? null : { anchor: selection.cell, focus: selection.cell }) : null;\n const box = source ? bounds(source, current.rowIds, current.columnIds) : null;\n if (!source || !box || !current.canUseRange(source)) return false;\n const from = direction === \"down\" ? { ...box, bottom: box.top } : { ...box, right: box.left };\n if (direction === \"down\" ? box.top === box.bottom : box.left === box.right) return false;\n return current.onFill(rangeOf(from, current.rowIds, current.columnIds), source);\n };\n const begin = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (!source || !box || event.button !== 0 || !options.canUseRange(source)) return;\n event.preventDefault(); event.stopPropagation(); focusCominsPointerTarget(event.currentTarget);\n // Touch keeps the gesture on this control while hit testing uses viewport coordinates.\n const releasePointer = captureCominsPointer(event.currentTarget, event.pointerId);\n setMenu(null); suppressClick.current = false;\n const initial = options, initialSource = source, pointerId = event.pointerId;\n let x = event.clientX, y = event.clientY, moved = false, target: CominsCellRange | null = null, targetKey = \"\", lastTime = 0;\n const validSnapshot = () => latest.current.enabled && latest.current.state.rows === initial.state.rows\n && latest.current.state.columnOrder === initial.state.columnOrder && latest.current.state.selection === initial.state.selection\n && latest.current.rowIds === initial.rowIds;\n const update = () => {\n if (!validSnapshot()) { cleanup(); return; }\n const viewport = initial.viewport.current;\n if (!viewport) return;\n const rect = viewport.getBoundingClientRect();\n const address = latest.current.addressAtPoint(Math.max(rect.left + 1, Math.min(rect.right - 1, x)), Math.max(rect.top + 1, Math.min(rect.bottom - 1, y)));\n const candidate = resolveCoreFillTarget({ source: initialSource, address, rowIds: initial.rowIds, columnIds: initial.columnIds });\n const next = candidate && latest.current.canUseRange(candidate) ? candidate : null;\n const key = JSON.stringify(next);\n if (key !== targetKey) { targetKey = key; target = next; setPreview(next); }\n };\n const tick = (time: number) => {\n if (!validSnapshot()) { cleanup(); return; }\n const viewport = initial.viewport.current;\n if (moved && viewport) {\n const rect = viewport.getBoundingClientRect(), deltaMs = lastTime ? time - lastTime : 16;\n applyCominsDragScroll(viewport, { top: rect.top, bottom: rect.bottom, clientY: y, deltaMs });\n const horizontal = getCominsDragAutoScrollVelocity({ top: rect.left, bottom: rect.right, clientY: x });\n if (horizontal) latest.current.scrollHorizontal(horizontal * Math.min(deltaMs, 32) / 1000);\n update();\n }\n lastTime = time;\n };\n const move = (next: PointerEvent) => {\n if (next.pointerId !== pointerId) return;\n x = next.clientX; y = next.clientY;\n moved ||= Math.hypot(x - event.clientX, y - event.clientY) >= 4;\n if (moved) { suppressClick.current = true; update(); }\n };\n const cleanup = () => {\n stopFrames(); removeListeners(); releasePointer();\n initial.releaseGesture(cleanup);\n if (cancelRef.current === cleanup) cancelRef.current = null;\n setPreview(null);\n };\n const cancel = () => { suppressClick.current = true; cleanup(); };\n const up = (next: PointerEvent) => {\n if (next.pointerId !== pointerId) return;\n const commit = moved && target && validSnapshot() ? target : null;\n cleanup();\n if (commit) latest.current.onFill(initialSource, commit);\n };\n const key = (next: KeyboardEvent) => { if (next.key === \"Escape\") { next.preventDefault(); cancel(); } };\n initial.registerGesture(cleanup); cancelRef.current = cleanup;\n const removeListeners = registerCominsPointerListeners({ move, up, cancel, blur: cancel, key, keyCapture: true });\n const stopFrames = startCominsPointerFrames(tick);\n };\n const previewBox = preview ? bounds(preview, options.rowIds, options.columnIds) : null;\n const rowPositions = useMemo(() => options.enabled ? new Map(options.rowIds.map((id, index) => [id, index])) : new Map<CominsRowId, number>(), [options.enabled, options.rowIds]);\n const columnPositions = useMemo(() => new Map(options.columnIds.map((id, index) => [id, index])), [options.columnIds]);\n const handleAddress = box && source && options.canUseRange(source) ? rangeOf(box, options.rowIds, options.columnIds).focus : null;\n return {\n fillSelection,\n preview,\n isPreview: (address: CominsCellAddress) => {\n if (!previewBox) return false;\n const row = rowPositions.get(address.rowId) ?? -1, column = columnPositions.get(address.columnId) ?? -1;\n return row >= previewBox.top && row <= previewBox.bottom && column >= previewBox.left && column <= previewBox.right;\n },\n handleAddress,\n handle: <button type=\"button\" aria-label=\"Fill selection\" aria-haspopup=\"dialog\" aria-expanded={Boolean(menu)} className=\"comins-fill-handle\"\n ref={triggerRef} data-testid=\"fill-handle\" onPointerDown={begin} onMouseDown={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()} onClick={event => {\n event.stopPropagation();\n if (suppressClick.current) { suppressClick.current = false; return; }\n const rect = event.currentTarget.getBoundingClientRect();\n setMenu(menu ? null : { x: Math.max(4, Math.min(window.innerWidth - 188, rect.right)), y: Math.max(4, Math.min(window.innerHeight - 90, rect.bottom)) });\n }}><span aria-hidden=\"true\" /></button>,\n menu: menu && box ? <div className=\"comins-fill-menu\" role=\"dialog\" aria-label=\"Fill selection\" ref={menuRef}\n style={{ left: menu.x, top: menu.y }} onPointerDown={event => event.stopPropagation()} onKeyDown={event => { event.stopPropagation(); if (event.key === \"Escape\") { event.preventDefault(); closeMenu(); } }}\n onBlur={event => { if (!event.currentTarget.contains(event.relatedTarget as Node)) closeMenu(false); }}>\n <button type=\"button\" disabled={box.top === box.bottom} onClick={() => { fillSelection(\"down\"); closeMenu(); }}>Fill down</button>\n <button type=\"button\" disabled={box.left === box.right} onClick={() => { fillSelection(\"right\"); closeMenu(); }}>Fill right</button>\n </div> : null,\n };\n}\n","import type { CominsRowId, CominsSortModel, CominsTableRuntimeColumn } from \"../model\";\nexport type CominsRowGroupAggregation = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\nexport type CominsRowGroupDropPosition = \"after\" | \"before\";\nexport type CominsRowGroupingConfig<TData, TGroup> = {\n aggregations?: Readonly<Partial<Record<string, CominsRowGroupAggregation>>>;\n groups: readonly TGroup[];\n getGroupId: (group: TGroup) => CominsRowId;\n};\nexport type CominsRowGroupingSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\nexport type CominsAggregateState =\n | { count: number; kind: \"avg\"; sum: number }\n | { count: number; kind: \"count\" }\n | { hasValue: boolean; kind: \"max\" | \"min\"; value: number }\n | { count: number; kind: \"sum\"; sum: number };\n\nexport type CominsNormalizedGroup<TGroup> = {\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n};\n\nexport type CominsGroupNode<TGroup> = CominsNormalizedGroup<TGroup> & {\n aggregationState: ReadonlyMap<string, CominsAggregateState>;\n leafSourceIndexes: readonly number[];\n};\n\nexport type CominsGroupModel<TGroup> = {\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsGroupNode<TGroup>>;\n};\n\nexport type CominsOrderedGroupModel<TGroup> = CominsGroupModel<TGroup> & {\n orderedLeafSourceIndexesById: ReadonlyMap<CominsRowId, readonly number[]>;\n};\n\nexport type CominsGroupingProjectionEntry =\n | {\n groupId: CominsRowId;\n key: string;\n kind: \"group\";\n }\n | {\n dataIndex: number;\n key: string;\n kind: \"data\";\n rowId: CominsRowId;\n visibleLeafIndex: number;\n };\n\nconst COMINS_ROW_GROUP_AGGREGATIONS = new Set<CominsRowGroupAggregation>([\n \"avg\",\n \"count\",\n \"max\",\n \"min\",\n \"sum\",\n]);\n\nfunction getNestedFieldValue(value: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((current, key) => {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n\n return (current as Record<string, unknown>)[key];\n }, value);\n}\n\nfunction getColumnValue<TData>(row: TData, column: CominsTableRuntimeColumn<TData>) {\n return getNestedFieldValue(row, column.field);\n}\n\nfunction createAggregateState(aggregation: CominsRowGroupAggregation): CominsAggregateState {\n switch (aggregation) {\n case \"avg\":\n return { count: 0, kind: \"avg\", sum: 0 };\n case \"count\":\n return { count: 0, kind: \"count\" };\n case \"max\":\n case \"min\":\n return { hasValue: false, kind: aggregation, value: 0 };\n case \"sum\":\n return { count: 0, kind: \"sum\", sum: 0 };\n }\n}\n\nfunction updateAggregateState(state: CominsAggregateState, value: unknown) {\n if (state.kind === \"count\") {\n state.count += 1;\n return;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return;\n }\n\n if (state.kind === \"avg\" || state.kind === \"sum\") {\n state.count += 1;\n state.sum += value;\n return;\n }\n\n if (!state.hasValue) {\n state.hasValue = true;\n state.value = value;\n return;\n }\n\n state.value = state.kind === \"min\"\n ? Math.min(state.value, value)\n : Math.max(state.value, value);\n}\n\nexport function getCominsAggregateValue(state: CominsAggregateState): number | null {\n switch (state.kind) {\n case \"avg\":\n return state.count === 0 ? null : state.sum / state.count;\n case \"count\":\n return state.count;\n case \"max\":\n case \"min\":\n return state.hasValue ? state.value : null;\n case \"sum\":\n return state.count === 0 ? null : state.sum;\n }\n}\n\nexport function getCominsGroupSlotKey(groupId: CominsRowId) {\n return `group:${typeof groupId}:${encodeURIComponent(String(groupId))}`;\n}\n\nexport function normalizeCominsRowGrouping<TData, TGroup>(input: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n config: CominsRowGroupingConfig<TData, TGroup>;\n}) {\n const columnById = new Map(input.columns.map((column) => [column.id, column] as const));\n const aggregations = new Map<string, CominsRowGroupAggregation>();\n const aggregationColumns = new Map<string, CominsTableRuntimeColumn<TData>>();\n\n for (const [columnId, aggregation] of Object.entries(input.config.aggregations ?? {})) {\n if (\n columnById.has(columnId) &&\n typeof aggregation === \"string\" &&\n COMINS_ROW_GROUP_AGGREGATIONS.has(aggregation as CominsRowGroupAggregation)\n ) {\n aggregations.set(columnId, aggregation as CominsRowGroupAggregation);\n aggregationColumns.set(columnId, columnById.get(columnId)!);\n }\n }\n\n const groupIds: CominsRowId[] = [];\n const groupsById = new Map<CominsRowId, CominsNormalizedGroup<TGroup>>();\n const suppliedGroups = Array.isArray(input.config.groups) ? input.config.groups : [];\n\n for (const group of suppliedGroups) {\n const groupId = input.config.getGroupId(group);\n\n if (groupsById.has(groupId)) {\n continue;\n }\n\n const groupIndex = groupIds.length;\n const normalizedGroup = {\n group,\n groupId,\n groupIndex,\n };\n\n groupIds.push(groupId);\n groupsById.set(groupId, normalizedGroup);\n }\n\n return { aggregationColumns, aggregations, groupIds, groupsById };\n}\n\nexport function createCominsGroupModel<TData, TGroup>(input: {\n aggregationColumns?: ReadonlyMap<string, CominsTableRuntimeColumn<TData>>;\n aggregations: ReadonlyMap<string, CominsRowGroupAggregation>;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsNormalizedGroup<TGroup>>;\n rows: readonly CominsRowGroupingSourceRow<TData>[];\n}): CominsGroupModel<TGroup> {\n const groupsById = new Map<CominsRowId, CominsGroupNode<TGroup>>();\n\n for (const groupId of input.groupIds) {\n const group = input.groupsById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n const aggregationState = new Map<string, CominsAggregateState>();\n\n for (const [columnId, aggregation] of input.aggregations) {\n aggregationState.set(columnId, createAggregateState(aggregation));\n }\n\n groupsById.set(groupId, {\n group: group.group,\n groupId: group.groupId,\n groupIndex: group.groupIndex,\n aggregationState,\n leafSourceIndexes: [],\n });\n }\n\n for (const sourceRow of input.rows) {\n const groupId = input.getRowGroupId(sourceRow.data, sourceRow.dataIndex);\n const group = groupsById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n (group.leafSourceIndexes as number[]).push(sourceRow.dataIndex);\n\n for (const [columnId, aggregateState] of group.aggregationState) {\n const configuredColumn = input.aggregationColumns?.get(columnId);\n const value = configuredColumn\n ? getColumnValue(sourceRow.data, configuredColumn)\n : getNestedFieldValue(sourceRow.data, columnId);\n\n updateAggregateState(aggregateState, value);\n }\n }\n\n return { groupIds: [...input.groupIds], groupsById };\n}\n\nfunction defaultCompare(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n\nexport function orderCominsGroupModel<TData, TGroup>(input: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n model: CominsGroupModel<TGroup>;\n rows: readonly TData[];\n sortModel: CominsSortModel;\n}): CominsOrderedGroupModel<TGroup> {\n const columnById = new Map(input.columns.map((column) => [column.id, column] as const));\n const orderedLeafSourceIndexesById = new Map<CominsRowId, readonly number[]>();\n const sortLeafIndexes = (rowIndexes: readonly number[]) => [...rowIndexes].sort((leftIndex, rightIndex) => {\n const leftRow = input.rows[leftIndex];\n const rightRow = input.rows[rightIndex];\n\n if (leftRow === undefined || rightRow === undefined) {\n return leftIndex - rightIndex;\n }\n\n for (const rule of input.sortModel) {\n const column = columnById.get(rule.columnId);\n\n if (!column?.sort) {\n continue;\n }\n\n const leftValue = getColumnValue(leftRow, column);\n const rightValue = getColumnValue(rightRow, column);\n const result = typeof column.sort === \"function\"\n ? column.sort(leftValue, rightValue, leftRow, rightRow)\n : defaultCompare(leftValue, rightValue);\n\n if (result !== 0) {\n return rule.direction === \"desc\" ? result * -1 : result;\n }\n }\n\n return leftIndex - rightIndex;\n });\n\n for (const groupId of input.model.groupIds) {\n const group = input.model.groupsById.get(groupId);\n\n if (group) {\n orderedLeafSourceIndexesById.set(groupId, sortLeafIndexes(group.leafSourceIndexes));\n }\n }\n\n return {\n ...input.model,\n groupIds: [...input.model.groupIds],\n orderedLeafSourceIndexesById,\n };\n}\n\nexport function projectCominsGroups<TGroup>(input: {\n expandedGroupIds: readonly CominsRowId[];\n model: CominsOrderedGroupModel<TGroup>;\n rowIds: readonly CominsRowId[];\n}) {\n const entries: CominsGroupingProjectionEntry[] = [];\n const expandedGroupIds = new Set(input.expandedGroupIds);\n const visibleLeafRowIds: CominsRowId[] = [];\n\n for (const groupId of input.model.groupIds) {\n const group = input.model.groupsById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n entries.push({ groupId, key: getCominsGroupSlotKey(groupId), kind: \"group\" });\n\n if (!expandedGroupIds.has(groupId)) {\n continue;\n }\n\n for (const dataIndex of input.model.orderedLeafSourceIndexesById.get(groupId) ?? []) {\n const rowId = input.rowIds[dataIndex];\n\n if (rowId === undefined) {\n continue;\n }\n\n const visibleLeafIndex = visibleLeafRowIds.length;\n visibleLeafRowIds.push(rowId);\n entries.push({\n dataIndex,\n key: `data:${typeof rowId}:${encodeURIComponent(String(rowId))}`,\n kind: \"data\",\n rowId,\n visibleLeafIndex,\n });\n }\n }\n\n return { entries, visibleLeafRowIds };\n}\n\nexport function moveCominsRowGroup<TGroup>(input: {\n getGroupId: (group: TGroup) => CominsRowId;\n groups: readonly TGroup[];\n position: CominsRowGroupDropPosition;\n sourceGroupId: CominsRowId;\n targetGroupId: CominsRowId;\n}): TGroup[] {\n const nextGroups = [...input.groups];\n const sourceIndex = nextGroups.findIndex(\n (group) => input.getGroupId(group) === input.sourceGroupId,\n );\n\n if (sourceIndex < 0 || input.sourceGroupId === input.targetGroupId) {\n return nextGroups;\n }\n\n const [sourceGroup] = nextGroups.splice(sourceIndex, 1);\n const targetIndex = nextGroups.findIndex(\n (group) => input.getGroupId(group) === input.targetGroupId,\n );\n\n if (sourceGroup === undefined || targetIndex < 0) {\n return [...input.groups];\n }\n\n const insertIndex = input.position === \"after\" ? targetIndex + 1 : targetIndex;\n nextGroups.splice(insertIndex, 0, sourceGroup);\n\n return nextGroups;\n}\n","import type React from \"react\";\n\nimport type {\n CominsRowId,\n CominsSortModel,\n CominsTableRuntimeColumn,\n} from \"./react/core-compat\";\n\nexport type CominsRowGroupAggregation = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\n\nexport type CominsRowGroupDropPosition = \"after\" | \"before\";\n\nexport type CominsRowGroupMoveDetails = {\n fromIndex: number;\n groupId: CominsRowId;\n reason: \"move\";\n targetGroupId: CominsRowId;\n toIndex: number;\n};\n\nexport type CominsSetRowGroupIdParams<TData> = {\n fromGroupId: CominsRowId;\n row: TData;\n rowId: CominsRowId;\n toGroupId: CominsRowId;\n};\n\nexport type CominsRowGroupRenderParams<TData, TGroup> = {\n aggregateValues: Readonly<Record<string, number | null>>;\n expanded: boolean;\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n isEmpty: boolean;\n rowCount: number;\n};\n\nexport type CominsRowGroupProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport type CominsRowGroupingConfig<TData, TGroup = unknown> = {\n aggregations?: Readonly<Partial<Record<string, CominsRowGroupAggregation>>>;\n expandedGroupIds?: readonly CominsRowId[];\n getGroupId: (group: TGroup) => CominsRowId;\n label?: { render?: (group: TGroup) => React.ReactNode };\n /** @deprecated Use label.render. Retained throughout 0.x; removal target: 1.0.0. */\n getGroupLabel?: (group: TGroup) => React.ReactNode;\n getGroupRowProps?: (\n params: CominsRowGroupRenderParams<TData, TGroup>,\n ) => CominsRowGroupProps | undefined;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groupDraggable?: boolean;\n groups: readonly TGroup[];\n onChangeExpandedGroupIds?: (groupIds: CominsRowId[]) => void;\n onChangeGroups?: (\n groups: TGroup[],\n details: CominsRowGroupMoveDetails,\n ) => void;\n content?: { render?: (params: CominsRowGroupRenderParams<TData, TGroup>) => React.ReactNode };\n /** @deprecated Use content.render. Retained throughout 0.x; removal target: 1.0.0. */\n renderGroupContent?: (\n params: CominsRowGroupRenderParams<TData, TGroup>,\n ) => React.ReactNode;\n setRowGroupId?: (params: CominsSetRowGroupIdParams<TData>) => TData;\n};\n\nexport type CominsRowGroupingSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\nexport type CominsAggregateState =\n | { count: number; kind: \"avg\"; sum: number }\n | { count: number; kind: \"count\" }\n | { hasValue: boolean; kind: \"max\" | \"min\"; value: number }\n | { count: number; kind: \"sum\"; sum: number };\n\nexport type CominsNormalizedGroup<TGroup> = {\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n label: React.ReactNode;\n};\n\nexport type CominsGroupNode<TGroup> = CominsNormalizedGroup<TGroup> & {\n aggregationState: ReadonlyMap<string, CominsAggregateState>;\n leafSourceIndexes: readonly number[];\n};\n\nexport type CominsGroupModel<TGroup> = {\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsGroupNode<TGroup>>;\n};\n\nexport type CominsOrderedGroupModel<TGroup> = CominsGroupModel<TGroup> & {\n orderedLeafSourceIndexesById: ReadonlyMap<CominsRowId, readonly number[]>;\n};\n\nexport type CominsGroupingProjectionEntry =\n | {\n groupId: CominsRowId;\n key: string;\n kind: \"group\";\n }\n | {\n dataIndex: number;\n key: string;\n kind: \"data\";\n rowId: CominsRowId;\n visibleLeafIndex: number;\n };\n\nimport * as core from \"./core/rows/grouping\";\nimport { projectReactColumn } from \"./react/model\";\nexport { getCominsAggregateValue, getCominsGroupSlotKey, projectCominsGroups, moveCominsRowGroup } from \"./core/rows/grouping\";\n\nexport function normalizeCominsRowGrouping<TData, TGroup>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; config: CominsRowGroupingConfig<TData, TGroup> }) {\n const labels = new Map<CominsRowId, React.ReactNode>();\n const normalized = core.normalizeCominsRowGrouping({ columns: input.columns.map(projectReactColumn), config: {\n aggregations: input.config.aggregations, groups: input.config.groups,\n getGroupId(group: TGroup) {\n const id = input.config.getGroupId(group);\n if (!labels.has(id)) {\n const render = input.config.label?.render;\n const label = render ? render(group) : input.config.getGroupLabel?.(group);\n labels.set(id, render ? label === undefined ? String(id) : label : label ?? String(id));\n }\n return id;\n },\n } });\n const originals = new Map(input.columns.map(column => [column.id, column]));\n return { ...normalized,\n aggregationColumns: new Map([...normalized.aggregationColumns.keys()].map(id => [id, originals.get(id)!])),\n groupsById: new Map([...normalized.groupsById].map(([id, group]) => [id, { ...group, label: labels.get(id) }])),\n };\n}\nexport function createCominsGroupModel<TData, TGroup>(input: {\n aggregationColumns?: ReadonlyMap<string, CominsTableRuntimeColumn<TData>>;\n aggregations: ReadonlyMap<string, CominsRowGroupAggregation>;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsNormalizedGroup<TGroup>>;\n rows: readonly CominsRowGroupingSourceRow<TData>[];\n}): CominsGroupModel<TGroup> {\n const result = core.createCominsGroupModel({ ...input,\n aggregationColumns: input.aggregationColumns && new Map([...input.aggregationColumns].map(([id, column]) => [id, projectReactColumn(column)])),\n });\n return { ...result, groupsById: new Map([...result.groupsById].map(([id, group]) => [id, { ...group, label: input.groupsById.get(id)!.label }])) };\n}\nexport function orderCominsGroupModel<TData, TGroup>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; model: CominsGroupModel<TGroup>; rows: readonly TData[]; sortModel: CominsSortModel }): CominsOrderedGroupModel<TGroup> {\n const model = { ...input.model, groupsById: new Map([...input.model.groupsById].map(([id, node]) => [id, {\n group: node.group, groupId: node.groupId, groupIndex: node.groupIndex, aggregationState: node.aggregationState, leafSourceIndexes: node.leafSourceIndexes,\n }])) };\n const result = core.orderCominsGroupModel({ ...input, model, columns: input.columns.map(projectReactColumn) });\n return { ...result, groupsById: input.model.groupsById };\n}\n","import type { CominsRowId } from \"../model\";\n\nexport type CominsTableTransferConflictPolicy = \"overwrite\" | \"reject\";\nexport type CominsTableTransferDropPosition = \"after\" | \"append\" | \"before\";\n\nexport type CominsTableTransferRowEndpoint<TData> = {\n dataIndex: number;\n row: TData;\n rowId: CominsRowId;\n tableId: string;\n};\n\nexport type CominsTableTransferGroupEndpoint<TData, TGroup> = {\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n rows: readonly CominsTableTransferRowEndpoint<TData>[];\n tableId: string;\n};\n\nexport type CominsTableTransferConflict<TData, TGroup> =\n | {\n kind: \"row\";\n rowId: CominsRowId;\n source: CominsTableTransferRowEndpoint<TData>;\n target: CominsTableTransferRowEndpoint<TData>;\n }\n | {\n groupId: CominsRowId;\n kind: \"group\";\n source: CominsTableTransferGroupEndpoint<TData, TGroup>;\n target: CominsTableTransferGroupEndpoint<TData, TGroup>;\n };\n\nexport type CominsTableTransferResolvedConflict<TData, TGroup> = {\n conflict: CominsTableTransferConflict<TData, TGroup>;\n policy: CominsTableTransferConflictPolicy;\n};\n\nexport type CominsTableTransferConflictResolver<TData, TGroup> = (\n conflict: CominsTableTransferConflict<TData, TGroup>,\n) => CominsTableTransferConflictPolicy | undefined;\n\nexport type CominsTableTransferIntent<TData, TGroup> =\n | {\n kind: \"row\";\n row: TData;\n sourceRowId: CominsRowId;\n sourceTableId: string;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n targetTableId: string;\n }\n | {\n group: TGroup;\n kind: \"group\";\n rows: readonly TData[];\n sourceGroupId: CominsRowId;\n sourceTableId: string;\n targetGroupId?: CominsRowId;\n targetTableId: string;\n };\n\nexport type CominsTableTransferRejection<TData, TGroup = never> = {\n conflict: CominsTableTransferConflict<TData, TGroup>;\n kind: \"group\" | \"row\";\n reason: \"duplicate-id\";\n sourceTableId: string;\n targetTableId: string;\n};\n\nexport type CominsTableTransferEndpoint<TData, TGroup = never> = {\n data: readonly TData[];\n getGroupId?: (group: TGroup) => CominsRowId;\n getRowGroupId?: (row: TData, dataIndex: number) => CominsRowId;\n getRowId: (row: TData, dataIndex: number) => CominsRowId;\n groups?: readonly TGroup[];\n setRowGroupId?: (params: {\n fromGroupId: CominsRowId;\n row: TData;\n rowId: CominsRowId;\n toGroupId: CominsRowId;\n }) => TData;\n tableId: string;\n};\n\ntype CominsTableTransferNextEndpoint<TData, TGroup> = {\n data: TData[];\n groups?: TGroup[];\n tableId: string;\n};\n\nexport type CominsTableRowTransferDetails<TData, TGroup> = {\n conflicts: readonly CominsTableTransferResolvedConflict<TData, TGroup>[];\n kind: \"row\";\n sourceRowId: CominsRowId;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n};\n\nexport type CominsTableGroupTransferDetails<TData, TGroup> = {\n conflicts: readonly CominsTableTransferResolvedConflict<TData, TGroup>[];\n kind: \"group\";\n position: CominsTableTransferDropPosition;\n sourceGroupId: CominsRowId;\n targetGroupId?: CominsRowId;\n};\n\nexport type CominsTableTransferDetails<TData, TGroup> =\n | CominsTableGroupTransferDetails<TData, TGroup>\n | CominsTableRowTransferDetails<TData, TGroup>;\n\nexport type CominsTableTransferResult<TData, TGroup = never> = {\n details: CominsTableTransferDetails<TData, TGroup>;\n kind: \"group\" | \"row\";\n source: CominsTableTransferNextEndpoint<TData, TGroup>;\n target: CominsTableTransferNextEndpoint<TData, TGroup>;\n};\n\nexport type CominsRowBetweenTablesInput<TData, TGroup = never> = {\n resolveConflict?: CominsTableTransferConflictResolver<TData, TGroup>;\n source: CominsTableTransferEndpoint<TData, TGroup>;\n sourceRowId: CominsRowId;\n target: CominsTableTransferEndpoint<TData, TGroup>;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n};\n\nexport type CominsGroupBetweenTablesInput<TData, TGroup> = {\n position?: CominsTableTransferDropPosition;\n resolveConflict?: CominsTableTransferConflictResolver<TData, TGroup>;\n source: CominsTableTransferEndpoint<TData, TGroup>;\n sourceGroupId: CominsRowId;\n target: CominsTableTransferEndpoint<TData, TGroup>;\n targetGroupId?: CominsRowId;\n};\n\nfunction findRowIndex<TData, TGroup>(\n endpoint: Pick<CominsTableTransferEndpoint<TData, TGroup>, \"data\" | \"getRowId\">,\n rowId: CominsRowId,\n) {\n return endpoint.data.findIndex((row, index) => endpoint.getRowId(row, index) === rowId);\n}\n\nfunction isGroupedEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup>,\n): endpoint is CominsTableTransferEndpoint<TData, TGroup> & {\n getGroupId: (group: TGroup) => CominsRowId;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groups: readonly TGroup[];\n} {\n return (\n Array.isArray(endpoint.groups) &&\n typeof endpoint.getGroupId === \"function\" &&\n typeof endpoint.getRowGroupId === \"function\"\n );\n}\n\nfunction getRowEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup>,\n dataIndex: number,\n): CominsTableTransferRowEndpoint<TData> | null {\n const row = endpoint.data[dataIndex];\n\n if (row === undefined) {\n return null;\n }\n\n return {\n dataIndex,\n row,\n rowId: endpoint.getRowId(row, dataIndex),\n tableId: endpoint.tableId,\n };\n}\n\nfunction getGroupEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup> & {\n getGroupId: (group: TGroup) => CominsRowId;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groups: readonly TGroup[];\n },\n groupIndex: number,\n): CominsTableTransferGroupEndpoint<TData, TGroup> | null {\n const group = endpoint.groups[groupIndex];\n\n if (group === undefined) {\n return null;\n }\n\n const groupId = endpoint.getGroupId(group);\n const rows = endpoint.data.flatMap((row, dataIndex) =>\n endpoint.getRowGroupId(row, dataIndex) === groupId\n ? [{ dataIndex, row, rowId: endpoint.getRowId(row, dataIndex), tableId: endpoint.tableId }]\n : [],\n );\n\n return { group, groupId, groupIndex, rows, tableId: endpoint.tableId };\n}\n\nfunction resolveConflict<TData, TGroup>(\n conflict: CominsTableTransferConflict<TData, TGroup>,\n resolver: CominsTableTransferConflictResolver<TData, TGroup> | undefined,\n) {\n return resolver?.(conflict) === \"overwrite\" ? \"overwrite\" : \"reject\";\n}\n\nfunction copyGroups<TGroup>(groups: readonly TGroup[] | undefined) {\n return groups === undefined ? undefined : [...groups];\n}\n\nexport function transferCominsRowBetweenTables<TData, TGroup = never>(\n input: CominsRowBetweenTablesInput<TData, TGroup>,\n): CominsTableTransferResult<TData, TGroup> | null {\n if (input.source.tableId === input.target.tableId) {\n return null;\n }\n\n const sourceGrouped = isGroupedEndpoint(input.source) ? input.source : null;\n const targetGrouped = isGroupedEndpoint(input.target) ? input.target : null;\n\n if ((sourceGrouped === null) !== (targetGrouped === null)) {\n return null;\n }\n\n const sourceIndex = findRowIndex(input.source, input.sourceRowId);\n const sourceRowEndpoint = getRowEndpoint(input.source, sourceIndex);\n\n if (!sourceRowEndpoint) {\n return null;\n }\n\n const targetRowIndex = input.targetRowId === undefined\n ? -1\n : findRowIndex(input.target, input.targetRowId);\n\n if (input.targetRowId !== undefined && targetRowIndex < 0) {\n return null;\n }\n\n let movedRow = sourceRowEndpoint.row;\n\n if (sourceGrouped && targetGrouped) {\n const targetGroupId = input.targetGroupId;\n const targetGroupExists = targetGroupId !== undefined && targetGrouped.groups.some(\n (group) => targetGrouped.getGroupId(group) === targetGroupId,\n );\n\n if (!targetGroupExists) {\n return null;\n }\n\n if (\n targetRowIndex >= 0 &&\n targetGrouped.getRowGroupId(targetGrouped.data[targetRowIndex]!, targetRowIndex) !== targetGroupId\n ) {\n return null;\n }\n\n const sourceGroupId = sourceGrouped.getRowGroupId(sourceRowEndpoint.row, sourceIndex);\n\n if (sourceGroupId !== targetGroupId) {\n if (typeof input.target.setRowGroupId !== \"function\") {\n return null;\n }\n\n movedRow = input.target.setRowGroupId({\n fromGroupId: sourceGroupId,\n row: sourceRowEndpoint.row,\n rowId: sourceRowEndpoint.rowId,\n toGroupId: targetGroupId!,\n });\n }\n } else if (input.targetGroupId !== undefined) {\n return null;\n }\n\n const targetData = [...input.target.data];\n const conflicts: CominsTableTransferResolvedConflict<TData, TGroup>[] = [];\n const duplicateIndex = findRowIndex(input.target, sourceRowEndpoint.rowId);\n let normalizedTargetRowIndex = targetRowIndex;\n\n if (duplicateIndex >= 0) {\n const targetRowEndpoint = getRowEndpoint(input.target, duplicateIndex);\n\n if (!targetRowEndpoint) {\n return null;\n }\n\n const conflict: CominsTableTransferConflict<TData, TGroup> = {\n kind: \"row\",\n rowId: sourceRowEndpoint.rowId,\n source: sourceRowEndpoint,\n target: targetRowEndpoint,\n };\n const policy = resolveConflict(conflict, input.resolveConflict);\n\n if (policy === \"reject\") {\n return null;\n }\n\n conflicts.push({ conflict, policy });\n targetData.splice(duplicateIndex, 1);\n\n if (normalizedTargetRowIndex > duplicateIndex) {\n normalizedTargetRowIndex -= 1;\n } else if (input.targetRowId === sourceRowEndpoint.rowId) {\n normalizedTargetRowIndex = duplicateIndex;\n }\n }\n\n let insertIndex: number;\n\n if (normalizedTargetRowIndex >= 0) {\n insertIndex = normalizedTargetRowIndex;\n } else if (targetGrouped && input.targetGroupId !== undefined) {\n let lastGroupIndex = -1;\n\n for (let index = 0; index < targetData.length; index += 1) {\n if (targetGrouped.getRowGroupId(targetData[index]!, index) === input.targetGroupId) {\n lastGroupIndex = index;\n }\n }\n\n insertIndex = lastGroupIndex < 0 ? targetData.length : lastGroupIndex + 1;\n } else {\n insertIndex = targetData.length;\n }\n\n if (input.target.getRowId(movedRow, insertIndex) !== sourceRowEndpoint.rowId) {\n return null;\n }\n\n targetData.splice(Math.max(0, Math.min(insertIndex, targetData.length)), 0, movedRow);\n\n return {\n details: {\n conflicts,\n kind: \"row\",\n sourceRowId: sourceRowEndpoint.rowId,\n targetGroupId: input.targetGroupId,\n targetRowId: input.targetRowId,\n },\n kind: \"row\",\n source: {\n data: input.source.data.filter((_row, index) => index !== sourceIndex),\n groups: copyGroups(input.source.groups),\n tableId: input.source.tableId,\n },\n target: {\n data: targetData,\n groups: copyGroups(input.target.groups),\n tableId: input.target.tableId,\n },\n };\n}\n\nexport function transferCominsGroupBetweenTables<TData, TGroup>(\n input: CominsGroupBetweenTablesInput<TData, TGroup>,\n): CominsTableTransferResult<TData, TGroup> | null {\n const source = isGroupedEndpoint(input.source) ? input.source : null;\n const target = isGroupedEndpoint(input.target) ? input.target : null;\n\n if (input.source.tableId === input.target.tableId || !source || !target) {\n return null;\n }\n\n const sourceGroupIndex = source.groups.findIndex(\n (group) => source.getGroupId(group) === input.sourceGroupId,\n );\n const sourceGroupEndpoint = getGroupEndpoint(source, sourceGroupIndex);\n\n if (\n !sourceGroupEndpoint ||\n target.getGroupId(sourceGroupEndpoint.group) !== sourceGroupEndpoint.groupId\n ) {\n return null;\n }\n\n const targetGroups = [...target.groups];\n let targetData = [...target.data];\n const conflicts: CominsTableTransferResolvedConflict<TData, TGroup>[] = [];\n const duplicateGroupIndex = targetGroups.findIndex(\n (group) => target.getGroupId(group) === sourceGroupEndpoint.groupId,\n );\n let overwriteDataInsertIndex: number | null = null;\n let overwriteGroupInsertIndex: number | null = null;\n\n if (duplicateGroupIndex >= 0) {\n const targetGroupEndpoint = getGroupEndpoint(target, duplicateGroupIndex);\n\n if (!targetGroupEndpoint) {\n return null;\n }\n\n const conflict: CominsTableTransferConflict<TData, TGroup> = {\n groupId: sourceGroupEndpoint.groupId,\n kind: \"group\",\n source: sourceGroupEndpoint,\n target: targetGroupEndpoint,\n };\n const policy = resolveConflict(conflict, input.resolveConflict);\n\n if (policy === \"reject\") {\n return null;\n }\n\n conflicts.push({ conflict, policy });\n const targetMemberIndexes = new Set(targetGroupEndpoint.rows.map((row) => row.dataIndex));\n const firstMemberIndex = targetGroupEndpoint.rows[0]?.dataIndex;\n\n if (firstMemberIndex !== undefined) {\n overwriteDataInsertIndex = target.data\n .slice(0, firstMemberIndex)\n .filter((_row, index) => !targetMemberIndexes.has(index)).length;\n }\n\n targetData = targetData.filter((_row, index) => !targetMemberIndexes.has(index));\n targetGroups.splice(duplicateGroupIndex, 1);\n overwriteGroupInsertIndex = duplicateGroupIndex;\n }\n\n const sourceRowIds = new Set(sourceGroupEndpoint.rows.map((row) => row.rowId));\n const duplicateRows = targetData.flatMap((row, dataIndex) => {\n const rowId = target.getRowId(row, dataIndex);\n return sourceRowIds.has(rowId) ? [{ dataIndex, row, rowId }] : [];\n });\n\n for (const duplicate of duplicateRows) {\n const sourceRowEndpoint = sourceGroupEndpoint.rows.find((row) => row.rowId === duplicate.rowId)!;\n const targetRowEndpoint: CominsTableTransferRowEndpoint<TData> = {\n ...duplicate,\n tableId: input.target.tableId,\n };\n const conflict: CominsTableTransferConflict<TData, TGroup> = {\n kind: \"row\",\n rowId: duplicate.rowId,\n source: sourceRowEndpoint,\n target: targetRowEndpoint,\n };\n const policy = resolveConflict(conflict, input.resolveConflict);\n\n if (policy === \"reject\") {\n return null;\n }\n\n conflicts.push({ conflict, policy });\n }\n\n if (duplicateRows.length > 0) {\n const duplicateRowIds = new Set(duplicateRows.map((row) => row.rowId));\n\n if (overwriteDataInsertIndex !== null) {\n overwriteDataInsertIndex -= duplicateRows.filter(\n (row) => row.dataIndex < overwriteDataInsertIndex!,\n ).length;\n }\n\n targetData = targetData.filter(\n (row, dataIndex) => !duplicateRowIds.has(target.getRowId(row, dataIndex)),\n );\n }\n\n const position = input.position ?? (input.targetGroupId === undefined ? \"append\" : \"before\");\n let groupInsertIndex: number;\n\n if (input.targetGroupId === sourceGroupEndpoint.groupId && overwriteGroupInsertIndex !== null) {\n groupInsertIndex = Math.min(overwriteGroupInsertIndex, targetGroups.length);\n } else if (input.targetGroupId === undefined || position === \"append\") {\n groupInsertIndex = targetGroups.length;\n } else {\n const targetGroupIndex = targetGroups.findIndex(\n (group) => target.getGroupId(group) === input.targetGroupId,\n );\n\n if (targetGroupIndex < 0) {\n return null;\n }\n\n groupInsertIndex = position === \"after\" ? targetGroupIndex + 1 : targetGroupIndex;\n }\n\n targetGroups.splice(groupInsertIndex, 0, sourceGroupEndpoint.group);\n const memberRows = sourceGroupEndpoint.rows.map((row) => row.row);\n const dataInsertIndex = overwriteDataInsertIndex === null\n ? targetData.length\n : Math.min(overwriteDataInsertIndex, targetData.length);\n targetData.splice(dataInsertIndex, 0, ...memberRows);\n const sourceMemberIndexes = new Set(sourceGroupEndpoint.rows.map((row) => row.dataIndex));\n\n return {\n details: {\n conflicts,\n kind: \"group\",\n position,\n sourceGroupId: sourceGroupEndpoint.groupId,\n targetGroupId: input.targetGroupId,\n },\n kind: \"group\",\n source: {\n data: source.data.filter((_row, index) => !sourceMemberIndexes.has(index)),\n groups: source.groups.filter((_group, index) => index !== sourceGroupIndex),\n tableId: input.source.tableId,\n },\n target: {\n data: targetData,\n groups: targetGroups,\n tableId: input.target.tableId,\n },\n };\n}\n","import type React from \"react\";\nimport { useEffect } from \"react\";\nimport { createTableTransferRegistry, getRegisteredTransferSnapshot as getBrowserSnapshot } from \"../browser/table-transfer\";\nimport type { CominsTableTransferConflictResolver, CominsTableTransferIntent, CominsTableTransferRejection, CominsTableTransferResult, CominsTableTransferEndpoint } from \"../core/transfer/policy\";\nexport * from \"../core/transfer/policy\";\n\nexport type CominsTableTransferRejectionFeedback<TData, TGroup = never> = {\n duration?: number;\n tooltip?: { render?: (rejection: CominsTableTransferRejection<TData, TGroup>) => React.ReactNode };\n /** @deprecated Use tooltip.render. Retained throughout 0.x; removal target: 1.0.0. */\n renderTooltip?: (\n rejection: CominsTableTransferRejection<TData, TGroup>,\n ) => React.ReactNode;\n};\n\ndeclare const cominsTableTransferCoordinatorBrand: unique symbol;\n\nexport type CominsTableTransferCoordinator<TData, TGroup = never> = {\n readonly [cominsTableTransferCoordinatorBrand]: (\n data: TData,\n group: TGroup,\n ) => [TData, TGroup];\n};\n\nexport type CominsTableTransferCoordinatorOptions<TData, TGroup = never> = {\n onTransfer: (result: CominsTableTransferResult<TData, TGroup>) => void;\n onTransferRejected?: (\n rejection: CominsTableTransferRejection<TData, TGroup>,\n ) => void;\n};\n\nexport type CominsTableTransferConfig<TData, TGroup = never> = {\n canTransfer?: (intent: CominsTableTransferIntent<TData, TGroup>) => boolean;\n coordinator: CominsTableTransferCoordinator<TData, TGroup>;\n rejectionFeedback?: false | CominsTableTransferRejectionFeedback<TData, TGroup>;\n resolveConflict?: CominsTableTransferConflictResolver<TData, TGroup>;\n scope: string;\n tableId: string;\n};\n\nexport type CominsTableTransferRegistrationSnapshot<TData, TGroup> = {\n config: CominsTableTransferConfig<TData, TGroup>;\n endpoint: CominsTableTransferEndpoint<TData, TGroup>;\n instanceId: string;\n root: HTMLElement | null;\n viewport: HTMLElement | null;\n};\n\nexport type CominsTableTransferRegistration<TData, TGroup> = {\n getSnapshot: () => CominsTableTransferRegistrationSnapshot<TData, TGroup> | null;\n};\n\ntype CominsTableTransferCoordinatorState<TData, TGroup> = {\n options: CominsTableTransferCoordinatorOptions<TData, TGroup>;\n registry: ReturnType<typeof createTableTransferRegistry<CominsTableTransferRegistrationSnapshot<TData, TGroup>>>;\n};\n\nconst coordinatorStates = new WeakMap<\n object,\n CominsTableTransferCoordinatorState<unknown, unknown>\n>();\n\nfunction getCoordinatorState<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n) {\n return coordinatorStates.get(coordinator) as\n | CominsTableTransferCoordinatorState<TData, TGroup>\n | undefined;\n}\n\nexport function createCominsTableTransferCoordinator<TData, TGroup = never>(\n options: CominsTableTransferCoordinatorOptions<TData, TGroup>,\n): CominsTableTransferCoordinator<TData, TGroup> {\n const coordinator = Object.freeze({}) as CominsTableTransferCoordinator<TData, TGroup>;\n\n coordinatorStates.set(\n coordinator,\n {\n options,\n registry: createTableTransferRegistry<CominsTableTransferRegistrationSnapshot<TData, TGroup>>(),\n } as CominsTableTransferCoordinatorState<unknown, unknown>,\n );\n\n return coordinator;\n}\n\nexport function isCominsTableTransferCoordinator<TData, TGroup>(\n coordinator: unknown,\n): coordinator is CominsTableTransferCoordinator<TData, TGroup> {\n return typeof coordinator === \"object\" && coordinator !== null && coordinatorStates.has(coordinator);\n}\n\nexport function registerCominsTableTransfer<TData, TGroup>(coordinator: CominsTableTransferCoordinator<TData, TGroup>, scope: string, tableId: string, registration: CominsTableTransferRegistration<TData, TGroup>) {\n return getCoordinatorState(coordinator)?.registry.register(scope, tableId, registration) ?? (() => undefined);\n}\n\nexport function getCominsTableTransferRegistration<TData, TGroup>(coordinator: CominsTableTransferCoordinator<TData, TGroup>, scope: string, tableId: string) {\n return getCoordinatorState(coordinator)?.registry.get(scope, tableId) ?? null;\n}\n\nexport function getRegisteredTransferSnapshot<TData, TGroup>(coordinator: CominsTableTransferCoordinator<TData, TGroup>, scope: string, tableId: string) {\n const state = getCoordinatorState(coordinator);\n return state ? getBrowserSnapshot(state.registry, coordinator, scope, tableId) : null;\n}\n\nexport function useCominsTableTransferRegistration<TData, TGroup>(input: {\n config: CominsTableTransferConfig<TData, TGroup> | undefined;\n snapshot: { current: CominsTableTransferRegistrationSnapshot<TData, TGroup> | null };\n root: { current: HTMLElement | null };\n viewport: { current: HTMLElement | null };\n}) {\n const { snapshot, root, viewport } = input;\n const coordinator = input.config?.coordinator;\n const scope = input.config?.scope;\n const tableId = input.config?.tableId;\n useEffect(() => {\n if (!coordinator || !scope || !tableId) return undefined;\n return registerCominsTableTransfer(coordinator, scope, tableId, {\n getSnapshot: () => snapshot.current ? { ...snapshot.current, root: root.current, viewport: viewport.current } : null,\n });\n }, [coordinator, scope, tableId, snapshot, root, viewport]);\n}\n\nexport function emitCominsTableTransfer<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n result: CominsTableTransferResult<TData, TGroup>,\n) {\n const state = getCoordinatorState(coordinator);\n\n if (!state) {\n return false;\n }\n\n state.options.onTransfer(result);\n return true;\n}\n\nexport function emitCominsTableTransferRejected<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n rejection: CominsTableTransferRejection<TData, TGroup>,\n) {\n const state = getCoordinatorState(coordinator);\n\n if (!state) {\n return false;\n }\n\n state.options.onTransferRejected?.(rejection);\n return true;\n}\n","import type React from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\n\ntype CominsTooltipPlacement = \"above\" | \"below\";\n\nexport type CominsTooltipSurfaceProps = {\n children: React.ReactNode;\n className?: string;\n icon?: React.ReactNode;\n tone?: \"danger\" | \"neutral\";\n};\n\nexport function CominsTooltipSurface({\n children,\n className,\n icon,\n tone = \"neutral\",\n}: CominsTooltipSurfaceProps) {\n return (\n <div\n className={[\n \"comins-tooltip-surface\",\n `comins-tooltip-surface--${tone}`,\n className,\n ].filter(Boolean).join(\" \")}\n >\n {icon ? <span aria-hidden=\"true\" className=\"comins-tooltip-surface__icon\">{icon}</span> : null}\n <span className=\"comins-tooltip-surface__content\">{children}</span>\n </div>\n );\n}\n\nexport type CominsPointerTooltipProps = CominsTooltipSurfaceProps & {\n x: number;\n y: number;\n};\n\nexport function CominsPointerTooltip({\n children,\n className,\n icon,\n tone,\n x,\n y,\n}: CominsPointerTooltipProps) {\n const tooltipRef = useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = useState({\n left: x + 12,\n placement: \"below\" as CominsTooltipPlacement,\n top: y + 12,\n });\n\n useLayoutEffect(() => {\n const element = tooltipRef.current;\n\n if (!element) {\n return;\n }\n\n const bounds = element.getBoundingClientRect();\n const viewportMargin = 8;\n const pointerOffset = 12;\n const maxLeft = Math.max(viewportMargin, window.innerWidth - bounds.width - viewportMargin);\n const preferredTop = y + pointerOffset;\n const fitsBelow = preferredTop + bounds.height <= window.innerHeight - viewportMargin;\n const placement: CominsTooltipPlacement = fitsBelow ? \"below\" : \"above\";\n const top = fitsBelow\n ? preferredTop\n : Math.max(viewportMargin, y - bounds.height - pointerOffset);\n\n setPosition({\n left: Math.min(Math.max(viewportMargin, x + pointerOffset), maxLeft),\n placement,\n top,\n });\n }, [children, x, y]);\n\n return (\n <div\n aria-atomic=\"true\"\n aria-live=\"polite\"\n className=\"comins-pointer-tooltip\"\n data-placement={position.placement}\n data-testid=\"transfer-rejection-tooltip\"\n ref={tooltipRef}\n role=\"status\"\n style={{ left: position.left, top: position.top }}\n >\n <CominsTooltipSurface className={className} icon={icon} tone={tone}>\n {children}\n </CominsTooltipSurface>\n </div>\n );\n}\n","export type CominsViewportRevision = string | number;\nexport type CominsViewportRange = { startIndex: number; endIndex: number };\nexport type CoreViewportRequest = CominsViewportRange & {\n revision: CominsViewportRevision;\n requestId: string;\n retainRange: CominsViewportRange;\n};\nexport type CominsViewportBlock<T> = {\n startIndex: number;\n rows: readonly T[];\n version: number;\n touched: number;\n};\nexport type CominsViewportRequestState = CominsViewportRange & {\n requestId: string;\n status: \"loading\" | \"error\";\n version: number;\n};\nexport type CominsViewportPatch<T> = { index: number; row: T };\nexport type CominsViewportData<T> = {\n revision: CominsViewportRevision;\n rowCount: number;\n blockSize: number;\n cacheSize: number;\n blocks: readonly CominsViewportBlock<T>[];\n requests: readonly CominsViewportRequestState[];\n retainRange: CominsViewportRange;\n version: number;\n clock: number;\n changes: readonly CominsViewportPatch<T>[];\n};\nexport type CominsViewportDataOptions = {\n revision: CominsViewportRevision;\n rowCount: number;\n blockSize?: number;\n cacheSize?: number;\n};\nexport type CominsViewportDataEvent<T> =\n | { type: \"request\"; request: CoreViewportRequest }\n | { type: \"cancel\"; request: CoreViewportRequest }\n | { type: \"error\"; request: CoreViewportRequest }\n | { type: \"success\"; request: CoreViewportRequest; rows: readonly T[] }\n | { type: \"retain\"; range: CominsViewportRange }\n | { type: \"patch\"; changes: readonly CominsViewportPatch<T>[] }\n | { type: \"reset\"; options: CominsViewportDataOptions };\n\nexport function normalizeCominsViewportInteger(value: number | undefined, fallback: number) {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0 ? value : fallback;\n}\nexport function createCominsViewportData<T>(options: CominsViewportDataOptions): CominsViewportData<T> {\n if (!Number.isSafeInteger(options.rowCount) || options.rowCount < 0) throw new RangeError(\"Viewport rowCount must be a non-negative safe integer\");\n return { revision: options.revision, rowCount: options.rowCount, blockSize: normalizeCominsViewportInteger(options.blockSize, 100), cacheSize: normalizeCominsViewportInteger(options.cacheSize, 12), blocks: [], requests: [], retainRange: { startIndex: 0, endIndex: 0 }, version: 0, clock: 0, changes: [] };\n}\nconst intersects = (a: CominsViewportRange, b: CominsViewportRange) => a.startIndex < b.endIndex && b.startIndex < a.endIndex;\nfunction trim<T>(data: CominsViewportData<T>): CominsViewportData<T> {\n const required = (block: CominsViewportBlock<T>) => intersects({ startIndex: block.startIndex, endIndex: block.startIndex + data.blockSize }, data.retainRange) || data.requests.some(request => request.status === \"loading\" && request.startIndex === block.startIndex);\n const protectedBlocks = data.blocks.filter(required);\n const others = data.blocks.filter(block => !required(block)).sort((a, b) => b.touched - a.touched);\n const blocks = [...protectedBlocks, ...others.slice(0, Math.max(0, data.cacheSize - protectedBlocks.length))].sort((a, b) => a.startIndex - b.startIndex);\n const loading = data.requests.filter(request => request.status === \"loading\");\n const errors = data.requests.filter(request => request.status === \"error\");\n const protectedErrors = errors.filter(request => intersects(request, data.retainRange));\n const otherErrors = errors.filter(request => !intersects(request, data.retainRange));\n const remaining = Math.max(0, data.cacheSize - protectedErrors.length);\n return { ...data, blocks, requests: [...loading, ...protectedErrors, ...(remaining ? otherErrors.slice(-remaining) : [])] };\n}\nexport function reduceCominsViewportData<T>(data: CominsViewportData<T>, event: CominsViewportDataEvent<T>): CominsViewportData<T> {\n if (event.type === \"reset\") return createCominsViewportData<T>(event.options);\n if (event.type === \"retain\") {\n const startIndex = Math.max(0, Math.min(data.rowCount, Math.floor(event.range.startIndex)));\n const endIndex = Math.max(startIndex, Math.min(data.rowCount, Math.ceil(event.range.endIndex)));\n if (!Number.isFinite(startIndex) || !Number.isFinite(endIndex)) return data;\n if (data.retainRange.startIndex === startIndex && data.retainRange.endIndex === endIndex) return data;\n const range = { startIndex, endIndex };\n const clock = data.clock + 1;\n return trim({ ...data, changes: [], clock, retainRange: range, blocks: data.blocks.map(block => intersects({ startIndex: block.startIndex, endIndex: block.startIndex + block.rows.length }, range) ? { ...block, touched: clock } : block) });\n }\n if (event.type === \"patch\") {\n const changes = new Map(event.changes.filter(change => Number.isSafeInteger(change.index)).map(change => [change.index, change.row]));\n const accepted: CominsViewportPatch<T>[] = [];\n const blocks = data.blocks.map(block => {\n let changed = false;\n const rows = block.rows.map((row, index) => {\n const absoluteIndex = block.startIndex + index;\n if (!changes.has(absoluteIndex) || changes.get(absoluteIndex) === row) return row;\n changed = true;\n const next = changes.get(absoluteIndex)!;\n accepted.push({ index: absoluteIndex, row: next });\n return next;\n });\n return changed ? { ...block, rows, version: data.version + 1 } : block;\n });\n return accepted.length ? { ...data, version: data.version + 1, blocks, changes: accepted } : data;\n }\n const request = event.request;\n if (request.revision !== data.revision || !Number.isSafeInteger(request.startIndex) || request.startIndex < 0 || request.startIndex % data.blockSize !== 0 || request.startIndex >= data.rowCount || request.endIndex !== Math.min(data.rowCount, request.startIndex + data.blockSize)) return data;\n const previous = data.requests.find(entry => entry.startIndex === request.startIndex);\n if (event.type === \"request\") {\n if (previous?.requestId === request.requestId) return data;\n return trim({ ...data, changes: [], retainRange: request.retainRange, requests: [...data.requests.filter(entry => entry.startIndex !== request.startIndex), { startIndex: request.startIndex, endIndex: request.endIndex, requestId: request.requestId, status: \"loading\", version: data.version }] });\n }\n if (!previous || previous.requestId !== request.requestId) return data;\n const requests = data.requests.filter(entry => entry !== previous);\n if (event.type === \"cancel\") return { ...data, changes: [], requests };\n if (event.type === \"error\" || !Array.isArray(event.rows) || event.rows.length !== request.endIndex - request.startIndex || Array.from(event.rows).some(row => row === undefined || row === null)) {\n return trim({ ...data, changes: [], requests: [...requests, { ...previous, status: \"error\" }] });\n }\n const currentBlock = data.blocks.find(block => block.startIndex === request.startIndex);\n if (currentBlock && currentBlock.version > previous.version) return { ...data, changes: [], requests };\n const clock = data.clock + 1;\n return trim({ ...data, changes: [], clock, requests, blocks: [...data.blocks.filter(block => block.startIndex !== request.startIndex), { startIndex: request.startIndex, rows: [...event.rows], touched: clock, version: data.version }] });\n}\n","import { reduceCominsViewportData as reduceCoreViewportData } from \"./core/viewport/data\";\nimport type { CominsViewportData } from \"./core/viewport/data\";\nimport type { BrowserViewportDataEvent } from \"./browser/viewport-requests\";\nexport { createCominsViewportData, normalizeCominsViewportInteger } from \"./core/viewport/data\";\nexport type { CominsViewportRevision, CominsViewportRange, CominsViewportBlock, CominsViewportRequestState, CominsViewportPatch, CominsViewportData, CominsViewportDataOptions } from \"./core/viewport/data\";\nexport type { CominsViewportRequest } from \"./browser/viewport-requests\";\nexport { reconcileCoreViewportSelection as reconcileCominsViewportSelection } from \"./core/state/reconcile\";\nexport type CominsViewportDataEvent<T> = BrowserViewportDataEvent<T>;\n\n/** Preserve the legacy signal checks before passing data-only events into Core. */\nexport function reduceCominsViewportData<T>(data: CominsViewportData<T>, event: CominsViewportDataEvent<T>): CominsViewportData<T> {\n if (\"request\" in event && event.request.signal.aborted) {\n if (event.type === \"request\") return data;\n return reduceCoreViewportData(data, { type: \"cancel\", request: event.request });\n }\n return reduceCoreViewportData(data, event);\n}\n","import type { CominsEventRow } from \"../model\";\n\nexport type CominsRowHeight = number | \"auto\";\nexport type CominsRowHeightParams<TData> = { row: CominsEventRow<TData> };\nexport type CominsRowMeasurement<TData> = { row: TData; layoutKey: string; contentRevision?: object; height: number };\n\nexport function normalizeCominsRowHeight(value: number | undefined, fallback = 36) {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nexport function resolveCominsRowHeight<TData>(input: {\n value: CominsRowHeight | undefined;\n rowHeight: number;\n estimate?: number;\n measurement?: CominsRowMeasurement<TData>;\n row: TData;\n layoutKey: string;\n contentRevision?: object;\n}) {\n const fallback = normalizeCominsRowHeight(input.rowHeight);\n const auto = input.value === \"auto\";\n const measurement = input.measurement;\n return {\n auto,\n height: auto\n ? measurement?.row === input.row && measurement.layoutKey === input.layoutKey && measurement.contentRevision === input.contentRevision\n ? measurement.height : normalizeCominsRowHeight(input.estimate, fallback)\n : normalizeCominsRowHeight(input.value as number | undefined, fallback),\n };\n}\n","import { normalizeCominsRowHeight } from \"./row-height\";\nimport type { CominsViewportRange } from \"../viewport/data\";\n\n/** Sparse measured blocks only: storage does not depend on total dataset length. */\nexport class CominsViewportHeightIndex {\n private blocks = new Map<number, Map<number, number>>();\n private deltas = new Map<number, number>();\n constructor(readonly rowCount: number, readonly estimate: number, readonly blockSize = 100, readonly maxBlocks = 64) {}\n clone() {\n const next = new CominsViewportHeightIndex(this.rowCount, this.estimate, this.blockSize, this.maxBlocks);\n next.blocks = new Map([...this.blocks].map(([id, rows]) => [id, new Map(rows)]));\n next.deltas = new Map(this.deltas);\n return next;\n }\n get measuredBlockCount() { return this.blocks.size; }\n get measuredRowCount() { return [...this.blocks.values()].reduce((count, rows) => count + rows.size, 0); }\n getHeight(index: number) { return this.blocks.get(Math.floor(index / this.blockSize))?.get(index) ?? this.estimate; }\n getPrefixHeight(endExclusive: number) {\n const end = Math.min(this.rowCount, Math.max(0, endExclusive));\n let total = end * this.estimate;\n for (const [block, rows] of this.blocks) {\n if ((block + 1) * this.blockSize <= end) total += this.deltas.get(block) ?? 0;\n else if (block * this.blockSize < end) for (const [index, height] of rows) if (index < end) total += height - this.estimate;\n }\n return total;\n }\n getTotalHeight() { return this.getPrefixHeight(this.rowCount); }\n findIndexAtOffset(offset: number) {\n if (!this.rowCount) return 0;\n const target = Math.max(0, Math.min(offset, this.getTotalHeight()));\n let low = 0;\n let high = this.rowCount;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n if (this.getPrefixHeight(middle + 1) <= target) low = middle + 1;\n else high = middle;\n }\n return Math.min(this.rowCount - 1, low);\n }\n updateHeight(index: number, value: number) {\n if (!Number.isSafeInteger(index) || index < 0 || index >= this.rowCount) return 0;\n const height = normalizeCominsRowHeight(value, this.estimate);\n const delta = height - this.getHeight(index);\n if (delta === 0) return 0;\n const block = Math.floor(index / this.blockSize);\n const rows = this.blocks.get(block) ?? new Map<number, number>();\n rows.set(index, height);\n this.deltas.set(block, (this.deltas.get(block) ?? 0) + delta);\n this.blocks.delete(block);\n this.blocks.set(block, rows);\n return delta;\n }\n retain(range: CominsViewportRange) {\n const first = Math.floor(range.startIndex / this.blockSize);\n const last = Math.floor(Math.max(range.startIndex, range.endIndex - 1) / this.blockSize);\n const requiredCount = range.endIndex > range.startIndex ? last - first + 1 : 0;\n const limit = Math.max(this.maxBlocks, requiredCount);\n for (const block of this.blocks.keys()) {\n if (this.blocks.size <= limit) break;\n if (block < first || block > last) { this.blocks.delete(block); this.deltas.delete(block); }\n }\n }\n}\n","import { normalizeCominsViewportInteger, type CominsViewportData, type CominsViewportRange, type CoreViewportRequest } from \"./data\";\n\nexport type CoreActiveViewportRequest = { request: CoreViewportRequest; done: boolean };\n\n/** Pure scheduling policy. Completion alone is not controlled snapshot acknowledgement. */\nexport function planViewportRequests<T>(input: {\n data: CominsViewportData<T>;\n range: CominsViewportRange;\n active: readonly CoreActiveViewportRequest[];\n retryStarts: readonly number[];\n maxConcurrent?: number;\n}) {\n const { data, range } = input;\n const needed: number[] = [];\n for (let index = Math.floor(range.startIndex / data.blockSize) * data.blockSize; index < Math.min(data.rowCount, range.endIndex); index += data.blockSize) needed.push(index);\n const wanted = new Set(needed);\n const cancelRequestIds: string[] = [], releaseRequestIds: string[] = [];\n const activeStarts = new Set<number>();\n for (const entry of input.active) {\n const index = entry.request.startIndex;\n if (!wanted.has(index)) cancelRequestIds.push(entry.request.requestId);\n else if (entry.done && !data.requests.some(request => request.requestId === entry.request.requestId && request.status === \"loading\") && (data.blocks.some(block => block.startIndex === index) || data.requests.some(request => request.startIndex === index && request.status === \"error\"))) releaseRequestIds.push(entry.request.requestId);\n else activeStarts.add(index);\n }\n const max = normalizeCominsViewportInteger(input.maxConcurrent, 2);\n const retryStarts = new Set(input.retryStarts);\n const consumedRetryStarts: number[] = [];\n const startRanges: CominsViewportRange[] = [];\n for (const index of needed) {\n if (activeStarts.size >= max) break;\n if (activeStarts.has(index)) continue;\n const retry = retryStarts.has(index);\n if (!retry && (data.blocks.some(block => block.startIndex === index) || data.requests.some(request => request.startIndex === index))) continue;\n if (retry) consumedRetryStarts.push(index);\n activeStarts.add(index);\n startRanges.push({ startIndex: index, endIndex: Math.min(index + data.blockSize, data.rowCount) });\n }\n return { startRanges, cancelRequestIds, releaseRequestIds, consumedRetryStarts };\n}\n","import type { CoreViewportRequest, CominsViewportDataEvent } from \"../core/viewport/data\";\n\nexport type CominsViewportRequest = CoreViewportRequest & { signal: AbortSignal };\ntype WithSignal<TEvent> = TEvent extends { request: CoreViewportRequest } ? Omit<TEvent, \"request\"> & { request: CominsViewportRequest } : TEvent;\nexport type BrowserViewportDataEvent<T> = WithSignal<CominsViewportDataEvent<T>>;\n\nexport function createViewportRequestExecutor(options: {\n onRequest: (request: CominsViewportRequest) => void | Promise<void>;\n onSettled: (requestId: string) => void;\n}) {\n const active = new Map<string, { controller: AbortController; done: boolean }>();\n let disposed = false;\n const cancel = (requestId: string) => {\n const entry = active.get(requestId);\n if (!entry) return;\n active.delete(requestId);\n entry.controller.abort();\n };\n return {\n start(descriptor: CoreViewportRequest) {\n if (disposed || active.has(descriptor.requestId)) return;\n const controller = new AbortController();\n const entry = { controller, done: false };\n const request = { ...descriptor, signal: controller.signal };\n active.set(descriptor.requestId, entry);\n Promise.resolve().then(() => { if (!controller.signal.aborted) return options.onRequest(request); }).catch(() => {\n // Low-level consumers acknowledge errors in their controlled snapshot.\n }).finally(() => {\n if (controller.signal.aborted) return;\n entry.done = true;\n options.onSettled(descriptor.requestId);\n });\n },\n cancel,\n // Acknowledgement releases ownership without changing the completed signal.\n release(requestId: string) {\n if (active.get(requestId)?.done) active.delete(requestId);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n for (const requestId of active.keys()) cancel(requestId);\n },\n };\n}\n\n/** The consumer owns data; this boundary owns only execution and listener lifetime. */\nexport async function runViewportRequest<T>(input: {\n request: CominsViewportRequest;\n getRows: (request: CominsViewportRequest) => readonly T[] | Promise<readonly T[]>;\n dispatch: (event: BrowserViewportDataEvent<T>) => void;\n}): Promise<void> {\n const { request, dispatch } = input;\n if (request.signal.aborted) return;\n dispatch({ type: \"request\", request });\n const cancel = () => dispatch({ type: \"cancel\", request });\n request.signal.addEventListener(\"abort\", cancel, { once: true });\n try {\n const rows = await input.getRows(request);\n if (!request.signal.aborted) dispatch({ type: \"success\", request, rows });\n } catch {\n if (!request.signal.aborted) dispatch({ type: \"error\", request });\n } finally {\n request.signal.removeEventListener(\"abort\", cancel);\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { reduceCominsViewportData, type CominsViewportData, type CominsViewportRange } from \"../core/viewport/data\";\nimport { planViewportRequests, type CoreActiveViewportRequest } from \"../core/viewport/requests\";\nimport { createViewportRequestExecutor, type CominsViewportRequest } from \"../browser/viewport-requests\";\n\nlet nextRequestId = 0;\nexport function useCominsViewportRequests<T>(input: {\n data?: CominsViewportData<T>;\n range: CominsViewportRange;\n maxConcurrentRequests?: number;\n onRequest?: (request: CominsViewportRequest) => void | Promise<void>;\n onChangeData?: (data: CominsViewportData<T>) => void;\n}) {\n const active = useRef(new Map<number, CoreActiveViewportRequest & { onRequest: NonNullable<typeof input.onRequest> }>());\n const executor = useRef<ReturnType<typeof createViewportRequestExecutor> | null>(null);\n const retryBlocks = useRef(new Set<number>());\n const [version, setVersion] = useState(0);\n const { data, onRequest, onChangeData } = input;\n const start = input.range.startIndex, end = input.range.endIndex;\n useEffect(() => {\n executor.current = createViewportRequestExecutor({\n onRequest(request) {\n const entry = active.current.get(request.startIndex);\n if (entry?.request.requestId === request.requestId) {\n const onRequest = entry.onRequest;\n return onRequest(request);\n }\n },\n onSettled(requestId) {\n const entry = [...active.current.values()].find(candidate => candidate.request.requestId === requestId);\n if (!entry) return;\n entry.done = true;\n setVersion(value => value + 1);\n },\n });\n return () => {\n executor.current?.dispose();\n executor.current = null;\n active.current.clear();\n retryBlocks.current.clear();\n };\n }, [data?.revision, data?.rowCount, data?.blockSize]);\n useEffect(() => {\n if (!data || !onRequest || !executor.current) return;\n const range = { startIndex: start, endIndex: end };\n const retained = reduceCominsViewportData(data, { type: \"retain\", range });\n if (retained !== data) onChangeData?.(retained);\n const plan = planViewportRequests({ data, range, active: [...active.current.values()], retryStarts: [...retryBlocks.current], maxConcurrent: input.maxConcurrentRequests });\n for (const [index, entry] of active.current) {\n const id = entry.request.requestId;\n if (plan.cancelRequestIds.includes(id)) { executor.current.cancel(id); active.current.delete(index); }\n else if (plan.releaseRequestIds.includes(id)) { executor.current.release(id); active.current.delete(index); }\n }\n for (const index of plan.consumedRetryStarts) retryBlocks.current.delete(index);\n for (const nextRange of plan.startRanges) {\n const request = { ...nextRange, revision: data.revision, requestId: `comins-viewport-${++nextRequestId}`, retainRange: range };\n active.current.set(request.startIndex, { request, done: false, onRequest });\n executor.current.start(request);\n }\n }, [data, onRequest, onChangeData, start, end, input.maxConcurrentRequests, version]);\n return (index: number) => {\n if (!data) return;\n retryBlocks.current.add(Math.floor(index / data.blockSize) * data.blockSize);\n setVersion(value => value + 1);\n };\n}\n","import { useLayoutEffect, useRef, useState } from \"react\";\nimport type React from \"react\";\nimport type { CominsRowId } from \"./core\";\nimport type { CominsEventRow, CominsRowDragReason, CominsRowDragResult, CominsRowDragTarget, CominsTableRowProps } from \"./index\";\nimport { resolveCoreTreeDropContext, resolveCoreTreePointerPosition } from \"./core/selection/navigation\";\nimport { applyCominsDragScroll, focusCominsPointerTarget, registerCominsPointerListeners, startCominsPointerFrames } from \"./browser/pointer\";\nimport { moveCominsTreeNode, type CominsTreeDropContext, type CominsTreeDropPosition, type CominsTreeNode, type CominsTreeRowDragConfig, type CominsVisibleTreeRow } from \"./tree\";\n\nexport type CominsBeforeTreeRowDragPayload<T> = {\n event: React.PointerEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>;\n row: CominsEventRow<T>;\n};\nexport type CominsTreeRowDragPayload<T> = {\n event: PointerEvent | KeyboardEvent;\n row: CominsEventRow<T>;\n target: CominsRowDragTarget;\n};\nexport type CominsAfterTreeRowDragPayload<T> = {\n event: PointerEvent | KeyboardEvent | null;\n row: CominsEventRow<T>;\n target?: CominsRowDragTarget;\n reason: CominsRowDragReason;\n result: CominsRowDragResult;\n};\n\ntype Options<T> = {\n data: readonly CominsTreeNode<T>[];\n entries: readonly CominsVisibleTreeRow<T>[];\n getRowId: (row: T, index: number) => CominsRowId;\n config?: CominsTreeRowDragConfig<T>;\n sorted: boolean;\n rowProps?: CominsTableRowProps<T>;\n onChangeData?: (data: CominsTreeNode<T>[]) => void;\n onBeforeRowDrag?: (payload: CominsBeforeTreeRowDragPayload<T>) => boolean | void;\n onRowDrag?: (payload: CominsTreeRowDragPayload<T>) => void;\n onAfterDragRow?: (payload: CominsAfterTreeRowDragPayload<T>) => void;\n};\ntype Preview<T> = { context: CominsTreeDropContext<T>; valid: boolean };\ntype Gesture<T> = {\n root: HTMLElement;\n source: CominsEventRow<T>;\n target: Preview<T> | null;\n keyboard: boolean;\n cleanup: () => void;\n};\nconst pathKey = (path: readonly number[]) => path.join(\".\");\n\nexport function useCominsTreeDrag<T>(options: Options<T>) {\n const committed = useRef(options);\n const gesture = useRef<Gesture<T> | null>(null);\n const navigateRef = useRef<((id: CominsRowId) => void) | null>(null);\n const pendingFocus = useRef<{ root: HTMLElement; id: CominsRowId } | null>(null);\n const pendingScrollTop = useRef<number | null>(null);\n const [preview, setPreview] = useState<Preview<T> | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n\n const targetPayload = (target: Preview<T>): CominsRowDragTarget => ({\n rowId: target.context.target.rowId,\n dataIndex: committed.current.entries.indexOf(target.context.target),\n valid: target.valid,\n tree: { ...target.context.destination, position: target.context.position },\n });\n const finish = (commit: boolean, event: PointerEvent | KeyboardEvent | null, reason: CominsRowDragReason) => {\n const current = gesture.current;\n if (!current) return;\n gesture.current = null;\n current.cleanup();\n setPreview(null);\n const props = committed.current;\n let result: CominsRowDragResult = commit ? \"rejected\" : \"cancelled\";\n if (commit && current.target?.valid && props.onChangeData) {\n const target = current.target.context;\n const next = props.config?.canDrop?.(target) === false ? props.data : moveCominsTreeNode(props.data, current.source.id, target.destination, props.getRowId, props.config);\n if (next !== props.data) {\n result = \"moved\";\n if (!current.keyboard) {\n pendingScrollTop.current = current.root.querySelector<HTMLElement>(\".comins-table__body-viewport\")?.scrollTop ?? null;\n }\n props.onChangeData([...next]);\n }\n }\n const focusId = result === \"moved\" && current.target?.context.position === \"inside\"\n ? current.target.context.target.rowId : current.source.id;\n pendingFocus.current = { root: current.root, id: focusId };\n setAnnouncement(result === \"moved\" ? `Moved ${String(current.source.id)}` : `Move ${result}`);\n props.onAfterDragRow?.({ event, row: current.source, result, reason: commit && result !== \"moved\" ? \"invalid-target\" : reason, ...(current.target ? { target: targetPayload(current.target) } : {}) });\n };\n\n const restoreFocus = () => {\n const focus = pendingFocus.current;\n if (!focus) return;\n const handle = Array.from(focus.root.querySelectorAll<HTMLElement>(\"[data-comins-tree-drag-handle]\")).find(element => element.dataset.testid === `row-drag-handle-${String(focus.id)}`);\n if (handle) { focusCominsPointerTarget(handle); pendingFocus.current = null; pendingScrollTop.current = null; }\n else navigateRef.current?.(focus.id);\n };\n\n useLayoutEffect(() => {\n if (gesture.current && (committed.current.data !== options.data || committed.current.config?.allowReparent !== options.config?.allowReparent || committed.current.config?.canDrop !== options.config?.canDrop || Boolean(committed.current.config) !== Boolean(options.config) || committed.current.rowProps?.disabled !== options.rowProps?.disabled || committed.current.rowProps?.draggable !== options.rowProps?.draggable || committed.current.sorted !== options.sorted || committed.current.getRowId !== options.getRowId || Boolean(committed.current.onChangeData) !== Boolean(options.onChangeData))) {\n finish(false, null, \"stale-target\");\n }\n committed.current = options;\n });\n useLayoutEffect(() => () => finish(false, null, \"pointer-cancel\"), []);\n\n const choose = (targetId: CominsRowId, position: CominsTreeDropPosition, event: PointerEvent | KeyboardEvent) => {\n const current = gesture.current;\n const props = committed.current;\n if (!current) return;\n const context = resolveCoreTreeDropContext({ entries: props.entries, sourceId: current.source.id, targetId, position });\n if (!context) return;\n const { source } = context;\n const valid = !props.sorted && Boolean(props.config && props.onChangeData) && props.config?.canDrop?.(context) !== false && moveCominsTreeNode(props.data, source.rowId, context.destination, props.getRowId, props.config) !== props.data;\n if (current.target?.context.target.rowId === targetId && current.target.context.position === position && current.target.valid === valid) return;\n current.target = { context, valid };\n setPreview(current.target);\n setAnnouncement(`${position} ${String(targetId)}${valid ? \"\" : \", unavailable\"}`);\n props.onRowDrag?.({ event, row: current.source, target: targetPayload(current.target) });\n };\n\n const begin = (event: React.PointerEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>, row: CominsEventRow<T>, keyboard: boolean) => {\n const props = committed.current;\n const disabled = props.rowProps?.disabled;\n const draggable = props.rowProps?.draggable;\n if (!props.config || props.sorted || !props.onChangeData || gesture.current ||\n (typeof disabled === \"function\" ? disabled(row.data, row.dataIndex) : disabled) ||\n (typeof draggable === \"function\" ? draggable(row.data, row.dataIndex) : draggable) === false) return false;\n const root = event.currentTarget.closest<HTMLElement>(\"[data-comins-table-instance-id]\");\n if (!root || props.onBeforeRowDrag?.({ event, row }) === false) return false;\n event.preventDefault();\n event.stopPropagation();\n gesture.current = { root, source: row, keyboard, target: null, cleanup: () => {} };\n setAnnouncement(`Moving ${String(row.id)}. Use arrow keys to choose a destination, Enter to drop, Escape to cancel.`);\n return true;\n };\n\n const onPointerDown = (event: React.PointerEvent<HTMLElement>, row: CominsEventRow<T>) => {\n if (event.button !== 0 || !begin(event, row, false)) return;\n const current = gesture.current!;\n const viewport = current.root.querySelector<HTMLElement>(\".comins-table__body-viewport\");\n let lastEvent = event.nativeEvent;\n let lastTime = performance.now();\n const update = (pointer: PointerEvent) => {\n const element = document.elementFromPoint(pointer.clientX, pointer.clientY)?.closest<HTMLElement>(\"[data-comins-row-data-index]\");\n if (!element || element.closest(\"[data-comins-table-instance-id]\") !== current.root) {\n current.target = null;\n setPreview(null);\n return;\n }\n const entry = committed.current.entries[Number(element.dataset.cominsRowDataIndex)];\n if (!entry || element.dataset.testid !== `row-${String(entry.rowId)}`) return;\n const rect = element.getBoundingClientRect();\n const fraction = (pointer.clientY - rect.top) / Math.max(1, rect.height);\n choose(entry.rowId, resolveCoreTreePointerPosition(fraction, committed.current.config?.allowReparent), pointer);\n };\n const tick = (now: number) => {\n if (viewport) {\n const rect = viewport.getBoundingClientRect();\n const insideX = lastEvent.clientX >= rect.left && lastEvent.clientX <= rect.right;\n applyCominsDragScroll(viewport, { clientY: lastEvent.clientY, top: Math.max(0, rect.top), bottom: Math.min(window.innerHeight, rect.bottom), deltaMs: now - lastTime, enabled: insideX, onlyIfChanged: true });\n }\n update(lastEvent);\n lastTime = now;\n };\n const move = (pointer: PointerEvent) => { lastEvent = pointer; update(pointer); };\n const up = (pointer: PointerEvent) => { update(pointer); finish(true, pointer, \"drop\"); };\n const cancel = (pointer: PointerEvent) => finish(false, pointer, \"pointer-cancel\");\n const blur = () => finish(false, null, \"blur\");\n const key = (keyboard: KeyboardEvent) => { if (keyboard.key === \"Escape\") { keyboard.preventDefault(); finish(false, keyboard, \"escape\"); } };\n const removeListeners = registerCominsPointerListeners({ move, up, cancel, blur, key });\n const stopFrames = startCominsPointerFrames(tick);\n current.cleanup = () => { stopFrames(); removeListeners(); };\n };\n\n const moveByKeyboard = (event: KeyboardEvent) => {\n const current = gesture.current;\n if (!current?.keyboard || ![\"Escape\", \"Enter\", \" \", \"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(event.key)) return;\n event.preventDefault();\n event.stopPropagation();\n if (event.key === \"Escape\") return finish(false, event, \"escape\");\n if (event.key === \"Enter\") return finish(true, event, \"drop\");\n const entries = committed.current.entries;\n const currentIndex = entries.findIndex(entry => entry.rowId === (current.target?.context.target.rowId ?? current.source.id));\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const target = entries[Math.max(0, Math.min(entries.length - 1, currentIndex + (event.key === \"ArrowDown\" ? 1 : -1)))];\n if (target) {\n choose(target.rowId, event.key === \"ArrowDown\" ? \"after\" : \"before\", event);\n navigateRef.current?.(target.rowId);\n }\n } else if (event.key === \"ArrowRight\" && committed.current.config?.allowReparent) {\n const target = entries[currentIndex];\n if (target) choose(target.rowId, \"inside\", event);\n } else if (event.key === \"ArrowLeft\" && committed.current.config?.allowReparent) {\n const source = entries.find(entry => entry.rowId === current.source.id);\n const parent = source && entries.find(entry => pathKey(entry.path) === pathKey(source.path.slice(0, -1)));\n if (parent) { choose(parent.rowId, \"after\", event); navigateRef.current?.(parent.rowId); }\n }\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLElement>, row: CominsEventRow<T>) => {\n if (!gesture.current && event.key === \" \" && begin(event, row, true)) {\n const blur = () => finish(false, null, \"blur\");\n // The source handle can unmount while navigating a virtualized tree.\n window.addEventListener(\"keydown\", moveByKeyboard, true);\n window.addEventListener(\"blur\", blur);\n gesture.current!.cleanup = () => {\n window.removeEventListener(\"keydown\", moveByKeyboard, true);\n window.removeEventListener(\"blur\", blur);\n };\n }\n };\n\n return { announcement, navigateRef, pendingScrollTop, restoreFocus, onPointerDown, onKeyDown, preview };\n}\n","export type CominsSummaryBuiltin = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\n\nfunction getNumericValues(values: readonly unknown[]) {\n return values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n}\n\nexport function getBuiltinSummaryValue(kind: CominsSummaryBuiltin, values: readonly unknown[]): number | null {\n if (kind === \"count\") {\n return values.length;\n }\n\n const numericValues = getNumericValues(values);\n\n if (numericValues.length === 0) {\n return null;\n }\n\n if (kind === \"sum\") {\n return numericValues.reduce((total, value) => total + value, 0);\n }\n\n if (kind === \"avg\") {\n return numericValues.reduce((total, value) => total + value, 0) / numericValues.length;\n }\n\n return kind === \"min\" ? Math.min(...numericValues) : Math.max(...numericValues);\n}\n","import type React from \"react\";\n\nimport type { CominsTableRuntimeColumn } from \"./react/core-compat\";\n\nexport type CominsSummaryBuiltin = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\n\nexport type CominsSummaryAggregator<TData> = (input: {\n column: CominsTableRuntimeColumn<TData>;\n rows: readonly TData[];\n values: readonly unknown[];\n}) => React.ReactNode;\n\nexport type CominsSummaryFormatPayload<TData> = {\n column: CominsTableRuntimeColumn<TData>;\n rows: readonly TData[];\n value: React.ReactNode;\n values: readonly unknown[];\n};\n\nexport type CominsSummaryRenderPayload<TData> = CominsSummaryFormatPayload<TData> & {\n formattedValue: React.ReactNode;\n};\n\nexport type CominsSummaryColumnConfig<TData> = {\n aggregate: CominsSummaryBuiltin | CominsSummaryAggregator<TData>;\n className?: string;\n colSpan?: number;\n format?: (payload: CominsSummaryFormatPayload<TData>) => React.ReactNode;\n /** Render after aggregate/format; undefined keeps formattedValue, null hides content. */\n render?: (payload: CominsSummaryRenderPayload<TData>) => React.ReactNode;\n style?: React.CSSProperties;\n};\n\nexport type CominsSummaryColumn<TData> =\n | CominsSummaryBuiltin\n | CominsSummaryAggregator<TData>\n | CominsSummaryColumnConfig<TData>;\n\nexport type CominsTableSummaryConfig<TData> = {\n className?: string;\n columns: Partial<Record<string, CominsSummaryColumn<TData>>>;\n label?: React.ReactNode;\n style?: React.CSSProperties;\n};\n\nfunction getNestedFieldValue(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, key) => {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[key];\n }, row);\n}\n\nimport { getBuiltinSummaryValue } from \"./core/rows/summary\";\n\nexport function resolveCominsSummaryValues<TData>(\n rows: readonly TData[],\n columns: readonly CominsTableRuntimeColumn<TData>[],\n summary: CominsTableSummaryConfig<TData>,\n): { values: Record<string, React.ReactNode>; renderedColumnIds: ReadonlySet<string> } {\n const renderedColumnIds = new Set<string>();\n const result = Object.entries(summary.columns).reduce<Record<string, React.ReactNode>>((valuesByColumnId, [columnId, configuredColumn]) => {\n const column = columns.find((candidate) => candidate.id === columnId);\n\n if (!column || !configuredColumn) {\n return valuesByColumnId;\n }\n\n const config =\n typeof configuredColumn === \"object\" && configuredColumn !== null ? configuredColumn : undefined;\n const aggregate =\n typeof configuredColumn === \"object\" && configuredColumn !== null\n ? configuredColumn.aggregate\n : configuredColumn;\n const values = rows.map((row) => getNestedFieldValue(row, column.field));\n const value =\n typeof aggregate === \"function\" ? aggregate({ column, rows, values }) : getBuiltinSummaryValue(aggregate, values);\n const formattedValue = config?.format ? config.format({ column, rows, value, values }) : value;\n if (config?.render) {\n renderedColumnIds.add(columnId);\n const rendered = config.render({ column, rows, value, values, formattedValue });\n valuesByColumnId[columnId] = rendered === undefined ? formattedValue : rendered;\n } else {\n valuesByColumnId[columnId] = formattedValue;\n }\n\n return valuesByColumnId;\n }, {});\n return { values: result, renderedColumnIds };\n}\n\nexport function getCominsSummaryValues<TData>(\n rows: readonly TData[],\n columns: readonly CominsTableRuntimeColumn<TData>[],\n summary: CominsTableSummaryConfig<TData>,\n): Record<string, React.ReactNode> {\n return resolveCominsSummaryValues(rows, columns, summary).values;\n}\n","import type { CominsRowId } from \"../model\";\n\nexport const COMINS_MAX_PHYSICAL_TOTAL_HEIGHT = 1_500_000;\n\nexport type CominsDataVirtualSlot<TData> = {\n absoluteIndex?: number;\n dataIndex: number;\n detail?: {\n estimated: boolean;\n height: number;\n mode: \"auto\" | \"fixed\";\n };\n key: string;\n kind: \"data\";\n rowHeight?: number;\n autoHeight?: boolean;\n row: TData;\n rowId: CominsRowId;\n visibleIndex: number;\n};\n\nexport type CominsGroupVirtualSlot = {\n groupId: CominsRowId;\n height: number;\n key: string;\n kind: \"group\";\n};\n\nexport type CominsPlaceholderVirtualSlot = {\n kind: \"placeholder\";\n key: string;\n absoluteIndex: number;\n height: number;\n};\n\nexport type CominsVirtualSlot<TData> =\n | CominsDataVirtualSlot<TData>\n | CominsPlaceholderVirtualSlot\n | CominsGroupVirtualSlot;\n\nexport type CominsVirtualRange = {\n endIndex: number;\n logicalScrollTop: number;\n logicalStartOffset: number;\n physicalScrollHeight: number;\n renderOffset: number;\n scrollScale: number;\n startIndex: number;\n};\n\nexport type CominsScrollAnchor = {\n key: string;\n offsetWithinSlot: number;\n previousIndex: number;\n};\n\nexport function getCominsDataSlotKey(rowId: CominsRowId) {\n return `data:${typeof rowId}:${encodeURIComponent(String(rowId))}`;\n}\n\nexport function createCominsDataVirtualSlot<TData>(input: {\n dataIndex: number;\n detail: CominsDataVirtualSlot<TData>[\"detail\"] | null;\n row: TData;\n rowHeight: number;\n autoHeight?: boolean;\n rowId: CominsRowId;\n visibleIndex: number;\n}): CominsDataVirtualSlot<TData> {\n return {\n dataIndex: input.dataIndex,\n ...(input.detail ? { detail: input.detail } : {}),\n key: getCominsDataSlotKey(input.rowId),\n kind: \"data\",\n row: input.row,\n rowHeight: input.rowHeight,\n autoHeight: input.autoHeight,\n rowId: input.rowId,\n visibleIndex: input.visibleIndex,\n };\n}\n\nexport function normalizeCominsDetailEstimate(\n value: number | undefined,\n fallbackHeight: number,\n) {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return value;\n }\n\n return Math.max(1, fallbackHeight);\n}\n\nexport function normalizeCominsDetailHeight(\n value: number | \"auto\" | undefined,\n): { mode: \"auto\" } | { height: number; mode: \"fixed\" } {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? { height: value, mode: \"fixed\" }\n : { mode: \"auto\" };\n}\n\nexport class CominsHeightIndex {\n private readonly heights: Float64Array;\n private readonly tree: Float64Array;\n private totalHeight: number;\n\n private constructor(heights: readonly number[]) {\n this.heights = Float64Array.from(heights, (height) => Math.max(0, height));\n this.tree = new Float64Array(this.heights.length + 1);\n this.totalHeight = 0;\n\n for (let index = 0; index < this.heights.length; index += 1) {\n const cursor = index + 1;\n const height = this.heights[index] ?? 0;\n const parent = cursor + (cursor & -cursor);\n\n this.tree[cursor] = (this.tree[cursor] ?? 0) + height;\n this.totalHeight += height;\n\n if (parent < this.tree.length) {\n this.tree[parent] =\n (this.tree[parent] ?? 0) + (this.tree[cursor] ?? 0);\n }\n }\n }\n\n static from(heights: readonly number[]) {\n return new CominsHeightIndex(heights);\n }\n\n private add(index: number, delta: number) {\n for (let cursor = index + 1; cursor < this.tree.length; cursor += cursor & -cursor) {\n this.tree[cursor] = (this.tree[cursor] ?? 0) + delta;\n }\n }\n\n getHeight(index: number) {\n return this.heights[index] ?? 0;\n }\n\n getPrefixHeight(endExclusive: number) {\n let total = 0;\n\n for (\n let cursor = Math.min(this.heights.length, Math.max(0, endExclusive));\n cursor > 0;\n cursor -= cursor & -cursor\n ) {\n total += this.tree[cursor] ?? 0;\n }\n\n return total;\n }\n\n getTotalHeight() {\n return this.totalHeight;\n }\n\n findIndexAtOffset(offset: number) {\n if (this.heights.length === 0 || this.totalHeight <= 0) {\n return 0;\n }\n\n const target = Math.min(\n Math.max(0, offset),\n Math.max(0, this.getTotalHeight() - Number.EPSILON),\n );\n let treeIndex = 0;\n let prefix = 0;\n let bit = 1;\n\n while (bit * 2 < this.tree.length) {\n bit *= 2;\n }\n\n for (; bit > 0; bit = Math.floor(bit / 2)) {\n const next = treeIndex + bit;\n const nextPrefix = prefix + (this.tree[next] ?? 0);\n\n if (next < this.tree.length && nextPrefix <= target) {\n treeIndex = next;\n prefix = nextPrefix;\n }\n }\n\n return Math.min(this.heights.length - 1, treeIndex);\n }\n\n updateHeight(index: number, height: number) {\n const next = Math.max(0, height);\n const current = this.heights[index];\n\n if (current === undefined) {\n return 0;\n }\n\n const delta = next - current;\n this.heights[index] = next;\n this.totalHeight += delta;\n this.add(index, delta);\n return delta;\n }\n}\n\nexport type CominsDetailMeasurement = {\n height: number;\n width: number;\n};\n\nexport function getCominsSlotHeight<TData>(\n slot: CominsVirtualSlot<TData>,\n rowHeight: number,\n) {\n return slot.kind !== \"data\"\n ? slot.height\n : (slot.rowHeight ?? rowHeight) + (slot.detail?.height ?? 0);\n}\n\nexport function getCominsScrollScale(\n logicalTotalHeight: number,\n viewportHeight: number,\n) {\n const physicalScrollHeight = Math.min(\n logicalTotalHeight,\n COMINS_MAX_PHYSICAL_TOTAL_HEIGHT,\n );\n const logicalScrollableHeight = Math.max(0, logicalTotalHeight - viewportHeight);\n const physicalScrollableHeight = Math.max(0, physicalScrollHeight - viewportHeight);\n const scrollScale =\n logicalScrollableHeight > 0 && physicalScrollableHeight > 0\n ? logicalScrollableHeight / physicalScrollableHeight\n : 1;\n\n return {\n logicalScrollableHeight,\n physicalScrollableHeight,\n physicalScrollHeight,\n scrollScale,\n };\n}\n\nexport function getCominsMixedVirtualRange(input: {\n heightIndex: Pick<CominsHeightIndex, \"getTotalHeight\" | \"getPrefixHeight\" | \"findIndexAtOffset\">;\n overscan: number;\n physicalScrollTop: number;\n viewportHeight: number;\n}): CominsVirtualRange {\n const metrics = getCominsScrollScale(\n input.heightIndex.getTotalHeight(),\n input.viewportHeight,\n );\n const physicalScrollTop = Math.min(\n metrics.physicalScrollableHeight,\n Math.max(0, input.physicalScrollTop),\n );\n const logicalScrollTop = Math.min(\n metrics.logicalScrollableHeight,\n physicalScrollTop * metrics.scrollScale,\n );\n const firstVisibleIndex = input.heightIndex.findIndexAtOffset(logicalScrollTop);\n const lastVisibleIndex = input.heightIndex.findIndexAtOffset(\n logicalScrollTop + Math.max(0, input.viewportHeight),\n );\n const startIndex = Math.max(0, firstVisibleIndex - Math.max(0, input.overscan));\n const endIndex = Math.min(\n lastVisibleIndex + Math.max(0, input.overscan) + 1,\n input.heightIndex.findIndexAtOffset(Number.POSITIVE_INFINITY) + 1,\n );\n const logicalStartOffset = input.heightIndex.getPrefixHeight(startIndex);\n\n return {\n endIndex,\n logicalScrollTop,\n logicalStartOffset,\n physicalScrollHeight: metrics.physicalScrollHeight,\n renderOffset:\n physicalScrollTop -\n (logicalScrollTop - logicalStartOffset),\n scrollScale: metrics.scrollScale,\n startIndex,\n };\n}\n\nexport function resolveCominsMeasuredDetailHeight(\n cache: ReadonlyMap<CominsRowId, CominsDetailMeasurement>,\n rowId: CominsRowId,\n width: number,\n estimate: number,\n) {\n const measurement = cache.get(rowId);\n\n return measurement && measurement.width === Math.round(width)\n ? { estimated: false, height: measurement.height }\n : { estimated: true, height: estimate };\n}\n\nexport function reconcileCominsDetailMeasurements(\n cache: Map<CominsRowId, CominsDetailMeasurement>,\n rowIds: ReadonlySet<CominsRowId>,\n) {\n for (const rowId of cache.keys()) {\n if (!rowIds.has(rowId)) {\n cache.delete(rowId);\n }\n }\n}\n\nexport function captureCominsScrollAnchor(input: {\n heightIndex: CominsHeightIndex;\n keys: readonly string[];\n logicalScrollTop: number;\n}): CominsScrollAnchor | undefined {\n if (input.keys.length === 0) {\n return undefined;\n }\n\n const previousIndex = input.heightIndex.findIndexAtOffset(input.logicalScrollTop);\n const key = input.keys[previousIndex];\n\n if (key === undefined) {\n return undefined;\n }\n\n const slotStart = input.heightIndex.getPrefixHeight(previousIndex);\n return {\n key,\n offsetWithinSlot: Math.max(0, input.logicalScrollTop - slotStart),\n previousIndex,\n };\n}\n\nexport function resolveCominsAnchorLogicalScrollTop(input: {\n anchor: CominsScrollAnchor;\n nextHeightIndex: CominsHeightIndex;\n nextKeys: readonly string[];\n previousKeys: readonly string[];\n}) {\n const target = resolveCominsAnchorTarget({\n anchor: input.anchor,\n getNextHeight: (index) => input.nextHeightIndex.getHeight(index),\n nextKeys: input.nextKeys,\n previousKeys: input.previousKeys,\n });\n\n return target\n ? input.nextHeightIndex.getPrefixHeight(target.index) + target.offsetWithinSlot\n : 0;\n}\n\nexport function resolveCominsAnchorTarget(input: {\n anchor: CominsScrollAnchor;\n getNextHeight: (index: number) => number;\n nextKeys: readonly string[];\n previousKeys: readonly string[];\n}) {\n let nextIndex = input.nextKeys.indexOf(input.anchor.key);\n\n if (nextIndex === -1) {\n for (\n let previousIndex = Math.min(input.anchor.previousIndex - 1, input.previousKeys.length - 1);\n previousIndex >= 0;\n previousIndex -= 1\n ) {\n nextIndex = input.nextKeys.indexOf(input.previousKeys[previousIndex] ?? \"\");\n if (nextIndex !== -1) {\n break;\n }\n }\n }\n\n if (nextIndex === -1) {\n for (\n let previousIndex = Math.max(0, input.anchor.previousIndex + 1);\n previousIndex < input.previousKeys.length;\n previousIndex += 1\n ) {\n nextIndex = input.nextKeys.indexOf(input.previousKeys[previousIndex] ?? \"\");\n if (nextIndex !== -1) {\n break;\n }\n }\n }\n\n if (nextIndex === -1) {\n return undefined;\n }\n\n return {\n index: nextIndex,\n offsetWithinSlot: Math.min(\n Math.max(0, input.anchor.offsetWithinSlot),\n Math.max(0, input.getNextHeight(nextIndex)),\n ),\n };\n}\n\nexport function getCominsPhysicalScrollTop(\n logicalScrollTop: number,\n logicalTotalHeight: number,\n viewportHeight: number,\n) {\n const metrics = getCominsScrollScale(logicalTotalHeight, viewportHeight);\n\n return Math.min(\n metrics.physicalScrollableHeight,\n Math.max(0, logicalScrollTop) / metrics.scrollScale,\n );\n}\n","import { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { runViewportRequest } from \"./browser/viewport-requests\";\nimport { createCominsViewportData, reduceCominsViewportData, type CominsViewportData, type CominsViewportDataEvent, type CominsViewportPatch, type CominsViewportRequest, type CominsViewportRevision } from \"./viewport-data\";\n\nexport type CominsViewportDatasource = {\n revision: CominsViewportRevision;\n maxConcurrentRequests?: number;\n heightCacheSize?: number;\n};\nexport type CominsViewportOptions<T> = {\n rowCount: number;\n queryKey: CominsViewportRevision;\n getRows: (request: CominsViewportRequest) => readonly T[] | Promise<readonly T[]>;\n blockSize?: number;\n cacheSize?: number;\n maxConcurrentRequests?: number;\n heightCacheSize?: number;\n onEdit?: (changes: readonly CominsViewportPatch<T>[]) => void;\n};\n\n/** State lives with the consumer. The Table receives a controlled snapshot and callbacks. */\nexport function useCominsViewport<T>(options: CominsViewportOptions<T>) {\n const initial = useMemo(() => createCominsViewportData<T>({ revision: options.queryKey, rowCount: options.rowCount, blockSize: options.blockSize, cacheSize: options.cacheSize }), [options.queryKey, options.rowCount, options.blockSize, options.cacheSize]);\n const [state, setState] = useState({ initial, data: initial });\n const data = state.initial === initial ? state.data : initial;\n const latest = useRef(options);\n const activeInitial = useRef(initial);\n const mounted = useRef(false);\n useLayoutEffect(() => { latest.current = options; activeInitial.current = initial; });\n useLayoutEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []);\n const dispatch = useCallback((event: CominsViewportDataEvent<T>) => {\n if (!mounted.current || activeInitial.current !== initial) return;\n setState(previous => {\n const current = previous.initial === initial ? previous.data : initial;\n const next = reduceCominsViewportData(current, event);\n return previous.initial === initial && next === previous.data ? previous : { initial, data: next };\n });\n }, [initial]);\n const onViewportRequest = useCallback(async (request: CominsViewportRequest) => {\n if (request.signal.aborted || request.revision !== initial.revision) return;\n return runViewportRequest({ request, getRows: request => latest.current.getRows(request), dispatch });\n }, [initial, dispatch]);\n const onChangeData = useCallback((next: CominsViewportData<T>) => {\n if (next.revision !== initial.revision) return;\n if (next.changes.length) {\n latest.current.onEdit?.(next.changes);\n dispatch({ type: \"patch\", changes: next.changes });\n } else {\n dispatch({ type: \"retain\", range: next.retainRange });\n }\n }, [initial, dispatch]);\n const viewportDatasource = useMemo<CominsViewportDatasource>(() => ({ revision: initial.revision, maxConcurrentRequests: options.maxConcurrentRequests, heightCacheSize: options.heightCacheSize }), [initial, options.maxConcurrentRequests, options.heightCacheSize]);\n return { data, tableProps: { data, onChangeData, onViewportRequest, viewportDatasource, virtualized: true as const } };\n}\n","import { createCrossTableAutoScroll, isCominsNativeEditor as isNativeEditor } from \"./browser/pointer\";\nimport { createMeasurementObserver, hasCominsResizeObserver, measureCominsElement, observeCominsViewport, observeCominsFontChanges, getCominsElementRect } from \"./browser/measurements\";\nimport { setCominsScrollTop, setCominsScrollLeft, scrollCominsRowIntoView, focusCominsElement, createCominsDetailFocusRestorer } from \"./browser/scroll\";\nimport { writeCominsClipboardText, readCominsClipboardEvent, writeCominsClipboardEvent } from \"./browser/clipboard\";\nimport { getCrossTableTransferHit as getBrowserTransferHit } from \"./browser/table-transfer\";\nimport {\n getEffectiveColumnMinWidth,\n getEffectiveColumnMaxWidth,\n clampColumnWidth,\n setColumnWidthInsideParentGroup,\n} from \"./column-layout\";\nimport { setCominsNestedInputValue } from \"./row-value\";\nimport {\n getNextSortModel,\n getSortRule,\n getSortIndicatorState,\n getAriaSortState,\n reconcileColumnOrderHistory,\n} from \"./table-state\";\nimport { reconcileReactState, notifyReactInputChanges, notifyReactStateChanges } from \"./react/state\";\nimport { CominsCellTooltip, useCominsCellTooltip } from \"./react/cell-tooltip\";\nimport { getSortedReactTree, projectReactRows, projectCoreViewportWindow, getCorePageProjection } from \"./react/rows\";\nimport type { CominsEventRow } from \"./model\";\nexport type { CominsEventRow } from \"./model\";\nimport type React from \"react\";\nimport {\n Fragment,\n forwardRef,\n isValidElement,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n applyCominsColumnLayout,\n clearCominsSortState,\n copyCominsCell,\n copyCominsCellRange,\n copyCominsRow,\n createCominsTableState,\n fillCominsCellRange,\n parseCominsClipboardText,\n pasteCominsText,\n getCominsCellValue,\n getCominsHeaderRows,\n getCominsSortedRowIndexes,\n getCominsVisibleColumns,\n isCominsCellInSelectedRange,\n isCominsCellSelected,\n moveCominsColumn,\n moveCominsColumnGroup,\n moveCominsRow,\n moveCominsRowToGroup,\n pasteCominsCell,\n pasteCominsCellRange,\n pasteCominsRow,\n selectCell,\n selectCellRange,\n selectRow,\n selectRows,\n serializeCominsColumnLayout,\n setCominsColumnWidth,\n setCominsColumnGroupWidth,\n setCominsSortModel,\n setCominsSortState,\n updateCominsRows,\n} from \"./react/core-compat\";\nimport { copySelectionData, selectedCellValues, selectedRowData, type CominsCopyTarget, type CominsSelectedCell } from \"./selection-data\";\nexport type { CominsCopyTarget, CominsSelectedCell, CominsSelectionCopy } from \"./selection-data\";\nimport { getCominsColumnMouseIntent } from \"./column-pointer\";\nimport { CominsColumnFilterControl } from \"./column-filter\";\nimport {\n getCominsPinnedBlockResizeMaxWidth,\n getCominsColumnPinningSpanFragments,\n resolveCominsColumnPinning,\n} from \"./column-pinning\";\nimport { renderCominsBuiltInComponent, type CominsBuiltInComponentInteraction } from \"./component-renderer\";\nimport {\n getCominsDragAutoScrollTop,\n getCominsDragAutoScrollVelocity,\n} from \"./drag-autoscroll\";\nimport { CominsRowDetailRow, CominsRowDetailToggle } from \"./row-detail\";\nimport { CominsTableIcon, CominsTableIconButton } from \"./table-icons\";\nimport { useCominsCellFill } from \"./cell-fill\";\nimport {\n createCominsGroupModel,\n getCominsAggregateValue,\n moveCominsRowGroup,\n normalizeCominsRowGrouping,\n orderCominsGroupModel,\n projectCominsGroups,\n} from \"./grouping\";\nimport {\n getCominsFilteredRowIndexes,\n normalizeCominsColumnFilterModel,\n} from \"./filtering\";\nimport {\n emitCominsTableTransfer,\n emitCominsTableTransferRejected,\n getRegisteredTransferSnapshot as getReactTransferSnapshot,\n isCominsTableTransferCoordinator,\n useCominsTableTransferRegistration,\n transferCominsGroupBetweenTables,\n transferCominsRowBetweenTables,\n} from \"./table-transfer\";\nimport { CominsPointerTooltip } from \"./tooltip\";\nimport { createCominsViewportData, reduceCominsViewportData, normalizeCominsViewportInteger, type CominsViewportData, type CominsViewportRequest } from \"./viewport-data\";\nimport { CominsViewportHeightIndex } from \"./viewport-layout\";\nimport { useCominsViewportRequests } from \"./react/viewport\";\nimport type { CominsViewportDatasource } from \"./use-viewport\";\nimport { normalizeCominsRowHeight, resolveCominsRowHeight, type CominsRowHeight, type CominsRowHeightParams, type CominsRowMeasurement } from \"./row-height\";\nimport { useCominsTreeDrag, type CominsBeforeTreeRowDragPayload, type CominsTreeRowDragPayload, type CominsAfterTreeRowDragPayload } from \"./tree-drag\";\nimport { resolveCominsSummaryValues } from \"./summary\";\nimport {\n flattenCominsTree,\n getCominsTreeLeafItems,\n toggleCominsTreeNode,\n updateCominsTreeItem,\n} from \"./tree\";\nimport {\n CominsHeightIndex,\n captureCominsScrollAnchor,\n createCominsDataVirtualSlot,\n getCominsMixedVirtualRange,\n getCominsPhysicalScrollTop,\n getCominsScrollScale,\n getCominsSlotHeight,\n normalizeCominsDetailEstimate,\n normalizeCominsDetailHeight,\n reconcileCominsDetailMeasurements,\n resolveCominsAnchorTarget,\n resolveCominsMeasuredDetailHeight,\n type CominsDataVirtualSlot,\n type CominsDetailMeasurement,\n type CominsScrollAnchor,\n type CominsVirtualSlot,\n} from \"./virtual-layout\";\n\nexport {\n setCominsColumnWidth,\n setCominsColumnHidden,\n setCominsColumnGroupHidden,\n setCominsColumnGroupWidth,\n moveCominsColumn,\n moveCominsColumnGroup,\n serializeCominsColumnLayout,\n applyCominsColumnLayout,\n getCominsVisibleColumns,\n getCominsHeaderRows,\n selectRow,\n selectRows,\n selectCell,\n selectCellRange,\n clearCominsCellRange,\n clearCominsSelection,\n isCominsRowSelected,\n isCominsCellSelected,\n getCominsSelectedCellRange,\n isCominsCellInSelectedRange,\n createCominsTableState,\n queryCominsRows,\n replaceCominsRows,\n addCominsRows,\n updateCominsRows,\n deleteCominsRows,\n setCominsHeaderVisible,\n setCominsPagination,\n setCominsSortState,\n setCominsSortModel,\n clearCominsSortState,\n getCominsSortedRowIndexes,\n sortCominsRows,\n getCominsPageRows,\n getCominsVirtualRows,\n moveCominsRow,\n moveCominsRowToGroup,\n getCominsCellValue,\n} from \"./react/core-compat\";\n\nexport {\n parseCominsClipboardText,\n} from \"./clipboard-text\";\n\nexport type { CominsColumnPinned } from \"./column-pinning\";\n\nexport type {\n CominsRowId,\n CominsTableDensity,\n CominsSortDirection,\n CominsSortState,\n CominsSortModel,\n CominsComponentPrimitiveValue,\n CominsComponentAlign,\n CominsComponentDirection,\n CominsComponentPlacement,\n CominsComponentRowPayload,\n CominsColumnRuntimeState,\n CominsColumnGroupRuntimeState,\n CominsColumnLayout,\n CominsPaginationState,\n CominsSelectionState,\n CominsRowUpdate,\n CominsVirtualRowsOptions,\n CominsVirtualRows,\n CominsCopiedRow,\n CominsCopiedCell,\n CominsCopiedCellRangeCell,\n CominsCopiedCellRange,\n CominsExportFormat,\n CominsExportValueSource,\n CominsExportColumn,\n CominsExportRowsOptions,\n CominsExportMetadata,\n CominsExportTreeOptions,\n CominsExportGroupedOptions,\n CominsCellAddress,\n CominsCellRange,\n CominsPasteRowOptions,\n CominsRowSelectionOptions,\n CominsCellSelectionOptions,\n CominsFillCellRangeOptions,\n} from \"./model\";\n\nexport type {\n CominsTableTheme,\n CominsCellFormatParams,\n CominsColumnValueResolver,\n CominsTableComponentOption,\n CominsVirtualListItem,\n CominsTableMenuItem,\n CominsComponentColumnPayload,\n CominsCellComponentPayload,\n CominsHeaderComponentPayload,\n CominsClipboardGuard,\n CominsColumnProps,\n CominsTableComponentProps,\n CominsTableOptions,\n CominsTableMenuItems,\n CominsVirtualListItems,\n CominsButtonComponentConfig,\n CominsInputCommitEvent,\n CominsInputComponentConfig,\n CominsCheckboxComponentConfig,\n CominsRadioComponentConfig,\n CominsSelectComponentConfig,\n CominsToggleComponentConfig,\n CominsProgressComponentConfig,\n CominsMenuComponentConfig,\n CominsVirtualListSearchFilterPayload,\n CominsVirtualListComponentConfig,\n CominsHeaderComponentConfig,\n CominsCellComponentConfig,\n CominsHeaderComponent,\n CominsCellComponent,\n CominsTableCellConfig,\n CominsTableHeaderConfig,\n CominsTableColumn,\n CominsTableColumnGroup,\n CominsTableRuntimeColumn,\n CominsTableRuntimeColumnGroup,\n CominsEventColumn,\n CominsTableState,\n CominsTableStateInput,\n CominsHeaderColumnCell,\n CominsHeaderGroupCell,\n CominsHeaderCell,\n} from \"./react-types\";\n\nexport type { CominsRowGroupMoveOptions } from \"./core/state/table\";\n\nexport {\n setCominsTableTheme,\n formatCominsCellValue,\n isCominsCellDisabled,\n getCominsCellClassName,\n getCominsCellStyle,\n copyCominsRow,\n pasteCominsRow,\n copyCominsCell,\n pasteCominsCell,\n copyCominsCellRange,\n pasteCominsCellRange,\n pasteCominsText,\n fillCominsCellRange,\n} from \"./react/core-compat\";\nexport { exportCominsRowsToCsv, exportCominsRowsToJson } from \"./core/editing/export\";\nexport { createCominsTreeExportOptions, createCominsGroupedExportOptions } from \"./core/editing/export-structure\";\nexport { importCominsRowsFromCsv } from \"./core/editing/import\";\nexport type { CominsCsvImportOptions, CominsCsvImportRow } from \"./model\";\nexport { getCominsSummaryValues } from \"./summary\";\nexport type { CominsSummaryBuiltin, CominsSummaryAggregator, CominsSummaryFormatPayload, CominsSummaryRenderPayload, CominsSummaryColumnConfig, CominsSummaryColumn, CominsTableSummaryConfig } from \"./summary\";\nexport * from \"./tree\";\nexport { createCominsViewportData, reduceCominsViewportData } from \"./viewport-data\";\nexport type { CominsViewportData, CominsViewportDataOptions, CominsViewportDataEvent, CominsViewportBlock, CominsViewportRange, CominsViewportRequest, CominsViewportRequestState, CominsViewportRevision, CominsViewportPatch } from \"./viewport-data\";\nexport { useCominsViewport } from \"./use-viewport\";\nexport type { CominsViewportOptions, CominsViewportDatasource } from \"./use-viewport\";\nexport type { CominsRowHeight, CominsRowHeightParams } from \"./row-height\";\nexport type { CominsBeforeTreeRowDragPayload, CominsTreeRowDragPayload, CominsAfterTreeRowDragPayload } from \"./tree-drag\";\nexport type {\n CominsColumnFilterConfig,\n CominsColumnFilterKind,\n CominsColumnFilterModel,\n CominsColumnFilterOperator,\n CominsColumnFilterRule,\n CominsColumnFilteringConfig,\n} from \"./filtering\";\nexport { moveCominsRowGroup } from \"./grouping\";\nexport type {\n CominsRowGroupAggregation,\n CominsRowGroupDropPosition,\n CominsRowGroupMoveDetails,\n CominsRowGroupProps,\n CominsRowGroupRenderParams,\n CominsRowGroupingConfig,\n CominsRowGroupingSourceRow,\n CominsSetRowGroupIdParams,\n} from \"./grouping\";\nexport {\n createCominsTableTransferCoordinator,\n transferCominsGroupBetweenTables,\n transferCominsRowBetweenTables,\n} from \"./table-transfer\";\nexport type {\n CominsGroupBetweenTablesInput,\n CominsRowBetweenTablesInput,\n CominsTableGroupTransferDetails,\n CominsTableRowTransferDetails,\n CominsTableTransferConfig,\n CominsTableTransferConflict,\n CominsTableTransferConflictPolicy,\n CominsTableTransferConflictResolver,\n CominsTableTransferCoordinator,\n CominsTableTransferCoordinatorOptions,\n CominsTableTransferDetails,\n CominsTableTransferDropPosition,\n CominsTableTransferEndpoint,\n CominsTableTransferGroupEndpoint,\n CominsTableTransferIntent,\n CominsTableTransferResolvedConflict,\n CominsTableTransferRejection,\n CominsTableTransferRejectionFeedback,\n CominsTableTransferResult,\n CominsTableTransferRowEndpoint,\n} from \"./table-transfer\";\n\nimport type { CominsTableSummaryConfig } from \"./summary\";\nimport type { CominsTreeNode, CominsVisibleTreeRow, CominsTreeRowDragConfig, CominsTreeMoveDestination, CominsTreeDropPosition } from \"./tree\";\nimport type {\n CominsRowGroupingConfig,\n} from \"./grouping\";\nimport type {\n CominsColumnFilterKind,\n CominsColumnFilterRule,\n CominsColumnFilteringConfig,\n} from \"./filtering\";\nimport type {\n CominsTableTransferConfig,\n CominsTableTransferConflict,\n CominsTableTransferEndpoint,\n CominsTableTransferIntent,\n CominsTableTransferRejection,\n CominsTableTransferRegistrationSnapshot,\n} from \"./table-transfer\";\n\nimport type {\n CominsCellAddress,\n CominsCellRange,\n CominsCellComponent,\n CominsCellComponentPayload,\n CominsClipboardGuard,\n CominsColumnLayout,\n CominsColumnProps,\n CominsCopiedCell,\n CominsCopiedCellRange,\n CominsCopiedRow,\n CominsTableColumn,\n CominsTableColumnGroup,\n CominsTableRuntimeColumn,\n CominsTableRuntimeColumnGroup,\n CominsHeaderCell,\n CominsTableState,\n CominsTableTheme,\n CominsEventColumn,\n CominsHeaderComponent,\n CominsHeaderComponentPayload,\n CominsPaginationState,\n CominsRowId,\n CominsSelectionState,\n CominsSortModel,\n CominsSortState,\n} from \"./react/core-compat\";\n\ntype CominsClassValue = string | Record<string, boolean> | undefined;\ntype CominsRowPropValue<TData, TValue> = TValue | ((row: TData, index: number) => TValue);\ntype CominsColumnPointerInteraction = {\n active: boolean;\n blocked: boolean;\n cancelSort: boolean;\n cleanup: () => void;\n id: string;\n kind: \"column\" | \"group\";\n pointerType: string;\n startX: number;\n startY: number;\n timer: number | null;\n};\ntype CominsColumnDropStatus = \"invalid\" | \"neutral\" | \"valid\";\ntype CominsColumnMoveHeader = {\n depth: 0 | 1;\n id: string;\n kind: \"column\" | \"group\";\n parentGroupId?: string;\n};\ntype CominsColumnMoveTarget = CominsColumnMoveHeader & {\n status: CominsColumnDropStatus;\n};\ntype CominsColumnPointerOptions = {\n activateImmediately?: boolean;\n activate: (x: number, y: number) => void;\n commitTarget: (target: CominsColumnMoveHeader) => void;\n event: React.PointerEvent<HTMLElement>;\n id: string;\n kind: \"column\" | \"group\";\n resolveTarget: (target: CominsColumnMoveHeader) => CominsColumnDropStatus;\n sortColumnId?: string;\n source: CominsColumnMoveHeader;\n};\ntype CominsSuppressedSortClick = {\n cleanup: () => void;\n columnId: string;\n timer: number | null;\n};\ntype CominsRowMoveState = {\n sourceRowId: CominsRowId;\n targetDataIndex?: number;\n targetGroupId?: CominsRowId;\n targetTableId?: string;\n valid: boolean;\n};\ntype CominsRowGroupMoveState = {\n position: \"after\" | \"append\" | \"before\";\n sourceGroupId: CominsRowId;\n targetGroupId?: CominsRowId;\n targetTableId?: string;\n};\ntype CominsTransferTableHit<TData, TGroup> = {\n element: HTMLElement;\n root: HTMLElement;\n snapshot: CominsTableTransferRegistrationSnapshot<TData, TGroup>;\n};\ntype CominsCrossTableRowTarget<TData, TGroup> = CominsTransferTableHit<TData, TGroup> & {\n marker: HTMLElement;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n valid: boolean;\n};\ntype CominsCrossTableGroupTarget<TData, TGroup> = CominsTransferTableHit<TData, TGroup> & {\n marker: HTMLElement;\n position: \"after\" | \"append\" | \"before\";\n targetGroupId?: CominsRowId;\n valid: boolean;\n};\ntype CominsTransferRejectionFeedbackState = {\n content: React.ReactNode;\n x: number;\n y: number;\n};\n\nfunction isCominsGroupedTransferEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup>,\n): endpoint is CominsTableTransferEndpoint<TData, TGroup> & {\n getGroupId: (group: TGroup) => CominsRowId;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groups: readonly TGroup[];\n} {\n return (\n Array.isArray(endpoint.groups) &&\n typeof endpoint.getGroupId === \"function\" &&\n typeof endpoint.getRowGroupId === \"function\"\n );\n}\n\nfunction getCominsTransferIdentity(id: CominsRowId) {\n return `${typeof id}:${String(id)}`;\n}\n\nfunction areCominsRowDragTargetsEqual(\n left: CominsRowDragTarget | null,\n right: CominsRowDragTarget,\n) {\n return Boolean(\n left &&\n left.dataIndex === right.dataIndex &&\n left.groupId === right.groupId &&\n left.rowId === right.rowId &&\n left.tableId === right.tableId &&\n left.valid === right.valid,\n );\n}\n\nfunction getCominsColumnDropStatus(\n source: CominsColumnMoveHeader,\n target: CominsColumnMoveHeader,\n orderChanged: boolean,\n): CominsColumnDropStatus {\n if (source.id === target.id && source.kind === target.kind) {\n return \"neutral\";\n }\n\n if (source.depth !== target.depth || source.parentGroupId !== target.parentGroupId) {\n return \"invalid\";\n }\n\n return orderChanged ? \"valid\" : \"invalid\";\n}\n\nfunction selectRowForContextMenu<TData>(state: CominsTableState<TData>, rowId: CominsRowId) {\n return state.selection.rowIds.includes(rowId) ? state : selectRow(state, rowId);\n}\n\nexport type CominsTableRowProps<TData> = {\n className?: CominsRowPropValue<TData, CominsClassValue>;\n disabled?: CominsRowPropValue<TData, boolean | undefined>;\n /** Row dragging is opt-in. False or undefined hides the drag handle. */\n draggable?: CominsRowPropValue<TData, boolean | undefined>;\n style?: CominsRowPropValue<TData, React.CSSProperties | undefined>;\n};\n\nexport type CominsRowDragTarget = {\n tree?: CominsTreeMoveDestination & { position: CominsTreeDropPosition };\n dataIndex?: number;\n groupId?: CominsRowId;\n rowId?: CominsRowId;\n tableId?: string;\n valid: boolean;\n};\n\nexport type CominsBeforeRowDragPayload<TData> = {\n event: React.PointerEvent<HTMLElement>;\n row: CominsEventRow<TData>;\n sourceGroupId?: CominsRowId;\n sourceTableId?: string;\n};\n\nexport type CominsRowDragPayload<TData> = Omit<CominsBeforeRowDragPayload<TData>, \"event\"> & {\n event: PointerEvent;\n target: CominsRowDragTarget;\n};\n\nexport type CominsRowDragResult = \"cancelled\" | \"moved\" | \"rejected\";\nexport type CominsRowDragReason =\n | \"blur\"\n | \"drop\"\n | \"duplicate-id\"\n | \"escape\"\n | \"invalid-target\"\n | \"pointer-cancel\"\n | \"stale-target\"\n | \"unchanged\";\n\nexport type CominsAfterDragRowPayload<TData> = Omit<CominsBeforeRowDragPayload<TData>, \"event\"> & {\n event: PointerEvent | null;\n reason: CominsRowDragReason;\n result: CominsRowDragResult;\n target?: CominsRowDragTarget;\n};\n\nexport type CominsRowEventPayload<TData, TEvent = React.MouseEvent<HTMLTableRowElement>> = {\n event: TEvent;\n index: number;\n row: CominsEventRow<TData>;\n};\n\nexport type CominsCellEventPayload<TData, TValue = unknown, TEvent = React.MouseEvent<HTMLTableCellElement>> = {\n column: CominsEventColumn<TData, TValue>;\n event: TEvent;\n index: number;\n row: CominsEventRow<TData>;\n value: TValue;\n};\n\nexport type CominsRowKeyboardEventPayload<TData> = CominsRowEventPayload<\n TData,\n React.KeyboardEvent<HTMLTableRowElement>\n>;\n\nexport type CominsCellKeyboardEventPayload<TData, TValue = unknown> = CominsCellEventPayload<\n TData,\n TValue,\n React.KeyboardEvent<HTMLTableCellElement>\n>;\n\nexport type CominsRowDetailParams<TData> = {\n row: CominsEventRow<TData>;\n};\n\nexport type CominsRowDetailHeight = number | \"auto\";\n\nexport type CominsRowDetailProps<TData> = {\n estimatedRowDetailHeight?: number;\n expandedRowIds?: readonly CominsRowId[];\n getRowDetailHeight?: (params: CominsRowDetailParams<TData>) => CominsRowDetailHeight;\n isRowExpandable?: (params: CominsRowDetailParams<TData>) => boolean;\n onChangeExpandedRowIds?: (rowIds: CominsRowId[]) => void;\n rowDetail?: { render?: (params: CominsRowDetailParams<TData>) => React.ReactNode };\n /** @deprecated Use rowDetail.render. Retained throughout 0.x; removal target: 1.0.0. */\n renderRowDetail?: (params: CominsRowDetailParams<TData>) => React.ReactNode;\n};\n\nexport type CominsTableRef<TData = unknown> = {\n copySelection: (target?: CominsCopyTarget) => Promise<string | null>;\n fillSelection: (direction: \"down\" | \"right\") => boolean;\n getSelectedRows: () => TData[];\n getSelectedCells: () => CominsSelectedCell[];\n getSelection: () => CominsSelectionState;\n clearSort: () => void;\n expand: (nodeIds?: readonly CominsRowId[]) => void;\n expandGroups: (groupIds?: readonly CominsRowId[]) => void;\n fold: (nodeIds?: readonly CominsRowId[]) => void;\n foldGroups: (groupIds?: readonly CominsRowId[]) => void;\n getColumnLayout: () => CominsColumnLayout;\n getSortModel: () => CominsSortModel;\n getSortState: () => CominsSortState | null;\n setColumnLayout: (layout: CominsColumnLayout) => void;\n setMoveTargetRow: (targetIdx: number, sourceIdx: number) => void;\n setSelectedRow: (index: number) => void;\n setSelectedRows: (indexes: number[]) => void;\n setSortModel: (sortModel: CominsSortModel) => void;\n setSortState: (sort: CominsSortState | null) => void;\n};\n\nexport type CominsLazyLoadReason = \"initial\" | \"scroll\" | \"refresh\";\n\nexport type CominsLazyLoadRequest = {\n limit: number;\n offset: number;\n reason: CominsLazyLoadReason;\n signal: AbortSignal;\n};\n\ntype CominsFlatTableBaseProps<TData> = {\n viewportDatasource?: never;\n \"buffer-size\"?: number;\n cellSelection?: boolean;\n rowSelectionOnClick?: boolean;\n clipboard?: boolean;\n clipboardPaste?: boolean;\n fillHandle?: boolean;\n onClipboardError?: (error: Error) => void;\n className?: string;\n columnGroups?: Array<CominsTableColumnGroup>;\n columns: Array<CominsTableColumn<TData>>;\n data: readonly TData[];\n \"data-testid\"?: string;\n emptyContent?: { render?: () => React.ReactNode };\n /** @deprecated Use emptyContent.render. Retained throughout 0.x; removal target: 1.0.0. */\n emptyComponent?: React.ReactNode;\n getRowId?: (row: TData, index: number) => CominsRowId;\n hasMoreRows?: boolean;\n infiniteScroll?: boolean;\n infiniteScrollThreshold?: number;\n lazyLoad?: boolean;\n lazyLoadBatchSize?: number;\n lazyLoadMode?: \"append\";\n lazyLoadThreshold?: number;\n loading?: boolean;\n loadingContent?: { render?: () => React.ReactNode };\n /** @deprecated Use loadingContent.render. Retained throughout 0.x; removal target: 1.0.0. */\n loadingComponent?: React.ReactNode;\n loadingMore?: boolean;\n multiSort?: boolean;\n onChangeColumnLayout?: (layout: CominsColumnLayout) => void;\n onChangeData?: (data: TData[]) => void;\n onChangeSelection?: (selection: CominsSelectionState) => void;\n onChangeSort?: (sort: CominsSortState | null) => void;\n onChangeSortModel?: (sortModel: CominsSortModel) => void;\n onClickCell?: (payload: CominsCellEventPayload<TData>) => void;\n onClickRow?: (payload: CominsRowEventPayload<TData>) => void;\n onContextMenuCell?: (payload: CominsCellEventPayload<TData>) => void;\n onContextMenuRow?: (payload: CominsRowEventPayload<TData>) => void;\n onDoubleClickCell?: (payload: CominsCellEventPayload<TData>) => void;\n onDoubleClickRow?: (payload: CominsRowEventPayload<TData>) => void;\n onKeyDownCell?: (payload: CominsCellKeyboardEventPayload<TData>) => void;\n onKeyDownRow?: (payload: CominsRowKeyboardEventPayload<TData>) => void;\n onLazyLoad?: (request: CominsLazyLoadRequest) => Promise<void> | void;\n onLoadMore?: () => void;\n onAfterDragRow?: (payload: CominsAfterDragRowPayload<TData>) => void;\n onBeforeRowDrag?: (payload: CominsBeforeRowDragPayload<TData>) => boolean | void;\n onRowDrag?: (payload: CominsRowDragPayload<TData>) => void;\n pagination?: Partial<CominsPaginationState>;\n persistHeaderWhenEmpty?: boolean;\n rowHeight?: number;\n getRowHeight?: (params: CominsRowHeightParams<TData>) => CominsRowHeight | undefined;\n estimatedRowHeight?: number;\n rowProps?: CominsTableRowProps<TData>;\n showColumnMoveHandle?: boolean;\n showHeader?: boolean;\n skeletonRowCount?: number;\n style?: React.CSSProperties;\n summary?: CominsTableSummaryConfig<TData>;\n theme?: CominsTableTheme;\n tree?: false;\n treeSlots?: never;\n virtualized?: boolean;\n};\n\ntype CominsUngroupedTableWithoutTransferProps<TData> = CominsFlatTableBaseProps<TData> & {\n columnFiltering?: undefined;\n rowGrouping?: undefined;\n tableTransfer?: undefined;\n};\n\ntype CominsTransferableUngroupedTableProps<TData> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n> & {\n columnFiltering?: undefined;\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n rowGrouping?: undefined;\n tableTransfer: CominsTableTransferConfig<TData>;\n};\n\ntype CominsUngroupedTableProps<TData> =\n | CominsTransferableUngroupedTableProps<TData>\n | CominsUngroupedTableWithoutTransferProps<TData>;\n\ntype CominsNonDraggableRowProps<TData> = Omit<CominsTableRowProps<TData>, \"draggable\"> & {\n draggable?: never;\n};\n\ntype CominsFilteredTableProps<TData> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n | \"rowProps\"\n> & {\n columnFiltering: CominsColumnFilteringConfig;\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n rowGrouping?: undefined;\n rowProps?: CominsNonDraggableRowProps<TData>;\n tableTransfer?: never;\n};\n\ntype CominsGroupedTableBaseProps<TData, TGroup> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n | \"pagination\"\n> & {\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n pagination?: never;\n rowGrouping: CominsRowGroupingConfig<TData, TGroup>;\n tableTransfer?: CominsTableTransferConfig<TData, TGroup>;\n};\n\ntype CominsGroupedTableProps<TData, TGroup> = CominsGroupedTableBaseProps<TData, TGroup> & {\n columnFiltering?: undefined;\n};\n\ntype CominsFilteredGroupedTableProps<TData, TGroup> = Omit<\n CominsGroupedTableBaseProps<TData, TGroup>,\n \"rowProps\"\n> & {\n columnFiltering: CominsColumnFilteringConfig;\n rowProps?: CominsNonDraggableRowProps<TData>;\n tableTransfer?: never;\n};\n\nexport type CominsTableProps<TData, TGroup = unknown> = (\n | CominsFilteredGroupedTableProps<TData, TGroup>\n | CominsFilteredTableProps<TData>\n | CominsGroupedTableProps<TData, TGroup>\n | CominsUngroupedTableProps<TData>\n) & CominsRowDetailProps<TData>;\n\nexport type CominsTreeSlotParams<TData> = CominsVisibleTreeRow<TData> & {\n defaultContent: React.ReactNode;\n};\n\nexport type CominsTreeSlots<TData> = {\n /** Prefer { render }. Direct callbacks remain in 0.x; removal target: 1.0.0. */\n leading?: ((params: CominsTreeSlotParams<TData>) => React.ReactNode) | { render?: (params: CominsTreeSlotParams<TData>) => React.ReactNode };\n /** Prefer { render }. Direct callbacks remain in 0.x; removal target: 1.0.0. */\n content?: ((params: CominsTreeSlotParams<TData>) => React.ReactNode) | { render?: (params: CominsTreeSlotParams<TData>) => React.ReactNode };\n /** Prefer { render }. Direct callbacks remain in 0.x; removal target: 1.0.0. */\n trailing?: ((params: CominsTreeSlotParams<TData>) => React.ReactNode) | { render?: (params: CominsTreeSlotParams<TData>) => React.ReactNode };\n};\n\nexport type CominsTreeTableProps<TData> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"data\"\n | \"columnFiltering\"\n | \"getRowId\"\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onChangeData\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n | \"onAfterDragRow\"\n | \"onBeforeRowDrag\"\n | \"onRowDrag\"\n | \"pagination\"\n | \"rowProps\"\n | \"rowGrouping\"\n | \"tableTransfer\"\n | \"estimatedRowDetailHeight\"\n | \"expandedRowIds\"\n | \"getRowDetailHeight\"\n | \"isRowExpandable\"\n | \"onChangeExpandedRowIds\"\n | \"renderRowDetail\"\n | \"rowDetail\"\n | \"tree\"\n | \"treeSlots\"\n> & {\n data: readonly CominsTreeNode<TData>[];\n columnFiltering?: never;\n defaultExpandAll?: boolean;\n getRowId: (item: TData, index: number) => CominsRowId;\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onChangeData?: (data: CominsTreeNode<TData>[]) => void;\n onLazyLoad?: never;\n onLoadMore?: never;\n onAfterDragRow?: (payload: CominsAfterTreeRowDragPayload<TData>) => void;\n onBeforeRowDrag?: (payload: CominsBeforeTreeRowDragPayload<TData>) => boolean | void;\n onRowDrag?: (payload: CominsTreeRowDragPayload<TData>) => void;\n pagination?: never;\n rowProps?: CominsTableRowProps<TData>;\n treeRowDrag?: CominsTreeRowDragConfig<TData>;\n treeSlots?: CominsTreeSlots<TData>;\n estimatedRowDetailHeight?: never;\n expandedRowIds?: never;\n getRowDetailHeight?: never;\n isRowExpandable?: never;\n onChangeExpandedRowIds?: never;\n renderRowDetail?: never;\n rowDetail?: never;\n rowGrouping?: never;\n tableTransfer?: never;\n tree: true;\n};\n\ntype VisibleRowEntry<TData> = {\n absoluteIndex?: number;\n dataIndex: number;\n row: TData;\n rowId: CominsRowId;\n visibleIndex: number;\n};\n\ntype CominsVirtualWindow<TData> = {\n mixed: boolean;\n renderOffset: number;\n scrollHeight: number;\n slots: Array<CominsVirtualSlot<TData>>;\n};\n\ntype CominsMixedVirtualProjection<TData> = {\n heightIndex: CominsHeightIndex;\n keys: string[];\n slotIndexByRowId: Map<CominsRowId, number>;\n slots: Array<CominsVirtualSlot<TData>>;\n};\n\ntype CominsCommittedDetailObserverSnapshot<TData> = Readonly<{\n rowLayoutKey: string;\n rowContentRevision: object;\n rowSlots: ReadonlyMap<CominsRowId, CominsDataVirtualSlot<TData>>;\n contentWidth: number;\n projection: CominsMixedVirtualProjection<TData> | null;\n viewportHeight: number;\n}>;\n\ntype CominsVirtualProjection = {\n keys: readonly string[];\n mixed: false;\n rowHeight: number;\n visibleRowCount: number;\n} | {\n heightIndex: CominsHeightIndex;\n keys: readonly string[];\n mixed: true;\n};\n\ntype CominsPendingVirtualAnchor = {\n anchor: CominsScrollAnchor;\n previousKeys: readonly string[];\n previousLogicalScrollTop: number;\n previousPhysicalScrollTop: number;\n previousViewportHeight: number;\n};\n\ntype CominsPendingDetailAnchor = CominsPendingVirtualAnchor & {\n revision: number;\n status: \"cancelled\" | \"pending\";\n};\n\ntype CominsLogicalAnchorTransaction = {\n actualPhysical: number;\n requestedPhysical: number;\n revision: number;\n targetLogical: number;\n};\n\ntype CominsObservedDetail = {\n element: HTMLElement;\n rowId: CominsRowId;\n kind?: \"row\";\n};\n\ntype CominsTreeRenderContext<TData> = {\n drag: ReturnType<typeof useCominsTreeDrag<TData>>;\n entriesByRowId: Map<CominsRowId, CominsVisibleTreeRow<TData>>;\n onExpand: (nodeIds?: readonly CominsRowId[]) => void;\n onFold: (nodeIds?: readonly CominsRowId[]) => void;\n onToggle: (rowId: CominsRowId) => void;\n summaryRows: readonly TData[];\n treeColumnId: string | null;\n slots?: CominsTreeSlots<TData>;\n};\n\ntype CominsTableInnerProps<TData, TGroup = unknown> = CominsFlatTableBaseProps<TData> & CominsRowDetailProps<TData> & {\n viewportContext?: {\n data: CominsViewportData<TData>;\n indices: readonly number[];\n config: CominsViewportDatasource;\n onRequest: (request: CominsViewportRequest) => void | Promise<void>;\n onChangeData?: (data: CominsViewportData<TData>) => void;\n };\n columnFiltering?: CominsColumnFilteringConfig;\n rowGrouping?: CominsRowGroupingConfig<TData, TGroup>;\n tableTransfer?:\n | CominsTableTransferConfig<TData, TGroup>\n | CominsTableTransferConfig<TData, never>;\n treeContext?: CominsTreeRenderContext<TData>;\n};\n\nfunction getCominsVirtualProjectionKeys(projection: CominsVirtualProjection) {\n if (projection.mixed) {\n return projection.keys;\n }\n\n return projection.keys;\n}\n\nfunction captureCominsVirtualAnchor(input: {\n logicalScrollTop?: number;\n physicalScrollTop: number;\n projection: CominsVirtualProjection;\n viewportHeight: number;\n}): CominsPendingVirtualAnchor | undefined {\n const previousKeys = getCominsVirtualProjectionKeys(input.projection);\n const previousLogicalScrollTop =\n input.logicalScrollTop ??\n (input.projection.mixed\n ? getCominsMixedVirtualRange({\n heightIndex: input.projection.heightIndex,\n overscan: 0,\n physicalScrollTop: input.physicalScrollTop,\n viewportHeight: input.viewportHeight,\n }).logicalScrollTop\n : (() => {\n const metrics = getCominsScrollScale(\n input.projection.visibleRowCount * input.projection.rowHeight,\n input.viewportHeight,\n );\n\n return Math.min(\n metrics.logicalScrollableHeight,\n Math.max(0, input.physicalScrollTop) * metrics.scrollScale,\n );\n })());\n const anchor = input.projection.mixed\n ? captureCominsScrollAnchor({\n heightIndex: input.projection.heightIndex,\n keys: previousKeys,\n logicalScrollTop: previousLogicalScrollTop,\n })\n : (() => {\n if (input.projection.visibleRowCount === 0) {\n return undefined;\n }\n\n const previousIndex = Math.min(\n input.projection.visibleRowCount - 1,\n Math.floor(previousLogicalScrollTop / input.projection.rowHeight),\n );\n const key = previousKeys[previousIndex];\n\n return key === undefined\n ? undefined\n : {\n key,\n offsetWithinSlot:\n previousLogicalScrollTop - previousIndex * input.projection.rowHeight,\n previousIndex,\n };\n })();\n\n return anchor\n ? {\n anchor,\n previousKeys,\n previousLogicalScrollTop,\n previousPhysicalScrollTop: input.physicalScrollTop,\n previousViewportHeight: input.viewportHeight,\n }\n : undefined;\n}\n\nfunction toClassName(value: CominsClassValue) {\n if (!value || typeof value === \"string\") {\n return value;\n }\n\n return Object.entries(value)\n .filter(([, enabled]) => enabled)\n .map(([className]) => className)\n .join(\" \");\n}\n\nfunction resolveRowProp<TData, TValue>(\n value: CominsRowPropValue<TData, TValue> | undefined,\n row: TData,\n index: number,\n) {\n return typeof value === \"function\" ? (value as (row: TData, index: number) => TValue)(row, index) : value;\n}\n\nfunction resolveRowProps<TData>(\n rowProps: CominsTableRowProps<TData> | undefined,\n row: TData,\n index: number,\n) {\n const disabled = resolveRowProp(rowProps?.disabled, row, index) === true;\n\n return {\n className: toClassName(resolveRowProp(rowProps?.className, row, index)),\n disabled,\n draggable: !disabled && resolveRowProp(rowProps?.draggable, row, index) === true,\n style: resolveRowProp(rowProps?.style, row, index),\n };\n}\n\nfunction getRowCustomBackground(style: React.CSSProperties | undefined) {\n const background = style?.background ?? style?.backgroundColor;\n\n return typeof background === \"string\" || typeof background === \"number\" ? background : undefined;\n}\n\nfunction getResolvedRowStyle(\n rowHeight: number,\n style: React.CSSProperties | undefined,\n customBackground: string | number | undefined,\n) {\n const resolvedStyle = { height: rowHeight, ...style };\n\n if (customBackground === undefined) {\n return resolvedStyle;\n }\n\n return {\n ...resolvedStyle,\n \"--comins-table-row-custom-background\": customBackground,\n } as React.CSSProperties;\n}\n\nfunction createEventRow<TData>(entry: VisibleRowEntry<TData>): CominsEventRow<TData> {\n return {\n data: entry.row,\n dataIndex: entry.absoluteIndex ?? entry.dataIndex,\n id: entry.rowId,\n index: entry.visibleIndex,\n };\n}\n\nfunction createEventColumn<TData>(\n column: CominsTableRuntimeColumn<TData>,\n index: number,\n): CominsEventColumn<TData> {\n return {\n definition: column,\n field: column.field,\n id: column.id,\n index,\n label: column.label,\n };\n}\n\nfunction createRowPayload<TData, TEvent>(\n event: TEvent,\n entry: VisibleRowEntry<TData>,\n): CominsRowEventPayload<TData, TEvent> {\n return {\n event,\n index: entry.visibleIndex,\n row: createEventRow(entry),\n };\n}\n\nfunction createCellPayload<TData, TEvent>(\n event: TEvent,\n entry: VisibleRowEntry<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n value: unknown,\n): CominsCellEventPayload<TData, unknown, TEvent> {\n return {\n column: createEventColumn(column, columnIndex),\n event,\n index: entry.visibleIndex,\n row: createEventRow(entry),\n value,\n };\n}\n\nfunction createComponentColumnPayload<TData>(\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n): CominsCellComponentPayload<TData>[\"column\"] {\n return {\n definition: column,\n field: column.field,\n id: column.id,\n index: columnIndex,\n label: column.label,\n };\n}\n\nfunction createCellComponentPayload<TData>(\n entry: VisibleRowEntry<TData>,\n rowDisabled: boolean,\n rowSelected: boolean,\n selectedRowCount: number,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n value: unknown,\n): CominsCellComponentPayload<TData> {\n return {\n column: createComponentColumnPayload(column, columnIndex),\n row: {\n data: entry.row,\n dataIndex: entry.absoluteIndex ?? entry.dataIndex,\n disabled: rowDisabled,\n id: entry.rowId,\n index: entry.visibleIndex,\n selected: rowSelected,\n },\n selection: {\n selectedRowCount,\n },\n value,\n };\n}\n\nfunction resolveRenderableCellProps<TData>(\n column: CominsTableRuntimeColumn<TData>,\n payload: CominsCellComponentPayload<TData>,\n): CominsColumnProps<TData> | undefined {\n const props = column.cell?.props;\n\n return typeof props === \"function\" ? props(payload) : props;\n}\n\nfunction stopTreeSlotControlEvent(event: React.SyntheticEvent<HTMLElement>) {\n const target = event.target instanceof Element ? event.target : null;\n const label = target?.closest(\"label\");\n const control = (label?.control ? label : null)\n ?? target?.closest('input, textarea, select, button, a[href], [contenteditable]:not([contenteditable=\"false\"]), [tabindex], [role=\"button\"], [role=\"checkbox\"], [role=\"switch\"], [role=\"menuitem\"]');\n if (target && control && (event.currentTarget.contains(control) || !event.currentTarget.contains(target))) {\n event.stopPropagation();\n }\n}\n\nfunction resolveDefaultRender(content: React.ReactNode, defaultContent: React.ReactNode): React.ReactNode {\n return content === undefined ? defaultContent : content;\n}\n\nfunction resolveTreeSlotContent<TData>(slot: NonNullable<CominsTreeSlots<TData>[\"content\"]>, params: CominsTreeSlotParams<TData>, defaultContent?: React.ReactNode): React.ReactNode {\n return typeof slot === \"function\" ? slot(params) : resolveDefaultRender(slot.render?.(params), defaultContent);\n}\n\nfunction renderTreeSlot(name: \"leading\" | \"content\" | \"trailing\", content: React.ReactNode) {\n if (content == null || typeof content === \"boolean\") return null;\n return (\n <span className={`comins-tree-slot comins-tree-slot--${name}`} data-comins-tree-slot={name}\n onClick={stopTreeSlotControlEvent} onDoubleClick={stopTreeSlotControlEvent}\n onContextMenu={stopTreeSlotControlEvent} onMouseDown={stopTreeSlotControlEvent}\n onPointerDown={stopTreeSlotControlEvent} onKeyDown={stopTreeSlotControlEvent}\n onKeyUp={stopTreeSlotControlEvent} onCopy={stopTreeSlotControlEvent}\n onPaste={stopTreeSlotControlEvent}>\n {content}\n </span>\n );\n}\n\nfunction resolveRenderableCellGuard<TData>(\n guard: CominsClipboardGuard<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n if (guard === undefined) {\n return true;\n }\n\n return typeof guard === \"boolean\" ? guard : guard(payload);\n}\n\nfunction isRenderableCellDisabled<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n return props?.disabled !== undefined && resolveRenderableCellGuard(props.disabled, payload) === true;\n}\n\nfunction getRenderableCellClassName<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n const className = props?.className;\n\n return typeof className === \"function\" ? className(payload) : className;\n}\n\nfunction getRenderableCellStyle<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n const style = props?.style;\n\n return typeof style === \"function\" ? style(payload) : style;\n}\n\nfunction formatRenderableCellValue<TData>(\n column: CominsTableRuntimeColumn<TData>,\n rawValue: unknown,\n payload: CominsCellComponentPayload<TData>,\n) {\n if (column.cell?.format) {\n return column.cell.format(payload);\n }\n\n return rawValue == null ? \"\" : String(rawValue);\n}\n\nfunction createHeaderComponentPayload<TData>(\n state: CominsTableState<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n): CominsHeaderComponentPayload<TData> {\n const columnState = state.columnState[column.id];\n const sortRule = getSortRule(state.sortModel, column.id);\n\n return {\n column: createComponentColumnPayload(column, columnIndex),\n layout: {\n hidden: columnState?.hidden === true || column.hidden === true,\n width: columnState?.width ?? column.width,\n },\n sort: {\n count: state.sortModel.length,\n direction: sortRule?.rule.direction ?? null,\n enabled: Boolean(column.sort),\n priority: sortRule?.priority ?? null,\n },\n };\n}\n\ntype CominsRenderableComponent<TData> = CominsCellComponent<TData> | CominsHeaderComponent<TData>;\ntype CominsRenderablePayload<TData> = CominsCellComponentPayload<TData> | CominsHeaderComponentPayload<TData>;\n\nfunction isCominsCellComponentPayload<TData>(\n payload: CominsRenderablePayload<TData>,\n): payload is CominsCellComponentPayload<TData> {\n return \"row\" in payload && \"selection\" in payload;\n}\n\nfunction shouldRenderCominsComponent<TData>(\n component: CominsRenderableComponent<TData>,\n payload: CominsRenderablePayload<TData>,\n) {\n if (!isCominsCellComponentPayload(payload) || (component.type !== \"input\" && component.type !== \"select\")) {\n return true;\n }\n\n return payload.selection.selectedRowCount === 1 && payload.row.selected;\n}\n\nfunction getRenderableCominsComponents<TData>(\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n) {\n return (components ?? []).filter((component) => shouldRenderCominsComponent(component, payload));\n}\n\nfunction renderCominsComponentSlots<TData>(\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n direction: \"left\" | \"right\",\n interaction?: CominsBuiltInComponentInteraction,\n) {\n return getRenderableCominsComponents(components, payload)\n .map((component, index) => ({ component, index }))\n .filter(({ component }) => (component.direction ?? \"left\") === direction)\n .map(({ component, index }) => (\n <span\n className=\"comins-table__component-slot\"\n data-comins-component-align={component.align ?? \"center\"}\n data-comins-component-direction={direction}\n data-comins-component-id={component.id ?? `${component.type}-${index}`}\n key={component.id ?? `${component.type}-${index}`}\n >\n {renderCominsBuiltInComponent(component as never, payload as never, interaction)}\n </span>\n ));\n}\n\nfunction blockCominsColumnPlaceholderInteraction(event: React.SyntheticEvent<HTMLElement>) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nfunction blurCominsColumnPlaceholderFocus(event: React.FocusEvent<HTMLElement>) {\n event.stopPropagation();\n\n if (event.target instanceof HTMLElement) {\n event.target.blur();\n }\n}\n\nconst cominsColumnPlaceholderNativeBoundaries = new WeakSet<HTMLElement>();\n\nfunction bindCominsColumnPlaceholderNativeBoundary(element: HTMLElement | null) {\n if (!element || cominsColumnPlaceholderNativeBoundaries.has(element)) {\n return;\n }\n\n const blockActiveInput = (event: Event) => {\n if (element.hasAttribute(\"inert\") && element.getAttribute(\"aria-hidden\") === \"true\") {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n element.addEventListener(\"change\", blockActiveInput, true);\n element.addEventListener(\"input\", blockActiveInput, true);\n cominsColumnPlaceholderNativeBoundaries.add(element);\n}\n\nconst COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS = {\n onBeforeInputCapture: blockCominsColumnPlaceholderInteraction,\n onBlurCapture: blockCominsColumnPlaceholderInteraction,\n onChangeCapture: blockCominsColumnPlaceholderInteraction,\n onClickCapture: blockCominsColumnPlaceholderInteraction,\n onContextMenuCapture: blockCominsColumnPlaceholderInteraction,\n onDoubleClickCapture: blockCominsColumnPlaceholderInteraction,\n onFocusCapture: blurCominsColumnPlaceholderFocus,\n onInputCapture: blockCominsColumnPlaceholderInteraction,\n onKeyDownCapture: blockCominsColumnPlaceholderInteraction,\n onKeyPressCapture: blockCominsColumnPlaceholderInteraction,\n onKeyUpCapture: blockCominsColumnPlaceholderInteraction,\n onMouseDownCapture: blockCominsColumnPlaceholderInteraction,\n onMouseMoveCapture: blockCominsColumnPlaceholderInteraction,\n onMouseOutCapture: blockCominsColumnPlaceholderInteraction,\n onMouseOverCapture: blockCominsColumnPlaceholderInteraction,\n onMouseUpCapture: blockCominsColumnPlaceholderInteraction,\n onPointerCancelCapture: blockCominsColumnPlaceholderInteraction,\n onPointerDownCapture: blockCominsColumnPlaceholderInteraction,\n onPointerMoveCapture: blockCominsColumnPlaceholderInteraction,\n onPointerOutCapture: blockCominsColumnPlaceholderInteraction,\n onPointerOverCapture: blockCominsColumnPlaceholderInteraction,\n onPointerUpCapture: blockCominsColumnPlaceholderInteraction,\n onResetCapture: blockCominsColumnPlaceholderInteraction,\n onScrollCapture: blockCominsColumnPlaceholderInteraction,\n onSubmitCapture: blockCominsColumnPlaceholderInteraction,\n onTouchCancelCapture: blockCominsColumnPlaceholderInteraction,\n onTouchEndCapture: blockCominsColumnPlaceholderInteraction,\n onTouchMoveCapture: blockCominsColumnPlaceholderInteraction,\n onTouchStartCapture: blockCominsColumnPlaceholderInteraction,\n onWheelCapture: blockCominsColumnPlaceholderInteraction,\n} satisfies React.HTMLAttributes<HTMLElement>;\n\nfunction getCominsColumnPlaceholderText(label: React.ReactNode, fallback: string): string {\n const collectPlainText = (node: React.ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node);\n }\n\n if (Array.isArray(node)) {\n return node.map(collectPlainText).join(\"\");\n }\n\n if (isValidElement<{ children?: React.ReactNode }>(node) && typeof node.type === \"string\") {\n return collectPlainText(node.props.children);\n }\n\n return \"\";\n };\n const plainText = collectPlainText(label).trim();\n\n return plainText || fallback;\n}\n\nfunction renderCominsContentWithComponents<TData>(\n content: React.ReactNode,\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n options: {\n interaction?: CominsBuiltInComponentInteraction;\n showContent?: boolean;\n } = {},\n) {\n if (!components?.length) {\n return content;\n }\n\n const showContent = options.showContent ?? true;\n const renderableComponents = getRenderableCominsComponents(components, payload);\n\n if (!renderableComponents.length) {\n return content;\n }\n\n const leftSlots = renderCominsComponentSlots(renderableComponents, payload, \"left\", options.interaction);\n const rightSlots = renderCominsComponentSlots(renderableComponents, payload, \"right\", options.interaction);\n\n if (!showContent) {\n return (\n <span className=\"comins-table__component-layout\" data-comins-component-only=\"true\">\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"all\">\n {leftSlots}\n {rightSlots}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"comins-table__component-layout\">\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"left\">\n {leftSlots}\n </span>\n <span className=\"comins-table__component-content\">{content}</span>\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"right\">\n {rightSlots}\n </span>\n </span>\n );\n}\n\n\nfunction setCominsTreeExpansion<TData>(\n data: readonly CominsTreeNode<TData>[],\n nodeIds: readonly CominsRowId[] | undefined,\n expanded: boolean,\n getRowId: (item: TData, index: number) => CominsRowId,\n defaultExpandAll: boolean,\n): readonly CominsTreeNode<TData>[] {\n if (nodeIds?.length === 0) {\n return data;\n }\n\n type ExpansionEntry = {\n ancestorIds: readonly CominsRowId[];\n hasChildren: boolean;\n node: CominsTreeNode<TData>;\n rowId: CominsRowId;\n };\n\n const entries: ExpansionEntry[] = [];\n const idByNode = new Map<CominsTreeNode<TData>, CominsRowId>();\n let itemIndex = 0;\n\n const visit = (nodes: readonly CominsTreeNode<TData>[], ancestorIds: readonly CominsRowId[]) => {\n nodes.forEach((node) => {\n const rowId = getRowId(node.item, itemIndex);\n const hasChildren = Boolean(node.children?.length);\n itemIndex += 1;\n entries.push({ ancestorIds, hasChildren, node, rowId });\n idByNode.set(node, rowId);\n\n if (node.children?.length) {\n visit(node.children, [...ancestorIds, rowId]);\n }\n });\n };\n\n visit(data, []);\n\n const requestedIds = nodeIds ? new Set(nodeIds) : null;\n const targets = entries.filter((entry) => entry.hasChildren && (!requestedIds || requestedIds.has(entry.rowId)));\n const requestedBranchIds = new Set(targets.map((entry) => entry.rowId));\n const expandedById = new Map(\n entries.map((entry) => [entry.rowId, entry.node.expand ?? defaultExpandAll] as const),\n );\n const changes = new Map<CominsRowId, boolean>();\n\n targets.forEach((entry) => {\n const ancestorsAllowExpand =\n !expanded ||\n !requestedIds ||\n entry.ancestorIds.every((ancestorId) => expandedById.get(ancestorId) === true || requestedBranchIds.has(ancestorId));\n const currentExpanded = entry.node.expand ?? defaultExpandAll;\n\n if (ancestorsAllowExpand && currentExpanded !== expanded) {\n changes.set(entry.rowId, expanded);\n }\n });\n\n if (changes.size === 0) {\n return data;\n }\n\n const applyChanges = (nodes: readonly CominsTreeNode<TData>[]): readonly CominsTreeNode<TData>[] => {\n let changed = false;\n const nextNodes = nodes.map((node) => {\n const rowId = idByNode.get(node);\n const nextExpanded = rowId === undefined ? undefined : changes.get(rowId);\n const nextChildren = node.children ? applyChanges(node.children) : node.children;\n\n if (nextExpanded === undefined && nextChildren === node.children) {\n return node;\n }\n\n changed = true;\n return {\n ...node,\n children: nextChildren,\n ...(nextExpanded === undefined ? {} : { expand: nextExpanded }),\n };\n });\n\n return changed ? nextNodes : nodes;\n };\n\n return applyChanges(data);\n}\n\nfunction CominsTableInner<TData, TGroup>(\n {\n \"buffer-size\": bufferSize,\n cellSelection = true,\n rowSelectionOnClick = true,\n clipboard = false,\n clipboardPaste = false,\n fillHandle = false,\n onClipboardError,\n className,\n columnFiltering,\n columnGroups,\n columns,\n data,\n \"data-testid\": dataTestId,\n emptyComponent,\n emptyContent,\n estimatedRowDetailHeight,\n estimatedRowHeight,\n getRowHeight,\n expandedRowIds,\n getRowDetailHeight,\n getRowId,\n hasMoreRows = false,\n infiniteScroll = false,\n infiniteScrollThreshold = 160,\n lazyLoad = false,\n lazyLoadBatchSize = 30,\n lazyLoadMode = \"append\",\n lazyLoadThreshold,\n loading = false,\n loadingComponent,\n loadingContent,\n loadingMore = false,\n multiSort = false,\n onChangeColumnLayout,\n onChangeData,\n onChangeSelection,\n onChangeSort,\n onChangeSortModel,\n onClickCell,\n onClickRow,\n onContextMenuCell,\n onContextMenuRow,\n onChangeExpandedRowIds,\n onDoubleClickCell,\n onDoubleClickRow,\n onKeyDownCell,\n onKeyDownRow,\n onLazyLoad,\n onLoadMore,\n onAfterDragRow,\n onBeforeRowDrag,\n onRowDrag,\n pagination,\n persistHeaderWhenEmpty = true,\n rowHeight: providedRowHeight = 36,\n rowGrouping,\n rowProps,\n isRowExpandable,\n renderRowDetail,\n rowDetail,\n showColumnMoveHandle = true,\n showHeader = true,\n skeletonRowCount,\n style,\n summary,\n tableTransfer,\n theme,\n treeContext,\n viewportContext,\n virtualized = false,\n }: CominsTableInnerProps<TData, TGroup>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n const rowHeight = normalizeCominsRowHeight(providedRowHeight);\n const [detailFocusRestorer] = useState(createCominsDetailFocusRestorer);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const footerRef = useRef<HTMLDivElement | null>(null);\n const headerRef = useRef<HTMLDivElement | null>(null);\n const horizontalScrollbarRef = useRef<HTMLDivElement | null>(null);\n const tableRootRef = useRef<HTMLDivElement | null>(null);\n const cellTooltip = useCominsCellTooltip();\n let activeCellTooltipContent: React.ReactNode;\n const copiedCellRef = useRef<CominsCopiedCell | null>(null);\n const copiedRangeRef = useRef<CominsCopiedCellRange | null>(null);\n const copiedRowRef = useRef<CominsCopiedRow<TData> | null>(null);\n const detailMeasurementsRef = useRef(\n new Map<CominsRowId, CominsDetailMeasurement>(),\n );\n const rowMeasurementsRef = useRef(new Map<CominsRowId, CominsRowMeasurement<TData>>());\n const committedViewportIndexRef = useRef<{ key: object; index: CominsViewportHeightIndex } | null>(null);\n const viewportMeasurementAnchorRef = useRef<{ index: number; offset: number } | null>(null);\n const detailElementsRef = useRef(\n new Map<Element, CominsObservedDetail>(),\n );\n const fallbackMeasuredDetailElementsRef = useRef(new Set<Element>());\n const detailObserverRef = useRef<ReturnType<typeof createMeasurementObserver> | null>(null);\n const committedDetailObserverSnapshotRef = useRef<\n CominsCommittedDetailObserverSnapshot<TData> | null\n >(null);\n const rowDetailToggleElementsRef = useRef(new Map<CominsRowId, HTMLButtonElement>());\n const activePointerGestureCleanupRef = useRef<(() => void) | null>(null);\n const columnPointerInteractionRef = useRef<CominsColumnPointerInteraction | null>(null);\n const columnMoveAnimationCleanupRef = useRef<(() => void) | null>(null);\n const columnMoveAnimationSnapshotRef = useRef<Map<HTMLElement, number> | null>(null);\n const headerRendererBodyRef = useRef(new Map<string, { body: React.ReactNode; renderer: unknown; kind: \"render\" | \"legacy\" }>());\n const lastCellAnchorRef = useRef<CominsCellAddress | null>(null);\n const lazyAbortControllerRef = useRef<AbortController | null>(null);\n const lazyLoadingReasonRef = useRef<CominsLazyLoadReason | null>(null);\n const onLazyLoadRef = useRef(onLazyLoad);\n const lazyRequestIdRef = useRef(0);\n const lastLoadMoreRowCountRef = useRef<number | null>(null);\n const lastRowAnchorRef = useRef<CominsRowId | null>(null);\n const rangeDragAnchorRef = useRef<CominsCellAddress | null>(null);\n const rangeDragLastAddressRef = useRef<CominsCellAddress | null>(null);\n const rangeDragMovedRef = useRef(false);\n const rowMoveStateRef = useRef<CominsRowMoveState | null>(null);\n const pendingRowMoveScrollTopRef = useRef<number | null>(null);\n const rowGroupMoveStateRef = useRef<CominsRowGroupMoveState | null>(null);\n const transferSnapshotRef = useRef<\n CominsTableTransferRegistrationSnapshot<TData, TGroup> | null\n >(null);\n const externalDropMarkerRef = useRef<HTMLElement | null>(null);\n const transferRejectionTargetRef = useRef<HTMLElement | null>(null);\n const transferRejectionTimerRef = useRef<number | null>(null);\n const pendingTransferFocusFrameRef = useRef<number | null>(null);\n const groupDisclosureElementsRef = useRef(new Map<CominsRowId, HTMLButtonElement>());\n const pendingGroupDisclosureFocusRef = useRef<CominsRowId | null>(null);\n const focusedLeafDataIndexRef = useRef<number | null>(null);\n const previousGroupedDataIndexesRef = useRef<ReadonlySet<number> | null>(null);\n const anchorRevisionRef = useRef(0);\n const logicalAnchorTransactionRef = useRef<CominsLogicalAnchorTransaction | null>(null);\n const pendingDetailAnchorRef = useRef<CominsPendingDetailAnchor | null>(null);\n const pendingScrollTopRef = useRef(0);\n const previousVirtualProjectionRef = useRef<CominsVirtualProjection | null>(null);\n const scrollCommitTimeoutRef = useRef<number | null>(null);\n const scrollFrameRef = useRef<number | null>(null);\n const suppressedSortClickRef = useRef<CominsSuppressedSortClick | null>(null);\n const [containerHeight, setContainerHeight] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n const [horizontalScrollContentWidth, setHorizontalScrollContentWidth] = useState(0);\n const [horizontalViewportOuterWidth, setHorizontalViewportOuterWidth] = useState(0);\n const [horizontalViewportWidth, setHorizontalViewportWidth] = useState(0);\n const [detailLayoutVersion, setDetailLayoutVersion] = useState(0);\n const [rowFontRevision, setRowFontRevision] = useState(0);\n const [movingColumnId, setMovingColumnId] = useState<string | null>(null);\n const [movingGroupId, setMovingGroupId] = useState<string | null>(null);\n const [columnMovePointer, setColumnMovePointer] = useState<{ x: number; y: number } | null>(null);\n const [columnMoveTarget, setColumnMoveTarget] = useState<CominsColumnMoveTarget | null>(null);\n const [logicalAnchorTransaction, setLogicalAnchorTransaction] =\n useState<CominsLogicalAnchorTransaction | null>(null);\n const [resizingColumnId, setResizingColumnId] = useState<string | null>(null);\n const [rowMoveState, setRowMoveState] = useState<CominsRowMoveState | null>(null);\n const [rowGroupMoveState, setRowGroupMoveState] = useState<CominsRowGroupMoveState | null>(null);\n const [transferRejectionFeedback, setTransferRejectionFeedback] =\n useState<CominsTransferRejectionFeedbackState | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const tableInstanceId = useId();\n const rowDetailIdPrefix = useId();\n const effectiveData = data;\n const groupingRequested =\n !treeContext &&\n rowGrouping !== null &&\n typeof rowGrouping === \"object\" &&\n rowGrouping !== undefined &&\n Array.isArray(rowGrouping.groups) &&\n typeof rowGrouping.getGroupId === \"function\" &&\n typeof rowGrouping.getRowGroupId === \"function\";\n const filteringRequested =\n !treeContext &&\n columnFiltering !== null &&\n typeof columnFiltering === \"object\" &&\n columnFiltering !== undefined &&\n Array.isArray(columnFiltering.model);\n const normalizedTableTransfer =\n !treeContext &&\n !filteringRequested &&\n !infiniteScroll &&\n !lazyLoad &&\n tableTransfer !== null &&\n typeof tableTransfer === \"object\" &&\n typeof tableTransfer.scope === \"string\" &&\n tableTransfer.scope.length > 0 &&\n typeof tableTransfer.tableId === \"string\" &&\n tableTransfer.tableId.length > 0 &&\n isCominsTableTransferCoordinator<TData, TGroup>(tableTransfer.coordinator)\n ? tableTransfer as CominsTableTransferConfig<TData, TGroup>\n : undefined;\n const effectivePagination = useMemo(\n () => groupingRequested\n ? { pageIndex: 0, pageSize: Math.max(1, effectiveData.length) }\n : pagination,\n [effectiveData.length, groupingRequested, pagination],\n );\n const effectiveRowProps = filteringRequested\n ? { ...rowProps, draggable: false }\n : rowProps;\n const [state, setState] = useState(() =>\n createCominsTableState({\n columnGroups,\n columns,\n getRowId,\n pagination: effectivePagination,\n rows: effectiveData,\n showHeader,\n theme,\n }),\n );\n const stateRef = useRef(state);\n const columnOrderHistoryRef = useRef(state.columnOrder);\n const stateInputRef = useRef({ columnGroups, columns, data: effectiveData, getRowId, pagination: effectivePagination, showHeader });\n const virtualBufferSize = Math.max(0, Math.floor(Number.isFinite(bufferSize) ? Number(bufferSize) : 10));\n const resolvedLazyLoadBatchSize = Math.max(1, Math.floor(lazyLoadBatchSize));\n const resolvedLazyLoadThreshold = Math.max(0, Math.floor(lazyLoadThreshold ?? infiniteScrollThreshold));\n const hasLazyLoadHandler = typeof onLazyLoad === \"function\";\n const resolvedRowDetailRender = rowDetail?.render ?? renderRowDetail;\n const rowDetailEnabled = typeof resolvedRowDetailRender === \"function\" && !treeContext && !viewportContext;\n const normalizedExpandedRowIds = useMemo(() => {\n const seen = new Set<CominsRowId>();\n\n return (expandedRowIds ?? []).filter((rowId) => {\n if (seen.has(rowId)) {\n return false;\n }\n\n seen.add(rowId);\n return true;\n });\n }, [expandedRowIds]);\n const expandedRowIdSet = useMemo(\n () => new Set(normalizedExpandedRowIds),\n [normalizedExpandedRowIds],\n );\n const toggleRowDetail = (rowId: CominsRowId, expandable: boolean) => {\n if (!rowDetailEnabled || !expandable || !onChangeExpandedRowIds) {\n return;\n }\n\n onChangeExpandedRowIds(\n expandedRowIdSet.has(rowId)\n ? normalizedExpandedRowIds.filter((current) => current !== rowId)\n : [...normalizedExpandedRowIds, rowId],\n );\n };\n const clearActivePointerGesture = () => {\n const cleanup = activePointerGestureCleanupRef.current;\n\n activePointerGestureCleanupRef.current = null;\n cleanup?.();\n };\n const registerActivePointerGesture = (cleanup: () => void) => {\n clearActivePointerGesture();\n activePointerGestureCleanupRef.current = cleanup;\n };\n const clearExternalDropMarker = () => {\n const marker = externalDropMarkerRef.current;\n\n if (!marker) {\n return;\n }\n\n marker.removeAttribute(\"data-comins-cross-row-drop-position\");\n marker.removeAttribute(\"data-comins-group-drop-position\");\n marker.removeAttribute(\"data-comins-group-drop-valid\");\n marker.removeAttribute(\"data-comins-row-drop-valid\");\n externalDropMarkerRef.current = null;\n };\n const clearTransferRejectionFeedback = (updateState = true) => {\n if (transferRejectionTimerRef.current !== null) {\n window.clearTimeout(transferRejectionTimerRef.current);\n transferRejectionTimerRef.current = null;\n }\n\n transferRejectionTargetRef.current?.removeAttribute(\"data-comins-transfer-rejected\");\n transferRejectionTargetRef.current = null;\n\n if (updateState) {\n setTransferRejectionFeedback(null);\n }\n };\n const showTransferRejectionFeedback = (\n rejection: CominsTableTransferRejection<TData, TGroup>,\n targetSnapshot: CominsTableTransferRegistrationSnapshot<TData, TGroup>,\n clientX: number,\n clientY: number,\n ) => {\n const feedback = targetSnapshot.config.rejectionFeedback;\n\n if (feedback === false) {\n return;\n }\n\n clearTransferRejectionFeedback();\n const duplicateId = rejection.conflict.kind === \"group\"\n ? rejection.conflict.groupId\n : rejection.conflict.rowId;\n const defaultContent = (\n <>\n <strong>Duplicate ID</strong>\n <span>{`The ID \"${String(duplicateId)}\" already exists.`}</span>\n </>\n );\n const render = feedback?.tooltip?.render;\n const renderedContent = render ? render(rejection) : feedback?.renderTooltip?.(rejection);\n const content = render ? renderedContent === undefined ? defaultContent : renderedContent : renderedContent ?? defaultContent;\n const requestedDuration = feedback?.duration ?? 1800;\n const duration = Number.isFinite(requestedDuration)\n ? Math.max(500, Math.min(10000, requestedDuration))\n : 1800;\n\n targetSnapshot.root?.setAttribute(\"data-comins-transfer-rejected\", \"true\");\n transferRejectionTargetRef.current = targetSnapshot.root;\n setTransferRejectionFeedback({ content, x: clientX, y: clientY });\n transferRejectionTimerRef.current = window.setTimeout(\n () => clearTransferRejectionFeedback(),\n duration,\n );\n };\n const setExternalDropMarker = (\n element: HTMLElement,\n kind: \"group\" | \"row\",\n valid: boolean,\n position?: \"after\" | \"append\" | \"before\",\n ) => {\n clearExternalDropMarker();\n externalDropMarkerRef.current = element;\n\n if (kind === \"group\") {\n element.dataset.cominsGroupDropValid = valid ? \"true\" : \"false\";\n\n if (position === \"after\" || position === \"before\") {\n element.dataset.cominsGroupDropPosition = position;\n }\n return;\n }\n\n element.dataset.cominsRowDropValid = valid ? \"true\" : \"false\";\n\n if (element.dataset.cominsRowDataIndex !== undefined) {\n element.dataset.cominsCrossRowDropPosition = \"before\";\n }\n };\n const getRegisteredTransferSnapshot = (tableId: string) => normalizedTableTransfer\n ? getReactTransferSnapshot(normalizedTableTransfer.coordinator, normalizedTableTransfer.scope, tableId)\n : null;\n const getCrossTableTransferHit = (clientX: number, clientY: number): CominsTransferTableHit<TData, TGroup> | null => normalizedTableTransfer\n ? getBrowserTransferHit({ sourceTableId: normalizedTableTransfer.tableId, scope: normalizedTableTransfer.scope, instanceId: tableInstanceId, root: tableRootRef.current, clientX, clientY, document, getSnapshot: getRegisteredTransferSnapshot })\n : null;\n const scheduleTransferFocus = (\n targetTableId: string,\n kind: \"group\" | \"row\",\n id: CominsRowId,\n ) => {\n if (pendingTransferFocusFrameRef.current !== null) {\n window.cancelAnimationFrame(pendingTransferFocusFrameRef.current);\n }\n\n let remainingAttempts = 3;\n const attemptFocus = () => {\n pendingTransferFocusFrameRef.current = null;\n const snapshot = getRegisteredTransferSnapshot(targetTableId);\n const root = snapshot?.root;\n\n if (!root) {\n return;\n }\n\n const identity = getCominsTransferIdentity(id);\n const row = [...root.querySelectorAll<HTMLElement>(\n kind === \"row\"\n ? \"[data-comins-transfer-row-id]\"\n : \"[data-comins-transfer-group-id]\",\n )].find((candidate) =>\n (kind === \"row\"\n ? candidate.dataset.cominsTransferRowId\n : candidate.dataset.cominsTransferGroupId) === identity,\n );\n const focusTarget = kind === \"group\"\n ? row?.querySelector<HTMLElement>(\n \".comins-row-group-drag-handle, .comins-row-group-expander\",\n )\n : row;\n\n if (focusTarget) {\n focusCominsElement(focusTarget, { preventScroll: true });\n return;\n }\n\n remainingAttempts -= 1;\n\n if (remainingAttempts > 0) {\n pendingTransferFocusFrameRef.current = window.requestAnimationFrame(attemptFocus);\n return;\n }\n\n focusCominsElement(root, { preventScroll: true });\n };\n\n pendingTransferFocusFrameRef.current = window.requestAnimationFrame(attemptFocus);\n };\n\n useLayoutEffect(() => {\n onLazyLoadRef.current = onLazyLoad;\n }, [onLazyLoad]);\n\n const requestLazyLoad = (reason: CominsLazyLoadReason) => {\n const lazyLoadHandler = onLazyLoadRef.current;\n\n if (groupingRequested || filteringRequested || !lazyLoad || lazyLoadMode !== \"append\" || !lazyLoadHandler || lazyLoadingReasonRef.current) {\n return;\n }\n\n const currentRowsLength = stateRef.current.rows.length;\n\n if (reason === \"scroll\" && (!hasMoreRows || loading || loadingMore)) {\n return;\n }\n\n const controller = new AbortController();\n const requestId = lazyRequestIdRef.current + 1;\n const offset = reason === \"scroll\" ? currentRowsLength : 0;\n\n lazyRequestIdRef.current = requestId;\n lazyAbortControllerRef.current?.abort();\n lazyAbortControllerRef.current = controller;\n lazyLoadingReasonRef.current = reason;\n if (reason !== \"scroll\") {\n pendingScrollTopRef.current = 0;\n setScrollTop(0);\n if (containerRef.current) {\n setCominsScrollTop(containerRef.current, 0);\n }\n }\n let result: Promise<void> | void;\n\n try {\n result = lazyLoadHandler({\n limit: resolvedLazyLoadBatchSize,\n offset,\n reason,\n signal: controller.signal,\n });\n } catch {\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current = null;\n return;\n }\n\n void Promise.resolve(result)\n .catch(() => {\n // Error and retry UI are intentionally left to the consumer in this API pass.\n })\n .finally(() => {\n if (lazyRequestIdRef.current !== requestId) {\n return;\n }\n\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current = null;\n });\n };\n\n useEffect(() => {\n if (groupingRequested || filteringRequested || !lazyLoad || !hasLazyLoadHandler) {\n return undefined;\n }\n\n requestLazyLoad(\"initial\");\n\n return () => {\n lazyRequestIdRef.current += 1;\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current?.abort();\n lazyAbortControllerRef.current = null;\n };\n }, [filteringRequested, groupingRequested, hasLazyLoadHandler, lazyLoad, resolvedLazyLoadBatchSize]);\n\n useEffect(() => {\n const previousInput = stateInputRef.current;\n\n if (\n previousInput.columns === columns &&\n previousInput.columnGroups === columnGroups &&\n previousInput.data === effectiveData &&\n previousInput.getRowId === getRowId &&\n previousInput.pagination === effectivePagination &&\n previousInput.showHeader === showHeader\n ) {\n return;\n }\n\n stateInputRef.current = { columnGroups, columns, data: effectiveData, getRowId, pagination: effectivePagination, showHeader };\n const current = stateRef.current;\n const result = reconcileReactState({\n current,\n nextInput: { columnGroups, columns, getRowId, pagination: effectivePagination, rows: effectiveData, showHeader },\n columnOrderHistory: columnOrderHistoryRef.current,\n dataChanged: previousInput.data !== effectiveData,\n getRowIdChanged: previousInput.getRowId !== getRowId,\n viewportIndices: viewportContext?.indices,\n });\n const next = result.state;\n columnOrderHistoryRef.current = result.columnOrderHistory;\n result.invalidatedDetailRowIds.forEach(rowId => detailMeasurementsRef.current.delete(rowId));\n stateRef.current = next;\n setState(next);\n notifyReactInputChanges(current, next, { onChangeSelection, onChangeSort, onChangeSortModel });\n }, [columnGroups, columns, effectiveData, effectivePagination, getRowId, showHeader]);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n if (lastLoadMoreRowCountRef.current !== null && lastLoadMoreRowCountRef.current !== state.rows.length) {\n lastLoadMoreRowCountRef.current = null;\n }\n }, [state.rows.length]);\n\n useEffect(() => {\n return () => {\n clearActivePointerGesture();\n detailFocusRestorer.dispose();\n clearExternalDropMarker();\n clearTransferRejectionFeedback(false);\n\n if (pendingTransferFocusFrameRef.current !== null) {\n window.cancelAnimationFrame(pendingTransferFocusFrameRef.current);\n }\n\n if (scrollFrameRef.current !== null) {\n window.cancelAnimationFrame(scrollFrameRef.current);\n }\n\n if (scrollCommitTimeoutRef.current !== null) {\n window.clearTimeout(scrollCommitTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n const element = containerRef.current;\n\n if (!element) {\n return undefined;\n }\n\n return observeCominsViewport(element, measurement => {\n setContainerHeight(measurement.height);\n setContainerWidth(measurement.width);\n setHorizontalScrollContentWidth(measurement.scrollWidth);\n setHorizontalViewportOuterWidth(measurement.outerWidth);\n setHorizontalViewportWidth(measurement.viewportWidth);\n });\n }, []);\n\n useEffect(() => {\n reconcileCominsDetailMeasurements(\n detailMeasurementsRef.current,\n new Set(state.rowIds),\n );\n const ids = new Set(state.rowIds);\n for (const id of rowMeasurementsRef.current.keys()) if (!ids.has(id)) rowMeasurementsRef.current.delete(id);\n }, [state.rowIds]);\n useEffect(() => {\n if (!getRowHeight) return;\n const changed = () => setRowFontRevision(value => value + 1);\n return observeCominsFontChanges(changed);\n }, [Boolean(getRowHeight)]);\n\n const updateMixedProjectionDetailHeight = (\n snapshot: CominsCommittedDetailObserverSnapshot<TData>,\n rowId: CominsRowId,\n height: number,\n width: number,\n kind?: \"row\",\n ) => {\n const projection = snapshot.projection;\n\n if (!projection || (kind !== \"row\" && width !== snapshot.contentWidth)) {\n return false;\n }\n\n const slotIndex = projection.slotIndexByRowId.get(rowId);\n const slot = slotIndex === undefined ? undefined : projection.slots[slotIndex];\n\n if (slotIndex === undefined || slot?.kind !== \"data\") {\n return false;\n }\n\n if (kind === \"row\") {\n if (!slot.autoHeight) return false;\n const delta = projection.heightIndex.updateHeight(slotIndex, height + (slot.detail?.height ?? 0));\n slot.rowHeight = height;\n return delta !== 0;\n }\n if (slot.detail?.mode !== \"auto\") return false;\n\n const nextSlotHeight =\n projection.heightIndex.getHeight(slotIndex) - slot.detail.height + height;\n const delta = projection.heightIndex.updateHeight(slotIndex, nextSlotHeight);\n\n slot.detail.estimated = false;\n slot.detail.height = height;\n return delta !== 0;\n };\n\n const applyDetailMeasurementUpdates = (\n updates: ReadonlyArray<{\n height: number;\n rowId: CominsRowId;\n width: number;\n kind?: \"row\";\n }>,\n ) => {\n const snapshot = committedDetailObserverSnapshotRef.current;\n\n if (!snapshot) {\n return;\n }\n\n const accepted = updates.filter(({ height, rowId, width, kind }) => {\n if (kind === \"row\") {\n const slot = snapshot.rowSlots.get(rowId);\n const current = rowMeasurementsRef.current.get(rowId);\n return slot?.autoHeight && (!current || current.row !== slot.row || current.layoutKey !== snapshot.rowLayoutKey || current.contentRevision !== snapshot.rowContentRevision || Math.abs(current.height - height) >= .5);\n }\n const current = detailMeasurementsRef.current.get(rowId);\n\n return (\n !current ||\n current.width !== width ||\n Math.abs(current.height - height) >= 0.5\n );\n });\n\n if (accepted.length === 0) {\n return;\n }\n\n const projection = snapshot.projection;\n const viewport = containerRef.current;\n const viewportHeight = viewport?.clientHeight || snapshot.viewportHeight;\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n const viewportIndex = committedViewportIndexRef.current?.index;\n if (viewportContext && viewportIndex && viewport && !viewportMeasurementAnchorRef.current) {\n const logical = logicalAnchorTransactionRef.current && Math.abs(viewport.scrollTop - logicalAnchorTransactionRef.current.actualPhysical) <= .5 ? logicalAnchorTransactionRef.current.targetLogical : viewport.scrollTop * getCominsScrollScale(viewportIndex.getTotalHeight(), viewportHeight).scrollScale;\n const index = viewportIndex.findIndexAtOffset(logical);\n viewportMeasurementAnchorRef.current = { index, offset: logical - viewportIndex.getPrefixHeight(index) };\n }\n const pendingAnchor =\n currentPendingDetailAnchor?.status === \"pending\"\n ? currentPendingDetailAnchor\n : !currentPendingDetailAnchor && projection && viewport\n ? captureCominsVirtualAnchor({\n logicalScrollTop:\n logicalAnchorTransactionRef.current &&\n Math.abs(\n viewport.scrollTop -\n logicalAnchorTransactionRef.current.actualPhysical,\n ) <= 0.5\n ? logicalAnchorTransactionRef.current.targetLogical\n : undefined,\n physicalScrollTop: viewport.scrollTop,\n projection: {\n heightIndex: projection.heightIndex,\n keys: projection.keys,\n mixed: true,\n },\n viewportHeight,\n })\n : undefined;\n let updatedActiveIndex = false;\n\n for (const update of accepted) {\n if (update.kind === \"row\") {\n const slot = snapshot.rowSlots.get(update.rowId)!;\n rowMeasurementsRef.current.set(update.rowId, { height: update.height, row: slot.row, layoutKey: snapshot.rowLayoutKey, contentRevision: snapshot.rowContentRevision });\n if (viewportIndex && slot.absoluteIndex !== undefined) {\n viewportIndex.updateHeight(slot.absoluteIndex, update.height);\n slot.rowHeight = update.height;\n }\n } else {\n detailMeasurementsRef.current.set(update.rowId, { height: update.height, width: update.width });\n }\n updatedActiveIndex =\n updateMixedProjectionDetailHeight(\n snapshot,\n update.rowId,\n update.height,\n update.width,\n update.kind,\n ) || updatedActiveIndex;\n }\n\n if (\n pendingAnchor &&\n updatedActiveIndex &&\n currentPendingDetailAnchor?.status !== \"pending\"\n ) {\n const revision = anchorRevisionRef.current + 1;\n\n anchorRevisionRef.current = revision;\n pendingDetailAnchorRef.current = {\n ...pendingAnchor,\n revision,\n status: \"pending\",\n };\n }\n\n if (updatedActiveIndex || !projection) {\n setDetailLayoutVersion((current) => current + 1);\n }\n };\n\n const createDetailObserver = () => {\n if (!hasCominsResizeObserver()) {\n return null;\n }\n\n const updates: Array<{ height: number; rowId: CominsRowId; width: number; kind?: \"row\" }> = [];\n const observer = createMeasurementObserver({\n onMeasure: measurement => {\n const observed = detailElementsRef.current.get(measurement.element);\n if (!observed) return;\n const height = observed.kind === \"row\" ? measurement.rectHeight : measurement.height;\n const width = measurement.width;\n if (Number.isFinite(height) && height > 0) {\n updates.push({ height, rowId: observed.rowId, width, kind: observed.kind });\n }\n },\n onBatchComplete: () => applyDetailMeasurementUpdates(updates.splice(0)),\n });\n\n detailObserverRef.current = observer;\n\n for (const observed of detailElementsRef.current.values()) {\n observer.observe(observed.element);\n }\n\n return observer;\n };\n\n useLayoutEffect(() => {\n return () => {\n detailObserverRef.current?.dispose();\n detailObserverRef.current = null;\n detailElementsRef.current.clear();\n fallbackMeasuredDetailElementsRef.current.clear();\n committedDetailObserverSnapshotRef.current = null;\n };\n }, []);\n\n const disconnectDetailObserverIfIdle = () => {\n if (detailElementsRef.current.size === 0) {\n detailObserverRef.current?.dispose();\n detailObserverRef.current = null;\n }\n };\n\n const registerDetailElement = (\n rowId: CominsRowId,\n mode: \"auto\" | \"fixed\",\n element: HTMLElement | null,\n kind?: \"row\",\n ) => {\n for (const [currentElement, observed] of detailElementsRef.current) {\n if (observed.rowId === rowId && observed.kind === kind && currentElement !== element) {\n detailObserverRef.current?.unobserve(currentElement);\n detailElementsRef.current.delete(currentElement);\n fallbackMeasuredDetailElementsRef.current.delete(currentElement);\n }\n }\n\n if (!element || mode === \"fixed\") {\n disconnectDetailObserverIfIdle();\n return;\n }\n\n detailElementsRef.current.set(element, { element, rowId, kind });\n };\n\n const notifyChanges = (\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n notifyReactStateChanges(current, next, { onChangeData, onChangeSelection, onChangeColumnLayout, onChangeSort, onChangeSortModel }, options);\n };\n\n const commitState = (\n updater: CominsTableState<TData> | ((current: CominsTableState<TData>) => CominsTableState<TData>),\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n const current = stateRef.current;\n const next = typeof updater === \"function\" ? updater(current) : updater;\n\n columnOrderHistoryRef.current = reconcileColumnOrderHistory(\n columnOrderHistoryRef.current,\n next.columnOrder,\n next.columns.map((column) => column.id),\n );\n stateRef.current = next;\n setState(next);\n notifyChanges(current, next, options);\n };\n\n const visibleColumns = useMemo(() => getCominsVisibleColumns(state), [state]);\n const renderedHeaderRendererBodies = new Map<string, { body: React.ReactNode; renderer: unknown; kind: \"render\" | \"legacy\" }>();\n\n useEffect(() => {\n headerRendererBodyRef.current = renderedHeaderRendererBodies;\n });\n\n const columnWidths = useMemo(() => {\n const columnCount = visibleColumns.length;\n\n if (columnCount === 0) {\n return [];\n }\n\n const configuredWidths = visibleColumns.map((column) => state.columnState[column.id]?.width ?? column.width);\n\n if (containerWidth <= 0) {\n const fallbackWidth = `${100 / columnCount}%`;\n\n return configuredWidths.map((width, index) => {\n if (width === undefined) {\n return fallbackWidth;\n }\n\n const column = visibleColumns[index]!;\n\n return clampColumnWidth(\n width,\n getEffectiveColumnMinWidth(column),\n getEffectiveColumnMaxWidth(column),\n );\n });\n }\n\n let fixedTotal = 0;\n\n for (const width of configuredWidths) {\n fixedTotal += width ?? 0;\n }\n\n const flexibleColumns = visibleColumns.filter((_column, index) => configuredWidths[index] === undefined);\n const flexibleWidth =\n flexibleColumns.length > 0 ? Math.max(0, (containerWidth - fixedTotal) / flexibleColumns.length) : 0;\n\n return visibleColumns.map((column, index) => {\n const width = configuredWidths[index] ?? flexibleWidth;\n const minWidth = getEffectiveColumnMinWidth(column);\n const maxWidth = column.maxWidth ?? Number.POSITIVE_INFINITY;\n\n return Math.min(maxWidth, Math.max(minWidth, width));\n });\n }, [containerWidth, state.columnState, visibleColumns]);\n const columnPinningBlocks = useMemo(() => {\n const groupIdByColumnId = new Map<string, string>();\n\n for (const group of state.columnGroups) {\n for (const columnId of group.children) {\n groupIdByColumnId.set(columnId, group.id);\n }\n }\n\n const visibleColumnIds = new Set(visibleColumns.map((column) => column.id));\n const widthByColumnId = new Map(\n visibleColumns.map((column, index) => [\n column.id,\n typeof columnWidths[index] === \"number\" ? columnWidths[index] : 0,\n ] as const),\n );\n const emittedGroups = new Set<string>();\n return visibleColumns.flatMap((column) => {\n const groupId = groupIdByColumnId.get(column.id);\n\n if (!groupId) {\n return [{\n columnIds: [column.id],\n columnWidths: [widthByColumnId.get(column.id) ?? 0],\n id: `column:${column.id}`,\n pinned: state.columnState[column.id]?.pinned,\n }];\n }\n\n if (emittedGroups.has(groupId)) {\n return [];\n }\n\n emittedGroups.add(groupId);\n const group = state.columnGroups.find((candidate) => candidate.id === groupId);\n const columnIds = visibleColumns\n .map((candidate) => candidate.id)\n .filter((columnId) => visibleColumnIds.has(columnId) && group?.children.includes(columnId));\n\n return [{\n columnIds,\n columnWidths: columnIds.map((columnId) => widthByColumnId.get(columnId) ?? 0),\n id: `group:${groupId}`,\n pinned: state.columnGroupState[groupId]?.pinned,\n }];\n });\n\n }, [columnWidths, state.columnGroupState, state.columnGroups, state.columnState, visibleColumns]);\n const columnPinning = useMemo(\n () => resolveCominsColumnPinning(columnPinningBlocks, containerWidth),\n [columnPinningBlocks, containerWidth],\n );\n const getPinnedColumnAttributes = (columnId: string) => {\n const pin = columnPinning.columns.get(columnId);\n\n return {\n boundary: pin?.boundary,\n pinned: pin?.pinned,\n style: pin?.pinned\n ? {\n [pin.pinned]: pin.offset,\n position: \"sticky\",\n } as React.CSSProperties\n : undefined,\n };\n };\n const columnWidthTotal = useMemo(() => {\n let totalWidth = 0;\n\n for (const width of columnWidths) {\n if (typeof width !== \"number\") {\n return undefined;\n }\n\n totalWidth += width;\n }\n\n return totalWidth;\n }, [columnWidths]);\n const tableWidth = useMemo(() => {\n if (typeof columnWidthTotal !== \"number\") {\n return undefined;\n }\n\n return Math.max(containerWidth, columnWidthTotal);\n }, [columnWidthTotal, containerWidth]);\n const detailContentWidth =\n typeof tableWidth === \"number\" && Number.isFinite(tableWidth)\n ? Math.round(tableWidth)\n : 0;\n const headerRows = useMemo(() => getCominsHeaderRows(state), [state]);\n const normalizedColumnFilters = useMemo(\n () => filteringRequested\n ? normalizeCominsColumnFilterModel({\n columns: state.columns,\n model: columnFiltering?.model,\n })\n : [],\n [columnFiltering?.model, filteringRequested, state.columns],\n );\n const filteringActive = normalizedColumnFilters.length > 0;\n const normalizedColumnFilterById = useMemo(\n () => new Map(normalizedColumnFilters.map((rule) => [rule.column.id, rule] as const)),\n [normalizedColumnFilters],\n );\n const filterSourceRows = useMemo(() => state.rows.map((data, dataIndex) => ({ data, dataIndex, id: state.rowIds[dataIndex]! })), [state.rows, state.rowIds]);\n const filteredDataIndexes = useMemo(\n () => filteringRequested\n ? getCominsFilteredRowIndexes({\n columns: state.columns,\n model: columnFiltering?.model,\n rows: state.rows.map((data, dataIndex) => ({\n data,\n dataIndex,\n id: state.rowIds[dataIndex]!,\n })),\n })\n : state.rows.map((_row, index) => index),\n [columnFiltering?.model, filteringRequested, state.columns, state.rowIds, state.rows],\n );\n const filteredRows = useMemo(\n () => filteredDataIndexes.flatMap((dataIndex) => {\n const row = state.rows[dataIndex];\n\n return row === undefined ? [] : [row];\n }),\n [filteredDataIndexes, state.rows],\n );\n const summaryValues = useMemo(\n () => (summary ? resolveCominsSummaryValues(treeContext?.summaryRows ?? filteredRows, visibleColumns, summary) : null),\n [filteredRows, summary, treeContext?.summaryRows, visibleColumns],\n );\n const summaryCells = useMemo(() => {\n if (!summary) {\n return [];\n }\n\n const cells: Array<{\n className?: string;\n colSpan: number;\n column: CominsTableRuntimeColumn<TData>;\n startIndex: number;\n style?: React.CSSProperties;\n value: React.ReactNode;\n }> = [];\n let columnIndex = 0;\n\n while (columnIndex < visibleColumns.length) {\n const column = visibleColumns[columnIndex]!;\n const configuredColumn = summary.columns[column.id];\n const config =\n typeof configuredColumn === \"object\" && configuredColumn !== null ? configuredColumn : undefined;\n const requestedColSpan = config?.colSpan;\n const normalizedColSpan =\n typeof requestedColSpan === \"number\" && Number.isFinite(requestedColSpan)\n ? Math.max(1, Math.floor(requestedColSpan))\n : 1;\n const colSpan = Math.min(normalizedColSpan, visibleColumns.length - columnIndex);\n\n cells.push({\n className: config?.className,\n colSpan,\n column,\n startIndex: columnIndex,\n style: config?.style,\n value: summaryValues?.renderedColumnIds.has(column.id)\n ? summaryValues.values[column.id]\n : summaryValues?.values[column.id] ?? (cells.length === 0 ? summary.label : null),\n });\n columnIndex += colSpan;\n }\n\n return cells;\n }, [summary, summaryValues, visibleColumns]);\n const groupingAggregations = rowGrouping?.aggregations;\n const groupingGetGroupId = rowGrouping?.getGroupId;\n const groupingGetGroupLabel = rowGrouping?.getGroupLabel;\n const groupingLabelRender = rowGrouping?.label?.render;\n const groupingGetRowGroupId = rowGrouping?.getRowGroupId;\n const groupingGroups = rowGrouping?.groups;\n const normalizedGrouping = useMemo(\n () => groupingRequested && groupingGetGroupId && groupingGetRowGroupId && groupingGroups\n ? normalizeCominsRowGrouping({\n columns: state.columns,\n config: {\n aggregations: groupingAggregations,\n getGroupId: groupingGetGroupId,\n getGroupLabel: groupingGetGroupLabel,\n label: { render: groupingLabelRender },\n getRowGroupId: groupingGetRowGroupId,\n groups: groupingGroups,\n },\n })\n : null,\n [\n groupingAggregations,\n groupingGetGroupId,\n groupingGetGroupLabel,\n groupingLabelRender,\n groupingGetRowGroupId,\n groupingGroups,\n groupingRequested,\n state.columns,\n ],\n );\n const groupModel = useMemo(\n () => normalizedGrouping && groupingGetRowGroupId\n ? createCominsGroupModel({\n ...normalizedGrouping,\n getRowGroupId: groupingGetRowGroupId,\n rows: filteredDataIndexes.flatMap((dataIndex) => {\n const data = state.rows[dataIndex];\n const id = state.rowIds[dataIndex];\n\n return data === undefined || id === undefined\n ? []\n : [{ data, dataIndex, id }];\n }),\n })\n : null,\n [filteredDataIndexes, groupingGetRowGroupId, normalizedGrouping, state.rowIds, state.rows],\n );\n const orderedGroupModel = useMemo(\n () => groupModel\n ? orderCominsGroupModel({\n columns: state.columns,\n model: groupModel,\n rows: state.rows,\n sortModel: state.sortModel,\n })\n : null,\n [groupModel, state.columns, state.rows, state.sortModel],\n );\n const normalizedExpandedGroupIds = useMemo(() => {\n const seen = new Set<CominsRowId>();\n const suppliedGroupIds = Array.isArray(rowGrouping?.expandedGroupIds)\n ? rowGrouping.expandedGroupIds\n : [];\n\n return suppliedGroupIds.filter((groupId) => {\n if (!orderedGroupModel?.groupsById.has(groupId) || seen.has(groupId)) {\n return false;\n }\n\n seen.add(groupId);\n return true;\n });\n }, [orderedGroupModel, rowGrouping?.expandedGroupIds]);\n const expandedGroupIdSet = useMemo(\n () => new Set(normalizedExpandedGroupIds),\n [normalizedExpandedGroupIds],\n );\n const toggleRowGroup = (groupId: CominsRowId) => {\n const onChangeExpandedGroupIds = rowGrouping?.onChangeExpandedGroupIds;\n\n if (typeof onChangeExpandedGroupIds !== \"function\" || !orderedGroupModel?.groupsById.has(groupId)) {\n return;\n }\n\n onChangeExpandedGroupIds(\n expandedGroupIdSet.has(groupId)\n ? normalizedExpandedGroupIds.filter((current) => current !== groupId)\n : [...normalizedExpandedGroupIds, groupId],\n );\n };\n const groupingProjection = useMemo(\n () => orderedGroupModel\n ? projectCominsGroups({\n expandedGroupIds: normalizedExpandedGroupIds,\n model: orderedGroupModel,\n rowIds: state.rowIds,\n })\n : null,\n [normalizedExpandedGroupIds, orderedGroupModel, state.rowIds],\n );\n const groupingActive = groupingProjection !== null;\n const transferEndpoint: CominsTableTransferEndpoint<TData, TGroup> | null =\n normalizedTableTransfer\n ? groupingActive && rowGrouping\n ? {\n data: state.rows,\n getGroupId: rowGrouping.getGroupId,\n getRowGroupId: rowGrouping.getRowGroupId,\n getRowId: state.getRowId,\n groups: rowGrouping.groups,\n setRowGroupId: rowGrouping.setRowGroupId,\n tableId: normalizedTableTransfer.tableId,\n }\n : {\n data: state.rows,\n getRowId: state.getRowId,\n tableId: normalizedTableTransfer.tableId,\n }\n : null;\n\n transferSnapshotRef.current = normalizedTableTransfer && transferEndpoint\n ? {\n config: normalizedTableTransfer,\n endpoint: transferEndpoint,\n instanceId: tableInstanceId,\n root: tableRootRef.current,\n viewport: containerRef.current,\n }\n : null;\n\n useCominsTableTransferRegistration({ config: normalizedTableTransfer, snapshot: transferSnapshotRef, root: tableRootRef, viewport: containerRef });\n\n useLayoutEffect(() => {\n if (!groupingProjection || !orderedGroupModel) {\n previousGroupedDataIndexesRef.current = null;\n pendingGroupDisclosureFocusRef.current = null;\n return;\n }\n\n const pendingGroupId = pendingGroupDisclosureFocusRef.current;\n\n if (pendingGroupId !== null) {\n const disclosure = groupDisclosureElementsRef.current.get(pendingGroupId);\n\n if (disclosure) {\n pendingGroupDisclosureFocusRef.current = null;\n focusedLeafDataIndexRef.current = null;\n focusCominsElement(disclosure);\n }\n }\n\n const nextDataIndexes = new Set(\n groupingProjection.entries.flatMap((entry) =>\n entry.kind === \"data\" ? [entry.dataIndex] : [],\n ),\n );\n const previousDataIndexes = previousGroupedDataIndexesRef.current;\n const focusedDataIndex = focusedLeafDataIndexRef.current;\n\n previousGroupedDataIndexesRef.current = nextDataIndexes;\n\n if (\n focusedDataIndex === null ||\n !previousDataIndexes?.has(focusedDataIndex) ||\n nextDataIndexes.has(focusedDataIndex)\n ) {\n return;\n }\n\n const activeElement = document.activeElement;\n const focusWasInTable = activeElement\n ? containerRef.current?.contains(activeElement) || activeElement === document.body\n : false;\n\n if (!focusWasInTable) {\n return;\n }\n\n const leafGroup = [...orderedGroupModel.groupsById.values()].find((group) =>\n group.leafSourceIndexes.includes(focusedDataIndex),\n );\n const fallbackGroupId = leafGroup?.groupId;\n\n if (fallbackGroupId !== undefined) {\n focusCominsElement(groupDisclosureElementsRef.current.get(fallbackGroupId));\n }\n }, [groupingProjection, orderedGroupModel]);\n const sortedRowIndexes = useMemo(\n () => (treeContext || groupingActive ? null : getCominsSortedRowIndexes(state, filteredDataIndexes)),\n [filteredDataIndexes, groupingActive, state, treeContext],\n );\n const projectedDataIndexes = useMemo(\n () => groupingProjection\n ? groupingProjection.entries.flatMap((entry) => entry.kind === \"data\" ? [entry.dataIndex] : [])\n : sortedRowIndexes ?? filteredDataIndexes,\n [filteredDataIndexes, groupingProjection, sortedRowIndexes],\n );\n const selectionRowIds = useMemo(() => projectedDataIndexes.map(index => state.rowIds[index]!), [projectedDataIndexes, state.rowIds]);\n const visibleRowCount = projectedDataIndexes.length;\n const visibleSlotCount = viewportContext?.data.rowCount ?? groupingProjection?.entries.length ?? visibleRowCount;\n const { pageSize, maxPageIndex, effectivePageIndex, pageStartIndex } = getCorePageProjection(visibleRowCount, state.pagination);\n useEffect(() => {\n if (!groupingProjection && !filteringRequested) {\n return;\n }\n\n const visibleRowIds = new Set(\n groupingProjection?.visibleLeafRowIds ?? projectedDataIndexes.flatMap((dataIndex) => {\n const rowId = state.rowIds[dataIndex];\n\n return rowId === undefined ? [] : [rowId];\n }),\n );\n const current = stateRef.current;\n const cellHidden = current.selection.cell !== null && !visibleRowIds.has(current.selection.cell.rowId);\n const selectedCells = current.selection.cells;\n const visibleSelectedCells = selectedCells?.filter((cell) => visibleRowIds.has(cell.rowId));\n const cellsHidden =\n selectedCells !== undefined && visibleSelectedCells !== undefined && selectedCells.length !== visibleSelectedCells.length;\n const rangeHidden = current.selection.range !== null && (\n !visibleRowIds.has(current.selection.range.anchor.rowId) ||\n !visibleRowIds.has(current.selection.range.focus.rowId)\n );\n\n if (!cellHidden && !cellsHidden && !rangeHidden) {\n return;\n }\n\n if (cellHidden) {\n lastCellAnchorRef.current = visibleSelectedCells?.at(-1) ?? null;\n }\n rangeDragAnchorRef.current = null;\n rangeDragLastAddressRef.current = null;\n commitState({\n ...current,\n selection: {\n ...current.selection,\n cell: cellHidden ? (visibleSelectedCells?.at(-1) ?? null) : current.selection.cell,\n cells: cellsHidden ? visibleSelectedCells : current.selection.cells,\n range: rangeHidden || cellHidden ? null : current.selection.range,\n },\n });\n }, [filteringRequested, groupingProjection, projectedDataIndexes, state.rowIds]);\n const effectiveExpandedRowIdSet = useMemo(() => {\n if (!rowDetailEnabled) {\n return new Set<CominsRowId>();\n }\n\n const next = new Set<CominsRowId>();\n const startIndex = virtualized || groupingActive ? 0 : pageStartIndex;\n const endIndex = virtualized\n ? projectedDataIndexes.length\n : groupingActive\n ? projectedDataIndexes.length\n : Math.min(projectedDataIndexes.length, pageStartIndex + pageSize);\n\n for (let visibleIndex = startIndex; visibleIndex < endIndex; visibleIndex += 1) {\n const dataIndex = projectedDataIndexes[visibleIndex];\n\n if (dataIndex === undefined) {\n continue;\n }\n\n const row = state.rows[dataIndex];\n const rowId = state.rowIds[dataIndex];\n\n if (\n row === undefined ||\n rowId === undefined ||\n !expandedRowIdSet.has(rowId)\n ) {\n continue;\n }\n\n const entry = { dataIndex, row, rowId, visibleIndex };\n const params = { row: createEventRow(entry) };\n\n if (isRowExpandable?.(params) !== false) {\n next.add(rowId);\n }\n }\n\n return next;\n }, [\n expandedRowIdSet,\n groupingActive,\n isRowExpandable,\n pageSize,\n pageStartIndex,\n projectedDataIndexes,\n rowDetailEnabled,\n state.rowIds,\n state.rows,\n virtualized,\n ]);\n const rowLayoutKey = `${detailContentWidth}:${visibleColumns.map((column, index) => `${column.id}:${columnWidths[index]}`).join(\"|\")}:${JSON.stringify(theme ?? state.theme)}:${rowHeight}`;\n const rowContentRevision = useMemo(() => ({}), [columns, rowProps?.style, className, style, theme, rowFontRevision]);\n const viewportIndexById = useMemo(() => viewportContext ? new Map(effectiveData.map((row, index) => [getRowId!(row, index), viewportContext.indices[index]!] as const)) : null, [effectiveData, getRowId, viewportContext?.indices]);\n const rowProjection = useMemo(() => {\n const source = { rows: state.rows, rowIds: state.rowIds, dataIndexes: projectedDataIndexes };\n if (viewportIndexById) return projectReactRows({ ...source, mode: \"viewport\", absoluteIndexById: viewportIndexById, rowCount: viewportContext!.data.rowCount });\n if (groupingProjection) return projectReactRows({ ...source, mode: \"grouped\", projection: groupingProjection });\n return treeContext ? projectReactRows({ ...source, mode: \"tree\" }) : projectReactRows({ ...source, mode: \"flat\", virtualized: true });\n }, [state.rows, state.rowIds, projectedDataIndexes, viewportIndexById, groupingProjection, treeContext !== undefined]);\n const fullProjectionSlots = useMemo<Array<CominsVirtualSlot<TData>>>(() => {\n const safeRowHeight = Math.max(1, rowHeight);\n return rowProjection.entries.flatMap<CominsVirtualSlot<TData>>((projectionEntry) => {\n if (projectionEntry.kind === \"placeholder\") return [];\n if (projectionEntry.kind === \"group\") {\n return [{\n groupId: projectionEntry.groupId,\n height: safeRowHeight,\n key: projectionEntry.key,\n kind: \"group\",\n }];\n }\n\n const { dataIndex, rowId } = projectionEntry;\n const absoluteIndex = projectionEntry.absoluteIndex;\n const visibleIndex = absoluteIndex ?? projectionEntry.visibleLeafIndex;\n if (viewportIndexById && absoluteIndex === undefined) return [];\n const row = state.rows[dataIndex];\n\n if (row === undefined || rowId === undefined) {\n return [];\n }\n\n let detail: CominsDataVirtualSlot<TData>[\"detail\"] | null = null;\n const resolvedHeight = resolveCominsRowHeight({\n value: getRowHeight?.({ row: createEventRow({ dataIndex, row, rowId, visibleIndex, absoluteIndex }) }),\n rowHeight, estimate: estimatedRowHeight, measurement: rowMeasurementsRef.current.get(rowId), row, layoutKey: rowLayoutKey, contentRevision: rowContentRevision,\n });\n\n if (effectiveExpandedRowIdSet.has(rowId)) {\n const params = { row: createEventRow({ dataIndex, row, rowId, visibleIndex }) };\n const normalized = normalizeCominsDetailHeight(getRowDetailHeight?.(params));\n\n detail =\n normalized.mode === \"auto\"\n ? {\n ...resolveCominsMeasuredDetailHeight(\n detailMeasurementsRef.current,\n rowId,\n detailContentWidth,\n normalizeCominsDetailEstimate(estimatedRowDetailHeight, rowHeight),\n ),\n mode: \"auto\",\n }\n : { estimated: false, height: normalized.height, mode: \"fixed\" };\n }\n\n return [\n { ...createCominsDataVirtualSlot({\n dataIndex,\n detail,\n row,\n rowHeight: resolvedHeight.height,\n autoHeight: resolvedHeight.auto,\n rowId,\n visibleIndex,\n }), absoluteIndex },\n ];\n });\n }, [\n detailContentWidth,\n rowLayoutKey,\n rowContentRevision,\n viewportIndexById,\n getRowHeight,\n estimatedRowHeight,\n virtualized ? 0 : detailLayoutVersion,\n effectiveExpandedRowIdSet,\n estimatedRowDetailHeight,\n getRowDetailHeight,\n rowProjection,\n rowHeight,\n state.rowIds,\n state.rows,\n ]);\n const mixedProjection = useMemo<CominsMixedVirtualProjection<TData> | null>(() => {\n if (viewportContext || !virtualized || (effectiveExpandedRowIdSet.size === 0 && !fullProjectionSlots.some(slot => slot.kind === \"data\" && (slot.autoHeight || slot.rowHeight !== rowHeight)))) {\n return null;\n }\n\n const safeRowHeight = Math.max(1, rowHeight);\n const slots = fullProjectionSlots;\n const heightIndex = CominsHeightIndex.from(\n slots.map((slot) => getCominsSlotHeight(slot, safeRowHeight)),\n );\n const slotIndexByRowId = new Map<CominsRowId, number>();\n\n for (let slotIndex = 0; slotIndex < slots.length; slotIndex += 1) {\n const slot = slots[slotIndex];\n const rowId = slot?.kind === \"data\" ? slot.rowId : undefined;\n\n if (rowId !== undefined && !slotIndexByRowId.has(rowId)) {\n slotIndexByRowId.set(rowId, slotIndex);\n }\n }\n\n return {\n heightIndex,\n keys: slots.map((slot) => slot.key),\n slotIndexByRowId,\n slots,\n };\n }, [\n effectiveExpandedRowIdSet,\n fullProjectionSlots,\n rowHeight,\n virtualized,\n viewportContext !== undefined,\n ]);\n useLayoutEffect(() => {\n if (!treeContext) return;\n treeContext.drag.navigateRef.current = (rowId) => {\n const viewport = containerRef.current;\n const index = fullProjectionSlots.findIndex(slot => slot.kind === \"data\" && slot.rowId === rowId);\n if (!viewport || index < 0) return;\n if (!virtualized) {\n scrollCominsRowIntoView(viewport, index);\n return;\n }\n const total = mixedProjection?.heightIndex.getTotalHeight() ?? fullProjectionSlots.length * rowHeight;\n const top = mixedProjection?.heightIndex.getPrefixHeight(index) ?? index * rowHeight;\n const height = getCominsSlotHeight(fullProjectionSlots[index]!, rowHeight);\n const scale = getCominsScrollScale(total, viewport.clientHeight).scrollScale;\n const logicalTop = viewport.scrollTop * scale;\n const target = top < logicalTop ? top : top + height > logicalTop + viewport.clientHeight ? top + height - viewport.clientHeight : logicalTop;\n if (target !== logicalTop) setCominsScrollTop(viewport, getCominsPhysicalScrollTop(target, total, viewport.clientHeight));\n };\n return () => { treeContext.drag.navigateRef.current = null; };\n }, [treeContext, fullProjectionSlots, mixedProjection, rowHeight, virtualized]);\n const viewportConfigurationKey = viewportContext ? `${typeof viewportContext.data.revision}:${viewportContext.data.revision}:${viewportContext.data.rowCount}:${viewportContext.data.blockSize}:${rowLayoutKey}:${estimatedRowHeight}:${viewportContext.config.heightCacheSize}` : \"\";\n const viewportIndexKey = useMemo(() => ({}), [viewportConfigurationKey, rowContentRevision]);\n const viewportHeightIndex = useMemo(() => {\n if (!viewportContext) return null;\n const previous = committedViewportIndexRef.current;\n const index = previous?.key === viewportIndexKey ? previous.index.clone() : new CominsViewportHeightIndex(viewportContext.data.rowCount, normalizeCominsRowHeight(estimatedRowHeight, rowHeight), viewportContext.data.blockSize, normalizeCominsViewportInteger(viewportContext.config.heightCacheSize, 64));\n for (const slot of fullProjectionSlots) if (slot.kind === \"data\" && slot.absoluteIndex !== undefined) index.updateHeight(slot.absoluteIndex, slot.rowHeight ?? rowHeight);\n index.retain(viewportContext.data.retainRange);\n return index;\n }, [viewportIndexKey, fullProjectionSlots, viewportContext?.data.retainRange]);\n const viewportHeight = containerHeight || rowHeight * 12;\n const previousViewportIndex = committedViewportIndexRef.current?.index;\n let viewportAnchor = viewportMeasurementAnchorRef.current;\n if (!viewportAnchor && viewportHeightIndex && previousViewportIndex && previousViewportIndex !== viewportHeightIndex) {\n const physical = containerRef.current?.scrollTop ?? scrollTop;\n const logical = logicalAnchorTransaction && Math.abs(physical - logicalAnchorTransaction.actualPhysical) <= .5 ? logicalAnchorTransaction.targetLogical : physical * getCominsScrollScale(previousViewportIndex.getTotalHeight(), viewportHeight).scrollScale;\n const index = previousViewportIndex.findIndexAtOffset(logical);\n viewportAnchor = { index, offset: logical - previousViewportIndex.getPrefixHeight(index) };\n }\n const viewportAnchorLogical = viewportAnchor && viewportHeightIndex ? viewportHeightIndex.getPrefixHeight(viewportAnchor.index) + Math.min(viewportAnchor.offset, viewportHeightIndex.getHeight(viewportAnchor.index)) : undefined;\n useLayoutEffect(() => {\n if (!viewportHeightIndex) return;\n committedViewportIndexRef.current = { key: viewportIndexKey, index: viewportHeightIndex };\n viewportMeasurementAnchorRef.current = null;\n const element = containerRef.current;\n if (element && viewportAnchorLogical !== undefined) {\n const targetLogical = Math.min(Math.max(0, viewportAnchorLogical), Math.max(0, viewportHeightIndex.getTotalHeight() - viewportHeight));\n const requestedPhysical = getCominsPhysicalScrollTop(targetLogical, viewportHeightIndex.getTotalHeight(), viewportHeight);\n setCominsScrollTop(element, requestedPhysical);\n const transaction = { actualPhysical: element.scrollTop, requestedPhysical, targetLogical, revision: ++anchorRevisionRef.current };\n logicalAnchorTransactionRef.current = transaction;\n setLogicalAnchorTransaction(transaction);\n pendingScrollTopRef.current = element.scrollTop;\n setScrollTop(element.scrollTop);\n }\n }, [viewportHeightIndex, viewportAnchorLogical, viewportHeight, detailLayoutVersion]);\n const detailObserverSnapshotCandidate = useMemo<\n CominsCommittedDetailObserverSnapshot<TData>\n >(\n () => ({\n rowLayoutKey,\n rowContentRevision,\n rowSlots: new Map(getRowHeight ? fullProjectionSlots.flatMap(slot => slot.kind === \"data\" && slot.autoHeight ? [[slot.rowId, slot] as const] : []) : []),\n contentWidth: detailContentWidth,\n projection: mixedProjection,\n viewportHeight:\n containerHeight || Math.max(1, rowHeight) * 12,\n }),\n [containerHeight, detailContentWidth, mixedProjection, rowHeight, rowLayoutKey, rowContentRevision, fullProjectionSlots, getRowHeight],\n );\n\n useLayoutEffect(() => {\n committedDetailObserverSnapshotRef.current =\n detailObserverSnapshotCandidate;\n\n if (detailElementsRef.current.size === 0) {\n disconnectDetailObserverIfIdle();\n return;\n }\n\n if (hasCominsResizeObserver()) {\n const currentObserver = detailObserverRef.current;\n const observer = currentObserver ?? createDetailObserver();\n\n if (currentObserver) {\n for (const observed of detailElementsRef.current.values()) {\n observer?.observe(observed.element);\n }\n }\n return;\n }\n\n const updates: Array<{\n height: number;\n rowId: CominsRowId;\n width: number;\n kind?: \"row\";\n }> = [];\n\n for (const observed of detailElementsRef.current.values()) {\n if (fallbackMeasuredDetailElementsRef.current.has(observed.element)) {\n continue;\n }\n\n fallbackMeasuredDetailElementsRef.current.add(observed.element);\n const rect = measureCominsElement(observed.element);\n\n if (Number.isFinite(rect.height) && rect.height > 0) {\n updates.push({\n height: rect.height,\n rowId: observed.rowId,\n width: Math.round(rect.width),\n kind: observed.kind,\n });\n }\n }\n\n applyDetailMeasurementUpdates(updates);\n });\n const rowWindow = useMemo<CominsVirtualWindow<TData>>(() => {\n if (viewportHeightIndex) {\n const transaction = logicalAnchorTransaction && Math.abs(scrollTop - logicalAnchorTransaction.actualPhysical) <= .5 ? logicalAnchorTransaction : null;\n const logical = viewportAnchorLogical ?? transaction?.targetLogical;\n const range = getCominsMixedVirtualRange({ heightIndex: viewportHeightIndex, overscan: virtualBufferSize, physicalScrollTop: logical === undefined ? scrollTop : getCominsPhysicalScrollTop(logical, viewportHeightIndex.getTotalHeight(), viewportHeight), viewportHeight });\n const slots: CominsVirtualSlot<TData>[] = projectCoreViewportWindow(fullProjectionSlots.filter((slot): slot is CominsDataVirtualSlot<TData> => slot.kind === \"data\"), range, viewportHeightIndex.rowCount)\n .map(slot => slot.kind === \"placeholder\" ? { ...slot, height: viewportHeightIndex.getHeight(slot.absoluteIndex) } : slot);\n return { mixed: true, renderOffset: logical === undefined ? range.renderOffset : scrollTop - (logical - range.logicalStartOffset), scrollHeight: range.physicalScrollHeight, slots };\n }\n if (virtualized) {\n const safeRowHeight = Math.max(1, rowHeight);\n const viewportHeight = containerHeight || rowHeight * 12;\n\n if (mixedProjection) {\n const activeAnchorTransaction =\n logicalAnchorTransaction &&\n Math.abs(\n scrollTop - logicalAnchorTransaction.actualPhysical,\n ) <= 0.5\n ? logicalAnchorTransaction\n : null;\n const range = getCominsMixedVirtualRange({\n heightIndex: mixedProjection.heightIndex,\n overscan: virtualBufferSize,\n physicalScrollTop:\n activeAnchorTransaction?.requestedPhysical ?? scrollTop,\n viewportHeight,\n });\n\n return {\n mixed: true,\n renderOffset: activeAnchorTransaction\n ? activeAnchorTransaction.actualPhysical -\n (activeAnchorTransaction.targetLogical -\n range.logicalStartOffset)\n : range.renderOffset,\n scrollHeight: range.physicalScrollHeight,\n slots: mixedProjection.slots.slice(range.startIndex, range.endIndex),\n };\n }\n\n const totalHeight = visibleSlotCount * safeRowHeight;\n const maxPhysicalTotalHeight = 1_500_000;\n const physicalTotalHeight = Math.min(totalHeight, maxPhysicalTotalHeight);\n const logicalScrollableHeight = Math.max(0, totalHeight - viewportHeight);\n const physicalScrollableHeight = Math.max(0, physicalTotalHeight - viewportHeight);\n const scrollScale =\n logicalScrollableHeight > 0 && physicalScrollableHeight > 0\n ? logicalScrollableHeight / physicalScrollableHeight\n : 1;\n const logicalScrollTop = Math.min(logicalScrollableHeight, Math.max(0, scrollTop) * scrollScale);\n const startIndex = Math.max(0, Math.floor(logicalScrollTop / safeRowHeight) - virtualBufferSize);\n const endIndex = Math.min(\n visibleSlotCount,\n Math.ceil((logicalScrollTop + Math.max(0, viewportHeight)) / safeRowHeight) + virtualBufferSize,\n );\n const logicalTopSpacerHeight = startIndex * safeRowHeight;\n // Rows retain their full pixel height even when the scrollbar is compressed.\n const renderOffset = scrollTop - (logicalScrollTop - logicalTopSpacerHeight);\n\n return {\n mixed: false,\n renderOffset,\n scrollHeight: physicalTotalHeight,\n slots: fullProjectionSlots.slice(startIndex, endIndex),\n };\n }\n\n return {\n mixed: false,\n renderOffset: 0,\n scrollHeight: 0,\n slots: groupingActive\n ? fullProjectionSlots\n : fullProjectionSlots.slice(pageStartIndex, pageStartIndex + pageSize),\n };\n }, [\n containerHeight,\n detailLayoutVersion,\n fullProjectionSlots,\n groupingActive,\n logicalAnchorTransaction,\n mixedProjection,\n pageStartIndex,\n rowHeight,\n scrollTop,\n pageSize,\n virtualBufferSize,\n virtualized,\n visibleSlotCount,\n viewportHeightIndex,\n viewportHeight,\n viewportAnchorLogical,\n ]);\n const viewportRenderedRange = { startIndex: rowWindow.slots[0]?.kind === \"placeholder\" ? rowWindow.slots[0].absoluteIndex : rowWindow.slots[0]?.kind === \"data\" ? rowWindow.slots[0].absoluteIndex ?? 0 : 0, endIndex: 0 };\n const lastViewportSlot = rowWindow.slots.at(-1);\n viewportRenderedRange.endIndex = lastViewportSlot && lastViewportSlot.kind !== \"group\" && lastViewportSlot.absoluteIndex !== undefined ? lastViewportSlot.absoluteIndex + 1 : 0;\n const retryViewport = useCominsViewportRequests({ data: viewportContext?.data, range: viewportRenderedRange, maxConcurrentRequests: viewportContext?.config.maxConcurrentRequests, onRequest: viewportContext?.onRequest, onChangeData: viewportContext?.onChangeData });\n const currentVirtualProjection = useMemo<CominsVirtualProjection | null>(\n () =>\n !virtualized || viewportContext\n ? null\n : mixedProjection\n ? {\n heightIndex: mixedProjection.heightIndex,\n keys: mixedProjection.keys,\n mixed: true,\n }\n : {\n keys: fullProjectionSlots.map((slot) => slot.key),\n mixed: false,\n rowHeight: Math.max(1, rowHeight),\n visibleRowCount: visibleSlotCount,\n },\n [\n mixedProjection,\n fullProjectionSlots,\n rowHeight,\n virtualized,\n visibleSlotCount,\n ],\n );\n const previousVirtualProjection = previousVirtualProjectionRef.current;\n const pendingDetailAnchor = pendingDetailAnchorRef.current;\n const pendingVirtualAnchor =\n !pendingDetailAnchor &&\n currentVirtualProjection &&\n previousVirtualProjection &&\n currentVirtualProjection !== previousVirtualProjection &&\n containerRef.current\n ? captureCominsVirtualAnchor({\n logicalScrollTop:\n logicalAnchorTransaction &&\n Math.abs(\n containerRef.current.scrollTop -\n logicalAnchorTransaction.actualPhysical,\n ) <= 0.5\n ? logicalAnchorTransaction.targetLogical\n : undefined,\n physicalScrollTop: containerRef.current.scrollTop,\n projection: previousVirtualProjection,\n viewportHeight:\n containerRef.current.clientHeight || containerHeight || rowHeight * 12,\n })\n : undefined;\n const pendingAnchorTransaction =\n pendingDetailAnchor?.status === \"pending\"\n ? pendingDetailAnchor\n : pendingVirtualAnchor;\n useLayoutEffect(() => {\n if (viewportContext) return;\n if (!currentVirtualProjection) {\n previousVirtualProjectionRef.current = null;\n pendingDetailAnchorRef.current = null;\n logicalAnchorTransactionRef.current = null;\n setLogicalAnchorTransaction(null);\n return;\n }\n\n previousVirtualProjectionRef.current = currentVirtualProjection;\n\n if (pendingDetailAnchor?.status === \"cancelled\") {\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n\n if (\n currentPendingDetailAnchor?.revision ===\n pendingDetailAnchor.revision &&\n currentPendingDetailAnchor.status === \"cancelled\"\n ) {\n pendingDetailAnchorRef.current = null;\n }\n return;\n }\n\n const viewport = containerRef.current;\n\n // A local reorder should keep the drop position on screen, not follow a moved anchor Row.\n const treeMoveScrollTop = treeContext?.drag.pendingScrollTop.current ?? null;\n const rowMoveScrollTop = pendingRowMoveScrollTopRef.current ?? treeMoveScrollTop;\n if (viewport && rowMoveScrollTop !== null) {\n // Tree controlled data reaches the inner Table on the following state reconciliation.\n if (treeMoveScrollTop !== null && state.rows !== effectiveData) return;\n setCominsScrollTop(viewport, rowMoveScrollTop);\n pendingRowMoveScrollTopRef.current = null;\n if (treeContext) treeContext.drag.pendingScrollTop.current = null;\n pendingDetailAnchorRef.current = null;\n logicalAnchorTransactionRef.current = null;\n setLogicalAnchorTransaction(null);\n setScrollTop(viewport.scrollTop);\n return;\n }\n\n if (!viewport || !pendingAnchorTransaction) {\n return;\n }\n\n const nextKeys = getCominsVirtualProjectionKeys(currentVirtualProjection);\n const target = resolveCominsAnchorTarget({\n anchor: pendingAnchorTransaction.anchor,\n getNextHeight: (index) =>\n currentVirtualProjection.mixed\n ? currentVirtualProjection.heightIndex.getHeight(index)\n : currentVirtualProjection.rowHeight,\n nextKeys,\n previousKeys: pendingAnchorTransaction.previousKeys,\n });\n const anchorLogicalScrollTop = target\n ? (currentVirtualProjection.mixed\n ? currentVirtualProjection.heightIndex.getPrefixHeight(target.index)\n : target.index * currentVirtualProjection.rowHeight) +\n target.offsetWithinSlot\n : 0;\n const nextLogicalTotalHeight = currentVirtualProjection.mixed\n ? currentVirtualProjection.heightIndex.getTotalHeight()\n : currentVirtualProjection.visibleRowCount * currentVirtualProjection.rowHeight;\n const nextViewportHeight = viewport.clientHeight || pendingAnchorTransaction.previousViewportHeight;\n const nextLogicalScrollTop = Math.min(\n Math.max(0, anchorLogicalScrollTop),\n Math.max(0, nextLogicalTotalHeight - nextViewportHeight),\n );\n const nextPhysicalScrollTop = getCominsPhysicalScrollTop(\n nextLogicalScrollTop,\n nextLogicalTotalHeight,\n nextViewportHeight,\n );\n\n if (pendingDetailAnchor) {\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n\n if (\n currentPendingDetailAnchor?.revision !==\n pendingDetailAnchor.revision ||\n currentPendingDetailAnchor.status !== \"pending\"\n ) {\n return;\n }\n }\n\n if (scrollFrameRef.current !== null) {\n window.cancelAnimationFrame(scrollFrameRef.current);\n scrollFrameRef.current = null;\n }\n\n setCominsScrollTop(viewport, nextPhysicalScrollTop);\n\n if (pendingDetailAnchor) {\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n\n if (\n currentPendingDetailAnchor?.revision !==\n pendingDetailAnchor.revision ||\n currentPendingDetailAnchor.status !== \"pending\"\n ) {\n return;\n }\n }\n\n const actualPhysicalScrollTop = viewport.scrollTop;\n const revision =\n pendingDetailAnchor?.revision ??\n anchorRevisionRef.current + 1;\n const nextAnchorTransaction = currentVirtualProjection.mixed\n ? {\n actualPhysical: actualPhysicalScrollTop,\n requestedPhysical: nextPhysicalScrollTop,\n revision,\n targetLogical: nextLogicalScrollTop,\n }\n : null;\n\n anchorRevisionRef.current = Math.max(\n anchorRevisionRef.current,\n revision,\n );\n if (pendingDetailAnchor) {\n pendingDetailAnchorRef.current = null;\n }\n logicalAnchorTransactionRef.current = nextAnchorTransaction;\n pendingScrollTopRef.current = actualPhysicalScrollTop;\n setLogicalAnchorTransaction(nextAnchorTransaction);\n setScrollTop(actualPhysicalScrollTop);\n }, [currentVirtualProjection, pendingAnchorTransaction]);\n useLayoutEffect(() => {\n // Wait for both controlled data and the anchor-adjusted virtual window.\n // Fixed-height virtual slots reuse DOM nodes, so either pending update\n // can otherwise change the identity of an already focused handle.\n if (state.rows === effectiveData && (!virtualized || containerRef.current?.scrollTop === scrollTop)) {\n treeContext?.drag.restoreFocus();\n }\n });\n const currentTheme = theme ?? state.theme;\n const densityClass =\n currentTheme.density === \"compact\"\n ? \"text-[11px]\"\n : currentTheme.density === \"spacious\"\n ? \"text-[13px]\"\n : \"text-[length:var(--comins-font-size-base,12px)]\";\n const selectedRowIdSet = useMemo(() => new Set(state.selection.rowIds), [state.selection.rowIds]);\n const hasHorizontalOverflow =\n typeof columnWidthTotal === \"number\" && containerWidth > 0 ? columnWidthTotal > containerWidth + 1 : false;\n useLayoutEffect(() => {\n const nextContentWidth = containerRef.current?.scrollWidth ?? 0;\n const nextViewportOuterWidth = containerRef.current?.offsetWidth ?? 0;\n const nextViewportWidth = containerRef.current?.clientWidth ?? 0;\n\n setHorizontalScrollContentWidth((current) =>\n Math.abs(current - nextContentWidth) > 0.5 ? nextContentWidth : current);\n setHorizontalViewportOuterWidth((current) =>\n Math.abs(current - nextViewportOuterWidth) > 0.5 ? nextViewportOuterWidth : current);\n setHorizontalViewportWidth((current) =>\n Math.abs(current - nextViewportWidth) > 0.5 ? nextViewportWidth : current);\n }, [containerWidth, hasHorizontalOverflow, tableWidth]);\n const synchronizedHorizontalViewportWidth =\n horizontalViewportWidth > 0\n ? horizontalViewportWidth\n : containerWidth > 0\n ? containerWidth\n : undefined;\n const synchronizedHorizontalScrollbarWidth =\n horizontalViewportOuterWidth > 0\n ? horizontalViewportOuterWidth\n : synchronizedHorizontalViewportWidth;\n const synchronizedHorizontalContentWidth = horizontalScrollContentWidth > 0\n ? Math.max(typeof tableWidth === \"number\" ? tableWidth : 0, horizontalScrollContentWidth)\n : tableWidth;\n const resolvedHasMoreRows = groupingRequested || filteringRequested ? false : hasMoreRows;\n const resolvedLoading = loading;\n const resolvedLoadingMore = groupingRequested || filteringRequested ? false : loadingMore;\n const isEmpty = visibleSlotCount === 0;\n const shouldRenderSkeleton = resolvedLoading && isEmpty;\n const shouldRenderEmpty = !resolvedLoading && isEmpty;\n const shouldRenderInfiniteLoadingRow =\n !groupingRequested &&\n !filteringRequested &&\n (infiniteScroll || lazyLoad) &&\n resolvedLoadingMore &&\n resolvedHasMoreRows &&\n !isEmpty;\n const resolvedSkeletonRowCount = Math.max(\n 1,\n Math.floor(skeletonRowCount ?? Math.min(Math.max(1, state.pagination.pageSize), 5)),\n );\n const stateRowCount =\n (shouldRenderSkeleton ? resolvedSkeletonRowCount : shouldRenderEmpty ? 1 : 0) +\n (shouldRenderInfiniteLoadingRow ? 1 : 0);\n const renderedRowsHeight =\n rowWindow.slots.reduce(\n (height, slot) => height + getCominsSlotHeight(slot, rowHeight),\n 0,\n ) + stateRowCount * rowHeight;\n const emptyFillerHeight = virtualized ? 0 : Math.max(0, containerHeight - renderedRowsHeight);\n const renderedHeaderVisible = state.showHeader && (persistHeaderWhenEmpty || !isEmpty || resolvedLoading);\n\n const isCopyPasteKey = (event: React.KeyboardEvent, key: \"c\" | \"v\") =>\n (event.ctrlKey || event.metaKey) && event.key.toLowerCase() === key;\n const getVisibleEntryByRenderedIndex = (index: number) => {\n const slot = rowWindow.slots[index];\n\n return slot?.kind === \"data\" ? slot : undefined;\n };\n const getVisibleRowIdsBetween = (\n current: CominsTableState<TData>,\n anchorRowId: CominsRowId,\n focusRowId: CominsRowId,\n ) => {\n if (groupingProjection) {\n const anchorIndex = groupingProjection.visibleLeafRowIds.indexOf(anchorRowId);\n const focusIndex = groupingProjection.visibleLeafRowIds.indexOf(focusRowId);\n\n if (anchorIndex < 0 || focusIndex < 0) {\n return [focusRowId];\n }\n\n const start = Math.min(anchorIndex, focusIndex);\n const end = Math.max(anchorIndex, focusIndex);\n\n return groupingProjection.visibleLeafRowIds.slice(start, end + 1);\n }\n\n const visibleRowIndexes = treeContext ? current.rows.map((_row, index) => index) : getCominsSortedRowIndexes(current);\n const visibleEntries = visibleRowIndexes.flatMap<VisibleRowEntry<TData>>((dataIndex, visibleIndex) => {\n const row = current.rows[dataIndex];\n const rowId = current.rowIds[dataIndex];\n\n return row === undefined || rowId === undefined ? [] : [{ dataIndex, row, rowId, visibleIndex }];\n });\n const anchorIndex = visibleEntries.findIndex((entry) => entry.rowId === anchorRowId);\n const focusIndex = visibleEntries.findIndex((entry) => entry.rowId === focusRowId);\n\n if (anchorIndex < 0 || focusIndex < 0) {\n return [focusRowId];\n }\n\n const start = Math.min(anchorIndex, focusIndex);\n const end = Math.max(anchorIndex, focusIndex);\n\n return visibleEntries.slice(start, end + 1).map((entry) => entry.rowId);\n };\n const selectRowRangeByIds = (anchorRowId: CominsRowId, focusRowId: CominsRowId) => {\n commitState((current) => selectRows(current, getVisibleRowIdsBetween(current, anchorRowId, focusRowId)));\n };\n const selectRowsByVisibleIndexes = (indexes: readonly number[]) => {\n commitState((current) => {\n const rowIds = indexes.flatMap((index) => {\n if (viewportContext) {\n const rowId = current.rowIds[viewportContext.indices.indexOf(index)];\n return rowId === undefined ? [] : [rowId];\n }\n if (groupingProjection) {\n const rowId = groupingProjection.visibleLeafRowIds[index];\n\n return rowId === undefined ? [] : [rowId];\n }\n\n const entry = getVisibleEntryByRenderedIndex(index);\n\n return entry ? [entry.rowId] : [];\n });\n\n return selectRows(current, rowIds);\n });\n };\n const clearSuppressedSortClick = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n suppressed.cleanup();\n\n if (suppressed.timer !== null) {\n window.clearTimeout(suppressed.timer);\n }\n\n suppressedSortClickRef.current = null;\n };\n const suppressNextSortClick = (columnId: string) => {\n if (suppressedSortClickRef.current?.columnId === columnId) {\n return;\n }\n\n clearSuppressedSortClick();\n suppressedSortClickRef.current = { cleanup: () => undefined, columnId, timer: null };\n };\n const scheduleSuppressedSortClickClear = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n suppressed.cleanup();\n suppressed.cleanup = () => undefined;\n suppressed.timer = window.setTimeout(() => {\n if (suppressedSortClickRef.current === suppressed) {\n suppressedSortClickRef.current = null;\n }\n }, 0);\n };\n const keepSuppressedSortClickUntilPointerEnd = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n const handlePointerUp = () => scheduleSuppressedSortClickClear();\n const handlePointerCancel = () => clearSuppressedSortClick();\n const handleWindowBlur = () => clearSuppressedSortClick();\n\n suppressed.cleanup();\n suppressed.cleanup = () => {\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handleWindowBlur);\n };\n window.addEventListener(\"pointerup\", handlePointerUp, { once: true });\n window.addEventListener(\"pointercancel\", handlePointerCancel, { once: true });\n window.addEventListener(\"blur\", handleWindowBlur, { once: true });\n };\n const consumeSuppressedSortClick = (columnId: string) => {\n if (suppressedSortClickRef.current?.columnId !== columnId) {\n return false;\n }\n\n clearSuppressedSortClick();\n\n return true;\n };\n const activateHeaderSort = (column: CominsTableRuntimeColumn<TData>, additive: boolean) => {\n if (!column.sort) {\n return;\n }\n\n commitState((current) => {\n const nextModel = getNextSortModel(current.sortModel, column.id, multiSort && additive);\n const focused = document.activeElement;\n const header = focused instanceof HTMLElement && focused.classList.contains(\"comins-sort-indicator\")\n ? focused.closest<HTMLElement>(\"[data-comins-column-id]\") : null;\n if (header?.dataset.cominsColumnId === column.id && tableRootRef.current?.contains(header) && !nextModel.some(rule => rule.columnId === column.id)) {\n focusCominsElement(header, { preventScroll: true });\n }\n return setCominsSortModel(current, nextModel);\n });\n };\n\n const getColumnMoveTarget = (clientX: number, clientY: number): CominsColumnMoveHeader | null => {\n const targetHeader = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-column-id], [data-comins-column-group-id]\");\n\n if (!targetHeader) {\n return null;\n }\n\n const depth = Number(targetHeader.dataset.cominsColumnDepth);\n\n if (depth !== 0 && depth !== 1) {\n return null;\n }\n\n if (targetHeader.dataset.cominsColumnId) {\n return {\n depth,\n id: targetHeader.dataset.cominsColumnId,\n kind: \"column\",\n parentGroupId: targetHeader.dataset.cominsColumnParentGroupId,\n };\n }\n\n const groupId = targetHeader.dataset.cominsColumnGroupId;\n\n return groupId ? { depth, id: groupId, kind: \"group\" } : null;\n };\n const getColumnMoveTargetIndex = (target: CominsColumnMoveHeader) => {\n const targetColumnId =\n target.kind === \"column\"\n ? target.id\n : stateRef.current.columnGroups\n .find((group) => group.id === target.id)\n ?.children.find((childId) => visibleColumns.some((column) => column.id === childId));\n\n return targetColumnId\n ? stateRef.current.columnOrder.indexOf(targetColumnId)\n : -1;\n };\n const getColumnMoveHeaderPinned = (header: CominsColumnMoveHeader) => {\n if (header.kind === \"group\") {\n return stateRef.current.columnGroupState[header.id]?.pinned;\n }\n\n return header.parentGroupId\n ? stateRef.current.columnGroupState[header.parentGroupId]?.pinned\n : stateRef.current.columnState[header.id]?.pinned;\n };\n\n useImperativeHandle(\n ref,\n () => ({\n copySelection: async (target = \"auto\") => {\n const result = prepareSelectionCopy(target);\n if (!result) return null;\n await writeCominsClipboardText(result.text);\n return result.text;\n },\n fillSelection: (direction) => cellFill.fillSelection(direction),\n getSelectedRows: () => selectedRowData(stateRef.current),\n getSelectedCells: () => selectedCellValues(stateRef.current, getSelectionRowOrder()),\n getSelection: () => {\n const selection = stateRef.current.selection;\n return { ...selection, rowIds: [...selection.rowIds], cell: selection.cell ? { ...selection.cell } : null,\n cells: selection.cells?.map(cell => ({ ...cell })),\n range: selection.range ? { anchor: { ...selection.range.anchor }, focus: { ...selection.range.focus } } : null };\n },\n clearSort: () => commitState((current) => clearCominsSortState(current)),\n expand: (nodeIds) => treeContext?.onExpand(nodeIds),\n expandGroups: (groupIds) => {\n const onChangeExpandedGroupIds = rowGrouping?.onChangeExpandedGroupIds;\n\n if (!orderedGroupModel || typeof onChangeExpandedGroupIds !== \"function\") {\n return;\n }\n\n const requestedIds = groupIds === undefined\n ? orderedGroupModel.groupIds\n : groupIds.filter((groupId) => orderedGroupModel.groupsById.has(groupId));\n\n if (requestedIds.length === 0) {\n return;\n }\n\n const nextGroupIds = [...normalizedExpandedGroupIds];\n const nextGroupIdSet = new Set(nextGroupIds);\n\n for (const groupId of requestedIds) {\n if (!nextGroupIdSet.has(groupId)) {\n nextGroupIdSet.add(groupId);\n nextGroupIds.push(groupId);\n }\n }\n\n if (nextGroupIds.length !== normalizedExpandedGroupIds.length) {\n onChangeExpandedGroupIds(nextGroupIds);\n }\n },\n fold: (nodeIds) => treeContext?.onFold(nodeIds),\n foldGroups: (groupIds) => {\n const onChangeExpandedGroupIds = rowGrouping?.onChangeExpandedGroupIds;\n\n if (!orderedGroupModel || typeof onChangeExpandedGroupIds !== \"function\") {\n return;\n }\n\n if (groupIds === undefined) {\n if (normalizedExpandedGroupIds.length > 0) {\n onChangeExpandedGroupIds([]);\n }\n return;\n }\n\n if (groupIds.length === 0) {\n return;\n }\n\n const groupIdSet = new Set(\n groupIds.filter((groupId) => orderedGroupModel.groupsById.has(groupId)),\n );\n const nextGroupIds = normalizedExpandedGroupIds.filter(\n (groupId) => !groupIdSet.has(groupId),\n );\n\n if (nextGroupIds.length !== normalizedExpandedGroupIds.length) {\n onChangeExpandedGroupIds(nextGroupIds);\n }\n },\n getColumnLayout: () => serializeCominsColumnLayout(state),\n getSortModel: () => state.sortModel,\n getSortState: () => state.sort,\n setColumnLayout: (layout) =>\n commitState((current) => applyCominsColumnLayout(current, layout), { columnLayoutChanged: true }),\n setMoveTargetRow: (targetIdx, sourceIdx) =>\n commitState((current) => {\n if (treeContext || viewportContext || groupingRequested || filteringRequested) {\n return current;\n }\n\n const visibleRowIds = getCominsSortedRowIndexes(current).flatMap((dataIndex) => {\n const rowId = current.rowIds[dataIndex];\n\n return rowId === undefined ? [] : [rowId];\n });\n const sourceRowId = visibleRowIds[sourceIdx];\n\n if (sourceRowId === undefined || targetIdx < 0 || sourceIdx < 0) {\n return current;\n }\n\n const nextVisibleRowIds = visibleRowIds.filter((rowId) => rowId !== sourceRowId);\n const targetPosition = Math.min(nextVisibleRowIds.length, targetIdx);\n nextVisibleRowIds.splice(targetPosition, 0, sourceRowId);\n\n const rowById = new Map(current.rowIds.map((rowId, index) => [rowId, current.rows[index]] as const));\n const nextRows = nextVisibleRowIds.flatMap((rowId) => {\n const row = rowById.get(rowId);\n\n return row === undefined ? [] : [row];\n });\n\n if (nextRows.length !== current.rows.length) {\n return current;\n }\n\n return {\n ...current,\n rowIds: nextVisibleRowIds,\n rows: nextRows,\n sort: null,\n sortModel: [],\n };\n }),\n setSelectedRow: (index) => selectRowsByVisibleIndexes([index]),\n setSelectedRows: (indexes) => selectRowsByVisibleIndexes(indexes),\n setSortModel: (sortModel) => commitState((current) => setCominsSortModel(current, sortModel)),\n setSortState: (sort) => commitState((current) => setCominsSortState(current, sort)),\n }),\n [\n fillHandle,\n cellSelection,\n onChangeData,\n onClipboardError,\n groupingProjection,\n groupingRequested,\n filteringRequested,\n normalizedExpandedGroupIds,\n orderedGroupModel,\n rowGrouping,\n rowWindow.slots,\n projectedDataIndexes,\n viewportContext,\n state,\n treeContext,\n ],\n );\n\n const clearColumnPointerInteraction = () => {\n const interaction = columnPointerInteractionRef.current;\n\n if (interaction) {\n interaction.cleanup();\n\n if (interaction.timer !== null) {\n window.clearTimeout(interaction.timer);\n }\n }\n\n columnPointerInteractionRef.current = null;\n setMovingColumnId(null);\n setMovingGroupId(null);\n setColumnMovePointer(null);\n setColumnMoveTarget(null);\n };\n\n useEffect(\n () => () => {\n clearColumnPointerInteraction();\n clearSuppressedSortClick();\n columnMoveAnimationCleanupRef.current?.();\n },\n [],\n );\n\n const captureColumnMoveAnimationSnapshot = () => {\n columnMoveAnimationCleanupRef.current?.();\n columnMoveAnimationCleanupRef.current = null;\n columnMoveAnimationSnapshotRef.current = null;\n\n if (typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n return;\n }\n\n const elements = [headerRef.current, containerRef.current, footerRef.current].flatMap((root) =>\n root\n ? Array.from(\n root.querySelectorAll<HTMLElement>(\n \"[data-comins-column-id], [data-comins-cell-column-id], [data-comins-summary-column-id]\",\n ),\n )\n : [],\n );\n const snapshot = new Map<HTMLElement, number>();\n\n for (const element of elements) {\n snapshot.set(element, getCominsElementRect(element).left);\n }\n\n columnMoveAnimationSnapshotRef.current = snapshot;\n };\n\n useLayoutEffect(() => {\n const snapshot = columnMoveAnimationSnapshotRef.current;\n columnMoveAnimationSnapshotRef.current = null;\n\n if (!snapshot) {\n return undefined;\n }\n\n const animatedElements: HTMLElement[] = [];\n\n for (const [element, previousLeft] of snapshot) {\n if (!element.isConnected) {\n continue;\n }\n\n const offset = previousLeft - getCominsElementRect(element).left;\n\n if (Math.abs(offset) < 0.5) {\n continue;\n }\n\n element.dataset.columnMoveAnimating = \"prepare\";\n element.style.setProperty(\"--comins-column-move-offset\", `${offset}px`);\n animatedElements.push(element);\n }\n\n if (animatedElements.length === 0) {\n return undefined;\n }\n\n void getCominsElementRect(animatedElements[0]);\n let frame = 0;\n let timeout = 0;\n const cleanup = () => {\n window.cancelAnimationFrame(frame);\n window.clearTimeout(timeout);\n\n for (const element of animatedElements) {\n delete element.dataset.columnMoveAnimating;\n element.style.removeProperty(\"--comins-column-move-offset\");\n }\n\n if (columnMoveAnimationCleanupRef.current === cleanup) {\n columnMoveAnimationCleanupRef.current = null;\n }\n };\n\n columnMoveAnimationCleanupRef.current = cleanup;\n frame = window.requestAnimationFrame(() => {\n for (const element of animatedElements) {\n element.dataset.columnMoveAnimating = \"true\";\n element.style.setProperty(\"--comins-column-move-offset\", \"0px\");\n }\n });\n timeout = window.setTimeout(cleanup, 220);\n\n return cleanup;\n }, [state.columnOrder]);\n\n const beginColumnPointerInteraction = (options: CominsColumnPointerOptions) => {\n if (options.event.button !== 0) {\n return;\n }\n\n const pointerType: string = options.event.pointerType;\n const isMousePointer = pointerType === \"mouse\" || pointerType === \"\";\n const suppressPendingSort = () => {\n if (options.sortColumnId) {\n suppressNextSortClick(options.sortColumnId);\n }\n };\n const activateCurrent = (x: number, y: number) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current !== interaction || current.active || current.blocked) {\n return;\n }\n\n current.active = true;\n current.cancelSort = true;\n suppressPendingSort();\n options.activate(x, y);\n setColumnMoveTarget({ ...options.source, status: \"neutral\" });\n };\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current !== interaction) {\n return;\n }\n\n if (!current.active && !current.blocked && isMousePointer) {\n const intent = getCominsColumnMouseIntent({\n clientX: moveEvent.clientX,\n clientY: moveEvent.clientY,\n startX: current.startX,\n startY: current.startY,\n });\n\n if (intent === \"activate\") {\n activateCurrent(moveEvent.clientX, moveEvent.clientY);\n } else if (intent === \"cancel\") {\n current.blocked = true;\n current.cancelSort = true;\n suppressPendingSort();\n }\n }\n\n if (!current.active && !current.blocked && !isMousePointer) {\n const distance = Math.hypot(moveEvent.clientX - current.startX, moveEvent.clientY - current.startY);\n\n if (distance > 4) {\n current.blocked = true;\n current.cancelSort = true;\n window.clearTimeout(current.timer ?? undefined);\n suppressPendingSort();\n }\n }\n\n if (current.active) {\n moveEvent.preventDefault();\n setColumnMovePointer({ x: moveEvent.clientX, y: moveEvent.clientY });\n const target = getColumnMoveTarget(moveEvent.clientX, moveEvent.clientY);\n setColumnMoveTarget(target ? { ...target, status: options.resolveTarget(target) } : null);\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (current === interaction && current.active) {\n const target = getColumnMoveTarget(upEvent.clientX, upEvent.clientY);\n\n if (target && options.resolveTarget(target) === \"valid\") {\n options.commitTarget(target);\n }\n }\n\n if (current === interaction && current.cancelSort) {\n scheduleSuppressedSortClickClear();\n }\n\n clearColumnPointerInteraction();\n };\n const handlePointerCancel = () => {\n clearSuppressedSortClick();\n clearColumnPointerInteraction();\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n keyEvent.preventDefault();\n\n if (columnPointerInteractionRef.current === interaction && interaction.cancelSort) {\n keepSuppressedSortClickUntilPointerEnd();\n }\n\n clearColumnPointerInteraction();\n }\n };\n const handleWindowBlur = () => {\n clearSuppressedSortClick();\n clearColumnPointerInteraction();\n };\n const interaction: CominsColumnPointerInteraction = {\n active: false,\n blocked: false,\n cancelSort: false,\n cleanup: () => {\n window.removeEventListener(\"pointermove\", handlePointerMove, true);\n window.removeEventListener(\"pointerup\", handlePointerUp, true);\n window.removeEventListener(\"pointercancel\", handlePointerCancel, true);\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"blur\", handleWindowBlur);\n },\n id: options.id,\n kind: options.kind,\n pointerType,\n startX: options.event.clientX,\n startY: options.event.clientY,\n timer: null,\n };\n\n clearColumnPointerInteraction();\n clearSuppressedSortClick();\n\n if (!isMousePointer) {\n interaction.timer = window.setTimeout(() => {\n const current = columnPointerInteractionRef.current;\n\n if (current === interaction && !current.active && !current.blocked) {\n activateCurrent(current.startX, current.startY);\n }\n }, 1000);\n }\n\n columnPointerInteractionRef.current = interaction;\n window.addEventListener(\"pointermove\", handlePointerMove, true);\n window.addEventListener(\"pointerup\", handlePointerUp, true);\n window.addEventListener(\"pointercancel\", handlePointerCancel, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"blur\", handleWindowBlur);\n\n if (options.activateImmediately) {\n activateCurrent(interaction.startX, interaction.startY);\n }\n };\n\n const beginHeaderPointerInteraction = (\n event: React.PointerEvent<HTMLElement>,\n cell: Extract<CominsHeaderCell<TData>, { kind: \"column\" }>,\n activateImmediately = false,\n ) => {\n const column = cell.column;\n\n if (\n column.lockPosition ||\n (!cell.groupId && stateRef.current.columnState[column.id]?.pinned !== undefined)\n ) {\n return;\n }\n\n const source: CominsColumnMoveHeader = {\n depth: cell.groupId ? 1 : 0,\n id: column.id,\n kind: \"column\",\n parentGroupId: cell.groupId,\n };\n beginColumnPointerInteraction({\n activateImmediately,\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setMovingGroupId(null);\n setMovingColumnId(column.id);\n },\n commitTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return;\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex >= 0) {\n const current = stateRef.current;\n const next = moveCominsColumn(current, column.id, targetIndex);\n\n if (\n next !== current &&\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index])\n ) {\n captureColumnMoveAnimationSnapshot();\n commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: column.id,\n kind: \"column\",\n resolveTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return \"invalid\";\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex < 0) {\n return \"invalid\";\n }\n\n const current = stateRef.current;\n const next = moveCominsColumn(current, column.id, targetIndex);\n\n return getCominsColumnDropStatus(\n source,\n target,\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index]),\n );\n },\n sortColumnId: column.id,\n source,\n });\n };\n\n const beginGroupPointerInteraction = (\n event: React.PointerEvent<HTMLElement>,\n group: CominsTableRuntimeColumnGroup,\n activateImmediately = false,\n ) => {\n if (group.lockPosition || stateRef.current.columnGroupState[group.id]?.pinned !== undefined) {\n return;\n }\n\n const source: CominsColumnMoveHeader = { depth: 0, id: group.id, kind: \"group\" };\n beginColumnPointerInteraction({\n activateImmediately,\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setMovingColumnId(null);\n setMovingGroupId(group.id);\n },\n commitTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return;\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex >= 0) {\n const current = stateRef.current;\n const next = moveCominsColumnGroup(current, group.id, targetIndex);\n\n if (\n next !== current &&\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index])\n ) {\n captureColumnMoveAnimationSnapshot();\n commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: group.id,\n kind: \"group\",\n resolveTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return \"invalid\";\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex < 0) {\n return \"invalid\";\n }\n\n const current = stateRef.current;\n const next = moveCominsColumnGroup(current, group.id, targetIndex);\n\n return getCominsColumnDropStatus(\n source,\n target,\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index]),\n );\n },\n source,\n });\n };\n\n type CominsRowSelectionModifierEvent = Pick<\n React.KeyboardEvent | React.MouseEvent,\n \"ctrlKey\" | \"metaKey\" | \"shiftKey\"\n >;\n\n const selectRowFromInteraction = (\n event: CominsRowSelectionModifierEvent,\n entry: VisibleRowEntry<TData>,\n ) => {\n if (event.shiftKey && lastRowAnchorRef.current !== null) {\n selectRowRangeByIds(lastRowAnchorRef.current, entry.rowId);\n lastRowAnchorRef.current = entry.rowId;\n return;\n }\n\n commitState((current) =>\n selectRow(current, entry.rowId, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n }),\n );\n lastRowAnchorRef.current = entry.rowId;\n };\n\n const handleRowKeyDown = (\n event: React.KeyboardEvent<HTMLTableRowElement>,\n entry: VisibleRowEntry<TData>,\n disabled: boolean,\n ) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n\n onKeyDownRow?.(createRowPayload(event, entry));\n\n if (event.defaultPrevented || event.target !== event.currentTarget) {\n return;\n }\n\n if (clipboard && isCopyPasteKey(event, \"c\")) return;\n\n if (clipboardPaste && isCopyPasteKey(event, \"v\")) return;\n\n if ((treeContext || viewportContext) && (isCopyPasteKey(event, \"c\") || isCopyPasteKey(event, \"v\"))) {\n event.preventDefault();\n return;\n }\n\n if (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n copiedRowRef.current = copyCominsRow(state, entry.rowId);\n return;\n }\n\n if (isCopyPasteKey(event, \"v\") && copiedRowRef.current) {\n event.preventDefault();\n commitState((current) => pasteCominsRow(current, copiedRowRef.current!, { mode: \"insert-after\", targetRowId: entry.rowId }));\n }\n };\n const getClipboardState = (current: CominsTableState<TData>): CominsTableState<TData> => {\n const visibleIndexes = new Map(projectedDataIndexes.map((index, visibleIndex) => [current.rowIds[index], visibleIndex]));\n const applicationPayload = (payload: CominsCellComponentPayload<TData>) => {\n const index = viewportContext ? viewportIndexById?.get(payload.row.id) ?? -1 : payload.row.dataIndex;\n const visibleIndex = viewportContext ? index : visibleIndexes.get(payload.row.id) ?? payload.row.index;\n const disabled = resolveRowProp(effectiveRowProps?.disabled, payload.row.data, visibleIndex) === true;\n return { ...payload, row: { ...payload.row, disabled, dataIndex: index, index: viewportContext ? index : payload.row.index } };\n };\n const guard = (value: CominsClipboardGuard<TData> | undefined) => typeof value === \"function\"\n ? (payload: CominsCellComponentPayload<TData>) => value(applicationPayload(payload)) : value;\n return { ...current, columns: current.columns.map(column => ({\n ...column,\n cell: { ...column.cell,\n parseClipboard: column.cell?.parseClipboard ? payload => column.cell!.parseClipboard!({ ...applicationPayload(payload), text: payload.text }) : undefined,\n validateFill: column.cell?.validateFill ? payload => column.cell!.validateFill!(applicationPayload(payload)) : undefined,\n props: (payload: CominsCellComponentPayload<TData>) => {\n const params = applicationPayload(payload);\n const original = column.cell?.props;\n const resolved = typeof original === \"function\" ? original(params) : original;\n return { ...resolved, copyable: guard(resolved?.copyable), pasteable: guard(resolved?.pasteable), disabled: params.row.disabled || guard(resolved?.disabled) };\n },\n },\n })) };\n };\n const getSelectionRowOrder = () => selectionRowIds;\n const prepareSelectionCopy = (target: CominsCopyTarget = \"auto\") => {\n const current = stateRef.current;\n copiedRangeRef.current = null; copiedCellRef.current = null; copiedRowRef.current = null;\n if (target !== \"rows\" && viewportContext && current.selection.range && !isLoadedCellRange(current.selection.range.anchor.rowId, current.selection.range.focus.rowId)) return null;\n const result = copySelectionData(getClipboardState(current), target, getSelectionRowOrder());\n if (viewportContext && result?.target === \"cells\") {\n const ids = selectedCellValues(current, getSelectionRowOrder()).map(cell => cell.rowId);\n const indexes = ids.map(id => current.rowIds.indexOf(id));\n const first = indexes.reduce((min, index) => Math.min(min, index), Infinity);\n const last = indexes.reduce((max, index) => Math.max(max, index), -1);\n if (last >= 0 && !isLoadedCellRange(current.rowIds[first]!, current.rowIds[last]!)) return null;\n }\n copiedRangeRef.current = result?.data ?? null;\n copiedCellRef.current = null;\n copiedRowRef.current = null;\n return result;\n };\n const handleCellKeyDown = (\n event: React.KeyboardEvent<HTMLTableCellElement>,\n entry: VisibleRowEntry<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n onKeyDownCell?.(createCellPayload(event, entry, column, columnIndex, getCominsCellValue(state, entry.row, column.id)));\n\n if (event.defaultPrevented) {\n return;\n }\n\n if (isNativeEditor(event.target)) return;\n if (isCopyPasteKey(event, \"c\") && clipboard) {\n // The native copy event writes synchronously through clipboardData.\n event.stopPropagation();\n return;\n }\n if (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n event.stopPropagation();\n if (viewportContext && state.selection.range && !isLoadedCellRange(state.selection.range.anchor.rowId, state.selection.range.focus.rowId)) return;\n const clipboardState = getClipboardState(state);\n copiedRangeRef.current = state.selection.range\n ? copyCominsCellRange(\n clipboardState,\n state.selection.range,\n groupingProjection?.visibleLeafRowIds ?? state.rowIds,\n )\n : null;\n copiedCellRef.current = copiedRangeRef.current ? null : copyCominsCell(clipboardState, address);\n return;\n }\n\n if (clipboardPaste && isCopyPasteKey(event, \"v\")) { event.stopPropagation(); return; }\n\n if (isCopyPasteKey(event, \"v\") && (copiedRangeRef.current || copiedCellRef.current)) {\n event.preventDefault();\n event.stopPropagation();\n if (viewportContext && copiedRangeRef.current) {\n const start = state.rowIds.indexOf(address.rowId);\n const end = start + copiedRangeRef.current.rows.length - 1;\n if (start < 0 || state.rowIds[end] === undefined || !isLoadedCellRange(address.rowId, state.rowIds[end]!)) return;\n }\n commitState((current) => {\n const clipboardState = getClipboardState(current);\n const next = copiedRangeRef.current\n ? pasteCominsCellRange(clipboardState, address, copiedRangeRef.current, clipboard ? getSelectionRowOrder() : groupingProjection?.visibleLeafRowIds ?? current.rowIds)\n : pasteCominsCell(clipboardState, address, copiedCellRef.current);\n return next === clipboardState ? current : { ...next, columns: current.columns };\n });\n }\n };\n const beginCellRangeDrag = (\n event: React.MouseEvent<HTMLTableCellElement>,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (!cellSelection || disabled || event.defaultPrevented || event.button !== 0) {\n return false;\n }\n\n const target = event.target instanceof Element ? event.target : null;\n const control = target?.closest(\n 'input, textarea, select, button, a[href], [contenteditable]:not([contenteditable=\"false\"]), [tabindex]',\n );\n if (control && control !== event.currentTarget && event.currentTarget.contains(control)) {\n return false;\n }\n\n // Cell selection owns this gesture. A document text selection can otherwise\n // route the native copy event outside the focused Table.\n event.preventDefault();\n event.currentTarget.ownerDocument.getSelection()?.removeAllRanges();\n focusCominsElement(event.currentTarget, { preventScroll: true });\n // Shift extends the existing Cell anchor in onClick; it must not start a drag.\n if (event.shiftKey) return false;\n\n rangeDragAnchorRef.current = address;\n rangeDragLastAddressRef.current = address;\n rangeDragMovedRef.current = false;\n return true;\n };\n const isLoadedCellRange = (anchorId: CominsRowId, focusId: CominsRowId) => {\n if (!viewportContext) return true;\n const first = state.rowIds.indexOf(anchorId), last = state.rowIds.indexOf(focusId);\n if (first < 0 || last < 0) return false;\n const start = Math.min(first, last), end = Math.max(first, last);\n for (let index = start; index < end; index++) if (viewportContext.indices[index + 1] !== viewportContext.indices[index]! + 1) return false;\n return true;\n };\n const getCellAddressFromPoint = (clientX: number, clientY: number): CominsCellAddress | null => {\n const element = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-cell-column-id][data-comins-data-index]\");\n const columnId = element?.dataset.cominsCellColumnId;\n const dataIndex = element?.dataset.cominsDataIndex === undefined ? NaN : Number(element.dataset.cominsDataIndex);\n const rowId = Number.isInteger(dataIndex) ? state.rowIds[dataIndex] : undefined;\n\n return element?.closest(\"[data-comins-table-instance-id]\") === tableRootRef.current && columnId && rowId !== undefined ? { columnId, rowId } : null;\n };\n const updateCellRangeDrag = (address: CominsCellAddress) => {\n if (!cellSelection) {\n return;\n }\n\n const anchor = rangeDragAnchorRef.current;\n\n if (!anchor || !isLoadedCellRange(anchor.rowId, address.rowId) || (anchor.rowId === address.rowId && anchor.columnId === address.columnId)) {\n return;\n }\n\n rangeDragMovedRef.current = true;\n rangeDragLastAddressRef.current = address;\n lastCellAnchorRef.current = anchor;\n commitState((current) => selectCellRange(current, { anchor, focus: address }));\n };\n const endCellRangeDrag = () => {\n if (!cellSelection) {\n return;\n }\n\n rangeDragAnchorRef.current = null;\n rangeDragLastAddressRef.current = null;\n };\n const beginCellRangePointerDrag = (\n event: React.PointerEvent<HTMLTableCellElement>,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (!beginCellRangeDrag(event, address, disabled)) {\n return;\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons !== 1) {\n return;\n }\n\n const nextAddress = getCellAddressFromPoint(moveEvent.clientX, moveEvent.clientY);\n\n if (nextAddress) {\n updateCellRangeDrag(nextAddress);\n }\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n endCellRangeDrag();\n };\n const handlePointerCancel = () => {\n cleanup();\n endCellRangeDrag();\n };\n\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n };\n const beginRowHandlePointerDrag = (\n event: React.PointerEvent<HTMLElement>,\n entry: VisibleRowEntry<TData>,\n disabled: boolean,\n draggable: boolean,\n ) => {\n if (disabled || !draggable || event.button !== 0) {\n return;\n }\n\n const sourceGroupId = groupingActive && rowGrouping\n ? rowGrouping.getRowGroupId(entry.row, entry.dataIndex)\n : undefined;\n const sourceTableId = normalizedTableTransfer?.tableId;\n const row = createEventRow(entry);\n\n if (onBeforeRowDrag?.({ event, row, sourceGroupId, sourceTableId }) === false) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const sourceRowId = entry.rowId;\n let crossTarget: CominsCrossTableRowTarget<TData, TGroup> | null = null;\n let autoScroll: ReturnType<typeof createCrossTableAutoScroll>;\n let finished = false;\n let lastPointerEvent = event.nativeEvent;\n let lastTarget: CominsRowDragTarget | null = null;\n let registeredCleanup: (() => void) | null = null;\n const notifyTarget = (pointerEvent: PointerEvent, target: CominsRowDragTarget) => {\n if (areCominsRowDragTargetsEqual(lastTarget, target)) {\n return;\n }\n\n lastTarget = target;\n onRowDrag?.({\n event: pointerEvent,\n row,\n sourceGroupId,\n sourceTableId,\n target,\n });\n };\n const finish = (\n pointerEvent: PointerEvent | null,\n result: CominsRowDragResult,\n reason: CominsRowDragReason,\n ) => {\n if (finished) {\n return;\n }\n\n finished = true;\n onAfterDragRow?.({\n event: pointerEvent,\n reason,\n result,\n row,\n sourceGroupId,\n sourceTableId,\n ...(lastTarget ? { target: lastTarget } : {}),\n });\n };\n const setActiveRowMoveState = (next: CominsRowMoveState | null) => {\n rowMoveStateRef.current = next;\n setRowMoveState(next);\n };\n const resolveCrossTarget = (\n clientX: number,\n clientY: number,\n ): CominsCrossTableRowTarget<TData, TGroup> | null => {\n const hit = getCrossTableTransferHit(clientX, clientY);\n\n if (!hit || !normalizedTableTransfer) {\n return null;\n }\n\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const sourceEndpoint = sourceSnapshot?.endpoint;\n const targetEndpoint = hit.snapshot.endpoint;\n const sourceGrouped = sourceEndpoint && isCominsGroupedTransferEndpoint(sourceEndpoint)\n ? sourceEndpoint\n : null;\n const targetGrouped = isCominsGroupedTransferEndpoint(targetEndpoint)\n ? targetEndpoint\n : null;\n const sourceDataIndex = sourceEndpoint?.data.findIndex(\n (row, dataIndex) => sourceEndpoint.getRowId(row, dataIndex) === sourceRowId,\n ) ?? -1;\n const sourceRow = sourceDataIndex >= 0 ? sourceEndpoint?.data[sourceDataIndex] : undefined;\n const rowElement = hit.element.closest<HTMLElement>(\"[data-comins-row-data-index]\");\n const groupElement = hit.element.closest<HTMLElement>(\"[data-comins-group-index]\");\n let marker = hit.snapshot.viewport ?? hit.root;\n let targetGroupId: CominsRowId | undefined;\n let targetRowId: CominsRowId | undefined;\n let structurallyValid =\n sourceRow !== undefined &&\n (sourceGrouped === null) === (targetGrouped === null);\n\n if (\n rowElement &&\n rowElement.closest<HTMLElement>(\"[data-comins-table-instance-id]\") === hit.root\n ) {\n marker = rowElement;\n const targetDataIndex = Number(rowElement.dataset.cominsRowDataIndex);\n const targetRow = Number.isInteger(targetDataIndex)\n ? targetEndpoint.data[targetDataIndex]\n : undefined;\n\n if (targetRow === undefined) {\n structurallyValid = false;\n } else {\n targetRowId = targetEndpoint.getRowId(targetRow, targetDataIndex);\n targetGroupId = targetGrouped?.getRowGroupId(targetRow, targetDataIndex);\n }\n } else if (\n groupElement &&\n groupElement.closest<HTMLElement>(\"[data-comins-table-instance-id]\") === hit.root\n ) {\n marker = groupElement;\n const targetGroupIndex = Number(groupElement.dataset.cominsGroupIndex);\n const targetGroup = targetGrouped && Number.isInteger(targetGroupIndex)\n ? targetGrouped.groups[targetGroupIndex]\n : undefined;\n\n if (!targetGrouped || targetGroup === undefined) {\n structurallyValid = false;\n } else {\n targetGroupId = targetGrouped.getGroupId(targetGroup);\n }\n } else if (targetGrouped) {\n structurallyValid = false;\n }\n\n if (structurallyValid && sourceGrouped && targetGrouped && sourceRow !== undefined) {\n const sourceGroupId = sourceGrouped.getRowGroupId(sourceRow, sourceDataIndex);\n\n structurallyValid =\n targetGroupId !== undefined &&\n targetGrouped.groups.some(\n (group) => targetGrouped.getGroupId(group) === targetGroupId,\n ) &&\n (sourceGroupId === targetGroupId || typeof targetGrouped.setRowGroupId === \"function\");\n }\n\n const intent: CominsTableTransferIntent<TData, TGroup> | null =\n structurallyValid && sourceRow !== undefined\n ? {\n kind: \"row\",\n row: sourceRow,\n sourceRowId,\n sourceTableId: sourceEndpoint!.tableId,\n targetGroupId,\n targetRowId,\n targetTableId: targetEndpoint.tableId,\n }\n : null;\n const valid = Boolean(intent) && (hit.snapshot.config.canTransfer?.(intent!) ?? true);\n\n return {\n ...hit,\n marker,\n targetGroupId,\n targetRowId,\n valid,\n };\n };\n const updateTarget = (\n clientX: number,\n clientY: number,\n pointerEvent: PointerEvent = lastPointerEvent,\n ) => {\n lastPointerEvent = pointerEvent;\n const pointElement = document.elementFromPoint(clientX, clientY);\n const target = pointElement\n ?.closest<HTMLElement>(\"[data-comins-row-data-index], [data-comins-group-index]\");\n const targetTableInstanceId = pointElement\n ?.closest<HTMLElement>(\"[data-comins-table-instance-id]\")\n ?.dataset.cominsTableInstanceId;\n\n if (target && targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n\n if (target.dataset.cominsRowDataIndex !== undefined) {\n const targetDataIndex = Number(target.dataset.cominsRowDataIndex);\n\n if (!Number.isInteger(targetDataIndex)) {\n autoScroll.stop();\n setActiveRowMoveState({ sourceRowId, valid: false });\n notifyTarget(pointerEvent, { tableId: sourceTableId, valid: false });\n return;\n }\n\n const targetRow = stateRef.current.rows[targetDataIndex];\n const targetGroupId = groupingActive && rowGrouping && targetRow !== undefined\n ? rowGrouping.getRowGroupId(targetRow, targetDataIndex)\n : undefined;\n const sourceGroupId = groupingActive && rowGrouping\n ? rowGrouping.getRowGroupId(entry.row, entry.dataIndex)\n : undefined;\n const valid =\n targetGroupId === undefined ||\n sourceGroupId === targetGroupId ||\n (typeof rowGrouping?.setRowGroupId === \"function\" && typeof onChangeData === \"function\");\n\n setActiveRowMoveState({ sourceRowId, targetDataIndex, targetGroupId, valid });\n autoScroll.update(containerRef.current, clientX, clientY, valid);\n notifyTarget(pointerEvent, {\n dataIndex: targetDataIndex,\n groupId: targetGroupId,\n rowId: targetRow === undefined\n ? undefined\n : stateRef.current.getRowId(targetRow, targetDataIndex),\n tableId: sourceTableId,\n valid,\n });\n return;\n }\n\n const targetGroupIndex = Number(target.dataset.cominsGroupIndex);\n const targetGroupId = Number.isInteger(targetGroupIndex)\n ? orderedGroupModel?.groupIds[targetGroupIndex]\n : undefined;\n\n if (targetGroupId !== undefined && groupingActive && rowGrouping) {\n const sourceGroupId = rowGrouping.getRowGroupId(entry.row, entry.dataIndex);\n const valid =\n sourceGroupId === targetGroupId ||\n (typeof rowGrouping.setRowGroupId === \"function\" && typeof onChangeData === \"function\");\n\n setActiveRowMoveState({ sourceRowId, targetGroupId, valid });\n autoScroll.update(containerRef.current, clientX, clientY, valid);\n notifyTarget(pointerEvent, {\n groupId: targetGroupId,\n tableId: sourceTableId,\n valid,\n });\n }\n return;\n }\n\n if (targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n if (pointElement?.closest(\".comins-row-move-placeholder\")) {\n autoScroll.update(containerRef.current, clientX, clientY, rowMoveStateRef.current?.valid === true);\n return;\n }\n setActiveRowMoveState({ sourceRowId, valid: false });\n autoScroll.update(containerRef.current, clientX, clientY, true);\n return;\n }\n\n crossTarget = resolveCrossTarget(clientX, clientY);\n\n if (crossTarget) {\n setExternalDropMarker(crossTarget.marker, \"row\", crossTarget.valid);\n setActiveRowMoveState({\n sourceRowId,\n targetGroupId: crossTarget.targetGroupId,\n targetTableId: crossTarget.snapshot.endpoint.tableId,\n valid: crossTarget.valid,\n });\n notifyTarget(pointerEvent, {\n groupId: crossTarget.targetGroupId,\n rowId: crossTarget.targetRowId,\n tableId: crossTarget.snapshot.endpoint.tableId,\n valid: crossTarget.valid,\n });\n autoScroll.update(\n crossTarget.snapshot.viewport,\n clientX,\n clientY,\n crossTarget.valid,\n );\n return;\n }\n\n clearExternalDropMarker();\n autoScroll.stop();\n setActiveRowMoveState({ sourceRowId, valid: false });\n notifyTarget(pointerEvent, { valid: false });\n };\n autoScroll = createCrossTableAutoScroll(updateTarget);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons !== 1) {\n return;\n }\n\n updateTarget(moveEvent.clientX, moveEvent.clientY, moveEvent);\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handleWindowBlur);\n window.removeEventListener(\"keydown\", handleKeyDown);\n autoScroll.stop();\n\n if (activePointerGestureCleanupRef.current === registeredCleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n updateTarget(upEvent.clientX, upEvent.clientY, upEvent);\n\n const moveState = rowMoveStateRef.current;\n const finalCrossTarget = crossTarget;\n cleanup();\n clearExternalDropMarker();\n setActiveRowMoveState(null);\n\n if (!moveState?.valid) {\n finish(upEvent, \"rejected\", \"invalid-target\");\n return;\n }\n\n if (moveState.targetTableId && finalCrossTarget && normalizedTableTransfer) {\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const targetSnapshot = getRegisteredTransferSnapshot(moveState.targetTableId);\n\n if (\n !sourceSnapshot ||\n !targetSnapshot ||\n targetSnapshot.instanceId !== finalCrossTarget.snapshot.instanceId\n ) {\n finish(upEvent, \"rejected\", \"stale-target\");\n return;\n }\n\n const rejectedConflict: {\n conflict?: CominsTableTransferConflict<TData, TGroup>;\n } = {};\n const result = transferCominsRowBetweenTables({\n resolveConflict: (conflict) => {\n const policy = targetSnapshot.config.resolveConflict?.(conflict) === \"overwrite\"\n ? \"overwrite\"\n : \"reject\";\n\n if (policy === \"reject\" && rejectedConflict.conflict === undefined) {\n rejectedConflict.conflict = conflict;\n }\n\n return policy;\n },\n source: sourceSnapshot.endpoint,\n sourceRowId,\n target: targetSnapshot.endpoint,\n targetGroupId: finalCrossTarget.targetGroupId,\n targetRowId: finalCrossTarget.targetRowId,\n });\n\n if (result && emitCominsTableTransfer(normalizedTableTransfer.coordinator, result)) {\n scheduleTransferFocus(targetSnapshot.endpoint.tableId, \"row\", sourceRowId);\n finish(upEvent, \"moved\", \"drop\");\n } else if (rejectedConflict.conflict) {\n const rejection: CominsTableTransferRejection<TData, TGroup> = Object.freeze({\n conflict: rejectedConflict.conflict,\n kind: \"row\",\n reason: \"duplicate-id\",\n sourceTableId: sourceSnapshot.endpoint.tableId,\n targetTableId: targetSnapshot.endpoint.tableId,\n });\n\n showTransferRejectionFeedback(\n rejection,\n targetSnapshot,\n upEvent.clientX,\n upEvent.clientY,\n );\n emitCominsTableTransferRejected(normalizedTableTransfer.coordinator, rejection);\n finish(upEvent, \"rejected\", \"duplicate-id\");\n } else {\n finish(upEvent, \"rejected\", \"stale-target\");\n }\n return;\n }\n\n if (groupingActive && rowGrouping && moveState.targetGroupId !== undefined) {\n const current = stateRef.current;\n const next = moveCominsRowToGroup(current, {\n getRowGroupId: rowGrouping.getRowGroupId,\n setRowGroupId: rowGrouping.setRowGroupId,\n sourceRowId,\n targetGroupId: moveState.targetGroupId,\n targetRowId: moveState.targetDataIndex === undefined\n ? undefined\n : current.rowIds[moveState.targetDataIndex],\n });\n const changed =\n current.rows.length !== next.rows.length ||\n current.rows.some((currentRow, index) => currentRow !== next.rows[index]);\n\n if (\n sourceGroupId !== moveState.targetGroupId &&\n !expandedGroupIdSet.has(moveState.targetGroupId)\n ) {\n pendingGroupDisclosureFocusRef.current = moveState.targetGroupId;\n }\n\n if (changed && virtualized) pendingRowMoveScrollTopRef.current = containerRef.current?.scrollTop ?? null;\n commitState(next);\n finish(upEvent, changed ? \"moved\" : \"cancelled\", changed ? \"drop\" : \"unchanged\");\n return;\n }\n\n if (moveState.targetDataIndex !== undefined) {\n const current = stateRef.current;\n const next = moveCominsRow(current, sourceRowId, moveState.targetDataIndex);\n const changed =\n current.rows.length !== next.rows.length ||\n current.rows.some((currentRow, index) => currentRow !== next.rows[index]);\n\n if (changed && virtualized) pendingRowMoveScrollTopRef.current = containerRef.current?.scrollTop ?? null;\n commitState(next);\n finish(upEvent, changed ? \"moved\" : \"cancelled\", changed ? \"drop\" : \"unchanged\");\n return;\n }\n\n finish(upEvent, \"rejected\", \"invalid-target\");\n };\n const cancel = (\n pointerEvent: PointerEvent | null,\n reason: Extract<CominsRowDragReason, \"blur\" | \"escape\" | \"pointer-cancel\">,\n ) => {\n cleanup();\n clearExternalDropMarker();\n setActiveRowMoveState(null);\n finish(pointerEvent, \"cancelled\", reason);\n };\n const handlePointerCancel = (cancelEvent: PointerEvent) => {\n cancel(cancelEvent, \"pointer-cancel\");\n };\n const handleWindowBlur = () => {\n cancel(null, \"blur\");\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n keyEvent.preventDefault();\n cancel(null, \"escape\");\n }\n };\n\n registeredCleanup = () => cancel(null, \"pointer-cancel\");\n updateTarget(event.clientX, event.clientY, event.nativeEvent);\n registerActivePointerGesture(registeredCleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handleWindowBlur);\n window.addEventListener(\"keydown\", handleKeyDown);\n };\n const beginRowGroupHandlePointerDrag = (\n event: React.PointerEvent<HTMLElement>,\n sourceGroupId: CominsRowId,\n ) => {\n const onChangeGroups = rowGrouping?.onChangeGroups;\n const crossTableEnabled = Boolean(normalizedTableTransfer);\n\n if (\n event.button !== 0 ||\n !rowGrouping?.groupDraggable ||\n (typeof onChangeGroups !== \"function\" && !crossTableEnabled) ||\n !orderedGroupModel?.groupsById.has(sourceGroupId)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n let crossTarget: CominsCrossTableGroupTarget<TData, TGroup> | null = null;\n let autoScroll: ReturnType<typeof createCrossTableAutoScroll>;\n const setActiveGroupMoveState = (next: CominsRowGroupMoveState | null) => {\n rowGroupMoveStateRef.current = next;\n setRowGroupMoveState(next);\n };\n const resolveCrossTarget = (\n clientX: number,\n clientY: number,\n ): CominsCrossTableGroupTarget<TData, TGroup> | null => {\n const hit = getCrossTableTransferHit(clientX, clientY);\n\n if (!hit || !normalizedTableTransfer) {\n return null;\n }\n\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const sourceEndpoint = sourceSnapshot?.endpoint;\n const sourceGrouped = sourceEndpoint && isCominsGroupedTransferEndpoint(sourceEndpoint)\n ? sourceEndpoint\n : null;\n const targetGrouped = isCominsGroupedTransferEndpoint(hit.snapshot.endpoint)\n ? hit.snapshot.endpoint\n : null;\n const sourceGroupIndex = sourceGrouped?.groups.findIndex(\n (group) => sourceGrouped.getGroupId(group) === sourceGroupId,\n ) ?? -1;\n const sourceGroup = sourceGroupIndex >= 0\n ? sourceGrouped?.groups[sourceGroupIndex]\n : undefined;\n const groupElement = hit.element.closest<HTMLElement>(\"[data-comins-group-index]\");\n let marker = hit.snapshot.viewport ?? hit.root;\n let position: \"after\" | \"append\" | \"before\" = \"append\";\n let targetGroupId: CominsRowId | undefined;\n let structurallyValid = Boolean(sourceGrouped && targetGrouped && sourceGroup !== undefined);\n\n if (\n groupElement &&\n groupElement.closest<HTMLElement>(\"[data-comins-table-instance-id]\") === hit.root\n ) {\n marker = groupElement;\n const targetGroupIndex = Number(groupElement.dataset.cominsGroupIndex);\n const targetGroup = targetGrouped && Number.isInteger(targetGroupIndex)\n ? targetGrouped.groups[targetGroupIndex]\n : undefined;\n\n if (targetGroup === undefined) {\n structurallyValid = false;\n } else {\n targetGroupId = targetGrouped!.getGroupId(targetGroup);\n const bounds = getCominsElementRect(groupElement);\n position = clientY >= bounds.top + bounds.height / 2 ? \"after\" : \"before\";\n }\n } else if (!targetGrouped || targetGrouped.groups.length > 0) {\n structurallyValid = false;\n }\n\n const intent: CominsTableTransferIntent<TData, TGroup> | null =\n structurallyValid && sourceGrouped && sourceGroup !== undefined\n ? {\n group: sourceGroup,\n kind: \"group\",\n rows: sourceGrouped.data.filter(\n (row, dataIndex) =>\n sourceGrouped.getRowGroupId(row, dataIndex) === sourceGroupId,\n ),\n sourceGroupId,\n sourceTableId: sourceGrouped.tableId,\n targetGroupId,\n targetTableId: hit.snapshot.endpoint.tableId,\n }\n : null;\n const valid = Boolean(intent) && (hit.snapshot.config.canTransfer?.(intent!) ?? true);\n\n return {\n ...hit,\n marker,\n position,\n targetGroupId,\n valid,\n };\n };\n const updateTarget = (clientX: number, clientY: number) => {\n const pointElement = document.elementFromPoint(clientX, clientY);\n const targetRow = pointElement?.closest<HTMLElement>(\"[data-comins-group-index]\");\n const targetTableInstanceId = pointElement\n ?.closest<HTMLElement>(\"[data-comins-table-instance-id]\")\n ?.dataset.cominsTableInstanceId;\n\n if (targetRow && targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n\n if (typeof onChangeGroups !== \"function\") {\n autoScroll.stop();\n setActiveGroupMoveState(null);\n return;\n }\n\n const targetGroupIndex = Number(targetRow.dataset.cominsGroupIndex);\n const targetGroupId = Number.isInteger(targetGroupIndex)\n ? orderedGroupModel.groupIds[targetGroupIndex]\n : undefined;\n\n if (targetGroupId === undefined) {\n autoScroll.stop();\n setActiveGroupMoveState(null);\n return;\n }\n\n const bounds = getCominsElementRect(targetRow);\n const position = clientY >= bounds.top + bounds.height / 2 ? \"after\" : \"before\";\n\n setActiveGroupMoveState({ position, sourceGroupId, targetGroupId });\n autoScroll.update(containerRef.current, clientX, clientY, true);\n return;\n }\n\n if (targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n setActiveGroupMoveState(null);\n autoScroll.update(containerRef.current, clientX, clientY, typeof onChangeGroups === \"function\");\n return;\n }\n\n crossTarget = resolveCrossTarget(clientX, clientY);\n\n if (crossTarget) {\n setExternalDropMarker(\n crossTarget.marker,\n \"group\",\n crossTarget.valid,\n crossTarget.position,\n );\n setActiveGroupMoveState({\n position: crossTarget.position,\n sourceGroupId,\n targetGroupId: crossTarget.targetGroupId,\n targetTableId: crossTarget.snapshot.endpoint.tableId,\n });\n autoScroll.update(\n crossTarget.snapshot.viewport,\n clientX,\n clientY,\n crossTarget.valid,\n );\n return;\n }\n\n clearExternalDropMarker();\n autoScroll.stop();\n setActiveGroupMoveState(null);\n };\n autoScroll = createCrossTableAutoScroll(updateTarget);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons === 1) {\n updateTarget(moveEvent.clientX, moveEvent.clientY);\n }\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n window.removeEventListener(\"keydown\", handleKeyDown);\n autoScroll.stop();\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n updateTarget(upEvent.clientX, upEvent.clientY);\n\n const moveState = rowGroupMoveStateRef.current;\n const finalCrossTarget = crossTarget;\n cleanup();\n clearExternalDropMarker();\n setActiveGroupMoveState(null);\n\n if (\n moveState?.targetTableId &&\n finalCrossTarget?.valid &&\n normalizedTableTransfer\n ) {\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const targetSnapshot = getRegisteredTransferSnapshot(moveState.targetTableId);\n\n if (\n !sourceSnapshot ||\n !targetSnapshot ||\n targetSnapshot.instanceId !== finalCrossTarget.snapshot.instanceId\n ) {\n return;\n }\n\n const rejectedConflict: {\n conflict?: CominsTableTransferConflict<TData, TGroup>;\n } = {};\n const result = transferCominsGroupBetweenTables({\n position: finalCrossTarget.position,\n resolveConflict: (conflict) => {\n const policy = targetSnapshot.config.resolveConflict?.(conflict) === \"overwrite\"\n ? \"overwrite\"\n : \"reject\";\n\n if (policy === \"reject\" && rejectedConflict.conflict === undefined) {\n rejectedConflict.conflict = conflict;\n }\n\n return policy;\n },\n source: sourceSnapshot.endpoint,\n sourceGroupId,\n target: targetSnapshot.endpoint,\n targetGroupId: finalCrossTarget.targetGroupId,\n });\n\n if (result && emitCominsTableTransfer(normalizedTableTransfer.coordinator, result)) {\n scheduleTransferFocus(targetSnapshot.endpoint.tableId, \"group\", sourceGroupId);\n } else if (rejectedConflict.conflict) {\n const rejection: CominsTableTransferRejection<TData, TGroup> = Object.freeze({\n conflict: rejectedConflict.conflict,\n kind: \"group\",\n reason: \"duplicate-id\",\n sourceTableId: sourceSnapshot.endpoint.tableId,\n targetTableId: targetSnapshot.endpoint.tableId,\n });\n\n showTransferRejectionFeedback(\n rejection,\n targetSnapshot,\n upEvent.clientX,\n upEvent.clientY,\n );\n emitCominsTableTransferRejected(normalizedTableTransfer.coordinator, rejection);\n }\n return;\n }\n\n if (\n !moveState ||\n moveState.position === \"append\" ||\n moveState.targetGroupId === undefined ||\n moveState.sourceGroupId === moveState.targetGroupId\n ) {\n return;\n }\n\n const currentGroups = rowGrouping.groups;\n const fromIndex = currentGroups.findIndex(\n (group) => rowGrouping.getGroupId(group) === moveState.sourceGroupId,\n );\n const nextGroups = moveCominsRowGroup({\n getGroupId: rowGrouping.getGroupId,\n groups: currentGroups,\n position: moveState.position,\n sourceGroupId: moveState.sourceGroupId,\n targetGroupId: moveState.targetGroupId,\n });\n const toIndex = nextGroups.findIndex(\n (group) => rowGrouping.getGroupId(group) === moveState.sourceGroupId,\n );\n const changed =\n fromIndex >= 0 &&\n toIndex >= 0 &&\n currentGroups.some((group, index) => group !== nextGroups[index]);\n\n if (changed) {\n onChangeGroups?.(nextGroups, {\n fromIndex,\n groupId: moveState.sourceGroupId,\n reason: \"move\",\n targetGroupId: moveState.targetGroupId,\n toIndex,\n });\n }\n };\n const handlePointerCancel = () => {\n cleanup();\n clearExternalDropMarker();\n setActiveGroupMoveState(null);\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n handlePointerCancel();\n }\n };\n\n setActiveGroupMoveState({\n position: \"before\",\n sourceGroupId,\n targetGroupId: sourceGroupId,\n });\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n window.addEventListener(\"keydown\", handleKeyDown);\n };\n const movingColumn = movingColumnId\n ? visibleColumns.find((visibleColumn) => visibleColumn.id === movingColumnId)\n : undefined;\n const movingGroup = movingGroupId ? state.columnGroups.find((group) => group.id === movingGroupId) : undefined;\n const movingHeaderLabel = movingColumn\n ? getCominsColumnPlaceholderText(movingColumn.label, movingColumn.id)\n : movingGroup\n ? getCominsColumnPlaceholderText(movingGroup.label, movingGroup.id)\n : undefined;\n\n const changeColumnFilterRule = (columnId: string, nextRule: CominsColumnFilterRule | null) => {\n const filtering = columnFiltering;\n const onChangeModel = filtering?.onChangeModel;\n\n if (!filtering || typeof onChangeModel !== \"function\") {\n return;\n }\n\n const currentModel = Array.isArray(filtering.model) ? filtering.model : [];\n const currentIndex = currentModel.findIndex((rule) => rule?.columnId === columnId);\n const nextModel = currentModel.filter((rule) => rule?.columnId !== columnId);\n\n if (nextRule) {\n nextModel.splice(currentIndex < 0 ? nextModel.length : currentIndex, 0, nextRule);\n }\n\n onChangeModel(nextModel);\n };\n\n const renderHeaderCell = (cell: CominsHeaderCell<TData>, fallbackIndex: number) => {\n if (cell.kind === \"group\") {\n const isDropTarget = columnMoveTarget?.kind === \"group\" && columnMoveTarget.id === cell.groupId;\n const isGroupPlaceholder = movingGroupId === cell.groupId;\n const groupPositionLocked =\n cell.group.lockPosition === true ||\n state.columnGroupState[cell.groupId]?.pinned !== undefined;\n const groupColumnIds = visibleColumns\n .map((column) => column.id)\n .filter((columnId) => cell.group.children.includes(columnId));\n const firstGroupPin = groupColumnIds[0]\n ? getPinnedColumnAttributes(groupColumnIds[0])\n : undefined;\n const lastGroupPin = groupColumnIds.at(-1)\n ? getPinnedColumnAttributes(groupColumnIds.at(-1)!)\n : undefined;\n const groupPinned = firstGroupPin?.pinned && groupColumnIds.every(\n (columnId) => getPinnedColumnAttributes(columnId).pinned === firstGroupPin.pinned,\n )\n ? firstGroupPin.pinned\n : undefined;\n const groupPinStyle = groupPinned === \"left\"\n ? firstGroupPin?.style\n : groupPinned === \"right\"\n ? lastGroupPin?.style\n : undefined;\n const groupPinBoundary = groupPinned === \"left\"\n ? lastGroupPin?.boundary\n : groupPinned === \"right\"\n ? firstGroupPin?.boundary\n : undefined;\n const groupPlaceholderLabel = getCominsColumnPlaceholderText(cell.group.label, cell.groupId);\n return (\n <th\n aria-label={isGroupPlaceholder ? groupPlaceholderLabel : undefined}\n className={[\n \"comins-table__th comins-table__group-th px-3 py-2 text-left font-semibold\",\n isGroupPlaceholder ? \"comins-column-moving\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n colSpan={cell.colSpan}\n data-column-drop-target={isDropTarget ? \"true\" : undefined}\n data-column-drop-valid={\n isDropTarget && columnMoveTarget.status !== \"neutral\"\n ? columnMoveTarget.status === \"valid\"\n ? \"true\"\n : \"false\"\n : undefined\n }\n data-column-moving={isGroupPlaceholder ? \"true\" : undefined}\n data-column-placeholder={isGroupPlaceholder ? \"true\" : undefined}\n data-column-position-locked={groupPositionLocked ? \"true\" : undefined}\n data-comins-column-depth=\"0\"\n data-comins-column-group-id={cell.groupId}\n data-comins-column-end={groupColumnIds.at(-1) === visibleColumns.at(-1)?.id ? \"true\" : undefined}\n data-comins-pin-boundary={groupPinBoundary ? \"true\" : undefined}\n data-comins-pinned={groupPinned}\n data-testid={`header-group-${cell.groupId}`}\n key={`group-${cell.groupId}`}\n onPointerDown={(event) => beginGroupPointerInteraction(event, cell.group)}\n rowSpan={cell.rowSpan}\n scope=\"colgroup\"\n style={groupPinStyle}\n >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span\n {...(isGroupPlaceholder ? COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS : {})}\n aria-hidden={isGroupPlaceholder ? \"true\" : undefined}\n className=\"comins-table__header-content\"\n data-comins-header-body=\"true\"\n inert={isGroupPlaceholder ? true : undefined}\n ref={bindCominsColumnPlaceholderNativeBoundary}\n >\n {showColumnMoveHandle && !groupPositionLocked ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-column-move-handle\"\n data-comins-column-move-handle=\"true\"\n data-testid={`column-group-move-handle-${cell.groupId}`}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n beginGroupPointerInteraction(event, cell.group, true);\n }}\n >\n <CominsTableIcon name=\"columnMove\" />\n </span>\n ) : null}\n <span className=\"comins-table__header-label\">{isGroupPlaceholder ? null : cell.group.label}</span>\n </span>\n {isGroupPlaceholder ? (\n <span aria-hidden=\"true\" className=\"comins-column-placeholder-label\">\n {groupPlaceholderLabel}\n </span>\n ) : null}\n <span\n aria-hidden=\"true\"\n className=\"comins-table__resize\"\n data-resizing={resizingColumnId === cell.groupId ? \"true\" : undefined}\n data-testid={`resize-group-${cell.groupId}`}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const measuredWidth = getCominsElementRect(event.currentTarget.closest<HTMLTableCellElement>(\"th\"))?.width;\n const visibleWidthSnapshot = new Map<string, number>();\n\n for (const childId of cell.group.children) {\n const visibleColumn = visibleColumns.find((column) => column.id === childId);\n\n if (!visibleColumn) {\n continue;\n }\n\n const headerCell = Array.from(\n headerRef.current?.querySelectorAll<HTMLTableCellElement>(\"[data-comins-column-id]\") ?? [],\n ).find((element) => element.dataset.cominsColumnId === visibleColumn.id);\n const measuredColumnWidth = getCominsElementRect(headerCell)?.width;\n const fallbackWidth = stateRef.current.columnState[visibleColumn.id]?.width ?? visibleColumn.width ?? 160;\n\n visibleWidthSnapshot.set(\n visibleColumn.id,\n measuredColumnWidth && Number.isFinite(measuredColumnWidth) ? measuredColumnWidth : fallbackWidth,\n );\n }\n\n const fallbackGroupWidth = [...visibleWidthSnapshot.values()].reduce((sum, width) => sum + width, 0);\n const startWidth =\n measuredWidth && Number.isFinite(measuredWidth) ? measuredWidth : Math.max(1, fallbackGroupWidth);\n const resizeMaxWidth = getCominsPinnedBlockResizeMaxWidth(\n columnPinningBlocks,\n columnPinning,\n `group:${cell.groupId}`,\n containerWidth,\n );\n setResizingColumnId(cell.groupId);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n commitState(\n (current) => {\n let next = current;\n\n for (const [visibleColumnId, visibleColumnWidth] of visibleWidthSnapshot) {\n next = setCominsColumnWidth(next, visibleColumnId, visibleColumnWidth);\n }\n\n return setCominsColumnGroupWidth(\n next,\n cell.groupId,\n Math.min(resizeMaxWidth ?? Number.POSITIVE_INFINITY, startWidth + moveEvent.clientX - startX),\n );\n },\n { columnLayoutChanged: true },\n );\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n setResizingColumnId(null);\n };\n const handlePointerCancel = () => {\n cleanup();\n setResizingColumnId(null);\n };\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n }}\n >\n <span className=\"comins-table__resize-line\" />\n </span>\n </th>\n );\n }\n\n const column = cell.column;\n const index = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === column.id);\n const safeIndex = index >= 0 ? index : fallbackIndex;\n const columnState = state.columnState[column.id];\n const pinnedColumn = getPinnedColumnAttributes(column.id);\n const headerProps = column.header?.props ?? {};\n const sortRule = getSortRule(state.sortModel, column.id);\n const sortIndicatorState = getSortIndicatorState(state.sortModel, column.id);\n const sortIndicatorVisible = sortIndicatorState === \"asc\" || sortIndicatorState === \"desc\";\n const showSortPriority = sortRule !== null && state.sortModel.length > 1;\n const isMovingGroupChild = Boolean(movingGroup?.children.includes(column.id));\n const isColumnPlaceholder = movingColumnId === column.id || isMovingGroupChild;\n const columnPlaceholderLabel = getCominsColumnPlaceholderText(column.label, column.id);\n const headerClassName = [\n \"comins-table__th px-3 py-2 text-left font-semibold\",\n movingColumnId === column.id ? \"comins-column-moving\" : undefined,\n headerProps.className,\n ]\n .filter(Boolean)\n .join(\" \");\n const headerPayload = createHeaderComponentPayload(state, column, safeIndex);\n const headerRenderer = column.header?.render ?? column.header?.renderer;\n const headerRendererKind = column.header?.render ? \"render\" : \"legacy\";\n const cachedHeaderRendererBody = headerRenderer ? headerRendererBodyRef.current.get(column.id) : undefined;\n\n const shouldRefreshHeaderRendererBody =\n Boolean(headerRenderer) && (!isColumnPlaceholder || cachedHeaderRendererBody?.renderer !== headerRenderer || cachedHeaderRendererBody?.kind !== headerRendererKind);\n const headerRendererBody = headerRenderer\n ? shouldRefreshHeaderRendererBody\n ? headerRenderer(headerPayload)\n : cachedHeaderRendererBody?.body\n : null;\n\n if (headerRenderer && shouldRefreshHeaderRendererBody) {\n renderedHeaderRendererBodies.set(column.id, { body: headerRendererBody, renderer: headerRenderer, kind: headerRendererKind });\n } else if (headerRenderer && cachedHeaderRendererBody) {\n renderedHeaderRendererBodies.set(column.id, cachedHeaderRendererBody);\n }\n const useDefaultHeader = !headerRenderer || (headerRendererKind === \"render\" && headerRendererBody === undefined);\n const headerLeftSlots = useDefaultHeader\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"left\")\n : [];\n const headerRightSlots = useDefaultHeader\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"right\")\n : [];\n const hasHeaderComponents = headerLeftSlots.length > 0 || headerRightSlots.length > 0;\n const isDropTarget = columnMoveTarget?.kind === \"column\" && columnMoveTarget.id === column.id;\n const columnPositionLocked =\n column.lockPosition === true ||\n (!cell.groupId && columnState?.pinned !== undefined);\n const columnFilterKind = column.filter?.kind;\n const columnFilterable =\n filteringRequested &&\n (columnFilterKind === \"boolean\" ||\n columnFilterKind === \"date\" ||\n columnFilterKind === \"number\" ||\n columnFilterKind === \"text\");\n\n return (\n <th\n {...headerProps}\n aria-label={isColumnPlaceholder ? columnPlaceholderLabel : headerProps[\"aria-label\"] ?? (column.sort ? columnPlaceholderLabel : undefined)}\n aria-labelledby={isColumnPlaceholder ? undefined : headerProps[\"aria-labelledby\"]}\n className={headerClassName}\n colSpan={cell.colSpan}\n data-column-drop-target={isDropTarget ? \"true\" : undefined}\n data-column-drop-valid={\n isDropTarget && columnMoveTarget.status !== \"neutral\"\n ? columnMoveTarget.status === \"valid\"\n ? \"true\"\n : \"false\"\n : undefined\n }\n data-column-moving={movingColumnId === column.id ? \"true\" : undefined}\n data-column-placeholder={isColumnPlaceholder ? \"true\" : undefined}\n data-column-position-locked={columnPositionLocked ? \"true\" : undefined}\n data-comins-column-depth={cell.groupId ? \"1\" : \"0\"}\n data-comins-column-id={column.id}\n data-comins-column-end={column.id === visibleColumns.at(-1)?.id ? \"true\" : undefined}\n data-comins-column-index={safeIndex}\n data-comins-column-parent-group-id={cell.groupId}\n data-comins-pin-boundary={pinnedColumn.boundary ? \"true\" : undefined}\n data-comins-pinned={pinnedColumn.pinned}\n data-sort-count={sortRule ? state.sortModel.length : undefined}\n data-sort-direction={sortRule?.rule.direction}\n data-sort-priority={sortRule?.priority}\n data-sortable={column.sort ? \"true\" : \"false\"}\n data-filter-active={normalizedColumnFilterById.has(column.id) ? \"true\" : undefined}\n data-testid={`header-${column.id}`}\n aria-sort={column.sort ? getAriaSortState(state.sortModel, column.id) : undefined}\n key={`column-${column.id}`}\n onClick={(event) => {\n if (isColumnPlaceholder) {\n event.preventDefault();\n return;\n }\n\n headerProps.onClick?.(event);\n\n if (event.defaultPrevented || !column.sort) {\n return;\n }\n\n if (consumeSuppressedSortClick(column.id)) {\n return;\n }\n\n activateHeaderSort(column, event.shiftKey);\n }}\n onKeyDown={(event) => {\n if (isColumnPlaceholder) {\n event.preventDefault();\n return;\n }\n\n headerProps.onKeyDown?.(event);\n\n if (event.defaultPrevented || !column.sort) {\n return;\n }\n\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n activateHeaderSort(column, event.shiftKey);\n }\n }}\n onPointerDown={(event) => beginHeaderPointerInteraction(event, cell)}\n rowSpan={cell.rowSpan}\n scope=\"col\"\n style={{ width: columnState?.width ?? column.width, ...headerProps.style, ...pinnedColumn.style }}\n tabIndex={column.sort && !isColumnPlaceholder ? 0 : undefined}\n >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span\n {...(isColumnPlaceholder ? COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS : {})}\n aria-hidden={isColumnPlaceholder ? \"true\" : undefined}\n className=\"comins-table__header-content\"\n data-comins-header-body=\"true\"\n data-comins-header-components={hasHeaderComponents ? \"true\" : undefined}\n data-comins-sort-indicator-visible={sortIndicatorVisible ? \"true\" : undefined}\n inert={isColumnPlaceholder ? true : undefined}\n ref={bindCominsColumnPlaceholderNativeBoundary}\n >\n <span className=\"comins-table__header-slot\" data-comins-header-slot=\"left\">\n {showColumnMoveHandle && !columnPositionLocked ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-column-move-handle\"\n data-comins-column-move-handle=\"true\"\n data-testid={`column-move-handle-${column.id}`}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n beginHeaderPointerInteraction(event, cell, true);\n }}\n >\n <CominsTableIcon name=\"columnMove\" />\n </span>\n ) : null}\n {headerLeftSlots}\n </span>\n <span className=\"comins-table__header-label\">\n {!useDefaultHeader ? headerRendererBody : isColumnPlaceholder ? null : column.label}\n </span>\n <span className=\"comins-sort-meta\" data-sort-visible={sortIndicatorVisible ? \"true\" : undefined}>\n {column.sort ? <CominsTableIconButton\n aria-label={`Sort ${columnPlaceholderLabel}`}\n className=\"comins-sort-indicator\"\n data-sort-state={sortIndicatorState}\n data-sort-visible={sortIndicatorVisible ? \"true\" : undefined}\n data-testid={`sort-indicator-${column.id}`}\n onPointerDown={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()}\n icon={sortIndicatorState === \"asc\" ? \"sortAscending\" : sortIndicatorState === \"desc\" ? \"sortDescending\" : \"sortUnsorted\"}\n /> : null}\n {showSortPriority ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-sort-priority\"\n data-testid={`sort-priority-${column.id}`}\n >\n {sortRule.priority}\n </span>\n ) : null}\n </span>\n {showSortPriority ? (\n <span className=\"comins-table__sort-status\">\n {`Sorted ${sortRule.rule.direction === \"asc\" ? \"ascending\" : \"descending\"}, priority ${sortRule.priority} of ${state.sortModel.length}`}\n </span>\n ) : null}\n <span className=\"comins-table__header-slot\" data-comins-header-slot=\"right\">\n {columnFilterable && !isColumnPlaceholder ? (\n <CominsColumnFilterControl\n column={column}\n valueSource={{ columns: state.columns, rows: filterSourceRows, model: columnFiltering?.model ?? [], columnId: column.id }}\n onChangeModel={columnFiltering?.onChangeModel}\n getPortalContainer={() => tableRootRef.current}\n columnId={column.id}\n columnLabel={columnPlaceholderLabel}\n kind={columnFilterKind as CominsColumnFilterKind}\n onChangeRule={typeof columnFiltering?.onChangeModel === \"function\"\n ? (nextRule) => changeColumnFilterRule(column.id, nextRule)\n : undefined}\n onOpenChange={typeof columnFiltering?.onChangeOpenColumnId === \"function\"\n ? columnFiltering.onChangeOpenColumnId\n : undefined}\n open={columnFiltering?.openColumnId === column.id}\n rule={normalizedColumnFilterById.get(column.id)}\n />\n ) : null}\n {headerRightSlots}\n </span>\n </span>\n {isColumnPlaceholder ? (\n <span aria-hidden=\"true\" className=\"comins-column-placeholder-label\">\n {columnPlaceholderLabel}\n </span>\n ) : null}\n <span\n aria-hidden=\"true\"\n className=\"comins-table__resize\"\n data-resizing={resizingColumnId === column.id ? \"true\" : undefined}\n data-testid={`resize-${column.id}`}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const measuredWidth = getCominsElementRect(event.currentTarget.closest<HTMLTableCellElement>(\"th\"))?.width;\n const visibleWidthSnapshot = new Map<string, number>();\n\n for (const visibleColumn of visibleColumns) {\n const headerCell = Array.from(\n headerRef.current?.querySelectorAll<HTMLTableCellElement>(\"[data-comins-column-id]\") ?? [],\n ).find((element) => element.dataset.cominsColumnId === visibleColumn.id);\n const measuredColumnWidth = getCominsElementRect(headerCell)?.width;\n const fallbackWidth = stateRef.current.columnState[visibleColumn.id]?.width ?? visibleColumn.width ?? 160;\n\n visibleWidthSnapshot.set(\n visibleColumn.id,\n measuredColumnWidth && Number.isFinite(measuredColumnWidth) ? measuredColumnWidth : fallbackWidth,\n );\n }\n\n const startWidth =\n visibleWidthSnapshot.get(column.id) ??\n (measuredWidth && Number.isFinite(measuredWidth) ? measuredWidth : (columnState?.width ?? column.width ?? 160));\n const resizeMaxWidth = cell.groupId\n ? undefined\n : getCominsPinnedBlockResizeMaxWidth(\n columnPinningBlocks,\n columnPinning,\n `column:${column.id}`,\n containerWidth,\n );\n setResizingColumnId(column.id);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n commitState(\n (current) => {\n let next = current;\n\n for (const [visibleColumnId, visibleColumnWidth] of visibleWidthSnapshot) {\n next = setCominsColumnWidth(next, visibleColumnId, visibleColumnWidth);\n }\n\n return setColumnWidthInsideParentGroup(\n next,\n column.id,\n Math.min(\n resizeMaxWidth ?? Number.POSITIVE_INFINITY,\n Math.max(getEffectiveColumnMinWidth(column), startWidth + moveEvent.clientX - startX),\n ),\n );\n },\n { columnLayoutChanged: true },\n );\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n setResizingColumnId(null);\n };\n const handlePointerCancel = () => {\n cleanup();\n setResizingColumnId(null);\n };\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n }}\n >\n <span className=\"comins-table__resize-line\" />\n </span>\n </th>\n );\n };\n\n const renderColumnSizing = () => (\n <colgroup>\n {visibleColumns.map((column, index) => (\n <col key={column.id} style={{ width: columnWidths[index] }} />\n ))}\n </colgroup>\n );\n const commitPendingScrollTop = () => {\n setScrollTop((current) => {\n const next = pendingScrollTopRef.current;\n\n return Math.abs(current - next) > 0.5 ? next : current;\n });\n };\n const requestInfiniteLoadIfNeeded = (bodyViewport: HTMLDivElement) => {\n if (groupingRequested || filteringRequested) {\n return;\n }\n\n if (lazyLoad) {\n if (!onLazyLoad || lazyLoadingReasonRef.current) {\n return;\n }\n\n const remainingScroll = bodyViewport.scrollHeight - bodyViewport.scrollTop - bodyViewport.clientHeight;\n\n if (remainingScroll <= resolvedLazyLoadThreshold) {\n requestLazyLoad(\"scroll\");\n }\n\n return;\n }\n\n if (!infiniteScroll || !hasMoreRows || loadingMore || !onLoadMore) {\n return;\n }\n\n const safeThreshold = Math.max(0, infiniteScrollThreshold);\n const remainingScroll = bodyViewport.scrollHeight - bodyViewport.scrollTop - bodyViewport.clientHeight;\n\n if (remainingScroll > safeThreshold) {\n return;\n }\n\n const currentRowCount = stateRef.current.rows.length;\n\n if (lastLoadMoreRowCountRef.current === currentRowCount) {\n return;\n }\n\n lastLoadMoreRowCountRef.current = currentRowCount;\n onLoadMore();\n };\n const syncHorizontalScrollLeft = (requestedScrollLeft: number) => {\n const scrollContainers = [\n headerRef.current,\n containerRef.current,\n footerRef.current,\n horizontalScrollbarRef.current,\n ].filter((element): element is HTMLDivElement => element !== null);\n const sharedMaxScrollLeft = scrollContainers.reduce(\n (current, element) => Math.min(current, Math.max(0, element.scrollWidth - element.clientWidth)),\n Number.POSITIVE_INFINITY,\n );\n const nextScrollLeft = Math.min(\n Number.isFinite(sharedMaxScrollLeft) ? sharedMaxScrollLeft : 0,\n Math.max(0, requestedScrollLeft),\n );\n\n for (const element of scrollContainers) {\n if (Math.abs(element.scrollLeft - nextScrollLeft) > 0.5) {\n setCominsScrollLeft(element, nextScrollLeft);\n }\n }\n\n return nextScrollLeft;\n };\n const handleBodyScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const bodyViewport = event.currentTarget;\n const activeAnchorTransaction =\n logicalAnchorTransactionRef.current;\n const pendingDetailAnchor = pendingDetailAnchorRef.current;\n\n const overlay = resolvedLoading ? bodyViewport.querySelector<HTMLElement>(\".comins-table__loading-overlay\") : null;\n if (overlay) overlay.style.transform = `translate(${bodyViewport.scrollLeft}px, ${bodyViewport.scrollTop}px)`;\n pendingScrollTopRef.current = bodyViewport.scrollTop;\n if (\n pendingDetailAnchor?.status === \"pending\" &&\n Math.abs(\n bodyViewport.scrollTop -\n pendingDetailAnchor.previousPhysicalScrollTop,\n ) > 0.5\n ) {\n pendingDetailAnchorRef.current = {\n ...pendingDetailAnchor,\n status: \"cancelled\",\n };\n }\n if (\n activeAnchorTransaction &&\n Math.abs(\n bodyViewport.scrollTop -\n activeAnchorTransaction.actualPhysical,\n ) > 0.5\n ) {\n logicalAnchorTransactionRef.current = null;\n setLogicalAnchorTransaction(null);\n }\n requestInfiniteLoadIfNeeded(bodyViewport);\n\n if (scrollCommitTimeoutRef.current !== null) {\n window.clearTimeout(scrollCommitTimeoutRef.current);\n scrollCommitTimeoutRef.current = null;\n }\n\n if (scrollFrameRef.current === null) {\n scrollFrameRef.current = window.requestAnimationFrame(() => {\n scrollFrameRef.current = null;\n commitPendingScrollTop();\n });\n }\n\n syncHorizontalScrollLeft(bodyViewport.scrollLeft);\n };\n const handleBodyWheel = (event: React.WheelEvent<HTMLDivElement>) => {\n if (!hasHorizontalOverflow || !horizontalScrollbarRef.current) {\n return;\n }\n\n const rawDelta = Math.abs(event.deltaX) > 0.01\n ? event.deltaX\n : event.shiftKey\n ? event.deltaY\n : 0;\n\n if (Math.abs(rawDelta) <= 0.01) {\n return;\n }\n\n const deltaScale = event.deltaMode === WheelEvent.DOM_DELTA_LINE\n ? 16\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\n ? Math.max(1, event.currentTarget.clientWidth)\n : 1;\n const previousScrollLeft = horizontalScrollbarRef.current.scrollLeft;\n const nextScrollLeft = syncHorizontalScrollLeft(previousScrollLeft + rawDelta * deltaScale);\n\n if (event.shiftKey && Math.abs(nextScrollLeft - previousScrollLeft) > 0.5) {\n event.preventDefault();\n }\n };\n\n const editingRowIds = useMemo(() => {\n const indexes = virtualized || groupingActive ? projectedDataIndexes : projectedDataIndexes.slice(pageStartIndex, pageStartIndex + pageSize);\n return indexes.map(index => state.rowIds[index]!);\n }, [projectedDataIndexes, state.rowIds, virtualized, groupingActive, pageStartIndex, pageSize]);\n const editingColumnIds = useMemo(() => visibleColumns.map(column => column.id), [visibleColumns]);\n const editingEnabled = cellSelection && Boolean(onChangeData) && !resolvedLoading && !resolvedLoadingMore;\n const reportClipboardError = (error: unknown) => onClipboardError?.(error instanceof Error ? error : new Error(\"Cell editing failed.\"));\n const canEditRange = (range: CominsCellRange) => isLoadedCellRange(range.anchor.rowId, range.focus.rowId);\n const cellFill = useCominsCellFill({\n enabled: fillHandle && editingEnabled, state, rowIds: editingRowIds, columnIds: editingColumnIds,\n root: tableRootRef, viewport: containerRef, addressAtPoint: getCellAddressFromPoint,\n canUseRange: canEditRange, registerGesture: registerActivePointerGesture,\n releaseGesture: cleanup => { if (activePointerGestureCleanupRef.current === cleanup) activePointerGestureCleanupRef.current = null; },\n scrollHorizontal: delta => syncHorizontalScrollLeft((horizontalScrollbarRef.current?.scrollLeft ?? 0) + delta),\n onFill: (source, target) => {\n if (!canEditRange(source) || !canEditRange(target)) return false;\n try {\n const current = stateRef.current, clipboardState = getClipboardState(current);\n const next = fillCominsCellRange(clipboardState, { source, target }, editingRowIds);\n if (next === clipboardState) return false;\n commitState({ ...next, columns: current.columns });\n return true;\n } catch (error) { reportClipboardError(error); return false; }\n },\n });\n const handleExternalPaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n if (!clipboardPaste || !editingEnabled || isNativeEditor(event.target) || event.defaultPrevented) return;\n const element = event.target instanceof Element ? event.target.closest<HTMLElement>(\"[data-comins-cell-column-id]\") : null;\n if (!element || element.closest(\"[data-comins-table-instance-id]\") !== tableRootRef.current) return;\n event.preventDefault(); event.stopPropagation();\n const current = stateRef.current;\n let target = { rowId: current.rowIds[Number(element.dataset.cominsDataIndex)]!, columnId: element.dataset.cominsCellColumnId! };\n if (current.selection.range) {\n const { anchor, focus } = current.selection.range;\n const firstRow = Math.min(editingRowIds.indexOf(anchor.rowId), editingRowIds.indexOf(focus.rowId));\n const firstColumn = Math.min(editingColumnIds.indexOf(anchor.columnId), editingColumnIds.indexOf(focus.columnId));\n if (firstRow >= 0 && firstColumn >= 0) target = { rowId: editingRowIds[firstRow]!, columnId: editingColumnIds[firstColumn]! };\n }\n try {\n const text = readCominsClipboardEvent(event.clipboardData);\n if (text === null) return;\n const matrix = parseCominsClipboardText(text);\n const start = editingRowIds.indexOf(target.rowId), end = Math.min(editingRowIds.length - 1, start + matrix.length - 1);\n if (viewportContext) {\n const absolute = viewportIndexById?.get(target.rowId);\n const expected = Math.min(matrix.length, viewportContext.data.rowCount - (absolute ?? 0));\n if (start < 0 || end - start + 1 !== expected || !isLoadedCellRange(target.rowId, editingRowIds[end]!)) throw new Error(\"Paste requires a contiguous loaded Viewport range.\");\n }\n const clipboardState = getClipboardState(current);\n const next = pasteCominsText(clipboardState, target, text, editingRowIds);\n if (next !== clipboardState) commitState({ ...next, columns: current.columns });\n } catch (error) { reportClipboardError(error); }\n };\n\n return (\n <div\n className={[\"comins-table comins-typography-base h-full w-full overflow-hidden\", densityClass, currentTheme.className, className]\n .filter(Boolean)\n .join(\" \")}\n aria-busy={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-comins-table-instance-id={tableInstanceId}\n data-comins-viewport-row-count={viewportContext?.data.rowCount}\n data-comins-viewport-blocks={viewportContext?.data.blocks.length}\n data-comins-viewport-requests={viewportContext?.data.requests.length}\n data-comins-viewport-height-blocks={viewportHeightIndex?.measuredBlockCount}\n data-comins-transfer-scope={normalizedTableTransfer?.scope}\n data-comins-transfer-table-id={normalizedTableTransfer?.tableId}\n data-filter-active={filteringActive ? \"true\" : undefined}\n data-loading={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-show-header={renderedHeaderVisible ? \"true\" : undefined}\n onPaste={handleExternalPaste}\n onCopy={(event) => {\n if (!clipboard || isNativeEditor(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n const result = prepareSelectionCopy();\n writeCominsClipboardEvent(event.clipboardData, result?.text ?? \"\");\n }}\n ref={tableRootRef}\n style={{ ...currentTheme.style, ...style }}\n tabIndex={-1}\n >\n {cellFill.menu}\n {renderedHeaderVisible ? (\n <div\n className=\"comins-table__header\"\n ref={headerRef}\n style={{ width: synchronizedHorizontalViewportWidth }}\n >\n <table\n className=\"comins-table__table comins-table__header-table min-w-full table-fixed\"\n style={{ width: tableWidth }}\n >\n {renderColumnSizing()}\n <thead className=\"comins-table__thead\">\n {headerRows.map((headerRow, rowIndex) => (\n <tr key={`header-row-${rowIndex}`}>\n {headerRow.map((cell, cellIndex) => renderHeaderCell(cell, cellIndex))}\n </tr>\n ))}\n </thead>\n </table>\n {hasHorizontalOverflow ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-table__horizontal-range-spacer\"\n style={{ width: synchronizedHorizontalContentWidth }}\n />\n ) : null}\n </div>\n ) : null}\n <div\n className=\"comins-table__body-viewport\"\n data-horizontal-overflow={hasHorizontalOverflow ? \"true\" : undefined}\n data-virtualized={virtualized ? \"true\" : undefined}\n data-testid={dataTestId}\n onFocusCapture={(event) => {\n const row = (event.target as Element).closest<HTMLElement>(\"[data-comins-row-data-index]\");\n const dataIndex = row ? Number(row.dataset.cominsRowDataIndex) : Number.NaN;\n\n focusedLeafDataIndexRef.current = Number.isInteger(dataIndex) ? dataIndex : null;\n }}\n onScroll={handleBodyScroll}\n onWheel={handleBodyWheel}\n ref={containerRef}\n >\n <table\n className={[\n \"comins-table__table comins-table__body-table min-w-full table-fixed\",\n virtualized ? \"comins-table__body-table--virtualized\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={\n virtualized\n ? {\n transform: `translate3d(0, ${rowWindow.renderOffset}px, 0)`,\n width: tableWidth,\n }\n : { width: tableWidth }\n }\n >\n {renderColumnSizing()}\n <tbody>\n {shouldRenderSkeleton\n ? Array.from({ length: resolvedSkeletonRowCount }).map((_, skeletonIndex) => (\n <tr\n aria-hidden=\"true\"\n className=\"comins-table__tr comins-table__skeleton-row\"\n data-comins-row-parity={skeletonIndex % 2 === 0 ? \"even\" : \"odd\"}\n data-testid=\"loading-skeleton-row\"\n key={`loading-skeleton-${skeletonIndex}`}\n style={{ height: rowHeight }}\n >\n {visibleColumns.length > 0 ? (\n visibleColumns.map((column) => {\n const pinnedColumn = getPinnedColumnAttributes(column.id);\n\n return (\n <td\n className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\"\n data-comins-pin-boundary={pinnedColumn.boundary ? \"true\" : undefined}\n data-comins-pinned={pinnedColumn.pinned}\n data-testid={`loading-skeleton-cell-${skeletonIndex}-${column.id}`}\n key={column.id}\n style={{ height: rowHeight, ...pinnedColumn.style }}\n >\n <span className=\"comins-table__skeleton-block\" />\n </td>\n );\n })\n ) : (\n <td className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\">\n <span className=\"comins-table__skeleton-block\" />\n </td>\n )}\n </tr>\n ))\n : null}\n {shouldRenderEmpty ? (\n <tr className=\"comins-table__tr comins-table__empty-state-row\" style={{ height: rowHeight }}>\n <td className=\"comins-table__td comins-table__empty-state-cell\" colSpan={Math.max(1, visibleColumns.length)}>\n <div data-testid=\"data-table-empty-state\" className=\"comins-table__empty-state\">\n {emptyContent?.render ? resolveDefaultRender(emptyContent.render(), \"표시할 데이터가 없습니다.\") : emptyComponent ?? \"표시할 데이터가 없습니다.\"}\n </div>\n </td>\n </tr>\n ) : null}\n {rowWindow.slots.map((slot, entryIndex) => {\n if (slot.kind === \"group\") {\n const node = orderedGroupModel?.groupsById.get(slot.groupId);\n\n if (!node) {\n return null;\n }\n\n const expanded = expandedGroupIdSet.has(slot.groupId);\n const isLastRenderedSlot = entryIndex === rowWindow.slots.length - 1;\n const isLastLogicalSlot = fullProjectionSlots.at(-1)?.key === slot.key;\n const virtualContentFillsViewport = rowWindow.scrollHeight >= containerHeight - 1;\n const isViewportEndRow =\n isLastRenderedSlot &&\n (virtualized\n ? isLastLogicalSlot && virtualContentFillsViewport\n : emptyFillerHeight === 0);\n const aggregateValues = Object.fromEntries(\n [...node.aggregationState].map(([columnId, aggregateState]) => [\n columnId,\n getCominsAggregateValue(aggregateState),\n ]),\n );\n const groupRenderParams = {\n aggregateValues,\n expanded,\n group: node.group,\n groupId: node.groupId,\n groupIndex: node.groupIndex,\n isEmpty: node.leafSourceIndexes.length === 0,\n rowCount: node.leafSourceIndexes.length,\n };\n const groupRowProps = rowGrouping?.getGroupRowProps?.(groupRenderParams);\n const groupRender = rowGrouping?.content?.render ?? rowGrouping?.renderGroupContent;\n const customContent = groupRender?.(groupRenderParams);\n const useDefaultGroupContent = !groupRender || (Boolean(rowGrouping?.content?.render) && customContent === undefined);\n const aggregateContent = Object.entries(aggregateValues).flatMap(([columnId, value]) => {\n if (value === null) {\n return [];\n }\n\n const column = state.columns.find((candidate) => candidate.id === columnId);\n\n return [\n <span className=\"comins-row-group-aggregate\" key={columnId}>\n {String(column?.label ?? columnId)}: {String(value)}\n </span>,\n ];\n });\n const groupDraggable =\n rowGrouping?.groupDraggable === true &&\n (typeof rowGrouping.onChangeGroups === \"function\" || Boolean(normalizedTableTransfer));\n const groupDropPosition =\n rowGroupMoveState?.targetTableId === undefined &&\n rowGroupMoveState?.targetGroupId === slot.groupId &&\n rowGroupMoveState.sourceGroupId !== slot.groupId\n ? rowGroupMoveState.position\n : undefined;\n const isRowDropTarget =\n rowMoveState?.targetTableId === undefined &&\n rowMoveState?.targetGroupId === slot.groupId;\n\n return (\n <tr\n className={[\n \"comins-table__tr comins-table__group-row\",\n groupRowProps?.className,\n isViewportEndRow ? \"comins-table__tr--viewport-end\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-comins-group-id={String(slot.groupId)}\n data-comins-group-index={node.groupIndex}\n data-comins-group-row=\"true\"\n data-comins-transfer-group-id={getCominsTransferIdentity(slot.groupId)}\n data-comins-group-drag-source={\n rowGroupMoveState?.sourceGroupId === slot.groupId ? \"true\" : undefined\n }\n data-comins-group-drop-position={groupDropPosition}\n data-comins-row-drop-valid={\n isRowDropTarget ? (rowMoveState.valid ? \"true\" : \"false\") : undefined\n }\n data-testid={`group-row-${encodeURIComponent(String(slot.groupId))}`}\n key={slot.key}\n style={{ ...groupRowProps?.style, height: rowHeight }}\n >\n <th\n className=\"comins-table__td comins-table__group-cell px-3 py-2\"\n colSpan={Math.max(1, visibleColumns.length)}\n scope=\"rowgroup\"\n style={{ height: rowHeight }}\n >\n <span className=\"comins-row-group-cell-content\">\n {groupDraggable ? (\n <CominsTableIconButton\n aria-label={`Move ${String(node.label)} group`}\n className=\"comins-row-group-drag-handle\"\n data-testid={`group-drag-handle-${encodeURIComponent(String(slot.groupId))}`}\n icon=\"columnMove\"\n onPointerDown={(event) => beginRowGroupHandlePointerDrag(event, slot.groupId)}\n />\n ) : null}\n <CominsTableIconButton\n aria-expanded={expanded}\n aria-label={`${expanded ? \"Collapse\" : \"Expand\"} ${String(node.label)} group`}\n className=\"comins-row-group-expander\"\n data-testid={`group-toggle-${encodeURIComponent(String(slot.groupId))}`}\n disabled={typeof rowGrouping?.onChangeExpandedGroupIds !== \"function\"}\n icon={expanded ? \"disclosureExpanded\" : \"disclosureCollapsed\"}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n toggleRowGroup(slot.groupId);\n }}\n ref={(element) => {\n if (element) {\n groupDisclosureElementsRef.current.set(slot.groupId, element);\n } else {\n groupDisclosureElementsRef.current.delete(slot.groupId);\n }\n }}\n />\n <span className=\"comins-row-group-content\">\n {!useDefaultGroupContent ? customContent : (\n <>\n <span className=\"comins-row-group-label\">{node.label}</span>\n <span className=\"comins-row-group-count\">\n {node.leafSourceIndexes.length} Rows\n </span>\n {aggregateContent}\n </>\n )}\n </span>\n </span>\n </th>\n </tr>\n );\n }\n\n if (slot.kind === \"placeholder\") {\n const request = viewportContext?.data.requests.find(request => request.startIndex <= slot.absoluteIndex && request.endIndex > slot.absoluteIndex);\n return (\n <tr className=\"comins-table__tr comins-table__skeleton-row\" data-testid=\"viewport-placeholder\" data-comins-absolute-index={slot.absoluteIndex} key={slot.key} style={{ height: slot.height }}>\n {visibleColumns.map((column, columnIndex) => <td className=\"comins-table__td comins-table__skeleton-cell\" key={column.id} style={{ height: slot.height, ...getPinnedColumnAttributes(column.id).style }}>{request?.status === \"error\" && columnIndex === 0 ? <button type=\"button\" data-testid=\"viewport-retry\" onClick={() => retryViewport(slot.absoluteIndex)}>Retry loading rows</button> : <span className=\"comins-table__skeleton-block\" />}</td>)}\n </tr>\n ); }\n const entry = slot;\n const actualRowStyleHeight = entry.autoHeight ? \"auto\" : entry.rowHeight ?? rowHeight;\n const rowRuntimeProps = resolveRowProps(effectiveRowProps, entry.row, entry.visibleIndex);\n const isRowSelected = selectedRowIdSet.has(entry.rowId);\n const isLastRenderedSlot = entryIndex === rowWindow.slots.length - 1;\n const isLastLogicalRow = fullProjectionSlots.at(-1)?.key === entry.key;\n const virtualContentFillsViewport = rowWindow.scrollHeight >= containerHeight - 1;\n const isViewportEndRow =\n isLastRenderedSlot &&\n (virtualized\n ? isLastLogicalRow && virtualContentFillsViewport\n : emptyFillerHeight === 0);\n const rowCustomBackground = getRowCustomBackground(rowRuntimeProps.style);\n const rowRenderKey =\n virtualized && (rowWindow.mixed || rowDetailEnabled)\n ? entry.key\n : virtualized\n ? `virtual-row-slot-${entryIndex}`\n : String(entry.rowId);\n const rowDetailParams: CominsRowDetailParams<TData> = { row: createEventRow(entry) };\n const rowDetailExpandable = rowDetailEnabled && (isRowExpandable?.(rowDetailParams) ?? true);\n const rowDetailExpanded = rowDetailExpandable && effectiveExpandedRowIdSet.has(entry.rowId);\n const rowDetailFixedHeight =\n rowDetailExpanded && entry.detail?.mode === \"fixed\"\n ? entry.detail.height\n : undefined;\n const rowDetailMode = entry.detail?.mode ?? \"fixed\";\n const rowDetailIdToken = `${typeof entry.rowId}-${encodeURIComponent(String(entry.rowId))}`;\n const rowDetailId = `comins-row-detail-${encodeURIComponent(rowDetailIdPrefix)}-${rowDetailIdToken}`;\n const rowDetailContentId = `${rowDetailId}-content`;\n const rowDetailToggleId = `${rowDetailId}-toggle`;\n\n return (\n <Fragment key={rowRenderKey}>\n {\n rowMoveState?.targetTableId === undefined &&\n rowMoveState?.targetDataIndex === entry.dataIndex &&\n rowMoveState.sourceRowId !== entry.rowId ? (\n <tr\n aria-hidden=\"true\"\n className=\"comins-row-move-placeholder\"\n data-comins-row-drop-valid={rowMoveState.valid ? \"true\" : \"false\"}\n >\n <td colSpan={Math.max(1, visibleColumns.length)}>\n <div data-testid=\"row-move-placeholder\">이 위치로 이동</div>\n </td>\n </tr>\n ) : null}\n <tr\n aria-disabled={rowRuntimeProps.disabled ? \"true\" : undefined}\n ref={entry.autoHeight ? element => registerDetailElement(entry.rowId, \"auto\", element, \"row\") : undefined}\n data-comins-row-auto-height={entry.autoHeight ? \"true\" : undefined}\n aria-selected={isRowSelected}\n className={[\n \"comins-table__tr\",\n isViewportEndRow && !rowDetailExpanded ? \"comins-table__tr--viewport-end\" : undefined,\n isRowSelected ? \"comins-row-selected\" : undefined,\n rowRuntimeProps.className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-disabled={rowRuntimeProps.disabled ? \"true\" : undefined}\n data-comins-row-custom-background={rowCustomBackground === undefined ? undefined : \"true\"}\n data-comins-row-data-index={entry.dataIndex}\n data-comins-absolute-index={entry.absoluteIndex}\n data-comins-tree-drop={treeContext?.drag.preview?.context.target.rowId === entry.rowId ? treeContext.drag.preview.context.position : undefined}\n data-comins-tree-drop-valid={treeContext?.drag.preview?.context.target.rowId === entry.rowId ? String(treeContext.drag.preview.valid) : undefined}\n data-comins-row-parity={entry.visibleIndex % 2 === 0 ? \"even\" : \"odd\"}\n data-comins-transfer-row-id={getCominsTransferIdentity(entry.rowId)}\n data-row-draggable={rowRuntimeProps.draggable ? \"true\" : \"false\"}\n data-selected-row={isRowSelected ? \"true\" : undefined}\n data-testid={`row-${String(entry.rowId)}`}\n draggable={false}\n key={rowRenderKey}\n onClick={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n if (rowSelectionOnClick && !(event as React.MouseEvent<HTMLTableRowElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled) {\n selectRowFromInteraction(event, entry);\n }\n onClickRow?.(createRowPayload(event, entry));\n }}\n onContextMenu={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n if (rowSelectionOnClick) commitState((current) => selectRowForContextMenu(current, entry.rowId));\n lastRowAnchorRef.current = entry.rowId;\n onContextMenuRow?.(createRowPayload(event, entry));\n }}\n onDoubleClick={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n onDoubleClickRow?.(createRowPayload(event, entry));\n }}\n onKeyDown={(event) => handleRowKeyDown(event, entry, rowRuntimeProps.disabled)}\n style={{ ...getResolvedRowStyle(rowHeight, rowRuntimeProps.style, rowCustomBackground), ...(getRowHeight ? { height: actualRowStyleHeight } : {}) }}\n tabIndex={rowRuntimeProps.disabled ? -1 : 0}\n >\n {visibleColumns.map((column, columnIndex) => {\n const pinnedColumn = getPinnedColumnAttributes(column.id);\n const rawValue = getCominsCellValue(state, entry.row, column.id);\n const address = { columnId: column.id, rowId: entry.rowId };\n const isCellInRange = cellSelection && isCominsCellInSelectedRange(\n state,\n address,\n getSelectionRowOrder(),\n );\n const isCellSelected = cellSelection && isCominsCellSelected(state, address);\n const cellPayload = createCellComponentPayload(\n entry,\n rowRuntimeProps.disabled,\n isRowSelected,\n state.selection.rowIds.length,\n column,\n columnIndex,\n rawValue,\n );\n const cellProps = resolveRenderableCellProps(column, cellPayload);\n const cellDisabled = rowRuntimeProps.disabled || isRenderableCellDisabled(cellProps, cellPayload);\n const componentInteraction: CominsBuiltInComponentInteraction = {\n requestRowSelection: ({ event, mode }) => {\n if (cellDisabled) {\n return false;\n }\n\n if (mode === \"exclusive\") {\n commitState((current) => selectRow(current, entry.rowId));\n lastRowAnchorRef.current = entry.rowId;\n return true;\n }\n\n selectRowFromInteraction(event, entry);\n return true;\n },\n };\n const cellClassName = toClassName(getRenderableCellClassName(cellProps, cellPayload));\n const cellStyle = getRenderableCellStyle(cellProps, cellPayload);\n const hasCellComponents = Boolean(column.cell?.components?.length);\n const formattedCellValue = formatRenderableCellValue(column, rawValue, cellPayload);\n const cellComponents = column.cell?.components?.map((component) => {\n if (component.type !== \"input\") {\n return component;\n }\n\n const onValueChange = component.onValueChange;\n\n return {\n ...component,\n onValueChange: (payload) => {\n commitState((current) =>\n updateCominsRows(current, [\n {\n id: payload.row.id,\n patch: (currentRow) =>\n setCominsNestedInputValue(currentRow, payload.column.field, payload.value),\n },\n ]),\n );\n onValueChange?.(payload);\n },\n } satisfies CominsCellComponent<TData>;\n });\n const visibleCellComponents = getRenderableCominsComponents(cellComponents, cellPayload);\n const cellRender = column.cell?.render ?? column.cell?.renderer;\n const customCellContent = cellRender?.(cellPayload);\n const useDefaultCellContent = !cellRender || (Boolean(column.cell?.render) && customCellContent === undefined);\n const cellContent = !useDefaultCellContent ? customCellContent : hasCellComponents ? (\n renderCominsContentWithComponents(formattedCellValue, cellComponents, cellPayload, {\n interaction: componentInteraction,\n showContent: false,\n })\n ) : (\n <span className=\"comins-table__cell-value\">{formattedCellValue}</span>\n );\n const tooltip =\n typeof column.cell?.tooltip === \"function\" ? column.cell.tooltip(cellPayload) : column.cell?.tooltip;\n const tooltipConfig = column.cell?.tooltip;\n const customTooltip = typeof tooltipConfig === \"object\" && tooltipConfig !== null ? tooltipConfig : undefined;\n const tooltipKey = JSON.stringify([typeof entry.rowId, entry.rowId, column.id]);\n if (cellTooltip.active?.ready && cellTooltip.active.key === tooltipKey && customTooltip?.render) {\n activeCellTooltipContent = customTooltip.render(cellPayload);\n }\n const treeEntry =\n column.id === treeContext?.treeColumnId\n ? treeContext.entriesByRowId.get(entry.rowId)\n : undefined;\n const treeSlots = treeContext?.slots;\n const treeSlotParams = treeEntry ? { ...treeEntry, defaultContent: cellContent } : null;\n const hasTreeSlots = Boolean(treeSlots?.leading || treeSlots?.content || treeSlots?.trailing);\n const renderedCellContent = treeEntry ? (\n <span\n className={`comins-tree-cell-content${hasTreeSlots ? \" comins-tree-cell-content--slots\" : \"\"}`}\n style={{ \"--comins-tree-depth\": treeEntry.depth } as React.CSSProperties}\n >\n {treeEntry.hasChildren ? (\n <CominsTableIconButton\n aria-expanded={treeEntry.expanded}\n aria-label={`${treeEntry.expanded ? \"Collapse\" : \"Expand\"} ${String(entry.rowId)}`}\n className=\"comins-tree-expander\"\n data-testid={`tree-expander-${String(entry.rowId)}`}\n icon={treeEntry.expanded ? \"disclosureExpanded\" : \"disclosureCollapsed\"}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n treeContext?.onToggle(entry.rowId);\n }}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n />\n ) : (\n <span aria-hidden=\"true\" className=\"comins-tree-expander-spacer\" />\n )}\n {treeSlotParams && treeSlots?.leading ? renderTreeSlot(\"leading\", resolveTreeSlotContent(treeSlots.leading, treeSlotParams)) : null}\n <span className=\"comins-tree-cell-value\">\n {treeSlotParams && treeSlots?.content ? renderTreeSlot(\"content\", resolveTreeSlotContent(treeSlots.content, treeSlotParams, cellContent)) : cellContent}\n </span>\n {treeSlotParams && treeSlots?.trailing ? renderTreeSlot(\"trailing\", resolveTreeSlotContent(treeSlots.trailing, treeSlotParams)) : null}\n </span>\n ) : (\n cellContent\n );\n\n return (\n <td\n aria-disabled={cellDisabled ? \"true\" : undefined}\n className={[\n \"comins-table__td px-3 py-2\",\n isCellInRange ? \"comins-cell-range-selected\" : undefined,\n cellFill.isPreview(address) ? \"comins-cell-fill-preview\" : undefined,\n cellClassName,\n ]\n .filter(Boolean)\n .join(\" \")}\n\t data-disabled={cellDisabled ? \"true\" : undefined}\n\t data-comins-cell-column-id={column.id}\n\t data-comins-component-cell={visibleCellComponents.length > 0 ? \"true\" : undefined}\n data-comins-data-index={entry.dataIndex}\n data-comins-pin-boundary={pinnedColumn.boundary ? \"true\" : undefined}\n data-comins-pinned={pinnedColumn.pinned}\n data-range-selected={isCellInRange ? \"true\" : undefined}\n data-selected={isCellSelected ? \"true\" : undefined}\n data-testid={`cell-${String(entry.rowId)}-${column.id}`}\n draggable={false}\n key={column.id}\n onClick={(event) => {\n if (onClickCell) {\n event.stopPropagation();\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (rangeDragMovedRef.current) {\n rangeDragMovedRef.current = false;\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n return;\n }\n\n const anchor = cellSelection ? (state.selection.cell ?? lastCellAnchorRef.current) : null;\n\n if (event.shiftKey && anchor) {\n if (!isLoadedCellRange(anchor.rowId, address.rowId)) { event.preventDefault(); event.stopPropagation(); return; }\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastCellAnchorRef.current = anchor;\n commitState((current) => {\n const nextRows = !rowSelectionOnClick ? current :\n lastRowAnchorRef.current !== null\n ? selectRows(\n current,\n getVisibleRowIdsBetween(current, lastRowAnchorRef.current, entry.rowId),\n )\n : selectRow(current, entry.rowId);\n\n return selectCellRange(nextRows, { anchor, focus: address });\n });\n lastRowAnchorRef.current = entry.rowId;\n return;\n }\n\n if (cellSelection) {\n lastCellAnchorRef.current = address;\n }\n\n commitState((current) => {\n const nextRows = !rowSelectionOnClick ? current : selectRow(current, entry.rowId, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n });\n\n return cellSelection\n ? selectCell(nextRows, address, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n })\n : nextRows;\n });\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastRowAnchorRef.current = entry.rowId;\n onClickCell?.(createCellPayload(event, entry, column, columnIndex, rawValue));\n }}\n onContextMenu={(event) => {\n if ((event.target as Element).closest(\".comins-row-detail-expander\")) {\n event.stopPropagation();\n return;\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n commitState((current) => {\n const nextRows = rowSelectionOnClick ? selectRowForContextMenu(current, entry.rowId) : current;\n const alreadySelected = isCominsCellSelected(current, address)\n || isCominsCellInSelectedRange(current, address, getSelectionRowOrder());\n return cellSelection && !alreadySelected ? selectCell(nextRows, address) : nextRows;\n });\n lastRowAnchorRef.current = entry.rowId;\n\n if (cellSelection) {\n lastCellAnchorRef.current = address;\n }\n\n if (onContextMenuCell) {\n event.stopPropagation();\n onContextMenuCell(createCellPayload(event, entry, column, columnIndex, rawValue));\n }\n }}\n onDoubleClick={(event) => {\n if ((event.target as Element).closest(\".comins-row-detail-expander\")) {\n event.stopPropagation();\n return;\n }\n\n if (onDoubleClickCell) {\n event.stopPropagation();\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n onDoubleClickCell?.(createCellPayload(event, entry, column, columnIndex, rawValue));\n }}\n data-comins-tooltip-key={customTooltip?.render ? tooltipKey : undefined}\n onFocusCapture={(event) => { if (customTooltip?.render) cellTooltip.enter(tooltipKey, event.currentTarget, \"focus\"); }}\n onBlurCapture={(event) => { if (!event.currentTarget.contains(event.relatedTarget as Node | null)) cellTooltip.leave(tooltipKey, \"focus\"); }}\n onKeyDown={(event) => handleCellKeyDown(event, entry, column, columnIndex, address, cellDisabled)}\n onMouseDown={(event) => beginCellRangeDrag(event, address, cellDisabled)}\n onMouseOver={(event) => {\n if (event.buttons === 1 && !activePointerGestureCleanupRef.current) {\n updateCellRangeDrag(address);\n }\n }}\n onMouseUp={endCellRangeDrag}\n onPointerDown={(event) => beginCellRangePointerDrag(event, address, cellDisabled)}\n onPointerEnter={(event) => {\n if (customTooltip?.render && event.buttons === 0) cellTooltip.enter(tooltipKey, event.currentTarget, \"hover\");\n if (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\n onPointerLeave={() => cellTooltip.leave(tooltipKey, \"hover\")}\n onPointerMove={(event) => {\n if (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\n onPointerUp={endCellRangeDrag}\n style={{ height: rowHeight, ...cellStyle, ...pinnedColumn.style, ...(getRowHeight ? { height: actualRowStyleHeight } : {}) }}\n title={typeof tooltip === \"string\" ? tooltip : undefined}\n tabIndex={cellDisabled ? -1 : 0}\n >\n {columnIndex === 0 && (rowDetailEnabled || rowRuntimeProps.draggable) ? (\n <div className=\"comins-row-cell-content\">\n <span className=\"comins-row-leading-controls\">\n {rowDetailEnabled ? (\n rowDetailExpandable ? (\n <CominsRowDetailToggle\n controlsId={rowDetailContentId}\n disabled={!onChangeExpandedRowIds}\n expanded={rowDetailExpanded}\n id={rowDetailToggleId}\n label={`${rowDetailExpanded ? \"Collapse\" : \"Expand\"} ${String(entry.rowId)} details`}\n onElement={(element) => {\n if (element) {\n rowDetailToggleElementsRef.current.set(entry.rowId, element);\n } else {\n rowDetailToggleElementsRef.current.delete(entry.rowId);\n }\n }}\n onToggle={() => toggleRowDetail(entry.rowId, rowDetailExpandable)}\n testId={`row-detail-toggle-${String(entry.rowId)}`}\n />\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"comins-row-detail-expander-spacer\"\n data-comins-row-leading-control=\"disclosure\"\n />\n )\n ) : null}\n {rowRuntimeProps.draggable && treeContext ? (\n <button\n type=\"button\"\n aria-label={`Move ${String(entry.rowId)}`}\n className=\"comins-row-drag-handle\"\n data-comins-tree-drag-handle=\"true\"\n data-testid={`row-drag-handle-${String(entry.rowId)}`}\n disabled={rowRuntimeProps.disabled}\n onClick={(event) => { event.preventDefault(); event.stopPropagation(); }}\n onPointerDown={(event) => { if (!rowRuntimeProps.disabled) treeContext.drag.onPointerDown(event, createEventRow(entry)); }}\n onKeyDown={(event) => treeContext.drag.onKeyDown(event, createEventRow(entry))}\n />\n ) : rowRuntimeProps.draggable ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-row-drag-handle\"\n data-comins-row-leading-control=\"drag\"\n data-testid={`row-drag-handle-${String(entry.rowId)}`}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) =>\n beginRowHandlePointerDrag(\n event,\n entry,\n rowRuntimeProps.disabled,\n rowRuntimeProps.draggable,\n )\n }\n />\n ) : null}\n </span>\n <div className=\"comins-row-cell-content__value\">{renderedCellContent}</div>\n </div>\n ) : (\n renderedCellContent\n )}\n {!cellDisabled && cellFill.handleAddress?.rowId === address.rowId && cellFill.handleAddress.columnId === address.columnId ? cellFill.handle : null}\n </td>\n );\n })}\n </tr>\n {rowDetailExpanded ? (\n <CominsRowDetailRow\n colSpan={visibleColumns.length}\n contentId={rowDetailContentId}\n fixedHeight={rowDetailFixedHeight}\n labelId={rowDetailToggleId}\n onContentElement={(element) =>\n registerDetailElement(entry.rowId, rowDetailMode, element)\n }\n ownerId={String(entry.rowId)}\n testId={`row-detail-content-${String(entry.rowId)}`}\n getToggleElement={() => rowDetailToggleElementsRef.current.get(entry.rowId) ?? null}\n restoreFocus={detailFocusRestorer.restore}\n >\n {resolvedRowDetailRender?.(rowDetailParams)}\n </CominsRowDetailRow>\n ) : null}\n </Fragment>\n );\n })}\n {shouldRenderInfiniteLoadingRow ? (\n <tr className=\"comins-table__tr comins-table__infinite-loading-row\" style={{ height: rowHeight }}>\n <td\n className=\"comins-table__td comins-table__infinite-loading-cell\"\n colSpan={Math.max(1, visibleColumns.length)}\n data-testid=\"data-table-infinite-loading-row\"\n >\n <span className=\"comins-table__loading-spinner\" data-testid=\"data-table-infinite-loading-spinner\" />\n <span>데이터를 불러오는 중입니다.</span>\n </td>\n </tr>\n ) : null}\n {emptyFillerHeight > 0 ? (\n <tr aria-hidden=\"true\" className=\"comins-table-empty-filler\">\n <td\n colSpan={Math.max(1, visibleColumns.length)}\n data-testid=\"table-empty-filler\"\n style={{ height: emptyFillerHeight }}\n />\n </tr>\n ) : null}\n </tbody>\n </table>\n {virtualized ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-table__body-virtual-sizer\"\n style={{ height: rowWindow.scrollHeight, width: tableWidth }}\n />\n ) : null}\n {resolvedLoading && !isEmpty ? (\n <div\n className=\"comins-table__loading-overlay\"\n data-testid=\"data-table-loading-overlay\"\n role=\"status\"\n style={{ transform: `translate(${containerRef.current?.scrollLeft ?? 0}px, ${scrollTop}px)`, width: containerRef.current?.clientWidth }}\n >\n <span className=\"comins-table__loading-spinner\" data-testid=\"data-table-loading-spinner\" />\n <span>{loadingContent?.render ? resolveDefaultRender(loadingContent.render(), \"불러오는 중입니다.\") : loadingComponent ?? \"불러오는 중입니다.\"}</span>\n </div>\n ) : null}\n </div>\n {summary ? (\n <div\n aria-label=\"Table summary\"\n className=\"comins-table__summary\"\n ref={footerRef}\n style={{ width: synchronizedHorizontalViewportWidth }}\n >\n <table className=\"comins-table__table comins-table__summary-table min-w-full table-fixed\" style={{ width: tableWidth }}>\n {renderColumnSizing()}\n <tfoot>\n <tr\n className={[\"comins-table__summary-row\", summary.className].filter(Boolean).join(\" \")}\n style={summary.style}\n >\n {summaryCells.flatMap((cell) =>\n getCominsColumnPinningSpanFragments(\n columnPinning,\n cell.startIndex,\n cell.colSpan,\n ).map((fragment, fragmentIndex) => {\n const fragmentStyle = fragment.pinned\n ? {\n [fragment.pinned]: fragment.offset,\n position: \"sticky\",\n } as React.CSSProperties\n : undefined;\n\n return (\n <td\n className={[\"comins-table__summary-cell px-3 py-2\", cell.className].filter(Boolean).join(\" \")}\n colSpan={fragment.colSpan}\n data-comins-pin-boundary={fragment.boundary ? \"true\" : undefined}\n data-comins-pinned={fragment.pinned}\n data-comins-summary-column-id={fragmentIndex === 0 ? cell.column.id : undefined}\n data-testid={fragmentIndex === 0 ? `summary-cell-${cell.column.id}` : undefined}\n key={`${cell.column.id}-${fragment.startIndex}`}\n style={{ ...cell.style, ...fragmentStyle }}\n >\n {fragmentIndex === 0 ? cell.value : null}\n </td>\n );\n }),\n )}\n </tr>\n </tfoot>\n </table>\n {hasHorizontalOverflow ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-table__horizontal-range-spacer\"\n style={{ width: synchronizedHorizontalContentWidth }}\n />\n ) : null}\n </div>\n ) : null}\n {hasHorizontalOverflow ? (\n <div\n aria-label=\"Table horizontal scroll\"\n className=\"comins-table__horizontal-scrollbar\"\n data-testid=\"table-horizontal-scrollbar\"\n onScroll={(event) => syncHorizontalScrollLeft(event.currentTarget.scrollLeft)}\n ref={horizontalScrollbarRef}\n role=\"region\"\n style={{ width: synchronizedHorizontalScrollbarWidth }}\n tabIndex={0}\n >\n <div\n aria-hidden=\"true\"\n className=\"comins-table__horizontal-scrollbar-content\"\n style={{ width: synchronizedHorizontalContentWidth }}\n />\n </div>\n ) : null}\n <CominsCellTooltip controller={cellTooltip} content={activeCellTooltipContent} />\n {movingHeaderLabel && columnMovePointer ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-column-move-ghost\"\n data-testid=\"column-move-ghost\"\n style={{ left: columnMovePointer.x + 12, top: columnMovePointer.y + 12 }}\n >\n <CominsTableIcon name=\"columnMove\" />\n <span className=\"comins-column-move-ghost__label\">{movingHeaderLabel}</span>\n </div>\n ) : null}\n {transferRejectionFeedback ? (\n <CominsPointerTooltip\n icon={<span className=\"comins-tooltip-surface__warning\">!</span>}\n tone=\"danger\"\n x={transferRejectionFeedback.x}\n y={transferRejectionFeedback.y}\n >\n {transferRejectionFeedback.content}\n </CominsPointerTooltip>\n ) : null}\n {treeContext ? <span className=\"comins-table__sr-only\" role=\"status\" aria-live=\"polite\">{treeContext.drag.announcement}</span> : null}\n </div>\n );\n}\n\nfunction CominsTreeTableInner<TData>(\n {\n data,\n columnFiltering: _columnFiltering,\n defaultExpandAll = true,\n estimatedRowDetailHeight: _estimatedRowDetailHeight,\n expandedRowIds: _expandedRowIds,\n getRowDetailHeight: _getRowDetailHeight,\n getRowId,\n hasMoreRows: _hasMoreRows,\n infiniteScroll: _infiniteScroll,\n infiniteScrollThreshold: _infiniteScrollThreshold,\n lazyLoad: _lazyLoad,\n lazyLoadBatchSize: _lazyLoadBatchSize,\n lazyLoadMode: _lazyLoadMode,\n lazyLoadThreshold: _lazyLoadThreshold,\n loadingMore: _loadingMore,\n onChangeData,\n onChangeExpandedRowIds: _onChangeExpandedRowIds,\n onChangeSort,\n onChangeSortModel,\n onLazyLoad: _onLazyLoad,\n onLoadMore: _onLoadMore,\n rowGrouping: _rowGrouping,\n tableTransfer: _tableTransfer,\n rowProps,\n treeRowDrag,\n treeSlots,\n onBeforeRowDrag,\n onRowDrag,\n onAfterDragRow,\n isRowExpandable: _isRowExpandable,\n renderRowDetail: _renderRowDetail,\n rowDetail: _rowDetail,\n tree: _tree,\n ...props\n }: CominsTreeTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n const initialDefaultExpandAll = useRef(defaultExpandAll).current;\n const [treeSortModel, setTreeSortModel] = useState<CominsSortModel>([]);\n const treeColumns = useMemo(\n () =>\n props.columns.map((column, index) =>\n ({\n ...column,\n lockPosition: index === 0 ? true : column.lockPosition,\n pinned: undefined,\n }),\n ),\n [props.columns],\n );\n const treeColumnId = treeColumns[0]?.id ?? treeColumns[0]?.field ?? null;\n const sortedTree = useMemo(\n () => getSortedReactTree(data, treeColumns, treeSortModel),\n [data, treeColumns, treeSortModel],\n );\n const visibleTreeRows = useMemo(\n () => flattenCominsTree(sortedTree, getRowId, { defaultExpandAll: initialDefaultExpandAll }),\n [getRowId, initialDefaultExpandAll, sortedTree],\n );\n const entriesByRowId = useMemo(\n () => new Map(visibleTreeRows.map((entry) => [entry.rowId, entry] as const)),\n [visibleTreeRows],\n );\n const treeDrag = useCominsTreeDrag({ data, entries: visibleTreeRows, getRowId, config: treeRowDrag, rowProps, sorted: treeSortModel.length > 0, onChangeData, onBeforeRowDrag, onRowDrag, onAfterDragRow });\n const treeContext = useMemo<CominsTreeRenderContext<TData>>(\n () => ({\n drag: treeDrag,\n entriesByRowId,\n onExpand: (nodeIds) => {\n const nextData = setCominsTreeExpansion(data, nodeIds, true, getRowId, initialDefaultExpandAll);\n\n if (nextData !== data) {\n onChangeData?.([...nextData]);\n }\n },\n onFold: (nodeIds) => {\n const nextData = setCominsTreeExpansion(data, nodeIds, false, getRowId, initialDefaultExpandAll);\n\n if (nextData !== data) {\n onChangeData?.([...nextData]);\n }\n },\n onToggle: (rowId) =>\n onChangeData?.(toggleCominsTreeNode(data, rowId, getRowId, { defaultExpandAll: initialDefaultExpandAll })),\n summaryRows: getCominsTreeLeafItems(data),\n treeColumnId,\n slots: treeSlots,\n }),\n [data, entriesByRowId, getRowId, initialDefaultExpandAll, onChangeData, treeColumnId, treeDrag, treeSlots],\n );\n const handleFlatDataChange = (nextRows: TData[]) => {\n let nextTree: readonly CominsTreeNode<TData>[] = data;\n\n nextRows.forEach((nextItem, index) => {\n const entry = visibleTreeRows[index];\n\n if (entry && entry.item !== nextItem) {\n nextTree = updateCominsTreeItem(nextTree, entry.rowId, getRowId, () => nextItem);\n }\n });\n\n if (nextTree !== data) {\n onChangeData?.([...nextTree]);\n }\n };\n const flatProps: CominsTableProps<TData> = {\n ...props,\n columns: treeColumns,\n data: visibleTreeRows.map((entry) => entry.item),\n getRowId,\n hasMoreRows: false,\n infiniteScroll: false,\n infiniteScrollThreshold: undefined,\n lazyLoad: false,\n lazyLoadBatchSize: undefined,\n lazyLoadMode: undefined,\n lazyLoadThreshold: undefined,\n loadingMore: false,\n onChangeData: onChangeData ? handleFlatDataChange : undefined,\n onChangeSort,\n onChangeSortModel: (nextSortModel) => {\n setTreeSortModel(nextSortModel);\n onChangeSortModel?.(nextSortModel);\n },\n onLazyLoad: undefined,\n onLoadMore: undefined,\n pagination: { pageIndex: 0, pageSize: Math.max(1, visibleTreeRows.length) },\n rowProps: { ...rowProps, draggable: treeRowDrag && onChangeData && treeSortModel.length === 0 ? rowProps?.draggable ?? true : false },\n tree: false,\n };\n\n return <ForwardedCominsTableInner {...flatProps} ref={ref} treeContext={treeContext} />;\n}\n\nconst ForwardedCominsTableInner = forwardRef(CominsTableInner) as <TData, TGroup = unknown>(\n props: CominsTableInnerProps<TData, TGroup> & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nconst ForwardedCominsTreeTableInner = forwardRef(CominsTreeTableInner) as <TData>(\n props: CominsTreeTableProps<TData> & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nexport type CominsViewportTableProps<TData> = Omit<CominsFlatTableBaseProps<TData>, \"data\" | \"getRowId\" | \"onChangeData\" | \"viewportDatasource\" | \"virtualized\" | \"pagination\" | \"lazyLoad\" | \"infiniteScroll\" | \"hasMoreRows\" | \"loadingMore\" | \"onLazyLoad\" | \"onLoadMore\" | \"summary\" | \"onBeforeRowDrag\" | \"onRowDrag\" | \"onAfterDragRow\"> & {\n data: CominsViewportData<TData>;\n viewportDatasource: CominsViewportDatasource;\n getRowId: (row: TData, index: number) => CominsRowId;\n onViewportRequest: (request: CominsViewportRequest) => void | Promise<void>;\n onChangeData?: (data: CominsViewportData<TData>) => void;\n virtualized?: true;\n pagination?: never;\n lazyLoad?: never;\n infiniteScroll?: never;\n hasMoreRows?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n summary?: never;\n rowGrouping?: never;\n columnFiltering?: never;\n tableTransfer?: never;\n renderRowDetail?: never;\n rowDetail?: never;\n};\n\nfunction CominsViewportTableInner<TData>(props: CominsViewportTableProps<TData>, ref: React.ForwardedRef<CominsTableRef<TData>>) {\n const snapshot = useMemo(() => props.data.revision === props.viewportDatasource.revision ? props.data : createCominsViewportData<TData>({ revision: props.viewportDatasource.revision, rowCount: props.data.rowCount, blockSize: props.data.blockSize, cacheSize: props.data.cacheSize }), [props.data, props.viewportDatasource.revision]);\n const loaded = useMemo(() => {\n if (!Number.isSafeInteger(snapshot.rowCount) || snapshot.rowCount < 0 || !Number.isSafeInteger(snapshot.blockSize) || snapshot.blockSize <= 0 || !Number.isSafeInteger(snapshot.cacheSize) || snapshot.cacheSize <= 0) throw new Error(\"Invalid Viewport snapshot\");\n const indices: number[] = [], rows: TData[] = [];\n const ids = new Set<CominsRowId>();\n let previousEnd = 0;\n for (const block of [...snapshot.blocks].sort((a, b) => a.startIndex - b.startIndex)) {\n if (!Number.isSafeInteger(block.startIndex) || block.startIndex < previousEnd || block.startIndex % snapshot.blockSize !== 0 || block.startIndex >= snapshot.rowCount || block.rows.length !== Math.min(snapshot.blockSize, snapshot.rowCount - block.startIndex)) throw new Error(\"Invalid Viewport block range\");\n for (const [offset, row] of block.rows.entries()) {\n if (row === undefined || row === null) throw new Error(\"Missing Viewport business row\");\n const index = block.startIndex + offset;\n const id = props.getRowId(row, index);\n if (ids.has(id)) throw new Error(`Duplicate viewport row id: ${String(id)}`);\n ids.add(id); indices.push(index); rows.push(row);\n }\n previousEnd = block.startIndex + block.rows.length;\n }\n return { indices, rows };\n }, [snapshot.blocks, snapshot.blockSize, snapshot.cacheSize, snapshot.rowCount, props.getRowId]);\n const rowId = useMemo(() => (row: TData, index: number) => props.getRowId(row, loaded.indices[index]!), [props.getRowId, loaded.indices]);\n const columns = useMemo(() => props.columns.map(column => ({ ...column, sort: false, filter: undefined })), [props.columns]);\n return <ForwardedCominsTableInner\n {...props}\n ref={ref}\n data={loaded.rows}\n columns={columns}\n getRowId={rowId}\n onChangeData={props.onChangeData ? next => {\n const changes = next.flatMap((row, index) => row !== loaded.rows[index] && loaded.indices[index] !== undefined ? [{ index: loaded.indices[index]!, row }] : []);\n const updated = reduceCominsViewportData(snapshot, { type: \"patch\", changes });\n if (updated !== snapshot) props.onChangeData?.(updated);\n } : undefined}\n viewportDatasource={undefined}\n viewportContext={{ data: snapshot, indices: loaded.indices, config: props.viewportDatasource, onRequest: props.onViewportRequest, onChangeData: props.onChangeData }}\n virtualized\n rowProps={{ ...props.rowProps, draggable: false }}\n rowGrouping={undefined}\n columnFiltering={undefined}\n tableTransfer={undefined}\n renderRowDetail={undefined}\n rowDetail={undefined}\n pagination={undefined}\n summary={undefined}\n lazyLoad={false}\n infiniteScroll={false}\n loading={false}\n loadingMore={false}\n tree={false}\n />;\n}\nconst ForwardedCominsViewportTableInner = forwardRef(CominsViewportTableInner) as <TData>(props: CominsViewportTableProps<TData> & React.RefAttributes<CominsTableRef<TData>>) => React.ReactElement | null;\n\nfunction CominsTableAdapter<TData, TGroup = unknown>(\n props: CominsTableProps<TData, TGroup> | CominsTreeTableProps<TData> | CominsViewportTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n if (props.viewportDatasource) return <ForwardedCominsViewportTableInner {...props} ref={ref} key={`${typeof props.viewportDatasource.revision}:${props.viewportDatasource.revision}:${props.data.rowCount}:${props.data.blockSize}`} />;\n return props.tree ? <ForwardedCominsTreeTableInner {...props} ref={ref} /> : <ForwardedCominsTableInner {...props} ref={ref} />;\n}\n\nexport const CominsTable = forwardRef(CominsTableAdapter) as <TData, TGroup = unknown>(\n props: (CominsTableProps<TData, TGroup> | CominsTreeTableProps<TData> | CominsViewportTableProps<TData>) & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nexport const cominsTablePackage = \"comins-table\";\n\nexport { getCominsColumnFilterOptions, setCominsColumnFilterValues } from \"./filtering\";\nexport type { CominsColumnFilterValue, CominsColumnConditionFilterOperator, CominsColumnConditionFilterRule, CominsColumnValueFilterRule, CominsColumnFilterOption, CominsColumnFilterOptionsResult, CominsColumnFilterValuesAction, CominsColumnFilterOptionsInput } from \"./filtering\";\n\nexport type { CominsValueFilterTriggerRenderParams, CominsValueFilterOptionRenderParams, CominsValueFilterPanelRenderParams, CominsValueFilterActions, CominsValueFilterPart, CominsFilterButtonGetter, CominsFilterCheckboxGetter, CominsFilterNativeOptions, CominsFilterCustomOptions, CominsFilterBinding } from \"./filtering\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["pathKey","getRegisteredTransferSnapshot","createCominsTableState","serializeCominsColumnLayout","valuesCore.getCominsColumnFilterOptions","valuesCore.setCominsColumnFilterValues","core.normalizeCominsColumnFilterModel","core.getCominsFilteredRowIndexes","_Fragment","_Fragment","bounds","rangeOf","getNestedFieldValue","normalizeCominsRowGrouping","createCominsGroupModel","orderCominsGroupModel","core.normalizeCominsRowGrouping","core.createCominsGroupModel","core.orderCominsGroupModel","getBrowserSnapshot","reduceCominsViewportData","reduceCoreViewportData","reduceCominsViewportData","_Fragment","getRegisteredTransferSnapshot","getReactTransferSnapshot","getCrossTableTransferHit","getBrowserTransferHit","projectReactRows","isNativeEditor","resolveCominsColumnPinning","normalizeColumns","serializeCominsColumnLayout$1","getCominsPinnedBlockResizeMaxWidth","normalizeColumnGroups","getCominsColumnPinningSpanFragments","clampColumnWidth","parseCominsClipboardText","getEffectiveColumnMinWidth","createCominsTableState$1","setColumnWidthInsideParentGroup","getEffectiveColumnMaxWidth","setNestedFieldValue","projectReactGroup","pasteCominsCell","serializeCominsColumnLayout","isCominsCellInSelectedRange","moveCominsColumnGroup","moveCominsColumn","replaceCominsRows","setCominsHeaderVisible","setCominsColumnGroupWidth","selectCell","setCominsSortState","setCominsPagination","selectCellRange","pasteCominsRow","pasteCominsText","moveCominsRow","queryCominsRows","projectReactColumn","selectRow","isCominsCellDisabled","isCominsRowSelected","setCominsColumnHidden","setCominsColumnGroupHidden","setCominsColumnWidth","sortCominsRows","setCominsTableTheme","updateCominsRows","getCominsPageRows","clearCominsSortState","getCominsVirtualRows","copyCominsRow","fillCominsCellRange","projectReactState","formatCominsCellValue","getCominsHeaderRows","getCominsCellValue","clearCominsSelection","pasteCominsCellRange","moveCominsRowToGroup","createCominsTableState","getCominsCellStyle","applyCominsColumnLayout","copyCominsCell","getCominsCellClassName","setCominsSortModel","clearCominsCellRange","copyCominsCellRange","addCominsRows","deleteCominsRows","getCominsSelectedCellRange","isCominsCellSelected","getCominsVisibleColumns","getCominsSortedRowIndexes","selectRows","getCominsFilteredRowIndexes$1","createCominsTreeExportOptions","exportCominsRowsToJson","getCominsColumnFilterOperators","importCominsRowsFromCsv","searchFilterOptions","normalizeCominsColumnFilterModel$1","setCominsColumnFilterValues$1","createCominsGroupedExportOptions","getCominsColumnFilterOptions$1","exportCominsRowsToCsv","React","Fragment$1","getCominsColumnMouseIntent","horizontalDelta","clientX","startX","verticalDelta","clientY","startY","getCominsDragAutoScrollVelocity","height","bottom","top","edgeBand","getCominsDragAutoScrollTop","maxScrollTop","scrollHeight","clientHeight","scrollTop","deltaMs","velocity","getCoreCellBounds","a","rows","range","b","c","columns","d","getCoreCellRange","box","resolveCoreFillTarget","source","rowIds","columnIds","row","address","column","dy","dx","extended","planCoreSelectionCopy","order","kind","target","cells","selectedRowIds","selectedRows","rowPositions","id","index","columnPositions","selected","positions","cell","firstRow","lastRow","firstColumn","lastColumn","position","pathKey$1","path","resolveCoreTreeDropContext","entries","entry","sourceId","targetId","parentPath","parent","nextSibling","resolveCoreTreePointerPosition","fraction","allowReparent","captureCominsPointer","pointerId","released","registerCominsPointerListeners","input","move","up","cancel","blur","key","keyCapture","startCominsPointerFrames","stopped","tick","onFrame","time","host","frame","focusCominsPointerTarget","applyCominsDragScroll","next","viewport","isCominsNativeEditor","createCrossTableAutoScroll","animationFrame","lastTimestamp","stop","runFrame","currentViewport","timestamp","bounds","nextScrollTop","moved","resolveTarget","valid","nextViewport","nextClientY","nextClientX","measureCominsElement","rect","element","createMeasurementObserver","targets","observer","generation","disposed","deliver","measurement","options","disconnect","activeGeneration","hasCominsResizeObserver","observeCominsViewport","active","onMeasure","observeCominsFontChanges","fonts","onChange","getCominsElementRect","setCominsScrollTop","setCominsScrollLeft","left","scrollCominsRowIntoView","focusCominsElement","createCominsDetailFocusRestorer","frames","restoreFocus","toggle","getToggle","writeCominsClipboardText","text","readCominsClipboardEvent","data","writeCominsClipboardEvent","createTableTransferRegistry","scopes","tables","scope","registrations","tableId","registration","getRegisteredTransferSnapshot$1","snapshot","registry","coordinator","getCrossTableTransferHit","sourceSnapshot","root","setCominsNestedInputValue","field","value","getNextSort","current","columnId","getNextSortModel","currentIndex","rule","nextRule","additive","getSortRule","getSortIndicatorState","currentRule","getAriaSortState","areSortStatesEqual","right","areSortModelsEqual","areRowIdSequencesEqual","insertDeclaredColumnsIntoOrder","declaredIndex","declaredOrder","followingColumnId","candidate","precedingColumnId","reconcileColumnOrderHistory","merged","history","currentIds","currentOrder","currentColumnId","canPreserveSelection","nextColumnIds","selectedCell","selectedCells","selectedRange","reconcileCoreState","declaredColumnOrder","nextInput","historicalOrder","columnOrderHistory","nextState","dataChanged","state","viewportIndices","reconcileCoreViewportSelection","invalidatedDetailRowIds","getRowIdChanged","previousRowById","rowId","selection","indices","getCoreStateChanges","reconcileReactState","columnGroups","result","notifyReactStateChanges","changes","callbacks","notifyReactInputChanges","hasCellTooltipContent","content","useCominsCellTooltip","setActive","useState","activeRef","useRef","hovered","focused","dismissed","leaveTimer","focusTimer","useId","clearLeave","clearFocus","close","dismiss","settleFocus","useLayoutEffect","useEffect","doc","onKeyDown","event","onScroll","onResize","anchor","CominsCellTooltip","surface","setPosition","controller","visible","win","updatePosition","theme","token","below","previous","ids","createPortal","getPathKey","createCominsTreeNodeIndex","byId","idByPath","itemIndex","visit","childIndex","getRowId","node","nodes","updateCominsTreeNodeAtPath","targetIndex","remainingPath","update","moveCominsTreeNode","sourcePath","destination","beforePath","samePath","i","sourceParent","siblingsAt","siblings","tree","part","sourceSiblings","sourceIndex","removed","detached","nextIndex","nextParent","nextBefore","children","flattenCominsTree","visibleRows","hasChildren","expanded","depth","getCominsTreeLeafItems","toggleCominsTreeNode","updateCominsTreeItem","sortCominsTreeSiblings","compare","getCorePageProjection","pageSize","pagination","maxPageIndex","visibleRowCount","effectivePageIndex","projectCoreViewportWindow","byIndex","loaded","rowCount","projectCoreRows","dataIndexes","dataIndex","absoluteIndex","page","getTreeNestedFieldValue","compareTreeValues","getSortedCoreTree","sortModel","leftValue","leftRow","rightValue","rightRow","getSortedReactTree","selectedRowData","selectedCellValues","encodeTsv","copySelectionData","plan","columnsById","getCominsColumnFilterOptions","setCominsColumnFilterValues","normalizeCominsColumnFilterModel","originals","getCominsFilteredRowIndexes","bindRef","cleanup","install","user","createSearchRefInstaller","createIndeterminateInstaller","indeterminate","eventHandler","internal","visual","base","extra","partProps","params","createFilterButtonGetter","getProps","shared","aria","props","createCheckboxGetter","useValueFilter","query","setQuery","searchRef","readOnly","onChangeModel","open","enabled","useMemo","apply","actions","getOptionProps","getter","option","checked","search","custom","ValueFilterPanel","renderFilterTrigger","fallback","getFilterTriggerVisual","icons","DragHandleDots2Icon","ChevronRightIcon","MagnifyingGlassIcon","CaretSortIcon","CominsTableIcon","Icon","name","className","CominsTableIconButton","buttonProps","icon","operatorLabels","getDefaultOperator","getRuleInputValue","getRuleInputValueTo","isValidDateInput","year","month","day","date","CominsColumnFilterControl","buttonRef","onOpenChangeRef","onOpenChange","popoverRef","popoverId","operator","setOperator","setValue","valueTo","setValueTo","pendingRuleKeyRef","ruleKey","inputValue","appliedRuleKey","onChangeRule","requiresValue","valuesMode","values","valueSource","portalContainer","getPortalContainer","triggerParams","columnLabel","panel","controls","candidates","style","alive","inside","button","popover","width","handlePointerDown","handleKeyDown","handleFocusOut","positionFrame","trackPosition","emitRule","nextKey","renderPopover","commitRule","nextOperator","nextValue","firstValue","secondValue","nextValueTo","mergeClassName","resolveComponentProps","payload","resolveComponentOptions","resolveComponentMenuItems","resolveVirtualListItems","toSearchableText","isMenuSelectableItem","item","isNodeInside","stopComponentEvent","preventAndStopComponentEvent","toComponentInputValue","CominsInputComponent","component","_propsOnChange","inputProps","propValue","defaultValue","draftValue","setDraftValue","lastCommittedValueRef","composingRef","commitValue","onBlur","onClick","onCompositionStart","onCompositionEnd","onMouseDown","onPointerDown","CominsCheckboxComponent","optimisticChecked","setOptimisticChecked","defaultChecked","CominsToggleComponent","restButtonProps","buttonChildren","nextChecked","installHeaderMenuDismissListeners","triggerRef","menuRef","requestOpenRef","installHeaderMenuPositionListeners","updateMenuPosition","trigger","menuWidth","CominsHeaderMenuComponent","setOpen","menuId","menuPosition","setMenuPosition","items","requestOpen","nextOpen","menu","CominsCellVirtualListComponent","itemHeightProp","limitProp","rootProps","limit","itemHeight","defaultHeight","hasExplicitHeight","setExpanded","setScrollTop","selectedValue","setSelectedValue","viewportHeight","setViewportHeight","itemsViewportRef","isSingleRowSelected","searchEnabled","searchable","activeQuery","measuredHeight","filteredEntries","normalizedQuery","hasOverflow","virtualized","more","showOverflowControl","overscan","safeViewportHeight","visibleStart","visibleEnd","renderedEntries","topSpacerHeight","bottomSpacerHeight","listId","rootStyle","selectItem","interaction","renderCominsBuiltInComponent","selectProps","groupName","_value","divProps","max","percent","CominsRowDetailToggle","CominsRowDetailRow","contentRef","getToggleElementRef","restoreFocusRef","onContentElementRef","automatic","createCellFillCancelEffect","cancelRef","useCominsCellFill","latest","suppressClick","preview","setPreview","setMenu","closeMenu","focus","scroll","previewBox","fillSelection","from","direction","releasePointer","initial","initialSource","x","y","targetKey","lastTime","validSnapshot","horizontal","stopFrames","removeListeners","commit","COMINS_ROW_GROUP_AGGREGATIONS","getNestedFieldValue$1","getColumnValue","createAggregateState","aggregation","updateAggregateState","getCominsAggregateValue","getCominsGroupSlotKey","groupId","normalizeCominsRowGrouping$1","columnById","aggregations","aggregationColumns","groupIds","groupsById","suppliedGroups","group","normalizedGroup","createCominsGroupModel$1","aggregationState","sourceRow","aggregateState","configuredColumn","defaultCompare","orderCominsGroupModel$1","orderedLeafSourceIndexesById","sortLeafIndexes","rowIndexes","leftIndex","rightIndex","projectCominsGroups","expandedGroupIds","visibleLeafRowIds","visibleLeafIndex","moveCominsRowGroup","nextGroups","sourceGroup","insertIndex","normalizeCominsRowGrouping","labels","normalized","render","label","createCominsGroupModel","orderCominsGroupModel","model","findRowIndex","endpoint","isGroupedEndpoint","getRowEndpoint","getGroupEndpoint","groupIndex","resolveConflict","resolver","conflict","copyGroups","groups","transferCominsRowBetweenTables","sourceGrouped","targetGrouped","sourceRowEndpoint","targetRowIndex","movedRow","targetGroupId","sourceGroupId","targetData","conflicts","duplicateIndex","normalizedTargetRowIndex","targetRowEndpoint","policy","lastGroupIndex","transferCominsGroupBetweenTables","sourceGroupIndex","sourceGroupEndpoint","targetGroups","duplicateGroupIndex","overwriteDataInsertIndex","overwriteGroupInsertIndex","targetGroupEndpoint","targetMemberIndexes","firstMemberIndex","sourceRowIds","duplicateRows","duplicate","duplicateRowIds","groupInsertIndex","targetGroupIndex","memberRows","dataInsertIndex","sourceMemberIndexes","coordinatorStates","getCoordinatorState","createCominsTableTransferCoordinator","isCominsTableTransferCoordinator","registerCominsTableTransfer","getRegisteredTransferSnapshot","useCominsTableTransferRegistration","emitCominsTableTransfer","emitCominsTableTransferRejected","rejection","CominsTooltipSurface","tone","CominsPointerTooltip","tooltipRef","maxLeft","preferredTop","fitsBelow","placement","normalizeCominsViewportInteger","createCominsViewportData","intersects","trim","required","block","request","protectedBlocks","others","blocks","loading","errors","protectedErrors","otherErrors","remaining","reduceCominsViewportData$1","startIndex","endIndex","clock","change","accepted","changed","requests","currentBlock","reduceCominsViewportData","normalizeCominsRowHeight","resolveCominsRowHeight","auto","CominsViewportHeightIndex","estimate","blockSize","maxBlocks","count","end","endExclusive","total","offset","low","high","middle","delta","first","last","requiredCount","planViewportRequests","needed","wanted","cancelRequestIds","releaseRequestIds","activeStarts","retryStarts","consumedRetryStarts","startRanges","retry","createViewportRequestExecutor","requestId","descriptor","runViewportRequest","cancelled","stopWaiting","cancellation","resolve","dispatch","nextRequestId","useCominsViewportRequests","executor","retryBlocks","version","setVersion","start","onRequest","retained","onChangeData","nextRange","pathKey","useCominsTreeDrag","committed","gesture","navigateRef","pendingFocus","pendingScrollTop","announcement","setAnnouncement","targetPayload","finish","focusId","reason","handle","choose","context","begin","disabled","draggable","lastEvent","pointer","insideX","now","keyboard","moveByKeyboard","getNumericValues","getBuiltinSummaryValue","numericValues","getNestedFieldValue","resolveCominsSummaryValues","renderedColumnIds","summary","valuesByColumnId","config","aggregate","formattedValue","rendered","getCominsSummaryValues","COMINS_MAX_PHYSICAL_TOTAL_HEIGHT","getCominsDataSlotKey","createCominsDataVirtualSlot","normalizeCominsDetailEstimate","fallbackHeight","normalizeCominsDetailHeight","CominsHeightIndex","heights","cursor","treeIndex","prefix","bit","nextPrefix","getCominsSlotHeight","slot","rowHeight","getCominsScrollScale","physicalScrollHeight","logicalTotalHeight","logicalScrollableHeight","physicalScrollableHeight","getCominsMixedVirtualRange","metrics","physicalScrollTop","logicalScrollTop","firstVisibleIndex","lastVisibleIndex","logicalStartOffset","resolveCominsMeasuredDetailHeight","cache","reconcileCominsDetailMeasurements","captureCominsScrollAnchor","previousIndex","slotStart","resolveCominsAnchorTarget","nextIndexByKey","getCominsPhysicalScrollTop","useCominsViewport","setState","activeInitial","mounted","useCallback","onViewportRequest","isCominsGroupedTransferEndpoint","getCominsTransferIdentity","areCominsRowDragTargetsEqual","getCominsColumnDropStatus","orderChanged","selectRowForContextMenu","getCominsVirtualProjectionKeys","projection","captureCominsVirtualAnchor","previousKeys","previousLogicalScrollTop","toClassName","resolveRowProp","resolveRowProps","rowProps","getRowCustomBackground","background","getResolvedRowStyle","resolvedStyle","customBackground","createEventRow","createEventColumn","createRowPayload","createCellPayload","columnIndex","createComponentColumnPayload","createCellComponentPayload","rowDisabled","rowSelected","resolveRenderableCellProps","stopTreeSlotControlEvent","control","resolveDefaultRender","defaultContent","resolveTreeSlotContent","renderTreeSlot","resolveRenderableCellGuard","guard","isRenderableCellDisabled","getRenderableCellClassName","getRenderableCellStyle","deferredDefaultCellValue","formatRenderableCellValue","createHeaderComponentPayload","columnState","sortRule","isCominsCellComponentPayload","shouldRenderCominsComponent","getRenderableCominsComponents","components","renderCominsComponentSlots","createDisclosureElementRef","elementsRef","blockCominsColumnPlaceholderInteraction","blurCominsColumnPlaceholderFocus","cominsColumnPlaceholderNativeBoundaries","bindCominsColumnPlaceholderNativeBoundary","blockActiveInput","COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS","getCominsColumnPlaceholderText","collectPlainText","isValidElement","renderCominsContentWithComponents","showContent","renderableComponents","leftSlots","rightSlots","setCominsTreeExpansion","nodeIds","idByNode","ancestorIds","requestedIds","requestedBranchIds","expandedById","defaultExpandAll","ancestorsAllowExpand","ancestorId","currentExpanded","applyChanges","nextNodes","nextExpanded","nextChildren","createViewportMeasurementEffect","resources","createTableUnmountEffect","marker","createDetailObserverCleanupEffect","createColumnInteractionCleanupEffect","suppressed","CominsTableInner","bufferSize","dataTestId","providedRowHeight","detailFocusRestorer","containerRef","footerRef","headerRef","horizontalScrollbarRef","synchronizedScrollLeftRef","tableRootRef","cellTooltip","activeCellTooltipContent","copiedCellRef","copiedRangeRef","copiedRowRef","detailMeasurementsRef","rowMeasurementsRef","committedViewportIndexRef","viewportMeasurementAnchorRef","detailElementsRef","fallbackMeasuredDetailElementsRef","detailObserverRef","committedDetailObserverSnapshotRef","rowDetailToggleElementsRef","activePointerGestureCleanupRef","columnPointerInteractionRef","columnInteractionResetPendingRef","columnMoveAnimationCleanupRef","columnMoveAnimationSnapshotRef","headerRendererBodyRef","lastCellAnchorRef","lazyAbortControllerRef","lazyLoadingReasonRef","onLazyLoadRef","onLazyLoad","lazyRequestIdRef","lastLoadMoreRowCountRef","lastRowAnchorRef","rangeDragAnchorRef","rangeDragLastAddressRef","rangeDragMovedRef","rowMoveStateRef","pendingRowMoveScrollTopRef","rowGroupMoveStateRef","transferSnapshotRef","externalDropMarkerRef","transferRejectionTargetRef","transferRejectionTimerRef","pendingTransferFocusFrameRef","groupDisclosureElementsRef","pendingGroupDisclosureFocusRef","focusedLeafDataIndexRef","previousGroupedDataIndexesRef","anchorRevisionRef","logicalAnchorTransactionRef","pendingDetailAnchorRef","pendingScrollTopRef","previousVirtualProjectionRef","scrollCommitTimeoutRef","scrollFrameRef","suppressedSortClickRef","containerHeight","setContainerHeight","containerWidth","setContainerWidth","horizontalScrollContentWidth","setHorizontalScrollContentWidth","horizontalViewportOuterWidth","setHorizontalViewportOuterWidth","horizontalViewportWidth","setHorizontalViewportWidth","detailLayoutVersion","setDetailLayoutVersion","rowFontRevision","setRowFontRevision","movingColumnId","setMovingColumnId","movingGroupId","setMovingGroupId","columnMovePointer","setColumnMovePointer","columnMoveTarget","setColumnMoveTarget","logicalAnchorTransaction","setLogicalAnchorTransaction","resizingColumnId","setResizingColumnId","rowMoveState","setRowMoveState","rowGroupMoveState","setRowGroupMoveState","transferRejectionFeedback","setTransferRejectionFeedback","tableInstanceId","rowDetailIdPrefix","effectiveData","groupingRequested","treeContext","rowGrouping","filteringRequested","columnFiltering","normalizedTableTransfer","infiniteScroll","lazyLoad","tableTransfer","effectivePagination","effectiveRowProps","stateRef","columnOrderHistoryRef","stateInputRef","virtualBufferSize","resolvedLazyLoadBatchSize","lazyLoadBatchSize","resolvedLazyLoadThreshold","lazyLoadThreshold","infiniteScrollThreshold","hasLazyLoadHandler","resolvedRowDetailRender","rowDetail","renderRowDetail","rowDetailEnabled","viewportContext","normalizedExpandedRowIds","seen","expandedRowIds","expandedRowIdSet","toggleRowDetail","expandable","onChangeExpandedRowIds","clearActivePointerGesture","registerActivePointerGesture","clearExternalDropMarker","clearTransferRejectionFeedback","updateState","showTransferRejectionFeedback","feedback","targetSnapshot","duplicateId","renderedContent","requestedDuration","duration","setExternalDropMarker","getRegisteredTransferSnapshot$2","getCrossTableTransferHit$1","scheduleTransferFocus","remainingAttempts","attemptFocus","targetTableId","identity","focusTarget","requestLazyLoad","lazyLoadHandler","lazyLoadMode","currentRowsLength","hasMoreRows","loadingMore","previousInput","showHeader","getRowHeight","updateMixedProjectionDetailHeight","slotIndex","nextSlotHeight","applyDetailMeasurementUpdates","updates","currentPendingDetailAnchor","viewportIndex","logical","pendingAnchor","updatedActiveIndex","revision","createDetailObserver","observed","disconnectDetailObserverIfIdle","registerDetailElement","currentElement","mode","notifyChanges","commitState","updater","visibleColumns","renderedHeaderRendererBodies","columnWidths","columnCount","configuredWidths","fallbackWidth","fixedTotal","flexibleColumns","flexibleWidth","minWidth","maxWidth","columnPinningBlocks","groupIdByColumnId","visibleColumnIds","widthByColumnId","emittedGroups","columnPinning","getPinnedColumnAttributes","pin","columnWidthTotal","totalWidth","tableWidth","detailContentWidth","headerRows","normalizedColumnFilters","filteringActive","normalizedColumnFilterById","filterSourceRows","filteredDataIndexes","filteredRows","summaryValues","summaryCells","requestedColSpan","colSpan","groupingAggregations","groupingGetGroupId","groupingGetGroupLabel","groupingLabelRender","groupingGetRowGroupId","groupingGroups","normalizedGrouping","groupModel","orderedGroupModel","normalizedExpandedGroupIds","expandedGroupIdSet","toggleRowGroup","onChangeExpandedGroupIds","groupingProjection","groupingActive","transferEndpoint","pendingGroupId","disclosure","nextDataIndexes","previousDataIndexes","focusedDataIndex","activeElement","fallbackGroupId","sortedRowIndexes","projectedDataIndexes","selectionRowIds","visibleSlotCount","visibleRowIds","cellHidden","visibleSelectedCells","cellsHidden","rangeHidden","effectiveExpandedRowIdSet","pageStartIndex","visibleIndex","isRowExpandable","rowLayoutKey","rowContentRevision","viewportIndexById","rowProjection","fullProjectionSlots","safeRowHeight","projectionEntry","detail","resolvedHeight","estimatedRowHeight","getRowDetailHeight","estimatedRowDetailHeight","mixedProjection","slots","heightIndex","slotIndexByRowId","scale","logicalTop","viewportConfigurationKey","viewportIndexKey","viewportHeightIndex","previousViewportIndex","viewportAnchor","physical","viewportAnchorLogical","currentPhysical","previousPhysical","latestTransaction","nextTransaction","targetLogical","requestedPhysical","transaction","detailObserverSnapshotCandidate","currentObserver","rowWindow","activeAnchorTransaction","totalHeight","physicalTotalHeight","scrollScale","logicalTopSpacerHeight","viewportRenderedRange","lastViewportSlot","retryViewport","currentVirtualProjection","previousVirtualProjection","pendingDetailAnchor","pendingVirtualAnchor","pendingAnchorTransaction","treeMoveScrollTop","rowMoveScrollTop","currentPhysicalScrollTop","clampedPreviousPhysicalScrollTop","latestLogicalTransaction","nextLogicalTransaction","nextKeys","anchorLogicalScrollTop","nextLogicalTotalHeight","nextViewportHeight","nextLogicalScrollTop","nextPhysicalScrollTop","actualPhysicalScrollTop","nextAnchorTransaction","currentTheme","densityClass","selectedRowIdSet","hasHorizontalOverflow","nextContentWidth","nextViewportOuterWidth","nextViewportWidth","synchronizedHorizontalViewportWidth","synchronizedHorizontalScrollbarWidth","synchronizedHorizontalContentWidth","resolvedHasMoreRows","resolvedLoading","resolvedLoadingMore","isEmpty","shouldRenderSkeleton","shouldRenderEmpty","shouldRenderInfiniteLoadingRow","resolvedSkeletonRowCount","skeletonRowCount","stateRowCount","renderedRowsHeight","emptyFillerHeight","renderedHeaderVisible","persistHeaderWhenEmpty","scrollLeft","isCopyPasteKey","getVisibleEntryByRenderedIndex","getVisibleRowIdsBetween","anchorIndex","anchorRowId","focusIndex","focusRowId","visibleEntries","selectRowRangeByIds","selectRowsByVisibleIndexes","indexes","clearSuppressedSortClick","suppressNextSortClick","scheduleSuppressedSortClickClear","keepSuppressedSortClickUntilPointerEnd","handlePointerUp","handlePointerCancel","handleWindowBlur","consumeSuppressedSortClick","activateHeaderSort","nextModel","multiSort","header","getColumnMoveTarget","targetHeader","getColumnMoveTargetIndex","targetColumnId","childId","getColumnMoveHeaderPinned","ref","prepareSelectionCopy","cellFill","getSelectionRowOrder","nextGroupIds","nextGroupIdSet","groupIdSet","layout","sourceRowId","sourceIdx","targetIdx","nextVisibleRowIds","targetPosition","rowById","nextRows","sort","fillHandle","cellSelection","onClipboardError","clearColumnPointerInteraction","captureColumnMoveAnimationSnapshot","elements","animatedElements","previousLeft","timeout","beginColumnPointerInteraction","pointerType","isMousePointer","suppressPendingSort","activateCurrent","handlePointerMove","intent","moveEvent","upEvent","keyEvent","beginHeaderPointerInteraction","beginGroupPointerInteraction","selectRowFromInteraction","handleRowKeyDown","onKeyDownRow","getClipboardState","visibleIndexes","applicationPayload","original","resolved","isLoadedCellRange","min","handleCellKeyDown","onKeyDownCell","clipboard","clipboardState","clipboardPaste","beginCellRangeDrag","anchorId","getCellAddressFromPoint","updateCellRangeDrag","endCellRangeDrag","beginCellRangePointerDrag","nextAddress","beginRowHandlePointerDrag","sourceTableId","onBeforeRowDrag","crossTarget","autoScroll","finished","lastPointerEvent","lastTarget","registeredCleanup","notifyTarget","onRowDrag","pointerEvent","onAfterDragRow","setActiveRowMoveState","resolveCrossTarget","hit","sourceEndpoint","targetEndpoint","sourceDataIndex","rowElement","groupElement","targetRowId","structurallyValid","targetDataIndex","targetRow","targetGroup","updateTarget","pointElement","targetTableInstanceId","moveState","finalCrossTarget","rejectedConflict","currentRow","resetRenderState","cancelEvent","unmounting","beginRowGroupHandlePointerDrag","onChangeGroups","crossTableEnabled","setActiveGroupMoveState","currentGroups","fromIndex","toIndex","movingColumn","visibleColumn","movingGroup","movingHeaderLabel","changeColumnFilterRule","filtering","currentModel","renderHeaderCell","isDropTarget","isGroupPlaceholder","groupPositionLocked","groupColumnIds","firstGroupPin","lastGroupPin","groupPinned","groupPinStyle","groupPinBoundary","groupPlaceholderLabel","showColumnMoveHandle","measuredWidth","visibleWidthSnapshot","measuredColumnWidth","fallbackGroupWidth","sum","startWidth","resizeMaxWidth","visibleColumnId","visibleColumnWidth","safeIndex","fallbackIndex","pinnedColumn","headerProps","sortIndicatorState","sortIndicatorVisible","showSortPriority","isMovingGroupChild","isColumnPlaceholder","columnPlaceholderLabel","headerClassName","headerPayload","headerRenderer","headerRendererKind","cachedHeaderRendererBody","shouldRefreshHeaderRendererBody","headerRendererBody","useDefaultHeader","headerLeftSlots","headerRightSlots","hasHeaderComponents","columnPositionLocked","columnFilterKind","columnFilterable","renderColumnSizing","commitPendingScrollTop","requestInfiniteLoadIfNeeded","bodyViewport","onLoadMore","safeThreshold","currentRowCount","syncHorizontalScrollLeft","scrollContainers","sharedMaxScrollLeft","nextScrollLeft","requestedScrollLeft","handleBodyScroll","overlay","handleBodyWheel","rawDelta","deltaScale","previousScrollLeft","editingRowIds","editingColumnIds","editingEnabled","reportClipboardError","error","canEditRange","matrix","absolute","expected","headerRow","cellIndex","rowIndex","skeletonIndex","emptyContent","emptyComponent","isLastRenderedSlot","entryIndex","isLastLogicalSlot","virtualContentFillsViewport","isViewportEndRow","aggregateValues","groupRenderParams","groupRowProps","groupRender","customContent","useDefaultGroupContent","aggregateContent","groupDraggable","groupDropPosition","isRowDropTarget","actualRowStyleHeight","rowRuntimeProps","isRowSelected","isLastLogicalRow","rowCustomBackground","rowRenderKey","rowDetailParams","rowDetailExpandable","rowDetailExpanded","rowDetailFixedHeight","rowDetailMode","rowDetailIdToken","rowDetailId","rowDetailContentId","rowDetailToggleId","Fragment","rowSelectionOnClick","onClickRow","onContextMenuRow","rawValue","isCellInRange","isCellSelected","cellPayload","cellProps","cellDisabled","componentInteraction","cellClassName","cellStyle","hasCellComponents","configuredCellValue","cellComponents","onValueChange","visibleCellComponents","cellRender","customCellContent","useDefaultCellContent","formattedCellValue","cellContent","tooltip","tooltipConfig","customTooltip","tooltipKey","treeEntry","treeSlots","treeSlotParams","hasTreeSlots","renderedCellContent","onClickCell","alreadySelected","onContextMenuCell","onDoubleClickCell","loadingContent","loadingComponent","fragmentStyle","fragment","fragmentIndex","CominsTreeTableInner","_columnFiltering","_estimatedRowDetailHeight","_expandedRowIds","_getRowDetailHeight","_hasMoreRows","_infiniteScroll","_infiniteScrollThreshold","_lazyLoad","_lazyLoadBatchSize","_lazyLoadMode","_lazyLoadThreshold","_loadingMore","_onChangeExpandedRowIds","_onLazyLoad","_onLoadMore","_rowGrouping","_tableTransfer","_isRowExpandable","_renderRowDetail","_rowDetail","_tree","initialDefaultExpandAll","treeSortModel","setTreeSortModel","treeColumns","treeColumnId","sortedTree","visibleTreeRows","entriesByRowId","treeDrag","treeRowDrag","nextData","handleFlatDataChange","nextTree","nextItem","flatProps","nextSortModel","onChangeSortModel","ForwardedCominsTableInner","forwardRef","ForwardedCominsTreeTableInner","CominsViewportTableInner","previousEnd","updated","ForwardedCominsViewportTableInner","CominsTableAdapter","CominsTable","cominsTablePackage"],"sources":["../src/column-pointer.ts","../src/drag-autoscroll.ts","../src/core/selection/navigation.ts","../src/browser/pointer.ts","../src/browser/measurements.ts","../src/browser/scroll.ts","../src/browser/clipboard.ts","../src/browser/table-transfer.ts","../src/row-value.ts","../src/table-state.ts","../src/core/state/reconcile.ts","../src/core/state/changes.ts","../src/react/state.ts","../src/react/cell-tooltip.tsx","../src/tree.ts","../src/core/rows/projection.ts","../src/react/rows.ts","../src/selection-data.ts","../src/filtering.ts","../src/react/value-filter.tsx","../src/table-icons.tsx","../src/column-filter.tsx","../src/component-renderer.tsx","../src/row-detail.tsx","../src/cell-fill.tsx","../src/core/rows/grouping.ts","../src/grouping.ts","../src/core/transfer/policy.ts","../src/react/table-transfer.ts","../src/tooltip.tsx","../src/core/viewport/data.ts","../src/viewport-data.ts","../src/core/layout/row-height.ts","../src/core/layout/viewport.ts","../src/core/viewport/requests.ts","../src/browser/viewport-requests.ts","../src/react/viewport.ts","../src/tree-drag.tsx","../src/core/rows/summary.ts","../src/summary.ts","../src/core/layout/virtual.ts","../src/use-viewport.ts","../src/index.tsx"],"sourcesContent":["export const COMINS_COLUMN_MOUSE_DRAG_THRESHOLD = 6;\n\nexport type CominsColumnMouseIntent = \"activate\" | \"cancel\" | \"pending\";\n\nexport function getCominsColumnMouseIntent({\n clientX,\n clientY,\n startX,\n startY,\n}: {\n clientX: number;\n clientY: number;\n startX: number;\n startY: number;\n}): CominsColumnMouseIntent {\n const horizontalDelta = Math.abs(clientX - startX);\n const verticalDelta = Math.abs(clientY - startY);\n\n if (horizontalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && horizontalDelta > verticalDelta) {\n return \"activate\";\n }\n\n if (verticalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && verticalDelta >= horizontalDelta) {\n return \"cancel\";\n }\n\n return \"pending\";\n}\n","export const COMINS_DRAG_AUTO_SCROLL_MAX_SPEED = 720;\nexport const COMINS_DRAG_AUTO_SCROLL_MAX_FRAME_MS = 32;\n\nexport type CominsDragAutoScrollMetrics = {\n bottom: number;\n clientY: number;\n top: number;\n};\n\nexport type CominsDragAutoScrollStep = {\n clientHeight: number;\n deltaMs: number;\n scrollHeight: number;\n scrollTop: number;\n velocity: number;\n};\n\nexport function getCominsDragAutoScrollVelocity({\n bottom,\n clientY,\n top,\n}: CominsDragAutoScrollMetrics) {\n const height = Math.max(0, bottom - top);\n const edgeBand = Math.min(40, height / 2);\n\n if (edgeBand <= 0 || clientY < top || clientY > bottom) {\n return 0;\n }\n\n if (clientY < top + edgeBand) {\n return -COMINS_DRAG_AUTO_SCROLL_MAX_SPEED * (1 - (clientY - top) / edgeBand);\n }\n\n if (clientY > bottom - edgeBand) {\n return COMINS_DRAG_AUTO_SCROLL_MAX_SPEED * (1 - (bottom - clientY) / edgeBand);\n }\n\n return 0;\n}\n\nexport function getCominsDragAutoScrollTop({\n clientHeight,\n deltaMs,\n scrollHeight,\n scrollTop,\n velocity,\n}: CominsDragAutoScrollStep) {\n const maxScrollTop = Math.max(0, scrollHeight - clientHeight);\n const normalizedScrollTop = Math.max(0, Math.min(scrollTop, maxScrollTop));\n const normalizedDeltaMs = Math.max(0, Math.min(deltaMs, COMINS_DRAG_AUTO_SCROLL_MAX_FRAME_MS));\n\n return Math.max(\n 0,\n Math.min(\n maxScrollTop,\n normalizedScrollTop + velocity * (normalizedDeltaMs / 1000),\n ),\n );\n}\n","import type { CominsCellAddress, CominsCellRange, CominsRowId } from \"../model\";\nimport type { CominsTreeDropPosition } from \"../../tree\";\nexport { getCominsColumnMouseIntent } from \"../../column-pointer\";\nexport { getCominsDragAutoScrollTop, getCominsDragAutoScrollVelocity } from \"../../drag-autoscroll\";\n\nexport type CoreCellBounds = { top: number; bottom: number; left: number; right: number };\nexport function getCoreCellBounds(range: CominsCellRange, rows: readonly CominsRowId[], columns: readonly string[]): CoreCellBounds | null {\n const a = rows.indexOf(range.anchor.rowId), b = rows.indexOf(range.focus.rowId);\n const c = columns.indexOf(range.anchor.columnId), d = columns.indexOf(range.focus.columnId);\n return Math.min(a, b, c, d) < 0 ? null : { top: Math.min(a, b), bottom: Math.max(a, b), left: Math.min(c, d), right: Math.max(c, d) };\n}\nexport function getCoreCellRange(box: CoreCellBounds, rows: readonly CominsRowId[], columns: readonly string[]): CominsCellRange {\n return { anchor: { rowId: rows[box.top]!, columnId: columns[box.left]! }, focus: { rowId: rows[box.bottom]!, columnId: columns[box.right]! } };\n}\nexport function resolveCoreFillTarget({ source, address, rowIds, columnIds }: {\n source: CominsCellRange; address: CominsCellAddress | null; rowIds: readonly CominsRowId[]; columnIds: readonly string[];\n}): CominsCellRange | null {\n const box = getCoreCellBounds(source, rowIds, columnIds);\n const row = address ? rowIds.indexOf(address.rowId) : -1, column = address ? columnIds.indexOf(address.columnId) : -1;\n if (!box || row < 0 || column < 0) return null;\n const dy = Math.max(box.top - row, row - box.bottom, 0), dx = Math.max(box.left - column, column - box.right, 0);\n if (!dy && !dx) return null;\n const extended = dy >= dx ? { ...box, top: Math.min(box.top, row), bottom: Math.max(box.bottom, row) }\n : { ...box, left: Math.min(box.left, column), right: Math.max(box.right, column) };\n return (extended.bottom - extended.top + 1) * (extended.right - extended.left + 1) <= 100000 ? getCoreCellRange(extended, rowIds, columnIds) : null;\n}\n\nexport function planCoreSelectionCopy({ cells, selectedRowIds, rowIds: order, columnIds, target }: {\n cells: readonly CominsCellAddress[]; selectedRowIds: readonly CominsRowId[]; rowIds: readonly CominsRowId[]; columnIds: readonly string[]; target: \"auto\" | \"cells\" | \"rows\";\n}) {\n const kind = target === \"auto\" ? (cells.length > 1 ? \"cells\" : selectedRowIds.length ? \"rows\" : \"cells\") : target;\n const selectedRows = new Set(selectedRowIds);\n const rowPositions = new Map(order.map((id, index) => [id, index]));\n const columnPositions = new Map(columnIds.map((id, index) => [id, index]));\n let rowIds: readonly CominsRowId[], columns = columnIds;\n const selected = new Map<CominsRowId, Set<string>>();\n if (kind === \"rows\") rowIds = order.filter(id => selectedRows.has(id));\n else {\n const positions = cells.filter(cell => rowPositions.has(cell.rowId)).map(cell => ({ row: rowPositions.get(cell.rowId)!, column: columnPositions.get(cell.columnId)! }));\n if (!positions.length) return null;\n let firstRow = Infinity, lastRow = -1, firstColumn = Infinity, lastColumn = -1;\n for (const position of positions) {\n firstRow = Math.min(firstRow, position.row); lastRow = Math.max(lastRow, position.row);\n firstColumn = Math.min(firstColumn, position.column); lastColumn = Math.max(lastColumn, position.column);\n }\n rowIds = order.slice(firstRow, lastRow + 1); columns = columnIds.slice(firstColumn, lastColumn + 1);\n for (const cell of cells) {\n if (!selected.has(cell.rowId)) selected.set(cell.rowId, new Set());\n selected.get(cell.rowId)!.add(cell.columnId);\n }\n }\n return !rowIds.length || !columns.length ? null : { target: kind, rowIds, columnIds: columns, selected };\n}\n\nconst pathKey = (path: readonly number[]) => path.join(\".\");\nexport function resolveCoreTreeDropContext<TEntry extends { rowId: CominsRowId; path: readonly number[] }>({ entries, sourceId, targetId, position }: {\n entries: readonly TEntry[]; sourceId: CominsRowId; targetId: CominsRowId; position: CominsTreeDropPosition;\n}) {\n const source = entries.find(entry => entry.rowId === sourceId), target = entries.find(entry => entry.rowId === targetId);\n if (!source || !target) return null;\n const parentPath = target.path.slice(0, -1);\n const parent = entries.find(entry => pathKey(entry.path) === pathKey(parentPath));\n const nextSibling = entries.find(entry => pathKey(entry.path.slice(0, -1)) === pathKey(parentPath) && entry.path[entry.path.length - 1] === target.path[target.path.length - 1]! + 1);\n return { source, target, position, destination: position === \"inside\"\n ? { parentId: target.rowId, beforeRowId: null }\n : { parentId: parent?.rowId ?? null, beforeRowId: position === \"before\" ? target.rowId : nextSibling?.rowId ?? null } };\n}\nexport function resolveCoreTreePointerPosition(fraction: number, allowReparent: boolean | undefined): CominsTreeDropPosition {\n return fraction < .25 ? \"before\" : fraction > .75 ? \"after\" : allowReparent ? \"inside\" : fraction < .5 ? \"before\" : \"after\";\n}\n","import { getCominsDragAutoScrollTop, getCominsDragAutoScrollVelocity } from \"../core/selection/navigation\";\n\nexport function captureCominsPointer(element: Pick<Element, \"setPointerCapture\" | \"releasePointerCapture\">, pointerId: number) {\n try { element.setPointerCapture(pointerId); } catch { /* Synthetic pointer or detached control. */ }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n try { element.releasePointerCapture(pointerId); } catch { /* Already released or detached. */ }\n };\n}\nexport function registerCominsPointerListeners(input: {\n move: (event: PointerEvent) => void; up: (event: PointerEvent) => void; cancel: (event: PointerEvent) => void;\n blur: () => void; key: (event: KeyboardEvent) => void; keyCapture?: boolean;\n}) {\n const { move, up, cancel, blur, key, keyCapture = false } = input;\n window.addEventListener(\"pointermove\", move); window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", cancel); window.addEventListener(\"blur\", blur); window.addEventListener(\"keydown\", key, keyCapture);\n return () => {\n window.removeEventListener(\"pointermove\", move); window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", cancel); window.removeEventListener(\"blur\", blur); window.removeEventListener(\"keydown\", key, keyCapture);\n };\n}\nexport function startCominsPointerFrames(onFrame: FrameRequestCallback, host: Pick<Window, \"requestAnimationFrame\" | \"cancelAnimationFrame\"> = window) {\n let stopped = false;\n const tick: FrameRequestCallback = time => {\n if (stopped) return;\n onFrame(time);\n if (!stopped) frame = host.requestAnimationFrame(tick);\n };\n let frame = host.requestAnimationFrame(tick);\n return () => { if (!stopped) { stopped = true; host.cancelAnimationFrame(frame); } };\n}\nexport function focusCominsPointerTarget(element: HTMLElement | null) {\n element?.focus({ preventScroll: true });\n}\nexport function applyCominsDragScroll(viewport: HTMLElement, input: { top: number; bottom: number; clientY: number; deltaMs: number; onlyIfChanged?: boolean; enabled?: boolean }) {\n const next = getCominsDragAutoScrollTop({ scrollTop: viewport.scrollTop, scrollHeight: viewport.scrollHeight, clientHeight: viewport.clientHeight, velocity: input.enabled === false ? 0 : getCominsDragAutoScrollVelocity(input), deltaMs: input.deltaMs });\n if (!input.onlyIfChanged || next !== viewport.scrollTop) viewport.scrollTop = next;\n}\nexport function isCominsNativeEditor(target: EventTarget | null) {\n return target instanceof Element && Boolean(target.closest('input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), textarea, select, [contenteditable]:not([contenteditable=\"false\"])'));\n}\n\nexport const createCrossTableAutoScroll = (\n resolveTarget: (clientX: number, clientY: number) => void,\n ) => {\n let animationFrame: number | null = null;\n let clientX = 0;\n let clientY = 0;\n let lastTimestamp: number | null = null;\n let viewport: HTMLElement | null = null;\n\n const stop = () => {\n if (animationFrame !== null) {\n window.cancelAnimationFrame(animationFrame);\n }\n\n animationFrame = null;\n lastTimestamp = null;\n viewport = null;\n };\n const runFrame = (timestamp: number) => {\n animationFrame = null;\n const currentViewport = viewport;\n\n if (!currentViewport?.isConnected) {\n stop();\n return;\n }\n\n if (lastTimestamp === null) {\n lastTimestamp = timestamp;\n animationFrame = window.requestAnimationFrame(runFrame);\n return;\n }\n\n const bounds = currentViewport.getBoundingClientRect();\n const velocity = getCominsDragAutoScrollVelocity({ bottom: Math.min(window.innerHeight, bounds.bottom), clientY, top: Math.max(0, bounds.top) });\n const nextScrollTop = getCominsDragAutoScrollTop({\n clientHeight: currentViewport.clientHeight,\n deltaMs: timestamp - lastTimestamp,\n scrollHeight: currentViewport.scrollHeight,\n scrollTop: currentViewport.scrollTop,\n velocity,\n });\n const moved = Math.abs(nextScrollTop - currentViewport.scrollTop) > 0.01;\n\n lastTimestamp = timestamp;\n\n if (!moved) {\n stop();\n return;\n }\n\n currentViewport.scrollTop = nextScrollTop;\n resolveTarget(clientX, clientY);\n };\n const update = (\n nextViewport: HTMLElement | null,\n nextClientX: number,\n nextClientY: number,\n valid: boolean,\n ) => {\n if (!valid || !nextViewport?.isConnected) {\n stop();\n return;\n }\n\n const bounds = nextViewport.getBoundingClientRect();\n const velocity = getCominsDragAutoScrollVelocity({\n bottom: Math.min(window.innerHeight, bounds.bottom),\n clientY: nextClientY,\n top: Math.max(0, bounds.top),\n });\n const maxScrollTop = Math.max(0, nextViewport.scrollHeight - nextViewport.clientHeight);\n const canScroll = velocity < 0\n ? nextViewport.scrollTop > 0\n : velocity > 0 && nextViewport.scrollTop < maxScrollTop;\n\n if (!canScroll) {\n stop();\n return;\n }\n\n if (viewport !== nextViewport) {\n lastTimestamp = null;\n }\n\n viewport = nextViewport;\n clientX = nextClientX;\n clientY = nextClientY;\n\n if (animationFrame === null) {\n animationFrame = window.requestAnimationFrame(runFrame);\n }\n };\n\n return { stop, update };\n };\n","export type CominsElementMeasurement = {\n element: Element;\n height: number;\n rectHeight: number;\n width: number;\n};\n\nexport function measureCominsElement(element: Element, entry?: ResizeObserverEntry): CominsElementMeasurement {\n const rect = element.getBoundingClientRect();\n const borderBox = Array.isArray(entry?.borderBoxSize) ? entry.borderBoxSize[0] : entry?.borderBoxSize;\n return { element, height: borderBox?.blockSize ?? rect.height, rectHeight: rect.height, width: Math.round(rect.width) };\n}\n\n/** Owns DOM targets only; adapters map measurements to rows and flush a batch once. */\nexport function createMeasurementObserver(options: {\n onMeasure: (measurement: CominsElementMeasurement) => void;\n onBatchComplete?: () => void;\n}) {\n const targets = new Set<Element>();\n let observer: ResizeObserver | null = null;\n let generation = 0;\n let disposed = false;\n const deliver = (measurement: CominsElementMeasurement) => {\n if ((Number.isFinite(measurement.height) && measurement.height > 0) || (Number.isFinite(measurement.rectHeight) && measurement.rectHeight > 0)) options.onMeasure(measurement);\n };\n const disconnect = () => { generation++; observer?.disconnect(); observer = null; };\n return {\n observe(element: Element) {\n if (disposed || targets.has(element)) return;\n targets.add(element);\n if (typeof ResizeObserver === \"undefined\") {\n deliver(measureCominsElement(element));\n options.onBatchComplete?.();\n return;\n }\n if (!observer) {\n const activeGeneration = ++generation;\n observer = new ResizeObserver(entries => {\n if (disposed || generation !== activeGeneration) return;\n for (const entry of entries) {\n if (targets.has(entry.target)) deliver(measureCominsElement(entry.target, entry));\n }\n options.onBatchComplete?.();\n });\n }\n observer.observe(element);\n },\n unobserve(element: Element) {\n if (!targets.delete(element)) return;\n observer?.unobserve(element);\n if (!targets.size) disconnect();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n disconnect();\n targets.clear();\n },\n };\n}\n\nexport function hasCominsResizeObserver() { return typeof ResizeObserver !== \"undefined\"; }\n\nexport function observeCominsViewport(element: HTMLElement, onMeasure: (value: {\n height: number; width: number; scrollWidth: number; outerWidth: number; viewportWidth: number;\n}) => void) {\n if (!hasCominsResizeObserver()) return () => {};\n let active = true;\n const observer = new ResizeObserver(([entry]) => {\n // 제거된 target 또는 해제 후 지연 도착한 관측으로 React 업데이트를 등록하지 않는다.\n if (!active || !element.isConnected) return;\n if (entry) onMeasure({ height: entry.contentRect.height, width: entry.contentRect.width, scrollWidth: element.scrollWidth, outerWidth: element.offsetWidth, viewportWidth: element.clientWidth });\n });\n observer.observe(element);\n return () => { active = false; observer.disconnect(); };\n}\n\nexport function observeCominsFontChanges(onChange: () => void) {\n const fonts = document.fonts;\n fonts?.addEventListener(\"loadingdone\", onChange);\n return () => fonts?.removeEventListener(\"loadingdone\", onChange);\n}\n\nexport function getCominsElementRect(element: Element): DOMRect;\nexport function getCominsElementRect(element: Element | null | undefined): DOMRect | undefined;\nexport function getCominsElementRect(element: Element | null | undefined) { return element?.getBoundingClientRect(); }\n","export function setCominsScrollTop(element: HTMLElement, top: number) {\n element.scrollTop = top;\n}\n\nexport function setCominsScrollLeft(element: HTMLElement, left: number) {\n element.scrollLeft = left;\n}\n\nexport function scrollCominsRowIntoView(viewport: HTMLElement, index: number) {\n viewport.querySelector<HTMLElement>(`[data-comins-row-data-index=\"${index}\"]`)?.scrollIntoView?.({ block: \"nearest\" });\n}\n\nexport function focusCominsElement(element: HTMLElement | null | undefined, options?: FocusOptions) {\n element?.focus(options);\n}\n\nexport function createCominsDetailFocusRestorer() {\n const frames = new Set<number>();\n return {\n restore(element: HTMLElement | null, getToggle: () => HTMLButtonElement | null) {\n if (!element?.contains(document.activeElement)) return;\n const restoreFocus = () => {\n const toggle = getToggle();\n if (toggle?.isConnected) toggle.focus();\n };\n restoreFocus();\n // Retry after the disclosure update, but only while the owning Table lives.\n const frame = window.requestAnimationFrame(() => { frames.delete(frame); restoreFocus(); });\n frames.add(frame);\n },\n dispose() {\n for (const frame of frames) window.cancelAnimationFrame(frame);\n frames.clear();\n },\n };\n}\n","export async function writeCominsClipboardText(text: string) {\n if (!navigator.clipboard?.writeText) throw new Error(\"Clipboard writing is unavailable.\");\n await navigator.clipboard.writeText(text);\n}\n\nexport function readCominsClipboardEvent(data: Pick<DataTransfer, \"types\" | \"getData\">) {\n return data.types.includes(\"text/plain\") ? data.getData(\"text/plain\") : null;\n}\n\nexport function writeCominsClipboardEvent(data: Pick<DataTransfer, \"setData\">, text: string) {\n data.setData(\"text/plain\", text);\n}\n","/** The registry only observes identity and DOM fields; adapter metadata stays opaque. */\nexport type BrowserTransferSnapshot = {\n config: { coordinator: object; scope: string; tableId: string };\n endpoint: { tableId: string };\n instanceId: string;\n root: HTMLElement | null;\n viewport: HTMLElement | null;\n};\ntype Registration<TSnapshot> = { getSnapshot: () => TSnapshot | null };\n\nexport function createTableTransferRegistry<TSnapshot extends BrowserTransferSnapshot>() {\n const scopes = new Map<string, Map<string, Set<Registration<TSnapshot>>>>();\n return {\n register(scope: string, tableId: string, registration: Registration<TSnapshot>) {\n let tables = scopes.get(scope);\n if (!tables) { tables = new Map(); scopes.set(scope, tables); }\n let registrations = tables.get(tableId);\n if (!registrations) { registrations = new Set(); tables.set(tableId, registrations); }\n registrations.add(registration);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n registrations.delete(registration);\n if (registrations.size === 0) tables.delete(tableId);\n if (tables.size === 0) scopes.delete(scope);\n };\n },\n get(scope: string, tableId: string) {\n const registrations = scopes.get(scope)?.get(tableId);\n return registrations?.size === 1 ? [...registrations][0] ?? null : null;\n },\n };\n}\n\nexport function getRegisteredTransferSnapshot<TSnapshot extends BrowserTransferSnapshot>(\n registry: ReturnType<typeof createTableTransferRegistry<TSnapshot>>,\n coordinator: object, scope: string, tableId: string,\n) {\n const snapshot = registry.get(scope, tableId)?.getSnapshot() ?? null;\n if (!snapshot || snapshot.config.coordinator !== coordinator || snapshot.config.scope !== scope || snapshot.config.tableId !== tableId || snapshot.endpoint.tableId !== tableId) return null;\n return snapshot;\n}\n\nexport function getCrossTableTransferHit<TSnapshot extends BrowserTransferSnapshot>(input: {\n sourceTableId: string;\n scope: string;\n instanceId: string;\n root: HTMLElement | null;\n clientX: number;\n clientY: number;\n document: Pick<Document, \"elementFromPoint\">;\n getSnapshot: (tableId: string) => TSnapshot | null;\n}) {\n const sourceSnapshot = input.getSnapshot(input.sourceTableId);\n const element = input.document.elementFromPoint(input.clientX, input.clientY) as HTMLElement | null;\n const root = element?.closest<HTMLElement>(\"[data-comins-table-instance-id]\") ?? null;\n const tableId = root?.dataset.cominsTransferTableId;\n if (!sourceSnapshot || sourceSnapshot.instanceId !== input.instanceId || sourceSnapshot.root !== input.root || !element || !root || !tableId || tableId === input.sourceTableId || root.dataset.cominsTransferScope !== input.scope) return null;\n const snapshot = input.getSnapshot(tableId);\n if (!snapshot || snapshot.root !== root || snapshot.instanceId !== root.dataset.cominsTableInstanceId || !snapshot.viewport || !root.contains(snapshot.viewport)) return null;\n return { element, root, snapshot };\n}\n","import { setNestedFieldValue } from \"./core/editing/cells\";\n\nexport function setCominsNestedInputValue<TData>(row: TData, field: string, value: string): TData {\n return setNestedFieldValue(row, field, value);\n}\n","import type { CominsRowId, CominsSelectionState, CominsSortModel, CominsSortState } from \"./model\";\n\ntype CominsSelectionSnapshot = {\n rowIds: readonly CominsRowId[];\n columns: readonly { id: string }[];\n selection: CominsSelectionState;\n};\n\nexport function getNextSort(current: CominsSortState | null, columnId: string): CominsSortState | null {\n if (current?.columnId !== columnId) {\n return { columnId, direction: \"asc\" };\n }\n\n if (current.direction === \"asc\") {\n return { columnId, direction: \"desc\" };\n }\n\n return null;\n}\nexport function getNextSortModel(current: CominsSortModel, columnId: string, additive: boolean): CominsSortState[] {\n const currentIndex = current.findIndex((rule) => rule.columnId === columnId);\n const currentRule = currentIndex < 0 ? null : current[currentIndex] ?? null;\n const nextRule = getNextSort(currentRule, columnId);\n\n if (!additive) {\n return nextRule ? [nextRule] : [];\n }\n\n if (!nextRule) {\n return current.filter((rule) => rule.columnId !== columnId);\n }\n\n if (currentIndex < 0) {\n return [...current, nextRule];\n }\n\n return current.map((rule, index) => (index === currentIndex ? nextRule : rule));\n}\n\nexport function getSortRule(current: CominsSortModel, columnId: string) {\n const index = current.findIndex((rule) => rule.columnId === columnId);\n\n return index < 0 ? null : { priority: index + 1, rule: current[index]! };\n}\n\nexport function getSortIndicatorState(current: CominsSortModel, columnId: string) {\n const currentRule = getSortRule(current, columnId)?.rule;\n\n if (!currentRule) {\n return \"none\";\n }\n\n return currentRule.direction;\n}\n\nexport function getAriaSortState(current: CominsSortModel, columnId: string) {\n const currentRule = getSortRule(current, columnId);\n\n if (!currentRule) {\n return current.length > 1 ? undefined : \"none\";\n }\n\n if (currentRule.priority > 1) {\n return undefined;\n }\n\n return currentRule.rule.direction === \"asc\" ? \"ascending\" : \"descending\";\n}\n\nexport function areSortStatesEqual(left: CominsSortState | null, right: CominsSortState | null) {\n if (!left || !right) {\n return left === right;\n }\n\n return left.columnId === right.columnId && left.direction === right.direction;\n}\n\nexport function areSortModelsEqual(left: CominsSortModel, right: CominsSortModel) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every(\n (rule, index) => rule.columnId === right[index]?.columnId && rule.direction === right[index]?.direction,\n );\n}\n\nexport function areRowIdSequencesEqual(left: readonly CominsRowId[], right: readonly CominsRowId[]) {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nexport function insertDeclaredColumnsIntoOrder(\n order: readonly string[],\n declaredOrder: readonly string[],\n) {\n const next = [...order];\n\n for (let declaredIndex = 0; declaredIndex < declaredOrder.length; declaredIndex += 1) {\n const columnId = declaredOrder[declaredIndex];\n\n if (columnId === undefined || next.includes(columnId)) {\n continue;\n }\n\n const followingColumnId = declaredOrder\n .slice(declaredIndex + 1)\n .find((candidate) => next.includes(candidate));\n\n if (followingColumnId !== undefined) {\n next.splice(next.indexOf(followingColumnId), 0, columnId);\n continue;\n }\n\n const precedingColumnId = [...declaredOrder.slice(0, declaredIndex)]\n .reverse()\n .find((candidate) => next.includes(candidate));\n\n if (precedingColumnId === undefined) {\n next.push(columnId);\n } else {\n next.splice(next.lastIndexOf(precedingColumnId) + 1, 0, columnId);\n }\n }\n\n return next;\n}\n\nexport function reconcileColumnOrderHistory(\n history: readonly string[],\n currentOrder: readonly string[],\n declaredOrder: readonly string[],\n) {\n const merged = insertDeclaredColumnsIntoOrder(history, declaredOrder);\n const currentIds = new Set(currentOrder);\n let currentIndex = 0;\n\n return merged.map((columnId) => {\n if (!currentIds.has(columnId)) {\n return columnId;\n }\n\n const currentColumnId = currentOrder[currentIndex];\n currentIndex += 1;\n return currentColumnId ?? columnId;\n });\n}\n\nexport function canPreserveSelection(\n current: CominsSelectionSnapshot,\n next: Pick<CominsSelectionSnapshot, \"rowIds\" | \"columns\">,\n) {\n if (!areRowIdSequencesEqual(current.rowIds, next.rowIds)) {\n return false;\n }\n\n const nextColumnIds = new Set(next.columns.map((column) => column.id));\n const selectedCell = current.selection.cell;\n const selectedCells = current.selection.cells ?? [];\n const selectedRange = current.selection.range;\n\n if (selectedCell && !nextColumnIds.has(selectedCell.columnId)) {\n return false;\n }\n\n if (selectedCells.some((cell) => !nextColumnIds.has(cell.columnId))) {\n return false;\n }\n\n if (\n selectedRange &&\n (!nextColumnIds.has(selectedRange.anchor.columnId) || !nextColumnIds.has(selectedRange.focus.columnId))\n ) {\n return false;\n }\n\n return true;\n}\n","import type { CominsRowId, CominsSelectionState, CominsTableState, CominsTableStateInput } from \"../model\";\nimport { serializeCominsColumnLayout } from \"../layout/columns\";\nimport { canPreserveSelection, insertDeclaredColumnsIntoOrder, reconcileColumnOrderHistory } from \"../../table-state\";\nimport { createCominsTableState } from \"./table\";\n\nexport type CoreReconciliationInput<TData> = Pick<CominsTableStateInput<TData>,\n \"columnGroups\" | \"columns\" | \"rows\" | \"getRowId\" | \"pagination\" | \"showHeader\">;\n\nexport type CoreReconciliationOptions<TData> = {\n current: CominsTableState<TData>;\n nextInput: CoreReconciliationInput<TData>;\n columnOrderHistory: readonly string[];\n dataChanged: boolean;\n getRowIdChanged: boolean;\n viewportIndices?: readonly number[];\n};\n\n/** Reconcile inputs without applying state, clearing caches, or notifying consumers. */\nexport function reconcileCoreState<TData>({ current, nextInput, columnOrderHistory, dataChanged, getRowIdChanged, viewportIndices }: CoreReconciliationOptions<TData>): {\n state: CominsTableState<TData>;\n columnOrderHistory: string[];\n invalidatedDetailRowIds: CominsRowId[];\n} {\n const declaredColumnOrder = nextInput.columns.map(column => String(column.id ?? column.field));\n const historicalOrder = reconcileColumnOrderHistory(columnOrderHistory, current.columnOrder, current.columns.map(column => column.id));\n const nextState = createCominsTableState({\n ...nextInput,\n columnLayout: {\n ...serializeCominsColumnLayout(current),\n order: insertDeclaredColumnsIntoOrder(historicalOrder, declaredColumnOrder),\n },\n // Only the adapter knows whether the original external data reference changed.\n rows: dataChanged ? nextInput.rows : current.rows,\n sortModel: current.sortModel,\n });\n const state = viewportIndices\n ? { ...nextState, selection: reconcileCoreViewportSelection(current.selection, nextState.rowIds, viewportIndices, nextState.columns.map(column => column.id)) }\n : (\n // 빈 선택은 행·컬럼 탐색 없이 그대로 유지한다.\n current.selection.rowIds.length === 0 && current.selection.cell === null &&\n current.selection.range === null && !current.selection.cells?.length\n ) || canPreserveSelection(current, nextState)\n ? { ...nextState, selection: current.selection }\n : nextState;\n const invalidatedDetailRowIds: CominsRowId[] = [];\n if (getRowIdChanged) {\n const previousRowById = new Map(current.rowIds.map((rowId, index) => [rowId, current.rows[index]]));\n state.rowIds.forEach((rowId, index) => {\n if (previousRowById.has(rowId) && previousRowById.get(rowId) !== state.rows[index]) invalidatedDetailRowIds.push(rowId);\n });\n }\n return {\n state,\n columnOrderHistory: reconcileColumnOrderHistory(historicalOrder, state.columnOrder, declaredColumnOrder),\n invalidatedDetailRowIds,\n };\n}\n\n// Kept separate from the Browser-owned request model (which requires AbortSignal).\nexport function reconcileCoreViewportSelection(selection: CominsSelectionState, rowIds: readonly CominsRowId[], indices: readonly number[], columnIds: readonly string[]): CominsSelectionState {\n const positions = new Map(rowIds.map((id, index) => [id, index]));\n const columns = new Set(columnIds);\n const valid = (address: { rowId: CominsRowId; columnId: string }) => positions.has(address.rowId) && columns.has(address.columnId);\n const cell = selection.cell && valid(selection.cell) ? selection.cell : null;\n let range = selection.range;\n if (range) {\n if (!valid(range.anchor) || !valid(range.focus)) range = null;\n else {\n const a = positions.get(range.anchor.rowId)!, b = positions.get(range.focus.rowId)!;\n for (let index = Math.min(a, b); index < Math.max(a, b); index++) if (indices[index + 1] !== indices[index]! + 1) { range = null; break; }\n }\n }\n const cells = selection.cells?.filter(valid);\n if (cell === selection.cell && range === selection.range && cells?.length === selection.cells?.length) return selection;\n return { ...selection, cell, range, ...(cells ? { cells } : {}) };\n}\n","import type { CominsTableState } from \"../model\";\nimport { areSortModelsEqual, areSortStatesEqual } from \"../../table-state\";\n\ntype ChangeSnapshot<TData> = Pick<CominsTableState<TData>, \"rows\" | \"selection\" | \"sort\" | \"sortModel\">;\n\n/** Read only the shared data fields, preserving adapter reference identities. */\nexport function getCoreStateChanges<TData>(current: ChangeSnapshot<TData>, next: ChangeSnapshot<TData>, options: { columnLayoutChanged?: boolean } = {}) {\n return {\n data: next.rows !== current.rows,\n selection: next.selection !== current.selection,\n columnLayout: options.columnLayoutChanged === true,\n sort: !areSortStatesEqual(next.sort, current.sort),\n sortModel: !areSortModelsEqual(next.sortModel, current.sortModel),\n };\n}\n","import type { CominsColumnLayout, CominsSelectionState, CominsSortModel, CominsSortState } from \"../model\";\nimport type { CominsTableState, CominsTableStateInput } from \"../react-types\";\nimport { normalizeColumns, normalizeColumnGroups } from \"../core/layout/columns\";\nimport { reconcileCoreState, type CoreReconciliationOptions } from \"../core/state/reconcile\";\nimport { getCoreStateChanges } from \"../core/state/changes\";\nimport { projectReactColumn, projectReactGroup, projectReactState } from \"./model\";\nimport { serializeCominsColumnLayout } from \"./core-compat\";\n\ntype ReactReconciliationOptions<TData> = Omit<CoreReconciliationOptions<TData>, \"current\" | \"nextInput\"> & {\n current: CominsTableState<TData>;\n nextInput: Pick<CominsTableStateInput<TData>, \"columnGroups\" | \"columns\" | \"rows\" | \"getRowId\" | \"pagination\" | \"showHeader\">;\n};\n\nexport function reconcileReactState<TData>(options: ReactReconciliationOptions<TData>) {\n const columns = normalizeColumns(options.nextInput.columns);\n const columnGroups = normalizeColumnGroups(columns, options.nextInput.columnGroups);\n const result = reconcileCoreState({\n ...options,\n current: projectReactState(options.current).core,\n nextInput: { ...options.nextInput, columns: columns.map(projectReactColumn), columnGroups: columnGroups.map(projectReactGroup) },\n });\n // New definitions do not belong to the old bridge. Restore their React metadata directly.\n return { ...result, state: { ...result.state, columns, columnGroups, theme: options.current.theme } };\n}\n\ntype ChangeCallbacks<TData> = {\n onChangeData?: (data: TData[]) => void;\n onChangeSelection?: (selection: CominsSelectionState) => void;\n onChangeColumnLayout?: (layout: CominsColumnLayout) => void;\n onChangeSort?: (sort: CominsSortState | null) => void;\n onChangeSortModel?: (sortModel: CominsSortModel) => void;\n};\n\nexport function notifyReactStateChanges<TData>(current: CominsTableState<TData>, next: CominsTableState<TData>, callbacks: ChangeCallbacks<TData>, options: { columnLayoutChanged?: boolean } = {}) {\n const changes = getCoreStateChanges(current, next, options);\n if (changes.data) callbacks.onChangeData?.(next.rows);\n if (changes.selection) callbacks.onChangeSelection?.(next.selection);\n if (changes.columnLayout) callbacks.onChangeColumnLayout?.(serializeCominsColumnLayout(next));\n if (changes.sort) callbacks.onChangeSort?.(next.sort);\n if (changes.sortModel) callbacks.onChangeSortModel?.(next.sortModel);\n}\n\n/** Prop synchronization deliberately does not notify data or column layout. */\nexport function notifyReactInputChanges<TData>(current: CominsTableState<TData>, next: CominsTableState<TData>, callbacks: ChangeCallbacks<TData>) {\n // 입력 변경을 구독하지 않으면 선택·정렬 비교도 수행하지 않는다.\n if (!callbacks.onChangeSelection && !callbacks.onChangeSort && !callbacks.onChangeSortModel) return;\n const changes = getCoreStateChanges(current, next);\n if (changes.selection) callbacks.onChangeSelection?.(next.selection);\n if (changes.sort) callbacks.onChangeSort?.(next.sort);\n if (changes.sortModel) callbacks.onChangeSortModel?.(next.sortModel);\n}\n","import { useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype ActiveCell = { key: string; anchor: HTMLElement; ready: boolean };\n\nexport function hasCellTooltipContent(content: ReactNode): boolean {\n return content !== undefined && content !== null && typeof content !== \"boolean\" && content !== \"\";\n}\n\n/** Table-local controller; owns no cell data or framework-neutral state. */\nexport function useCominsCellTooltip() {\n const [active, setActive] = useState<ActiveCell | null>(null);\n const activeRef = useRef<ActiveCell | null>(null);\n const hovered = useRef(false);\n const focused = useRef(false);\n const dismissed = useRef<string | null>(null);\n const leaveTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const focusTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const id = useId();\n\n const clearLeave = () => { if (leaveTimer.current !== undefined) clearTimeout(leaveTimer.current); leaveTimer.current = undefined; };\n const clearFocus = () => { if (focusTimer.current !== undefined) clearTimeout(focusTimer.current); focusTimer.current = undefined; };\n const close = (dismiss = false) => {\n clearLeave(); clearFocus(); hovered.current = false; focused.current = false;\n dismissed.current = dismiss ? activeRef.current?.key ?? null : null;\n activeRef.current = null; setActive(null);\n };\n const settleFocus = () => {\n clearFocus();\n // Let browser focus scrolling settle before showing keyboard information.\n focusTimer.current = setTimeout(() => {\n focusTimer.current = undefined;\n const current = activeRef.current;\n if (!current || !focused.current || !current.anchor.isConnected || !current.anchor.contains(current.anchor.ownerDocument.activeElement)) {\n close(); return;\n }\n activeRef.current = { ...current, ready: true }; setActive(activeRef.current);\n }, 50);\n };\n const enter = (key: string, anchor: HTMLElement, kind: \"hover\" | \"focus\") => {\n clearLeave();\n if (dismissed.current === key) return;\n if (activeRef.current?.key !== key || activeRef.current?.anchor !== anchor) {\n hovered.current = false; focused.current = false;\n clearFocus();\n activeRef.current = { key, anchor, ready: kind === \"hover\" }; setActive(activeRef.current);\n }\n if (kind === \"hover\") {\n hovered.current = true;\n if (activeRef.current && !activeRef.current.ready) {\n activeRef.current = { ...activeRef.current, ready: true }; setActive(activeRef.current);\n }\n } else {\n focused.current = true;\n if (!activeRef.current?.ready) settleFocus();\n }\n };\n const leave = (key: string, kind: \"hover\" | \"focus\") => {\n if (dismissed.current === key) dismissed.current = null;\n if (activeRef.current?.key !== key) return;\n if (kind === \"hover\") hovered.current = false; else { focused.current = false; clearFocus(); }\n clearLeave();\n if (!hovered.current && !focused.current) leaveTimer.current = setTimeout(() => {\n activeRef.current = null; setActive(null); leaveTimer.current = undefined;\n }, 80);\n };\n\n useLayoutEffect(() => {\n if (active && (!active.anchor.isConnected || active.anchor.dataset.cominsTooltipKey !== active.key)) close();\n });\n useEffect(() => {\n if (!active) return;\n const doc = active.anchor.ownerDocument;\n const onKeyDown = (event: KeyboardEvent) => { if (event.key === \"Escape\") close(true); };\n const onScroll = () => {\n if (activeRef.current && !activeRef.current.ready && focused.current) settleFocus();\n else close();\n };\n const onResize = () => close();\n doc.addEventListener(\"keydown\", onKeyDown, true);\n doc.addEventListener(\"scroll\", onScroll, true);\n doc.defaultView?.addEventListener(\"resize\", onResize);\n return () => {\n doc.removeEventListener(\"keydown\", onKeyDown, true);\n doc.removeEventListener(\"scroll\", onScroll, true);\n doc.defaultView?.removeEventListener(\"resize\", onResize);\n };\n }, [active]);\n useEffect(() => () => { clearLeave(); clearFocus(); }, []);\n return { active, id: `comins-cell-tooltip-${id}`, enter, leave };\n}\n\nexport function CominsCellTooltip({ controller, content }: { controller: ReturnType<typeof useCominsCellTooltip>; content: ReactNode }) {\n const surface = useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const active = controller.active;\n const visible = Boolean(active?.ready && hasCellTooltipContent(content));\n\n useLayoutEffect(() => {\n if (!visible || !active || !surface.current) return;\n const win = active.anchor.ownerDocument.defaultView;\n if (!win) return;\n const element = surface.current;\n const updatePosition = () => {\n const theme = win.getComputedStyle(active.anchor);\n for (const token of [\"--comins-table-surface\", \"--comins-table-foreground\", \"--comins-table-border\"]) {\n const value = theme.getPropertyValue(token);\n if (value) element.style.setProperty(token, value);\n else element.style.removeProperty(token);\n }\n element.style.fontFamily = theme.fontFamily;\n const anchor = active.anchor.getBoundingClientRect();\n const bounds = element.getBoundingClientRect();\n const margin = 8;\n const left = Math.max(margin, Math.min(anchor.left, win.innerWidth - bounds.width - margin));\n const below = anchor.bottom + 6;\n const top = below + bounds.height <= win.innerHeight - margin ? below : Math.max(margin, anchor.top - bounds.height - 6);\n setPosition(previous => previous.left === left && previous.top === top ? previous : { left, top });\n };\n updatePosition();\n const observer = typeof win.ResizeObserver === \"function\" ? new win.ResizeObserver(updatePosition) : undefined;\n observer?.observe(element); observer?.observe(active.anchor);\n return () => observer?.disconnect();\n }, [active, content, visible]);\n useLayoutEffect(() => {\n if (!visible || !active) return;\n const anchor = active.anchor;\n const ids = new Set((anchor.getAttribute(\"aria-describedby\") ?? \"\").split(/\\s+/).filter(Boolean));\n ids.add(controller.id); anchor.setAttribute(\"aria-describedby\", [...ids].join(\" \"));\n return () => {\n const current = (anchor.getAttribute(\"aria-describedby\") ?? \"\").split(/\\s+/).filter(id => id && id !== controller.id);\n if (current.length) anchor.setAttribute(\"aria-describedby\", current.join(\" \"));\n else anchor.removeAttribute(\"aria-describedby\");\n };\n }, [active, controller.id, visible]);\n\n if (!visible || !active) return null;\n return createPortal(<div ref={surface} role=\"tooltip\" id={controller.id} className=\"comins-cell-tooltip\"\n style={{ left: position.left, top: position.top }}\n onPointerEnter={() => controller.enter(active.key, active.anchor, \"hover\")}\n onPointerLeave={() => controller.leave(active.key, \"hover\")}>\n {content}\n </div>, active.anchor.ownerDocument.body);\n}\n","import type { CominsRowId } from \"./model\";\n\nexport type CominsTreeNode<TItem> = {\n children?: readonly CominsTreeNode<TItem>[];\n expand?: boolean;\n item: TItem;\n};\n\nexport type CominsTreeExpansionOptions = {\n defaultExpandAll?: boolean;\n};\n\nexport type CominsTreeMoveDestination = {\n parentId: CominsRowId | null;\n beforeRowId: CominsRowId | null;\n};\n\nexport type CominsTreeDropPosition = \"before\" | \"after\" | \"inside\";\n\nexport type CominsTreeDropContext<TItem> = {\n source: CominsVisibleTreeRow<TItem>;\n target: CominsVisibleTreeRow<TItem>;\n destination: CominsTreeMoveDestination;\n position: CominsTreeDropPosition;\n};\n\nexport type CominsTreeRowDragConfig<TItem> = {\n allowReparent?: boolean;\n canDrop?: (context: CominsTreeDropContext<TItem>) => boolean;\n};\n\nexport type CominsVisibleTreeRow<TItem> = {\n depth: number;\n expanded: boolean;\n hasChildren: boolean;\n item: TItem;\n path: readonly number[];\n rowId: CominsRowId;\n};\n\ntype CominsTreeNodeIndex<TItem> = {\n byId: Map<CominsRowId, readonly number[]>;\n idByPath: Map<string, CominsRowId>;\n};\n\nfunction getPathKey(path: readonly number[]) {\n return path.join(\".\");\n}\n\nfunction createCominsTreeNodeIndex<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n getRowId: (item: TItem, index: number) => CominsRowId,\n): CominsTreeNodeIndex<TItem> {\n const byId = new Map<CominsRowId, readonly number[]>();\n const idByPath = new Map<string, CominsRowId>();\n let itemIndex = 0;\n\n const visit = (currentNodes: readonly CominsTreeNode<TItem>[], parentPath: readonly number[]) => {\n currentNodes.forEach((node, childIndex) => {\n const path = [...parentPath, childIndex];\n const rowId = getRowId(node.item, itemIndex);\n itemIndex += 1;\n\n if (byId.has(rowId)) {\n throw new Error(`Duplicate tree row id: ${String(rowId)}`);\n }\n\n byId.set(rowId, path);\n idByPath.set(getPathKey(path), rowId);\n\n if (node.children?.length) {\n visit(node.children, path);\n }\n });\n };\n\n visit(nodes, []);\n\n return { byId, idByPath };\n}\n\nfunction updateCominsTreeNodeAtPath<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n path: readonly number[],\n update: (node: CominsTreeNode<TItem>) => CominsTreeNode<TItem>,\n): CominsTreeNode<TItem>[] {\n const [targetIndex, ...remainingPath] = path;\n\n if (targetIndex === undefined) {\n return [...nodes];\n }\n\n return nodes.map((node, index) => {\n if (index !== targetIndex) {\n return node;\n }\n\n if (remainingPath.length === 0) {\n return update(node);\n }\n\n if (!node.children) {\n return node;\n }\n\n return {\n ...node,\n children: updateCominsTreeNodeAtPath(node.children, remainingPath, update),\n };\n });\n}\n\n/** Move a complete subtree. Invalid and unchanged moves retain the input reference. */\nexport function moveCominsTreeNode<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n destination: CominsTreeMoveDestination,\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: { allowReparent?: boolean } = {},\n): readonly CominsTreeNode<TItem>[] {\n const index = createCominsTreeNodeIndex(nodes, getRowId);\n const sourcePath = index.byId.get(rowId);\n const parentPath = destination.parentId === null ? [] : index.byId.get(destination.parentId);\n const beforePath = destination.beforeRowId === null ? undefined : index.byId.get(destination.beforeRowId);\n if (!sourcePath || !parentPath || (destination.beforeRowId !== null && !beforePath)) return nodes;\n const samePath = (a: readonly number[], b: readonly number[]) => a.length === b.length && a.every((value, i) => value === b[i]);\n const sourceParent = sourcePath.slice(0, -1);\n if (!options.allowReparent && !samePath(sourceParent, parentPath)) return nodes;\n if (sourcePath.length <= parentPath.length && sourcePath.every((value, i) => value === parentPath[i])) return nodes;\n if (beforePath && !samePath(beforePath.slice(0, -1), parentPath)) return nodes;\n if (destination.beforeRowId === rowId) return nodes;\n const siblingsAt = (tree: readonly CominsTreeNode<TItem>[], path: readonly number[]) => {\n let siblings = tree;\n for (const part of path) siblings = siblings[part]?.children ?? [];\n return siblings;\n };\n const sourceSiblings = siblingsAt(nodes, sourceParent);\n const sourceIndex = sourcePath[sourcePath.length - 1]!;\n const source = sourceSiblings[sourceIndex]!;\n const targetIndex = beforePath?.[beforePath.length - 1] ?? siblingsAt(nodes, parentPath).length;\n if (samePath(sourceParent, parentPath) && (targetIndex === sourceIndex || targetIndex === sourceIndex + 1)) return nodes;\n const removed = sourceSiblings.filter((_node, i) => i !== sourceIndex);\n const detached = sourceParent.length === 0 ? removed : updateCominsTreeNodeAtPath(nodes, sourceParent, node => ({ ...node, children: removed }));\n const nextIndex = createCominsTreeNodeIndex(detached, getRowId);\n const nextParent = destination.parentId === null ? [] : nextIndex.byId.get(destination.parentId);\n const nextBefore = destination.beforeRowId === null ? undefined : nextIndex.byId.get(destination.beforeRowId);\n if (!nextParent) return nodes;\n const children = [...siblingsAt(detached, nextParent)];\n children.splice(nextBefore?.[nextBefore.length - 1] ?? children.length, 0, source);\n return nextParent.length === 0 ? children : updateCominsTreeNodeAtPath(detached, nextParent, node => ({ ...node, children }));\n}\n\nexport function flattenCominsTree<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: CominsTreeExpansionOptions = {},\n): CominsVisibleTreeRow<TItem>[] {\n const index = createCominsTreeNodeIndex(nodes, getRowId);\n const visibleRows: CominsVisibleTreeRow<TItem>[] = [];\n\n const visit = (currentNodes: readonly CominsTreeNode<TItem>[], depth: number, parentPath: readonly number[]) => {\n currentNodes.forEach((node, childIndex) => {\n const path = [...parentPath, childIndex];\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n const expanded = node.expand ?? options.defaultExpandAll ?? false;\n const rowId = index.idByPath.get(getPathKey(path));\n\n if (rowId === undefined) {\n return;\n }\n\n visibleRows.push({ depth, expanded, hasChildren, item: node.item, path, rowId });\n\n if (hasChildren && expanded) {\n visit(children, depth + 1, path);\n }\n });\n };\n\n visit(nodes, 0, []);\n\n return visibleRows;\n}\n\nexport function getCominsTreeLeafItems<TItem>(nodes: readonly CominsTreeNode<TItem>[]): TItem[] {\n return nodes.flatMap((node) => (node.children?.length ? getCominsTreeLeafItems(node.children) : [node.item]));\n}\n\nexport function toggleCominsTreeNode<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: CominsTreeExpansionOptions = {},\n): CominsTreeNode<TItem>[] {\n const path = createCominsTreeNodeIndex(nodes, getRowId).byId.get(rowId);\n\n if (!path) {\n return [...nodes];\n }\n\n return updateCominsTreeNodeAtPath(nodes, path, (node) => ({\n ...node,\n expand: !(node.expand ?? options.defaultExpandAll ?? false),\n }));\n}\n\nexport function updateCominsTreeItem<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n getRowId: (item: TItem, index: number) => CominsRowId,\n update: (item: TItem) => TItem,\n): CominsTreeNode<TItem>[] {\n const path = createCominsTreeNodeIndex(nodes, getRowId).byId.get(rowId);\n\n if (!path) {\n return [...nodes];\n }\n\n return updateCominsTreeNodeAtPath(nodes, path, (node) => ({ ...node, item: update(node.item) }));\n}\n\nexport function sortCominsTreeSiblings<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n compare: (left: TItem, right: TItem) => number,\n): CominsTreeNode<TItem>[] {\n return [...nodes]\n .sort((left, right) => compare(left.item, right.item))\n .map((node) => ({\n ...node,\n children: node.children ? sortCominsTreeSiblings(node.children, compare) : undefined,\n }));\n}\n","import type { CominsPaginationState, CominsRowId, CominsSortModel, CominsTableColumn } from \"../model\";\nimport type { CominsGroupingProjectionEntry, projectCominsGroups } from \"./grouping\";\nimport { sortCominsTreeSiblings, type CominsTreeNode } from \"../../tree\";\n\ntype Source<TData> = { rows: readonly TData[]; rowIds: readonly CominsRowId[] };\nexport type CoreDataEntry<TData> = {\n kind: \"data\"; key: string; row: TData; rowId: CominsRowId; dataIndex: number;\n visibleLeafIndex: number; absoluteIndex?: number;\n};\nexport type CoreProjectionEntry<TData> = CoreDataEntry<TData>\n | Extract<CominsGroupingProjectionEntry, { kind: \"group\" }>\n | { kind: \"placeholder\"; key: string; absoluteIndex: number };\nexport type CoreProjectionInput<TData, TGroup = unknown> = Source<TData> & (\n | { mode: \"flat\"; dataIndexes: number[]; pagination?: CominsPaginationState; virtualized?: boolean }\n | { mode: \"tree\"; dataIndexes: number[] }\n | { mode: \"grouped\"; projection: ReturnType<typeof projectCominsGroups<TGroup>> }\n | { mode: \"viewport\"; dataIndexes: number[]; absoluteIndexById: ReadonlyMap<CominsRowId, number>; rowCount: number; range?: { startIndex: number; endIndex: number } }\n);\nexport type CoreProjection<TData> = {\n entries: CoreProjectionEntry<TData>[];\n dataIndexes: number[];\n visibleRowIds: CominsRowId[];\n pageDataIndexes: number[];\n pageStartIndex: number;\n};\n\nexport function getCorePageProjection(visibleRowCount: number, pagination: CominsPaginationState) {\n const pageSize = Math.max(1, pagination.pageSize);\n const maxPageIndex = Math.max(0, Math.ceil(visibleRowCount / pageSize) - 1);\n const effectivePageIndex = Math.min(Math.max(0, pagination.pageIndex), maxPageIndex);\n return { pageSize, maxPageIndex, effectivePageIndex, pageStartIndex: effectivePageIndex * pageSize };\n}\n\nexport function projectCoreViewportWindow<TEntry extends { kind: \"data\"; absoluteIndex?: number }>(loaded: readonly TEntry[], range: { startIndex: number; endIndex: number }, rowCount: number) {\n const byIndex = new Map(loaded.flatMap(entry => entry.absoluteIndex === undefined ? [] : [[entry.absoluteIndex, entry] as const]));\n const entries: Array<TEntry | { kind: \"placeholder\"; key: string; absoluteIndex: number }> = [];\n for (let index = range.startIndex; index < Math.min(rowCount, range.endIndex); index++) {\n entries.push(byIndex.get(index) ?? { kind: \"placeholder\", key: `viewport:${index}`, absoluteIndex: index });\n }\n return entries;\n}\n\n/** Inputs are prepared by the separately memoized filter/sort/group phases. */\nexport function projectCoreRows<TData, TGroup = unknown>(input: CoreProjectionInput<TData, TGroup>): CoreProjection<TData> {\n const dataIndexes = input.mode === \"grouped\"\n ? input.projection.entries.flatMap(entry => entry.kind === \"data\" ? [entry.dataIndex] : [])\n : input.dataIndexes;\n const sourceEntries: readonly CominsGroupingProjectionEntry[] = input.mode === \"grouped\" ? input.projection.entries\n : dataIndexes.flatMap((dataIndex, visibleLeafIndex) => {\n const rowId = input.rowIds[dataIndex];\n return rowId === undefined ? [] : [{ kind: \"data\" as const, key: `data:${typeof rowId}:${encodeURIComponent(String(rowId))}`, rowId, dataIndex, visibleLeafIndex }];\n });\n const loaded = sourceEntries.flatMap<CoreProjectionEntry<TData>>(entry => {\n if (entry.kind === \"group\") return [entry];\n const row = input.rows[entry.dataIndex];\n if (row === undefined) return [];\n if (input.mode === \"viewport\") {\n const absoluteIndex = input.absoluteIndexById.get(entry.rowId);\n return absoluteIndex === undefined ? [] : [{ ...entry, row, absoluteIndex }];\n }\n return [{ ...entry, row }];\n });\n let entries = loaded;\n if (input.mode === \"viewport\" && input.range) {\n entries = projectCoreViewportWindow(loaded.filter((entry): entry is CoreDataEntry<TData> => entry.kind === \"data\"), input.range, input.rowCount);\n }\n const page = input.mode === \"flat\" && input.pagination ? getCorePageProjection(dataIndexes.length, input.pagination) : { pageStartIndex: 0, pageSize: dataIndexes.length };\n return { entries, dataIndexes,\n visibleRowIds: entries.flatMap(entry => entry.kind === \"data\" ? [entry.rowId] : []),\n pageStartIndex: page.pageStartIndex,\n pageDataIndexes: input.mode === \"flat\" && !input.virtualized ? dataIndexes.slice(page.pageStartIndex, page.pageStartIndex + page.pageSize) : dataIndexes,\n };\n}\n\nfunction getTreeNestedFieldValue(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, key) => value == null || typeof value !== \"object\" ? undefined : (value as Record<string, unknown>)[key], row);\n}\nfunction compareTreeValues(left: unknown, right: unknown) {\n return typeof left === \"number\" && typeof right === \"number\" ? left - right : String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\nexport function getSortedCoreTree<TData>(data: readonly CominsTreeNode<TData>[], columns: readonly CominsTableColumn<TData>[], sortModel: CominsSortModel) {\n if (sortModel.length === 0) return data;\n return sortCominsTreeSiblings(data, (leftRow, rightRow) => {\n for (const rule of sortModel) {\n const column = columns.find(candidate => (candidate.id ?? candidate.field) === rule.columnId);\n if (!column?.sort) continue;\n const leftValue = getTreeNestedFieldValue(leftRow, column.field);\n const rightValue = getTreeNestedFieldValue(rightRow, column.field);\n const result = typeof column.sort === \"function\" ? column.sort(leftValue, rightValue, leftRow, rightRow) : compareTreeValues(leftValue, rightValue);\n if (result !== 0) return rule.direction === \"desc\" ? result * -1 : result;\n }\n return 0;\n });\n}\n","import type { CominsTableColumn } from \"../react-types\";\nimport type { CominsSortModel } from \"../model\";\nimport type { CominsTreeNode } from \"../tree\";\nimport { getSortedCoreTree } from \"../core/rows/projection\";\nimport { projectReactColumn } from \"./model\";\n\nexport { projectCoreRows as projectReactRows, projectCoreViewportWindow, getCorePageProjection } from \"../core/rows/projection\";\n\nexport function getSortedReactTree<TData>(data: readonly CominsTreeNode<TData>[], columns: readonly CominsTableColumn<TData>[], sortModel: CominsSortModel) {\n if (sortModel.length === 0) return data;\n // Bind comparator receivers to the original definitions, including columns without an explicit id.\n return getSortedCoreTree(data, columns.map(column => ({\n ...projectReactColumn({ ...column, id: column.id ?? column.field }),\n sort: typeof column.sort === \"function\" ? (left, right, leftRow, rightRow) => {\n const compare = column.sort;\n return typeof compare === \"function\" ? compare.call(column, left, right, leftRow, rightRow) : 0;\n } : column.sort,\n })), sortModel);\n}\n","import { planCoreSelectionCopy } from \"./core/selection/navigation\";\nimport {\n copyCominsCell, getCominsCellValue, getCominsSelectedCellRange, getCominsVisibleColumns,\n} from \"./react/core-compat\";\nimport type { CominsCellAddress, CominsCopiedCellRange, CominsRowId } from \"./model\";\nimport type { CominsTableState } from \"./react-types\";\n\nexport type CominsSelectedCell = CominsCellAddress & { value: unknown };\nexport type CominsCopyTarget = \"auto\" | \"cells\" | \"rows\";\nexport type CominsSelectionCopy = { target: \"cells\" | \"rows\"; text: string; data: CominsCopiedCellRange };\n\nexport function selectedRowData<T>(state: CominsTableState<T>): T[] {\n const selected = new Set(state.selection.rowIds);\n return state.rows.filter((_, index) => selected.has(state.rowIds[index]!));\n}\n\nexport function selectedCellValues<T>(state: CominsTableState<T>, order: readonly CominsRowId[] = state.rowIds): CominsSelectedCell[] {\n const cells = state.selection.range ? getCominsSelectedCellRange(state, state.selection.range, order)\n : state.selection.cells ?? (state.selection.cell ? [state.selection.cell] : []);\n const rows = new Map(state.rowIds.map((id, index) => [id, state.rows[index]]));\n const columns = new Set(getCominsVisibleColumns(state).map(column => column.id));\n return cells.flatMap(cell => {\n const row = rows.get(cell.rowId);\n return row === undefined || !columns.has(cell.columnId) ? [] : [{ ...cell, value: getCominsCellValue(state, row, cell.columnId) }];\n });\n}\n\nfunction encodeTsv(value: unknown): string {\n let text = value == null ? \"\" : String(value);\n if (typeof value === \"string\" && /^[\\t\\r\\n ]*[=+@-]/u.test(text)) text = `'${text}`;\n return /[\"\\t\\n\\r]/u.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n\n// Enumeration happens on demand; rendering does not materialize the selected rectangle.\nexport function copySelectionData<T>(state: CominsTableState<T>, target: CominsCopyTarget = \"auto\", order: readonly CominsRowId[] = state.rowIds): CominsSelectionCopy | null {\n const cells = selectedCellValues(state, order);\n const visible = getCominsVisibleColumns(state);\n const plan = planCoreSelectionCopy({ cells, selectedRowIds: state.selection.rowIds, rowIds: order, columnIds: visible.map(column => column.id), target });\n if (!plan) return null;\n const { target: kind, rowIds, selected } = plan;\n const columnsById = new Map(visible.map(column => [column.id, column]));\n const columns = plan.columnIds.map(id => columnsById.get(id)!);\n const rows = rowIds.map(rowId => columns.map(column => {\n if (kind === \"cells\" && !selected.get(rowId)?.has(column.id)) return null;\n const cell = copyCominsCell(state, { rowId, columnId: column.id });\n return cell ? { columnId: column.id, value: cell.value, text: encodeTsv(cell.value) } : null;\n }));\n if (!rows.some(row => row.some(Boolean))) return null;\n const text = rows.map(row => row.map(cell => cell?.text ?? \"\").join(\"\\t\")).join(\"\\n\");\n return { target: kind, text, data: { kind: \"cell-range\", rows, text } };\n}\n","import type { CominsValueFilterPart, CominsValueFilterTriggerRenderParams, CominsValueFilterOptionRenderParams, CominsValueFilterPanelRenderParams } from \"./react/value-filter-types\";\nimport type {\n CominsCellFormatParams,\n CominsTableRuntimeColumn,\n} from \"./react-types\";\nimport type { CominsColumnFilterConfig as CoreFilterConfig, CominsColumnFilterKind } from \"./core/model\";\n\nexport type { CominsColumnFilterKind } from \"./core/model\";\n\nexport type {\n CominsColumnConditionFilterOperator, CominsColumnFilterOperator,\n CominsColumnConditionFilterRule, CominsColumnValueFilterRule,\n CominsColumnFilterRule, CominsColumnFilterModel, CominsColumnFilteringConfig,\n CominsColumnFilteringSourceRow,\n} from \"./core/rows/filtering\";\nexport type { CominsColumnFilterValue } from \"./core/model\";\nexport type { CominsColumnFilterOption, CominsColumnFilterOptionsResult, CominsColumnFilterValuesAction } from \"./core/rows/values-filter\";\nimport type { CominsNormalizedColumnFilterRule as CoreNormalizedRule } from \"./core/rows/filtering\";\nimport type { CominsColumnFilterOptionsInput as CoreOptionsInput, CominsColumnFilterValuesAction } from \"./core/rows/values-filter\";\nimport type { CominsColumnFilteringSourceRow } from \"./core/rows/filtering\";\nimport * as valuesCore from \"./core/rows/values-filter\";\n\nexport type CominsColumnFilterConfig<TData, TValue = unknown> = Omit<CoreFilterConfig<TData, TValue>, \"getValue\"> & {\n mode?: \"condition\" | \"values\";\n trigger?: CominsValueFilterPart<CominsValueFilterTriggerRenderParams<TData>>;\n option?: CominsValueFilterPart<CominsValueFilterOptionRenderParams<TData>>;\n panel?: CominsValueFilterPart<CominsValueFilterPanelRenderParams<TData>>;\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n};\n\ntype RestoreRule<TData, TRule> = TRule extends unknown ? Omit<TRule, \"column\" | \"config\"> & {\n column: CominsTableRuntimeColumn<TData>; config: CominsColumnFilterConfig<TData>;\n} : never;\nexport type CominsNormalizedColumnFilterRule<TData> = RestoreRule<TData, CoreNormalizedRule<TData>>;\nexport type CominsColumnFilterOptionsInput<TData> = Omit<CoreOptionsInput<TData>, \"columns\"> & {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n};\nexport function getCominsColumnFilterOptions<TData>(input: CominsColumnFilterOptionsInput<TData>) {\n return valuesCore.getCominsColumnFilterOptions({ ...input, columns: input.columns.map(projectReactColumn) });\n}\nexport function setCominsColumnFilterValues<TData>(input: CominsColumnFilterOptionsInput<TData> & { action: CominsColumnFilterValuesAction }) {\n return valuesCore.setCominsColumnFilterValues({ ...input, columns: input.columns.map(projectReactColumn) });\n}\n\nexport { getCominsColumnFilterOperators } from \"./core/rows/filtering\";\nimport * as core from \"./core/rows/filtering\";\nimport { projectReactColumn } from \"./react/model\";\n\nexport function normalizeCominsColumnFilterModel<TData>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; model: unknown }): CominsNormalizedColumnFilterRule<TData>[] {\n const originals = new Map(input.columns.map(column => [column.id, column]));\n return core.normalizeCominsColumnFilterModel({ ...input, columns: input.columns.map(projectReactColumn) }).map(rule => {\n const column = originals.get(rule.column.id)!;\n return { ...rule, column, config: column.filter! };\n });\n}\nexport function getCominsFilteredRowIndexes<TData>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; model: unknown; rows: readonly CominsColumnFilteringSourceRow<TData>[] }) {\n return core.getCominsFilteredRowIndexes({ ...input, columns: input.columns.map(projectReactColumn) });\n}\n\nexport type { CominsValueFilterTriggerRenderParams, CominsValueFilterOptionRenderParams, CominsValueFilterPanelRenderParams, CominsValueFilterActions, CominsValueFilterPart, CominsFilterButtonGetter, CominsFilterCheckboxGetter, CominsFilterNativeOptions, CominsFilterCustomOptions, CominsFilterBinding } from \"./react/value-filter-types\";\n","import { useEffect, useMemo, useRef, useState, type ButtonHTMLAttributes, type HTMLAttributes, type InputHTMLAttributes, type Ref, type SyntheticEvent } from \"react\";\nimport { getCominsColumnFilterOptions, setCominsColumnFilterValues, type CominsColumnFilterOptionsInput, type CominsColumnFilterRule, type CominsColumnFilterOption } from \"../filtering\";\nimport { searchFilterOptions } from \"../core/rows/values-filter\";\nimport type { CominsTableRuntimeColumn } from \"../react-types\";\nimport type { CominsFilterButtonGetter, CominsFilterCheckboxGetter, CominsFilterCustomOptions, CominsFilterNativeOptions, CominsValueFilterPanelRenderParams, CominsValueFilterPart, CominsValueFilterTriggerRenderParams } from \"./value-filter-types\";\n\nfunction bindRef<E extends HTMLElement>(user: Ref<E> | undefined, install?: (node: E | null) => void) {\n let cleanup: (() => void) | undefined;\n return (node: E | null) => {\n install?.(node);\n if (cleanup) { cleanup(); cleanup = undefined; if (!node) return; }\n if (typeof user === \"function\") { const next = user(node); if (typeof next === \"function\") cleanup = next; }\n else if (user) user.current = node;\n };\n}\n// ref 콜백이 필터 render context의 actions와 portalContainer를 함께 보유하지 않도록 분리한다.\nfunction createSearchRefInstaller(ref: { current: HTMLInputElement | null }) {\n return (node: HTMLInputElement | null) => { ref.current = node; };\n}\n// React가 종료된 Fiber.ref를 잠시 유지해도 변경 콜백과 원본 행을 함께 잡지 않는다.\nfunction createIndeterminateInstaller(indeterminate: boolean) {\n return (node: HTMLInputElement | null) => { if (node) node.indeterminate = indeterminate; };\n}\nfunction eventHandler<E extends SyntheticEvent>(user: ((event: E) => void) | undefined, internal: (event: E) => void) {\n return (event: E) => { user?.(event); if (!event.defaultPrevented) internal(event); };\n}\nfunction visual<P extends { className?: string; style?: React.CSSProperties }, Q extends { className?: string; style?: React.CSSProperties }>(base: P, extra?: Q) {\n return { ...base, ...extra, className: [base.className, extra?.className].filter(Boolean).join(\" \"), style: { ...base.style, ...extra?.style } };\n}\nfunction partProps<P>(part: CominsValueFilterPart<P> | undefined, params: P) {\n return typeof part?.props === \"function\" ? part.props(params) : part?.props;\n}\n\nexport function createFilterButtonGetter(input: { label: string; disabled: boolean; click: () => void; className?: string; style?: React.CSSProperties; open?: boolean; controls?: string; install?: (node: HTMLElement | null) => void }): CominsFilterButtonGetter {\n function getProps(options?: CominsFilterNativeOptions<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>): React.ButtonHTMLAttributes<HTMLButtonElement> & { ref: React.RefCallback<HTMLButtonElement> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterCustomOptions<E>): HTMLAttributes<E> & { ref: React.RefCallback<E> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterNativeOptions<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>> | CominsFilterCustomOptions<E> = {}) {\n const shared = { className: input.className, style: input.style };\n const aria = { \"aria-label\": input.label, \"aria-expanded\": input.open, \"aria-controls\": input.controls, \"aria-disabled\": input.disabled || undefined };\n if (options.element === \"custom\") {\n const props = options.props;\n return { ...visual(shared, props), ...aria, role: \"button\", tabIndex: input.disabled ? -1 : 0,\n ref: bindRef(options.ref, input.install),\n onClick: eventHandler(props?.onClick, () => { if (!input.disabled) input.click(); }),\n onKeyDown: eventHandler(props?.onKeyDown, event => {\n if (event.key === \"Enter\" || event.key === \" \") { event.preventDefault(); if (!event.repeat && !input.disabled) input.click(); }\n }) };\n }\n const props = options.props;\n return { ...visual(shared, props), ...aria, type: \"button\" as const, disabled: input.disabled,\n ref: bindRef(options.ref, input.install), onClick: eventHandler(props?.onClick, () => { if (!input.disabled) input.click(); }) };\n }\n return getProps;\n}\n\nfunction createCheckboxGetter(input: { id: string; label: string; checked: boolean | \"mixed\"; disabled: boolean; change: (checked: boolean) => void }): CominsFilterCheckboxGetter {\n function getProps(options?: CominsFilterNativeOptions<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>): InputHTMLAttributes<HTMLInputElement> & { ref: React.RefCallback<HTMLInputElement> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterCustomOptions<E>): HTMLAttributes<E> & { ref: React.RefCallback<E> };\n function getProps<E extends HTMLElement = HTMLElement>(options: CominsFilterNativeOptions<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>> | CominsFilterCustomOptions<E> = {}) {\n if (options.element === \"custom\") {\n const props = options.props;\n return { ...props, id: input.id, role: \"checkbox\", tabIndex: input.disabled ? -1 : 0,\n \"aria-label\": input.label, \"aria-checked\": input.checked, \"aria-disabled\": input.disabled || undefined,\n ref: bindRef(options.ref), onClick: eventHandler(props?.onClick, () => { if (!input.disabled) input.change(input.checked !== true); }),\n onKeyDown: eventHandler(props?.onKeyDown, event => { if (event.key === \" \") { event.preventDefault(); if (!event.repeat && !input.disabled) input.change(input.checked !== true); } }) };\n }\n const props = options.props;\n return { ...props, id: input.id, type: \"checkbox\" as const, \"aria-label\": input.label,\n checked: input.checked === true, disabled: input.disabled,\n ref: bindRef(options.ref, createIndeterminateInstaller(input.checked === \"mixed\")),\n onChange: eventHandler(props?.onChange, event => { if (!input.disabled) input.change(event.currentTarget.checked); }) };\n }\n return getProps;\n}\n\nexport function useValueFilter<TData>(input: {\n column: CominsTableRuntimeColumn<TData>; source: CominsColumnFilterOptionsInput<TData>; enabled: boolean;\n open: boolean; onChangeModel?: (model: CominsColumnFilterRule[]) => void; close: () => void; id: string;\n}) {\n const { column, source, open, enabled, onChangeModel, close, id } = input;\n const [query, setQuery] = useState(\"\");\n const searchRef = useRef<HTMLInputElement | null>(null);\n const readOnly = !onChangeModel;\n useEffect(() => { if (!open || !enabled) setQuery(\"\"); }, [open, enabled]);\n const base = useMemo(() => open && enabled ? getCominsColumnFilterOptions({ ...source, query: \"\" }) : null,\n [open, enabled, source.columnId, source.columns, source.rows, source.model]);\n const result = useMemo(() => base ? searchFilterOptions(base, query) : null, [base, query]);\n const apply = (action: Parameters<typeof setCominsColumnFilterValues<TData>>[0][\"action\"]) => {\n if (readOnly) return;\n const next = setCominsColumnFilterValues({ ...source, query, action });\n if (next !== source.model) onChangeModel?.([...next]);\n };\n if (!result) return { params: null, searchRef };\n const actions = { setQuery, setOptionSelected: (id: string, checked: boolean) => apply({ type: \"setOption\", id, checked }),\n setVisibleSelected: (checked: boolean) => apply({ type: \"setVisible\", checked }), clear: () => { if (!readOnly) { apply({ type: \"clear\" }); setQuery(\"\"); } }, close };\n const getOptionProps: CominsValueFilterPanelRenderParams<TData>[\"getOptionProps\"] = (option: CominsColumnFilterOption, options?: CominsFilterNativeOptions<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>> | CominsFilterCustomOptions<HTMLElement>) => {\n const getter = createCheckboxGetter({ id: `${id}-option-${encodeURIComponent(option.id)}`, label: option.label, checked: option.selected, disabled: readOnly, change: checked => actions.setOptionSelected(option.id, checked) });\n return options?.element === \"custom\" ? getter(options) : getter(options);\n };\n const params: CominsValueFilterPanelRenderParams<TData> = { ...result, column, query, readOnly, actions,\n getSearchInputProps: (options = {}) => ({ ...options.props, type: \"search\", value: query, \"aria-label\": \"Search filter values\", className: [\"comins-column-filter__search\", options.props?.className].filter(Boolean).join(\" \"),\n ref: bindRef(options.ref, createSearchRefInstaller(searchRef)), onChange: eventHandler(options.props?.onChange, event => setQuery(event.currentTarget.value)) }),\n getOptionProps,\n getOptionContainerProps: (option, options) => ({ ...visual(visual({ className: \"comins-column-filter__option\" }, partProps(column.filter?.option, { column, option, query, readOnly })), options?.props), \"data-selected\": option.selected ? \"true\" : undefined, \"data-present\": option.present ? \"true\" : \"false\" }),\n getSelectAllProps: createCheckboxGetter({ id: `${id}-all`, label: \"Select all matching values\", checked: result.visibleSelection, disabled: readOnly || !result.visibleOptionCount, change: actions.setVisibleSelected }),\n getClearProps: createFilterButtonGetter({ label: \"Clear filter\", disabled: readOnly || result.selectionMode === \"all\", click: () => { const search = searchRef.current; if (search?.isConnected) search.focus({ preventScroll: true }); actions.clear(); }, className: \"comins-column-filter__clear\" }),\n getCloseProps: createFilterButtonGetter({ label: \"Close filter\", disabled: false, click: close, className: \"comins-column-filter__clear\" }),\n renderOption: option => {\n const custom = column.filter?.option?.render?.({ column, option, query, readOnly });\n return custom !== undefined ? custom : <><span>{option.label}</span><small className=\"comins-column-filter__count\">{option.count}</small></>;\n },\n };\n return { params, searchRef };\n}\n\nexport function ValueFilterPanel<TData>({ params }: { params: CominsValueFilterPanelRenderParams<TData> }) {\n const custom = params.column.filter?.panel?.render?.(params);\n return <div {...visual({ className: \"comins-column-filter__values\" }, partProps(params.column.filter?.panel, params))} data-readonly={params.readOnly ? \"true\" : undefined}>\n {custom !== undefined ? custom : <>\n <input {...params.getSearchInputProps()} data-comins-column-filter-value-input=\"true\" />\n <label className=\"comins-column-filter__select-all\"><input {...params.getSelectAllProps()} />Select all matching values</label>\n <div className=\"comins-column-filter__options\">\n {params.visibleOptions.map(option => <label key={option.id} {...params.getOptionContainerProps(option)}><input {...params.getOptionProps(option)} />{params.renderOption(option)}</label>)}\n {!params.visibleOptions.length ? <span className=\"comins-column-filter__no-results\">No matching values</span> : null}\n </div>\n <div className=\"comins-column-filter__actions\"><button {...params.getClearProps()}>Clear</button><button {...params.getCloseProps()}>Close</button></div>\n </>}\n </div>;\n}\n\nexport function renderFilterTrigger<TData>(params: CominsValueFilterTriggerRenderParams<TData>, fallback: React.ReactNode) {\n const custom = params.column.filter?.trigger?.render?.(params);\n return custom !== undefined ? custom : fallback;\n}\nexport function getFilterTriggerVisual<TData>(params: CominsValueFilterTriggerRenderParams<TData>) {\n return visual({ className: \"comins-column-filter__trigger\" }, partProps(params.column.filter?.trigger, params));\n}\n","import {\n CaretSortIcon,\n ChevronRightIcon,\n DragHandleDots2Icon,\n MagnifyingGlassIcon,\n} from \"@radix-ui/react-icons\";\nimport * as React from \"react\";\n\nexport type CominsTableIconName =\n | \"columnMove\"\n | \"disclosureCollapsed\"\n | \"disclosureExpanded\"\n | \"filter\"\n | \"sortAscending\"\n | \"sortDescending\"\n | \"sortUnsorted\";\n\nconst icons = {\n columnMove: DragHandleDots2Icon,\n disclosureCollapsed: ChevronRightIcon,\n disclosureExpanded: ChevronRightIcon,\n filter: MagnifyingGlassIcon,\n sortAscending: ChevronRightIcon,\n sortDescending: ChevronRightIcon,\n sortUnsorted: CaretSortIcon,\n} as const;\n\nexport function CominsTableIcon({ className, name }: { className?: string; name: CominsTableIconName }) {\n const Icon = icons[name];\n\n return (\n <Icon\n aria-hidden=\"true\"\n className={[\"comins-table-icon\", className].filter(Boolean).join(\" \")}\n data-comins-icon={name}\n focusable=\"false\"\n />\n );\n}\n\nexport type CominsTableIconButtonProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"aria-label\" | \"children\"\n> & {\n \"aria-label\": string;\n icon: CominsTableIconName;\n};\n\nexport const CominsTableIconButton = React.forwardRef<HTMLButtonElement, CominsTableIconButtonProps>(\n function CominsTableIconButton({ className, icon, type = \"button\", ...buttonProps }, ref) {\n return (\n <button\n className={[\"comins-table-icon-button\", className].filter(Boolean).join(\" \")}\n ref={ref}\n type={type}\n {...buttonProps}\n >\n <CominsTableIcon name={icon} />\n </button>\n );\n },\n);\n","import { createFilterButtonGetter, useValueFilter, ValueFilterPanel, renderFilterTrigger, getFilterTriggerVisual } from \"./react/value-filter\";\nimport type { CominsTableRuntimeColumn } from \"./react-types\";\nimport type { CominsColumnFilterOptionsInput } from \"./filtering\";\nimport type { CominsValueFilterTriggerRenderParams } from \"./react/value-filter-types\";\nimport {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n getCominsColumnFilterOperators,\n type CominsColumnFilterKind,\n type CominsColumnConditionFilterOperator,\n type CominsColumnFilterRule,\n type CominsNormalizedColumnFilterRule,\n} from \"./filtering\";\nimport { CominsTableIconButton } from \"./table-icons\";\n\nconst operatorLabels: Record<CominsColumnConditionFilterOperator, string> = {\n between: \"Between\",\n contains: \"Contains\",\n endsWith: \"Ends with\",\n equals: \"Equals\",\n greaterThan: \"Greater than\",\n greaterThanOrEqual: \"Greater than or equal\",\n isEmpty: \"Is empty\",\n isNotEmpty: \"Is not empty\",\n lessThan: \"Less than\",\n lessThanOrEqual: \"Less than or equal\",\n notContains: \"Does not contain\",\n notEquals: \"Does not equal\",\n startsWith: \"Starts with\",\n};\n\nfunction getDefaultOperator(kind: CominsColumnFilterKind): CominsColumnConditionFilterOperator {\n return kind === \"text\" ? \"contains\" : \"equals\";\n}\n\nfunction getRuleInputValue<TData>(\n rule: CominsNormalizedColumnFilterRule<TData> | undefined,\n kind: CominsColumnFilterKind,\n) {\n const value = rule?.value;\n\n if (value === undefined) {\n return kind === \"boolean\" ? \"true\" : \"\";\n }\n\n if (kind === \"date\" && typeof value === \"number\") {\n return new Date(value).toISOString().slice(0, 10);\n }\n\n return String(value);\n}\n\nfunction getRuleInputValueTo<TData>(\n rule: CominsNormalizedColumnFilterRule<TData> | undefined,\n kind: CominsColumnFilterKind,\n) {\n const value = rule?.valueTo;\n\n if (value === undefined) {\n return \"\";\n }\n\n return kind === \"date\" ? new Date(value).toISOString().slice(0, 10) : String(value);\n}\n\nfunction isValidDateInput(value: string) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/u.test(value)) {\n return false;\n }\n\n const [year, month, day] = value.split(\"-\").map(Number);\n const date = new Date(Date.UTC(year!, month! - 1, day!));\n\n return date.getUTCFullYear() === year && date.getUTCMonth() === month! - 1 && date.getUTCDate() === day;\n}\n\nexport function CominsColumnFilterControl<TData>({\n column, valueSource, onChangeModel,\n columnId,\n columnLabel,\n kind,\n getPortalContainer,\n onChangeRule,\n onOpenChange,\n open,\n rule,\n}: {\n column: CominsTableRuntimeColumn<TData>;\n valueSource: CominsColumnFilterOptionsInput<TData>;\n onChangeModel?: (model: CominsColumnFilterRule[]) => void;\n columnId: string;\n columnLabel: string;\n kind: CominsColumnFilterKind;\n getPortalContainer?: () => HTMLElement | null;\n onChangeRule?: (rule: CominsColumnFilterRule | null) => void;\n onOpenChange?: (columnId: string | null) => void;\n open: boolean;\n rule?: CominsNormalizedColumnFilterRule<TData>;\n}) {\n const buttonRef = useRef<HTMLElement | null>(null);\n const onOpenChangeRef = useRef(onOpenChange);\n const popoverRef = useRef<HTMLSpanElement | null>(null);\n const popoverId = useId();\n const [operator, setOperator] = useState<CominsColumnConditionFilterOperator>(\n (rule?.operator !== \"in\" ? rule?.operator : undefined) ?? getDefaultOperator(kind),\n );\n const [value, setValue] = useState(() => getRuleInputValue(rule, kind));\n const [valueTo, setValueTo] = useState(() => getRuleInputValueTo(rule, kind));\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const pendingRuleKeyRef = useRef<string | null>(null);\n const ruleKey = (next: CominsColumnFilterRule | CominsNormalizedColumnFilterRule<TData> | null | undefined) => {\n const inputValue = (value: unknown) => value === undefined ? \"\" : kind === \"date\" && typeof value === \"number\"\n ? new Date(value).toISOString().slice(0, 10) : String(value);\n return JSON.stringify([next?.operator, inputValue(next?.value), inputValue(next?.valueTo)]);\n };\n const appliedRuleKey = ruleKey(rule);\n const active = rule !== undefined;\n const readOnly = typeof onChangeRule !== \"function\";\n const requiresValue = operator !== \"isEmpty\" && operator !== \"isNotEmpty\";\n\n const valuesMode = rule?.operator === \"in\" || (!rule && column.filter?.mode === \"values\");\n const close = () => { onOpenChange?.(null); if (buttonRef.current?.isConnected) buttonRef.current.focus(); };\n const values = useValueFilter({ column, source: valueSource, open, enabled: valuesMode, onChangeModel, close, id: popoverId });\n const portalContainer = getPortalContainer?.() ?? null;\n const triggerParams: CominsValueFilterTriggerRenderParams<TData> = {\n column, columnLabel, open, active, readOnly, canOpen: !!onOpenChange,\n selection: valuesMode ? values.params ?? undefined : undefined,\n getTriggerProps: createFilterButtonGetter({ label: `Filter ${columnLabel}`, disabled: !onOpenChange, click: () => onOpenChange?.(open ? null : columnId), open, controls: open ? popoverId : undefined, install: node => { buttonRef.current = node; } }),\n };\n triggerParams.getTriggerProps = createFilterButtonGetter({ label: `Filter ${columnLabel}`, disabled: !onOpenChange, click: () => onOpenChange?.(open ? null : columnId), open, controls: open ? popoverId : undefined, install: node => { buttonRef.current = node; }, ...getFilterTriggerVisual(triggerParams) });\n useLayoutEffect(() => {\n if (!open || !valuesMode) return;\n const panel = popoverRef.current;\n if (!panel) return;\n const controls = panel.querySelectorAll<HTMLElement>('input,button,select,textarea,a[href],[tabindex],[contenteditable]');\n const candidates = [values.searchRef.current, ...controls];\n for (const candidate of candidates) {\n if (!candidate || !candidate.isConnected || !panel.contains(candidate) || candidate.matches(':disabled')\n || candidate.closest('[hidden],[inert],[aria-disabled=\"true\"]') || (candidate.tabIndex < 0 && !candidate.isContentEditable)) continue;\n let visible = true;\n for (let element: HTMLElement | null = candidate; element; element = element.parentElement) {\n const style = element.ownerDocument.defaultView?.getComputedStyle(element);\n if (style?.display === \"none\" || style?.visibility === \"hidden\") { visible = false; break; }\n }\n if (!visible) continue;\n candidate.focus({ preventScroll: true });\n if (candidate.ownerDocument.activeElement === candidate || candidate.matches(':focus')) return;\n }\n panel.focus({ preventScroll: true });\n }, [open, valuesMode, portalContainer]);\n\n useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n }, [onOpenChange]);\n\n useEffect(() => {\n if (!open) {\n pendingRuleKeyRef.current = null;\n return;\n }\n\n // Acknowledging our incomplete draft must not reset the chosen operator.\n if (pendingRuleKeyRef.current === appliedRuleKey) {\n pendingRuleKeyRef.current = null;\n return;\n }\n pendingRuleKeyRef.current = null;\n setOperator((rule?.operator !== \"in\" ? rule?.operator : undefined) ?? getDefaultOperator(kind));\n setValue(getRuleInputValue(rule, kind));\n setValueTo(getRuleInputValueTo(rule, kind));\n }, [kind, open, appliedRuleKey]);\n\n useLayoutEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const doc = (buttonRef.current ?? popoverRef.current)?.ownerDocument;\n const win = doc?.defaultView;\n if (!doc || !win) return;\n let alive = true;\n let focusTimer: number | undefined;\n const inside = (target: EventTarget | null) => target instanceof win.Node && (buttonRef.current?.contains(target) || popoverRef.current?.contains(target));\n const updatePosition = () => {\n const button = buttonRef.current;\n const popover = popoverRef.current;\n\n if (!button) {\n return;\n }\n\n const bounds = button.getBoundingClientRect();\n const width = popover?.offsetWidth || 260;\n const height = popover?.offsetHeight || 220;\n const left = Math.min(\n Math.max(8, bounds.left),\n Math.max(8, win.innerWidth - width - 8),\n );\n const below = bounds.bottom + 6;\n const top = below + height <= win.innerHeight - 8\n ? below\n : Math.max(8, bounds.top - height - 6);\n\n setPosition(current => current.left === left && current.top === top ? current : { left, top });\n };\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target;\n\n if (\n inside(target)\n ) {\n return;\n }\n\n // 제거 commit 전에 blur해야 React가 마지막 입력의 선택 추적 참조를 해제한다.\n const focused = doc.activeElement;\n if (focused instanceof win.HTMLElement && popoverRef.current?.contains(focused)) focused.blur();\n if (focusTimer !== undefined) {\n win.clearTimeout(focusTimer);\n focusTimer = undefined;\n }\n onOpenChangeRef.current?.(null);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n event.preventDefault();\n onOpenChangeRef.current?.(null);\n buttonRef.current?.focus();\n };\n\n const handleFocusOut = (event: FocusEvent) => {\n if (!inside(event.target) || inside(event.relatedTarget)) return;\n if (focusTimer !== undefined) win.clearTimeout(focusTimer);\n if (event.relatedTarget) { onOpenChangeRef.current?.(null); return; }\n // Native pointer focus can leave activeElement at body between blur and focusin.\n focusTimer = win.setTimeout(() => {\n if (alive && !inside(doc.activeElement)) onOpenChangeRef.current?.(null);\n }, 0);\n };\n doc.addEventListener(\"focusout\", handleFocusOut);\n // Layout shifts can move the anchor without a scroll or resize event.\n let positionFrame: number;\n const trackPosition = () => {\n updatePosition();\n positionFrame = win.requestAnimationFrame(trackPosition);\n };\n trackPosition();\n win.addEventListener(\"resize\", updatePosition);\n win.addEventListener(\"scroll\", updatePosition, true);\n doc.addEventListener(\"pointerdown\", handlePointerDown, true);\n win.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n alive = false; doc.removeEventListener(\"focusout\", handleFocusOut);\n if (focusTimer !== undefined) win.clearTimeout(focusTimer);\n win.cancelAnimationFrame(positionFrame);\n win.removeEventListener(\"resize\", updatePosition);\n win.removeEventListener(\"scroll\", updatePosition, true);\n doc.removeEventListener(\"pointerdown\", handlePointerDown, true);\n win.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [open]);\n\n const emitRule = (nextRule: CominsColumnFilterRule | null) => {\n const nextKey = ruleKey(nextRule);\n pendingRuleKeyRef.current = nextKey === appliedRuleKey ? null : nextKey;\n onChangeRule?.(nextRule);\n };\n const renderPopover = (content: ReactNode) => {\n return portalContainer ? createPortal(content, portalContainer) : content;\n };\n const commitRule = (\n nextOperator: CominsColumnConditionFilterOperator,\n nextValue: string,\n nextValueTo: string,\n ) => {\n if (!onChangeRule) {\n return;\n }\n\n if (nextOperator === \"isEmpty\" || nextOperator === \"isNotEmpty\") {\n emitRule({ columnId, operator: nextOperator });\n return;\n }\n\n if (kind === \"text\") {\n emitRule(nextValue.length > 0\n ? { columnId, operator: nextOperator, value: nextValue }\n : null);\n return;\n }\n\n if (kind === \"boolean\") {\n emitRule(nextValue === \"true\" || nextValue === \"false\"\n ? { columnId, operator: nextOperator, value: nextValue === \"true\" }\n : null);\n return;\n }\n\n const firstValue = kind === \"date\"\n ? (isValidDateInput(nextValue) ? nextValue : null)\n : (nextValue !== \"\" && Number.isFinite(Number(nextValue)) ? Number(nextValue) : null);\n\n if (firstValue === null) {\n if (nextOperator === \"between\") {\n return;\n }\n\n emitRule(null);\n return;\n }\n\n if (nextOperator === \"between\") {\n const secondValue = kind === \"date\"\n ? (isValidDateInput(nextValueTo) ? nextValueTo : null)\n : (nextValueTo !== \"\" && Number.isFinite(Number(nextValueTo)) ? Number(nextValueTo) : null);\n\n if (secondValue === null) {\n return;\n }\n\n emitRule({ columnId, operator: nextOperator, value: firstValue, valueTo: secondValue });\n return;\n }\n\n emitRule({ columnId, operator: nextOperator, value: firstValue });\n };\n\n return (\n <span\n className=\"comins-column-filter\"\n data-active={active ? \"true\" : undefined}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation();\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onOpenChange?.(null);\n buttonRef.current?.focus();\n }\n }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {renderFilterTrigger(triggerParams, <CominsTableIconButton\n {...triggerParams.getTriggerProps()} aria-label={`Filter ${columnLabel}`} data-active={active ? \"true\" : undefined}\n data-testid={`column-filter-trigger-${columnId}`} icon=\"filter\" />)}\n {open ? renderPopover(\n <span\n aria-label={`Filter ${columnLabel}`}\n className=\"comins-column-filter__popover\"\n data-testid={`column-filter-popover-${columnId}`}\n id={popoverId}\n ref={popoverRef}\n role=\"dialog\"\n tabIndex={-1}\n style={position}\n >\n <strong className=\"comins-column-filter__title\">{columnLabel}</strong>\n {valuesMode && values.params ? <ValueFilterPanel params={values.params} /> : <>\n <label className=\"comins-column-filter__field\">\n <span>Operator</span>\n <select\n data-testid={`column-filter-operator-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextOperator = event.currentTarget.value as CominsColumnConditionFilterOperator;\n setOperator(nextOperator);\n commitRule(nextOperator, value, valueTo);\n }}\n value={operator}\n >\n {getCominsColumnFilterOperators(kind).map((option) => (\n <option key={option} value={option}>{operatorLabels[option]}</option>\n ))}\n </select>\n </label>\n {requiresValue && kind === \"boolean\" ? (\n <label className=\"comins-column-filter__field\">\n <span>Value</span>\n <select\n data-testid={`column-filter-value-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextValue = event.currentTarget.value;\n setValue(nextValue);\n commitRule(operator, nextValue, valueTo);\n }}\n value={value}\n >\n <option value=\"true\">True</option>\n <option value=\"false\">False</option>\n </select>\n </label>\n ) : null}\n {requiresValue && kind !== \"boolean\" ? (\n <label className=\"comins-column-filter__field\">\n <span>{operator === \"between\" ? \"From\" : \"Value\"}</span>\n <input\n data-comins-column-filter-value-input=\"true\"\n data-testid={`column-filter-value-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextValue = event.currentTarget.value;\n setValue(nextValue);\n commitRule(operator, nextValue, valueTo);\n }}\n type={kind === \"date\" ? \"date\" : kind === \"number\" ? \"number\" : \"text\"}\n value={value}\n />\n </label>\n ) : null}\n {requiresValue && operator === \"between\" ? (\n <label className=\"comins-column-filter__field\">\n <span>To</span>\n <input\n data-comins-column-filter-value-input=\"true\"\n data-testid={`column-filter-value-to-${columnId}`}\n disabled={readOnly}\n onChange={(event) => {\n const nextValueTo = event.currentTarget.value;\n setValueTo(nextValueTo);\n commitRule(operator, value, nextValueTo);\n }}\n type={kind === \"date\" ? \"date\" : \"number\"}\n value={valueTo}\n />\n </label>\n ) : null}\n <button\n className=\"comins-column-filter__clear\"\n data-testid={`column-filter-clear-${columnId}`}\n disabled={readOnly || !active}\n onClick={() => {\n setOperator(getDefaultOperator(kind));\n setValue(kind === \"boolean\" ? \"true\" : \"\");\n setValueTo(\"\");\n emitRule(null);\n }}\n type=\"button\"\n >\n Clear\n </button>\n </>}\n </span>\n ) : null}\n </span>\n );\n}\n","import { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type React from \"react\";\n\nimport type {\n CominsCellComponentConfig,\n CominsCellComponentPayload,\n CominsTableComponentOption,\n CominsTableMenuItem,\n CominsHeaderComponentConfig,\n CominsHeaderComponentPayload,\n CominsVirtualListItem,\n} from \"./react/core-compat\";\n\ntype CominsAnyComponentPayload<TData, TValue> =\n | CominsCellComponentPayload<TData, TValue>\n | CominsHeaderComponentPayload<TData, TValue>;\ntype CominsAnyComponentConfig<TData, TValue> =\n | CominsCellComponentConfig<TData, TValue>\n | CominsHeaderComponentConfig<TData, TValue>;\n\nfunction mergeClassName(...values: Array<string | undefined>) {\n return values.filter(Boolean).join(\" \");\n}\n\nfunction resolveComponentProps<TProps>(value: unknown, payload: unknown): TProps {\n return (typeof value === \"function\" ? (value as (payload: unknown) => TProps)(payload) : value ?? {}) as TProps;\n}\n\nfunction resolveComponentOptions(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\"\n ? (value as (payload: unknown) => CominsTableComponentOption[])(payload)\n : value\n ) as CominsTableComponentOption[];\n}\n\nfunction resolveComponentMenuItems(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\" ? (value as (payload: unknown) => CominsTableMenuItem[])(payload) : value\n ) as CominsTableMenuItem[];\n}\n\nfunction resolveVirtualListItems(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\" ? (value as (payload: unknown) => CominsVirtualListItem[])(payload) : value\n ) as CominsVirtualListItem[];\n}\n\nfunction toSearchableText(value: React.ReactNode): string {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.map(toSearchableText).join(\" \");\n }\n\n return \"\";\n}\n\nfunction isMenuSelectableItem(\n item: CominsTableMenuItem,\n): item is Extract<CominsTableMenuItem, { value: string | number | boolean }> {\n return item.type !== \"divider\" && item.type !== \"label\";\n}\n\nfunction isNodeInside(element: HTMLElement | null, target: EventTarget | null) {\n return Boolean(element && target instanceof Node && element.contains(target));\n}\n\nfunction stopComponentEvent(event: React.SyntheticEvent | Event) {\n event.stopPropagation();\n}\n\nfunction preventAndStopComponentEvent(event: React.SyntheticEvent | Event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nfunction toComponentInputValue(value: unknown) {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\nfunction CominsInputComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"input\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.InputHTMLAttributes<HTMLInputElement>>(component.props, payload);\n const {\n defaultValue,\n onBlur,\n onChange: _propsOnChange,\n onClick,\n onCompositionEnd,\n onCompositionStart,\n onKeyDown,\n onMouseDown,\n onPointerDown,\n value,\n ...inputProps\n } = props;\n const propValue = toComponentInputValue(value ?? defaultValue);\n const [draftValue, setDraftValue] = useState(propValue);\n const lastCommittedValueRef = useRef(propValue);\n const composingRef = useRef(false);\n\n useEffect(() => {\n setDraftValue(propValue);\n lastCommittedValueRef.current = propValue;\n }, [propValue]);\n\n const commitValue = (event: React.FocusEvent<HTMLInputElement> | React.KeyboardEvent<HTMLInputElement>) => {\n if (draftValue === lastCommittedValueRef.current) {\n return;\n }\n\n lastCommittedValueRef.current = draftValue;\n component.onChange?.({ ...payload, event, value: draftValue } as never);\n component.onValueChange?.({ ...payload, value: draftValue } as never);\n };\n\n return (\n <input\n {...inputProps}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-input\", props.className)}\n onBlur={(event) => {\n onBlur?.(event);\n stopComponentEvent(event);\n commitValue(event);\n }}\n onChange={(event) => {\n stopComponentEvent(event);\n setDraftValue(event.currentTarget.value);\n }}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onCompositionStart={(event) => {\n composingRef.current = true;\n onCompositionStart?.(event);\n }}\n onCompositionEnd={(event) => {\n composingRef.current = false;\n onCompositionEnd?.(event);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n\n if (event.key === \"Enter\") {\n // 조합 확정용 Enter는 draft 커밋이나 포커스 이동으로 처리하지 않는다.\n if (composingRef.current || event.nativeEvent.isComposing || event.nativeEvent.keyCode === 229) return;\n event.preventDefault();\n commitValue(event);\n event.currentTarget.blur();\n }\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n value={draftValue}\n />\n );\n}\n\nfunction CominsCheckboxComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"checkbox\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.InputHTMLAttributes<HTMLInputElement>>(component.props, payload);\n const { checked, defaultChecked, onChange, onClick, onKeyDown, onMouseDown, onPointerDown, style, ...inputProps } = props;\n const [optimisticChecked, setOptimisticChecked] = useState(Boolean(checked ?? defaultChecked));\n\n useEffect(() => {\n if (checked !== undefined) {\n setOptimisticChecked(Boolean(checked));\n }\n }, [checked]);\n\n return (\n <input\n {...inputProps}\n checked={optimisticChecked}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-checkbox\", props.className)}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onChange={(event) => {\n onChange?.(event);\n stopComponentEvent(event);\n setOptimisticChecked(event.currentTarget.checked);\n component.onCheckedChange?.({ ...payload, checked: event.currentTarget.checked } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n style={{ height: 20, width: 20, ...style }}\n type=\"checkbox\"\n />\n );\n}\n\nfunction CominsToggleComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"toggle\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement> & { checked?: boolean }>(\n component.props,\n payload,\n );\n const { checked, ...buttonProps } = props;\n const { onClick, onKeyDown, onMouseDown, onPointerDown, ...restButtonProps } = buttonProps;\n const [optimisticChecked, setOptimisticChecked] = useState(Boolean(checked));\n\n useEffect(() => {\n if (checked !== undefined) {\n setOptimisticChecked(Boolean(checked));\n }\n }, [checked]);\n\n const buttonChildren =\n typeof buttonProps.children === \"string\" && (buttonProps.children === \"ON\" || buttonProps.children === \"OFF\")\n ? optimisticChecked\n ? \"ON\"\n : \"OFF\"\n : buttonProps.children;\n\n return (\n <button\n {...restButtonProps}\n aria-pressed={optimisticChecked}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-toggle\",\n buttonProps.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n const nextChecked = !optimisticChecked;\n setOptimisticChecked(nextChecked);\n component.onCheckedChange?.({ ...payload, checked: nextChecked } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n type={buttonProps.type ?? \"button\"}\n >\n {buttonChildren}\n </button>\n );\n}\n\ntype HeaderMenuOpenRequest = (nextOpen: boolean, event?: Event | React.SyntheticEvent) => void;\ntype HeaderMenuElementRef = React.RefObject<HTMLElement | null>;\n\n// 등록 리스너와 cleanup이 이전 render의 component/payload context를 붙잡지 않도록 별도 scope에서 만든다.\nfunction installHeaderMenuDismissListeners(\n doc: Document,\n triggerRef: HeaderMenuElementRef,\n menuRef: HeaderMenuElementRef,\n requestOpenRef: React.RefObject<HeaderMenuOpenRequest>,\n) {\n const handlePointerDown = (event: PointerEvent) => {\n if (isNodeInside(triggerRef.current, event.target) || isNodeInside(menuRef.current, event.target)) {\n return;\n }\n requestOpenRef.current(false, event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n requestOpenRef.current(false, event);\n triggerRef.current?.focus();\n }\n };\n doc.addEventListener(\"pointerdown\", handlePointerDown);\n doc.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n doc.removeEventListener(\"pointerdown\", handlePointerDown);\n doc.removeEventListener(\"keydown\", handleKeyDown);\n };\n}\n\nfunction installHeaderMenuPositionListeners(\n win: Window,\n triggerRef: HeaderMenuElementRef,\n menuRef: HeaderMenuElementRef,\n setMenuPosition: React.Dispatch<React.SetStateAction<React.CSSProperties>>,\n) {\n const updateMenuPosition = () => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n const rect = trigger.getBoundingClientRect();\n const menuWidth = Math.max(menuRef.current?.offsetWidth ?? 136, 136);\n setMenuPosition({\n left: Math.max(8, Math.min(rect.left, win.innerWidth - menuWidth - 8)),\n position: \"fixed\",\n top: Math.min(rect.bottom + 4, win.innerHeight - 8),\n zIndex: 9999,\n });\n };\n updateMenuPosition();\n win.addEventListener(\"resize\", updateMenuPosition);\n win.addEventListener(\"scroll\", updateMenuPosition, true);\n return () => {\n win.removeEventListener(\"resize\", updateMenuPosition);\n win.removeEventListener(\"scroll\", updateMenuPosition, true);\n };\n}\n\nfunction CominsHeaderMenuComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsHeaderComponentConfig<TData, TValue>, { type: \"menu\" }>;\n payload: CominsHeaderComponentPayload<TData, TValue>;\n}) {\n const [open, setOpen] = useState(false);\n const menuId = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [menuPosition, setMenuPosition] = useState<React.CSSProperties>({\n left: 0,\n position: \"fixed\",\n top: 0,\n });\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement>>(component.props, payload);\n const items = useMemo(() => resolveComponentMenuItems(component.items, payload), [component.items, payload]);\n\n const requestOpen = (nextOpen: boolean, event?: Event | React.SyntheticEvent) => {\n if (nextOpen === open) {\n return;\n }\n\n const beforeResult = component.onBeforeChange?.({ ...payload, event, open: nextOpen } as never);\n\n if (beforeResult === false) {\n return;\n }\n\n setOpen(nextOpen);\n component.onOpenChange?.({ ...payload, event, open: nextOpen } as never);\n };\n\n const requestOpenRef = useRef<HeaderMenuOpenRequest>(requestOpen);\n useLayoutEffect(() => {\n // 완료되지 않은 render의 설정이 native event에 노출되지 않도록 commit된 콜백만 갱신한다.\n requestOpenRef.current = requestOpen;\n });\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n return installHeaderMenuDismissListeners(document, triggerRef, menuRef, requestOpenRef);\n }, [open]);\n\n useLayoutEffect(() => {\n if (!open || typeof window === \"undefined\") {\n return undefined;\n }\n return installHeaderMenuPositionListeners(window, triggerRef, menuRef, setMenuPosition);\n }, [open]);\n\n const menu = open ? (\n <span\n aria-label=\"Header menu\"\n className=\"comins-table__component-menu-popover\"\n id={menuId}\n ref={menuRef}\n role=\"menu\"\n style={menuPosition}\n >\n {items.map((item, index) => {\n if (item.type === \"divider\") {\n return (\n <span\n aria-orientation=\"horizontal\"\n className=\"comins-table__component-menu-divider\"\n key={`divider-${index}`}\n role=\"separator\"\n />\n );\n }\n\n if (item.type === \"label\") {\n return (\n <span className=\"comins-table__component-menu-label\" key={`label-${index}`} role=\"presentation\">\n {item.label}\n </span>\n );\n }\n\n return (\n <button\n className=\"comins-table__component-menu-item\"\n disabled={item.disabled}\n key={`${String(item.value)}-${index}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n\n if (item.disabled || !isMenuSelectableItem(item)) {\n return;\n }\n\n requestOpen(false, event);\n component.onSelect?.({ ...payload, event, item, value: item.value } as never);\n }}\n onKeyDown={(event) => {\n stopComponentEvent(event);\n if (event.key === \"Escape\") {\n event.preventDefault();\n requestOpen(false, event);\n triggerRef.current?.focus();\n }\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"menuitem\"\n type=\"button\"\n >\n {item.label}\n </button>\n );\n })}\n </span>\n ) : null;\n\n return (\n <span className=\"comins-table__component comins-table__component-menu\">\n <button\n {...props}\n aria-controls={open ? menuId : undefined}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label={props[\"aria-label\"] ?? \"Header menu\"}\n className={mergeClassName(\"comins-table__component-menu-trigger\", props.className)}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n requestOpen(!open, event);\n }}\n onKeyDown={(event) => {\n props.onKeyDown?.(event);\n\n if (event.key === \"Escape\" && open) {\n preventAndStopComponentEvent(event);\n requestOpen(false, event);\n return;\n }\n\n stopComponentEvent(event);\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={(event) => {\n props.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n ref={triggerRef}\n type={props.type ?? \"button\"}\n >\n {props.children ?? \"메뉴\"}\n </button>\n {menu}\n </span>\n );\n}\n\nfunction CominsCellVirtualListComponent<TData, TValue>({\n component,\n interaction,\n payload,\n}: {\n component: Extract<CominsCellComponentConfig<TData, TValue>, { type: \"virtual-list\" }>;\n interaction?: CominsBuiltInComponentInteraction;\n payload: CominsCellComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<\n React.HTMLAttributes<HTMLDivElement> & {\n height?: number | string;\n itemHeight?: number;\n limit?: number;\n more?: boolean;\n searchable?: boolean;\n }\n >(component.props, payload);\n const {\n height,\n itemHeight: itemHeightProp,\n limit: limitProp,\n more = false,\n searchable = false,\n style,\n ...rootProps\n } = props;\n const items = useMemo(() => resolveVirtualListItems(component.items, payload), [component.items, payload]);\n const limit = Math.max(1, Number(limitProp ?? 5));\n const itemHeight = Math.max(1, Number(itemHeightProp ?? 28));\n const defaultHeight = itemHeight * 5;\n const hasExplicitHeight = height !== undefined || style?.height !== undefined;\n const [query, setQuery] = useState(\"\");\n const [expanded, setExpanded] = useState(false);\n const [scrollTop, setScrollTop] = useState(0);\n const [selectedValue, setSelectedValue] = useState<string | number | boolean | null>(null);\n const [viewportHeight, setViewportHeight] = useState(defaultHeight);\n const itemsViewportRef = useRef<HTMLDivElement>(null);\n const isSingleRowSelected = payload.row.selected && payload.selection.selectedRowCount === 1;\n const searchEnabled = Boolean(searchable && isSingleRowSelected);\n const activeQuery = searchEnabled ? query : \"\";\n\n useEffect(() => {\n setExpanded(false);\n setScrollTop(0);\n }, [items.length, limit]);\n\n useLayoutEffect(() => {\n const viewport = itemsViewportRef.current;\n\n if (!viewport) {\n return;\n }\n\n const measuredHeight = viewport.clientHeight > 0 ? viewport.clientHeight : defaultHeight;\n\n setViewportHeight(hasExplicitHeight ? measuredHeight : Math.min(measuredHeight, defaultHeight));\n }, [defaultHeight, expanded, activeQuery, hasExplicitHeight]);\n\n useEffect(() => {\n const viewport = itemsViewportRef.current;\n\n if (!viewport) {\n return;\n }\n\n viewport.scrollTop = 0;\n setScrollTop(0);\n }, [activeQuery]);\n\n useEffect(() => {\n if (isSingleRowSelected) {\n return;\n }\n\n const viewport = itemsViewportRef.current;\n\n if (viewport) {\n viewport.scrollTop = 0;\n }\n\n setExpanded(false);\n setQuery(\"\");\n setScrollTop(0);\n }, [isSingleRowSelected]);\n\n const filteredEntries = useMemo(() => {\n const normalizedQuery = activeQuery.trim().toLowerCase();\n\n return items\n .map((item, itemIndex) => ({ item, itemIndex }))\n .filter(({ item, itemIndex }) => {\n if (!normalizedQuery) {\n return true;\n }\n\n if (component.searchFilter) {\n return component.searchFilter({ item, itemIndex, value: activeQuery });\n }\n\n return toSearchableText(item.label).toLowerCase().includes(normalizedQuery);\n });\n }, [activeQuery, component, items]);\n const hasOverflow = filteredEntries.length > limit;\n const virtualized = Boolean(\n isSingleRowSelected && (expanded || activeQuery.trim().length > 0 || (!more && hasOverflow)),\n );\n const showOverflowControl = hasOverflow && !virtualized;\n const overscan = searchEnabled && !expanded ? 0 : 2;\n const safeViewportHeight = Math.max(\n itemHeight,\n hasExplicitHeight ? viewportHeight || defaultHeight : Math.min(viewportHeight || defaultHeight, defaultHeight),\n );\n const visibleStart = Math.max(0, Math.floor(Math.max(0, scrollTop) / itemHeight) - overscan);\n const visibleEnd = Math.min(\n filteredEntries.length,\n Math.ceil((Math.max(0, scrollTop) + safeViewportHeight) / itemHeight) + overscan,\n );\n const renderedEntries = virtualized\n ? filteredEntries.slice(visibleStart, visibleEnd)\n : filteredEntries.slice(0, hasOverflow ? limit : filteredEntries.length);\n const topSpacerHeight = virtualized ? visibleStart * itemHeight : 0;\n const bottomSpacerHeight = virtualized ? Math.max(0, filteredEntries.length - visibleEnd) * itemHeight : 0;\n const listId = `${String(payload.row.id)}-${payload.column.id}`;\n const rootStyle = {\n ...style,\n \"--comins-table-virtual-list-item-height\": `${itemHeight}px`,\n height: height ?? style?.height ?? defaultHeight,\n } as React.CSSProperties;\n\n const selectItem = (\n item: CominsVirtualListItem,\n itemIndex: number,\n event: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>,\n ) => {\n if (item.disabled) {\n return;\n }\n\n const accepted = interaction?.requestRowSelection?.({ event, mode: \"row-click\" });\n\n if (accepted === false) {\n return;\n }\n\n setSelectedValue(item.value);\n component.onClickItem?.({ ...payload, event, item, itemIndex, value: item.value } as never);\n };\n\n return (\n <div\n {...rootProps}\n aria-label={rootProps[\"aria-label\"] ?? \"Virtual list\"}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-virtual-list\", rootProps.className)}\n data-comins-virtual-list-expanded={virtualized ? \"true\" : undefined}\n data-comins-virtual-list-visible-count={renderedEntries.length}\n data-testid={`virtual-list-${listId}`}\n onClick={(event) => {\n rootProps.onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onContextMenu={stopComponentEvent}\n onDoubleClick={stopComponentEvent}\n onMouseUp={stopComponentEvent}\n onPointerUp={stopComponentEvent}\n onPointerMove={stopComponentEvent}\n onPointerEnter={stopComponentEvent}\n onMouseOver={stopComponentEvent}\n onMouseOut={stopComponentEvent}\n onPointerLeave={stopComponentEvent}\n onBlur={stopComponentEvent}\n onFocus={stopComponentEvent}\n onInput={stopComponentEvent}\n onChange={stopComponentEvent}\n onMouseMove={stopComponentEvent}\n onMouseEnter={stopComponentEvent}\n onMouseLeave={stopComponentEvent}\n onTouchStart={stopComponentEvent}\n onTouchMove={stopComponentEvent}\n onTouchEnd={stopComponentEvent}\n onWheel={(event) => {\n rootProps.onWheel?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n rootProps.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n role=\"listbox\"\n style={rootStyle}\n >\n <div\n className=\"comins-table__component-virtual-list-items\"\n onScroll={(event) => {\n stopComponentEvent(event);\n setScrollTop(event.currentTarget.scrollTop);\n const measuredHeight = event.currentTarget.clientHeight > 0 ? event.currentTarget.clientHeight : defaultHeight;\n setViewportHeight(hasExplicitHeight ? measuredHeight : Math.min(measuredHeight, defaultHeight));\n }}\n ref={itemsViewportRef}\n role=\"presentation\"\n >\n {topSpacerHeight > 0 ? (\n <span aria-hidden=\"true\" className=\"comins-table__component-virtual-list-spacer\" style={{ height: topSpacerHeight }} />\n ) : null}\n {renderedEntries.map(({ item, itemIndex }) => (\n <button\n aria-selected={selectedValue === item.value}\n className=\"comins-table__component-virtual-list-item\"\n data-comins-virtual-list-item=\"true\"\n disabled={item.disabled}\n key={`${String(item.value)}-${itemIndex}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n selectItem(item, itemIndex, event);\n }}\n onContextMenu={(event) => {\n stopComponentEvent(event);\n\n if (item.disabled) {\n return;\n }\n\n component.onContextMenuItem?.({ ...payload, event, item, itemIndex, value: item.value } as never);\n }}\n onKeyDown={(event) => {\n stopComponentEvent(event);\n\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n selectItem(item, itemIndex, event);\n }\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"option\"\n type=\"button\"\n >\n <span className=\"comins-table__component-virtual-list-item-label\">{item.label}</span>\n </button>\n ))}\n {bottomSpacerHeight > 0 ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-table__component-virtual-list-spacer\"\n style={{ height: bottomSpacerHeight }}\n />\n ) : null}\n </div>\n <div className=\"comins-table__component-virtual-list-controls\">\n {more && hasOverflow ? (\n <button\n aria-expanded={virtualized}\n aria-label=\"전체 목록 보기\"\n className=\"comins-table__component-virtual-list-overflow comins-table__component-virtual-list-more\"\n data-testid={`virtual-list-overflow-${listId}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n\n if (interaction?.requestRowSelection?.({ event, mode: \"exclusive\" }) === false) {\n return;\n }\n\n setExpanded(true);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n type=\"button\"\n >\n ...\n </button>\n ) : showOverflowControl ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-table__component-virtual-list-overflow comins-table__component-virtual-list-more\"\n data-testid={`virtual-list-overflow-${listId}`}\n >\n ...\n </span>\n ) : null}\n {searchEnabled ? (\n <input\n aria-label={`${rootProps[\"aria-label\"] ?? \"Virtual list\"} 검색`}\n className=\"comins-table__component-virtual-list-search\"\n data-testid={`virtual-list-search-${listId}`}\n onChange={(event) => {\n stopComponentEvent(event);\n setQuery(event.currentTarget.value);\n }}\n onClick={stopComponentEvent}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n placeholder=\"검색\"\n value={query}\n />\n ) : null}\n </div>\n </div>\n );\n}\n\nexport type CominsBuiltInComponentInteraction = {\n requestRowSelection?: (request: {\n event: React.KeyboardEvent<HTMLButtonElement> | React.MouseEvent<HTMLButtonElement>;\n mode: \"exclusive\" | \"row-click\";\n }) => boolean;\n};\n\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsCellComponentConfig<TData, TValue>,\n payload: CominsCellComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsHeaderComponentConfig<TData, TValue>,\n payload: CominsHeaderComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsAnyComponentConfig<TData, TValue>,\n payload: CominsAnyComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode {\n if (component.type === \"menu\") {\n return <CominsHeaderMenuComponent component={component} payload={payload as CominsHeaderComponentPayload<TData, TValue>} />;\n }\n\n if (component.type === \"virtual-list\") {\n return (\n <CominsCellVirtualListComponent\n component={component}\n interaction={interaction}\n payload={payload as CominsCellComponentPayload<TData, TValue>}\n />\n );\n }\n\n if (component.type === \"button\") {\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement>>(component.props, payload);\n const { onClick, onKeyDown, onMouseDown, onPointerDown, ...buttonProps } = props;\n\n return (\n <button\n {...buttonProps}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-button\",\n props.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n component.onClick?.({ ...payload, event } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n type={props.type ?? \"button\"}\n />\n );\n }\n\n if (component.type === \"input\") {\n return <CominsInputComponent component={component} payload={payload} />;\n }\n\n if (component.type === \"checkbox\") {\n return <CominsCheckboxComponent component={component} payload={payload} />;\n }\n\n if (component.type === \"select\") {\n const props = resolveComponentProps<React.SelectHTMLAttributes<HTMLSelectElement>>(component.props, payload);\n const options = resolveComponentOptions(component.options, payload);\n const { onChange, onClick, onKeyDown, onMouseDown, onPointerDown, ...selectProps } = props;\n\n return (\n <select\n {...selectProps}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-select\",\n props.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onChange={(event) => {\n onChange?.(event);\n stopComponentEvent(event);\n component.onValueChange?.({ ...payload, value: event.currentTarget.value } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n >\n {options.map((option) => (\n <option disabled={option.disabled} key={String(option.value)} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n if (component.type === \"radio\") {\n const props = resolveComponentProps<\n React.HTMLAttributes<HTMLDivElement> & { value?: string | number | boolean }\n >(component.props, payload);\n const options = resolveComponentOptions(component.options, payload);\n const selectedValue =\n props.value ?? (\"value\" in payload ? (payload as CominsCellComponentPayload<TData, TValue>).value : undefined);\n const groupName =\n \"row\" in payload\n ? `${payload.column.id}-${String((payload as CominsCellComponentPayload<TData, TValue>).row.id)}-radio`\n : `${payload.column.id}-header-radio`;\n const { value: _value, ...divProps } = props;\n\n return (\n <div\n {...divProps}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-radio\", divProps.className)}\n onClick={(event) => {\n divProps.onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={(event) => {\n divProps.onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n divProps.onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n divProps.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n role=\"radiogroup\"\n >\n {options.map((option) => (\n <label key={String(option.value)} onClick={stopComponentEvent} onMouseDown={stopComponentEvent}>\n <input\n checked={selectedValue === undefined ? undefined : String(selectedValue) === String(option.value)}\n disabled={option.disabled}\n name={groupName}\n onClick={stopComponentEvent}\n onChange={(event) => {\n stopComponentEvent(event);\n\n if (event.currentTarget.checked) {\n component.onValueChange?.({ ...payload, value: String(option.value) } as never);\n }\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n style={{ height: 20, width: 20 }}\n type=\"radio\"\n value={String(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n );\n }\n\n if (component.type === \"toggle\") {\n return <CominsToggleComponent component={component} payload={payload} />;\n }\n\n const props = resolveComponentProps<React.HTMLAttributes<HTMLDivElement> & { max?: number; value?: number }>(\n component.props,\n payload,\n );\n const value = Number(props.value ?? 0);\n const max = Math.max(1, Number(props.max ?? 100));\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div\n {...props}\n aria-valuemax={max}\n aria-valuemin={0}\n aria-valuenow={value}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-progress\", props.className)}\n onClick={stopComponentEvent}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"progressbar\"\n >\n <span style={{ width: `${percent}%` }} />\n </div>\n );\n}\n","import { useLayoutEffect, useRef } from \"react\";\nimport type * as React from \"react\";\nimport type { createCominsDetailFocusRestorer } from \"./browser/scroll\";\n\nimport { CominsTableIconButton } from \"./table-icons\";\n\nexport function CominsRowDetailToggle(props: {\n controlsId?: string;\n disabled: boolean;\n expanded: boolean;\n id: string;\n label: string;\n onElement: (element: HTMLButtonElement | null) => void;\n onToggle: () => void;\n testId: string;\n}) {\n return (\n <CominsTableIconButton\n aria-controls={props.expanded ? props.controlsId : undefined}\n aria-expanded={props.expanded}\n aria-label={props.label}\n className=\"comins-row-detail-expander\"\n data-comins-row-leading-control=\"disclosure\"\n data-testid={props.testId}\n disabled={props.disabled}\n icon={props.expanded ? \"disclosureExpanded\" : \"disclosureCollapsed\"}\n id={props.id}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.onToggle();\n }}\n onKeyDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n ref={props.onElement}\n />\n );\n}\n\nexport function CominsRowDetailRow(props: {\n children: React.ReactNode;\n colSpan: number;\n contentId: string;\n fixedHeight?: number;\n labelId: string;\n onContentElement: (element: HTMLDivElement | null) => void;\n ownerId: string;\n testId: string;\n getToggleElement: () => HTMLButtonElement | null;\n restoreFocus: ReturnType<typeof createCominsDetailFocusRestorer>[\"restore\"];\n}) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const getToggleElementRef = useRef(props.getToggleElement);\n const restoreFocusRef = useRef(props.restoreFocus);\n const onContentElementRef = useRef(props.onContentElement);\n const automatic = props.fixedHeight === undefined;\n\n getToggleElementRef.current = props.getToggleElement;\n restoreFocusRef.current = props.restoreFocus;\n onContentElementRef.current = props.onContentElement;\n\n useLayoutEffect(() => {\n const element = contentRef.current;\n\n onContentElementRef.current(element);\n\n return () => onContentElementRef.current(null);\n }, [automatic]);\n\n useLayoutEffect(() => {\n const element = contentRef.current;\n\n return () => {\n restoreFocusRef.current(element, () => getToggleElementRef.current());\n };\n }, []);\n\n return (\n <tr className=\"comins-table__detail-row\" data-detail-for={props.ownerId}>\n <td className=\"comins-table__detail-cell\" colSpan={Math.max(1, props.colSpan)}>\n <div\n aria-labelledby={props.labelId}\n className=\"comins-table__detail-content\"\n data-testid={props.testId}\n id={props.contentId}\n ref={contentRef}\n role=\"region\"\n style={props.fixedHeight === undefined ? undefined : { height: props.fixedHeight }}\n >\n {props.children}\n </div>\n </td>\n </tr>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type EffectCallback, type PointerEvent as ReactPointerEvent, type RefObject } from \"react\";\nimport type { CominsCellAddress, CominsCellRange, CominsRowId, CominsTableState } from \"./react/core-compat\";\nimport { getCominsDragAutoScrollVelocity, getCoreCellBounds as bounds, getCoreCellRange as rangeOf, resolveCoreFillTarget } from \"./core/selection/navigation\";\nimport { applyCominsDragScroll, captureCominsPointer, focusCominsPointerTarget, registerCominsPointerListeners, startCominsPointerFrames } from \"./browser/pointer\";\n\nfunction createCellFillCancelEffect(cancelRef: RefObject<(() => void) | null>): EffectCallback {\n return () => () => cancelRef.current?.();\n}\n\n/** Private gesture controller. All writes go through the owning Table's batch callback. */\nexport function useCominsCellFill<TData>(options: {\n enabled: boolean;\n state: CominsTableState<TData>;\n rowIds: readonly CominsRowId[];\n columnIds: readonly string[];\n root: RefObject<HTMLDivElement | null>;\n viewport: RefObject<HTMLDivElement | null>;\n addressAtPoint: (x: number, y: number) => CominsCellAddress | null;\n canUseRange: (range: CominsCellRange) => boolean;\n onFill: (source: CominsCellRange, target: CominsCellRange) => boolean;\n registerGesture: (cleanup: () => void) => void;\n releaseGesture: (cleanup: () => void) => void;\n scrollHorizontal: (delta: number) => void;\n}) {\n const latest = useRef(options); latest.current = options;\n const cancelRef = useRef<(() => void) | null>(null);\n const suppressClick = useRef(false);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [preview, setPreview] = useState<CominsCellRange | null>(null);\n const [menu, setMenu] = useState<{ x: number; y: number } | null>(null);\n const selection = options.state.selection;\n const source = options.enabled ? selection.range ?? ((selection.cells?.length ?? 0) > 1 || !selection.cell ? null : { anchor: selection.cell, focus: selection.cell }) : null;\n const box = source ? bounds(source, options.rowIds, options.columnIds) : null;\n const closeMenu = (focus = true) => { setMenu(null); if (focus) focusCominsPointerTarget(triggerRef.current); };\n useEffect(createCellFillCancelEffect(cancelRef), []);\n useEffect(() => {\n if (!menu) return;\n menuRef.current?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus();\n const dismiss = (event: Event) => { if (!menuRef.current?.contains(event.target as Node) && !triggerRef.current?.contains(event.target as Node)) closeMenu(false); };\n const key = (event: KeyboardEvent) => { if (event.key === \"Escape\") { event.preventDefault(); closeMenu(); } };\n const scroll = () => closeMenu(false);\n document.addEventListener(\"pointerdown\", dismiss); document.addEventListener(\"keydown\", key);\n window.addEventListener(\"scroll\", scroll, true); window.addEventListener(\"blur\", scroll);\n return () => { document.removeEventListener(\"pointerdown\", dismiss); document.removeEventListener(\"keydown\", key); window.removeEventListener(\"scroll\", scroll, true); window.removeEventListener(\"blur\", scroll); };\n }, [menu]);\n useEffect(() => { cancelRef.current?.(); setMenu(null); }, [options.enabled, options.state.rows, options.state.columnOrder, options.state.selection, options.rowIds]);\n\n const previewBox = options.enabled && preview ? bounds(preview, options.rowIds, options.columnIds) : null;\n const rowPositions = useMemo(() => options.enabled ? new Map(options.rowIds.map((id, index) => [id, index])) : null, [options.enabled, options.rowIds]);\n const columnPositions = useMemo(() => options.enabled ? new Map(options.columnIds.map((id, index) => [id, index])) : null, [options.enabled, options.columnIds]);\n\n const fillSelection = (direction: \"down\" | \"right\") => {\n // Imperative callers may retain a method from an earlier render.\n const current = latest.current, selection = current.state.selection;\n const source = current.enabled ? selection.range ?? ((selection.cells?.length ?? 0) > 1 || !selection.cell ? null : { anchor: selection.cell, focus: selection.cell }) : null;\n const box = source ? bounds(source, current.rowIds, current.columnIds) : null;\n if (!source || !box || !current.canUseRange(source)) return false;\n const from = direction === \"down\" ? { ...box, bottom: box.top } : { ...box, right: box.left };\n if (direction === \"down\" ? box.top === box.bottom : box.left === box.right) return false;\n return current.onFill(rangeOf(from, current.rowIds, current.columnIds), source);\n };\n // Hook 순서는 유지하되 비활성 기능의 제스처·컨트롤은 생성하지 않는다.\n if (!options.enabled) {\n return { fillSelection, preview, isPreview: () => false, handleAddress: null, handle: null, menu: null };\n }\n\n const begin = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (!source || !box || event.button !== 0 || !options.canUseRange(source)) return;\n event.preventDefault(); event.stopPropagation(); focusCominsPointerTarget(event.currentTarget);\n // Touch keeps the gesture on this control while hit testing uses viewport coordinates.\n const releasePointer = captureCominsPointer(event.currentTarget, event.pointerId);\n setMenu(null); suppressClick.current = false;\n const initial = options, initialSource = source, pointerId = event.pointerId;\n let x = event.clientX, y = event.clientY, moved = false, target: CominsCellRange | null = null, targetKey = \"\", lastTime = 0;\n const validSnapshot = () => latest.current.enabled && latest.current.state.rows === initial.state.rows\n && latest.current.state.columnOrder === initial.state.columnOrder && latest.current.state.selection === initial.state.selection\n && latest.current.rowIds === initial.rowIds;\n const update = () => {\n if (!validSnapshot()) { cleanup(); return; }\n const viewport = initial.viewport.current;\n if (!viewport) return;\n const rect = viewport.getBoundingClientRect();\n const address = latest.current.addressAtPoint(Math.max(rect.left + 1, Math.min(rect.right - 1, x)), Math.max(rect.top + 1, Math.min(rect.bottom - 1, y)));\n const candidate = resolveCoreFillTarget({ source: initialSource, address, rowIds: initial.rowIds, columnIds: initial.columnIds });\n const next = candidate && latest.current.canUseRange(candidate) ? candidate : null;\n const key = JSON.stringify(next);\n if (key !== targetKey) { targetKey = key; target = next; setPreview(next); }\n };\n const tick = (time: number) => {\n if (!validSnapshot()) { cleanup(); return; }\n const viewport = initial.viewport.current;\n if (moved && viewport) {\n const rect = viewport.getBoundingClientRect(), deltaMs = lastTime ? time - lastTime : 16;\n applyCominsDragScroll(viewport, { top: rect.top, bottom: rect.bottom, clientY: y, deltaMs });\n const horizontal = getCominsDragAutoScrollVelocity({ top: rect.left, bottom: rect.right, clientY: x });\n if (horizontal) latest.current.scrollHorizontal(horizontal * Math.min(deltaMs, 32) / 1000);\n update();\n }\n lastTime = time;\n };\n const move = (next: PointerEvent) => {\n if (next.pointerId !== pointerId) return;\n x = next.clientX; y = next.clientY;\n moved ||= Math.hypot(x - event.clientX, y - event.clientY) >= 4;\n if (moved) { suppressClick.current = true; update(); }\n };\n const cleanup = () => {\n stopFrames(); removeListeners(); releasePointer();\n initial.releaseGesture(cleanup);\n if (cancelRef.current === cleanup) cancelRef.current = null;\n setPreview(null);\n };\n const cancel = () => { suppressClick.current = true; cleanup(); };\n const up = (next: PointerEvent) => {\n if (next.pointerId !== pointerId) return;\n const commit = moved && target && validSnapshot() ? target : null;\n cleanup();\n if (commit) latest.current.onFill(initialSource, commit);\n };\n const key = (next: KeyboardEvent) => { if (next.key === \"Escape\") { next.preventDefault(); cancel(); } };\n initial.registerGesture(cleanup); cancelRef.current = cleanup;\n const removeListeners = registerCominsPointerListeners({ move, up, cancel, blur: cancel, key, keyCapture: true });\n const stopFrames = startCominsPointerFrames(tick);\n };\n const handleAddress = box && source && options.canUseRange(source) ? rangeOf(box, options.rowIds, options.columnIds).focus : null;\n return {\n fillSelection,\n preview,\n isPreview: (address: CominsCellAddress) => {\n if (!previewBox) return false;\n const row = rowPositions?.get(address.rowId) ?? -1, column = columnPositions?.get(address.columnId) ?? -1;\n return row >= previewBox.top && row <= previewBox.bottom && column >= previewBox.left && column <= previewBox.right;\n },\n handleAddress,\n handle: <button type=\"button\" aria-label=\"Fill selection\" aria-haspopup=\"dialog\" aria-expanded={Boolean(menu)} className=\"comins-fill-handle\"\n ref={triggerRef} data-testid=\"fill-handle\" onPointerDown={begin} onMouseDown={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()} onClick={event => {\n event.stopPropagation();\n if (suppressClick.current) { suppressClick.current = false; return; }\n const rect = event.currentTarget.getBoundingClientRect();\n setMenu(menu ? null : { x: Math.max(4, Math.min(window.innerWidth - 188, rect.right)), y: Math.max(4, Math.min(window.innerHeight - 90, rect.bottom)) });\n }}><span aria-hidden=\"true\" /></button>,\n menu: menu && box ? <div className=\"comins-fill-menu\" role=\"dialog\" aria-label=\"Fill selection\" ref={menuRef}\n style={{ left: menu.x, top: menu.y }} onPointerDown={event => event.stopPropagation()} onKeyDown={event => { event.stopPropagation(); if (event.key === \"Escape\") { event.preventDefault(); closeMenu(); } }}\n onBlur={event => { if (!event.currentTarget.contains(event.relatedTarget as Node)) closeMenu(false); }}>\n <button type=\"button\" disabled={box.top === box.bottom} onClick={() => { fillSelection(\"down\"); closeMenu(); }}>Fill down</button>\n <button type=\"button\" disabled={box.left === box.right} onClick={() => { fillSelection(\"right\"); closeMenu(); }}>Fill right</button>\n </div> : null,\n };\n}\n","import type { CominsRowId, CominsSortModel, CominsTableRuntimeColumn } from \"../model\";\nexport type CominsRowGroupAggregation = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\nexport type CominsRowGroupDropPosition = \"after\" | \"before\";\nexport type CominsRowGroupingConfig<TData, TGroup> = {\n aggregations?: Readonly<Partial<Record<string, CominsRowGroupAggregation>>>;\n groups: readonly TGroup[];\n getGroupId: (group: TGroup) => CominsRowId;\n};\nexport type CominsRowGroupingSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\nexport type CominsAggregateState =\n | { count: number; kind: \"avg\"; sum: number }\n | { count: number; kind: \"count\" }\n | { hasValue: boolean; kind: \"max\" | \"min\"; value: number }\n | { count: number; kind: \"sum\"; sum: number };\n\nexport type CominsNormalizedGroup<TGroup> = {\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n};\n\nexport type CominsGroupNode<TGroup> = CominsNormalizedGroup<TGroup> & {\n aggregationState: ReadonlyMap<string, CominsAggregateState>;\n leafSourceIndexes: readonly number[];\n};\n\nexport type CominsGroupModel<TGroup> = {\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsGroupNode<TGroup>>;\n};\n\nexport type CominsOrderedGroupModel<TGroup> = CominsGroupModel<TGroup> & {\n orderedLeafSourceIndexesById: ReadonlyMap<CominsRowId, readonly number[]>;\n};\n\nexport type CominsGroupingProjectionEntry =\n | {\n groupId: CominsRowId;\n key: string;\n kind: \"group\";\n }\n | {\n dataIndex: number;\n key: string;\n kind: \"data\";\n rowId: CominsRowId;\n visibleLeafIndex: number;\n };\n\nconst COMINS_ROW_GROUP_AGGREGATIONS = new Set<CominsRowGroupAggregation>([\n \"avg\",\n \"count\",\n \"max\",\n \"min\",\n \"sum\",\n]);\n\nfunction getNestedFieldValue(value: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((current, key) => {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n\n return (current as Record<string, unknown>)[key];\n }, value);\n}\n\nfunction getColumnValue<TData>(row: TData, column: CominsTableRuntimeColumn<TData>) {\n return getNestedFieldValue(row, column.field);\n}\n\nfunction createAggregateState(aggregation: CominsRowGroupAggregation): CominsAggregateState {\n switch (aggregation) {\n case \"avg\":\n return { count: 0, kind: \"avg\", sum: 0 };\n case \"count\":\n return { count: 0, kind: \"count\" };\n case \"max\":\n case \"min\":\n return { hasValue: false, kind: aggregation, value: 0 };\n case \"sum\":\n return { count: 0, kind: \"sum\", sum: 0 };\n }\n}\n\nfunction updateAggregateState(state: CominsAggregateState, value: unknown) {\n if (state.kind === \"count\") {\n state.count += 1;\n return;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return;\n }\n\n if (state.kind === \"avg\" || state.kind === \"sum\") {\n state.count += 1;\n state.sum += value;\n return;\n }\n\n if (!state.hasValue) {\n state.hasValue = true;\n state.value = value;\n return;\n }\n\n state.value = state.kind === \"min\"\n ? Math.min(state.value, value)\n : Math.max(state.value, value);\n}\n\nexport function getCominsAggregateValue(state: CominsAggregateState): number | null {\n switch (state.kind) {\n case \"avg\":\n return state.count === 0 ? null : state.sum / state.count;\n case \"count\":\n return state.count;\n case \"max\":\n case \"min\":\n return state.hasValue ? state.value : null;\n case \"sum\":\n return state.count === 0 ? null : state.sum;\n }\n}\n\nexport function getCominsGroupSlotKey(groupId: CominsRowId) {\n return `group:${typeof groupId}:${encodeURIComponent(String(groupId))}`;\n}\n\nexport function normalizeCominsRowGrouping<TData, TGroup>(input: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n config: CominsRowGroupingConfig<TData, TGroup>;\n}) {\n const columnById = new Map(input.columns.map((column) => [column.id, column] as const));\n const aggregations = new Map<string, CominsRowGroupAggregation>();\n const aggregationColumns = new Map<string, CominsTableRuntimeColumn<TData>>();\n\n for (const [columnId, aggregation] of Object.entries(input.config.aggregations ?? {})) {\n if (\n columnById.has(columnId) &&\n typeof aggregation === \"string\" &&\n COMINS_ROW_GROUP_AGGREGATIONS.has(aggregation as CominsRowGroupAggregation)\n ) {\n aggregations.set(columnId, aggregation as CominsRowGroupAggregation);\n aggregationColumns.set(columnId, columnById.get(columnId)!);\n }\n }\n\n const groupIds: CominsRowId[] = [];\n const groupsById = new Map<CominsRowId, CominsNormalizedGroup<TGroup>>();\n const suppliedGroups = Array.isArray(input.config.groups) ? input.config.groups : [];\n\n for (const group of suppliedGroups) {\n const groupId = input.config.getGroupId(group);\n\n if (groupsById.has(groupId)) {\n continue;\n }\n\n const groupIndex = groupIds.length;\n const normalizedGroup = {\n group,\n groupId,\n groupIndex,\n };\n\n groupIds.push(groupId);\n groupsById.set(groupId, normalizedGroup);\n }\n\n return { aggregationColumns, aggregations, groupIds, groupsById };\n}\n\nexport function createCominsGroupModel<TData, TGroup>(input: {\n aggregationColumns?: ReadonlyMap<string, CominsTableRuntimeColumn<TData>>;\n aggregations: ReadonlyMap<string, CominsRowGroupAggregation>;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsNormalizedGroup<TGroup>>;\n rows: readonly CominsRowGroupingSourceRow<TData>[];\n}): CominsGroupModel<TGroup> {\n const groupsById = new Map<CominsRowId, CominsGroupNode<TGroup>>();\n\n for (const groupId of input.groupIds) {\n const group = input.groupsById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n const aggregationState = new Map<string, CominsAggregateState>();\n\n for (const [columnId, aggregation] of input.aggregations) {\n aggregationState.set(columnId, createAggregateState(aggregation));\n }\n\n groupsById.set(groupId, {\n group: group.group,\n groupId: group.groupId,\n groupIndex: group.groupIndex,\n aggregationState,\n leafSourceIndexes: [],\n });\n }\n\n for (const sourceRow of input.rows) {\n const groupId = input.getRowGroupId(sourceRow.data, sourceRow.dataIndex);\n const group = groupsById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n (group.leafSourceIndexes as number[]).push(sourceRow.dataIndex);\n\n for (const [columnId, aggregateState] of group.aggregationState) {\n const configuredColumn = input.aggregationColumns?.get(columnId);\n const value = configuredColumn\n ? getColumnValue(sourceRow.data, configuredColumn)\n : getNestedFieldValue(sourceRow.data, columnId);\n\n updateAggregateState(aggregateState, value);\n }\n }\n\n return { groupIds: [...input.groupIds], groupsById };\n}\n\nfunction defaultCompare(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n\nexport function orderCominsGroupModel<TData, TGroup>(input: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n model: CominsGroupModel<TGroup>;\n rows: readonly TData[];\n sortModel: CominsSortModel;\n}): CominsOrderedGroupModel<TGroup> {\n const columnById = new Map(input.columns.map((column) => [column.id, column] as const));\n const orderedLeafSourceIndexesById = new Map<CominsRowId, readonly number[]>();\n const sortLeafIndexes = (rowIndexes: readonly number[]) => [...rowIndexes].sort((leftIndex, rightIndex) => {\n const leftRow = input.rows[leftIndex];\n const rightRow = input.rows[rightIndex];\n\n if (leftRow === undefined || rightRow === undefined) {\n return leftIndex - rightIndex;\n }\n\n for (const rule of input.sortModel) {\n const column = columnById.get(rule.columnId);\n\n if (!column?.sort) {\n continue;\n }\n\n const leftValue = getColumnValue(leftRow, column);\n const rightValue = getColumnValue(rightRow, column);\n const result = typeof column.sort === \"function\"\n ? column.sort(leftValue, rightValue, leftRow, rightRow)\n : defaultCompare(leftValue, rightValue);\n\n if (result !== 0) {\n return rule.direction === \"desc\" ? result * -1 : result;\n }\n }\n\n return leftIndex - rightIndex;\n });\n\n for (const groupId of input.model.groupIds) {\n const group = input.model.groupsById.get(groupId);\n\n if (group) {\n orderedLeafSourceIndexesById.set(groupId, sortLeafIndexes(group.leafSourceIndexes));\n }\n }\n\n return {\n ...input.model,\n groupIds: [...input.model.groupIds],\n orderedLeafSourceIndexesById,\n };\n}\n\nexport function projectCominsGroups<TGroup>(input: {\n expandedGroupIds: readonly CominsRowId[];\n model: CominsOrderedGroupModel<TGroup>;\n rowIds: readonly CominsRowId[];\n}) {\n const entries: CominsGroupingProjectionEntry[] = [];\n const expandedGroupIds = new Set(input.expandedGroupIds);\n const visibleLeafRowIds: CominsRowId[] = [];\n\n for (const groupId of input.model.groupIds) {\n const group = input.model.groupsById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n entries.push({ groupId, key: getCominsGroupSlotKey(groupId), kind: \"group\" });\n\n if (!expandedGroupIds.has(groupId)) {\n continue;\n }\n\n for (const dataIndex of input.model.orderedLeafSourceIndexesById.get(groupId) ?? []) {\n const rowId = input.rowIds[dataIndex];\n\n if (rowId === undefined) {\n continue;\n }\n\n const visibleLeafIndex = visibleLeafRowIds.length;\n visibleLeafRowIds.push(rowId);\n entries.push({\n dataIndex,\n key: `data:${typeof rowId}:${encodeURIComponent(String(rowId))}`,\n kind: \"data\",\n rowId,\n visibleLeafIndex,\n });\n }\n }\n\n return { entries, visibleLeafRowIds };\n}\n\nexport function moveCominsRowGroup<TGroup>(input: {\n getGroupId: (group: TGroup) => CominsRowId;\n groups: readonly TGroup[];\n position: CominsRowGroupDropPosition;\n sourceGroupId: CominsRowId;\n targetGroupId: CominsRowId;\n}): TGroup[] {\n const nextGroups = [...input.groups];\n const sourceIndex = nextGroups.findIndex(\n (group) => input.getGroupId(group) === input.sourceGroupId,\n );\n\n if (sourceIndex < 0 || input.sourceGroupId === input.targetGroupId) {\n return nextGroups;\n }\n\n const [sourceGroup] = nextGroups.splice(sourceIndex, 1);\n const targetIndex = nextGroups.findIndex(\n (group) => input.getGroupId(group) === input.targetGroupId,\n );\n\n if (sourceGroup === undefined || targetIndex < 0) {\n return [...input.groups];\n }\n\n const insertIndex = input.position === \"after\" ? targetIndex + 1 : targetIndex;\n nextGroups.splice(insertIndex, 0, sourceGroup);\n\n return nextGroups;\n}\n","import type React from \"react\";\n\nimport type {\n CominsRowId,\n CominsSortModel,\n CominsTableRuntimeColumn,\n} from \"./react/core-compat\";\n\nexport type CominsRowGroupAggregation = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\n\nexport type CominsRowGroupDropPosition = \"after\" | \"before\";\n\nexport type CominsRowGroupMoveDetails = {\n fromIndex: number;\n groupId: CominsRowId;\n reason: \"move\";\n targetGroupId: CominsRowId;\n toIndex: number;\n};\n\nexport type CominsSetRowGroupIdParams<TData> = {\n fromGroupId: CominsRowId;\n row: TData;\n rowId: CominsRowId;\n toGroupId: CominsRowId;\n};\n\nexport type CominsRowGroupRenderParams<TData, TGroup> = {\n aggregateValues: Readonly<Record<string, number | null>>;\n expanded: boolean;\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n isEmpty: boolean;\n rowCount: number;\n};\n\nexport type CominsRowGroupProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport type CominsRowGroupingConfig<TData, TGroup = unknown> = {\n aggregations?: Readonly<Partial<Record<string, CominsRowGroupAggregation>>>;\n expandedGroupIds?: readonly CominsRowId[];\n getGroupId: (group: TGroup) => CominsRowId;\n label?: { render?: (group: TGroup) => React.ReactNode };\n /** @deprecated Use label.render. Retained throughout 0.x; removal target: 1.0.0. */\n getGroupLabel?: (group: TGroup) => React.ReactNode;\n getGroupRowProps?: (\n params: CominsRowGroupRenderParams<TData, TGroup>,\n ) => CominsRowGroupProps | undefined;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groupDraggable?: boolean;\n groups: readonly TGroup[];\n onChangeExpandedGroupIds?: (groupIds: CominsRowId[]) => void;\n onChangeGroups?: (\n groups: TGroup[],\n details: CominsRowGroupMoveDetails,\n ) => void;\n content?: { render?: (params: CominsRowGroupRenderParams<TData, TGroup>) => React.ReactNode };\n /** @deprecated Use content.render. Retained throughout 0.x; removal target: 1.0.0. */\n renderGroupContent?: (\n params: CominsRowGroupRenderParams<TData, TGroup>,\n ) => React.ReactNode;\n setRowGroupId?: (params: CominsSetRowGroupIdParams<TData>) => TData;\n};\n\nexport type CominsRowGroupingSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\nexport type CominsAggregateState =\n | { count: number; kind: \"avg\"; sum: number }\n | { count: number; kind: \"count\" }\n | { hasValue: boolean; kind: \"max\" | \"min\"; value: number }\n | { count: number; kind: \"sum\"; sum: number };\n\nexport type CominsNormalizedGroup<TGroup> = {\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n label: React.ReactNode;\n};\n\nexport type CominsGroupNode<TGroup> = CominsNormalizedGroup<TGroup> & {\n aggregationState: ReadonlyMap<string, CominsAggregateState>;\n leafSourceIndexes: readonly number[];\n};\n\nexport type CominsGroupModel<TGroup> = {\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsGroupNode<TGroup>>;\n};\n\nexport type CominsOrderedGroupModel<TGroup> = CominsGroupModel<TGroup> & {\n orderedLeafSourceIndexesById: ReadonlyMap<CominsRowId, readonly number[]>;\n};\n\nexport type CominsGroupingProjectionEntry =\n | {\n groupId: CominsRowId;\n key: string;\n kind: \"group\";\n }\n | {\n dataIndex: number;\n key: string;\n kind: \"data\";\n rowId: CominsRowId;\n visibleLeafIndex: number;\n };\n\nimport * as core from \"./core/rows/grouping\";\nimport { projectReactColumn } from \"./react/model\";\nexport { getCominsAggregateValue, getCominsGroupSlotKey, projectCominsGroups, moveCominsRowGroup } from \"./core/rows/grouping\";\n\nexport function normalizeCominsRowGrouping<TData, TGroup>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; config: CominsRowGroupingConfig<TData, TGroup> }) {\n const labels = new Map<CominsRowId, React.ReactNode>();\n const normalized = core.normalizeCominsRowGrouping({ columns: input.columns.map(projectReactColumn), config: {\n aggregations: input.config.aggregations, groups: input.config.groups,\n getGroupId(group: TGroup) {\n const id = input.config.getGroupId(group);\n if (!labels.has(id)) {\n const render = input.config.label?.render;\n const label = render ? render(group) : input.config.getGroupLabel?.(group);\n labels.set(id, render ? label === undefined ? String(id) : label : label ?? String(id));\n }\n return id;\n },\n } });\n const originals = new Map(input.columns.map(column => [column.id, column]));\n return { ...normalized,\n aggregationColumns: new Map([...normalized.aggregationColumns.keys()].map(id => [id, originals.get(id)!])),\n groupsById: new Map([...normalized.groupsById].map(([id, group]) => [id, { ...group, label: labels.get(id) }])),\n };\n}\nexport function createCominsGroupModel<TData, TGroup>(input: {\n aggregationColumns?: ReadonlyMap<string, CominsTableRuntimeColumn<TData>>;\n aggregations: ReadonlyMap<string, CominsRowGroupAggregation>;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groupIds: readonly CominsRowId[];\n groupsById: ReadonlyMap<CominsRowId, CominsNormalizedGroup<TGroup>>;\n rows: readonly CominsRowGroupingSourceRow<TData>[];\n}): CominsGroupModel<TGroup> {\n const result = core.createCominsGroupModel({ ...input,\n aggregationColumns: input.aggregationColumns && new Map([...input.aggregationColumns].map(([id, column]) => [id, projectReactColumn(column)])),\n });\n return { ...result, groupsById: new Map([...result.groupsById].map(([id, group]) => [id, { ...group, label: input.groupsById.get(id)!.label }])) };\n}\nexport function orderCominsGroupModel<TData, TGroup>(input: { columns: readonly CominsTableRuntimeColumn<TData>[]; model: CominsGroupModel<TGroup>; rows: readonly TData[]; sortModel: CominsSortModel }): CominsOrderedGroupModel<TGroup> {\n const model = { ...input.model, groupsById: new Map([...input.model.groupsById].map(([id, node]) => [id, {\n group: node.group, groupId: node.groupId, groupIndex: node.groupIndex, aggregationState: node.aggregationState, leafSourceIndexes: node.leafSourceIndexes,\n }])) };\n const result = core.orderCominsGroupModel({ ...input, model, columns: input.columns.map(projectReactColumn) });\n return { ...result, groupsById: input.model.groupsById };\n}\n","import type { CominsRowId } from \"../model\";\n\nexport type CominsTableTransferConflictPolicy = \"overwrite\" | \"reject\";\nexport type CominsTableTransferDropPosition = \"after\" | \"append\" | \"before\";\n\nexport type CominsTableTransferRowEndpoint<TData> = {\n dataIndex: number;\n row: TData;\n rowId: CominsRowId;\n tableId: string;\n};\n\nexport type CominsTableTransferGroupEndpoint<TData, TGroup> = {\n group: TGroup;\n groupId: CominsRowId;\n groupIndex: number;\n rows: readonly CominsTableTransferRowEndpoint<TData>[];\n tableId: string;\n};\n\nexport type CominsTableTransferConflict<TData, TGroup> =\n | {\n kind: \"row\";\n rowId: CominsRowId;\n source: CominsTableTransferRowEndpoint<TData>;\n target: CominsTableTransferRowEndpoint<TData>;\n }\n | {\n groupId: CominsRowId;\n kind: \"group\";\n source: CominsTableTransferGroupEndpoint<TData, TGroup>;\n target: CominsTableTransferGroupEndpoint<TData, TGroup>;\n };\n\nexport type CominsTableTransferResolvedConflict<TData, TGroup> = {\n conflict: CominsTableTransferConflict<TData, TGroup>;\n policy: CominsTableTransferConflictPolicy;\n};\n\nexport type CominsTableTransferConflictResolver<TData, TGroup> = (\n conflict: CominsTableTransferConflict<TData, TGroup>,\n) => CominsTableTransferConflictPolicy | undefined;\n\nexport type CominsTableTransferIntent<TData, TGroup> =\n | {\n kind: \"row\";\n row: TData;\n sourceRowId: CominsRowId;\n sourceTableId: string;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n targetTableId: string;\n }\n | {\n group: TGroup;\n kind: \"group\";\n rows: readonly TData[];\n sourceGroupId: CominsRowId;\n sourceTableId: string;\n targetGroupId?: CominsRowId;\n targetTableId: string;\n };\n\nexport type CominsTableTransferRejection<TData, TGroup = never> = {\n conflict: CominsTableTransferConflict<TData, TGroup>;\n kind: \"group\" | \"row\";\n reason: \"duplicate-id\";\n sourceTableId: string;\n targetTableId: string;\n};\n\nexport type CominsTableTransferEndpoint<TData, TGroup = never> = {\n data: readonly TData[];\n getGroupId?: (group: TGroup) => CominsRowId;\n getRowGroupId?: (row: TData, dataIndex: number) => CominsRowId;\n getRowId: (row: TData, dataIndex: number) => CominsRowId;\n groups?: readonly TGroup[];\n setRowGroupId?: (params: {\n fromGroupId: CominsRowId;\n row: TData;\n rowId: CominsRowId;\n toGroupId: CominsRowId;\n }) => TData;\n tableId: string;\n};\n\ntype CominsTableTransferNextEndpoint<TData, TGroup> = {\n data: TData[];\n groups?: TGroup[];\n tableId: string;\n};\n\nexport type CominsTableRowTransferDetails<TData, TGroup> = {\n conflicts: readonly CominsTableTransferResolvedConflict<TData, TGroup>[];\n kind: \"row\";\n sourceRowId: CominsRowId;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n};\n\nexport type CominsTableGroupTransferDetails<TData, TGroup> = {\n conflicts: readonly CominsTableTransferResolvedConflict<TData, TGroup>[];\n kind: \"group\";\n position: CominsTableTransferDropPosition;\n sourceGroupId: CominsRowId;\n targetGroupId?: CominsRowId;\n};\n\nexport type CominsTableTransferDetails<TData, TGroup> =\n | CominsTableGroupTransferDetails<TData, TGroup>\n | CominsTableRowTransferDetails<TData, TGroup>;\n\nexport type CominsTableTransferResult<TData, TGroup = never> = {\n details: CominsTableTransferDetails<TData, TGroup>;\n kind: \"group\" | \"row\";\n source: CominsTableTransferNextEndpoint<TData, TGroup>;\n target: CominsTableTransferNextEndpoint<TData, TGroup>;\n};\n\nexport type CominsRowBetweenTablesInput<TData, TGroup = never> = {\n resolveConflict?: CominsTableTransferConflictResolver<TData, TGroup>;\n source: CominsTableTransferEndpoint<TData, TGroup>;\n sourceRowId: CominsRowId;\n target: CominsTableTransferEndpoint<TData, TGroup>;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n};\n\nexport type CominsGroupBetweenTablesInput<TData, TGroup> = {\n position?: CominsTableTransferDropPosition;\n resolveConflict?: CominsTableTransferConflictResolver<TData, TGroup>;\n source: CominsTableTransferEndpoint<TData, TGroup>;\n sourceGroupId: CominsRowId;\n target: CominsTableTransferEndpoint<TData, TGroup>;\n targetGroupId?: CominsRowId;\n};\n\nfunction findRowIndex<TData, TGroup>(\n endpoint: Pick<CominsTableTransferEndpoint<TData, TGroup>, \"data\" | \"getRowId\">,\n rowId: CominsRowId,\n) {\n return endpoint.data.findIndex((row, index) => endpoint.getRowId(row, index) === rowId);\n}\n\nfunction isGroupedEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup>,\n): endpoint is CominsTableTransferEndpoint<TData, TGroup> & {\n getGroupId: (group: TGroup) => CominsRowId;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groups: readonly TGroup[];\n} {\n return (\n Array.isArray(endpoint.groups) &&\n typeof endpoint.getGroupId === \"function\" &&\n typeof endpoint.getRowGroupId === \"function\"\n );\n}\n\nfunction getRowEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup>,\n dataIndex: number,\n): CominsTableTransferRowEndpoint<TData> | null {\n const row = endpoint.data[dataIndex];\n\n if (row === undefined) {\n return null;\n }\n\n return {\n dataIndex,\n row,\n rowId: endpoint.getRowId(row, dataIndex),\n tableId: endpoint.tableId,\n };\n}\n\nfunction getGroupEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup> & {\n getGroupId: (group: TGroup) => CominsRowId;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groups: readonly TGroup[];\n },\n groupIndex: number,\n): CominsTableTransferGroupEndpoint<TData, TGroup> | null {\n const group = endpoint.groups[groupIndex];\n\n if (group === undefined) {\n return null;\n }\n\n const groupId = endpoint.getGroupId(group);\n const rows = endpoint.data.flatMap((row, dataIndex) =>\n endpoint.getRowGroupId(row, dataIndex) === groupId\n ? [{ dataIndex, row, rowId: endpoint.getRowId(row, dataIndex), tableId: endpoint.tableId }]\n : [],\n );\n\n return { group, groupId, groupIndex, rows, tableId: endpoint.tableId };\n}\n\nfunction resolveConflict<TData, TGroup>(\n conflict: CominsTableTransferConflict<TData, TGroup>,\n resolver: CominsTableTransferConflictResolver<TData, TGroup> | undefined,\n) {\n return resolver?.(conflict) === \"overwrite\" ? \"overwrite\" : \"reject\";\n}\n\nfunction copyGroups<TGroup>(groups: readonly TGroup[] | undefined) {\n return groups === undefined ? undefined : [...groups];\n}\n\nexport function transferCominsRowBetweenTables<TData, TGroup = never>(\n input: CominsRowBetweenTablesInput<TData, TGroup>,\n): CominsTableTransferResult<TData, TGroup> | null {\n if (input.source.tableId === input.target.tableId) {\n return null;\n }\n\n const sourceGrouped = isGroupedEndpoint(input.source) ? input.source : null;\n const targetGrouped = isGroupedEndpoint(input.target) ? input.target : null;\n\n if ((sourceGrouped === null) !== (targetGrouped === null)) {\n return null;\n }\n\n const sourceIndex = findRowIndex(input.source, input.sourceRowId);\n const sourceRowEndpoint = getRowEndpoint(input.source, sourceIndex);\n\n if (!sourceRowEndpoint) {\n return null;\n }\n\n const targetRowIndex = input.targetRowId === undefined\n ? -1\n : findRowIndex(input.target, input.targetRowId);\n\n if (input.targetRowId !== undefined && targetRowIndex < 0) {\n return null;\n }\n\n let movedRow = sourceRowEndpoint.row;\n\n if (sourceGrouped && targetGrouped) {\n const targetGroupId = input.targetGroupId;\n const targetGroupExists = targetGroupId !== undefined && targetGrouped.groups.some(\n (group) => targetGrouped.getGroupId(group) === targetGroupId,\n );\n\n if (!targetGroupExists) {\n return null;\n }\n\n if (\n targetRowIndex >= 0 &&\n targetGrouped.getRowGroupId(targetGrouped.data[targetRowIndex]!, targetRowIndex) !== targetGroupId\n ) {\n return null;\n }\n\n const sourceGroupId = sourceGrouped.getRowGroupId(sourceRowEndpoint.row, sourceIndex);\n\n if (sourceGroupId !== targetGroupId) {\n if (typeof input.target.setRowGroupId !== \"function\") {\n return null;\n }\n\n movedRow = input.target.setRowGroupId({\n fromGroupId: sourceGroupId,\n row: sourceRowEndpoint.row,\n rowId: sourceRowEndpoint.rowId,\n toGroupId: targetGroupId!,\n });\n }\n } else if (input.targetGroupId !== undefined) {\n return null;\n }\n\n const targetData = [...input.target.data];\n const conflicts: CominsTableTransferResolvedConflict<TData, TGroup>[] = [];\n const duplicateIndex = findRowIndex(input.target, sourceRowEndpoint.rowId);\n let normalizedTargetRowIndex = targetRowIndex;\n\n if (duplicateIndex >= 0) {\n const targetRowEndpoint = getRowEndpoint(input.target, duplicateIndex);\n\n if (!targetRowEndpoint) {\n return null;\n }\n\n const conflict: CominsTableTransferConflict<TData, TGroup> = {\n kind: \"row\",\n rowId: sourceRowEndpoint.rowId,\n source: sourceRowEndpoint,\n target: targetRowEndpoint,\n };\n const policy = resolveConflict(conflict, input.resolveConflict);\n\n if (policy === \"reject\") {\n return null;\n }\n\n conflicts.push({ conflict, policy });\n targetData.splice(duplicateIndex, 1);\n\n if (normalizedTargetRowIndex > duplicateIndex) {\n normalizedTargetRowIndex -= 1;\n } else if (input.targetRowId === sourceRowEndpoint.rowId) {\n normalizedTargetRowIndex = duplicateIndex;\n }\n }\n\n let insertIndex: number;\n\n if (normalizedTargetRowIndex >= 0) {\n insertIndex = normalizedTargetRowIndex;\n } else if (targetGrouped && input.targetGroupId !== undefined) {\n let lastGroupIndex = -1;\n\n for (let index = 0; index < targetData.length; index += 1) {\n if (targetGrouped.getRowGroupId(targetData[index]!, index) === input.targetGroupId) {\n lastGroupIndex = index;\n }\n }\n\n insertIndex = lastGroupIndex < 0 ? targetData.length : lastGroupIndex + 1;\n } else {\n insertIndex = targetData.length;\n }\n\n if (input.target.getRowId(movedRow, insertIndex) !== sourceRowEndpoint.rowId) {\n return null;\n }\n\n targetData.splice(Math.max(0, Math.min(insertIndex, targetData.length)), 0, movedRow);\n\n return {\n details: {\n conflicts,\n kind: \"row\",\n sourceRowId: sourceRowEndpoint.rowId,\n targetGroupId: input.targetGroupId,\n targetRowId: input.targetRowId,\n },\n kind: \"row\",\n source: {\n data: input.source.data.filter((_row, index) => index !== sourceIndex),\n groups: copyGroups(input.source.groups),\n tableId: input.source.tableId,\n },\n target: {\n data: targetData,\n groups: copyGroups(input.target.groups),\n tableId: input.target.tableId,\n },\n };\n}\n\nexport function transferCominsGroupBetweenTables<TData, TGroup>(\n input: CominsGroupBetweenTablesInput<TData, TGroup>,\n): CominsTableTransferResult<TData, TGroup> | null {\n const source = isGroupedEndpoint(input.source) ? input.source : null;\n const target = isGroupedEndpoint(input.target) ? input.target : null;\n\n if (input.source.tableId === input.target.tableId || !source || !target) {\n return null;\n }\n\n const sourceGroupIndex = source.groups.findIndex(\n (group) => source.getGroupId(group) === input.sourceGroupId,\n );\n const sourceGroupEndpoint = getGroupEndpoint(source, sourceGroupIndex);\n\n if (\n !sourceGroupEndpoint ||\n target.getGroupId(sourceGroupEndpoint.group) !== sourceGroupEndpoint.groupId\n ) {\n return null;\n }\n\n const targetGroups = [...target.groups];\n let targetData = [...target.data];\n const conflicts: CominsTableTransferResolvedConflict<TData, TGroup>[] = [];\n const duplicateGroupIndex = targetGroups.findIndex(\n (group) => target.getGroupId(group) === sourceGroupEndpoint.groupId,\n );\n let overwriteDataInsertIndex: number | null = null;\n let overwriteGroupInsertIndex: number | null = null;\n\n if (duplicateGroupIndex >= 0) {\n const targetGroupEndpoint = getGroupEndpoint(target, duplicateGroupIndex);\n\n if (!targetGroupEndpoint) {\n return null;\n }\n\n const conflict: CominsTableTransferConflict<TData, TGroup> = {\n groupId: sourceGroupEndpoint.groupId,\n kind: \"group\",\n source: sourceGroupEndpoint,\n target: targetGroupEndpoint,\n };\n const policy = resolveConflict(conflict, input.resolveConflict);\n\n if (policy === \"reject\") {\n return null;\n }\n\n conflicts.push({ conflict, policy });\n const targetMemberIndexes = new Set(targetGroupEndpoint.rows.map((row) => row.dataIndex));\n const firstMemberIndex = targetGroupEndpoint.rows[0]?.dataIndex;\n\n if (firstMemberIndex !== undefined) {\n overwriteDataInsertIndex = target.data\n .slice(0, firstMemberIndex)\n .filter((_row, index) => !targetMemberIndexes.has(index)).length;\n }\n\n targetData = targetData.filter((_row, index) => !targetMemberIndexes.has(index));\n targetGroups.splice(duplicateGroupIndex, 1);\n overwriteGroupInsertIndex = duplicateGroupIndex;\n }\n\n const sourceRowIds = new Set(sourceGroupEndpoint.rows.map((row) => row.rowId));\n const duplicateRows = targetData.flatMap((row, dataIndex) => {\n const rowId = target.getRowId(row, dataIndex);\n return sourceRowIds.has(rowId) ? [{ dataIndex, row, rowId }] : [];\n });\n\n for (const duplicate of duplicateRows) {\n const sourceRowEndpoint = sourceGroupEndpoint.rows.find((row) => row.rowId === duplicate.rowId)!;\n const targetRowEndpoint: CominsTableTransferRowEndpoint<TData> = {\n ...duplicate,\n tableId: input.target.tableId,\n };\n const conflict: CominsTableTransferConflict<TData, TGroup> = {\n kind: \"row\",\n rowId: duplicate.rowId,\n source: sourceRowEndpoint,\n target: targetRowEndpoint,\n };\n const policy = resolveConflict(conflict, input.resolveConflict);\n\n if (policy === \"reject\") {\n return null;\n }\n\n conflicts.push({ conflict, policy });\n }\n\n if (duplicateRows.length > 0) {\n const duplicateRowIds = new Set(duplicateRows.map((row) => row.rowId));\n\n if (overwriteDataInsertIndex !== null) {\n overwriteDataInsertIndex -= duplicateRows.filter(\n (row) => row.dataIndex < overwriteDataInsertIndex!,\n ).length;\n }\n\n targetData = targetData.filter(\n (row, dataIndex) => !duplicateRowIds.has(target.getRowId(row, dataIndex)),\n );\n }\n\n const position = input.position ?? (input.targetGroupId === undefined ? \"append\" : \"before\");\n let groupInsertIndex: number;\n\n if (input.targetGroupId === sourceGroupEndpoint.groupId && overwriteGroupInsertIndex !== null) {\n groupInsertIndex = Math.min(overwriteGroupInsertIndex, targetGroups.length);\n } else if (input.targetGroupId === undefined || position === \"append\") {\n groupInsertIndex = targetGroups.length;\n } else {\n const targetGroupIndex = targetGroups.findIndex(\n (group) => target.getGroupId(group) === input.targetGroupId,\n );\n\n if (targetGroupIndex < 0) {\n return null;\n }\n\n groupInsertIndex = position === \"after\" ? targetGroupIndex + 1 : targetGroupIndex;\n }\n\n targetGroups.splice(groupInsertIndex, 0, sourceGroupEndpoint.group);\n const memberRows = sourceGroupEndpoint.rows.map((row) => row.row);\n const dataInsertIndex = overwriteDataInsertIndex === null\n ? targetData.length\n : Math.min(overwriteDataInsertIndex, targetData.length);\n targetData.splice(dataInsertIndex, 0, ...memberRows);\n const sourceMemberIndexes = new Set(sourceGroupEndpoint.rows.map((row) => row.dataIndex));\n\n return {\n details: {\n conflicts,\n kind: \"group\",\n position,\n sourceGroupId: sourceGroupEndpoint.groupId,\n targetGroupId: input.targetGroupId,\n },\n kind: \"group\",\n source: {\n data: source.data.filter((_row, index) => !sourceMemberIndexes.has(index)),\n groups: source.groups.filter((_group, index) => index !== sourceGroupIndex),\n tableId: input.source.tableId,\n },\n target: {\n data: targetData,\n groups: targetGroups,\n tableId: input.target.tableId,\n },\n };\n}\n","import type React from \"react\";\nimport { useEffect } from \"react\";\nimport { createTableTransferRegistry, getRegisteredTransferSnapshot as getBrowserSnapshot } from \"../browser/table-transfer\";\nimport type { CominsTableTransferConflictResolver, CominsTableTransferIntent, CominsTableTransferRejection, CominsTableTransferResult, CominsTableTransferEndpoint } from \"../core/transfer/policy\";\nexport * from \"../core/transfer/policy\";\n\nexport type CominsTableTransferRejectionFeedback<TData, TGroup = never> = {\n duration?: number;\n tooltip?: { render?: (rejection: CominsTableTransferRejection<TData, TGroup>) => React.ReactNode };\n /** @deprecated Use tooltip.render. Retained throughout 0.x; removal target: 1.0.0. */\n renderTooltip?: (\n rejection: CominsTableTransferRejection<TData, TGroup>,\n ) => React.ReactNode;\n};\n\ndeclare const cominsTableTransferCoordinatorBrand: unique symbol;\n\nexport type CominsTableTransferCoordinator<TData, TGroup = never> = {\n readonly [cominsTableTransferCoordinatorBrand]: (\n data: TData,\n group: TGroup,\n ) => [TData, TGroup];\n};\n\nexport type CominsTableTransferCoordinatorOptions<TData, TGroup = never> = {\n onTransfer: (result: CominsTableTransferResult<TData, TGroup>) => void;\n onTransferRejected?: (\n rejection: CominsTableTransferRejection<TData, TGroup>,\n ) => void;\n};\n\nexport type CominsTableTransferConfig<TData, TGroup = never> = {\n canTransfer?: (intent: CominsTableTransferIntent<TData, TGroup>) => boolean;\n coordinator: CominsTableTransferCoordinator<TData, TGroup>;\n rejectionFeedback?: false | CominsTableTransferRejectionFeedback<TData, TGroup>;\n resolveConflict?: CominsTableTransferConflictResolver<TData, TGroup>;\n scope: string;\n tableId: string;\n};\n\nexport type CominsTableTransferRegistrationSnapshot<TData, TGroup> = {\n config: CominsTableTransferConfig<TData, TGroup>;\n endpoint: CominsTableTransferEndpoint<TData, TGroup>;\n instanceId: string;\n root: HTMLElement | null;\n viewport: HTMLElement | null;\n};\n\nexport type CominsTableTransferRegistration<TData, TGroup> = {\n getSnapshot: () => CominsTableTransferRegistrationSnapshot<TData, TGroup> | null;\n};\n\ntype CominsTableTransferCoordinatorState<TData, TGroup> = {\n options: CominsTableTransferCoordinatorOptions<TData, TGroup>;\n registry: ReturnType<typeof createTableTransferRegistry<CominsTableTransferRegistrationSnapshot<TData, TGroup>>>;\n};\n\nconst coordinatorStates = new WeakMap<\n object,\n CominsTableTransferCoordinatorState<unknown, unknown>\n>();\n\nfunction getCoordinatorState<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n) {\n return coordinatorStates.get(coordinator) as\n | CominsTableTransferCoordinatorState<TData, TGroup>\n | undefined;\n}\n\nexport function createCominsTableTransferCoordinator<TData, TGroup = never>(\n options: CominsTableTransferCoordinatorOptions<TData, TGroup>,\n): CominsTableTransferCoordinator<TData, TGroup> {\n const coordinator = Object.freeze({}) as CominsTableTransferCoordinator<TData, TGroup>;\n\n coordinatorStates.set(\n coordinator,\n {\n options,\n registry: createTableTransferRegistry<CominsTableTransferRegistrationSnapshot<TData, TGroup>>(),\n } as CominsTableTransferCoordinatorState<unknown, unknown>,\n );\n\n return coordinator;\n}\n\nexport function isCominsTableTransferCoordinator<TData, TGroup>(\n coordinator: unknown,\n): coordinator is CominsTableTransferCoordinator<TData, TGroup> {\n return typeof coordinator === \"object\" && coordinator !== null && coordinatorStates.has(coordinator);\n}\n\nexport function registerCominsTableTransfer<TData, TGroup>(coordinator: CominsTableTransferCoordinator<TData, TGroup>, scope: string, tableId: string, registration: CominsTableTransferRegistration<TData, TGroup>) {\n return getCoordinatorState(coordinator)?.registry.register(scope, tableId, registration) ?? (() => undefined);\n}\n\nexport function getCominsTableTransferRegistration<TData, TGroup>(coordinator: CominsTableTransferCoordinator<TData, TGroup>, scope: string, tableId: string) {\n return getCoordinatorState(coordinator)?.registry.get(scope, tableId) ?? null;\n}\n\nexport function getRegisteredTransferSnapshot<TData, TGroup>(coordinator: CominsTableTransferCoordinator<TData, TGroup>, scope: string, tableId: string) {\n const state = getCoordinatorState(coordinator);\n return state ? getBrowserSnapshot(state.registry, coordinator, scope, tableId) : null;\n}\n\nexport function useCominsTableTransferRegistration<TData, TGroup>(input: {\n config: CominsTableTransferConfig<TData, TGroup> | undefined;\n snapshot: { current: CominsTableTransferRegistrationSnapshot<TData, TGroup> | null };\n root: { current: HTMLElement | null };\n viewport: { current: HTMLElement | null };\n}) {\n const { snapshot, root, viewport } = input;\n const coordinator = input.config?.coordinator;\n const scope = input.config?.scope;\n const tableId = input.config?.tableId;\n useEffect(() => {\n if (!coordinator || !scope || !tableId) return undefined;\n return registerCominsTableTransfer(coordinator, scope, tableId, {\n getSnapshot: () => snapshot.current ? { ...snapshot.current, root: root.current, viewport: viewport.current } : null,\n });\n }, [coordinator, scope, tableId, snapshot, root, viewport]);\n}\n\nexport function emitCominsTableTransfer<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n result: CominsTableTransferResult<TData, TGroup>,\n) {\n const state = getCoordinatorState(coordinator);\n\n if (!state) {\n return false;\n }\n\n state.options.onTransfer(result);\n return true;\n}\n\nexport function emitCominsTableTransferRejected<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n rejection: CominsTableTransferRejection<TData, TGroup>,\n) {\n const state = getCoordinatorState(coordinator);\n\n if (!state) {\n return false;\n }\n\n state.options.onTransferRejected?.(rejection);\n return true;\n}\n","import type React from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\n\ntype CominsTooltipPlacement = \"above\" | \"below\";\n\nexport type CominsTooltipSurfaceProps = {\n children: React.ReactNode;\n className?: string;\n icon?: React.ReactNode;\n tone?: \"danger\" | \"neutral\";\n};\n\nexport function CominsTooltipSurface({\n children,\n className,\n icon,\n tone = \"neutral\",\n}: CominsTooltipSurfaceProps) {\n return (\n <div\n className={[\n \"comins-tooltip-surface\",\n `comins-tooltip-surface--${tone}`,\n className,\n ].filter(Boolean).join(\" \")}\n >\n {icon ? <span aria-hidden=\"true\" className=\"comins-tooltip-surface__icon\">{icon}</span> : null}\n <span className=\"comins-tooltip-surface__content\">{children}</span>\n </div>\n );\n}\n\nexport type CominsPointerTooltipProps = CominsTooltipSurfaceProps & {\n x: number;\n y: number;\n};\n\nexport function CominsPointerTooltip({\n children,\n className,\n icon,\n tone,\n x,\n y,\n}: CominsPointerTooltipProps) {\n const tooltipRef = useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = useState({\n left: x + 12,\n placement: \"below\" as CominsTooltipPlacement,\n top: y + 12,\n });\n\n useLayoutEffect(() => {\n const element = tooltipRef.current;\n\n if (!element) {\n return;\n }\n\n const bounds = element.getBoundingClientRect();\n const viewportMargin = 8;\n const pointerOffset = 12;\n const maxLeft = Math.max(viewportMargin, window.innerWidth - bounds.width - viewportMargin);\n const preferredTop = y + pointerOffset;\n const fitsBelow = preferredTop + bounds.height <= window.innerHeight - viewportMargin;\n const placement: CominsTooltipPlacement = fitsBelow ? \"below\" : \"above\";\n const top = fitsBelow\n ? preferredTop\n : Math.max(viewportMargin, y - bounds.height - pointerOffset);\n\n setPosition({\n left: Math.min(Math.max(viewportMargin, x + pointerOffset), maxLeft),\n placement,\n top,\n });\n }, [children, x, y]);\n\n return (\n <div\n aria-atomic=\"true\"\n aria-live=\"polite\"\n className=\"comins-pointer-tooltip\"\n data-placement={position.placement}\n data-testid=\"transfer-rejection-tooltip\"\n ref={tooltipRef}\n role=\"status\"\n style={{ left: position.left, top: position.top }}\n >\n <CominsTooltipSurface className={className} icon={icon} tone={tone}>\n {children}\n </CominsTooltipSurface>\n </div>\n );\n}\n","export type CominsViewportRevision = string | number;\nexport type CominsViewportRange = { startIndex: number; endIndex: number };\nexport type CoreViewportRequest = CominsViewportRange & {\n revision: CominsViewportRevision;\n requestId: string;\n retainRange: CominsViewportRange;\n};\nexport type CominsViewportBlock<T> = {\n startIndex: number;\n rows: readonly T[];\n version: number;\n touched: number;\n};\nexport type CominsViewportRequestState = CominsViewportRange & {\n requestId: string;\n status: \"loading\" | \"error\";\n version: number;\n};\nexport type CominsViewportPatch<T> = { index: number; row: T };\nexport type CominsViewportData<T> = {\n revision: CominsViewportRevision;\n rowCount: number;\n blockSize: number;\n cacheSize: number;\n blocks: readonly CominsViewportBlock<T>[];\n requests: readonly CominsViewportRequestState[];\n retainRange: CominsViewportRange;\n version: number;\n clock: number;\n changes: readonly CominsViewportPatch<T>[];\n};\nexport type CominsViewportDataOptions = {\n revision: CominsViewportRevision;\n rowCount: number;\n blockSize?: number;\n cacheSize?: number;\n};\nexport type CominsViewportDataEvent<T> =\n | { type: \"request\"; request: CoreViewportRequest }\n | { type: \"cancel\"; request: CoreViewportRequest }\n | { type: \"error\"; request: CoreViewportRequest }\n | { type: \"success\"; request: CoreViewportRequest; rows: readonly T[] }\n | { type: \"retain\"; range: CominsViewportRange }\n | { type: \"patch\"; changes: readonly CominsViewportPatch<T>[] }\n | { type: \"reset\"; options: CominsViewportDataOptions };\n\nexport function normalizeCominsViewportInteger(value: number | undefined, fallback: number) {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0 ? value : fallback;\n}\nexport function createCominsViewportData<T>(options: CominsViewportDataOptions): CominsViewportData<T> {\n if (!Number.isSafeInteger(options.rowCount) || options.rowCount < 0) throw new RangeError(\"Viewport rowCount must be a non-negative safe integer\");\n return { revision: options.revision, rowCount: options.rowCount, blockSize: normalizeCominsViewportInteger(options.blockSize, 100), cacheSize: normalizeCominsViewportInteger(options.cacheSize, 12), blocks: [], requests: [], retainRange: { startIndex: 0, endIndex: 0 }, version: 0, clock: 0, changes: [] };\n}\nconst intersects = (a: CominsViewportRange, b: CominsViewportRange) => a.startIndex < b.endIndex && b.startIndex < a.endIndex;\nfunction trim<T>(data: CominsViewportData<T>): CominsViewportData<T> {\n const required = (block: CominsViewportBlock<T>) => intersects({ startIndex: block.startIndex, endIndex: block.startIndex + data.blockSize }, data.retainRange) || data.requests.some(request => request.status === \"loading\" && request.startIndex === block.startIndex);\n const protectedBlocks = data.blocks.filter(required);\n const others = data.blocks.filter(block => !required(block)).sort((a, b) => b.touched - a.touched);\n const blocks = [...protectedBlocks, ...others.slice(0, Math.max(0, data.cacheSize - protectedBlocks.length))].sort((a, b) => a.startIndex - b.startIndex);\n const loading = data.requests.filter(request => request.status === \"loading\");\n const errors = data.requests.filter(request => request.status === \"error\");\n const protectedErrors = errors.filter(request => intersects(request, data.retainRange));\n const otherErrors = errors.filter(request => !intersects(request, data.retainRange));\n const remaining = Math.max(0, data.cacheSize - protectedErrors.length);\n return { ...data, blocks, requests: [...loading, ...protectedErrors, ...(remaining ? otherErrors.slice(-remaining) : [])] };\n}\nexport function reduceCominsViewportData<T>(data: CominsViewportData<T>, event: CominsViewportDataEvent<T>): CominsViewportData<T> {\n if (event.type === \"reset\") return createCominsViewportData<T>(event.options);\n if (event.type === \"retain\") {\n const startIndex = Math.max(0, Math.min(data.rowCount, Math.floor(event.range.startIndex)));\n const endIndex = Math.max(startIndex, Math.min(data.rowCount, Math.ceil(event.range.endIndex)));\n if (!Number.isFinite(startIndex) || !Number.isFinite(endIndex)) return data;\n if (data.retainRange.startIndex === startIndex && data.retainRange.endIndex === endIndex) return data;\n const range = { startIndex, endIndex };\n const clock = data.clock + 1;\n return trim({ ...data, changes: [], clock, retainRange: range, blocks: data.blocks.map(block => intersects({ startIndex: block.startIndex, endIndex: block.startIndex + block.rows.length }, range) ? { ...block, touched: clock } : block) });\n }\n if (event.type === \"patch\") {\n const changes = new Map(event.changes.filter(change => Number.isSafeInteger(change.index)).map(change => [change.index, change.row]));\n const accepted: CominsViewportPatch<T>[] = [];\n const blocks = data.blocks.map(block => {\n let changed = false;\n const rows = block.rows.map((row, index) => {\n const absoluteIndex = block.startIndex + index;\n if (!changes.has(absoluteIndex) || changes.get(absoluteIndex) === row) return row;\n changed = true;\n const next = changes.get(absoluteIndex)!;\n accepted.push({ index: absoluteIndex, row: next });\n return next;\n });\n return changed ? { ...block, rows, version: data.version + 1 } : block;\n });\n return accepted.length ? { ...data, version: data.version + 1, blocks, changes: accepted } : data;\n }\n const request = event.request;\n if (request.revision !== data.revision || !Number.isSafeInteger(request.startIndex) || request.startIndex < 0 || request.startIndex % data.blockSize !== 0 || request.startIndex >= data.rowCount || request.endIndex !== Math.min(data.rowCount, request.startIndex + data.blockSize)) return data;\n const previous = data.requests.find(entry => entry.startIndex === request.startIndex);\n if (event.type === \"request\") {\n if (previous?.requestId === request.requestId) return data;\n return trim({ ...data, changes: [], retainRange: request.retainRange, requests: [...data.requests.filter(entry => entry.startIndex !== request.startIndex), { startIndex: request.startIndex, endIndex: request.endIndex, requestId: request.requestId, status: \"loading\", version: data.version }] });\n }\n if (!previous || previous.requestId !== request.requestId) return data;\n // 종료된 요청의 보호가 사라진 snapshot에는 캐시 한도를 다시 적용한다.\n const requests = data.requests.filter(entry => entry !== previous);\n if (event.type === \"cancel\") return trim({ ...data, changes: [], requests });\n if (event.type === \"error\" || !Array.isArray(event.rows) || event.rows.length !== request.endIndex - request.startIndex || Array.from(event.rows).some(row => row === undefined || row === null)) {\n return trim({ ...data, changes: [], requests: [...requests, { ...previous, status: \"error\" }] });\n }\n const currentBlock = data.blocks.find(block => block.startIndex === request.startIndex);\n if (currentBlock && currentBlock.version > previous.version) return trim({ ...data, changes: [], requests });\n const clock = data.clock + 1;\n return trim({ ...data, changes: [], clock, requests, blocks: [...data.blocks.filter(block => block.startIndex !== request.startIndex), { startIndex: request.startIndex, rows: [...event.rows], touched: clock, version: data.version }] });\n}\n","import { reduceCominsViewportData as reduceCoreViewportData } from \"./core/viewport/data\";\nimport type { CominsViewportData } from \"./core/viewport/data\";\nimport type { BrowserViewportDataEvent } from \"./browser/viewport-requests\";\nexport { createCominsViewportData, normalizeCominsViewportInteger } from \"./core/viewport/data\";\nexport type { CominsViewportRevision, CominsViewportRange, CominsViewportBlock, CominsViewportRequestState, CominsViewportPatch, CominsViewportData, CominsViewportDataOptions } from \"./core/viewport/data\";\nexport type { CominsViewportRequest } from \"./browser/viewport-requests\";\nexport { reconcileCoreViewportSelection as reconcileCominsViewportSelection } from \"./core/state/reconcile\";\nexport type CominsViewportDataEvent<T> = BrowserViewportDataEvent<T>;\n\n/** Preserve the legacy signal checks before passing data-only events into Core. */\nexport function reduceCominsViewportData<T>(data: CominsViewportData<T>, event: CominsViewportDataEvent<T>): CominsViewportData<T> {\n if (\"request\" in event && event.request.signal.aborted) {\n if (event.type === \"request\") return data;\n return reduceCoreViewportData(data, { type: \"cancel\", request: event.request });\n }\n return reduceCoreViewportData(data, event);\n}\n","import type { CominsEventRow } from \"../model\";\n\nexport type CominsRowHeight = number | \"auto\";\nexport type CominsRowHeightParams<TData> = { row: CominsEventRow<TData> };\nexport type CominsRowMeasurement<TData> = { row: TData; layoutKey: string; contentRevision?: object; height: number };\n\nexport function normalizeCominsRowHeight(value: number | undefined, fallback = 36) {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nexport function resolveCominsRowHeight<TData>(input: {\n value: CominsRowHeight | undefined;\n rowHeight: number;\n estimate?: number;\n measurement?: CominsRowMeasurement<TData>;\n row: TData;\n layoutKey: string;\n contentRevision?: object;\n}) {\n const fallback = normalizeCominsRowHeight(input.rowHeight);\n const auto = input.value === \"auto\";\n const measurement = input.measurement;\n return {\n auto,\n height: auto\n ? measurement?.row === input.row && measurement.layoutKey === input.layoutKey && measurement.contentRevision === input.contentRevision\n ? measurement.height : normalizeCominsRowHeight(input.estimate, fallback)\n : normalizeCominsRowHeight(input.value as number | undefined, fallback),\n };\n}\n","import { normalizeCominsRowHeight } from \"./row-height\";\nimport type { CominsViewportRange } from \"../viewport/data\";\n\n/** Sparse measured blocks only: storage does not depend on total dataset length. */\nexport class CominsViewportHeightIndex {\n private blocks = new Map<number, Map<number, number>>();\n private deltas = new Map<number, number>();\n constructor(readonly rowCount: number, readonly estimate: number, readonly blockSize = 100, readonly maxBlocks = 64) {}\n clone() {\n const next = new CominsViewportHeightIndex(this.rowCount, this.estimate, this.blockSize, this.maxBlocks);\n next.blocks = new Map([...this.blocks].map(([id, rows]) => [id, new Map(rows)]));\n next.deltas = new Map(this.deltas);\n return next;\n }\n get measuredBlockCount() { return this.blocks.size; }\n get measuredRowCount() { return [...this.blocks.values()].reduce((count, rows) => count + rows.size, 0); }\n getHeight(index: number) { return this.blocks.get(Math.floor(index / this.blockSize))?.get(index) ?? this.estimate; }\n getPrefixHeight(endExclusive: number) {\n const end = Math.min(this.rowCount, Math.max(0, endExclusive));\n let total = end * this.estimate;\n for (const [block, rows] of this.blocks) {\n if ((block + 1) * this.blockSize <= end) total += this.deltas.get(block) ?? 0;\n else if (block * this.blockSize < end) for (const [index, height] of rows) if (index < end) total += height - this.estimate;\n }\n return total;\n }\n getTotalHeight() { return this.getPrefixHeight(this.rowCount); }\n findIndexAtOffset(offset: number) {\n if (!this.rowCount) return 0;\n const target = Math.max(0, Math.min(offset, this.getTotalHeight()));\n let low = 0;\n let high = this.rowCount;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n if (this.getPrefixHeight(middle + 1) <= target) low = middle + 1;\n else high = middle;\n }\n return Math.min(this.rowCount - 1, low);\n }\n updateHeight(index: number, value: number) {\n if (!Number.isSafeInteger(index) || index < 0 || index >= this.rowCount) return 0;\n const height = normalizeCominsRowHeight(value, this.estimate);\n const delta = height - this.getHeight(index);\n if (delta === 0) return 0;\n const block = Math.floor(index / this.blockSize);\n const rows = this.blocks.get(block) ?? new Map<number, number>();\n rows.set(index, height);\n this.deltas.set(block, (this.deltas.get(block) ?? 0) + delta);\n this.blocks.delete(block);\n this.blocks.set(block, rows);\n return delta;\n }\n retain(range: CominsViewportRange) {\n const first = Math.floor(range.startIndex / this.blockSize);\n const last = Math.floor(Math.max(range.startIndex, range.endIndex - 1) / this.blockSize);\n const requiredCount = range.endIndex > range.startIndex ? last - first + 1 : 0;\n const limit = Math.max(this.maxBlocks, requiredCount);\n for (const block of this.blocks.keys()) {\n if (this.blocks.size <= limit) break;\n if (block < first || block > last) { this.blocks.delete(block); this.deltas.delete(block); }\n }\n }\n}\n","import { normalizeCominsViewportInteger, type CominsViewportData, type CominsViewportRange, type CoreViewportRequest } from \"./data\";\n\nexport type CoreActiveViewportRequest = { request: CoreViewportRequest; done: boolean };\n\n/** Pure scheduling policy. Completion alone is not controlled snapshot acknowledgement. */\nexport function planViewportRequests<T>(input: {\n data: CominsViewportData<T>;\n range: CominsViewportRange;\n active: readonly CoreActiveViewportRequest[];\n retryStarts: readonly number[];\n maxConcurrent?: number;\n}) {\n const { data, range } = input;\n const needed: number[] = [];\n for (let index = Math.floor(range.startIndex / data.blockSize) * data.blockSize; index < Math.min(data.rowCount, range.endIndex); index += data.blockSize) needed.push(index);\n const wanted = new Set(needed);\n const cancelRequestIds: string[] = [], releaseRequestIds: string[] = [];\n const activeStarts = new Set<number>();\n for (const entry of input.active) {\n const index = entry.request.startIndex;\n if (!wanted.has(index)) cancelRequestIds.push(entry.request.requestId);\n else if (entry.done && !data.requests.some(request => request.requestId === entry.request.requestId && request.status === \"loading\") && (data.blocks.some(block => block.startIndex === index) || data.requests.some(request => request.startIndex === index && request.status === \"error\"))) releaseRequestIds.push(entry.request.requestId);\n else activeStarts.add(index);\n }\n const max = normalizeCominsViewportInteger(input.maxConcurrent, 2);\n const retryStarts = new Set(input.retryStarts);\n const consumedRetryStarts: number[] = [];\n const startRanges: CominsViewportRange[] = [];\n for (const index of needed) {\n if (activeStarts.size >= max) break;\n if (activeStarts.has(index)) continue;\n const retry = retryStarts.has(index);\n if (!retry && (data.blocks.some(block => block.startIndex === index) || data.requests.some(request => request.startIndex === index))) continue;\n if (retry) consumedRetryStarts.push(index);\n activeStarts.add(index);\n startRanges.push({ startIndex: index, endIndex: Math.min(index + data.blockSize, data.rowCount) });\n }\n return { startRanges, cancelRequestIds, releaseRequestIds, consumedRetryStarts };\n}\n","import type { CoreViewportRequest, CominsViewportDataEvent } from \"../core/viewport/data\";\n\nexport type CominsViewportRequest = CoreViewportRequest & { signal: AbortSignal };\ntype WithSignal<TEvent> = TEvent extends { request: CoreViewportRequest } ? Omit<TEvent, \"request\"> & { request: CominsViewportRequest } : TEvent;\nexport type BrowserViewportDataEvent<T> = WithSignal<CominsViewportDataEvent<T>>;\n\nexport function createViewportRequestExecutor(options: {\n onRequest: (request: CominsViewportRequest) => void | Promise<void>;\n onSettled: (requestId: string) => void;\n}) {\n const active = new Map<string, { controller: AbortController; done: boolean }>();\n let disposed = false;\n const cancel = (requestId: string) => {\n const entry = active.get(requestId);\n if (!entry) return;\n active.delete(requestId);\n entry.controller.abort();\n };\n return {\n start(descriptor: CoreViewportRequest) {\n if (disposed || active.has(descriptor.requestId)) return;\n const controller = new AbortController();\n const entry = { controller, done: false };\n const request = { ...descriptor, signal: controller.signal };\n active.set(descriptor.requestId, entry);\n Promise.resolve().then(() => { if (!controller.signal.aborted) return options.onRequest(request); }).catch(() => {\n // Low-level consumers acknowledge errors in their controlled snapshot.\n }).finally(() => {\n if (controller.signal.aborted) return;\n entry.done = true;\n options.onSettled(descriptor.requestId);\n });\n },\n cancel,\n // Acknowledgement releases ownership without changing the completed signal.\n release(requestId: string) {\n if (active.get(requestId)?.done) active.delete(requestId);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n for (const requestId of active.keys()) cancel(requestId);\n },\n };\n}\n\n/** The consumer owns data; this boundary owns only execution and listener lifetime. */\nexport async function runViewportRequest<T>(input: {\n request: CominsViewportRequest;\n getRows: (request: CominsViewportRequest) => readonly T[] | Promise<readonly T[]>;\n dispatch: (event: BrowserViewportDataEvent<T>) => void;\n}): Promise<void> {\n const { request, dispatch } = input;\n if (request.signal.aborted) return;\n dispatch({ type: \"request\", request });\n const cancelled = Symbol(\"cancelled viewport request\");\n let stopWaiting!: () => void;\n const cancellation = new Promise<typeof cancelled>((resolve) => { stopWaiting = () => resolve(cancelled); });\n const cancel = () => {\n // 소비자가 취소를 무시해도 종료된 테이블의 dispatch를 계속 보유하지 않는다.\n stopWaiting();\n dispatch({ type: \"cancel\", request });\n };\n request.signal.addEventListener(\"abort\", cancel, { once: true });\n try {\n if (request.signal.aborted) { cancel(); return; }\n const rows = await Promise.race([input.getRows(request), cancellation]);\n if (rows !== cancelled && !request.signal.aborted) dispatch({ type: \"success\", request, rows });\n } catch {\n if (!request.signal.aborted) dispatch({ type: \"error\", request });\n } finally {\n request.signal.removeEventListener(\"abort\", cancel);\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { reduceCominsViewportData, type CominsViewportData, type CominsViewportRange } from \"../core/viewport/data\";\nimport { planViewportRequests, type CoreActiveViewportRequest } from \"../core/viewport/requests\";\nimport { createViewportRequestExecutor, type CominsViewportRequest } from \"../browser/viewport-requests\";\n\nlet nextRequestId = 0;\nexport function useCominsViewportRequests<T>(input: {\n data?: CominsViewportData<T>;\n range: CominsViewportRange;\n maxConcurrentRequests?: number;\n onRequest?: (request: CominsViewportRequest) => void | Promise<void>;\n onChangeData?: (data: CominsViewportData<T>) => void;\n}) {\n const active = useRef(new Map<number, CoreActiveViewportRequest & { onRequest: NonNullable<typeof input.onRequest> }>());\n const executor = useRef<ReturnType<typeof createViewportRequestExecutor> | null>(null);\n const retryBlocks = useRef(new Set<number>());\n const [version, setVersion] = useState(0);\n const { data, onRequest, onChangeData } = input;\n const start = input.range.startIndex, end = input.range.endIndex;\n useEffect(() => {\n executor.current = createViewportRequestExecutor({\n onRequest(request) {\n const entry = active.current.get(request.startIndex);\n if (entry?.request.requestId === request.requestId) {\n const onRequest = entry.onRequest;\n return onRequest(request);\n }\n },\n onSettled(requestId) {\n const entry = [...active.current.values()].find(candidate => candidate.request.requestId === requestId);\n if (!entry) return;\n entry.done = true;\n setVersion(value => value + 1);\n },\n });\n return () => {\n executor.current?.dispose();\n executor.current = null;\n active.current.clear();\n retryBlocks.current.clear();\n };\n }, [data?.revision, data?.rowCount, data?.blockSize]);\n useEffect(() => {\n if (!data || !onRequest || !executor.current) return;\n const range = { startIndex: start, endIndex: end };\n const retained = reduceCominsViewportData(data, { type: \"retain\", range });\n if (retained !== data) onChangeData?.(retained);\n const plan = planViewportRequests({ data, range, active: [...active.current.values()], retryStarts: [...retryBlocks.current], maxConcurrent: input.maxConcurrentRequests });\n for (const [index, entry] of active.current) {\n const id = entry.request.requestId;\n if (plan.cancelRequestIds.includes(id)) { executor.current.cancel(id); active.current.delete(index); }\n else if (plan.releaseRequestIds.includes(id)) { executor.current.release(id); active.current.delete(index); }\n }\n for (const index of plan.consumedRetryStarts) retryBlocks.current.delete(index);\n for (const nextRange of plan.startRanges) {\n const request = { ...nextRange, revision: data.revision, requestId: `comins-viewport-${++nextRequestId}`, retainRange: range };\n active.current.set(request.startIndex, { request, done: false, onRequest });\n executor.current.start(request);\n }\n }, [data, onRequest, onChangeData, start, end, input.maxConcurrentRequests, version]);\n return (index: number) => {\n if (!data) return;\n retryBlocks.current.add(Math.floor(index / data.blockSize) * data.blockSize);\n setVersion(value => value + 1);\n };\n}\n","import { useLayoutEffect, useRef, useState } from \"react\";\nimport type React from \"react\";\nimport type { CominsRowId } from \"./core\";\nimport type { CominsEventRow, CominsRowDragReason, CominsRowDragResult, CominsRowDragTarget, CominsTableRowProps } from \"./index\";\nimport { resolveCoreTreeDropContext, resolveCoreTreePointerPosition } from \"./core/selection/navigation\";\nimport { applyCominsDragScroll, focusCominsPointerTarget, registerCominsPointerListeners, startCominsPointerFrames } from \"./browser/pointer\";\nimport { moveCominsTreeNode, type CominsTreeDropContext, type CominsTreeDropPosition, type CominsTreeNode, type CominsTreeRowDragConfig, type CominsVisibleTreeRow } from \"./tree\";\n\nexport type CominsBeforeTreeRowDragPayload<T> = {\n event: React.PointerEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>;\n row: CominsEventRow<T>;\n};\nexport type CominsTreeRowDragPayload<T> = {\n event: PointerEvent | KeyboardEvent;\n row: CominsEventRow<T>;\n target: CominsRowDragTarget;\n};\nexport type CominsAfterTreeRowDragPayload<T> = {\n event: PointerEvent | KeyboardEvent | null;\n row: CominsEventRow<T>;\n target?: CominsRowDragTarget;\n reason: CominsRowDragReason;\n result: CominsRowDragResult;\n};\n\ntype Options<T> = {\n data: readonly CominsTreeNode<T>[];\n entries: readonly CominsVisibleTreeRow<T>[];\n getRowId: (row: T, index: number) => CominsRowId;\n config?: CominsTreeRowDragConfig<T>;\n sorted: boolean;\n rowProps?: CominsTableRowProps<T>;\n onChangeData?: (data: CominsTreeNode<T>[]) => void;\n onBeforeRowDrag?: (payload: CominsBeforeTreeRowDragPayload<T>) => boolean | void;\n onRowDrag?: (payload: CominsTreeRowDragPayload<T>) => void;\n onAfterDragRow?: (payload: CominsAfterTreeRowDragPayload<T>) => void;\n};\ntype Preview<T> = { context: CominsTreeDropContext<T>; valid: boolean };\ntype Gesture<T> = {\n root: HTMLElement;\n source: CominsEventRow<T>;\n target: Preview<T> | null;\n keyboard: boolean;\n cleanup: () => void;\n};\nconst pathKey = (path: readonly number[]) => path.join(\".\");\n\nexport function useCominsTreeDrag<T>(options: Options<T>) {\n const committed = useRef(options);\n const gesture = useRef<Gesture<T> | null>(null);\n const navigateRef = useRef<((id: CominsRowId) => void) | null>(null);\n const pendingFocus = useRef<{ root: HTMLElement; id: CominsRowId; keyboard: boolean } | null>(null);\n const pendingScrollTop = useRef<number | null>(null);\n const [preview, setPreview] = useState<Preview<T> | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n\n const targetPayload = (target: Preview<T>): CominsRowDragTarget => ({\n rowId: target.context.target.rowId,\n dataIndex: committed.current.entries.indexOf(target.context.target),\n valid: target.valid,\n tree: { ...target.context.destination, position: target.context.position },\n });\n const finish = (commit: boolean, event: PointerEvent | KeyboardEvent | null, reason: CominsRowDragReason) => {\n const current = gesture.current;\n if (!current) return;\n gesture.current = null;\n current.cleanup();\n setPreview(null);\n const props = committed.current;\n let result: CominsRowDragResult = commit ? \"rejected\" : \"cancelled\";\n if (commit && current.target?.valid && props.onChangeData) {\n const target = current.target.context;\n const next = props.config?.canDrop?.(target) === false ? props.data : moveCominsTreeNode(props.data, current.source.id, target.destination, props.getRowId, props.config);\n if (next !== props.data) {\n result = \"moved\";\n if (!current.keyboard) {\n pendingScrollTop.current = current.root.querySelector<HTMLElement>(\".comins-table__body-viewport\")?.scrollTop ?? null;\n }\n props.onChangeData([...next]);\n }\n }\n const focusId = result === \"moved\" && current.target?.context.position === \"inside\"\n ? current.target.context.target.rowId : current.source.id;\n pendingFocus.current = { root: current.root, id: focusId, keyboard: current.keyboard };\n setAnnouncement(result === \"moved\" ? `Moved ${String(current.source.id)}` : `Move ${result}`);\n props.onAfterDragRow?.({ event, row: current.source, result, reason: commit && result !== \"moved\" ? \"invalid-target\" : reason, ...(current.target ? { target: targetPayload(current.target) } : {}) });\n };\n\n const restoreFocus = () => {\n const focus = pendingFocus.current;\n if (!focus) return;\n const handle = Array.from(focus.root.querySelectorAll<HTMLElement>(\"[data-comins-tree-drag-handle]\")).find(element => element.dataset.testid === `row-drag-handle-${String(focus.id)}`);\n if (handle) {\n // Overscan DOM에 있어도 키보드 복구 대상은 화면 밖일 수 있다.\n if (focus.keyboard) handle.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n focusCominsPointerTarget(handle);\n pendingFocus.current = null;\n pendingScrollTop.current = null;\n }\n else navigateRef.current?.(focus.id);\n };\n\n useLayoutEffect(() => {\n if (gesture.current && (committed.current.data !== options.data || committed.current.config?.allowReparent !== options.config?.allowReparent || committed.current.config?.canDrop !== options.config?.canDrop || Boolean(committed.current.config) !== Boolean(options.config) || committed.current.rowProps?.disabled !== options.rowProps?.disabled || committed.current.rowProps?.draggable !== options.rowProps?.draggable || committed.current.sorted !== options.sorted || committed.current.getRowId !== options.getRowId || Boolean(committed.current.onChangeData) !== Boolean(options.onChangeData))) {\n finish(false, null, \"stale-target\");\n }\n committed.current = options;\n });\n useLayoutEffect(() => () => finish(false, null, \"pointer-cancel\"), []);\n\n const choose = (targetId: CominsRowId, position: CominsTreeDropPosition, event: PointerEvent | KeyboardEvent) => {\n const current = gesture.current;\n const props = committed.current;\n if (!current) return;\n const context = resolveCoreTreeDropContext({ entries: props.entries, sourceId: current.source.id, targetId, position });\n if (!context) return;\n const { source } = context;\n const valid = !props.sorted && Boolean(props.config && props.onChangeData) && props.config?.canDrop?.(context) !== false && moveCominsTreeNode(props.data, source.rowId, context.destination, props.getRowId, props.config) !== props.data;\n if (current.target?.context.target.rowId === targetId && current.target.context.position === position && current.target.valid === valid) return;\n current.target = { context, valid };\n setPreview(current.target);\n setAnnouncement(`${position} ${String(targetId)}${valid ? \"\" : \", unavailable\"}`);\n props.onRowDrag?.({ event, row: current.source, target: targetPayload(current.target) });\n };\n\n const begin = (event: React.PointerEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>, row: CominsEventRow<T>, keyboard: boolean) => {\n const props = committed.current;\n const disabled = props.rowProps?.disabled;\n const draggable = props.rowProps?.draggable;\n if (!props.config || props.sorted || !props.onChangeData || gesture.current ||\n (typeof disabled === \"function\" ? disabled(row.data, row.dataIndex) : disabled) ||\n (typeof draggable === \"function\" ? draggable(row.data, row.dataIndex) : draggable) === false) return false;\n const root = event.currentTarget.closest<HTMLElement>(\"[data-comins-table-instance-id]\");\n if (!root || props.onBeforeRowDrag?.({ event, row }) === false) return false;\n event.preventDefault();\n event.stopPropagation();\n gesture.current = { root, source: row, keyboard, target: null, cleanup: () => {} };\n setAnnouncement(`Moving ${String(row.id)}. Use arrow keys to choose a destination, Enter to drop, Escape to cancel.`);\n return true;\n };\n\n const onPointerDown = (event: React.PointerEvent<HTMLElement>, row: CominsEventRow<T>) => {\n if (event.button !== 0 || !begin(event, row, false)) return;\n const current = gesture.current!;\n const viewport = current.root.querySelector<HTMLElement>(\".comins-table__body-viewport\");\n let lastEvent = event.nativeEvent;\n let lastTime = performance.now();\n const update = (pointer: PointerEvent) => {\n const element = document.elementFromPoint(pointer.clientX, pointer.clientY)?.closest<HTMLElement>(\"[data-comins-row-data-index]\");\n if (!element || element.closest(\"[data-comins-table-instance-id]\") !== current.root) {\n current.target = null;\n setPreview(null);\n return;\n }\n const entry = committed.current.entries[Number(element.dataset.cominsRowDataIndex)];\n if (!entry || element.dataset.testid !== `row-${String(entry.rowId)}`) return;\n const rect = element.getBoundingClientRect();\n const fraction = (pointer.clientY - rect.top) / Math.max(1, rect.height);\n choose(entry.rowId, resolveCoreTreePointerPosition(fraction, committed.current.config?.allowReparent), pointer);\n };\n const tick = (now: number) => {\n if (viewport) {\n const rect = viewport.getBoundingClientRect();\n const insideX = lastEvent.clientX >= rect.left && lastEvent.clientX <= rect.right;\n applyCominsDragScroll(viewport, { clientY: lastEvent.clientY, top: Math.max(0, rect.top), bottom: Math.min(window.innerHeight, rect.bottom), deltaMs: now - lastTime, enabled: insideX, onlyIfChanged: true });\n }\n update(lastEvent);\n lastTime = now;\n };\n const move = (pointer: PointerEvent) => { lastEvent = pointer; update(pointer); };\n const up = (pointer: PointerEvent) => { update(pointer); finish(true, pointer, \"drop\"); };\n const cancel = (pointer: PointerEvent) => finish(false, pointer, \"pointer-cancel\");\n const blur = () => finish(false, null, \"blur\");\n const key = (keyboard: KeyboardEvent) => { if (keyboard.key === \"Escape\") { keyboard.preventDefault(); finish(false, keyboard, \"escape\"); } };\n const removeListeners = registerCominsPointerListeners({ move, up, cancel, blur, key });\n const stopFrames = startCominsPointerFrames(tick);\n current.cleanup = () => { stopFrames(); removeListeners(); };\n };\n\n const moveByKeyboard = (event: KeyboardEvent) => {\n const current = gesture.current;\n if (!current?.keyboard || ![\"Escape\", \"Enter\", \" \", \"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(event.key)) return;\n event.preventDefault();\n event.stopPropagation();\n if (event.key === \"Escape\") return finish(false, event, \"escape\");\n if (event.key === \"Enter\") return finish(true, event, \"drop\");\n const entries = committed.current.entries;\n const currentIndex = entries.findIndex(entry => entry.rowId === (current.target?.context.target.rowId ?? current.source.id));\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const target = entries[Math.max(0, Math.min(entries.length - 1, currentIndex + (event.key === \"ArrowDown\" ? 1 : -1)))];\n if (target) {\n choose(target.rowId, event.key === \"ArrowDown\" ? \"after\" : \"before\", event);\n navigateRef.current?.(target.rowId);\n }\n } else if (event.key === \"ArrowRight\" && committed.current.config?.allowReparent) {\n const target = entries[currentIndex];\n if (target) choose(target.rowId, \"inside\", event);\n } else if (event.key === \"ArrowLeft\" && committed.current.config?.allowReparent) {\n const source = entries.find(entry => entry.rowId === current.source.id);\n const parent = source && entries.find(entry => pathKey(entry.path) === pathKey(source.path.slice(0, -1)));\n if (parent) { choose(parent.rowId, \"after\", event); navigateRef.current?.(parent.rowId); }\n }\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLElement>, row: CominsEventRow<T>) => {\n if (!gesture.current && event.key === \" \" && begin(event, row, true)) {\n const blur = () => finish(false, null, \"blur\");\n // The source handle can unmount while navigating a virtualized tree.\n window.addEventListener(\"keydown\", moveByKeyboard, true);\n window.addEventListener(\"blur\", blur);\n gesture.current!.cleanup = () => {\n window.removeEventListener(\"keydown\", moveByKeyboard, true);\n window.removeEventListener(\"blur\", blur);\n };\n }\n };\n\n return { announcement, navigateRef, pendingScrollTop, restoreFocus, onPointerDown, onKeyDown, preview };\n}\n","export type CominsSummaryBuiltin = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\n\nfunction getNumericValues(values: readonly unknown[]) {\n return values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n}\n\nexport function getBuiltinSummaryValue(kind: CominsSummaryBuiltin, values: readonly unknown[]): number | null {\n if (kind === \"count\") {\n return values.length;\n }\n\n const numericValues = getNumericValues(values);\n\n if (numericValues.length === 0) {\n return null;\n }\n\n if (kind === \"sum\") {\n return numericValues.reduce((total, value) => total + value, 0);\n }\n\n if (kind === \"avg\") {\n return numericValues.reduce((total, value) => total + value, 0) / numericValues.length;\n }\n\n return kind === \"min\" ? Math.min(...numericValues) : Math.max(...numericValues);\n}\n","import type React from \"react\";\n\nimport type { CominsTableRuntimeColumn } from \"./react/core-compat\";\n\nexport type CominsSummaryBuiltin = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\n\nexport type CominsSummaryAggregator<TData> = (input: {\n column: CominsTableRuntimeColumn<TData>;\n rows: readonly TData[];\n values: readonly unknown[];\n}) => React.ReactNode;\n\nexport type CominsSummaryFormatPayload<TData> = {\n column: CominsTableRuntimeColumn<TData>;\n rows: readonly TData[];\n value: React.ReactNode;\n values: readonly unknown[];\n};\n\nexport type CominsSummaryRenderPayload<TData> = CominsSummaryFormatPayload<TData> & {\n formattedValue: React.ReactNode;\n};\n\nexport type CominsSummaryColumnConfig<TData> = {\n aggregate: CominsSummaryBuiltin | CominsSummaryAggregator<TData>;\n className?: string;\n colSpan?: number;\n format?: (payload: CominsSummaryFormatPayload<TData>) => React.ReactNode;\n /** Render after aggregate/format; undefined keeps formattedValue, null hides content. */\n render?: (payload: CominsSummaryRenderPayload<TData>) => React.ReactNode;\n style?: React.CSSProperties;\n};\n\nexport type CominsSummaryColumn<TData> =\n | CominsSummaryBuiltin\n | CominsSummaryAggregator<TData>\n | CominsSummaryColumnConfig<TData>;\n\nexport type CominsTableSummaryConfig<TData> = {\n className?: string;\n columns: Partial<Record<string, CominsSummaryColumn<TData>>>;\n label?: React.ReactNode;\n style?: React.CSSProperties;\n};\n\nfunction getNestedFieldValue(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, key) => {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[key];\n }, row);\n}\n\nimport { getBuiltinSummaryValue } from \"./core/rows/summary\";\n\nexport function resolveCominsSummaryValues<TData>(\n rows: readonly TData[],\n columns: readonly CominsTableRuntimeColumn<TData>[],\n summary: CominsTableSummaryConfig<TData>,\n): { values: Record<string, React.ReactNode>; renderedColumnIds: ReadonlySet<string> } {\n const renderedColumnIds = new Set<string>();\n const result = Object.entries(summary.columns).reduce<Record<string, React.ReactNode>>((valuesByColumnId, [columnId, configuredColumn]) => {\n const column = columns.find((candidate) => candidate.id === columnId);\n\n if (!column || !configuredColumn) {\n return valuesByColumnId;\n }\n\n const config =\n typeof configuredColumn === \"object\" && configuredColumn !== null ? configuredColumn : undefined;\n const aggregate =\n typeof configuredColumn === \"object\" && configuredColumn !== null\n ? configuredColumn.aggregate\n : configuredColumn;\n const values = rows.map((row) => getNestedFieldValue(row, column.field));\n const value =\n typeof aggregate === \"function\" ? aggregate({ column, rows, values }) : getBuiltinSummaryValue(aggregate, values);\n const formattedValue = config?.format ? config.format({ column, rows, value, values }) : value;\n if (config?.render) {\n renderedColumnIds.add(columnId);\n const rendered = config.render({ column, rows, value, values, formattedValue });\n valuesByColumnId[columnId] = rendered === undefined ? formattedValue : rendered;\n } else {\n valuesByColumnId[columnId] = formattedValue;\n }\n\n return valuesByColumnId;\n }, {});\n return { values: result, renderedColumnIds };\n}\n\nexport function getCominsSummaryValues<TData>(\n rows: readonly TData[],\n columns: readonly CominsTableRuntimeColumn<TData>[],\n summary: CominsTableSummaryConfig<TData>,\n): Record<string, React.ReactNode> {\n return resolveCominsSummaryValues(rows, columns, summary).values;\n}\n","import type { CominsRowId } from \"../model\";\n\nexport const COMINS_MAX_PHYSICAL_TOTAL_HEIGHT = 1_500_000;\n\nexport type CominsDataVirtualSlot<TData> = {\n absoluteIndex?: number;\n dataIndex: number;\n detail?: {\n estimated: boolean;\n height: number;\n mode: \"auto\" | \"fixed\";\n };\n key: string;\n kind: \"data\";\n rowHeight?: number;\n autoHeight?: boolean;\n row: TData;\n rowId: CominsRowId;\n visibleIndex: number;\n};\n\nexport type CominsGroupVirtualSlot = {\n groupId: CominsRowId;\n height: number;\n key: string;\n kind: \"group\";\n};\n\nexport type CominsPlaceholderVirtualSlot = {\n kind: \"placeholder\";\n key: string;\n absoluteIndex: number;\n height: number;\n};\n\nexport type CominsVirtualSlot<TData> =\n | CominsDataVirtualSlot<TData>\n | CominsPlaceholderVirtualSlot\n | CominsGroupVirtualSlot;\n\nexport type CominsVirtualRange = {\n endIndex: number;\n logicalScrollTop: number;\n logicalStartOffset: number;\n physicalScrollHeight: number;\n renderOffset: number;\n scrollScale: number;\n startIndex: number;\n};\n\nexport type CominsScrollAnchor = {\n key: string;\n offsetWithinSlot: number;\n previousIndex: number;\n};\n\nexport function getCominsDataSlotKey(rowId: CominsRowId) {\n return `data:${typeof rowId}:${encodeURIComponent(String(rowId))}`;\n}\n\nexport function createCominsDataVirtualSlot<TData>(input: {\n dataIndex: number;\n detail: CominsDataVirtualSlot<TData>[\"detail\"] | null;\n row: TData;\n rowHeight: number;\n autoHeight?: boolean;\n rowId: CominsRowId;\n visibleIndex: number;\n}): CominsDataVirtualSlot<TData> {\n return {\n dataIndex: input.dataIndex,\n ...(input.detail ? { detail: input.detail } : {}),\n key: getCominsDataSlotKey(input.rowId),\n kind: \"data\",\n row: input.row,\n rowHeight: input.rowHeight,\n autoHeight: input.autoHeight,\n rowId: input.rowId,\n visibleIndex: input.visibleIndex,\n };\n}\n\nexport function normalizeCominsDetailEstimate(\n value: number | undefined,\n fallbackHeight: number,\n) {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return value;\n }\n\n return Math.max(1, fallbackHeight);\n}\n\nexport function normalizeCominsDetailHeight(\n value: number | \"auto\" | undefined,\n): { mode: \"auto\" } | { height: number; mode: \"fixed\" } {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? { height: value, mode: \"fixed\" }\n : { mode: \"auto\" };\n}\n\nexport class CominsHeightIndex {\n private readonly heights: Float64Array;\n private readonly tree: Float64Array;\n private totalHeight: number;\n\n private constructor(heights: readonly number[]) {\n this.heights = Float64Array.from(heights, (height) => Math.max(0, height));\n this.tree = new Float64Array(this.heights.length + 1);\n this.totalHeight = 0;\n\n for (let index = 0; index < this.heights.length; index += 1) {\n const cursor = index + 1;\n const height = this.heights[index] ?? 0;\n const parent = cursor + (cursor & -cursor);\n\n this.tree[cursor] = (this.tree[cursor] ?? 0) + height;\n this.totalHeight += height;\n\n if (parent < this.tree.length) {\n this.tree[parent] =\n (this.tree[parent] ?? 0) + (this.tree[cursor] ?? 0);\n }\n }\n }\n\n static from(heights: readonly number[]) {\n return new CominsHeightIndex(heights);\n }\n\n private add(index: number, delta: number) {\n for (let cursor = index + 1; cursor < this.tree.length; cursor += cursor & -cursor) {\n this.tree[cursor] = (this.tree[cursor] ?? 0) + delta;\n }\n }\n\n getHeight(index: number) {\n return this.heights[index] ?? 0;\n }\n\n getPrefixHeight(endExclusive: number) {\n let total = 0;\n\n for (\n let cursor = Math.min(this.heights.length, Math.max(0, endExclusive));\n cursor > 0;\n cursor -= cursor & -cursor\n ) {\n total += this.tree[cursor] ?? 0;\n }\n\n return total;\n }\n\n getTotalHeight() {\n return this.totalHeight;\n }\n\n findIndexAtOffset(offset: number) {\n if (this.heights.length === 0 || this.totalHeight <= 0) {\n return 0;\n }\n\n const target = Math.min(\n Math.max(0, offset),\n Math.max(0, this.getTotalHeight() - Number.EPSILON),\n );\n let treeIndex = 0;\n let prefix = 0;\n let bit = 1;\n\n while (bit * 2 < this.tree.length) {\n bit *= 2;\n }\n\n for (; bit > 0; bit = Math.floor(bit / 2)) {\n const next = treeIndex + bit;\n const nextPrefix = prefix + (this.tree[next] ?? 0);\n\n if (next < this.tree.length && nextPrefix <= target) {\n treeIndex = next;\n prefix = nextPrefix;\n }\n }\n\n return Math.min(this.heights.length - 1, treeIndex);\n }\n\n updateHeight(index: number, height: number) {\n const next = Math.max(0, height);\n const current = this.heights[index];\n\n if (current === undefined) {\n return 0;\n }\n\n const delta = next - current;\n this.heights[index] = next;\n this.totalHeight += delta;\n this.add(index, delta);\n return delta;\n }\n}\n\nexport type CominsDetailMeasurement = {\n height: number;\n width: number;\n};\n\nexport function getCominsSlotHeight<TData>(\n slot: CominsVirtualSlot<TData>,\n rowHeight: number,\n) {\n return slot.kind !== \"data\"\n ? slot.height\n : (slot.rowHeight ?? rowHeight) + (slot.detail?.height ?? 0);\n}\n\nexport function getCominsScrollScale(\n logicalTotalHeight: number,\n viewportHeight: number,\n) {\n const physicalScrollHeight = Math.min(\n logicalTotalHeight,\n COMINS_MAX_PHYSICAL_TOTAL_HEIGHT,\n );\n const logicalScrollableHeight = Math.max(0, logicalTotalHeight - viewportHeight);\n const physicalScrollableHeight = Math.max(0, physicalScrollHeight - viewportHeight);\n const scrollScale =\n logicalScrollableHeight > 0 && physicalScrollableHeight > 0\n ? logicalScrollableHeight / physicalScrollableHeight\n : 1;\n\n return {\n logicalScrollableHeight,\n physicalScrollableHeight,\n physicalScrollHeight,\n scrollScale,\n };\n}\n\nexport function getCominsMixedVirtualRange(input: {\n heightIndex: Pick<CominsHeightIndex, \"getTotalHeight\" | \"getPrefixHeight\" | \"findIndexAtOffset\">;\n overscan: number;\n physicalScrollTop: number;\n viewportHeight: number;\n}): CominsVirtualRange {\n const metrics = getCominsScrollScale(\n input.heightIndex.getTotalHeight(),\n input.viewportHeight,\n );\n const physicalScrollTop = Math.min(\n metrics.physicalScrollableHeight,\n Math.max(0, input.physicalScrollTop),\n );\n const logicalScrollTop = Math.min(\n metrics.logicalScrollableHeight,\n physicalScrollTop * metrics.scrollScale,\n );\n const firstVisibleIndex = input.heightIndex.findIndexAtOffset(logicalScrollTop);\n const lastVisibleIndex = input.heightIndex.findIndexAtOffset(\n logicalScrollTop + Math.max(0, input.viewportHeight),\n );\n const startIndex = Math.max(0, firstVisibleIndex - Math.max(0, input.overscan));\n const endIndex = Math.min(\n lastVisibleIndex + Math.max(0, input.overscan) + 1,\n input.heightIndex.findIndexAtOffset(Number.POSITIVE_INFINITY) + 1,\n );\n const logicalStartOffset = input.heightIndex.getPrefixHeight(startIndex);\n\n return {\n endIndex,\n logicalScrollTop,\n logicalStartOffset,\n physicalScrollHeight: metrics.physicalScrollHeight,\n renderOffset:\n physicalScrollTop -\n (logicalScrollTop - logicalStartOffset),\n scrollScale: metrics.scrollScale,\n startIndex,\n };\n}\n\nexport function resolveCominsMeasuredDetailHeight(\n cache: ReadonlyMap<CominsRowId, CominsDetailMeasurement>,\n rowId: CominsRowId,\n width: number,\n estimate: number,\n) {\n const measurement = cache.get(rowId);\n\n return measurement && measurement.width === Math.round(width)\n ? { estimated: false, height: measurement.height }\n : { estimated: true, height: estimate };\n}\n\nexport function reconcileCominsDetailMeasurements(\n cache: Map<CominsRowId, CominsDetailMeasurement>,\n rowIds: ReadonlySet<CominsRowId>,\n) {\n for (const rowId of cache.keys()) {\n if (!rowIds.has(rowId)) {\n cache.delete(rowId);\n }\n }\n}\n\nexport function captureCominsScrollAnchor(input: {\n heightIndex: CominsHeightIndex;\n keys: readonly string[];\n logicalScrollTop: number;\n}): CominsScrollAnchor | undefined {\n if (input.keys.length === 0) {\n return undefined;\n }\n\n const previousIndex = input.heightIndex.findIndexAtOffset(input.logicalScrollTop);\n const key = input.keys[previousIndex];\n\n if (key === undefined) {\n return undefined;\n }\n\n const slotStart = input.heightIndex.getPrefixHeight(previousIndex);\n return {\n key,\n offsetWithinSlot: Math.max(0, input.logicalScrollTop - slotStart),\n previousIndex,\n };\n}\n\nexport function resolveCominsAnchorLogicalScrollTop(input: {\n anchor: CominsScrollAnchor;\n nextHeightIndex: CominsHeightIndex;\n nextKeys: readonly string[];\n previousKeys: readonly string[];\n}) {\n const target = resolveCominsAnchorTarget({\n anchor: input.anchor,\n getNextHeight: (index) => input.nextHeightIndex.getHeight(index),\n nextKeys: input.nextKeys,\n previousKeys: input.previousKeys,\n });\n\n return target\n ? input.nextHeightIndex.getPrefixHeight(target.index) + target.offsetWithinSlot\n : 0;\n}\n\nexport function resolveCominsAnchorTarget(input: {\n anchor: CominsScrollAnchor;\n getNextHeight: (index: number) => number;\n nextKeys: readonly string[];\n previousKeys: readonly string[];\n}) {\n let nextIndex = input.nextKeys.indexOf(input.anchor.key);\n\n if (nextIndex === -1) {\n const nextIndexByKey = new Map<string, number>();\n for (let index = 0; index < input.nextKeys.length; index += 1) {\n if (index in input.nextKeys) {\n const key = input.nextKeys[index];\n if (key !== undefined && !nextIndexByKey.has(key)) {\n nextIndexByKey.set(key, index);\n }\n }\n }\n\n for (\n let previousIndex = Math.min(input.anchor.previousIndex - 1, input.previousKeys.length - 1);\n previousIndex >= 0;\n previousIndex -= 1\n ) {\n nextIndex = nextIndexByKey.get(input.previousKeys[previousIndex] ?? \"\") ?? -1;\n if (nextIndex !== -1) {\n break;\n }\n }\n\n if (nextIndex === -1) {\n for (\n let previousIndex = Math.max(0, input.anchor.previousIndex + 1);\n previousIndex < input.previousKeys.length;\n previousIndex += 1\n ) {\n nextIndex = nextIndexByKey.get(input.previousKeys[previousIndex] ?? \"\") ?? -1;\n if (nextIndex !== -1) {\n break;\n }\n }\n }\n }\n\n if (nextIndex === -1) {\n return undefined;\n }\n\n return {\n index: nextIndex,\n offsetWithinSlot: Math.min(\n Math.max(0, input.anchor.offsetWithinSlot),\n Math.max(0, input.getNextHeight(nextIndex)),\n ),\n };\n}\n\nexport function getCominsPhysicalScrollTop(\n logicalScrollTop: number,\n logicalTotalHeight: number,\n viewportHeight: number,\n) {\n const metrics = getCominsScrollScale(logicalTotalHeight, viewportHeight);\n\n return Math.min(\n metrics.physicalScrollableHeight,\n Math.max(0, logicalScrollTop) / metrics.scrollScale,\n );\n}\n","import { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { runViewportRequest } from \"./browser/viewport-requests\";\nimport { createCominsViewportData, reduceCominsViewportData, type CominsViewportData, type CominsViewportDataEvent, type CominsViewportPatch, type CominsViewportRequest, type CominsViewportRevision } from \"./viewport-data\";\n\nexport type CominsViewportDatasource = {\n revision: CominsViewportRevision;\n maxConcurrentRequests?: number;\n heightCacheSize?: number;\n};\nexport type CominsViewportOptions<T> = {\n rowCount: number;\n queryKey: CominsViewportRevision;\n getRows: (request: CominsViewportRequest) => readonly T[] | Promise<readonly T[]>;\n blockSize?: number;\n cacheSize?: number;\n maxConcurrentRequests?: number;\n heightCacheSize?: number;\n onEdit?: (changes: readonly CominsViewportPatch<T>[]) => void;\n};\n\n/** State lives with the consumer. The Table receives a controlled snapshot and callbacks. */\nexport function useCominsViewport<T>(options: CominsViewportOptions<T>) {\n const initial = useMemo(() => createCominsViewportData<T>({ revision: options.queryKey, rowCount: options.rowCount, blockSize: options.blockSize, cacheSize: options.cacheSize }), [options.queryKey, options.rowCount, options.blockSize, options.cacheSize]);\n const [state, setState] = useState({ initial, data: initial });\n const data = state.initial === initial ? state.data : initial;\n const latest = useRef(options);\n const activeInitial = useRef(initial);\n const mounted = useRef(false);\n useLayoutEffect(() => { latest.current = options; activeInitial.current = initial; });\n useLayoutEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []);\n const dispatch = useCallback((event: CominsViewportDataEvent<T>) => {\n if (!mounted.current || activeInitial.current !== initial) return;\n setState(previous => {\n const current = previous.initial === initial ? previous.data : initial;\n const next = reduceCominsViewportData(current, event);\n return previous.initial === initial && next === previous.data ? previous : { initial, data: next };\n });\n }, [initial]);\n const onViewportRequest = useCallback(async (request: CominsViewportRequest) => {\n if (request.signal.aborted || request.revision !== initial.revision) return;\n return runViewportRequest({ request, getRows: request => latest.current.getRows(request), dispatch });\n }, [initial, dispatch]);\n const onChangeData = useCallback((next: CominsViewportData<T>) => {\n if (next.revision !== initial.revision) return;\n if (next.changes.length) {\n latest.current.onEdit?.(next.changes);\n dispatch({ type: \"patch\", changes: next.changes });\n } else {\n dispatch({ type: \"retain\", range: next.retainRange });\n }\n }, [initial, dispatch]);\n const viewportDatasource = useMemo<CominsViewportDatasource>(() => ({ revision: initial.revision, maxConcurrentRequests: options.maxConcurrentRequests, heightCacheSize: options.heightCacheSize }), [initial, options.maxConcurrentRequests, options.heightCacheSize]);\n return { data, tableProps: { data, onChangeData, onViewportRequest, viewportDatasource, virtualized: true as const } };\n}\n","import { createCrossTableAutoScroll, isCominsNativeEditor as isNativeEditor } from \"./browser/pointer\";\nimport { createMeasurementObserver, hasCominsResizeObserver, measureCominsElement, observeCominsViewport, observeCominsFontChanges, getCominsElementRect } from \"./browser/measurements\";\nimport { setCominsScrollTop, setCominsScrollLeft, scrollCominsRowIntoView, focusCominsElement, createCominsDetailFocusRestorer } from \"./browser/scroll\";\nimport { writeCominsClipboardText, readCominsClipboardEvent, writeCominsClipboardEvent } from \"./browser/clipboard\";\nimport { getCrossTableTransferHit as getBrowserTransferHit } from \"./browser/table-transfer\";\nimport {\n getEffectiveColumnMinWidth,\n getEffectiveColumnMaxWidth,\n clampColumnWidth,\n setColumnWidthInsideParentGroup,\n} from \"./column-layout\";\nimport { setCominsNestedInputValue } from \"./row-value\";\nimport {\n getNextSortModel,\n getSortRule,\n getSortIndicatorState,\n getAriaSortState,\n reconcileColumnOrderHistory,\n} from \"./table-state\";\nimport { reconcileReactState, notifyReactInputChanges, notifyReactStateChanges } from \"./react/state\";\nimport { CominsCellTooltip, useCominsCellTooltip } from \"./react/cell-tooltip\";\nimport { getSortedReactTree, projectReactRows, projectCoreViewportWindow, getCorePageProjection } from \"./react/rows\";\nimport type { CominsEventRow } from \"./model\";\nexport type { CominsEventRow } from \"./model\";\nimport type React from \"react\";\nimport {\n Fragment,\n forwardRef,\n isValidElement,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n applyCominsColumnLayout,\n clearCominsSortState,\n copyCominsCell,\n copyCominsCellRange,\n copyCominsRow,\n createCominsTableState,\n fillCominsCellRange,\n parseCominsClipboardText,\n pasteCominsText,\n getCominsCellValue,\n getCominsHeaderRows,\n getCominsSortedRowIndexes,\n getCominsVisibleColumns,\n isCominsCellInSelectedRange,\n isCominsCellSelected,\n moveCominsColumn,\n moveCominsColumnGroup,\n moveCominsRow,\n moveCominsRowToGroup,\n pasteCominsCell,\n pasteCominsCellRange,\n pasteCominsRow,\n selectCell,\n selectCellRange,\n selectRow,\n selectRows,\n serializeCominsColumnLayout,\n setCominsColumnWidth,\n setCominsColumnGroupWidth,\n setCominsSortModel,\n setCominsSortState,\n updateCominsRows,\n} from \"./react/core-compat\";\nimport { copySelectionData, selectedCellValues, selectedRowData, type CominsCopyTarget, type CominsSelectedCell } from \"./selection-data\";\nexport type { CominsCopyTarget, CominsSelectedCell, CominsSelectionCopy } from \"./selection-data\";\nimport { getCominsColumnMouseIntent } from \"./column-pointer\";\nimport { CominsColumnFilterControl } from \"./column-filter\";\nimport {\n getCominsPinnedBlockResizeMaxWidth,\n getCominsColumnPinningSpanFragments,\n resolveCominsColumnPinning,\n} from \"./column-pinning\";\nimport { renderCominsBuiltInComponent, type CominsBuiltInComponentInteraction } from \"./component-renderer\";\nimport {\n getCominsDragAutoScrollTop,\n getCominsDragAutoScrollVelocity,\n} from \"./drag-autoscroll\";\nimport { CominsRowDetailRow, CominsRowDetailToggle } from \"./row-detail\";\nimport { CominsTableIcon, CominsTableIconButton } from \"./table-icons\";\nimport { useCominsCellFill } from \"./cell-fill\";\nimport {\n createCominsGroupModel,\n getCominsAggregateValue,\n moveCominsRowGroup,\n normalizeCominsRowGrouping,\n orderCominsGroupModel,\n projectCominsGroups,\n} from \"./grouping\";\nimport {\n getCominsFilteredRowIndexes,\n normalizeCominsColumnFilterModel,\n} from \"./filtering\";\nimport {\n emitCominsTableTransfer,\n emitCominsTableTransferRejected,\n getRegisteredTransferSnapshot as getReactTransferSnapshot,\n isCominsTableTransferCoordinator,\n useCominsTableTransferRegistration,\n transferCominsGroupBetweenTables,\n transferCominsRowBetweenTables,\n} from \"./table-transfer\";\nimport { CominsPointerTooltip } from \"./tooltip\";\nimport { createCominsViewportData, reduceCominsViewportData, normalizeCominsViewportInteger, type CominsViewportData, type CominsViewportRequest } from \"./viewport-data\";\nimport { CominsViewportHeightIndex } from \"./viewport-layout\";\nimport { useCominsViewportRequests } from \"./react/viewport\";\nimport type { CominsViewportDatasource } from \"./use-viewport\";\nimport { normalizeCominsRowHeight, resolveCominsRowHeight, type CominsRowHeight, type CominsRowHeightParams, type CominsRowMeasurement } from \"./row-height\";\nimport { useCominsTreeDrag, type CominsBeforeTreeRowDragPayload, type CominsTreeRowDragPayload, type CominsAfterTreeRowDragPayload } from \"./tree-drag\";\nimport { resolveCominsSummaryValues } from \"./summary\";\nimport {\n flattenCominsTree,\n getCominsTreeLeafItems,\n toggleCominsTreeNode,\n updateCominsTreeItem,\n} from \"./tree\";\nimport {\n CominsHeightIndex,\n captureCominsScrollAnchor,\n createCominsDataVirtualSlot,\n getCominsMixedVirtualRange,\n getCominsPhysicalScrollTop,\n getCominsScrollScale,\n getCominsSlotHeight,\n normalizeCominsDetailEstimate,\n normalizeCominsDetailHeight,\n reconcileCominsDetailMeasurements,\n resolveCominsAnchorTarget,\n resolveCominsMeasuredDetailHeight,\n type CominsDataVirtualSlot,\n type CominsDetailMeasurement,\n type CominsScrollAnchor,\n type CominsVirtualSlot,\n} from \"./virtual-layout\";\n\nexport {\n setCominsColumnWidth,\n setCominsColumnHidden,\n setCominsColumnGroupHidden,\n setCominsColumnGroupWidth,\n moveCominsColumn,\n moveCominsColumnGroup,\n serializeCominsColumnLayout,\n applyCominsColumnLayout,\n getCominsVisibleColumns,\n getCominsHeaderRows,\n selectRow,\n selectRows,\n selectCell,\n selectCellRange,\n clearCominsCellRange,\n clearCominsSelection,\n isCominsRowSelected,\n isCominsCellSelected,\n getCominsSelectedCellRange,\n isCominsCellInSelectedRange,\n createCominsTableState,\n queryCominsRows,\n replaceCominsRows,\n addCominsRows,\n updateCominsRows,\n deleteCominsRows,\n setCominsHeaderVisible,\n setCominsPagination,\n setCominsSortState,\n setCominsSortModel,\n clearCominsSortState,\n getCominsSortedRowIndexes,\n sortCominsRows,\n getCominsPageRows,\n getCominsVirtualRows,\n moveCominsRow,\n moveCominsRowToGroup,\n getCominsCellValue,\n} from \"./react/core-compat\";\n\nexport {\n parseCominsClipboardText,\n} from \"./clipboard-text\";\n\nexport type { CominsColumnPinned } from \"./column-pinning\";\n\nexport type {\n CominsRowId,\n CominsTableDensity,\n CominsSortDirection,\n CominsSortState,\n CominsSortModel,\n CominsComponentPrimitiveValue,\n CominsComponentAlign,\n CominsComponentDirection,\n CominsComponentPlacement,\n CominsComponentRowPayload,\n CominsColumnRuntimeState,\n CominsColumnGroupRuntimeState,\n CominsColumnLayout,\n CominsPaginationState,\n CominsSelectionState,\n CominsRowUpdate,\n CominsVirtualRowsOptions,\n CominsVirtualRows,\n CominsCopiedRow,\n CominsCopiedCell,\n CominsCopiedCellRangeCell,\n CominsCopiedCellRange,\n CominsExportFormat,\n CominsExportValueSource,\n CominsExportColumn,\n CominsExportRowsOptions,\n CominsExportMetadata,\n CominsExportTreeOptions,\n CominsExportGroupedOptions,\n CominsCellAddress,\n CominsCellRange,\n CominsPasteRowOptions,\n CominsRowSelectionOptions,\n CominsCellSelectionOptions,\n CominsFillCellRangeOptions,\n} from \"./model\";\n\nexport type {\n CominsTableTheme,\n CominsCellFormatParams,\n CominsColumnValueResolver,\n CominsTableComponentOption,\n CominsVirtualListItem,\n CominsTableMenuItem,\n CominsComponentColumnPayload,\n CominsCellComponentPayload,\n CominsHeaderComponentPayload,\n CominsClipboardGuard,\n CominsColumnProps,\n CominsTableComponentProps,\n CominsTableOptions,\n CominsTableMenuItems,\n CominsVirtualListItems,\n CominsButtonComponentConfig,\n CominsInputCommitEvent,\n CominsInputComponentConfig,\n CominsCheckboxComponentConfig,\n CominsRadioComponentConfig,\n CominsSelectComponentConfig,\n CominsToggleComponentConfig,\n CominsProgressComponentConfig,\n CominsMenuComponentConfig,\n CominsVirtualListSearchFilterPayload,\n CominsVirtualListComponentConfig,\n CominsHeaderComponentConfig,\n CominsCellComponentConfig,\n CominsHeaderComponent,\n CominsCellComponent,\n CominsTableCellConfig,\n CominsTableHeaderConfig,\n CominsTableColumn,\n CominsTableColumnGroup,\n CominsTableRuntimeColumn,\n CominsTableRuntimeColumnGroup,\n CominsEventColumn,\n CominsTableState,\n CominsTableStateInput,\n CominsHeaderColumnCell,\n CominsHeaderGroupCell,\n CominsHeaderCell,\n} from \"./react-types\";\n\nexport type { CominsRowGroupMoveOptions } from \"./core/state/table\";\n\nexport {\n setCominsTableTheme,\n formatCominsCellValue,\n isCominsCellDisabled,\n getCominsCellClassName,\n getCominsCellStyle,\n copyCominsRow,\n pasteCominsRow,\n copyCominsCell,\n pasteCominsCell,\n copyCominsCellRange,\n pasteCominsCellRange,\n pasteCominsText,\n fillCominsCellRange,\n} from \"./react/core-compat\";\nexport { exportCominsRowsToCsv, exportCominsRowsToJson } from \"./core/editing/export\";\nexport { createCominsTreeExportOptions, createCominsGroupedExportOptions } from \"./core/editing/export-structure\";\nexport { importCominsRowsFromCsv } from \"./core/editing/import\";\nexport type { CominsCsvImportOptions, CominsCsvImportRow } from \"./model\";\nexport { getCominsSummaryValues } from \"./summary\";\nexport type { CominsSummaryBuiltin, CominsSummaryAggregator, CominsSummaryFormatPayload, CominsSummaryRenderPayload, CominsSummaryColumnConfig, CominsSummaryColumn, CominsTableSummaryConfig } from \"./summary\";\nexport * from \"./tree\";\nexport { createCominsViewportData, reduceCominsViewportData } from \"./viewport-data\";\nexport type { CominsViewportData, CominsViewportDataOptions, CominsViewportDataEvent, CominsViewportBlock, CominsViewportRange, CominsViewportRequest, CominsViewportRequestState, CominsViewportRevision, CominsViewportPatch } from \"./viewport-data\";\nexport { useCominsViewport } from \"./use-viewport\";\nexport type { CominsViewportOptions, CominsViewportDatasource } from \"./use-viewport\";\nexport type { CominsRowHeight, CominsRowHeightParams } from \"./row-height\";\nexport type { CominsBeforeTreeRowDragPayload, CominsTreeRowDragPayload, CominsAfterTreeRowDragPayload } from \"./tree-drag\";\nexport type {\n CominsColumnFilterConfig,\n CominsColumnFilterKind,\n CominsColumnFilterModel,\n CominsColumnFilterOperator,\n CominsColumnFilterRule,\n CominsColumnFilteringConfig,\n} from \"./filtering\";\nexport { moveCominsRowGroup } from \"./grouping\";\nexport type {\n CominsRowGroupAggregation,\n CominsRowGroupDropPosition,\n CominsRowGroupMoveDetails,\n CominsRowGroupProps,\n CominsRowGroupRenderParams,\n CominsRowGroupingConfig,\n CominsRowGroupingSourceRow,\n CominsSetRowGroupIdParams,\n} from \"./grouping\";\nexport {\n createCominsTableTransferCoordinator,\n transferCominsGroupBetweenTables,\n transferCominsRowBetweenTables,\n} from \"./table-transfer\";\nexport type {\n CominsGroupBetweenTablesInput,\n CominsRowBetweenTablesInput,\n CominsTableGroupTransferDetails,\n CominsTableRowTransferDetails,\n CominsTableTransferConfig,\n CominsTableTransferConflict,\n CominsTableTransferConflictPolicy,\n CominsTableTransferConflictResolver,\n CominsTableTransferCoordinator,\n CominsTableTransferCoordinatorOptions,\n CominsTableTransferDetails,\n CominsTableTransferDropPosition,\n CominsTableTransferEndpoint,\n CominsTableTransferGroupEndpoint,\n CominsTableTransferIntent,\n CominsTableTransferResolvedConflict,\n CominsTableTransferRejection,\n CominsTableTransferRejectionFeedback,\n CominsTableTransferResult,\n CominsTableTransferRowEndpoint,\n} from \"./table-transfer\";\n\nimport type { CominsTableSummaryConfig } from \"./summary\";\nimport type { CominsTreeNode, CominsVisibleTreeRow, CominsTreeRowDragConfig, CominsTreeMoveDestination, CominsTreeDropPosition } from \"./tree\";\nimport type {\n CominsRowGroupingConfig,\n} from \"./grouping\";\nimport type {\n CominsColumnFilterKind,\n CominsColumnFilterRule,\n CominsColumnFilteringConfig,\n} from \"./filtering\";\nimport type {\n CominsTableTransferConfig,\n CominsTableTransferConflict,\n CominsTableTransferEndpoint,\n CominsTableTransferIntent,\n CominsTableTransferRejection,\n CominsTableTransferRegistrationSnapshot,\n} from \"./table-transfer\";\n\nimport type {\n CominsCellAddress,\n CominsCellRange,\n CominsCellComponent,\n CominsCellComponentPayload,\n CominsClipboardGuard,\n CominsColumnLayout,\n CominsColumnProps,\n CominsCopiedCell,\n CominsCopiedCellRange,\n CominsCopiedRow,\n CominsTableColumn,\n CominsTableColumnGroup,\n CominsTableRuntimeColumn,\n CominsTableRuntimeColumnGroup,\n CominsHeaderCell,\n CominsTableState,\n CominsTableTheme,\n CominsEventColumn,\n CominsHeaderComponent,\n CominsHeaderComponentPayload,\n CominsPaginationState,\n CominsRowId,\n CominsSelectionState,\n CominsSortModel,\n CominsSortState,\n} from \"./react/core-compat\";\n\ntype CominsClassValue = string | Record<string, boolean> | undefined;\ntype CominsRowPropValue<TData, TValue> = TValue | ((row: TData, index: number) => TValue);\ntype CominsColumnPointerInteraction = {\n active: boolean;\n blocked: boolean;\n cancelSort: boolean;\n cleanup: () => void;\n id: string;\n kind: \"column\" | \"group\";\n pointerType: string;\n startX: number;\n startY: number;\n timer: number | null;\n};\ntype CominsColumnDropStatus = \"invalid\" | \"neutral\" | \"valid\";\ntype CominsColumnMoveHeader = {\n depth: 0 | 1;\n id: string;\n kind: \"column\" | \"group\";\n parentGroupId?: string;\n};\ntype CominsColumnMoveTarget = CominsColumnMoveHeader & {\n status: CominsColumnDropStatus;\n};\ntype CominsColumnPointerOptions = {\n activateImmediately?: boolean;\n activate: (x: number, y: number) => void;\n commitTarget: (target: CominsColumnMoveHeader) => void;\n event: React.PointerEvent<HTMLElement>;\n id: string;\n kind: \"column\" | \"group\";\n resolveTarget: (target: CominsColumnMoveHeader) => CominsColumnDropStatus;\n sortColumnId?: string;\n source: CominsColumnMoveHeader;\n};\ntype CominsSuppressedSortClick = {\n cleanup: () => void;\n columnId: string;\n timer: number | null;\n};\ntype CominsRowMoveState = {\n sourceRowId: CominsRowId;\n targetDataIndex?: number;\n targetGroupId?: CominsRowId;\n targetTableId?: string;\n valid: boolean;\n};\ntype CominsRowGroupMoveState = {\n position: \"after\" | \"append\" | \"before\";\n sourceGroupId: CominsRowId;\n targetGroupId?: CominsRowId;\n targetTableId?: string;\n};\ntype CominsTransferTableHit<TData, TGroup> = {\n element: HTMLElement;\n root: HTMLElement;\n snapshot: CominsTableTransferRegistrationSnapshot<TData, TGroup>;\n};\ntype CominsCrossTableRowTarget<TData, TGroup> = CominsTransferTableHit<TData, TGroup> & {\n marker: HTMLElement;\n targetGroupId?: CominsRowId;\n targetRowId?: CominsRowId;\n valid: boolean;\n};\ntype CominsCrossTableGroupTarget<TData, TGroup> = CominsTransferTableHit<TData, TGroup> & {\n marker: HTMLElement;\n position: \"after\" | \"append\" | \"before\";\n targetGroupId?: CominsRowId;\n valid: boolean;\n};\ntype CominsTransferRejectionFeedbackState = {\n content: React.ReactNode;\n x: number;\n y: number;\n};\n\nfunction isCominsGroupedTransferEndpoint<TData, TGroup>(\n endpoint: CominsTableTransferEndpoint<TData, TGroup>,\n): endpoint is CominsTableTransferEndpoint<TData, TGroup> & {\n getGroupId: (group: TGroup) => CominsRowId;\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n groups: readonly TGroup[];\n} {\n return (\n Array.isArray(endpoint.groups) &&\n typeof endpoint.getGroupId === \"function\" &&\n typeof endpoint.getRowGroupId === \"function\"\n );\n}\n\nfunction getCominsTransferIdentity(id: CominsRowId) {\n return `${typeof id}:${String(id)}`;\n}\n\nfunction areCominsRowDragTargetsEqual(\n left: CominsRowDragTarget | null,\n right: CominsRowDragTarget,\n) {\n return Boolean(\n left &&\n left.dataIndex === right.dataIndex &&\n left.groupId === right.groupId &&\n left.rowId === right.rowId &&\n left.tableId === right.tableId &&\n left.valid === right.valid,\n );\n}\n\nfunction getCominsColumnDropStatus(\n source: CominsColumnMoveHeader,\n target: CominsColumnMoveHeader,\n orderChanged: boolean,\n): CominsColumnDropStatus {\n if (source.id === target.id && source.kind === target.kind) {\n return \"neutral\";\n }\n\n if (source.depth !== target.depth || source.parentGroupId !== target.parentGroupId) {\n return \"invalid\";\n }\n\n return orderChanged ? \"valid\" : \"invalid\";\n}\n\nfunction selectRowForContextMenu<TData>(state: CominsTableState<TData>, rowId: CominsRowId) {\n return state.selection.rowIds.includes(rowId) ? state : selectRow(state, rowId);\n}\n\nexport type CominsTableRowProps<TData> = {\n className?: CominsRowPropValue<TData, CominsClassValue>;\n disabled?: CominsRowPropValue<TData, boolean | undefined>;\n /** Row dragging is opt-in. False or undefined hides the drag handle. */\n draggable?: CominsRowPropValue<TData, boolean | undefined>;\n style?: CominsRowPropValue<TData, React.CSSProperties | undefined>;\n};\n\nexport type CominsRowDragTarget = {\n tree?: CominsTreeMoveDestination & { position: CominsTreeDropPosition };\n dataIndex?: number;\n groupId?: CominsRowId;\n rowId?: CominsRowId;\n tableId?: string;\n valid: boolean;\n};\n\nexport type CominsBeforeRowDragPayload<TData> = {\n event: React.PointerEvent<HTMLElement>;\n row: CominsEventRow<TData>;\n sourceGroupId?: CominsRowId;\n sourceTableId?: string;\n};\n\nexport type CominsRowDragPayload<TData> = Omit<CominsBeforeRowDragPayload<TData>, \"event\"> & {\n event: PointerEvent;\n target: CominsRowDragTarget;\n};\n\nexport type CominsRowDragResult = \"cancelled\" | \"moved\" | \"rejected\";\nexport type CominsRowDragReason =\n | \"blur\"\n | \"drop\"\n | \"duplicate-id\"\n | \"escape\"\n | \"invalid-target\"\n | \"pointer-cancel\"\n | \"stale-target\"\n | \"unchanged\";\n\nexport type CominsAfterDragRowPayload<TData> = Omit<CominsBeforeRowDragPayload<TData>, \"event\"> & {\n event: PointerEvent | null;\n reason: CominsRowDragReason;\n result: CominsRowDragResult;\n target?: CominsRowDragTarget;\n};\n\nexport type CominsRowEventPayload<TData, TEvent = React.MouseEvent<HTMLTableRowElement>> = {\n event: TEvent;\n index: number;\n row: CominsEventRow<TData>;\n};\n\nexport type CominsCellEventPayload<TData, TValue = unknown, TEvent = React.MouseEvent<HTMLTableCellElement>> = {\n column: CominsEventColumn<TData, TValue>;\n event: TEvent;\n index: number;\n row: CominsEventRow<TData>;\n value: TValue;\n};\n\nexport type CominsRowKeyboardEventPayload<TData> = CominsRowEventPayload<\n TData,\n React.KeyboardEvent<HTMLTableRowElement>\n>;\n\nexport type CominsCellKeyboardEventPayload<TData, TValue = unknown> = CominsCellEventPayload<\n TData,\n TValue,\n React.KeyboardEvent<HTMLTableCellElement>\n>;\n\nexport type CominsRowDetailParams<TData> = {\n row: CominsEventRow<TData>;\n};\n\nexport type CominsRowDetailHeight = number | \"auto\";\n\nexport type CominsRowDetailProps<TData> = {\n estimatedRowDetailHeight?: number;\n expandedRowIds?: readonly CominsRowId[];\n getRowDetailHeight?: (params: CominsRowDetailParams<TData>) => CominsRowDetailHeight;\n isRowExpandable?: (params: CominsRowDetailParams<TData>) => boolean;\n onChangeExpandedRowIds?: (rowIds: CominsRowId[]) => void;\n rowDetail?: { render?: (params: CominsRowDetailParams<TData>) => React.ReactNode };\n /** @deprecated Use rowDetail.render. Retained throughout 0.x; removal target: 1.0.0. */\n renderRowDetail?: (params: CominsRowDetailParams<TData>) => React.ReactNode;\n};\n\nexport type CominsTableRef<TData = unknown> = {\n copySelection: (target?: CominsCopyTarget) => Promise<string | null>;\n fillSelection: (direction: \"down\" | \"right\") => boolean;\n getSelectedRows: () => TData[];\n getSelectedCells: () => CominsSelectedCell[];\n getSelection: () => CominsSelectionState;\n clearSort: () => void;\n expand: (nodeIds?: readonly CominsRowId[]) => void;\n expandGroups: (groupIds?: readonly CominsRowId[]) => void;\n fold: (nodeIds?: readonly CominsRowId[]) => void;\n foldGroups: (groupIds?: readonly CominsRowId[]) => void;\n getColumnLayout: () => CominsColumnLayout;\n getSortModel: () => CominsSortModel;\n getSortState: () => CominsSortState | null;\n setColumnLayout: (layout: CominsColumnLayout) => void;\n setMoveTargetRow: (targetIdx: number, sourceIdx: number) => void;\n setSelectedRow: (index: number) => void;\n setSelectedRows: (indexes: number[]) => void;\n setSortModel: (sortModel: CominsSortModel) => void;\n setSortState: (sort: CominsSortState | null) => void;\n};\n\nexport type CominsLazyLoadReason = \"initial\" | \"scroll\" | \"refresh\";\n\nexport type CominsLazyLoadRequest = {\n limit: number;\n offset: number;\n reason: CominsLazyLoadReason;\n signal: AbortSignal;\n};\n\ntype CominsFlatTableBaseProps<TData> = {\n viewportDatasource?: never;\n \"buffer-size\"?: number;\n cellSelection?: boolean;\n rowSelectionOnClick?: boolean;\n clipboard?: boolean;\n clipboardPaste?: boolean;\n fillHandle?: boolean;\n onClipboardError?: (error: Error) => void;\n className?: string;\n columnGroups?: Array<CominsTableColumnGroup>;\n columns: Array<CominsTableColumn<TData>>;\n data: readonly TData[];\n \"data-testid\"?: string;\n emptyContent?: { render?: () => React.ReactNode };\n /** @deprecated Use emptyContent.render. Retained throughout 0.x; removal target: 1.0.0. */\n emptyComponent?: React.ReactNode;\n getRowId?: (row: TData, index: number) => CominsRowId;\n hasMoreRows?: boolean;\n infiniteScroll?: boolean;\n infiniteScrollThreshold?: number;\n lazyLoad?: boolean;\n lazyLoadBatchSize?: number;\n lazyLoadMode?: \"append\";\n lazyLoadThreshold?: number;\n loading?: boolean;\n loadingContent?: { render?: () => React.ReactNode };\n /** @deprecated Use loadingContent.render. Retained throughout 0.x; removal target: 1.0.0. */\n loadingComponent?: React.ReactNode;\n loadingMore?: boolean;\n multiSort?: boolean;\n onChangeColumnLayout?: (layout: CominsColumnLayout) => void;\n onChangeData?: (data: TData[]) => void;\n onChangeSelection?: (selection: CominsSelectionState) => void;\n onChangeSort?: (sort: CominsSortState | null) => void;\n onChangeSortModel?: (sortModel: CominsSortModel) => void;\n onClickCell?: (payload: CominsCellEventPayload<TData>) => void;\n onClickRow?: (payload: CominsRowEventPayload<TData>) => void;\n onContextMenuCell?: (payload: CominsCellEventPayload<TData>) => void;\n onContextMenuRow?: (payload: CominsRowEventPayload<TData>) => void;\n onDoubleClickCell?: (payload: CominsCellEventPayload<TData>) => void;\n onDoubleClickRow?: (payload: CominsRowEventPayload<TData>) => void;\n onKeyDownCell?: (payload: CominsCellKeyboardEventPayload<TData>) => void;\n onKeyDownRow?: (payload: CominsRowKeyboardEventPayload<TData>) => void;\n onLazyLoad?: (request: CominsLazyLoadRequest) => Promise<void> | void;\n onLoadMore?: () => void;\n onAfterDragRow?: (payload: CominsAfterDragRowPayload<TData>) => void;\n onBeforeRowDrag?: (payload: CominsBeforeRowDragPayload<TData>) => boolean | void;\n onRowDrag?: (payload: CominsRowDragPayload<TData>) => void;\n pagination?: Partial<CominsPaginationState>;\n persistHeaderWhenEmpty?: boolean;\n rowHeight?: number;\n getRowHeight?: (params: CominsRowHeightParams<TData>) => CominsRowHeight | undefined;\n estimatedRowHeight?: number;\n rowProps?: CominsTableRowProps<TData>;\n showColumnMoveHandle?: boolean;\n showHeader?: boolean;\n skeletonRowCount?: number;\n style?: React.CSSProperties;\n summary?: CominsTableSummaryConfig<TData>;\n theme?: CominsTableTheme;\n tree?: false;\n treeSlots?: never;\n virtualized?: boolean;\n};\n\ntype CominsUngroupedTableWithoutTransferProps<TData> = CominsFlatTableBaseProps<TData> & {\n columnFiltering?: undefined;\n rowGrouping?: undefined;\n tableTransfer?: undefined;\n};\n\ntype CominsTransferableUngroupedTableProps<TData> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n> & {\n columnFiltering?: undefined;\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n rowGrouping?: undefined;\n tableTransfer: CominsTableTransferConfig<TData>;\n};\n\ntype CominsUngroupedTableProps<TData> =\n | CominsTransferableUngroupedTableProps<TData>\n | CominsUngroupedTableWithoutTransferProps<TData>;\n\ntype CominsNonDraggableRowProps<TData> = Omit<CominsTableRowProps<TData>, \"draggable\"> & {\n draggable?: never;\n};\n\ntype CominsFilteredTableProps<TData> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n | \"rowProps\"\n> & {\n columnFiltering: CominsColumnFilteringConfig;\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n rowGrouping?: undefined;\n rowProps?: CominsNonDraggableRowProps<TData>;\n tableTransfer?: never;\n};\n\ntype CominsGroupedTableBaseProps<TData, TGroup> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n | \"pagination\"\n> & {\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n pagination?: never;\n rowGrouping: CominsRowGroupingConfig<TData, TGroup>;\n tableTransfer?: CominsTableTransferConfig<TData, TGroup>;\n};\n\ntype CominsGroupedTableProps<TData, TGroup> = CominsGroupedTableBaseProps<TData, TGroup> & {\n columnFiltering?: undefined;\n};\n\ntype CominsFilteredGroupedTableProps<TData, TGroup> = Omit<\n CominsGroupedTableBaseProps<TData, TGroup>,\n \"rowProps\"\n> & {\n columnFiltering: CominsColumnFilteringConfig;\n rowProps?: CominsNonDraggableRowProps<TData>;\n tableTransfer?: never;\n};\n\nexport type CominsTableProps<TData, TGroup = unknown> = (\n | CominsFilteredGroupedTableProps<TData, TGroup>\n | CominsFilteredTableProps<TData>\n | CominsGroupedTableProps<TData, TGroup>\n | CominsUngroupedTableProps<TData>\n) & CominsRowDetailProps<TData>;\n\nexport type CominsTreeSlotParams<TData> = CominsVisibleTreeRow<TData> & {\n defaultContent: React.ReactNode;\n};\n\nexport type CominsTreeSlots<TData> = {\n /** Prefer { render }. Direct callbacks remain in 0.x; removal target: 1.0.0. */\n leading?: ((params: CominsTreeSlotParams<TData>) => React.ReactNode) | { render?: (params: CominsTreeSlotParams<TData>) => React.ReactNode };\n /** Prefer { render }. Direct callbacks remain in 0.x; removal target: 1.0.0. */\n content?: ((params: CominsTreeSlotParams<TData>) => React.ReactNode) | { render?: (params: CominsTreeSlotParams<TData>) => React.ReactNode };\n /** Prefer { render }. Direct callbacks remain in 0.x; removal target: 1.0.0. */\n trailing?: ((params: CominsTreeSlotParams<TData>) => React.ReactNode) | { render?: (params: CominsTreeSlotParams<TData>) => React.ReactNode };\n};\n\nexport type CominsTreeTableProps<TData> = Omit<\n CominsFlatTableBaseProps<TData>,\n | \"data\"\n | \"columnFiltering\"\n | \"getRowId\"\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onChangeData\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n | \"onAfterDragRow\"\n | \"onBeforeRowDrag\"\n | \"onRowDrag\"\n | \"pagination\"\n | \"rowProps\"\n | \"rowGrouping\"\n | \"tableTransfer\"\n | \"estimatedRowDetailHeight\"\n | \"expandedRowIds\"\n | \"getRowDetailHeight\"\n | \"isRowExpandable\"\n | \"onChangeExpandedRowIds\"\n | \"renderRowDetail\"\n | \"rowDetail\"\n | \"tree\"\n | \"treeSlots\"\n> & {\n data: readonly CominsTreeNode<TData>[];\n columnFiltering?: never;\n defaultExpandAll?: boolean;\n getRowId: (item: TData, index: number) => CominsRowId;\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onChangeData?: (data: CominsTreeNode<TData>[]) => void;\n onLazyLoad?: never;\n onLoadMore?: never;\n onAfterDragRow?: (payload: CominsAfterTreeRowDragPayload<TData>) => void;\n onBeforeRowDrag?: (payload: CominsBeforeTreeRowDragPayload<TData>) => boolean | void;\n onRowDrag?: (payload: CominsTreeRowDragPayload<TData>) => void;\n pagination?: never;\n rowProps?: CominsTableRowProps<TData>;\n treeRowDrag?: CominsTreeRowDragConfig<TData>;\n treeSlots?: CominsTreeSlots<TData>;\n estimatedRowDetailHeight?: never;\n expandedRowIds?: never;\n getRowDetailHeight?: never;\n isRowExpandable?: never;\n onChangeExpandedRowIds?: never;\n renderRowDetail?: never;\n rowDetail?: never;\n rowGrouping?: never;\n tableTransfer?: never;\n tree: true;\n};\n\ntype VisibleRowEntry<TData> = {\n absoluteIndex?: number;\n dataIndex: number;\n row: TData;\n rowId: CominsRowId;\n visibleIndex: number;\n};\n\ntype CominsVirtualWindow<TData> = {\n mixed: boolean;\n renderOffset: number;\n scrollHeight: number;\n slots: Array<CominsVirtualSlot<TData>>;\n};\n\ntype CominsMixedVirtualProjection<TData> = {\n heightIndex: CominsHeightIndex;\n keys: string[];\n slotIndexByRowId: Map<CominsRowId, number>;\n slots: Array<CominsVirtualSlot<TData>>;\n};\n\ntype CominsCommittedDetailObserverSnapshot<TData> = Readonly<{\n rowLayoutKey: string;\n rowContentRevision: object;\n rowSlots: ReadonlyMap<CominsRowId, CominsDataVirtualSlot<TData>>;\n contentWidth: number;\n projection: CominsMixedVirtualProjection<TData> | null;\n viewportHeight: number;\n viewportRetainRange: { startIndex: number; endIndex: number } | null;\n}>;\n\ntype CominsVirtualProjection = {\n keys: readonly string[];\n mixed: false;\n rowHeight: number;\n visibleRowCount: number;\n} | {\n heightIndex: CominsHeightIndex;\n keys: readonly string[];\n mixed: true;\n};\n\ntype CominsPendingVirtualAnchor = {\n anchor: CominsScrollAnchor;\n previousKeys: readonly string[];\n previousLogicalScrollTop: number;\n previousPhysicalScrollTop: number;\n previousViewportHeight: number;\n};\n\ntype CominsPendingDetailAnchor = CominsPendingVirtualAnchor & {\n revision: number;\n status: \"cancelled\" | \"pending\";\n};\n\ntype CominsLogicalAnchorTransaction = {\n actualPhysical: number;\n requestedPhysical: number;\n revision: number;\n targetLogical: number;\n};\n\ntype CominsObservedDetail = {\n element: HTMLElement;\n rowId: CominsRowId;\n kind?: \"row\";\n};\n\ntype CominsTreeRenderContext<TData> = {\n drag: ReturnType<typeof useCominsTreeDrag<TData>>;\n entriesByRowId: Map<CominsRowId, CominsVisibleTreeRow<TData>>;\n onExpand: (nodeIds?: readonly CominsRowId[]) => void;\n onFold: (nodeIds?: readonly CominsRowId[]) => void;\n onToggle: (rowId: CominsRowId) => void;\n summaryRows: readonly TData[];\n treeColumnId: string | null;\n slots?: CominsTreeSlots<TData>;\n};\n\ntype CominsTableInnerProps<TData, TGroup = unknown> = CominsFlatTableBaseProps<TData> & CominsRowDetailProps<TData> & {\n viewportContext?: {\n data: CominsViewportData<TData>;\n indices: readonly number[];\n config: CominsViewportDatasource;\n onRequest: (request: CominsViewportRequest) => void | Promise<void>;\n onChangeData?: (data: CominsViewportData<TData>) => void;\n };\n columnFiltering?: CominsColumnFilteringConfig;\n rowGrouping?: CominsRowGroupingConfig<TData, TGroup>;\n tableTransfer?:\n | CominsTableTransferConfig<TData, TGroup>\n | CominsTableTransferConfig<TData, never>;\n treeContext?: CominsTreeRenderContext<TData>;\n};\n\nfunction getCominsVirtualProjectionKeys(projection: CominsVirtualProjection) {\n if (projection.mixed) {\n return projection.keys;\n }\n\n return projection.keys;\n}\n\nfunction captureCominsVirtualAnchor(input: {\n logicalScrollTop?: number;\n physicalScrollTop: number;\n projection: CominsVirtualProjection;\n viewportHeight: number;\n}): CominsPendingVirtualAnchor | undefined {\n const previousKeys = getCominsVirtualProjectionKeys(input.projection);\n const previousLogicalScrollTop =\n input.logicalScrollTop ??\n (input.projection.mixed\n ? getCominsMixedVirtualRange({\n heightIndex: input.projection.heightIndex,\n overscan: 0,\n physicalScrollTop: input.physicalScrollTop,\n viewportHeight: input.viewportHeight,\n }).logicalScrollTop\n : (() => {\n const metrics = getCominsScrollScale(\n input.projection.visibleRowCount * input.projection.rowHeight,\n input.viewportHeight,\n );\n\n return Math.min(\n metrics.logicalScrollableHeight,\n Math.max(0, input.physicalScrollTop) * metrics.scrollScale,\n );\n })());\n const anchor = input.projection.mixed\n ? captureCominsScrollAnchor({\n heightIndex: input.projection.heightIndex,\n keys: previousKeys,\n logicalScrollTop: previousLogicalScrollTop,\n })\n : (() => {\n if (input.projection.visibleRowCount === 0) {\n return undefined;\n }\n\n const previousIndex = Math.min(\n input.projection.visibleRowCount - 1,\n Math.floor(previousLogicalScrollTop / input.projection.rowHeight),\n );\n const key = previousKeys[previousIndex];\n\n return key === undefined\n ? undefined\n : {\n key,\n offsetWithinSlot:\n previousLogicalScrollTop - previousIndex * input.projection.rowHeight,\n previousIndex,\n };\n })();\n\n return anchor\n ? {\n anchor,\n previousKeys,\n previousLogicalScrollTop,\n previousPhysicalScrollTop: input.physicalScrollTop,\n previousViewportHeight: input.viewportHeight,\n }\n : undefined;\n}\n\nfunction toClassName(value: CominsClassValue) {\n if (!value || typeof value === \"string\") {\n return value;\n }\n\n return Object.entries(value)\n .filter(([, enabled]) => enabled)\n .map(([className]) => className)\n .join(\" \");\n}\n\nfunction resolveRowProp<TData, TValue>(\n value: CominsRowPropValue<TData, TValue> | undefined,\n row: TData,\n index: number,\n) {\n return typeof value === \"function\" ? (value as (row: TData, index: number) => TValue)(row, index) : value;\n}\n\nfunction resolveRowProps<TData>(\n rowProps: CominsTableRowProps<TData> | undefined,\n row: TData,\n index: number,\n) {\n const disabled = resolveRowProp(rowProps?.disabled, row, index) === true;\n\n return {\n className: toClassName(resolveRowProp(rowProps?.className, row, index)),\n disabled,\n draggable: !disabled && resolveRowProp(rowProps?.draggable, row, index) === true,\n style: resolveRowProp(rowProps?.style, row, index),\n };\n}\n\nfunction getRowCustomBackground(style: React.CSSProperties | undefined) {\n const background = style?.background ?? style?.backgroundColor;\n\n return typeof background === \"string\" || typeof background === \"number\" ? background : undefined;\n}\n\nfunction getResolvedRowStyle(\n rowHeight: number,\n style: React.CSSProperties | undefined,\n customBackground: string | number | undefined,\n) {\n const resolvedStyle = { height: rowHeight, ...style };\n\n if (customBackground === undefined) {\n return resolvedStyle;\n }\n\n return {\n ...resolvedStyle,\n \"--comins-table-row-custom-background\": customBackground,\n } as React.CSSProperties;\n}\n\nfunction createEventRow<TData>(entry: VisibleRowEntry<TData>): CominsEventRow<TData> {\n return {\n data: entry.row,\n dataIndex: entry.absoluteIndex ?? entry.dataIndex,\n id: entry.rowId,\n index: entry.visibleIndex,\n };\n}\n\nfunction createEventColumn<TData>(\n column: CominsTableRuntimeColumn<TData>,\n index: number,\n): CominsEventColumn<TData> {\n return {\n definition: column,\n field: column.field,\n id: column.id,\n index,\n label: column.label,\n };\n}\n\nfunction createRowPayload<TData, TEvent>(\n event: TEvent,\n entry: VisibleRowEntry<TData>,\n): CominsRowEventPayload<TData, TEvent> {\n return {\n event,\n index: entry.visibleIndex,\n row: createEventRow(entry),\n };\n}\n\nfunction createCellPayload<TData, TEvent>(\n event: TEvent,\n entry: VisibleRowEntry<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n value: unknown,\n): CominsCellEventPayload<TData, unknown, TEvent> {\n return {\n column: createEventColumn(column, columnIndex),\n event,\n index: entry.visibleIndex,\n row: createEventRow(entry),\n value,\n };\n}\n\nfunction createComponentColumnPayload<TData>(\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n): CominsCellComponentPayload<TData>[\"column\"] {\n return {\n definition: column,\n field: column.field,\n id: column.id,\n index: columnIndex,\n label: column.label,\n };\n}\n\nfunction createCellComponentPayload<TData>(\n entry: VisibleRowEntry<TData>,\n rowDisabled: boolean,\n rowSelected: boolean,\n selectedRowCount: number,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n value: unknown,\n): CominsCellComponentPayload<TData> {\n return {\n column: createComponentColumnPayload(column, columnIndex),\n row: {\n data: entry.row,\n dataIndex: entry.absoluteIndex ?? entry.dataIndex,\n disabled: rowDisabled,\n id: entry.rowId,\n index: entry.visibleIndex,\n selected: rowSelected,\n },\n selection: {\n selectedRowCount,\n },\n value,\n };\n}\n\nfunction resolveRenderableCellProps<TData>(\n column: CominsTableRuntimeColumn<TData>,\n payload: CominsCellComponentPayload<TData>,\n): CominsColumnProps<TData> | undefined {\n const props = column.cell?.props;\n\n return typeof props === \"function\" ? props(payload) : props;\n}\n\nfunction stopTreeSlotControlEvent(event: React.SyntheticEvent<HTMLElement>) {\n const target = event.target instanceof Element ? event.target : null;\n const label = target?.closest(\"label\");\n const control = (label?.control ? label : null)\n ?? target?.closest('input, textarea, select, button, a[href], [contenteditable]:not([contenteditable=\"false\"]), [tabindex], [role=\"button\"], [role=\"checkbox\"], [role=\"switch\"], [role=\"menuitem\"]');\n if (target && control && (event.currentTarget.contains(control) || !event.currentTarget.contains(target))) {\n event.stopPropagation();\n }\n}\n\nfunction resolveDefaultRender(content: React.ReactNode, defaultContent: React.ReactNode): React.ReactNode {\n return content === undefined ? defaultContent : content;\n}\n\nfunction resolveTreeSlotContent<TData>(slot: NonNullable<CominsTreeSlots<TData>[\"content\"]>, params: CominsTreeSlotParams<TData>, defaultContent?: React.ReactNode): React.ReactNode {\n return typeof slot === \"function\" ? slot(params) : resolveDefaultRender(slot.render?.(params), defaultContent);\n}\n\nfunction renderTreeSlot(name: \"leading\" | \"content\" | \"trailing\", content: React.ReactNode) {\n if (content == null || typeof content === \"boolean\") return null;\n return (\n <span className={`comins-tree-slot comins-tree-slot--${name}`} data-comins-tree-slot={name}\n onClick={stopTreeSlotControlEvent} onDoubleClick={stopTreeSlotControlEvent}\n onContextMenu={stopTreeSlotControlEvent} onMouseDown={stopTreeSlotControlEvent}\n onPointerDown={stopTreeSlotControlEvent} onKeyDown={stopTreeSlotControlEvent}\n onKeyUp={stopTreeSlotControlEvent} onCopy={stopTreeSlotControlEvent}\n onPaste={stopTreeSlotControlEvent}>\n {content}\n </span>\n );\n}\n\nfunction resolveRenderableCellGuard<TData>(\n guard: CominsClipboardGuard<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n if (guard === undefined) {\n return true;\n }\n\n return typeof guard === \"boolean\" ? guard : guard(payload);\n}\n\nfunction isRenderableCellDisabled<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n return props?.disabled !== undefined && resolveRenderableCellGuard(props.disabled, payload) === true;\n}\n\nfunction getRenderableCellClassName<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n const className = props?.className;\n\n return typeof className === \"function\" ? className(payload) : className;\n}\n\nfunction getRenderableCellStyle<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n const style = props?.style;\n\n return typeof style === \"function\" ? style(payload) : style;\n}\n\nconst deferredDefaultCellValue = Symbol(\"deferredDefaultCellValue\");\n\nfunction formatRenderableCellValue<TData>(\n column: CominsTableRuntimeColumn<TData>,\n payload: CominsCellComponentPayload<TData>,\n) {\n if (column.cell?.format) {\n return column.cell.format(payload);\n }\n\n return deferredDefaultCellValue;\n}\n\nfunction createHeaderComponentPayload<TData>(\n state: CominsTableState<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n): CominsHeaderComponentPayload<TData> {\n const columnState = state.columnState[column.id];\n const sortRule = getSortRule(state.sortModel, column.id);\n\n return {\n column: createComponentColumnPayload(column, columnIndex),\n layout: {\n hidden: columnState?.hidden === true || column.hidden === true,\n width: columnState?.width ?? column.width,\n },\n sort: {\n count: state.sortModel.length,\n direction: sortRule?.rule.direction ?? null,\n enabled: Boolean(column.sort),\n priority: sortRule?.priority ?? null,\n },\n };\n}\n\ntype CominsRenderableComponent<TData> = CominsCellComponent<TData> | CominsHeaderComponent<TData>;\ntype CominsRenderablePayload<TData> = CominsCellComponentPayload<TData> | CominsHeaderComponentPayload<TData>;\n\nfunction isCominsCellComponentPayload<TData>(\n payload: CominsRenderablePayload<TData>,\n): payload is CominsCellComponentPayload<TData> {\n return \"row\" in payload && \"selection\" in payload;\n}\n\nfunction shouldRenderCominsComponent<TData>(\n component: CominsRenderableComponent<TData>,\n payload: CominsRenderablePayload<TData>,\n) {\n if (!isCominsCellComponentPayload(payload) || (component.type !== \"input\" && component.type !== \"select\")) {\n return true;\n }\n\n return payload.selection.selectedRowCount === 1 && payload.row.selected;\n}\n\nfunction getRenderableCominsComponents<TData>(\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n) {\n return (components ?? []).filter((component) => shouldRenderCominsComponent(component, payload));\n}\n\nfunction renderCominsComponentSlots<TData>(\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n direction: \"left\" | \"right\",\n interaction?: CominsBuiltInComponentInteraction,\n) {\n if (components === undefined || components === null) {\n return [];\n }\n\n return getRenderableCominsComponents(components, payload)\n .map((component, index) => ({ component, index }))\n .filter(({ component }) => (component.direction ?? \"left\") === direction)\n .map(({ component, index }) => (\n <span\n className=\"comins-table__component-slot\"\n data-comins-component-align={component.align ?? \"center\"}\n data-comins-component-direction={direction}\n data-comins-component-id={component.id ?? `${component.type}-${index}`}\n key={component.id ?? `${component.type}-${index}`}\n >\n {renderCominsBuiltInComponent(component as never, payload as never, interaction)}\n </span>\n ));\n}\n\n// 종료된 disclosure ref가 slot과 렌더 컨텍스트를 함께 보유하지 않게 한다.\nfunction createDisclosureElementRef(elementsRef: TableLifecycleRef<Map<CominsRowId, HTMLButtonElement>>, rowId: CominsRowId) {\n return (element: HTMLButtonElement | null) => {\n if (element) elementsRef.current.set(rowId, element);\n else elementsRef.current.delete(rowId);\n };\n}\n\nfunction blockCominsColumnPlaceholderInteraction(event: React.SyntheticEvent<HTMLElement>) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nfunction blurCominsColumnPlaceholderFocus(event: React.FocusEvent<HTMLElement>) {\n event.stopPropagation();\n\n if (event.target instanceof HTMLElement) {\n event.target.blur();\n }\n}\n\nconst cominsColumnPlaceholderNativeBoundaries = new WeakSet<HTMLElement>();\n\nfunction bindCominsColumnPlaceholderNativeBoundary(element: HTMLElement | null) {\n if (!element || cominsColumnPlaceholderNativeBoundaries.has(element)) {\n return;\n }\n\n const blockActiveInput = (event: Event) => {\n if (element.hasAttribute(\"inert\") && element.getAttribute(\"aria-hidden\") === \"true\") {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n element.addEventListener(\"change\", blockActiveInput, true);\n element.addEventListener(\"input\", blockActiveInput, true);\n cominsColumnPlaceholderNativeBoundaries.add(element);\n}\n\nconst COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS = {\n onBeforeInputCapture: blockCominsColumnPlaceholderInteraction,\n onBlurCapture: blockCominsColumnPlaceholderInteraction,\n onChangeCapture: blockCominsColumnPlaceholderInteraction,\n onClickCapture: blockCominsColumnPlaceholderInteraction,\n onContextMenuCapture: blockCominsColumnPlaceholderInteraction,\n onDoubleClickCapture: blockCominsColumnPlaceholderInteraction,\n onFocusCapture: blurCominsColumnPlaceholderFocus,\n onInputCapture: blockCominsColumnPlaceholderInteraction,\n onKeyDownCapture: blockCominsColumnPlaceholderInteraction,\n onKeyPressCapture: blockCominsColumnPlaceholderInteraction,\n onKeyUpCapture: blockCominsColumnPlaceholderInteraction,\n onMouseDownCapture: blockCominsColumnPlaceholderInteraction,\n onMouseMoveCapture: blockCominsColumnPlaceholderInteraction,\n onMouseOutCapture: blockCominsColumnPlaceholderInteraction,\n onMouseOverCapture: blockCominsColumnPlaceholderInteraction,\n onMouseUpCapture: blockCominsColumnPlaceholderInteraction,\n onPointerCancelCapture: blockCominsColumnPlaceholderInteraction,\n onPointerDownCapture: blockCominsColumnPlaceholderInteraction,\n onPointerMoveCapture: blockCominsColumnPlaceholderInteraction,\n onPointerOutCapture: blockCominsColumnPlaceholderInteraction,\n onPointerOverCapture: blockCominsColumnPlaceholderInteraction,\n onPointerUpCapture: blockCominsColumnPlaceholderInteraction,\n onResetCapture: blockCominsColumnPlaceholderInteraction,\n onScrollCapture: blockCominsColumnPlaceholderInteraction,\n onSubmitCapture: blockCominsColumnPlaceholderInteraction,\n onTouchCancelCapture: blockCominsColumnPlaceholderInteraction,\n onTouchEndCapture: blockCominsColumnPlaceholderInteraction,\n onTouchMoveCapture: blockCominsColumnPlaceholderInteraction,\n onTouchStartCapture: blockCominsColumnPlaceholderInteraction,\n onWheelCapture: blockCominsColumnPlaceholderInteraction,\n} satisfies React.HTMLAttributes<HTMLElement>;\n\nfunction getCominsColumnPlaceholderText(label: React.ReactNode, fallback: string): string {\n const collectPlainText = (node: React.ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node);\n }\n\n if (Array.isArray(node)) {\n return node.map(collectPlainText).join(\"\");\n }\n\n if (isValidElement<{ children?: React.ReactNode }>(node) && typeof node.type === \"string\") {\n return collectPlainText(node.props.children);\n }\n\n return \"\";\n };\n const plainText = collectPlainText(label).trim();\n\n return plainText || fallback;\n}\n\nfunction renderCominsContentWithComponents<TData>(\n content: React.ReactNode,\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n options: {\n interaction?: CominsBuiltInComponentInteraction;\n showContent?: boolean;\n } = {},\n) {\n if (!components?.length) {\n return content;\n }\n\n const showContent = options.showContent ?? true;\n const renderableComponents = getRenderableCominsComponents(components, payload);\n\n if (!renderableComponents.length) {\n return content;\n }\n\n const leftSlots = renderCominsComponentSlots(renderableComponents, payload, \"left\", options.interaction);\n const rightSlots = renderCominsComponentSlots(renderableComponents, payload, \"right\", options.interaction);\n\n if (!showContent) {\n return (\n <span className=\"comins-table__component-layout\" data-comins-component-only=\"true\">\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"all\">\n {leftSlots}\n {rightSlots}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"comins-table__component-layout\">\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"left\">\n {leftSlots}\n </span>\n <span className=\"comins-table__component-content\">{content}</span>\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"right\">\n {rightSlots}\n </span>\n </span>\n );\n}\n\n\nfunction setCominsTreeExpansion<TData>(\n data: readonly CominsTreeNode<TData>[],\n nodeIds: readonly CominsRowId[] | undefined,\n expanded: boolean,\n getRowId: (item: TData, index: number) => CominsRowId,\n defaultExpandAll: boolean,\n): readonly CominsTreeNode<TData>[] {\n if (nodeIds?.length === 0) {\n return data;\n }\n\n type ExpansionEntry = {\n ancestorIds: readonly CominsRowId[];\n hasChildren: boolean;\n node: CominsTreeNode<TData>;\n rowId: CominsRowId;\n };\n\n const entries: ExpansionEntry[] = [];\n const idByNode = new Map<CominsTreeNode<TData>, CominsRowId>();\n let itemIndex = 0;\n\n const visit = (nodes: readonly CominsTreeNode<TData>[], ancestorIds: readonly CominsRowId[]) => {\n nodes.forEach((node) => {\n const rowId = getRowId(node.item, itemIndex);\n const hasChildren = Boolean(node.children?.length);\n itemIndex += 1;\n entries.push({ ancestorIds, hasChildren, node, rowId });\n idByNode.set(node, rowId);\n\n if (node.children?.length) {\n visit(node.children, [...ancestorIds, rowId]);\n }\n });\n };\n\n visit(data, []);\n\n const requestedIds = nodeIds ? new Set(nodeIds) : null;\n const targets = entries.filter((entry) => entry.hasChildren && (!requestedIds || requestedIds.has(entry.rowId)));\n const requestedBranchIds = new Set(targets.map((entry) => entry.rowId));\n const expandedById = new Map(\n entries.map((entry) => [entry.rowId, entry.node.expand ?? defaultExpandAll] as const),\n );\n const changes = new Map<CominsRowId, boolean>();\n\n targets.forEach((entry) => {\n const ancestorsAllowExpand =\n !expanded ||\n !requestedIds ||\n entry.ancestorIds.every((ancestorId) => expandedById.get(ancestorId) === true || requestedBranchIds.has(ancestorId));\n const currentExpanded = entry.node.expand ?? defaultExpandAll;\n\n if (ancestorsAllowExpand && currentExpanded !== expanded) {\n changes.set(entry.rowId, expanded);\n }\n });\n\n if (changes.size === 0) {\n return data;\n }\n\n const applyChanges = (nodes: readonly CominsTreeNode<TData>[]): readonly CominsTreeNode<TData>[] => {\n let changed = false;\n const nextNodes = nodes.map((node) => {\n const rowId = idByNode.get(node);\n const nextExpanded = rowId === undefined ? undefined : changes.get(rowId);\n const nextChildren = node.children ? applyChanges(node.children) : node.children;\n\n if (nextExpanded === undefined && nextChildren === node.children) {\n return node;\n }\n\n changed = true;\n return {\n ...node,\n children: nextChildren,\n ...(nextExpanded === undefined ? {} : { expand: nextExpanded }),\n };\n });\n\n return changed ? nextNodes : nodes;\n };\n\n return applyChanges(data);\n}\n\ntype TableLifecycleRef<T> = { current: T };\n\ntype TablePointerGestureCleanup = (unmounting?: boolean) => void;\n\ntype ViewportMeasurementResources = {\n containerRef: TableLifecycleRef<HTMLElement | null>;\n setContainerHeight: React.Dispatch<React.SetStateAction<number>>;\n setContainerWidth: React.Dispatch<React.SetStateAction<number>>;\n setHorizontalScrollContentWidth: React.Dispatch<React.SetStateAction<number>>;\n setHorizontalViewportOuterWidth: React.Dispatch<React.SetStateAction<number>>;\n setHorizontalViewportWidth: React.Dispatch<React.SetStateAction<number>>;\n};\n\ntype TableUnmountResources = {\n activePointerGestureCleanupRef: TableLifecycleRef<TablePointerGestureCleanup | null>;\n detailFocusRestorer: ReturnType<typeof createCominsDetailFocusRestorer>;\n externalDropMarkerRef: TableLifecycleRef<HTMLElement | null>;\n transferRejectionTimerRef: TableLifecycleRef<number | null>;\n transferRejectionTargetRef: TableLifecycleRef<HTMLElement | null>;\n pendingTransferFocusFrameRef: TableLifecycleRef<number | null>;\n scrollFrameRef: TableLifecycleRef<number | null>;\n scrollCommitTimeoutRef: TableLifecycleRef<number | null>;\n};\n\ntype DetailObserverResources<TData> = {\n detailObserverRef: TableLifecycleRef<ReturnType<typeof createMeasurementObserver> | null>;\n detailElementsRef: TableLifecycleRef<Map<Element, CominsObservedDetail>>;\n fallbackMeasuredDetailElementsRef: TableLifecycleRef<Set<Element>>;\n committedDetailObserverSnapshotRef: TableLifecycleRef<CominsCommittedDetailObserverSnapshot<TData> | null>;\n};\n\ntype ColumnInteractionResources = {\n columnPointerInteractionRef: TableLifecycleRef<CominsColumnPointerInteraction | null>;\n suppressedSortClickRef: TableLifecycleRef<CominsSuppressedSortClick | null>;\n columnMoveAnimationCleanupRef: TableLifecycleRef<(() => void) | null>;\n setMovingColumnId: React.Dispatch<React.SetStateAction<string | null>>;\n setMovingGroupId: React.Dispatch<React.SetStateAction<string | null>>;\n setColumnMovePointer: React.Dispatch<React.SetStateAction<{ x: number; y: number } | null>>;\n setColumnMoveTarget: React.Dispatch<React.SetStateAction<CominsColumnMoveTarget | null>>;\n resetPendingRef: TableLifecycleRef<boolean>;\n};\n\n// Create both effect closures outside render to avoid retaining its initial data context.\nfunction createViewportMeasurementEffect(resources: ViewportMeasurementResources): React.EffectCallback {\n return () => {\n const element = resources.containerRef.current;\n\n if (!element) {\n return undefined;\n }\n\n return observeCominsViewport(element, measurement => {\n resources.setContainerHeight(measurement.height);\n resources.setContainerWidth(measurement.width);\n resources.setHorizontalScrollContentWidth(measurement.scrollWidth);\n resources.setHorizontalViewportOuterWidth(measurement.outerWidth);\n resources.setHorizontalViewportWidth(measurement.viewportWidth);\n });\n };\n}\n\nfunction createTableUnmountEffect(resources: TableUnmountResources): React.EffectCallback {\n return () => () => {\n const cleanup = resources.activePointerGestureCleanupRef.current;\n\n resources.activePointerGestureCleanupRef.current = null;\n cleanup?.(true);\n resources.detailFocusRestorer.dispose();\n\n const marker = resources.externalDropMarkerRef.current;\n\n if (marker) {\n marker.removeAttribute(\"data-comins-cross-row-drop-position\");\n marker.removeAttribute(\"data-comins-group-drop-position\");\n marker.removeAttribute(\"data-comins-group-drop-valid\");\n marker.removeAttribute(\"data-comins-row-drop-valid\");\n resources.externalDropMarkerRef.current = null;\n }\n\n if (resources.transferRejectionTimerRef.current !== null) {\n window.clearTimeout(resources.transferRejectionTimerRef.current);\n resources.transferRejectionTimerRef.current = null;\n }\n\n resources.transferRejectionTargetRef.current?.removeAttribute(\"data-comins-transfer-rejected\");\n resources.transferRejectionTargetRef.current = null;\n\n if (resources.pendingTransferFocusFrameRef.current !== null) {\n window.cancelAnimationFrame(resources.pendingTransferFocusFrameRef.current);\n }\n\n if (resources.scrollFrameRef.current !== null) {\n window.cancelAnimationFrame(resources.scrollFrameRef.current);\n }\n\n if (resources.scrollCommitTimeoutRef.current !== null) {\n window.clearTimeout(resources.scrollCommitTimeoutRef.current);\n }\n };\n}\n\nfunction createDetailObserverCleanupEffect<TData>(resources: DetailObserverResources<TData>): React.EffectCallback {\n return () => () => {\n resources.detailObserverRef.current?.dispose();\n resources.detailObserverRef.current = null;\n resources.detailElementsRef.current.clear();\n resources.fallbackMeasuredDetailElementsRef.current.clear();\n resources.committedDetailObserverSnapshotRef.current = null;\n };\n}\n\nfunction createColumnInteractionCleanupEffect(resources: ColumnInteractionResources): React.EffectCallback {\n return () => {\n // Activity 등 상태를 보존한 effect 재연결은 DOM이 복구된 뒤, 그리기 전에 초기화한다.\n if (resources.resetPendingRef.current) {\n resources.resetPendingRef.current = false;\n resources.setMovingColumnId(null);\n resources.setMovingGroupId(null);\n resources.setColumnMovePointer(null);\n resources.setColumnMoveTarget(null);\n }\n\n return () => {\n // 실제 언마운트에서는 state를 갱신하지 않고 재연결을 위한 표시만 남긴다.\n resources.resetPendingRef.current = true;\n const interaction = resources.columnPointerInteractionRef.current;\n\n if (interaction) {\n interaction.cleanup();\n\n if (interaction.timer !== null) {\n window.clearTimeout(interaction.timer);\n }\n }\n\n resources.columnPointerInteractionRef.current = null;\n\n const suppressed = resources.suppressedSortClickRef.current;\n\n if (suppressed) {\n suppressed.cleanup();\n\n if (suppressed.timer !== null) {\n window.clearTimeout(suppressed.timer);\n }\n\n resources.suppressedSortClickRef.current = null;\n }\n\n resources.columnMoveAnimationCleanupRef.current?.();\n };\n };\n}\n\nfunction CominsTableInner<TData, TGroup>(\n {\n \"buffer-size\": bufferSize,\n cellSelection = true,\n rowSelectionOnClick = true,\n clipboard = false,\n clipboardPaste = false,\n fillHandle = false,\n onClipboardError,\n className,\n columnFiltering,\n columnGroups,\n columns,\n data,\n \"data-testid\": dataTestId,\n emptyComponent,\n emptyContent,\n estimatedRowDetailHeight,\n estimatedRowHeight,\n getRowHeight,\n expandedRowIds,\n getRowDetailHeight,\n getRowId,\n hasMoreRows = false,\n infiniteScroll = false,\n infiniteScrollThreshold = 160,\n lazyLoad = false,\n lazyLoadBatchSize = 30,\n lazyLoadMode = \"append\",\n lazyLoadThreshold,\n loading = false,\n loadingComponent,\n loadingContent,\n loadingMore = false,\n multiSort = false,\n onChangeColumnLayout,\n onChangeData,\n onChangeSelection,\n onChangeSort,\n onChangeSortModel,\n onClickCell,\n onClickRow,\n onContextMenuCell,\n onContextMenuRow,\n onChangeExpandedRowIds,\n onDoubleClickCell,\n onDoubleClickRow,\n onKeyDownCell,\n onKeyDownRow,\n onLazyLoad,\n onLoadMore,\n onAfterDragRow,\n onBeforeRowDrag,\n onRowDrag,\n pagination,\n persistHeaderWhenEmpty = true,\n rowHeight: providedRowHeight = 36,\n rowGrouping,\n rowProps,\n isRowExpandable,\n renderRowDetail,\n rowDetail,\n showColumnMoveHandle = true,\n showHeader = true,\n skeletonRowCount,\n style,\n summary,\n tableTransfer,\n theme,\n treeContext,\n viewportContext,\n virtualized = false,\n }: CominsTableInnerProps<TData, TGroup>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n const rowHeight = normalizeCominsRowHeight(providedRowHeight);\n const [detailFocusRestorer] = useState(createCominsDetailFocusRestorer);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const footerRef = useRef<HTMLDivElement | null>(null);\n const headerRef = useRef<HTMLDivElement | null>(null);\n const horizontalScrollbarRef = useRef<HTMLDivElement | null>(null);\n const synchronizedScrollLeftRef = useRef(0);\n const tableRootRef = useRef<HTMLDivElement | null>(null);\n const cellTooltip = useCominsCellTooltip();\n let activeCellTooltipContent: React.ReactNode;\n const copiedCellRef = useRef<CominsCopiedCell | null>(null);\n const copiedRangeRef = useRef<CominsCopiedCellRange | null>(null);\n const copiedRowRef = useRef<CominsCopiedRow<TData> | null>(null);\n const detailMeasurementsRef = useRef(\n new Map<CominsRowId, CominsDetailMeasurement>(),\n );\n const rowMeasurementsRef = useRef(new Map<CominsRowId, CominsRowMeasurement<TData>>());\n const committedViewportIndexRef = useRef<{ key: object; index: CominsViewportHeightIndex } | null>(null);\n const viewportMeasurementAnchorRef = useRef<{ index: number; offset: number; previousPhysicalScrollTop: number } | null>(null);\n const detailElementsRef = useRef(\n new Map<Element, CominsObservedDetail>(),\n );\n const fallbackMeasuredDetailElementsRef = useRef(new Set<Element>());\n const detailObserverRef = useRef<ReturnType<typeof createMeasurementObserver> | null>(null);\n const committedDetailObserverSnapshotRef = useRef<\n CominsCommittedDetailObserverSnapshot<TData> | null\n >(null);\n const rowDetailToggleElementsRef = useRef(new Map<CominsRowId, HTMLButtonElement>());\n const activePointerGestureCleanupRef = useRef<TablePointerGestureCleanup | null>(null);\n const columnPointerInteractionRef = useRef<CominsColumnPointerInteraction | null>(null);\n const columnInteractionResetPendingRef = useRef(false);\n const columnMoveAnimationCleanupRef = useRef<(() => void) | null>(null);\n const columnMoveAnimationSnapshotRef = useRef<Map<HTMLElement, number> | null>(null);\n const headerRendererBodyRef = useRef(new Map<string, { body: React.ReactNode; renderer: unknown; kind: \"render\" | \"legacy\" }>());\n const lastCellAnchorRef = useRef<CominsCellAddress | null>(null);\n const lazyAbortControllerRef = useRef<AbortController | null>(null);\n const lazyLoadingReasonRef = useRef<CominsLazyLoadReason | null>(null);\n const onLazyLoadRef = useRef(onLazyLoad);\n const lazyRequestIdRef = useRef(0);\n const lastLoadMoreRowCountRef = useRef<number | null>(null);\n const lastRowAnchorRef = useRef<CominsRowId | null>(null);\n const rangeDragAnchorRef = useRef<CominsCellAddress | null>(null);\n const rangeDragLastAddressRef = useRef<CominsCellAddress | null>(null);\n const rangeDragMovedRef = useRef(false);\n const rowMoveStateRef = useRef<CominsRowMoveState | null>(null);\n const pendingRowMoveScrollTopRef = useRef<number | null>(null);\n const rowGroupMoveStateRef = useRef<CominsRowGroupMoveState | null>(null);\n const transferSnapshotRef = useRef<\n CominsTableTransferRegistrationSnapshot<TData, TGroup> | null\n >(null);\n const externalDropMarkerRef = useRef<HTMLElement | null>(null);\n const transferRejectionTargetRef = useRef<HTMLElement | null>(null);\n const transferRejectionTimerRef = useRef<number | null>(null);\n const pendingTransferFocusFrameRef = useRef<number | null>(null);\n const groupDisclosureElementsRef = useRef(new Map<CominsRowId, HTMLButtonElement>());\n const pendingGroupDisclosureFocusRef = useRef<CominsRowId | null>(null);\n const focusedLeafDataIndexRef = useRef<number | null>(null);\n const previousGroupedDataIndexesRef = useRef<ReadonlySet<number> | null>(null);\n const anchorRevisionRef = useRef(0);\n const logicalAnchorTransactionRef = useRef<CominsLogicalAnchorTransaction | null>(null);\n const pendingDetailAnchorRef = useRef<CominsPendingDetailAnchor | null>(null);\n const pendingScrollTopRef = useRef(0);\n const previousVirtualProjectionRef = useRef<CominsVirtualProjection | null>(null);\n const scrollCommitTimeoutRef = useRef<number | null>(null);\n const scrollFrameRef = useRef<number | null>(null);\n const suppressedSortClickRef = useRef<CominsSuppressedSortClick | null>(null);\n const [containerHeight, setContainerHeight] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n const [horizontalScrollContentWidth, setHorizontalScrollContentWidth] = useState(0);\n const [horizontalViewportOuterWidth, setHorizontalViewportOuterWidth] = useState(0);\n const [horizontalViewportWidth, setHorizontalViewportWidth] = useState(0);\n const [detailLayoutVersion, setDetailLayoutVersion] = useState(0);\n const [rowFontRevision, setRowFontRevision] = useState(0);\n const [movingColumnId, setMovingColumnId] = useState<string | null>(null);\n const [movingGroupId, setMovingGroupId] = useState<string | null>(null);\n const [columnMovePointer, setColumnMovePointer] = useState<{ x: number; y: number } | null>(null);\n const [columnMoveTarget, setColumnMoveTarget] = useState<CominsColumnMoveTarget | null>(null);\n const [logicalAnchorTransaction, setLogicalAnchorTransaction] =\n useState<CominsLogicalAnchorTransaction | null>(null);\n const [resizingColumnId, setResizingColumnId] = useState<string | null>(null);\n const [rowMoveState, setRowMoveState] = useState<CominsRowMoveState | null>(null);\n const [rowGroupMoveState, setRowGroupMoveState] = useState<CominsRowGroupMoveState | null>(null);\n const [transferRejectionFeedback, setTransferRejectionFeedback] =\n useState<CominsTransferRejectionFeedbackState | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const tableInstanceId = useId();\n const rowDetailIdPrefix = useId();\n const effectiveData = data;\n const groupingRequested =\n !treeContext &&\n rowGrouping !== null &&\n typeof rowGrouping === \"object\" &&\n rowGrouping !== undefined &&\n Array.isArray(rowGrouping.groups) &&\n typeof rowGrouping.getGroupId === \"function\" &&\n typeof rowGrouping.getRowGroupId === \"function\";\n const filteringRequested =\n !treeContext &&\n columnFiltering !== null &&\n typeof columnFiltering === \"object\" &&\n columnFiltering !== undefined &&\n Array.isArray(columnFiltering.model);\n const normalizedTableTransfer =\n !treeContext &&\n !filteringRequested &&\n !infiniteScroll &&\n !lazyLoad &&\n tableTransfer !== null &&\n typeof tableTransfer === \"object\" &&\n typeof tableTransfer.scope === \"string\" &&\n tableTransfer.scope.length > 0 &&\n typeof tableTransfer.tableId === \"string\" &&\n tableTransfer.tableId.length > 0 &&\n isCominsTableTransferCoordinator<TData, TGroup>(tableTransfer.coordinator)\n ? tableTransfer as CominsTableTransferConfig<TData, TGroup>\n : undefined;\n const effectivePagination = useMemo(\n () => groupingRequested\n ? { pageIndex: 0, pageSize: Math.max(1, effectiveData.length) }\n : pagination,\n [effectiveData.length, groupingRequested, pagination],\n );\n const effectiveRowProps = filteringRequested\n ? { ...rowProps, draggable: false }\n : rowProps;\n const [state, setState] = useState(() =>\n createCominsTableState({\n columnGroups,\n columns,\n getRowId,\n pagination: effectivePagination,\n rows: effectiveData,\n showHeader,\n theme,\n }),\n );\n const stateRef = useRef(state);\n const columnOrderHistoryRef = useRef(state.columnOrder);\n const stateInputRef = useRef({ columnGroups, columns, data: effectiveData, getRowId, pagination: effectivePagination, showHeader });\n const virtualBufferSize = Math.max(0, Math.floor(Number.isFinite(bufferSize) ? Number(bufferSize) : 10));\n const resolvedLazyLoadBatchSize = Math.max(1, Math.floor(lazyLoadBatchSize));\n const resolvedLazyLoadThreshold = Math.max(0, Math.floor(lazyLoadThreshold ?? infiniteScrollThreshold));\n const hasLazyLoadHandler = typeof onLazyLoad === \"function\";\n const resolvedRowDetailRender = rowDetail?.render ?? renderRowDetail;\n const rowDetailEnabled = typeof resolvedRowDetailRender === \"function\" && !treeContext && !viewportContext;\n const normalizedExpandedRowIds = useMemo(() => {\n const seen = new Set<CominsRowId>();\n\n return (expandedRowIds ?? []).filter((rowId) => {\n if (seen.has(rowId)) {\n return false;\n }\n\n seen.add(rowId);\n return true;\n });\n }, [expandedRowIds]);\n const expandedRowIdSet = useMemo(\n () => new Set(normalizedExpandedRowIds),\n [normalizedExpandedRowIds],\n );\n const toggleRowDetail = (rowId: CominsRowId, expandable: boolean) => {\n if (!rowDetailEnabled || !expandable || !onChangeExpandedRowIds) {\n return;\n }\n\n onChangeExpandedRowIds(\n expandedRowIdSet.has(rowId)\n ? normalizedExpandedRowIds.filter((current) => current !== rowId)\n : [...normalizedExpandedRowIds, rowId],\n );\n };\n const clearActivePointerGesture = () => {\n const cleanup = activePointerGestureCleanupRef.current;\n\n activePointerGestureCleanupRef.current = null;\n cleanup?.();\n };\n const registerActivePointerGesture = (cleanup: TablePointerGestureCleanup) => {\n clearActivePointerGesture();\n activePointerGestureCleanupRef.current = cleanup;\n };\n const clearExternalDropMarker = () => {\n const marker = externalDropMarkerRef.current;\n\n if (!marker) {\n return;\n }\n\n marker.removeAttribute(\"data-comins-cross-row-drop-position\");\n marker.removeAttribute(\"data-comins-group-drop-position\");\n marker.removeAttribute(\"data-comins-group-drop-valid\");\n marker.removeAttribute(\"data-comins-row-drop-valid\");\n externalDropMarkerRef.current = null;\n };\n const clearTransferRejectionFeedback = (updateState = true) => {\n if (transferRejectionTimerRef.current !== null) {\n window.clearTimeout(transferRejectionTimerRef.current);\n transferRejectionTimerRef.current = null;\n }\n\n transferRejectionTargetRef.current?.removeAttribute(\"data-comins-transfer-rejected\");\n transferRejectionTargetRef.current = null;\n\n if (updateState) {\n setTransferRejectionFeedback(null);\n }\n };\n const showTransferRejectionFeedback = (\n rejection: CominsTableTransferRejection<TData, TGroup>,\n targetSnapshot: CominsTableTransferRegistrationSnapshot<TData, TGroup>,\n clientX: number,\n clientY: number,\n ) => {\n const feedback = targetSnapshot.config.rejectionFeedback;\n\n if (feedback === false) {\n return;\n }\n\n clearTransferRejectionFeedback();\n const duplicateId = rejection.conflict.kind === \"group\"\n ? rejection.conflict.groupId\n : rejection.conflict.rowId;\n const defaultContent = (\n <>\n <strong>Duplicate ID</strong>\n <span>{`The ID \"${String(duplicateId)}\" already exists.`}</span>\n </>\n );\n const render = feedback?.tooltip?.render;\n const renderedContent = render ? render(rejection) : feedback?.renderTooltip?.(rejection);\n const content = render ? renderedContent === undefined ? defaultContent : renderedContent : renderedContent ?? defaultContent;\n const requestedDuration = feedback?.duration ?? 1800;\n const duration = Number.isFinite(requestedDuration)\n ? Math.max(500, Math.min(10000, requestedDuration))\n : 1800;\n\n targetSnapshot.root?.setAttribute(\"data-comins-transfer-rejected\", \"true\");\n transferRejectionTargetRef.current = targetSnapshot.root;\n setTransferRejectionFeedback({ content, x: clientX, y: clientY });\n transferRejectionTimerRef.current = window.setTimeout(\n () => clearTransferRejectionFeedback(),\n duration,\n );\n };\n const setExternalDropMarker = (\n element: HTMLElement,\n kind: \"group\" | \"row\",\n valid: boolean,\n position?: \"after\" | \"append\" | \"before\",\n ) => {\n clearExternalDropMarker();\n externalDropMarkerRef.current = element;\n\n if (kind === \"group\") {\n element.dataset.cominsGroupDropValid = valid ? \"true\" : \"false\";\n\n if (position === \"after\" || position === \"before\") {\n element.dataset.cominsGroupDropPosition = position;\n }\n return;\n }\n\n element.dataset.cominsRowDropValid = valid ? \"true\" : \"false\";\n\n if (element.dataset.cominsRowDataIndex !== undefined) {\n element.dataset.cominsCrossRowDropPosition = \"before\";\n }\n };\n const getRegisteredTransferSnapshot = (tableId: string) => normalizedTableTransfer\n ? getReactTransferSnapshot(normalizedTableTransfer.coordinator, normalizedTableTransfer.scope, tableId)\n : null;\n const getCrossTableTransferHit = (clientX: number, clientY: number): CominsTransferTableHit<TData, TGroup> | null => normalizedTableTransfer\n ? getBrowserTransferHit({ sourceTableId: normalizedTableTransfer.tableId, scope: normalizedTableTransfer.scope, instanceId: tableInstanceId, root: tableRootRef.current, clientX, clientY, document, getSnapshot: getRegisteredTransferSnapshot })\n : null;\n const scheduleTransferFocus = (\n targetTableId: string,\n kind: \"group\" | \"row\",\n id: CominsRowId,\n ) => {\n if (pendingTransferFocusFrameRef.current !== null) {\n window.cancelAnimationFrame(pendingTransferFocusFrameRef.current);\n }\n\n let remainingAttempts = 3;\n const attemptFocus = () => {\n pendingTransferFocusFrameRef.current = null;\n const snapshot = getRegisteredTransferSnapshot(targetTableId);\n const root = snapshot?.root;\n\n if (!root) {\n return;\n }\n\n const identity = getCominsTransferIdentity(id);\n const row = [...root.querySelectorAll<HTMLElement>(\n kind === \"row\"\n ? \"[data-comins-transfer-row-id]\"\n : \"[data-comins-transfer-group-id]\",\n )].find((candidate) =>\n (kind === \"row\"\n ? candidate.dataset.cominsTransferRowId\n : candidate.dataset.cominsTransferGroupId) === identity,\n );\n const focusTarget = kind === \"group\"\n ? row?.querySelector<HTMLElement>(\n \".comins-row-group-drag-handle, .comins-row-group-expander\",\n )\n : row;\n\n if (focusTarget) {\n focusCominsElement(focusTarget, { preventScroll: true });\n return;\n }\n\n remainingAttempts -= 1;\n\n if (remainingAttempts > 0) {\n pendingTransferFocusFrameRef.current = window.requestAnimationFrame(attemptFocus);\n return;\n }\n\n focusCominsElement(root, { preventScroll: true });\n };\n\n pendingTransferFocusFrameRef.current = window.requestAnimationFrame(attemptFocus);\n };\n\n useLayoutEffect(() => {\n onLazyLoadRef.current = onLazyLoad;\n }, [onLazyLoad]);\n\n const requestLazyLoad = (reason: CominsLazyLoadReason) => {\n const lazyLoadHandler = onLazyLoadRef.current;\n\n if (groupingRequested || filteringRequested || !lazyLoad || lazyLoadMode !== \"append\" || !lazyLoadHandler || lazyLoadingReasonRef.current) {\n return;\n }\n\n const currentRowsLength = stateRef.current.rows.length;\n\n if (reason === \"scroll\" && (!hasMoreRows || loading || loadingMore)) {\n return;\n }\n\n const controller = new AbortController();\n const requestId = lazyRequestIdRef.current + 1;\n const offset = reason === \"scroll\" ? currentRowsLength : 0;\n\n lazyRequestIdRef.current = requestId;\n lazyAbortControllerRef.current?.abort();\n lazyAbortControllerRef.current = controller;\n lazyLoadingReasonRef.current = reason;\n if (reason !== \"scroll\") {\n pendingScrollTopRef.current = 0;\n setScrollTop(0);\n if (containerRef.current) {\n setCominsScrollTop(containerRef.current, 0);\n }\n }\n let result: Promise<void> | void;\n\n try {\n result = lazyLoadHandler({\n limit: resolvedLazyLoadBatchSize,\n offset,\n reason,\n signal: controller.signal,\n });\n } catch {\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current = null;\n return;\n }\n\n void Promise.resolve(result)\n .catch(() => {\n // Error and retry UI are intentionally left to the consumer in this API pass.\n })\n .finally(() => {\n if (lazyRequestIdRef.current !== requestId) {\n return;\n }\n\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current = null;\n });\n };\n\n useEffect(() => {\n if (groupingRequested || filteringRequested || !lazyLoad || !hasLazyLoadHandler) {\n return undefined;\n }\n\n requestLazyLoad(\"initial\");\n\n return () => {\n lazyRequestIdRef.current += 1;\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current?.abort();\n lazyAbortControllerRef.current = null;\n };\n }, [filteringRequested, groupingRequested, hasLazyLoadHandler, lazyLoad, resolvedLazyLoadBatchSize]);\n\n useEffect(() => {\n const previousInput = stateInputRef.current;\n\n if (\n previousInput.columns === columns &&\n previousInput.columnGroups === columnGroups &&\n previousInput.data === effectiveData &&\n previousInput.getRowId === getRowId &&\n previousInput.pagination === effectivePagination &&\n previousInput.showHeader === showHeader\n ) {\n return;\n }\n\n stateInputRef.current = { columnGroups, columns, data: effectiveData, getRowId, pagination: effectivePagination, showHeader };\n const current = stateRef.current;\n const result = reconcileReactState({\n current,\n nextInput: { columnGroups, columns, getRowId, pagination: effectivePagination, rows: effectiveData, showHeader },\n columnOrderHistory: columnOrderHistoryRef.current,\n dataChanged: previousInput.data !== effectiveData,\n getRowIdChanged: previousInput.getRowId !== getRowId,\n viewportIndices: viewportContext?.indices,\n });\n const next = result.state;\n columnOrderHistoryRef.current = result.columnOrderHistory;\n result.invalidatedDetailRowIds.forEach(rowId => detailMeasurementsRef.current.delete(rowId));\n stateRef.current = next;\n setState(next);\n notifyReactInputChanges(current, next, { onChangeSelection, onChangeSort, onChangeSortModel });\n }, [columnGroups, columns, effectiveData, effectivePagination, getRowId, showHeader]);\n\n useEffect(() => {\n if (lastLoadMoreRowCountRef.current !== null && lastLoadMoreRowCountRef.current !== state.rows.length) {\n lastLoadMoreRowCountRef.current = null;\n }\n }, [state.rows.length]);\n\n useEffect(createTableUnmountEffect({\n activePointerGestureCleanupRef,\n detailFocusRestorer,\n externalDropMarkerRef,\n transferRejectionTimerRef,\n transferRejectionTargetRef,\n pendingTransferFocusFrameRef,\n scrollFrameRef,\n scrollCommitTimeoutRef,\n }), []);\n\n useLayoutEffect(createViewportMeasurementEffect({\n containerRef,\n setContainerHeight,\n setContainerWidth,\n setHorizontalScrollContentWidth,\n setHorizontalViewportOuterWidth,\n setHorizontalViewportWidth,\n }), []);\n\n useEffect(() => {\n reconcileCominsDetailMeasurements(\n detailMeasurementsRef.current,\n new Set(state.rowIds),\n );\n const ids = new Set(state.rowIds);\n for (const id of rowMeasurementsRef.current.keys()) if (!ids.has(id)) rowMeasurementsRef.current.delete(id);\n }, [state.rowIds]);\n useEffect(() => {\n if (!getRowHeight) return;\n const changed = () => setRowFontRevision(value => value + 1);\n return observeCominsFontChanges(changed);\n }, [Boolean(getRowHeight)]);\n\n const updateMixedProjectionDetailHeight = (\n snapshot: CominsCommittedDetailObserverSnapshot<TData>,\n rowId: CominsRowId,\n height: number,\n width: number,\n kind?: \"row\",\n ) => {\n const projection = snapshot.projection;\n\n if (!projection || (kind !== \"row\" && width !== snapshot.contentWidth)) {\n return false;\n }\n\n const slotIndex = projection.slotIndexByRowId.get(rowId);\n const slot = slotIndex === undefined ? undefined : projection.slots[slotIndex];\n\n if (slotIndex === undefined || slot?.kind !== \"data\") {\n return false;\n }\n\n if (kind === \"row\") {\n if (!slot.autoHeight) return false;\n const delta = projection.heightIndex.updateHeight(slotIndex, height + (slot.detail?.height ?? 0));\n slot.rowHeight = height;\n return delta !== 0;\n }\n if (slot.detail?.mode !== \"auto\") return false;\n\n const nextSlotHeight =\n projection.heightIndex.getHeight(slotIndex) - slot.detail.height + height;\n const delta = projection.heightIndex.updateHeight(slotIndex, nextSlotHeight);\n\n slot.detail.estimated = false;\n slot.detail.height = height;\n return delta !== 0;\n };\n\n const applyDetailMeasurementUpdates = (\n updates: ReadonlyArray<{\n height: number;\n rowId: CominsRowId;\n width: number;\n kind?: \"row\";\n }>,\n ) => {\n const snapshot = committedDetailObserverSnapshotRef.current;\n\n if (!snapshot) {\n return;\n }\n\n const accepted = updates.filter(({ height, rowId, width, kind }) => {\n if (kind === \"row\") {\n const slot = snapshot.rowSlots.get(rowId);\n const current = rowMeasurementsRef.current.get(rowId);\n return slot?.autoHeight && (!current || current.row !== slot.row || current.layoutKey !== snapshot.rowLayoutKey || current.contentRevision !== snapshot.rowContentRevision || Math.abs(current.height - height) >= .5);\n }\n const current = detailMeasurementsRef.current.get(rowId);\n\n return (\n !current ||\n current.width !== width ||\n Math.abs(current.height - height) >= 0.5\n );\n });\n\n if (accepted.length === 0) {\n return;\n }\n\n const projection = snapshot.projection;\n const viewport = containerRef.current;\n const viewportHeight = viewport?.clientHeight || snapshot.viewportHeight;\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n const viewportIndex = committedViewportIndexRef.current?.index;\n if (viewportContext && viewportIndex && viewport && !viewportMeasurementAnchorRef.current) {\n const logical = logicalAnchorTransactionRef.current && Math.abs(viewport.scrollTop - logicalAnchorTransactionRef.current.actualPhysical) <= .5 ? logicalAnchorTransactionRef.current.targetLogical : viewport.scrollTop * getCominsScrollScale(viewportIndex.getTotalHeight(), viewportHeight).scrollScale;\n const index = viewportIndex.findIndexAtOffset(logical);\n viewportMeasurementAnchorRef.current = { index, offset: logical - viewportIndex.getPrefixHeight(index), previousPhysicalScrollTop: viewport.scrollTop };\n }\n const pendingAnchor =\n currentPendingDetailAnchor?.status === \"pending\"\n ? currentPendingDetailAnchor\n : !currentPendingDetailAnchor && projection && viewport\n ? captureCominsVirtualAnchor({\n logicalScrollTop:\n logicalAnchorTransactionRef.current &&\n Math.abs(\n viewport.scrollTop -\n logicalAnchorTransactionRef.current.actualPhysical,\n ) <= 0.5\n ? logicalAnchorTransactionRef.current.targetLogical\n : undefined,\n physicalScrollTop: viewport.scrollTop,\n projection: {\n heightIndex: projection.heightIndex,\n keys: projection.keys,\n mixed: true,\n },\n viewportHeight,\n })\n : undefined;\n let updatedActiveIndex = false;\n\n for (const update of accepted) {\n if (update.kind === \"row\") {\n const slot = snapshot.rowSlots.get(update.rowId)!;\n rowMeasurementsRef.current.set(update.rowId, { height: update.height, row: slot.row, layoutKey: snapshot.rowLayoutKey, contentRevision: snapshot.rowContentRevision });\n if (viewportIndex && slot.absoluteIndex !== undefined) {\n viewportIndex.updateHeight(slot.absoluteIndex, update.height);\n slot.rowHeight = update.height;\n }\n } else {\n detailMeasurementsRef.current.set(update.rowId, { height: update.height, width: update.width });\n }\n updatedActiveIndex =\n updateMixedProjectionDetailHeight(\n snapshot,\n update.rowId,\n update.height,\n update.width,\n update.kind,\n ) || updatedActiveIndex;\n }\n\n // 측정 콜백도 새 블록을 추가하므로 최신 commit의 보존 구간으로 캐시 한도를 다시 적용한다.\n if (viewportIndex && snapshot.viewportRetainRange) {\n viewportIndex.retain(snapshot.viewportRetainRange);\n }\n\n if (\n pendingAnchor &&\n updatedActiveIndex &&\n currentPendingDetailAnchor?.status !== \"pending\"\n ) {\n const revision = anchorRevisionRef.current + 1;\n\n anchorRevisionRef.current = revision;\n pendingDetailAnchorRef.current = {\n ...pendingAnchor,\n revision,\n status: \"pending\",\n };\n }\n\n if (updatedActiveIndex || !projection) {\n setDetailLayoutVersion((current) => current + 1);\n }\n };\n\n const createDetailObserver = () => {\n if (!hasCominsResizeObserver()) {\n return null;\n }\n\n const updates: Array<{ height: number; rowId: CominsRowId; width: number; kind?: \"row\" }> = [];\n const observer = createMeasurementObserver({\n onMeasure: measurement => {\n const observed = detailElementsRef.current.get(measurement.element);\n if (!observed) return;\n const height = observed.kind === \"row\" ? measurement.rectHeight : measurement.height;\n const width = measurement.width;\n if (Number.isFinite(height) && height > 0) {\n updates.push({ height, rowId: observed.rowId, width, kind: observed.kind });\n }\n },\n onBatchComplete: () => applyDetailMeasurementUpdates(updates.splice(0)),\n });\n\n detailObserverRef.current = observer;\n\n for (const observed of detailElementsRef.current.values()) {\n observer.observe(observed.element);\n }\n\n return observer;\n };\n\n useLayoutEffect(createDetailObserverCleanupEffect({\n detailObserverRef,\n detailElementsRef,\n fallbackMeasuredDetailElementsRef,\n committedDetailObserverSnapshotRef,\n }), []);\n\n const disconnectDetailObserverIfIdle = () => {\n if (detailElementsRef.current.size === 0) {\n detailObserverRef.current?.dispose();\n detailObserverRef.current = null;\n }\n };\n\n const registerDetailElement = (\n rowId: CominsRowId,\n mode: \"auto\" | \"fixed\",\n element: HTMLElement | null,\n kind?: \"row\",\n ) => {\n for (const [currentElement, observed] of detailElementsRef.current) {\n if (observed.rowId === rowId && observed.kind === kind && currentElement !== element) {\n detailObserverRef.current?.unobserve(currentElement);\n detailElementsRef.current.delete(currentElement);\n fallbackMeasuredDetailElementsRef.current.delete(currentElement);\n }\n }\n\n if (!element || mode === \"fixed\") {\n disconnectDetailObserverIfIdle();\n return;\n }\n\n detailElementsRef.current.set(element, { element, rowId, kind });\n };\n\n const notifyChanges = (\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n notifyReactStateChanges(current, next, { onChangeData, onChangeSelection, onChangeColumnLayout, onChangeSort, onChangeSortModel }, options);\n };\n\n const commitState = (\n updater: CominsTableState<TData> | ((current: CominsTableState<TData>) => CominsTableState<TData>),\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n const current = stateRef.current;\n const next = typeof updater === \"function\" ? updater(current) : updater;\n\n columnOrderHistoryRef.current = reconcileColumnOrderHistory(\n columnOrderHistoryRef.current,\n next.columnOrder,\n next.columns.map((column) => column.id),\n );\n stateRef.current = next;\n setState(next);\n notifyChanges(current, next, options);\n };\n\n const visibleColumns = useMemo(() => getCominsVisibleColumns(state), [state]);\n const renderedHeaderRendererBodies = new Map<string, { body: React.ReactNode; renderer: unknown; kind: \"render\" | \"legacy\" }>();\n\n useEffect(() => {\n headerRendererBodyRef.current = renderedHeaderRendererBodies;\n });\n\n const columnWidths = useMemo(() => {\n const columnCount = visibleColumns.length;\n\n if (columnCount === 0) {\n return [];\n }\n\n const configuredWidths = visibleColumns.map((column) => state.columnState[column.id]?.width ?? column.width);\n\n if (containerWidth <= 0) {\n const fallbackWidth = `${100 / columnCount}%`;\n\n return configuredWidths.map((width, index) => {\n if (width === undefined) {\n return fallbackWidth;\n }\n\n const column = visibleColumns[index]!;\n\n return clampColumnWidth(\n width,\n getEffectiveColumnMinWidth(column),\n getEffectiveColumnMaxWidth(column),\n );\n });\n }\n\n let fixedTotal = 0;\n\n for (const width of configuredWidths) {\n fixedTotal += width ?? 0;\n }\n\n const flexibleColumns = visibleColumns.filter((_column, index) => configuredWidths[index] === undefined);\n const flexibleWidth =\n flexibleColumns.length > 0 ? Math.max(0, (containerWidth - fixedTotal) / flexibleColumns.length) : 0;\n\n return visibleColumns.map((column, index) => {\n const width = configuredWidths[index] ?? flexibleWidth;\n const minWidth = getEffectiveColumnMinWidth(column);\n const maxWidth = column.maxWidth ?? Number.POSITIVE_INFINITY;\n\n return Math.min(maxWidth, Math.max(minWidth, width));\n });\n }, [containerWidth, state.columnState, visibleColumns]);\n const columnPinningBlocks = useMemo(() => {\n const groupIdByColumnId = new Map<string, string>();\n\n for (const group of state.columnGroups) {\n for (const columnId of group.children) {\n groupIdByColumnId.set(columnId, group.id);\n }\n }\n\n const visibleColumnIds = new Set(visibleColumns.map((column) => column.id));\n const widthByColumnId = new Map(\n visibleColumns.map((column, index) => [\n column.id,\n typeof columnWidths[index] === \"number\" ? columnWidths[index] : 0,\n ] as const),\n );\n const emittedGroups = new Set<string>();\n return visibleColumns.flatMap((column) => {\n const groupId = groupIdByColumnId.get(column.id);\n\n if (!groupId) {\n return [{\n columnIds: [column.id],\n columnWidths: [widthByColumnId.get(column.id) ?? 0],\n id: `column:${column.id}`,\n pinned: state.columnState[column.id]?.pinned,\n }];\n }\n\n if (emittedGroups.has(groupId)) {\n return [];\n }\n\n emittedGroups.add(groupId);\n const group = state.columnGroups.find((candidate) => candidate.id === groupId);\n const columnIds = visibleColumns\n .map((candidate) => candidate.id)\n .filter((columnId) => visibleColumnIds.has(columnId) && group?.children.includes(columnId));\n\n return [{\n columnIds,\n columnWidths: columnIds.map((columnId) => widthByColumnId.get(columnId) ?? 0),\n id: `group:${groupId}`,\n pinned: state.columnGroupState[groupId]?.pinned,\n }];\n });\n\n }, [columnWidths, state.columnGroupState, state.columnGroups, state.columnState, visibleColumns]);\n const columnPinning = useMemo(\n () => resolveCominsColumnPinning(columnPinningBlocks, containerWidth),\n [columnPinningBlocks, containerWidth],\n );\n const getPinnedColumnAttributes = (columnId: string) => {\n const pin = columnPinning.columns.get(columnId);\n\n return {\n boundary: pin?.boundary,\n pinned: pin?.pinned,\n style: pin?.pinned\n ? {\n [pin.pinned]: pin.offset,\n position: \"sticky\",\n } as React.CSSProperties\n : undefined,\n };\n };\n const columnWidthTotal = useMemo(() => {\n let totalWidth = 0;\n\n for (const width of columnWidths) {\n if (typeof width !== \"number\") {\n return undefined;\n }\n\n totalWidth += width;\n }\n\n return totalWidth;\n }, [columnWidths]);\n const tableWidth = useMemo(() => {\n if (typeof columnWidthTotal !== \"number\") {\n return undefined;\n }\n\n return Math.max(containerWidth, columnWidthTotal);\n }, [columnWidthTotal, containerWidth]);\n const detailContentWidth =\n typeof tableWidth === \"number\" && Number.isFinite(tableWidth)\n ? Math.round(tableWidth)\n : 0;\n const headerRows = useMemo(() => getCominsHeaderRows(state), [state]);\n const normalizedColumnFilters = useMemo(\n () => filteringRequested\n ? normalizeCominsColumnFilterModel({\n columns: state.columns,\n model: columnFiltering?.model,\n })\n : [],\n [columnFiltering?.model, filteringRequested, state.columns],\n );\n const filteringActive = normalizedColumnFilters.length > 0;\n const normalizedColumnFilterById = useMemo(\n () => new Map(normalizedColumnFilters.map((rule) => [rule.column.id, rule] as const)),\n [normalizedColumnFilters],\n );\n const filterSourceRows = useMemo(() => state.rows.map((data, dataIndex) => ({ data, dataIndex, id: state.rowIds[dataIndex]! })), [state.rows, state.rowIds]);\n const filteredDataIndexes = useMemo(\n () => filteringRequested\n ? getCominsFilteredRowIndexes({\n columns: state.columns,\n model: columnFiltering?.model,\n rows: state.rows.map((data, dataIndex) => ({\n data,\n dataIndex,\n id: state.rowIds[dataIndex]!,\n })),\n })\n : state.rows.map((_row, index) => index),\n [columnFiltering?.model, filteringRequested, state.columns, state.rowIds, state.rows],\n );\n const filteredRows = useMemo(\n () => filteredDataIndexes.flatMap((dataIndex) => {\n const row = state.rows[dataIndex];\n\n return row === undefined ? [] : [row];\n }),\n [filteredDataIndexes, state.rows],\n );\n const summaryValues = useMemo(\n () => (summary ? resolveCominsSummaryValues(treeContext?.summaryRows ?? filteredRows, visibleColumns, summary) : null),\n [filteredRows, summary, treeContext?.summaryRows, visibleColumns],\n );\n const summaryCells = useMemo(() => {\n if (!summary) {\n return [];\n }\n\n const cells: Array<{\n className?: string;\n colSpan: number;\n column: CominsTableRuntimeColumn<TData>;\n startIndex: number;\n style?: React.CSSProperties;\n value: React.ReactNode;\n }> = [];\n let columnIndex = 0;\n\n while (columnIndex < visibleColumns.length) {\n const column = visibleColumns[columnIndex]!;\n const configuredColumn = summary.columns[column.id];\n const config =\n typeof configuredColumn === \"object\" && configuredColumn !== null ? configuredColumn : undefined;\n const requestedColSpan = config?.colSpan;\n const normalizedColSpan =\n typeof requestedColSpan === \"number\" && Number.isFinite(requestedColSpan)\n ? Math.max(1, Math.floor(requestedColSpan))\n : 1;\n const colSpan = Math.min(normalizedColSpan, visibleColumns.length - columnIndex);\n\n cells.push({\n className: config?.className,\n colSpan,\n column,\n startIndex: columnIndex,\n style: config?.style,\n value: summaryValues?.renderedColumnIds.has(column.id)\n ? summaryValues.values[column.id]\n : summaryValues?.values[column.id] ?? (cells.length === 0 ? summary.label : null),\n });\n columnIndex += colSpan;\n }\n\n return cells;\n }, [summary, summaryValues, visibleColumns]);\n const groupingAggregations = rowGrouping?.aggregations;\n const groupingGetGroupId = rowGrouping?.getGroupId;\n const groupingGetGroupLabel = rowGrouping?.getGroupLabel;\n const groupingLabelRender = rowGrouping?.label?.render;\n const groupingGetRowGroupId = rowGrouping?.getRowGroupId;\n const groupingGroups = rowGrouping?.groups;\n const normalizedGrouping = useMemo(\n () => groupingRequested && groupingGetGroupId && groupingGetRowGroupId && groupingGroups\n ? normalizeCominsRowGrouping({\n columns: state.columns,\n config: {\n aggregations: groupingAggregations,\n getGroupId: groupingGetGroupId,\n getGroupLabel: groupingGetGroupLabel,\n label: { render: groupingLabelRender },\n getRowGroupId: groupingGetRowGroupId,\n groups: groupingGroups,\n },\n })\n : null,\n [\n groupingAggregations,\n groupingGetGroupId,\n groupingGetGroupLabel,\n groupingLabelRender,\n groupingGetRowGroupId,\n groupingGroups,\n groupingRequested,\n state.columns,\n ],\n );\n const groupModel = useMemo(\n () => normalizedGrouping && groupingGetRowGroupId\n ? createCominsGroupModel({\n ...normalizedGrouping,\n getRowGroupId: groupingGetRowGroupId,\n rows: filteredDataIndexes.flatMap((dataIndex) => {\n const data = state.rows[dataIndex];\n const id = state.rowIds[dataIndex];\n\n return data === undefined || id === undefined\n ? []\n : [{ data, dataIndex, id }];\n }),\n })\n : null,\n [filteredDataIndexes, groupingGetRowGroupId, normalizedGrouping, state.rowIds, state.rows],\n );\n const orderedGroupModel = useMemo(\n () => groupModel\n ? orderCominsGroupModel({\n columns: state.columns,\n model: groupModel,\n rows: state.rows,\n sortModel: state.sortModel,\n })\n : null,\n [groupModel, state.columns, state.rows, state.sortModel],\n );\n const normalizedExpandedGroupIds = useMemo(() => {\n const seen = new Set<CominsRowId>();\n const suppliedGroupIds = Array.isArray(rowGrouping?.expandedGroupIds)\n ? rowGrouping.expandedGroupIds\n : [];\n\n return suppliedGroupIds.filter((groupId) => {\n if (!orderedGroupModel?.groupsById.has(groupId) || seen.has(groupId)) {\n return false;\n }\n\n seen.add(groupId);\n return true;\n });\n }, [orderedGroupModel, rowGrouping?.expandedGroupIds]);\n const expandedGroupIdSet = useMemo(\n () => new Set(normalizedExpandedGroupIds),\n [normalizedExpandedGroupIds],\n );\n const toggleRowGroup = (groupId: CominsRowId) => {\n const onChangeExpandedGroupIds = rowGrouping?.onChangeExpandedGroupIds;\n\n if (typeof onChangeExpandedGroupIds !== \"function\" || !orderedGroupModel?.groupsById.has(groupId)) {\n return;\n }\n\n onChangeExpandedGroupIds(\n expandedGroupIdSet.has(groupId)\n ? normalizedExpandedGroupIds.filter((current) => current !== groupId)\n : [...normalizedExpandedGroupIds, groupId],\n );\n };\n const groupingProjection = useMemo(\n () => orderedGroupModel\n ? projectCominsGroups({\n expandedGroupIds: normalizedExpandedGroupIds,\n model: orderedGroupModel,\n rowIds: state.rowIds,\n })\n : null,\n [normalizedExpandedGroupIds, orderedGroupModel, state.rowIds],\n );\n const groupingActive = groupingProjection !== null;\n const transferEndpoint: CominsTableTransferEndpoint<TData, TGroup> | null =\n normalizedTableTransfer\n ? groupingActive && rowGrouping\n ? {\n data: state.rows,\n getGroupId: rowGrouping.getGroupId,\n getRowGroupId: rowGrouping.getRowGroupId,\n getRowId: state.getRowId,\n groups: rowGrouping.groups,\n setRowGroupId: rowGrouping.setRowGroupId,\n tableId: normalizedTableTransfer.tableId,\n }\n : {\n data: state.rows,\n getRowId: state.getRowId,\n tableId: normalizedTableTransfer.tableId,\n }\n : null;\n\n transferSnapshotRef.current = normalizedTableTransfer && transferEndpoint\n ? {\n config: normalizedTableTransfer,\n endpoint: transferEndpoint,\n instanceId: tableInstanceId,\n root: tableRootRef.current,\n viewport: containerRef.current,\n }\n : null;\n\n useCominsTableTransferRegistration({ config: normalizedTableTransfer, snapshot: transferSnapshotRef, root: tableRootRef, viewport: containerRef });\n\n useLayoutEffect(() => {\n if (!groupingProjection || !orderedGroupModel) {\n previousGroupedDataIndexesRef.current = null;\n pendingGroupDisclosureFocusRef.current = null;\n return;\n }\n\n const pendingGroupId = pendingGroupDisclosureFocusRef.current;\n\n if (pendingGroupId !== null) {\n const disclosure = groupDisclosureElementsRef.current.get(pendingGroupId);\n\n if (disclosure) {\n pendingGroupDisclosureFocusRef.current = null;\n focusedLeafDataIndexRef.current = null;\n focusCominsElement(disclosure);\n }\n }\n\n const nextDataIndexes = new Set(\n groupingProjection.entries.flatMap((entry) =>\n entry.kind === \"data\" ? [entry.dataIndex] : [],\n ),\n );\n const previousDataIndexes = previousGroupedDataIndexesRef.current;\n const focusedDataIndex = focusedLeafDataIndexRef.current;\n\n previousGroupedDataIndexesRef.current = nextDataIndexes;\n\n if (\n focusedDataIndex === null ||\n !previousDataIndexes?.has(focusedDataIndex) ||\n nextDataIndexes.has(focusedDataIndex)\n ) {\n return;\n }\n\n const activeElement = document.activeElement;\n const focusWasInTable = activeElement\n ? containerRef.current?.contains(activeElement) || activeElement === document.body\n : false;\n\n if (!focusWasInTable) {\n return;\n }\n\n const leafGroup = [...orderedGroupModel.groupsById.values()].find((group) =>\n group.leafSourceIndexes.includes(focusedDataIndex),\n );\n const fallbackGroupId = leafGroup?.groupId;\n\n if (fallbackGroupId !== undefined) {\n focusCominsElement(groupDisclosureElementsRef.current.get(fallbackGroupId));\n }\n }, [groupingProjection, orderedGroupModel]);\n const sortedRowIndexes = useMemo(\n () => (treeContext || groupingActive ? null : getCominsSortedRowIndexes(state, filteredDataIndexes)),\n [filteredDataIndexes, groupingActive, state, treeContext],\n );\n const projectedDataIndexes = useMemo(\n () => groupingProjection\n ? groupingProjection.entries.flatMap((entry) => entry.kind === \"data\" ? [entry.dataIndex] : [])\n : sortedRowIndexes ?? filteredDataIndexes,\n [filteredDataIndexes, groupingProjection, sortedRowIndexes],\n );\n const selectionRowIds = useMemo(() => projectedDataIndexes.map(index => state.rowIds[index]!), [projectedDataIndexes, state.rowIds]);\n const visibleRowCount = projectedDataIndexes.length;\n const visibleSlotCount = viewportContext?.data.rowCount ?? groupingProjection?.entries.length ?? visibleRowCount;\n const { pageSize, maxPageIndex, effectivePageIndex, pageStartIndex } = getCorePageProjection(visibleRowCount, state.pagination);\n useEffect(() => {\n if (!groupingProjection && !filteringRequested) {\n return;\n }\n\n const visibleRowIds = new Set(\n groupingProjection?.visibleLeafRowIds ?? projectedDataIndexes.flatMap((dataIndex) => {\n const rowId = state.rowIds[dataIndex];\n\n return rowId === undefined ? [] : [rowId];\n }),\n );\n const current = stateRef.current;\n const cellHidden = current.selection.cell !== null && !visibleRowIds.has(current.selection.cell.rowId);\n const selectedCells = current.selection.cells;\n const visibleSelectedCells = selectedCells?.filter((cell) => visibleRowIds.has(cell.rowId));\n const cellsHidden =\n selectedCells !== undefined && visibleSelectedCells !== undefined && selectedCells.length !== visibleSelectedCells.length;\n const rangeHidden = current.selection.range !== null && (\n !visibleRowIds.has(current.selection.range.anchor.rowId) ||\n !visibleRowIds.has(current.selection.range.focus.rowId)\n );\n\n if (!cellHidden && !cellsHidden && !rangeHidden) {\n return;\n }\n\n if (cellHidden) {\n lastCellAnchorRef.current = visibleSelectedCells?.at(-1) ?? null;\n }\n rangeDragAnchorRef.current = null;\n rangeDragLastAddressRef.current = null;\n commitState({\n ...current,\n selection: {\n ...current.selection,\n cell: cellHidden ? (visibleSelectedCells?.at(-1) ?? null) : current.selection.cell,\n cells: cellsHidden ? visibleSelectedCells : current.selection.cells,\n range: rangeHidden || cellHidden ? null : current.selection.range,\n },\n });\n }, [filteringRequested, groupingProjection, projectedDataIndexes, state.rowIds]);\n const effectiveExpandedRowIdSet = useMemo(() => {\n if (!rowDetailEnabled) {\n return new Set<CominsRowId>();\n }\n\n const next = new Set<CominsRowId>();\n const startIndex = virtualized || groupingActive ? 0 : pageStartIndex;\n const endIndex = virtualized\n ? projectedDataIndexes.length\n : groupingActive\n ? projectedDataIndexes.length\n : Math.min(projectedDataIndexes.length, pageStartIndex + pageSize);\n\n for (let visibleIndex = startIndex; visibleIndex < endIndex; visibleIndex += 1) {\n const dataIndex = projectedDataIndexes[visibleIndex];\n\n if (dataIndex === undefined) {\n continue;\n }\n\n const row = state.rows[dataIndex];\n const rowId = state.rowIds[dataIndex];\n\n if (\n row === undefined ||\n rowId === undefined ||\n !expandedRowIdSet.has(rowId)\n ) {\n continue;\n }\n\n const entry = { dataIndex, row, rowId, visibleIndex };\n const params = { row: createEventRow(entry) };\n\n if (isRowExpandable?.(params) !== false) {\n next.add(rowId);\n }\n }\n\n return next;\n }, [\n expandedRowIdSet,\n groupingActive,\n isRowExpandable,\n pageSize,\n pageStartIndex,\n projectedDataIndexes,\n rowDetailEnabled,\n state.rowIds,\n state.rows,\n virtualized,\n ]);\n const rowLayoutKey = `${detailContentWidth}:${visibleColumns.map((column, index) => `${column.id}:${columnWidths[index]}`).join(\"|\")}:${JSON.stringify(theme ?? state.theme)}:${rowHeight}`;\n const rowContentRevision = useMemo(() => ({}), [columns, rowProps?.style, className, style, theme, rowFontRevision]);\n const viewportIndexById = useMemo(() => viewportContext ? new Map(effectiveData.map((row, index) => [getRowId!(row, index), viewportContext.indices[index]!] as const)) : null, [effectiveData, getRowId, viewportContext?.indices]);\n const rowProjection = useMemo(() => {\n const source = { rows: state.rows, rowIds: state.rowIds, dataIndexes: projectedDataIndexes };\n if (viewportIndexById) return projectReactRows({ ...source, mode: \"viewport\", absoluteIndexById: viewportIndexById, rowCount: viewportContext!.data.rowCount });\n if (groupingProjection) return projectReactRows({ ...source, mode: \"grouped\", projection: groupingProjection });\n return treeContext ? projectReactRows({ ...source, mode: \"tree\" }) : projectReactRows({ ...source, mode: \"flat\", virtualized: true });\n }, [state.rows, state.rowIds, projectedDataIndexes, viewportIndexById, groupingProjection, treeContext !== undefined]);\n const fullProjectionSlots = useMemo<Array<CominsVirtualSlot<TData>>>(() => {\n const safeRowHeight = Math.max(1, rowHeight);\n return rowProjection.entries.flatMap<CominsVirtualSlot<TData>>((projectionEntry) => {\n if (projectionEntry.kind === \"placeholder\") return [];\n if (projectionEntry.kind === \"group\") {\n return [{\n groupId: projectionEntry.groupId,\n height: safeRowHeight,\n key: projectionEntry.key,\n kind: \"group\",\n }];\n }\n\n const { dataIndex, rowId } = projectionEntry;\n const absoluteIndex = projectionEntry.absoluteIndex;\n const visibleIndex = absoluteIndex ?? projectionEntry.visibleLeafIndex;\n if (viewportIndexById && absoluteIndex === undefined) return [];\n const row = state.rows[dataIndex];\n\n if (row === undefined || rowId === undefined) {\n return [];\n }\n\n let detail: CominsDataVirtualSlot<TData>[\"detail\"] | null = null;\n const resolvedHeight = resolveCominsRowHeight({\n value: getRowHeight?.({ row: createEventRow({ dataIndex, row, rowId, visibleIndex, absoluteIndex }) }),\n rowHeight, estimate: estimatedRowHeight, measurement: rowMeasurementsRef.current.get(rowId), row, layoutKey: rowLayoutKey, contentRevision: rowContentRevision,\n });\n\n if (effectiveExpandedRowIdSet.has(rowId)) {\n const params = { row: createEventRow({ dataIndex, row, rowId, visibleIndex }) };\n const normalized = normalizeCominsDetailHeight(getRowDetailHeight?.(params));\n\n detail =\n normalized.mode === \"auto\"\n ? {\n ...resolveCominsMeasuredDetailHeight(\n detailMeasurementsRef.current,\n rowId,\n detailContentWidth,\n normalizeCominsDetailEstimate(estimatedRowDetailHeight, rowHeight),\n ),\n mode: \"auto\",\n }\n : { estimated: false, height: normalized.height, mode: \"fixed\" };\n }\n\n return [\n { ...createCominsDataVirtualSlot({\n dataIndex,\n detail,\n row,\n rowHeight: resolvedHeight.height,\n autoHeight: resolvedHeight.auto,\n rowId,\n visibleIndex,\n }), absoluteIndex },\n ];\n });\n }, [\n detailContentWidth,\n rowLayoutKey,\n rowContentRevision,\n viewportIndexById,\n getRowHeight,\n estimatedRowHeight,\n virtualized ? 0 : detailLayoutVersion,\n effectiveExpandedRowIdSet,\n estimatedRowDetailHeight,\n getRowDetailHeight,\n rowProjection,\n rowHeight,\n state.rowIds,\n state.rows,\n ]);\n const mixedProjection = useMemo<CominsMixedVirtualProjection<TData> | null>(() => {\n if (viewportContext || !virtualized || (effectiveExpandedRowIdSet.size === 0 && !fullProjectionSlots.some(slot => slot.kind === \"data\" && (slot.autoHeight || slot.rowHeight !== rowHeight)))) {\n return null;\n }\n\n const safeRowHeight = Math.max(1, rowHeight);\n const slots = fullProjectionSlots;\n const heightIndex = CominsHeightIndex.from(\n slots.map((slot) => getCominsSlotHeight(slot, safeRowHeight)),\n );\n const slotIndexByRowId = new Map<CominsRowId, number>();\n\n for (let slotIndex = 0; slotIndex < slots.length; slotIndex += 1) {\n const slot = slots[slotIndex];\n const rowId = slot?.kind === \"data\" ? slot.rowId : undefined;\n\n if (rowId !== undefined && !slotIndexByRowId.has(rowId)) {\n slotIndexByRowId.set(rowId, slotIndex);\n }\n }\n\n return {\n heightIndex,\n keys: slots.map((slot) => slot.key),\n slotIndexByRowId,\n slots,\n };\n }, [\n effectiveExpandedRowIdSet,\n fullProjectionSlots,\n rowHeight,\n virtualized,\n viewportContext !== undefined,\n ]);\n useLayoutEffect(() => {\n if (!treeContext) return;\n treeContext.drag.navigateRef.current = (rowId) => {\n const viewport = containerRef.current;\n const index = fullProjectionSlots.findIndex(slot => slot.kind === \"data\" && slot.rowId === rowId);\n if (!viewport || index < 0) return;\n if (!virtualized) {\n scrollCominsRowIntoView(viewport, index);\n return;\n }\n const total = mixedProjection?.heightIndex.getTotalHeight() ?? fullProjectionSlots.length * rowHeight;\n const top = mixedProjection?.heightIndex.getPrefixHeight(index) ?? index * rowHeight;\n const height = getCominsSlotHeight(fullProjectionSlots[index]!, rowHeight);\n const scale = getCominsScrollScale(total, viewport.clientHeight).scrollScale;\n const logicalTop = viewport.scrollTop * scale;\n const target = top < logicalTop ? top : top + height > logicalTop + viewport.clientHeight ? top + height - viewport.clientHeight : logicalTop;\n if (target !== logicalTop) setCominsScrollTop(viewport, getCominsPhysicalScrollTop(target, total, viewport.clientHeight));\n };\n return () => { treeContext.drag.navigateRef.current = null; };\n }, [treeContext, fullProjectionSlots, mixedProjection, rowHeight, virtualized]);\n const viewportConfigurationKey = viewportContext ? `${typeof viewportContext.data.revision}:${viewportContext.data.revision}:${viewportContext.data.rowCount}:${viewportContext.data.blockSize}:${rowLayoutKey}:${estimatedRowHeight}:${viewportContext.config.heightCacheSize}` : \"\";\n const viewportIndexKey = useMemo(() => ({}), [viewportConfigurationKey, rowContentRevision]);\n const viewportHeightIndex = useMemo(() => {\n if (!viewportContext) return null;\n const previous = committedViewportIndexRef.current;\n const index = previous?.key === viewportIndexKey ? previous.index.clone() : new CominsViewportHeightIndex(viewportContext.data.rowCount, normalizeCominsRowHeight(estimatedRowHeight, rowHeight), viewportContext.data.blockSize, normalizeCominsViewportInteger(viewportContext.config.heightCacheSize, 64));\n for (const slot of fullProjectionSlots) if (slot.kind === \"data\" && slot.absoluteIndex !== undefined) index.updateHeight(slot.absoluteIndex, slot.rowHeight ?? rowHeight);\n index.retain(viewportContext.data.retainRange);\n return index;\n }, [viewportIndexKey, fullProjectionSlots, viewportContext?.data.retainRange]);\n const viewportHeight = containerHeight || rowHeight * 12;\n const previousViewportIndex = committedViewportIndexRef.current?.index;\n let viewportAnchor = viewportMeasurementAnchorRef.current;\n if (!viewportAnchor && viewportHeightIndex && previousViewportIndex && previousViewportIndex !== viewportHeightIndex) {\n const physical = containerRef.current?.scrollTop ?? scrollTop;\n const logical = logicalAnchorTransaction && Math.abs(physical - logicalAnchorTransaction.actualPhysical) <= .5 ? logicalAnchorTransaction.targetLogical : physical * getCominsScrollScale(previousViewportIndex.getTotalHeight(), viewportHeight).scrollScale;\n const index = previousViewportIndex.findIndexAtOffset(logical);\n viewportAnchor = { index, offset: logical - previousViewportIndex.getPrefixHeight(index), previousPhysicalScrollTop: physical };\n }\n const viewportAnchorLogical = viewportAnchor && viewportHeightIndex ? viewportHeightIndex.getPrefixHeight(viewportAnchor.index) + Math.min(viewportAnchor.offset, viewportHeightIndex.getHeight(viewportAnchor.index)) : undefined;\n useLayoutEffect(() => {\n if (!viewportHeightIndex) return;\n committedViewportIndexRef.current = { key: viewportIndexKey, index: viewportHeightIndex };\n viewportMeasurementAnchorRef.current = null;\n const element = containerRef.current;\n if (element && viewportAnchorLogical !== undefined) {\n // 측정 앵커 이후의 새 스크롤은 이벤트 전달 전이라도 이전 높이 보정보다 우선한다.\n // 콘텐츠 축소로 발생한 브라우저의 하단 clamp는 정상 앵커 보정을 유지한다.\n const currentPhysical = element.scrollTop;\n const previousPhysical = Math.min(\n Math.max(0, element.scrollHeight - element.clientHeight),\n Math.max(0, viewportAnchor!.previousPhysicalScrollTop),\n );\n if (Math.abs(currentPhysical - previousPhysical) > 0.5) {\n const latestTransaction = logicalAnchorTransactionRef.current;\n const nextTransaction = latestTransaction &&\n Math.abs(latestTransaction.actualPhysical - currentPhysical) <= 0.5\n ? latestTransaction\n : null;\n logicalAnchorTransactionRef.current = nextTransaction;\n setLogicalAnchorTransaction(nextTransaction);\n pendingScrollTopRef.current = currentPhysical;\n setScrollTop(currentPhysical);\n return;\n }\n const targetLogical = Math.min(Math.max(0, viewportAnchorLogical), Math.max(0, viewportHeightIndex.getTotalHeight() - viewportHeight));\n const requestedPhysical = getCominsPhysicalScrollTop(targetLogical, viewportHeightIndex.getTotalHeight(), viewportHeight);\n setCominsScrollTop(element, requestedPhysical);\n const transaction = { actualPhysical: element.scrollTop, requestedPhysical, targetLogical, revision: ++anchorRevisionRef.current };\n logicalAnchorTransactionRef.current = transaction;\n setLogicalAnchorTransaction(transaction);\n pendingScrollTopRef.current = element.scrollTop;\n setScrollTop(element.scrollTop);\n }\n }, [viewportHeightIndex, viewportAnchorLogical, viewportAnchor?.previousPhysicalScrollTop, viewportHeight, detailLayoutVersion]);\n const detailObserverSnapshotCandidate = useMemo<\n CominsCommittedDetailObserverSnapshot<TData>\n >(\n () => ({\n rowLayoutKey,\n rowContentRevision,\n rowSlots: new Map(getRowHeight ? fullProjectionSlots.flatMap(slot => slot.kind === \"data\" && slot.autoHeight ? [[slot.rowId, slot] as const] : []) : []),\n contentWidth: detailContentWidth,\n projection: mixedProjection,\n viewportRetainRange: viewportContext?.data.retainRange ?? null,\n viewportHeight:\n containerHeight || Math.max(1, rowHeight) * 12,\n }),\n [containerHeight, detailContentWidth, mixedProjection, rowHeight, rowLayoutKey, rowContentRevision, fullProjectionSlots, getRowHeight, viewportContext?.data.retainRange],\n );\n\n useLayoutEffect(() => {\n committedDetailObserverSnapshotRef.current =\n detailObserverSnapshotCandidate;\n\n if (detailElementsRef.current.size === 0) {\n disconnectDetailObserverIfIdle();\n return;\n }\n\n if (hasCominsResizeObserver()) {\n const currentObserver = detailObserverRef.current;\n const observer = currentObserver ?? createDetailObserver();\n\n if (currentObserver) {\n for (const observed of detailElementsRef.current.values()) {\n observer?.observe(observed.element);\n }\n }\n return;\n }\n\n const updates: Array<{\n height: number;\n rowId: CominsRowId;\n width: number;\n kind?: \"row\";\n }> = [];\n\n for (const observed of detailElementsRef.current.values()) {\n if (fallbackMeasuredDetailElementsRef.current.has(observed.element)) {\n continue;\n }\n\n fallbackMeasuredDetailElementsRef.current.add(observed.element);\n const rect = measureCominsElement(observed.element);\n\n if (Number.isFinite(rect.height) && rect.height > 0) {\n updates.push({\n height: rect.height,\n rowId: observed.rowId,\n width: Math.round(rect.width),\n kind: observed.kind,\n });\n }\n }\n\n applyDetailMeasurementUpdates(updates);\n });\n const rowWindow = useMemo<CominsVirtualWindow<TData>>(() => {\n if (viewportHeightIndex) {\n const transaction = logicalAnchorTransaction && Math.abs(scrollTop - logicalAnchorTransaction.actualPhysical) <= .5 ? logicalAnchorTransaction : null;\n const logical = viewportAnchorLogical ?? transaction?.targetLogical;\n const range = getCominsMixedVirtualRange({ heightIndex: viewportHeightIndex, overscan: virtualBufferSize, physicalScrollTop: logical === undefined ? scrollTop : getCominsPhysicalScrollTop(logical, viewportHeightIndex.getTotalHeight(), viewportHeight), viewportHeight });\n const slots: CominsVirtualSlot<TData>[] = projectCoreViewportWindow(fullProjectionSlots.filter((slot): slot is CominsDataVirtualSlot<TData> => slot.kind === \"data\"), range, viewportHeightIndex.rowCount)\n .map(slot => slot.kind === \"placeholder\" ? { ...slot, height: viewportHeightIndex.getHeight(slot.absoluteIndex) } : slot);\n return { mixed: true, renderOffset: logical === undefined ? range.renderOffset : scrollTop - (logical - range.logicalStartOffset), scrollHeight: range.physicalScrollHeight, slots };\n }\n if (virtualized) {\n const safeRowHeight = Math.max(1, rowHeight);\n const viewportHeight = containerHeight || rowHeight * 12;\n\n if (mixedProjection) {\n const activeAnchorTransaction =\n logicalAnchorTransaction &&\n Math.abs(\n scrollTop - logicalAnchorTransaction.actualPhysical,\n ) <= 0.5\n ? logicalAnchorTransaction\n : null;\n const range = getCominsMixedVirtualRange({\n heightIndex: mixedProjection.heightIndex,\n overscan: virtualBufferSize,\n physicalScrollTop:\n activeAnchorTransaction?.requestedPhysical ?? scrollTop,\n viewportHeight,\n });\n\n return {\n mixed: true,\n renderOffset: activeAnchorTransaction\n ? activeAnchorTransaction.actualPhysical -\n (activeAnchorTransaction.targetLogical -\n range.logicalStartOffset)\n : range.renderOffset,\n scrollHeight: range.physicalScrollHeight,\n slots: mixedProjection.slots.slice(range.startIndex, range.endIndex),\n };\n }\n\n const totalHeight = visibleSlotCount * safeRowHeight;\n const maxPhysicalTotalHeight = 1_500_000;\n const physicalTotalHeight = Math.min(totalHeight, maxPhysicalTotalHeight);\n const logicalScrollableHeight = Math.max(0, totalHeight - viewportHeight);\n const physicalScrollableHeight = Math.max(0, physicalTotalHeight - viewportHeight);\n const scrollScale =\n logicalScrollableHeight > 0 && physicalScrollableHeight > 0\n ? logicalScrollableHeight / physicalScrollableHeight\n : 1;\n const logicalScrollTop = Math.min(logicalScrollableHeight, Math.max(0, scrollTop) * scrollScale);\n const startIndex = Math.max(0, Math.floor(logicalScrollTop / safeRowHeight) - virtualBufferSize);\n const endIndex = Math.min(\n visibleSlotCount,\n Math.ceil((logicalScrollTop + Math.max(0, viewportHeight)) / safeRowHeight) + virtualBufferSize,\n );\n const logicalTopSpacerHeight = startIndex * safeRowHeight;\n // Rows retain their full pixel height even when the scrollbar is compressed.\n const renderOffset = scrollTop - (logicalScrollTop - logicalTopSpacerHeight);\n\n return {\n mixed: false,\n renderOffset,\n scrollHeight: physicalTotalHeight,\n slots: fullProjectionSlots.slice(startIndex, endIndex),\n };\n }\n\n return {\n mixed: false,\n renderOffset: 0,\n scrollHeight: 0,\n slots: groupingActive\n ? fullProjectionSlots\n : fullProjectionSlots.slice(pageStartIndex, pageStartIndex + pageSize),\n };\n }, [\n containerHeight,\n detailLayoutVersion,\n fullProjectionSlots,\n groupingActive,\n logicalAnchorTransaction,\n mixedProjection,\n pageStartIndex,\n rowHeight,\n scrollTop,\n pageSize,\n virtualBufferSize,\n virtualized,\n visibleSlotCount,\n viewportHeightIndex,\n viewportHeight,\n viewportAnchorLogical,\n ]);\n const viewportRenderedRange = { startIndex: rowWindow.slots[0]?.kind === \"placeholder\" ? rowWindow.slots[0].absoluteIndex : rowWindow.slots[0]?.kind === \"data\" ? rowWindow.slots[0].absoluteIndex ?? 0 : 0, endIndex: 0 };\n const lastViewportSlot = rowWindow.slots.at(-1);\n viewportRenderedRange.endIndex = lastViewportSlot && lastViewportSlot.kind !== \"group\" && lastViewportSlot.absoluteIndex !== undefined ? lastViewportSlot.absoluteIndex + 1 : 0;\n const retryViewport = useCominsViewportRequests({ data: viewportContext?.data, range: viewportRenderedRange, maxConcurrentRequests: viewportContext?.config.maxConcurrentRequests, onRequest: viewportContext?.onRequest, onChangeData: viewportContext?.onChangeData });\n const currentVirtualProjection = useMemo<CominsVirtualProjection | null>(\n () =>\n !virtualized || viewportContext\n ? null\n : mixedProjection\n ? {\n heightIndex: mixedProjection.heightIndex,\n keys: mixedProjection.keys,\n mixed: true,\n }\n : {\n keys: fullProjectionSlots.map((slot) => slot.key),\n mixed: false,\n rowHeight: Math.max(1, rowHeight),\n visibleRowCount: visibleSlotCount,\n },\n [\n mixedProjection,\n fullProjectionSlots,\n rowHeight,\n virtualized,\n visibleSlotCount,\n ],\n );\n const previousVirtualProjection = previousVirtualProjectionRef.current;\n const pendingDetailAnchor = pendingDetailAnchorRef.current;\n const pendingVirtualAnchor =\n !pendingDetailAnchor &&\n currentVirtualProjection &&\n previousVirtualProjection &&\n currentVirtualProjection !== previousVirtualProjection &&\n containerRef.current\n ? captureCominsVirtualAnchor({\n logicalScrollTop:\n logicalAnchorTransaction &&\n Math.abs(\n containerRef.current.scrollTop -\n logicalAnchorTransaction.actualPhysical,\n ) <= 0.5\n ? logicalAnchorTransaction.targetLogical\n : undefined,\n physicalScrollTop: containerRef.current.scrollTop,\n projection: previousVirtualProjection,\n viewportHeight:\n containerRef.current.clientHeight || containerHeight || rowHeight * 12,\n })\n : undefined;\n const pendingAnchorTransaction =\n pendingDetailAnchor?.status === \"pending\"\n ? pendingDetailAnchor\n : pendingVirtualAnchor;\n useLayoutEffect(() => {\n if (viewportContext) return;\n if (!currentVirtualProjection) {\n previousVirtualProjectionRef.current = null;\n pendingDetailAnchorRef.current = null;\n logicalAnchorTransactionRef.current = null;\n setLogicalAnchorTransaction(null);\n return;\n }\n\n previousVirtualProjectionRef.current = currentVirtualProjection;\n\n if (pendingDetailAnchor?.status === \"cancelled\") {\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n\n if (\n currentPendingDetailAnchor?.revision ===\n pendingDetailAnchor.revision &&\n currentPendingDetailAnchor.status === \"cancelled\"\n ) {\n pendingDetailAnchorRef.current = null;\n }\n return;\n }\n\n const viewport = containerRef.current;\n\n // A local reorder should keep the drop position on screen, not follow a moved anchor Row.\n const treeMoveScrollTop = treeContext?.drag.pendingScrollTop.current ?? null;\n const rowMoveScrollTop = pendingRowMoveScrollTopRef.current ?? treeMoveScrollTop;\n if (viewport && rowMoveScrollTop !== null) {\n // Tree controlled data reaches the inner Table on the following state reconciliation.\n if (treeMoveScrollTop !== null && state.rows !== effectiveData) return;\n setCominsScrollTop(viewport, rowMoveScrollTop);\n pendingRowMoveScrollTopRef.current = null;\n if (treeContext) treeContext.drag.pendingScrollTop.current = null;\n pendingDetailAnchorRef.current = null;\n logicalAnchorTransactionRef.current = null;\n setLogicalAnchorTransaction(null);\n setScrollTop(viewport.scrollTop);\n return;\n }\n\n if (!viewport || !pendingAnchorTransaction) {\n return;\n }\n\n // 측정 이후 새 스크롤이 들어오면 scroll 이벤트 전달 전이라도 이전 앵커를 폐기한다.\n // 콘텐츠 축소로 브라우저가 범위 안으로 clamp한 위치는 새 스크롤로 취급하지 않는다.\n const currentPhysicalScrollTop = viewport.scrollTop;\n const clampedPreviousPhysicalScrollTop = Math.min(\n Math.max(0, viewport.scrollHeight - viewport.clientHeight),\n Math.max(0, pendingAnchorTransaction.previousPhysicalScrollTop),\n );\n if (Math.abs(currentPhysicalScrollTop - clampedPreviousPhysicalScrollTop) > 0.5) {\n if (pendingDetailAnchorRef.current?.revision === pendingDetailAnchor?.revision) {\n pendingDetailAnchorRef.current = null;\n }\n const latestLogicalTransaction = logicalAnchorTransactionRef.current;\n const nextLogicalTransaction = latestLogicalTransaction &&\n Math.abs(latestLogicalTransaction.actualPhysical - currentPhysicalScrollTop) <= 0.5\n ? latestLogicalTransaction\n : null;\n logicalAnchorTransactionRef.current = nextLogicalTransaction;\n pendingScrollTopRef.current = currentPhysicalScrollTop;\n setLogicalAnchorTransaction(nextLogicalTransaction);\n setScrollTop(currentPhysicalScrollTop);\n return;\n }\n\n const nextKeys = getCominsVirtualProjectionKeys(currentVirtualProjection);\n const target = resolveCominsAnchorTarget({\n anchor: pendingAnchorTransaction.anchor,\n getNextHeight: (index) =>\n currentVirtualProjection.mixed\n ? currentVirtualProjection.heightIndex.getHeight(index)\n : currentVirtualProjection.rowHeight,\n nextKeys,\n previousKeys: pendingAnchorTransaction.previousKeys,\n });\n const anchorLogicalScrollTop = target\n ? (currentVirtualProjection.mixed\n ? currentVirtualProjection.heightIndex.getPrefixHeight(target.index)\n : target.index * currentVirtualProjection.rowHeight) +\n target.offsetWithinSlot\n : 0;\n const nextLogicalTotalHeight = currentVirtualProjection.mixed\n ? currentVirtualProjection.heightIndex.getTotalHeight()\n : currentVirtualProjection.visibleRowCount * currentVirtualProjection.rowHeight;\n const nextViewportHeight = viewport.clientHeight || pendingAnchorTransaction.previousViewportHeight;\n const nextLogicalScrollTop = Math.min(\n Math.max(0, anchorLogicalScrollTop),\n Math.max(0, nextLogicalTotalHeight - nextViewportHeight),\n );\n const nextPhysicalScrollTop = getCominsPhysicalScrollTop(\n nextLogicalScrollTop,\n nextLogicalTotalHeight,\n nextViewportHeight,\n );\n\n if (pendingDetailAnchor) {\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n\n if (\n currentPendingDetailAnchor?.revision !==\n pendingDetailAnchor.revision ||\n currentPendingDetailAnchor.status !== \"pending\"\n ) {\n return;\n }\n }\n\n if (scrollFrameRef.current !== null) {\n window.cancelAnimationFrame(scrollFrameRef.current);\n scrollFrameRef.current = null;\n }\n\n setCominsScrollTop(viewport, nextPhysicalScrollTop);\n\n if (pendingDetailAnchor) {\n const currentPendingDetailAnchor = pendingDetailAnchorRef.current;\n\n if (\n currentPendingDetailAnchor?.revision !==\n pendingDetailAnchor.revision ||\n currentPendingDetailAnchor.status !== \"pending\"\n ) {\n return;\n }\n }\n\n const actualPhysicalScrollTop = viewport.scrollTop;\n const revision =\n pendingDetailAnchor?.revision ??\n anchorRevisionRef.current + 1;\n const nextAnchorTransaction = currentVirtualProjection.mixed\n ? {\n actualPhysical: actualPhysicalScrollTop,\n requestedPhysical: nextPhysicalScrollTop,\n revision,\n targetLogical: nextLogicalScrollTop,\n }\n : null;\n\n anchorRevisionRef.current = Math.max(\n anchorRevisionRef.current,\n revision,\n );\n if (pendingDetailAnchor) {\n pendingDetailAnchorRef.current = null;\n }\n logicalAnchorTransactionRef.current = nextAnchorTransaction;\n pendingScrollTopRef.current = actualPhysicalScrollTop;\n setLogicalAnchorTransaction(nextAnchorTransaction);\n setScrollTop(actualPhysicalScrollTop);\n }, [currentVirtualProjection, pendingAnchorTransaction]);\n useLayoutEffect(() => {\n // Wait for both controlled data and the anchor-adjusted virtual window.\n // Fixed-height virtual slots reuse DOM nodes, so either pending update\n // can otherwise change the identity of an already focused handle.\n if (state.rows === effectiveData && (!virtualized || containerRef.current?.scrollTop === scrollTop)) {\n treeContext?.drag.restoreFocus();\n }\n });\n const currentTheme = theme ?? state.theme;\n const densityClass =\n currentTheme.density === \"compact\"\n ? \"text-[11px]\"\n : currentTheme.density === \"spacious\"\n ? \"text-[13px]\"\n : \"text-[length:var(--comins-font-size-base,12px)]\";\n const selectedRowIdSet = useMemo(() => new Set(state.selection.rowIds), [state.selection.rowIds]);\n const hasHorizontalOverflow =\n typeof columnWidthTotal === \"number\" && containerWidth > 0 ? columnWidthTotal > containerWidth + 1 : false;\n useLayoutEffect(() => {\n const nextContentWidth = containerRef.current?.scrollWidth ?? 0;\n const nextViewportOuterWidth = containerRef.current?.offsetWidth ?? 0;\n const nextViewportWidth = containerRef.current?.clientWidth ?? 0;\n\n setHorizontalScrollContentWidth((current) =>\n Math.abs(current - nextContentWidth) > 0.5 ? nextContentWidth : current);\n setHorizontalViewportOuterWidth((current) =>\n Math.abs(current - nextViewportOuterWidth) > 0.5 ? nextViewportOuterWidth : current);\n setHorizontalViewportWidth((current) =>\n Math.abs(current - nextViewportWidth) > 0.5 ? nextViewportWidth : current);\n }, [containerWidth, hasHorizontalOverflow, tableWidth]);\n const synchronizedHorizontalViewportWidth =\n horizontalViewportWidth > 0\n ? horizontalViewportWidth\n : containerWidth > 0\n ? containerWidth\n : undefined;\n const synchronizedHorizontalScrollbarWidth =\n horizontalViewportOuterWidth > 0\n ? horizontalViewportOuterWidth\n : synchronizedHorizontalViewportWidth;\n const synchronizedHorizontalContentWidth = horizontalScrollContentWidth > 0\n ? Math.max(typeof tableWidth === \"number\" ? tableWidth : 0, horizontalScrollContentWidth)\n : tableWidth;\n const resolvedHasMoreRows = groupingRequested || filteringRequested ? false : hasMoreRows;\n const resolvedLoading = loading;\n const resolvedLoadingMore = groupingRequested || filteringRequested ? false : loadingMore;\n const isEmpty = visibleSlotCount === 0;\n const shouldRenderSkeleton = resolvedLoading && isEmpty;\n const shouldRenderEmpty = !resolvedLoading && isEmpty;\n const shouldRenderInfiniteLoadingRow =\n !groupingRequested &&\n !filteringRequested &&\n (infiniteScroll || lazyLoad) &&\n resolvedLoadingMore &&\n resolvedHasMoreRows &&\n !isEmpty;\n const resolvedSkeletonRowCount = Math.max(\n 1,\n Math.floor(skeletonRowCount ?? Math.min(Math.max(1, state.pagination.pageSize), 5)),\n );\n const stateRowCount =\n (shouldRenderSkeleton ? resolvedSkeletonRowCount : shouldRenderEmpty ? 1 : 0) +\n (shouldRenderInfiniteLoadingRow ? 1 : 0);\n const renderedRowsHeight =\n rowWindow.slots.reduce(\n (height, slot) => height + getCominsSlotHeight(slot, rowHeight),\n 0,\n ) + stateRowCount * rowHeight;\n const emptyFillerHeight = virtualized ? 0 : Math.max(0, containerHeight - renderedRowsHeight);\n const renderedHeaderVisible = state.showHeader && (persistHeaderWhenEmpty || !isEmpty || resolvedLoading);\n useLayoutEffect(() => {\n const scrollLeft = containerRef.current?.scrollLeft ?? 0;\n\n // 새 Header·Summary만 현재 body 위치에 맞추고 활성 스크롤 영역은 건드리지 않는다.\n for (const element of [headerRef.current, footerRef.current]) {\n if (element && Math.abs(element.scrollLeft - scrollLeft) > 0.5) {\n setCominsScrollLeft(element, scrollLeft);\n }\n }\n }, [renderedHeaderVisible, summary, synchronizedHorizontalContentWidth, synchronizedHorizontalViewportWidth]);\n\n\n const isCopyPasteKey = (event: React.KeyboardEvent, key: \"c\" | \"v\") =>\n (event.ctrlKey || event.metaKey) && event.key.toLowerCase() === key;\n const getVisibleEntryByRenderedIndex = (index: number) => {\n const slot = rowWindow.slots[index];\n\n return slot?.kind === \"data\" ? slot : undefined;\n };\n const getVisibleRowIdsBetween = (\n current: CominsTableState<TData>,\n anchorRowId: CominsRowId,\n focusRowId: CominsRowId,\n ) => {\n if (groupingProjection) {\n const anchorIndex = groupingProjection.visibleLeafRowIds.indexOf(anchorRowId);\n const focusIndex = groupingProjection.visibleLeafRowIds.indexOf(focusRowId);\n\n if (anchorIndex < 0 || focusIndex < 0) {\n return [focusRowId];\n }\n\n const start = Math.min(anchorIndex, focusIndex);\n const end = Math.max(anchorIndex, focusIndex);\n\n return groupingProjection.visibleLeafRowIds.slice(start, end + 1);\n }\n\n const visibleRowIndexes = treeContext ? current.rows.map((_row, index) => index) : getCominsSortedRowIndexes(current);\n const visibleEntries = visibleRowIndexes.flatMap<VisibleRowEntry<TData>>((dataIndex, visibleIndex) => {\n const row = current.rows[dataIndex];\n const rowId = current.rowIds[dataIndex];\n\n return row === undefined || rowId === undefined ? [] : [{ dataIndex, row, rowId, visibleIndex }];\n });\n const anchorIndex = visibleEntries.findIndex((entry) => entry.rowId === anchorRowId);\n const focusIndex = visibleEntries.findIndex((entry) => entry.rowId === focusRowId);\n\n if (anchorIndex < 0 || focusIndex < 0) {\n return [focusRowId];\n }\n\n const start = Math.min(anchorIndex, focusIndex);\n const end = Math.max(anchorIndex, focusIndex);\n\n return visibleEntries.slice(start, end + 1).map((entry) => entry.rowId);\n };\n const selectRowRangeByIds = (anchorRowId: CominsRowId, focusRowId: CominsRowId) => {\n commitState((current) => selectRows(current, getVisibleRowIdsBetween(current, anchorRowId, focusRowId)));\n };\n const selectRowsByVisibleIndexes = (indexes: readonly number[]) => {\n commitState((current) => {\n const rowIds = indexes.flatMap((index) => {\n if (viewportContext) {\n const rowId = current.rowIds[viewportContext.indices.indexOf(index)];\n return rowId === undefined ? [] : [rowId];\n }\n if (groupingProjection) {\n const rowId = groupingProjection.visibleLeafRowIds[index];\n\n return rowId === undefined ? [] : [rowId];\n }\n\n const entry = getVisibleEntryByRenderedIndex(index);\n\n return entry ? [entry.rowId] : [];\n });\n\n return selectRows(current, rowIds);\n });\n };\n const clearSuppressedSortClick = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n suppressed.cleanup();\n\n if (suppressed.timer !== null) {\n window.clearTimeout(suppressed.timer);\n }\n\n suppressedSortClickRef.current = null;\n };\n const suppressNextSortClick = (columnId: string) => {\n if (suppressedSortClickRef.current?.columnId === columnId) {\n return;\n }\n\n clearSuppressedSortClick();\n suppressedSortClickRef.current = { cleanup: () => undefined, columnId, timer: null };\n };\n const scheduleSuppressedSortClickClear = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n suppressed.cleanup();\n suppressed.cleanup = () => undefined;\n suppressed.timer = window.setTimeout(() => {\n if (suppressedSortClickRef.current === suppressed) {\n suppressedSortClickRef.current = null;\n }\n }, 0);\n };\n const keepSuppressedSortClickUntilPointerEnd = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n const handlePointerUp = () => scheduleSuppressedSortClickClear();\n const handlePointerCancel = () => clearSuppressedSortClick();\n const handleWindowBlur = () => clearSuppressedSortClick();\n\n suppressed.cleanup();\n suppressed.cleanup = () => {\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handleWindowBlur);\n };\n window.addEventListener(\"pointerup\", handlePointerUp, { once: true });\n window.addEventListener(\"pointercancel\", handlePointerCancel, { once: true });\n window.addEventListener(\"blur\", handleWindowBlur, { once: true });\n };\n const consumeSuppressedSortClick = (columnId: string) => {\n if (suppressedSortClickRef.current?.columnId !== columnId) {\n return false;\n }\n\n clearSuppressedSortClick();\n\n return true;\n };\n const activateHeaderSort = (column: CominsTableRuntimeColumn<TData>, additive: boolean) => {\n if (!column.sort) {\n return;\n }\n\n commitState((current) => {\n const nextModel = getNextSortModel(current.sortModel, column.id, multiSort && additive);\n const focused = document.activeElement;\n const header = focused instanceof HTMLElement && focused.classList.contains(\"comins-sort-indicator\")\n ? focused.closest<HTMLElement>(\"[data-comins-column-id]\") : null;\n if (header?.dataset.cominsColumnId === column.id && tableRootRef.current?.contains(header) && !nextModel.some(rule => rule.columnId === column.id)) {\n focusCominsElement(header, { preventScroll: true });\n }\n return setCominsSortModel(current, nextModel);\n });\n };\n\n const getColumnMoveTarget = (clientX: number, clientY: number): CominsColumnMoveHeader | null => {\n const targetHeader = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-column-id], [data-comins-column-group-id]\");\n\n if (!targetHeader) {\n return null;\n }\n\n const depth = Number(targetHeader.dataset.cominsColumnDepth);\n\n if (depth !== 0 && depth !== 1) {\n return null;\n }\n\n if (targetHeader.dataset.cominsColumnId) {\n return {\n depth,\n id: targetHeader.dataset.cominsColumnId,\n kind: \"column\",\n parentGroupId: targetHeader.dataset.cominsColumnParentGroupId,\n };\n }\n\n const groupId = targetHeader.dataset.cominsColumnGroupId;\n\n return groupId ? { depth, id: groupId, kind: \"group\" } : null;\n };\n const getColumnMoveTargetIndex = (target: CominsColumnMoveHeader) => {\n const targetColumnId =\n target.kind === \"column\"\n ? target.id\n : stateRef.current.columnGroups\n .find((group) => group.id === target.id)\n ?.children.find((childId) => visibleColumns.some((column) => column.id === childId));\n\n return targetColumnId\n ? stateRef.current.columnOrder.indexOf(targetColumnId)\n : -1;\n };\n const getColumnMoveHeaderPinned = (header: CominsColumnMoveHeader) => {\n if (header.kind === \"group\") {\n return stateRef.current.columnGroupState[header.id]?.pinned;\n }\n\n return header.parentGroupId\n ? stateRef.current.columnGroupState[header.parentGroupId]?.pinned\n : stateRef.current.columnState[header.id]?.pinned;\n };\n\n useImperativeHandle(\n ref,\n () => ({\n copySelection: async (target = \"auto\") => {\n const result = prepareSelectionCopy(target);\n if (!result) return null;\n await writeCominsClipboardText(result.text);\n return result.text;\n },\n fillSelection: (direction) => cellFill.fillSelection(direction),\n getSelectedRows: () => selectedRowData(stateRef.current),\n getSelectedCells: () => selectedCellValues(stateRef.current, getSelectionRowOrder()),\n getSelection: () => {\n const selection = stateRef.current.selection;\n return { ...selection, rowIds: [...selection.rowIds], cell: selection.cell ? { ...selection.cell } : null,\n cells: selection.cells?.map(cell => ({ ...cell })),\n range: selection.range ? { anchor: { ...selection.range.anchor }, focus: { ...selection.range.focus } } : null };\n },\n clearSort: () => commitState((current) => clearCominsSortState(current)),\n expand: (nodeIds) => treeContext?.onExpand(nodeIds),\n expandGroups: (groupIds) => {\n const onChangeExpandedGroupIds = rowGrouping?.onChangeExpandedGroupIds;\n\n if (!orderedGroupModel || typeof onChangeExpandedGroupIds !== \"function\") {\n return;\n }\n\n const requestedIds = groupIds === undefined\n ? orderedGroupModel.groupIds\n : groupIds.filter((groupId) => orderedGroupModel.groupsById.has(groupId));\n\n if (requestedIds.length === 0) {\n return;\n }\n\n const nextGroupIds = [...normalizedExpandedGroupIds];\n const nextGroupIdSet = new Set(nextGroupIds);\n\n for (const groupId of requestedIds) {\n if (!nextGroupIdSet.has(groupId)) {\n nextGroupIdSet.add(groupId);\n nextGroupIds.push(groupId);\n }\n }\n\n if (nextGroupIds.length !== normalizedExpandedGroupIds.length) {\n onChangeExpandedGroupIds(nextGroupIds);\n }\n },\n fold: (nodeIds) => treeContext?.onFold(nodeIds),\n foldGroups: (groupIds) => {\n const onChangeExpandedGroupIds = rowGrouping?.onChangeExpandedGroupIds;\n\n if (!orderedGroupModel || typeof onChangeExpandedGroupIds !== \"function\") {\n return;\n }\n\n if (groupIds === undefined) {\n if (normalizedExpandedGroupIds.length > 0) {\n onChangeExpandedGroupIds([]);\n }\n return;\n }\n\n if (groupIds.length === 0) {\n return;\n }\n\n const groupIdSet = new Set(\n groupIds.filter((groupId) => orderedGroupModel.groupsById.has(groupId)),\n );\n const nextGroupIds = normalizedExpandedGroupIds.filter(\n (groupId) => !groupIdSet.has(groupId),\n );\n\n if (nextGroupIds.length !== normalizedExpandedGroupIds.length) {\n onChangeExpandedGroupIds(nextGroupIds);\n }\n },\n getColumnLayout: () => serializeCominsColumnLayout(state),\n getSortModel: () => state.sortModel,\n getSortState: () => state.sort,\n setColumnLayout: (layout) =>\n commitState((current) => applyCominsColumnLayout(current, layout), { columnLayoutChanged: true }),\n setMoveTargetRow: (targetIdx, sourceIdx) =>\n commitState((current) => {\n if (treeContext || viewportContext || groupingRequested || filteringRequested) {\n return current;\n }\n\n const visibleRowIds = getCominsSortedRowIndexes(current).flatMap((dataIndex) => {\n const rowId = current.rowIds[dataIndex];\n\n return rowId === undefined ? [] : [rowId];\n });\n const sourceRowId = visibleRowIds[sourceIdx];\n\n if (sourceRowId === undefined || targetIdx < 0 || sourceIdx < 0) {\n return current;\n }\n\n const nextVisibleRowIds = visibleRowIds.filter((rowId) => rowId !== sourceRowId);\n const targetPosition = Math.min(nextVisibleRowIds.length, targetIdx);\n nextVisibleRowIds.splice(targetPosition, 0, sourceRowId);\n\n const rowById = new Map(current.rowIds.map((rowId, index) => [rowId, current.rows[index]] as const));\n const nextRows = nextVisibleRowIds.flatMap((rowId) => {\n const row = rowById.get(rowId);\n\n return row === undefined ? [] : [row];\n });\n\n if (nextRows.length !== current.rows.length) {\n return current;\n }\n\n return {\n ...current,\n rowIds: nextVisibleRowIds,\n rows: nextRows,\n sort: null,\n sortModel: [],\n };\n }),\n setSelectedRow: (index) => selectRowsByVisibleIndexes([index]),\n setSelectedRows: (indexes) => selectRowsByVisibleIndexes(indexes),\n setSortModel: (sortModel) => commitState((current) => setCominsSortModel(current, sortModel)),\n setSortState: (sort) => commitState((current) => setCominsSortState(current, sort)),\n }),\n [\n fillHandle,\n cellSelection,\n onChangeData,\n onClipboardError,\n groupingProjection,\n groupingRequested,\n filteringRequested,\n normalizedExpandedGroupIds,\n orderedGroupModel,\n rowGrouping,\n rowWindow.slots,\n projectedDataIndexes,\n viewportContext,\n state,\n treeContext,\n ],\n );\n\n const clearColumnPointerInteraction = () => {\n const interaction = columnPointerInteractionRef.current;\n\n if (interaction) {\n interaction.cleanup();\n\n if (interaction.timer !== null) {\n window.clearTimeout(interaction.timer);\n }\n }\n\n columnPointerInteractionRef.current = null;\n setMovingColumnId(null);\n setMovingGroupId(null);\n setColumnMovePointer(null);\n setColumnMoveTarget(null);\n };\n\n useLayoutEffect(createColumnInteractionCleanupEffect({\n columnPointerInteractionRef,\n suppressedSortClickRef,\n columnMoveAnimationCleanupRef,\n resetPendingRef: columnInteractionResetPendingRef,\n setMovingColumnId,\n setMovingGroupId,\n setColumnMovePointer,\n setColumnMoveTarget,\n }), []);\n\n const captureColumnMoveAnimationSnapshot = () => {\n columnMoveAnimationCleanupRef.current?.();\n columnMoveAnimationCleanupRef.current = null;\n columnMoveAnimationSnapshotRef.current = null;\n\n if (typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n return;\n }\n\n const elements = [headerRef.current, containerRef.current, footerRef.current].flatMap((root) =>\n root\n ? Array.from(\n root.querySelectorAll<HTMLElement>(\n \"[data-comins-column-id], [data-comins-cell-column-id], [data-comins-summary-column-id]\",\n ),\n )\n : [],\n );\n const snapshot = new Map<HTMLElement, number>();\n\n for (const element of elements) {\n snapshot.set(element, getCominsElementRect(element).left);\n }\n\n columnMoveAnimationSnapshotRef.current = snapshot;\n };\n\n useLayoutEffect(() => {\n const snapshot = columnMoveAnimationSnapshotRef.current;\n columnMoveAnimationSnapshotRef.current = null;\n\n if (!snapshot) {\n return undefined;\n }\n\n const animatedElements: HTMLElement[] = [];\n\n for (const [element, previousLeft] of snapshot) {\n if (!element.isConnected) {\n continue;\n }\n\n const offset = previousLeft - getCominsElementRect(element).left;\n\n if (Math.abs(offset) < 0.5) {\n continue;\n }\n\n element.dataset.columnMoveAnimating = \"prepare\";\n element.style.setProperty(\"--comins-column-move-offset\", `${offset}px`);\n animatedElements.push(element);\n }\n\n if (animatedElements.length === 0) {\n return undefined;\n }\n\n void getCominsElementRect(animatedElements[0]);\n let frame = 0;\n let timeout = 0;\n const cleanup = () => {\n window.cancelAnimationFrame(frame);\n window.clearTimeout(timeout);\n\n for (const element of animatedElements) {\n delete element.dataset.columnMoveAnimating;\n element.style.removeProperty(\"--comins-column-move-offset\");\n }\n\n if (columnMoveAnimationCleanupRef.current === cleanup) {\n columnMoveAnimationCleanupRef.current = null;\n }\n };\n\n columnMoveAnimationCleanupRef.current = cleanup;\n frame = window.requestAnimationFrame(() => {\n for (const element of animatedElements) {\n element.dataset.columnMoveAnimating = \"true\";\n element.style.setProperty(\"--comins-column-move-offset\", \"0px\");\n }\n });\n timeout = window.setTimeout(cleanup, 220);\n\n return cleanup;\n }, [state.columnOrder]);\n\n const beginColumnPointerInteraction = (options: CominsColumnPointerOptions) => {\n if (options.event.button !== 0) {\n return;\n }\n\n const pointerType: string = options.event.pointerType;\n const isMousePointer = pointerType === \"mouse\" || pointerType === \"\";\n const suppressPendingSort = () => {\n if (options.sortColumnId) {\n suppressNextSortClick(options.sortColumnId);\n }\n };\n const activateCurrent = (x: number, y: number) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current !== interaction || current.active || current.blocked) {\n return;\n }\n\n current.active = true;\n current.cancelSort = true;\n suppressPendingSort();\n options.activate(x, y);\n setColumnMoveTarget({ ...options.source, status: \"neutral\" });\n };\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current !== interaction) {\n return;\n }\n\n if (!current.active && !current.blocked && isMousePointer) {\n const intent = getCominsColumnMouseIntent({\n clientX: moveEvent.clientX,\n clientY: moveEvent.clientY,\n startX: current.startX,\n startY: current.startY,\n });\n\n if (intent === \"activate\") {\n activateCurrent(moveEvent.clientX, moveEvent.clientY);\n } else if (intent === \"cancel\") {\n current.blocked = true;\n current.cancelSort = true;\n suppressPendingSort();\n }\n }\n\n if (!current.active && !current.blocked && !isMousePointer) {\n const distance = Math.hypot(moveEvent.clientX - current.startX, moveEvent.clientY - current.startY);\n\n if (distance > 4) {\n current.blocked = true;\n current.cancelSort = true;\n window.clearTimeout(current.timer ?? undefined);\n suppressPendingSort();\n }\n }\n\n if (current.active) {\n moveEvent.preventDefault();\n setColumnMovePointer({ x: moveEvent.clientX, y: moveEvent.clientY });\n const target = getColumnMoveTarget(moveEvent.clientX, moveEvent.clientY);\n setColumnMoveTarget(target ? { ...target, status: options.resolveTarget(target) } : null);\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (current === interaction && current.active) {\n const target = getColumnMoveTarget(upEvent.clientX, upEvent.clientY);\n\n if (target && options.resolveTarget(target) === \"valid\") {\n options.commitTarget(target);\n }\n }\n\n if (current === interaction && current.cancelSort) {\n scheduleSuppressedSortClickClear();\n }\n\n clearColumnPointerInteraction();\n };\n const handlePointerCancel = () => {\n clearSuppressedSortClick();\n clearColumnPointerInteraction();\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n keyEvent.preventDefault();\n\n if (columnPointerInteractionRef.current === interaction && interaction.cancelSort) {\n keepSuppressedSortClickUntilPointerEnd();\n }\n\n clearColumnPointerInteraction();\n }\n };\n const handleWindowBlur = () => {\n clearSuppressedSortClick();\n clearColumnPointerInteraction();\n };\n const interaction: CominsColumnPointerInteraction = {\n active: false,\n blocked: false,\n cancelSort: false,\n cleanup: () => {\n window.removeEventListener(\"pointermove\", handlePointerMove, true);\n window.removeEventListener(\"pointerup\", handlePointerUp, true);\n window.removeEventListener(\"pointercancel\", handlePointerCancel, true);\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"blur\", handleWindowBlur);\n },\n id: options.id,\n kind: options.kind,\n pointerType,\n startX: options.event.clientX,\n startY: options.event.clientY,\n timer: null,\n };\n\n clearColumnPointerInteraction();\n clearSuppressedSortClick();\n\n if (!isMousePointer) {\n interaction.timer = window.setTimeout(() => {\n const current = columnPointerInteractionRef.current;\n\n if (current === interaction && !current.active && !current.blocked) {\n activateCurrent(current.startX, current.startY);\n }\n }, 1000);\n }\n\n columnPointerInteractionRef.current = interaction;\n window.addEventListener(\"pointermove\", handlePointerMove, true);\n window.addEventListener(\"pointerup\", handlePointerUp, true);\n window.addEventListener(\"pointercancel\", handlePointerCancel, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"blur\", handleWindowBlur);\n\n if (options.activateImmediately) {\n activateCurrent(interaction.startX, interaction.startY);\n }\n };\n\n const beginHeaderPointerInteraction = (\n event: React.PointerEvent<HTMLElement>,\n cell: Extract<CominsHeaderCell<TData>, { kind: \"column\" }>,\n activateImmediately = false,\n ) => {\n const column = cell.column;\n\n if (\n column.lockPosition ||\n (!cell.groupId && stateRef.current.columnState[column.id]?.pinned !== undefined)\n ) {\n return;\n }\n\n const source: CominsColumnMoveHeader = {\n depth: cell.groupId ? 1 : 0,\n id: column.id,\n kind: \"column\",\n parentGroupId: cell.groupId,\n };\n beginColumnPointerInteraction({\n activateImmediately,\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setMovingGroupId(null);\n setMovingColumnId(column.id);\n },\n commitTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return;\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex >= 0) {\n const current = stateRef.current;\n const next = moveCominsColumn(current, column.id, targetIndex);\n\n if (\n next !== current &&\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index])\n ) {\n captureColumnMoveAnimationSnapshot();\n commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: column.id,\n kind: \"column\",\n resolveTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return \"invalid\";\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex < 0) {\n return \"invalid\";\n }\n\n const current = stateRef.current;\n const next = moveCominsColumn(current, column.id, targetIndex);\n\n return getCominsColumnDropStatus(\n source,\n target,\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index]),\n );\n },\n sortColumnId: column.id,\n source,\n });\n };\n\n const beginGroupPointerInteraction = (\n event: React.PointerEvent<HTMLElement>,\n group: CominsTableRuntimeColumnGroup,\n activateImmediately = false,\n ) => {\n if (group.lockPosition || stateRef.current.columnGroupState[group.id]?.pinned !== undefined) {\n return;\n }\n\n const source: CominsColumnMoveHeader = { depth: 0, id: group.id, kind: \"group\" };\n beginColumnPointerInteraction({\n activateImmediately,\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setMovingColumnId(null);\n setMovingGroupId(group.id);\n },\n commitTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return;\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex >= 0) {\n const current = stateRef.current;\n const next = moveCominsColumnGroup(current, group.id, targetIndex);\n\n if (\n next !== current &&\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index])\n ) {\n captureColumnMoveAnimationSnapshot();\n commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: group.id,\n kind: \"group\",\n resolveTarget: (target) => {\n if (getColumnMoveHeaderPinned(target) !== getColumnMoveHeaderPinned(source)) {\n return \"invalid\";\n }\n\n const targetIndex = getColumnMoveTargetIndex(target);\n\n if (targetIndex < 0) {\n return \"invalid\";\n }\n\n const current = stateRef.current;\n const next = moveCominsColumnGroup(current, group.id, targetIndex);\n\n return getCominsColumnDropStatus(\n source,\n target,\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index]),\n );\n },\n source,\n });\n };\n\n type CominsRowSelectionModifierEvent = Pick<\n React.KeyboardEvent | React.MouseEvent,\n \"ctrlKey\" | \"metaKey\" | \"shiftKey\"\n >;\n\n const selectRowFromInteraction = (\n event: CominsRowSelectionModifierEvent,\n entry: VisibleRowEntry<TData>,\n ) => {\n if (event.shiftKey && lastRowAnchorRef.current !== null) {\n selectRowRangeByIds(lastRowAnchorRef.current, entry.rowId);\n lastRowAnchorRef.current = entry.rowId;\n return;\n }\n\n commitState((current) =>\n selectRow(current, entry.rowId, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n }),\n );\n lastRowAnchorRef.current = entry.rowId;\n };\n\n const handleRowKeyDown = (\n event: React.KeyboardEvent<HTMLTableRowElement>,\n entry: VisibleRowEntry<TData>,\n disabled: boolean,\n ) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n\n onKeyDownRow?.(createRowPayload(event, entry));\n\n if (event.defaultPrevented || event.target !== event.currentTarget) {\n return;\n }\n\n if (clipboard && isCopyPasteKey(event, \"c\")) return;\n\n if (clipboardPaste && isCopyPasteKey(event, \"v\")) return;\n\n if ((treeContext || viewportContext) && (isCopyPasteKey(event, \"c\") || isCopyPasteKey(event, \"v\"))) {\n event.preventDefault();\n return;\n }\n\n if (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n copiedRowRef.current = copyCominsRow(state, entry.rowId);\n return;\n }\n\n if (isCopyPasteKey(event, \"v\") && copiedRowRef.current) {\n event.preventDefault();\n commitState((current) => pasteCominsRow(current, copiedRowRef.current!, { mode: \"insert-after\", targetRowId: entry.rowId }));\n }\n };\n const getClipboardState = (current: CominsTableState<TData>): CominsTableState<TData> => {\n const visibleIndexes = new Map(projectedDataIndexes.map((index, visibleIndex) => [current.rowIds[index], visibleIndex]));\n const applicationPayload = (payload: CominsCellComponentPayload<TData>) => {\n const index = viewportContext ? viewportIndexById?.get(payload.row.id) ?? -1 : payload.row.dataIndex;\n const visibleIndex = viewportContext ? index : visibleIndexes.get(payload.row.id) ?? payload.row.index;\n const disabled = resolveRowProp(effectiveRowProps?.disabled, payload.row.data, visibleIndex) === true;\n return { ...payload, row: { ...payload.row, disabled, dataIndex: index, index: viewportContext ? index : payload.row.index } };\n };\n const guard = (value: CominsClipboardGuard<TData> | undefined) => typeof value === \"function\"\n ? (payload: CominsCellComponentPayload<TData>) => value(applicationPayload(payload)) : value;\n return { ...current, columns: current.columns.map(column => ({\n ...column,\n cell: { ...column.cell,\n parseClipboard: column.cell?.parseClipboard ? payload => column.cell!.parseClipboard!({ ...applicationPayload(payload), text: payload.text }) : undefined,\n validateFill: column.cell?.validateFill ? payload => column.cell!.validateFill!(applicationPayload(payload)) : undefined,\n props: (payload: CominsCellComponentPayload<TData>) => {\n const params = applicationPayload(payload);\n const original = column.cell?.props;\n const resolved = typeof original === \"function\" ? original(params) : original;\n return { ...resolved, copyable: guard(resolved?.copyable), pasteable: guard(resolved?.pasteable), disabled: params.row.disabled || guard(resolved?.disabled) };\n },\n },\n })) };\n };\n const getSelectionRowOrder = () => selectionRowIds;\n const prepareSelectionCopy = (target: CominsCopyTarget = \"auto\") => {\n const current = stateRef.current;\n copiedRangeRef.current = null; copiedCellRef.current = null; copiedRowRef.current = null;\n if (target !== \"rows\" && viewportContext && current.selection.range && !isLoadedCellRange(current.selection.range.anchor.rowId, current.selection.range.focus.rowId)) return null;\n const result = copySelectionData(getClipboardState(current), target, getSelectionRowOrder());\n if (viewportContext && result?.target === \"cells\") {\n const ids = selectedCellValues(current, getSelectionRowOrder()).map(cell => cell.rowId);\n const indexes = ids.map(id => current.rowIds.indexOf(id));\n const first = indexes.reduce((min, index) => Math.min(min, index), Infinity);\n const last = indexes.reduce((max, index) => Math.max(max, index), -1);\n if (last >= 0 && !isLoadedCellRange(current.rowIds[first]!, current.rowIds[last]!)) return null;\n }\n copiedRangeRef.current = result?.data ?? null;\n copiedCellRef.current = null;\n copiedRowRef.current = null;\n return result;\n };\n const handleCellKeyDown = (\n event: React.KeyboardEvent<HTMLTableCellElement>,\n entry: VisibleRowEntry<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n onKeyDownCell?.(createCellPayload(event, entry, column, columnIndex, getCominsCellValue(state, entry.row, column.id)));\n\n if (event.defaultPrevented) {\n return;\n }\n\n if (isNativeEditor(event.target)) return;\n if (isCopyPasteKey(event, \"c\") && clipboard) {\n // The native copy event writes synchronously through clipboardData.\n event.stopPropagation();\n return;\n }\n if (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n event.stopPropagation();\n if (viewportContext && state.selection.range && !isLoadedCellRange(state.selection.range.anchor.rowId, state.selection.range.focus.rowId)) return;\n const clipboardState = getClipboardState(state);\n copiedRangeRef.current = state.selection.range\n ? copyCominsCellRange(\n clipboardState,\n state.selection.range,\n groupingProjection?.visibleLeafRowIds ?? state.rowIds,\n )\n : null;\n copiedCellRef.current = copiedRangeRef.current ? null : copyCominsCell(clipboardState, address);\n return;\n }\n\n if (clipboardPaste && isCopyPasteKey(event, \"v\")) { event.stopPropagation(); return; }\n\n if (isCopyPasteKey(event, \"v\") && (copiedRangeRef.current || copiedCellRef.current)) {\n event.preventDefault();\n event.stopPropagation();\n if (viewportContext && copiedRangeRef.current) {\n const start = state.rowIds.indexOf(address.rowId);\n const end = start + copiedRangeRef.current.rows.length - 1;\n if (start < 0 || state.rowIds[end] === undefined || !isLoadedCellRange(address.rowId, state.rowIds[end]!)) return;\n }\n commitState((current) => {\n const clipboardState = getClipboardState(current);\n const next = copiedRangeRef.current\n ? pasteCominsCellRange(clipboardState, address, copiedRangeRef.current, clipboard ? getSelectionRowOrder() : groupingProjection?.visibleLeafRowIds ?? current.rowIds)\n : pasteCominsCell(clipboardState, address, copiedCellRef.current);\n return next === clipboardState ? current : { ...next, columns: current.columns };\n });\n }\n };\n const beginCellRangeDrag = (\n event: React.MouseEvent<HTMLTableCellElement>,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (!cellSelection || disabled || event.defaultPrevented || event.button !== 0) {\n return false;\n }\n\n const target = event.target instanceof Element ? event.target : null;\n const control = target?.closest(\n 'input, textarea, select, button, a[href], [contenteditable]:not([contenteditable=\"false\"]), [tabindex]',\n );\n if (control && control !== event.currentTarget && event.currentTarget.contains(control)) {\n return false;\n }\n\n // Cell selection owns this gesture. A document text selection can otherwise\n // route the native copy event outside the focused Table.\n event.preventDefault();\n event.currentTarget.ownerDocument.getSelection()?.removeAllRanges();\n focusCominsElement(event.currentTarget, { preventScroll: true });\n // Shift extends the existing Cell anchor in onClick; it must not start a drag.\n if (event.shiftKey) return false;\n\n rangeDragAnchorRef.current = address;\n rangeDragLastAddressRef.current = address;\n rangeDragMovedRef.current = false;\n return true;\n };\n const isLoadedCellRange = (anchorId: CominsRowId, focusId: CominsRowId) => {\n if (!viewportContext) return true;\n const first = state.rowIds.indexOf(anchorId), last = state.rowIds.indexOf(focusId);\n if (first < 0 || last < 0) return false;\n const start = Math.min(first, last), end = Math.max(first, last);\n for (let index = start; index < end; index++) if (viewportContext.indices[index + 1] !== viewportContext.indices[index]! + 1) return false;\n return true;\n };\n const getCellAddressFromPoint = (clientX: number, clientY: number): CominsCellAddress | null => {\n const element = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-cell-column-id][data-comins-data-index]\");\n const columnId = element?.dataset.cominsCellColumnId;\n const dataIndex = element?.dataset.cominsDataIndex === undefined ? NaN : Number(element.dataset.cominsDataIndex);\n const rowId = Number.isInteger(dataIndex) ? state.rowIds[dataIndex] : undefined;\n\n return element?.closest(\"[data-comins-table-instance-id]\") === tableRootRef.current && columnId && rowId !== undefined ? { columnId, rowId } : null;\n };\n const updateCellRangeDrag = (address: CominsCellAddress) => {\n if (!cellSelection) {\n return;\n }\n\n const anchor = rangeDragAnchorRef.current;\n\n if (!anchor || !isLoadedCellRange(anchor.rowId, address.rowId) || (anchor.rowId === address.rowId && anchor.columnId === address.columnId)) {\n return;\n }\n\n rangeDragMovedRef.current = true;\n rangeDragLastAddressRef.current = address;\n lastCellAnchorRef.current = anchor;\n commitState((current) => selectCellRange(current, { anchor, focus: address }));\n };\n const endCellRangeDrag = () => {\n if (!cellSelection) {\n return;\n }\n\n rangeDragAnchorRef.current = null;\n rangeDragLastAddressRef.current = null;\n };\n const beginCellRangePointerDrag = (\n event: React.PointerEvent<HTMLTableCellElement>,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (!beginCellRangeDrag(event, address, disabled)) {\n return;\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons !== 1) {\n return;\n }\n\n const nextAddress = getCellAddressFromPoint(moveEvent.clientX, moveEvent.clientY);\n\n if (nextAddress) {\n updateCellRangeDrag(nextAddress);\n }\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n endCellRangeDrag();\n };\n const handlePointerCancel = () => {\n cleanup();\n endCellRangeDrag();\n };\n\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n };\n const beginRowHandlePointerDrag = (\n event: React.PointerEvent<HTMLElement>,\n entry: VisibleRowEntry<TData>,\n disabled: boolean,\n draggable: boolean,\n ) => {\n if (disabled || !draggable || event.button !== 0) {\n return;\n }\n\n const sourceGroupId = groupingActive && rowGrouping\n ? rowGrouping.getRowGroupId(entry.row, entry.dataIndex)\n : undefined;\n const sourceTableId = normalizedTableTransfer?.tableId;\n const row = createEventRow(entry);\n\n if (onBeforeRowDrag?.({ event, row, sourceGroupId, sourceTableId }) === false) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const sourceRowId = entry.rowId;\n let crossTarget: CominsCrossTableRowTarget<TData, TGroup> | null = null;\n let autoScroll: ReturnType<typeof createCrossTableAutoScroll>;\n let finished = false;\n let lastPointerEvent = event.nativeEvent;\n let lastTarget: CominsRowDragTarget | null = null;\n let registeredCleanup: TablePointerGestureCleanup | null = null;\n const notifyTarget = (pointerEvent: PointerEvent, target: CominsRowDragTarget) => {\n if (areCominsRowDragTargetsEqual(lastTarget, target)) {\n return;\n }\n\n lastTarget = target;\n onRowDrag?.({\n event: pointerEvent,\n row,\n sourceGroupId,\n sourceTableId,\n target,\n });\n };\n const finish = (\n pointerEvent: PointerEvent | null,\n result: CominsRowDragResult,\n reason: CominsRowDragReason,\n ) => {\n if (finished) {\n return;\n }\n\n finished = true;\n onAfterDragRow?.({\n event: pointerEvent,\n reason,\n result,\n row,\n sourceGroupId,\n sourceTableId,\n ...(lastTarget ? { target: lastTarget } : {}),\n });\n };\n const setActiveRowMoveState = (next: CominsRowMoveState | null) => {\n rowMoveStateRef.current = next;\n setRowMoveState(next);\n };\n const resolveCrossTarget = (\n clientX: number,\n clientY: number,\n ): CominsCrossTableRowTarget<TData, TGroup> | null => {\n const hit = getCrossTableTransferHit(clientX, clientY);\n\n if (!hit || !normalizedTableTransfer) {\n return null;\n }\n\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const sourceEndpoint = sourceSnapshot?.endpoint;\n const targetEndpoint = hit.snapshot.endpoint;\n const sourceGrouped = sourceEndpoint && isCominsGroupedTransferEndpoint(sourceEndpoint)\n ? sourceEndpoint\n : null;\n const targetGrouped = isCominsGroupedTransferEndpoint(targetEndpoint)\n ? targetEndpoint\n : null;\n const sourceDataIndex = sourceEndpoint?.data.findIndex(\n (row, dataIndex) => sourceEndpoint.getRowId(row, dataIndex) === sourceRowId,\n ) ?? -1;\n const sourceRow = sourceDataIndex >= 0 ? sourceEndpoint?.data[sourceDataIndex] : undefined;\n const rowElement = hit.element.closest<HTMLElement>(\"[data-comins-row-data-index]\");\n const groupElement = hit.element.closest<HTMLElement>(\"[data-comins-group-index]\");\n let marker = hit.snapshot.viewport ?? hit.root;\n let targetGroupId: CominsRowId | undefined;\n let targetRowId: CominsRowId | undefined;\n let structurallyValid =\n sourceRow !== undefined &&\n (sourceGrouped === null) === (targetGrouped === null);\n\n if (\n rowElement &&\n rowElement.closest<HTMLElement>(\"[data-comins-table-instance-id]\") === hit.root\n ) {\n marker = rowElement;\n const targetDataIndex = Number(rowElement.dataset.cominsRowDataIndex);\n const targetRow = Number.isInteger(targetDataIndex)\n ? targetEndpoint.data[targetDataIndex]\n : undefined;\n\n if (targetRow === undefined) {\n structurallyValid = false;\n } else {\n targetRowId = targetEndpoint.getRowId(targetRow, targetDataIndex);\n targetGroupId = targetGrouped?.getRowGroupId(targetRow, targetDataIndex);\n }\n } else if (\n groupElement &&\n groupElement.closest<HTMLElement>(\"[data-comins-table-instance-id]\") === hit.root\n ) {\n marker = groupElement;\n const targetGroupIndex = Number(groupElement.dataset.cominsGroupIndex);\n const targetGroup = targetGrouped && Number.isInteger(targetGroupIndex)\n ? targetGrouped.groups[targetGroupIndex]\n : undefined;\n\n if (!targetGrouped || targetGroup === undefined) {\n structurallyValid = false;\n } else {\n targetGroupId = targetGrouped.getGroupId(targetGroup);\n }\n } else if (targetGrouped) {\n structurallyValid = false;\n }\n\n if (structurallyValid && sourceGrouped && targetGrouped && sourceRow !== undefined) {\n const sourceGroupId = sourceGrouped.getRowGroupId(sourceRow, sourceDataIndex);\n\n structurallyValid =\n targetGroupId !== undefined &&\n targetGrouped.groups.some(\n (group) => targetGrouped.getGroupId(group) === targetGroupId,\n ) &&\n (sourceGroupId === targetGroupId || typeof targetGrouped.setRowGroupId === \"function\");\n }\n\n const intent: CominsTableTransferIntent<TData, TGroup> | null =\n structurallyValid && sourceRow !== undefined\n ? {\n kind: \"row\",\n row: sourceRow,\n sourceRowId,\n sourceTableId: sourceEndpoint!.tableId,\n targetGroupId,\n targetRowId,\n targetTableId: targetEndpoint.tableId,\n }\n : null;\n const valid = Boolean(intent) && (hit.snapshot.config.canTransfer?.(intent!) ?? true);\n\n return {\n ...hit,\n marker,\n targetGroupId,\n targetRowId,\n valid,\n };\n };\n const updateTarget = (\n clientX: number,\n clientY: number,\n pointerEvent: PointerEvent = lastPointerEvent,\n ) => {\n lastPointerEvent = pointerEvent;\n const pointElement = document.elementFromPoint(clientX, clientY);\n const target = pointElement\n ?.closest<HTMLElement>(\"[data-comins-row-data-index], [data-comins-group-index]\");\n const targetTableInstanceId = pointElement\n ?.closest<HTMLElement>(\"[data-comins-table-instance-id]\")\n ?.dataset.cominsTableInstanceId;\n\n if (target && targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n\n if (target.dataset.cominsRowDataIndex !== undefined) {\n const targetDataIndex = Number(target.dataset.cominsRowDataIndex);\n\n if (!Number.isInteger(targetDataIndex)) {\n autoScroll.stop();\n setActiveRowMoveState({ sourceRowId, valid: false });\n notifyTarget(pointerEvent, { tableId: sourceTableId, valid: false });\n return;\n }\n\n const targetRow = stateRef.current.rows[targetDataIndex];\n const targetGroupId = groupingActive && rowGrouping && targetRow !== undefined\n ? rowGrouping.getRowGroupId(targetRow, targetDataIndex)\n : undefined;\n const sourceGroupId = groupingActive && rowGrouping\n ? rowGrouping.getRowGroupId(entry.row, entry.dataIndex)\n : undefined;\n const valid =\n targetGroupId === undefined ||\n sourceGroupId === targetGroupId ||\n (typeof rowGrouping?.setRowGroupId === \"function\" && typeof onChangeData === \"function\");\n\n setActiveRowMoveState({ sourceRowId, targetDataIndex, targetGroupId, valid });\n autoScroll.update(containerRef.current, clientX, clientY, valid);\n notifyTarget(pointerEvent, {\n dataIndex: targetDataIndex,\n groupId: targetGroupId,\n rowId: targetRow === undefined\n ? undefined\n : stateRef.current.getRowId(targetRow, targetDataIndex),\n tableId: sourceTableId,\n valid,\n });\n return;\n }\n\n const targetGroupIndex = Number(target.dataset.cominsGroupIndex);\n const targetGroupId = Number.isInteger(targetGroupIndex)\n ? orderedGroupModel?.groupIds[targetGroupIndex]\n : undefined;\n\n if (targetGroupId !== undefined && groupingActive && rowGrouping) {\n const sourceGroupId = rowGrouping.getRowGroupId(entry.row, entry.dataIndex);\n const valid =\n sourceGroupId === targetGroupId ||\n (typeof rowGrouping.setRowGroupId === \"function\" && typeof onChangeData === \"function\");\n\n setActiveRowMoveState({ sourceRowId, targetGroupId, valid });\n autoScroll.update(containerRef.current, clientX, clientY, valid);\n notifyTarget(pointerEvent, {\n groupId: targetGroupId,\n tableId: sourceTableId,\n valid,\n });\n }\n return;\n }\n\n if (targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n if (pointElement?.closest(\".comins-row-move-placeholder\")) {\n autoScroll.update(containerRef.current, clientX, clientY, rowMoveStateRef.current?.valid === true);\n return;\n }\n setActiveRowMoveState({ sourceRowId, valid: false });\n autoScroll.update(containerRef.current, clientX, clientY, true);\n return;\n }\n\n crossTarget = resolveCrossTarget(clientX, clientY);\n\n if (crossTarget) {\n setExternalDropMarker(crossTarget.marker, \"row\", crossTarget.valid);\n setActiveRowMoveState({\n sourceRowId,\n targetGroupId: crossTarget.targetGroupId,\n targetTableId: crossTarget.snapshot.endpoint.tableId,\n valid: crossTarget.valid,\n });\n notifyTarget(pointerEvent, {\n groupId: crossTarget.targetGroupId,\n rowId: crossTarget.targetRowId,\n tableId: crossTarget.snapshot.endpoint.tableId,\n valid: crossTarget.valid,\n });\n autoScroll.update(\n crossTarget.snapshot.viewport,\n clientX,\n clientY,\n crossTarget.valid,\n );\n return;\n }\n\n clearExternalDropMarker();\n autoScroll.stop();\n setActiveRowMoveState({ sourceRowId, valid: false });\n notifyTarget(pointerEvent, { valid: false });\n };\n autoScroll = createCrossTableAutoScroll(updateTarget);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons !== 1) {\n return;\n }\n\n updateTarget(moveEvent.clientX, moveEvent.clientY, moveEvent);\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handleWindowBlur);\n window.removeEventListener(\"keydown\", handleKeyDown);\n autoScroll.stop();\n\n if (activePointerGestureCleanupRef.current === registeredCleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n updateTarget(upEvent.clientX, upEvent.clientY, upEvent);\n\n const moveState = rowMoveStateRef.current;\n const finalCrossTarget = crossTarget;\n cleanup();\n clearExternalDropMarker();\n setActiveRowMoveState(null);\n\n if (!moveState?.valid) {\n finish(upEvent, \"rejected\", \"invalid-target\");\n return;\n }\n\n if (moveState.targetTableId && finalCrossTarget && normalizedTableTransfer) {\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const targetSnapshot = getRegisteredTransferSnapshot(moveState.targetTableId);\n\n if (\n !sourceSnapshot ||\n !targetSnapshot ||\n targetSnapshot.instanceId !== finalCrossTarget.snapshot.instanceId\n ) {\n finish(upEvent, \"rejected\", \"stale-target\");\n return;\n }\n\n const rejectedConflict: {\n conflict?: CominsTableTransferConflict<TData, TGroup>;\n } = {};\n const result = transferCominsRowBetweenTables({\n resolveConflict: (conflict) => {\n const policy = targetSnapshot.config.resolveConflict?.(conflict) === \"overwrite\"\n ? \"overwrite\"\n : \"reject\";\n\n if (policy === \"reject\" && rejectedConflict.conflict === undefined) {\n rejectedConflict.conflict = conflict;\n }\n\n return policy;\n },\n source: sourceSnapshot.endpoint,\n sourceRowId,\n target: targetSnapshot.endpoint,\n targetGroupId: finalCrossTarget.targetGroupId,\n targetRowId: finalCrossTarget.targetRowId,\n });\n\n if (result && emitCominsTableTransfer(normalizedTableTransfer.coordinator, result)) {\n scheduleTransferFocus(targetSnapshot.endpoint.tableId, \"row\", sourceRowId);\n finish(upEvent, \"moved\", \"drop\");\n } else if (rejectedConflict.conflict) {\n const rejection: CominsTableTransferRejection<TData, TGroup> = Object.freeze({\n conflict: rejectedConflict.conflict,\n kind: \"row\",\n reason: \"duplicate-id\",\n sourceTableId: sourceSnapshot.endpoint.tableId,\n targetTableId: targetSnapshot.endpoint.tableId,\n });\n\n showTransferRejectionFeedback(\n rejection,\n targetSnapshot,\n upEvent.clientX,\n upEvent.clientY,\n );\n emitCominsTableTransferRejected(normalizedTableTransfer.coordinator, rejection);\n finish(upEvent, \"rejected\", \"duplicate-id\");\n } else {\n finish(upEvent, \"rejected\", \"stale-target\");\n }\n return;\n }\n\n if (groupingActive && rowGrouping && moveState.targetGroupId !== undefined) {\n const current = stateRef.current;\n const next = moveCominsRowToGroup(current, {\n getRowGroupId: rowGrouping.getRowGroupId,\n setRowGroupId: rowGrouping.setRowGroupId,\n sourceRowId,\n targetGroupId: moveState.targetGroupId,\n targetRowId: moveState.targetDataIndex === undefined\n ? undefined\n : current.rowIds[moveState.targetDataIndex],\n });\n const changed =\n current.rows.length !== next.rows.length ||\n current.rows.some((currentRow, index) => currentRow !== next.rows[index]);\n\n if (\n sourceGroupId !== moveState.targetGroupId &&\n !expandedGroupIdSet.has(moveState.targetGroupId)\n ) {\n pendingGroupDisclosureFocusRef.current = moveState.targetGroupId;\n }\n\n if (changed && virtualized) pendingRowMoveScrollTopRef.current = containerRef.current?.scrollTop ?? null;\n commitState(next);\n finish(upEvent, changed ? \"moved\" : \"cancelled\", changed ? \"drop\" : \"unchanged\");\n return;\n }\n\n if (moveState.targetDataIndex !== undefined) {\n const current = stateRef.current;\n const next = moveCominsRow(current, sourceRowId, moveState.targetDataIndex);\n const changed =\n current.rows.length !== next.rows.length ||\n current.rows.some((currentRow, index) => currentRow !== next.rows[index]);\n\n if (changed && virtualized) pendingRowMoveScrollTopRef.current = containerRef.current?.scrollTop ?? null;\n commitState(next);\n finish(upEvent, changed ? \"moved\" : \"cancelled\", changed ? \"drop\" : \"unchanged\");\n return;\n }\n\n finish(upEvent, \"rejected\", \"invalid-target\");\n };\n const cancel = (\n pointerEvent: PointerEvent | null,\n reason: Extract<CominsRowDragReason, \"blur\" | \"escape\" | \"pointer-cancel\">,\n resetRenderState = true,\n ) => {\n cleanup();\n clearExternalDropMarker();\n if (resetRenderState) {\n setActiveRowMoveState(null);\n } else {\n // unmount 정리에서는 렌더링을 예약하지 않고 드래그 참조만 비운다.\n rowMoveStateRef.current = null;\n }\n finish(pointerEvent, \"cancelled\", reason);\n };\n const handlePointerCancel = (cancelEvent: PointerEvent) => {\n cancel(cancelEvent, \"pointer-cancel\");\n };\n const handleWindowBlur = () => {\n cancel(null, \"blur\");\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n keyEvent.preventDefault();\n cancel(null, \"escape\");\n }\n };\n\n registeredCleanup = (unmounting = false) => cancel(null, \"pointer-cancel\", !unmounting);\n updateTarget(event.clientX, event.clientY, event.nativeEvent);\n registerActivePointerGesture(registeredCleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handleWindowBlur);\n window.addEventListener(\"keydown\", handleKeyDown);\n };\n const beginRowGroupHandlePointerDrag = (\n event: React.PointerEvent<HTMLElement>,\n sourceGroupId: CominsRowId,\n ) => {\n const onChangeGroups = rowGrouping?.onChangeGroups;\n const crossTableEnabled = Boolean(normalizedTableTransfer);\n\n if (\n event.button !== 0 ||\n !rowGrouping?.groupDraggable ||\n (typeof onChangeGroups !== \"function\" && !crossTableEnabled) ||\n !orderedGroupModel?.groupsById.has(sourceGroupId)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n let crossTarget: CominsCrossTableGroupTarget<TData, TGroup> | null = null;\n let autoScroll: ReturnType<typeof createCrossTableAutoScroll>;\n const setActiveGroupMoveState = (next: CominsRowGroupMoveState | null) => {\n rowGroupMoveStateRef.current = next;\n setRowGroupMoveState(next);\n };\n const resolveCrossTarget = (\n clientX: number,\n clientY: number,\n ): CominsCrossTableGroupTarget<TData, TGroup> | null => {\n const hit = getCrossTableTransferHit(clientX, clientY);\n\n if (!hit || !normalizedTableTransfer) {\n return null;\n }\n\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const sourceEndpoint = sourceSnapshot?.endpoint;\n const sourceGrouped = sourceEndpoint && isCominsGroupedTransferEndpoint(sourceEndpoint)\n ? sourceEndpoint\n : null;\n const targetGrouped = isCominsGroupedTransferEndpoint(hit.snapshot.endpoint)\n ? hit.snapshot.endpoint\n : null;\n const sourceGroupIndex = sourceGrouped?.groups.findIndex(\n (group) => sourceGrouped.getGroupId(group) === sourceGroupId,\n ) ?? -1;\n const sourceGroup = sourceGroupIndex >= 0\n ? sourceGrouped?.groups[sourceGroupIndex]\n : undefined;\n const groupElement = hit.element.closest<HTMLElement>(\"[data-comins-group-index]\");\n let marker = hit.snapshot.viewport ?? hit.root;\n let position: \"after\" | \"append\" | \"before\" = \"append\";\n let targetGroupId: CominsRowId | undefined;\n let structurallyValid = Boolean(sourceGrouped && targetGrouped && sourceGroup !== undefined);\n\n if (\n groupElement &&\n groupElement.closest<HTMLElement>(\"[data-comins-table-instance-id]\") === hit.root\n ) {\n marker = groupElement;\n const targetGroupIndex = Number(groupElement.dataset.cominsGroupIndex);\n const targetGroup = targetGrouped && Number.isInteger(targetGroupIndex)\n ? targetGrouped.groups[targetGroupIndex]\n : undefined;\n\n if (targetGroup === undefined) {\n structurallyValid = false;\n } else {\n targetGroupId = targetGrouped!.getGroupId(targetGroup);\n const bounds = getCominsElementRect(groupElement);\n position = clientY >= bounds.top + bounds.height / 2 ? \"after\" : \"before\";\n }\n } else if (!targetGrouped || targetGrouped.groups.length > 0) {\n structurallyValid = false;\n }\n\n const intent: CominsTableTransferIntent<TData, TGroup> | null =\n structurallyValid && sourceGrouped && sourceGroup !== undefined\n ? {\n group: sourceGroup,\n kind: \"group\",\n rows: sourceGrouped.data.filter(\n (row, dataIndex) =>\n sourceGrouped.getRowGroupId(row, dataIndex) === sourceGroupId,\n ),\n sourceGroupId,\n sourceTableId: sourceGrouped.tableId,\n targetGroupId,\n targetTableId: hit.snapshot.endpoint.tableId,\n }\n : null;\n const valid = Boolean(intent) && (hit.snapshot.config.canTransfer?.(intent!) ?? true);\n\n return {\n ...hit,\n marker,\n position,\n targetGroupId,\n valid,\n };\n };\n const updateTarget = (clientX: number, clientY: number) => {\n const pointElement = document.elementFromPoint(clientX, clientY);\n const targetRow = pointElement?.closest<HTMLElement>(\"[data-comins-group-index]\");\n const targetTableInstanceId = pointElement\n ?.closest<HTMLElement>(\"[data-comins-table-instance-id]\")\n ?.dataset.cominsTableInstanceId;\n\n if (targetRow && targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n\n if (typeof onChangeGroups !== \"function\") {\n autoScroll.stop();\n setActiveGroupMoveState(null);\n return;\n }\n\n const targetGroupIndex = Number(targetRow.dataset.cominsGroupIndex);\n const targetGroupId = Number.isInteger(targetGroupIndex)\n ? orderedGroupModel.groupIds[targetGroupIndex]\n : undefined;\n\n if (targetGroupId === undefined) {\n autoScroll.stop();\n setActiveGroupMoveState(null);\n return;\n }\n\n const bounds = getCominsElementRect(targetRow);\n const position = clientY >= bounds.top + bounds.height / 2 ? \"after\" : \"before\";\n\n setActiveGroupMoveState({ position, sourceGroupId, targetGroupId });\n autoScroll.update(containerRef.current, clientX, clientY, true);\n return;\n }\n\n if (targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n setActiveGroupMoveState(null);\n autoScroll.update(containerRef.current, clientX, clientY, typeof onChangeGroups === \"function\");\n return;\n }\n\n crossTarget = resolveCrossTarget(clientX, clientY);\n\n if (crossTarget) {\n setExternalDropMarker(\n crossTarget.marker,\n \"group\",\n crossTarget.valid,\n crossTarget.position,\n );\n setActiveGroupMoveState({\n position: crossTarget.position,\n sourceGroupId,\n targetGroupId: crossTarget.targetGroupId,\n targetTableId: crossTarget.snapshot.endpoint.tableId,\n });\n autoScroll.update(\n crossTarget.snapshot.viewport,\n clientX,\n clientY,\n crossTarget.valid,\n );\n return;\n }\n\n clearExternalDropMarker();\n autoScroll.stop();\n setActiveGroupMoveState(null);\n };\n autoScroll = createCrossTableAutoScroll(updateTarget);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons === 1) {\n updateTarget(moveEvent.clientX, moveEvent.clientY);\n }\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n window.removeEventListener(\"keydown\", handleKeyDown);\n autoScroll.stop();\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n updateTarget(upEvent.clientX, upEvent.clientY);\n\n const moveState = rowGroupMoveStateRef.current;\n const finalCrossTarget = crossTarget;\n cleanup();\n clearExternalDropMarker();\n setActiveGroupMoveState(null);\n\n if (\n moveState?.targetTableId &&\n finalCrossTarget?.valid &&\n normalizedTableTransfer\n ) {\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const targetSnapshot = getRegisteredTransferSnapshot(moveState.targetTableId);\n\n if (\n !sourceSnapshot ||\n !targetSnapshot ||\n targetSnapshot.instanceId !== finalCrossTarget.snapshot.instanceId\n ) {\n return;\n }\n\n const rejectedConflict: {\n conflict?: CominsTableTransferConflict<TData, TGroup>;\n } = {};\n const result = transferCominsGroupBetweenTables({\n position: finalCrossTarget.position,\n resolveConflict: (conflict) => {\n const policy = targetSnapshot.config.resolveConflict?.(conflict) === \"overwrite\"\n ? \"overwrite\"\n : \"reject\";\n\n if (policy === \"reject\" && rejectedConflict.conflict === undefined) {\n rejectedConflict.conflict = conflict;\n }\n\n return policy;\n },\n source: sourceSnapshot.endpoint,\n sourceGroupId,\n target: targetSnapshot.endpoint,\n targetGroupId: finalCrossTarget.targetGroupId,\n });\n\n if (result && emitCominsTableTransfer(normalizedTableTransfer.coordinator, result)) {\n scheduleTransferFocus(targetSnapshot.endpoint.tableId, \"group\", sourceGroupId);\n } else if (rejectedConflict.conflict) {\n const rejection: CominsTableTransferRejection<TData, TGroup> = Object.freeze({\n conflict: rejectedConflict.conflict,\n kind: \"group\",\n reason: \"duplicate-id\",\n sourceTableId: sourceSnapshot.endpoint.tableId,\n targetTableId: targetSnapshot.endpoint.tableId,\n });\n\n showTransferRejectionFeedback(\n rejection,\n targetSnapshot,\n upEvent.clientX,\n upEvent.clientY,\n );\n emitCominsTableTransferRejected(normalizedTableTransfer.coordinator, rejection);\n }\n return;\n }\n\n if (\n !moveState ||\n moveState.position === \"append\" ||\n moveState.targetGroupId === undefined ||\n moveState.sourceGroupId === moveState.targetGroupId\n ) {\n return;\n }\n\n const currentGroups = rowGrouping.groups;\n const fromIndex = currentGroups.findIndex(\n (group) => rowGrouping.getGroupId(group) === moveState.sourceGroupId,\n );\n const nextGroups = moveCominsRowGroup({\n getGroupId: rowGrouping.getGroupId,\n groups: currentGroups,\n position: moveState.position,\n sourceGroupId: moveState.sourceGroupId,\n targetGroupId: moveState.targetGroupId,\n });\n const toIndex = nextGroups.findIndex(\n (group) => rowGrouping.getGroupId(group) === moveState.sourceGroupId,\n );\n const changed =\n fromIndex >= 0 &&\n toIndex >= 0 &&\n currentGroups.some((group, index) => group !== nextGroups[index]);\n\n if (changed) {\n onChangeGroups?.(nextGroups, {\n fromIndex,\n groupId: moveState.sourceGroupId,\n reason: \"move\",\n targetGroupId: moveState.targetGroupId,\n toIndex,\n });\n }\n };\n const handlePointerCancel = () => {\n cleanup();\n clearExternalDropMarker();\n setActiveGroupMoveState(null);\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n handlePointerCancel();\n }\n };\n\n setActiveGroupMoveState({\n position: \"before\",\n sourceGroupId,\n targetGroupId: sourceGroupId,\n });\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n window.addEventListener(\"keydown\", handleKeyDown);\n };\n const movingColumn = movingColumnId\n ? visibleColumns.find((visibleColumn) => visibleColumn.id === movingColumnId)\n : undefined;\n const movingGroup = movingGroupId ? state.columnGroups.find((group) => group.id === movingGroupId) : undefined;\n const movingHeaderLabel = movingColumn\n ? getCominsColumnPlaceholderText(movingColumn.label, movingColumn.id)\n : movingGroup\n ? getCominsColumnPlaceholderText(movingGroup.label, movingGroup.id)\n : undefined;\n\n const changeColumnFilterRule = (columnId: string, nextRule: CominsColumnFilterRule | null) => {\n const filtering = columnFiltering;\n const onChangeModel = filtering?.onChangeModel;\n\n if (!filtering || typeof onChangeModel !== \"function\") {\n return;\n }\n\n const currentModel = Array.isArray(filtering.model) ? filtering.model : [];\n const currentIndex = currentModel.findIndex((rule) => rule?.columnId === columnId);\n const nextModel = currentModel.filter((rule) => rule?.columnId !== columnId);\n\n if (nextRule) {\n nextModel.splice(currentIndex < 0 ? nextModel.length : currentIndex, 0, nextRule);\n }\n\n onChangeModel(nextModel);\n };\n\n const renderHeaderCell = (cell: CominsHeaderCell<TData>, fallbackIndex: number) => {\n if (cell.kind === \"group\") {\n const isDropTarget = columnMoveTarget?.kind === \"group\" && columnMoveTarget.id === cell.groupId;\n const isGroupPlaceholder = movingGroupId === cell.groupId;\n const groupPositionLocked =\n cell.group.lockPosition === true ||\n state.columnGroupState[cell.groupId]?.pinned !== undefined;\n const groupColumnIds = visibleColumns\n .map((column) => column.id)\n .filter((columnId) => cell.group.children.includes(columnId));\n const firstGroupPin = groupColumnIds[0]\n ? getPinnedColumnAttributes(groupColumnIds[0])\n : undefined;\n const lastGroupPin = groupColumnIds.at(-1)\n ? getPinnedColumnAttributes(groupColumnIds.at(-1)!)\n : undefined;\n const groupPinned = firstGroupPin?.pinned && groupColumnIds.every(\n (columnId) => getPinnedColumnAttributes(columnId).pinned === firstGroupPin.pinned,\n )\n ? firstGroupPin.pinned\n : undefined;\n const groupPinStyle = groupPinned === \"left\"\n ? firstGroupPin?.style\n : groupPinned === \"right\"\n ? lastGroupPin?.style\n : undefined;\n const groupPinBoundary = groupPinned === \"left\"\n ? lastGroupPin?.boundary\n : groupPinned === \"right\"\n ? firstGroupPin?.boundary\n : undefined;\n const groupPlaceholderLabel = getCominsColumnPlaceholderText(cell.group.label, cell.groupId);\n return (\n <th\n aria-label={isGroupPlaceholder ? groupPlaceholderLabel : undefined}\n className={[\n \"comins-table__th comins-table__group-th px-3 py-2 text-left font-semibold\",\n isGroupPlaceholder ? \"comins-column-moving\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n colSpan={cell.colSpan}\n data-column-drop-target={isDropTarget ? \"true\" : undefined}\n data-column-drop-valid={\n isDropTarget && columnMoveTarget.status !== \"neutral\"\n ? columnMoveTarget.status === \"valid\"\n ? \"true\"\n : \"false\"\n : undefined\n }\n data-column-moving={isGroupPlaceholder ? \"true\" : undefined}\n data-column-placeholder={isGroupPlaceholder ? \"true\" : undefined}\n data-column-position-locked={groupPositionLocked ? \"true\" : undefined}\n data-comins-column-depth=\"0\"\n data-comins-column-group-id={cell.groupId}\n data-comins-column-end={groupColumnIds.at(-1) === visibleColumns.at(-1)?.id ? \"true\" : undefined}\n data-comins-pin-boundary={groupPinBoundary ? \"true\" : undefined}\n data-comins-pinned={groupPinned}\n data-testid={`header-group-${cell.groupId}`}\n key={`group-${cell.groupId}`}\n onPointerDown={(event) => beginGroupPointerInteraction(event, cell.group)}\n rowSpan={cell.rowSpan}\n scope=\"colgroup\"\n style={groupPinStyle}\n >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span\n {...(isGroupPlaceholder ? COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS : {})}\n aria-hidden={isGroupPlaceholder ? \"true\" : undefined}\n className=\"comins-table__header-content\"\n data-comins-header-body=\"true\"\n inert={isGroupPlaceholder ? true : undefined}\n ref={bindCominsColumnPlaceholderNativeBoundary}\n >\n {showColumnMoveHandle && !groupPositionLocked ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-column-move-handle\"\n data-comins-column-move-handle=\"true\"\n data-testid={`column-group-move-handle-${cell.groupId}`}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n beginGroupPointerInteraction(event, cell.group, true);\n }}\n >\n <CominsTableIcon name=\"columnMove\" />\n </span>\n ) : null}\n <span className=\"comins-table__header-label\">{isGroupPlaceholder ? null : cell.group.label}</span>\n </span>\n {isGroupPlaceholder ? (\n <span aria-hidden=\"true\" className=\"comins-column-placeholder-label\">\n {groupPlaceholderLabel}\n </span>\n ) : null}\n <span\n aria-hidden=\"true\"\n className=\"comins-table__resize\"\n data-resizing={resizingColumnId === cell.groupId ? \"true\" : undefined}\n data-testid={`resize-group-${cell.groupId}`}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const measuredWidth = getCominsElementRect(event.currentTarget.closest<HTMLTableCellElement>(\"th\"))?.width;\n const visibleWidthSnapshot = new Map<string, number>();\n\n for (const childId of cell.group.children) {\n const visibleColumn = visibleColumns.find((column) => column.id === childId);\n\n if (!visibleColumn) {\n continue;\n }\n\n const headerCell = Array.from(\n headerRef.current?.querySelectorAll<HTMLTableCellElement>(\"[data-comins-column-id]\") ?? [],\n ).find((element) => element.dataset.cominsColumnId === visibleColumn.id);\n const measuredColumnWidth = getCominsElementRect(headerCell)?.width;\n const fallbackWidth = stateRef.current.columnState[visibleColumn.id]?.width ?? visibleColumn.width ?? 160;\n\n visibleWidthSnapshot.set(\n visibleColumn.id,\n measuredColumnWidth && Number.isFinite(measuredColumnWidth) ? measuredColumnWidth : fallbackWidth,\n );\n }\n\n const fallbackGroupWidth = [...visibleWidthSnapshot.values()].reduce((sum, width) => sum + width, 0);\n const startWidth =\n measuredWidth && Number.isFinite(measuredWidth) ? measuredWidth : Math.max(1, fallbackGroupWidth);\n const resizeMaxWidth = getCominsPinnedBlockResizeMaxWidth(\n columnPinningBlocks,\n columnPinning,\n `group:${cell.groupId}`,\n containerWidth,\n );\n setResizingColumnId(cell.groupId);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n commitState(\n (current) => {\n let next = current;\n\n for (const [visibleColumnId, visibleColumnWidth] of visibleWidthSnapshot) {\n next = setCominsColumnWidth(next, visibleColumnId, visibleColumnWidth);\n }\n\n return setCominsColumnGroupWidth(\n next,\n cell.groupId,\n Math.min(resizeMaxWidth ?? Number.POSITIVE_INFINITY, startWidth + moveEvent.clientX - startX),\n );\n },\n { columnLayoutChanged: true },\n );\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n setResizingColumnId(null);\n };\n const handlePointerCancel = () => {\n cleanup();\n setResizingColumnId(null);\n };\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n }}\n >\n <span className=\"comins-table__resize-line\" />\n </span>\n </th>\n );\n }\n\n const column = cell.column;\n const index = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === column.id);\n const safeIndex = index >= 0 ? index : fallbackIndex;\n const columnState = state.columnState[column.id];\n const pinnedColumn = getPinnedColumnAttributes(column.id);\n const headerProps = column.header?.props ?? {};\n const sortRule = getSortRule(state.sortModel, column.id);\n const sortIndicatorState = getSortIndicatorState(state.sortModel, column.id);\n const sortIndicatorVisible = sortIndicatorState === \"asc\" || sortIndicatorState === \"desc\";\n const showSortPriority = sortRule !== null && state.sortModel.length > 1;\n const isMovingGroupChild = Boolean(movingGroup?.children.includes(column.id));\n const isColumnPlaceholder = movingColumnId === column.id || isMovingGroupChild;\n const columnPlaceholderLabel = getCominsColumnPlaceholderText(column.label, column.id);\n const headerClassName = [\n \"comins-table__th px-3 py-2 text-left font-semibold\",\n movingColumnId === column.id ? \"comins-column-moving\" : undefined,\n headerProps.className,\n ]\n .filter(Boolean)\n .join(\" \");\n const headerPayload = createHeaderComponentPayload(state, column, safeIndex);\n const headerRenderer = column.header?.render ?? column.header?.renderer;\n const headerRendererKind = column.header?.render ? \"render\" : \"legacy\";\n const cachedHeaderRendererBody = headerRenderer ? headerRendererBodyRef.current.get(column.id) : undefined;\n\n const shouldRefreshHeaderRendererBody =\n Boolean(headerRenderer) && (!isColumnPlaceholder || cachedHeaderRendererBody?.renderer !== headerRenderer || cachedHeaderRendererBody?.kind !== headerRendererKind);\n const headerRendererBody = headerRenderer\n ? shouldRefreshHeaderRendererBody\n ? headerRenderer(headerPayload)\n : cachedHeaderRendererBody?.body\n : null;\n\n if (headerRenderer && shouldRefreshHeaderRendererBody) {\n renderedHeaderRendererBodies.set(column.id, { body: headerRendererBody, renderer: headerRenderer, kind: headerRendererKind });\n } else if (headerRenderer && cachedHeaderRendererBody) {\n renderedHeaderRendererBodies.set(column.id, cachedHeaderRendererBody);\n }\n const useDefaultHeader = !headerRenderer || (headerRendererKind === \"render\" && headerRendererBody === undefined);\n const headerLeftSlots = useDefaultHeader\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"left\")\n : [];\n const headerRightSlots = useDefaultHeader\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"right\")\n : [];\n const hasHeaderComponents = headerLeftSlots.length > 0 || headerRightSlots.length > 0;\n const isDropTarget = columnMoveTarget?.kind === \"column\" && columnMoveTarget.id === column.id;\n const columnPositionLocked =\n column.lockPosition === true ||\n (!cell.groupId && columnState?.pinned !== undefined);\n const columnFilterKind = column.filter?.kind;\n const columnFilterable =\n filteringRequested &&\n (columnFilterKind === \"boolean\" ||\n columnFilterKind === \"date\" ||\n columnFilterKind === \"number\" ||\n columnFilterKind === \"text\");\n\n return (\n <th\n {...headerProps}\n aria-label={isColumnPlaceholder ? columnPlaceholderLabel : headerProps[\"aria-label\"] ?? (column.sort ? columnPlaceholderLabel : undefined)}\n aria-labelledby={isColumnPlaceholder ? undefined : headerProps[\"aria-labelledby\"]}\n className={headerClassName}\n colSpan={cell.colSpan}\n data-column-drop-target={isDropTarget ? \"true\" : undefined}\n data-column-drop-valid={\n isDropTarget && columnMoveTarget.status !== \"neutral\"\n ? columnMoveTarget.status === \"valid\"\n ? \"true\"\n : \"false\"\n : undefined\n }\n data-column-moving={movingColumnId === column.id ? \"true\" : undefined}\n data-column-placeholder={isColumnPlaceholder ? \"true\" : undefined}\n data-column-position-locked={columnPositionLocked ? \"true\" : undefined}\n data-comins-column-depth={cell.groupId ? \"1\" : \"0\"}\n data-comins-column-id={column.id}\n data-comins-column-end={column.id === visibleColumns.at(-1)?.id ? \"true\" : undefined}\n data-comins-column-index={safeIndex}\n data-comins-column-parent-group-id={cell.groupId}\n data-comins-pin-boundary={pinnedColumn.boundary ? \"true\" : undefined}\n data-comins-pinned={pinnedColumn.pinned}\n data-sort-count={sortRule ? state.sortModel.length : undefined}\n data-sort-direction={sortRule?.rule.direction}\n data-sort-priority={sortRule?.priority}\n data-sortable={column.sort ? \"true\" : \"false\"}\n data-filter-active={normalizedColumnFilterById.has(column.id) ? \"true\" : undefined}\n data-testid={`header-${column.id}`}\n aria-sort={column.sort ? getAriaSortState(state.sortModel, column.id) : undefined}\n key={`column-${column.id}`}\n onClick={(event) => {\n if (isColumnPlaceholder) {\n event.preventDefault();\n return;\n }\n\n headerProps.onClick?.(event);\n\n if (event.defaultPrevented || !column.sort) {\n return;\n }\n\n if (consumeSuppressedSortClick(column.id)) {\n return;\n }\n\n activateHeaderSort(column, event.shiftKey);\n }}\n onKeyDown={(event) => {\n if (isColumnPlaceholder) {\n event.preventDefault();\n return;\n }\n\n headerProps.onKeyDown?.(event);\n\n if (event.defaultPrevented || !column.sort) {\n return;\n }\n\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n activateHeaderSort(column, event.shiftKey);\n }\n }}\n onPointerDown={(event) => beginHeaderPointerInteraction(event, cell)}\n rowSpan={cell.rowSpan}\n scope=\"col\"\n style={{ width: columnState?.width ?? column.width, ...headerProps.style, ...pinnedColumn.style }}\n tabIndex={column.sort && !isColumnPlaceholder ? 0 : undefined}\n >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span\n {...(isColumnPlaceholder ? COMINS_COLUMN_PLACEHOLDER_INTERACTION_PROPS : {})}\n aria-hidden={isColumnPlaceholder ? \"true\" : undefined}\n className=\"comins-table__header-content\"\n data-comins-header-body=\"true\"\n data-comins-header-components={hasHeaderComponents ? \"true\" : undefined}\n data-comins-sort-indicator-visible={sortIndicatorVisible ? \"true\" : undefined}\n inert={isColumnPlaceholder ? true : undefined}\n ref={bindCominsColumnPlaceholderNativeBoundary}\n >\n <span className=\"comins-table__header-slot\" data-comins-header-slot=\"left\">\n {showColumnMoveHandle && !columnPositionLocked ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-column-move-handle\"\n data-comins-column-move-handle=\"true\"\n data-testid={`column-move-handle-${column.id}`}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n beginHeaderPointerInteraction(event, cell, true);\n }}\n >\n <CominsTableIcon name=\"columnMove\" />\n </span>\n ) : null}\n {headerLeftSlots}\n </span>\n <span className=\"comins-table__header-label\">\n {!useDefaultHeader ? headerRendererBody : isColumnPlaceholder ? null : column.label}\n </span>\n <span className=\"comins-sort-meta\" data-sort-visible={sortIndicatorVisible ? \"true\" : undefined}>\n {column.sort ? <CominsTableIconButton\n aria-label={`Sort ${columnPlaceholderLabel}`}\n className=\"comins-sort-indicator\"\n data-sort-state={sortIndicatorState}\n data-sort-visible={sortIndicatorVisible ? \"true\" : undefined}\n data-testid={`sort-indicator-${column.id}`}\n onPointerDown={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()}\n icon={sortIndicatorState === \"asc\" ? \"sortAscending\" : sortIndicatorState === \"desc\" ? \"sortDescending\" : \"sortUnsorted\"}\n /> : null}\n {showSortPriority ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-sort-priority\"\n data-testid={`sort-priority-${column.id}`}\n >\n {sortRule.priority}\n </span>\n ) : null}\n </span>\n {showSortPriority ? (\n <span className=\"comins-table__sort-status\">\n {`Sorted ${sortRule.rule.direction === \"asc\" ? \"ascending\" : \"descending\"}, priority ${sortRule.priority} of ${state.sortModel.length}`}\n </span>\n ) : null}\n <span className=\"comins-table__header-slot\" data-comins-header-slot=\"right\">\n {columnFilterable && !isColumnPlaceholder ? (\n <CominsColumnFilterControl\n column={column}\n valueSource={{ columns: state.columns, rows: filterSourceRows, model: columnFiltering?.model ?? [], columnId: column.id }}\n onChangeModel={columnFiltering?.onChangeModel}\n getPortalContainer={() => tableRootRef.current}\n columnId={column.id}\n columnLabel={columnPlaceholderLabel}\n kind={columnFilterKind as CominsColumnFilterKind}\n onChangeRule={typeof columnFiltering?.onChangeModel === \"function\"\n ? (nextRule) => changeColumnFilterRule(column.id, nextRule)\n : undefined}\n onOpenChange={typeof columnFiltering?.onChangeOpenColumnId === \"function\"\n ? columnFiltering.onChangeOpenColumnId\n : undefined}\n open={columnFiltering?.openColumnId === column.id}\n rule={normalizedColumnFilterById.get(column.id)}\n />\n ) : null}\n {headerRightSlots}\n </span>\n </span>\n {isColumnPlaceholder ? (\n <span aria-hidden=\"true\" className=\"comins-column-placeholder-label\">\n {columnPlaceholderLabel}\n </span>\n ) : null}\n <span\n aria-hidden=\"true\"\n className=\"comins-table__resize\"\n data-resizing={resizingColumnId === column.id ? \"true\" : undefined}\n data-testid={`resize-${column.id}`}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const measuredWidth = getCominsElementRect(event.currentTarget.closest<HTMLTableCellElement>(\"th\"))?.width;\n const visibleWidthSnapshot = new Map<string, number>();\n\n for (const visibleColumn of visibleColumns) {\n const headerCell = Array.from(\n headerRef.current?.querySelectorAll<HTMLTableCellElement>(\"[data-comins-column-id]\") ?? [],\n ).find((element) => element.dataset.cominsColumnId === visibleColumn.id);\n const measuredColumnWidth = getCominsElementRect(headerCell)?.width;\n const fallbackWidth = stateRef.current.columnState[visibleColumn.id]?.width ?? visibleColumn.width ?? 160;\n\n visibleWidthSnapshot.set(\n visibleColumn.id,\n measuredColumnWidth && Number.isFinite(measuredColumnWidth) ? measuredColumnWidth : fallbackWidth,\n );\n }\n\n const startWidth =\n visibleWidthSnapshot.get(column.id) ??\n (measuredWidth && Number.isFinite(measuredWidth) ? measuredWidth : (columnState?.width ?? column.width ?? 160));\n const resizeMaxWidth = cell.groupId\n ? undefined\n : getCominsPinnedBlockResizeMaxWidth(\n columnPinningBlocks,\n columnPinning,\n `column:${column.id}`,\n containerWidth,\n );\n setResizingColumnId(column.id);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n commitState(\n (current) => {\n let next = current;\n\n for (const [visibleColumnId, visibleColumnWidth] of visibleWidthSnapshot) {\n next = setCominsColumnWidth(next, visibleColumnId, visibleColumnWidth);\n }\n\n return setColumnWidthInsideParentGroup(\n next,\n column.id,\n Math.min(\n resizeMaxWidth ?? Number.POSITIVE_INFINITY,\n Math.max(getEffectiveColumnMinWidth(column), startWidth + moveEvent.clientX - startX),\n ),\n );\n },\n { columnLayoutChanged: true },\n );\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n setResizingColumnId(null);\n };\n const handlePointerCancel = () => {\n cleanup();\n setResizingColumnId(null);\n };\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n }}\n >\n <span className=\"comins-table__resize-line\" />\n </span>\n </th>\n );\n };\n\n const renderColumnSizing = () => (\n <colgroup>\n {visibleColumns.map((column, index) => (\n <col key={column.id} style={{ width: columnWidths[index] }} />\n ))}\n </colgroup>\n );\n const commitPendingScrollTop = () => {\n setScrollTop((current) => {\n const next = pendingScrollTopRef.current;\n\n return Math.abs(current - next) > 0.5 ? next : current;\n });\n };\n const requestInfiniteLoadIfNeeded = (bodyViewport: HTMLDivElement) => {\n if (groupingRequested || filteringRequested) {\n return;\n }\n\n if (lazyLoad) {\n if (!onLazyLoad || lazyLoadingReasonRef.current) {\n return;\n }\n\n const remainingScroll = bodyViewport.scrollHeight - bodyViewport.scrollTop - bodyViewport.clientHeight;\n\n if (remainingScroll <= resolvedLazyLoadThreshold) {\n requestLazyLoad(\"scroll\");\n }\n\n return;\n }\n\n if (!infiniteScroll || !hasMoreRows || loadingMore || !onLoadMore) {\n return;\n }\n\n const safeThreshold = Math.max(0, infiniteScrollThreshold);\n const remainingScroll = bodyViewport.scrollHeight - bodyViewport.scrollTop - bodyViewport.clientHeight;\n\n if (remainingScroll > safeThreshold) {\n return;\n }\n\n const currentRowCount = stateRef.current.rows.length;\n\n if (lastLoadMoreRowCountRef.current === currentRowCount) {\n return;\n }\n\n lastLoadMoreRowCountRef.current = currentRowCount;\n onLoadMore();\n };\n const syncHorizontalScrollLeft = (requestedScrollLeft: number) => {\n const scrollContainers = [\n headerRef.current,\n containerRef.current,\n footerRef.current,\n horizontalScrollbarRef.current,\n ].filter((element): element is HTMLDivElement => element !== null);\n const sharedMaxScrollLeft = scrollContainers.reduce(\n (current, element) => Math.min(current, Math.max(0, element.scrollWidth - element.clientWidth)),\n Number.POSITIVE_INFINITY,\n );\n const nextScrollLeft = Math.min(\n Number.isFinite(sharedMaxScrollLeft) ? sharedMaxScrollLeft : 0,\n Math.max(0, requestedScrollLeft),\n );\n\n synchronizedScrollLeftRef.current = nextScrollLeft;\n\n for (const element of scrollContainers) {\n if (Math.abs(element.scrollLeft - nextScrollLeft) > 0.5) {\n setCominsScrollLeft(element, nextScrollLeft);\n }\n }\n\n return nextScrollLeft;\n };\n const handleBodyScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const bodyViewport = event.currentTarget;\n const activeAnchorTransaction =\n logicalAnchorTransactionRef.current;\n const pendingDetailAnchor = pendingDetailAnchorRef.current;\n\n const overlay = resolvedLoading ? bodyViewport.querySelector<HTMLElement>(\".comins-table__loading-overlay\") : null;\n if (overlay) overlay.style.transform = `translate(${bodyViewport.scrollLeft}px, ${bodyViewport.scrollTop}px)`;\n pendingScrollTopRef.current = bodyViewport.scrollTop;\n if (\n pendingDetailAnchor?.status === \"pending\" &&\n Math.abs(\n bodyViewport.scrollTop -\n pendingDetailAnchor.previousPhysicalScrollTop,\n ) > 0.5\n ) {\n pendingDetailAnchorRef.current = {\n ...pendingDetailAnchor,\n status: \"cancelled\",\n };\n }\n if (\n activeAnchorTransaction &&\n Math.abs(\n bodyViewport.scrollTop -\n activeAnchorTransaction.actualPhysical,\n ) > 0.5\n ) {\n logicalAnchorTransactionRef.current = null;\n setLogicalAnchorTransaction(null);\n }\n requestInfiniteLoadIfNeeded(bodyViewport);\n\n if (scrollCommitTimeoutRef.current !== null) {\n window.clearTimeout(scrollCommitTimeoutRef.current);\n scrollCommitTimeoutRef.current = null;\n }\n\n if (scrollFrameRef.current === null) {\n scrollFrameRef.current = window.requestAnimationFrame(() => {\n scrollFrameRef.current = null;\n commitPendingScrollTop();\n });\n }\n\n if (Math.abs(bodyViewport.scrollLeft - synchronizedScrollLeftRef.current) > 0.5) {\n syncHorizontalScrollLeft(bodyViewport.scrollLeft);\n }\n };\n const handleBodyWheel = (event: React.WheelEvent<HTMLDivElement>) => {\n if (!hasHorizontalOverflow || !horizontalScrollbarRef.current) {\n return;\n }\n\n const rawDelta = Math.abs(event.deltaX) > 0.01\n ? event.deltaX\n : event.shiftKey\n ? event.deltaY\n : 0;\n\n if (Math.abs(rawDelta) <= 0.01) {\n return;\n }\n\n const deltaScale = event.deltaMode === WheelEvent.DOM_DELTA_LINE\n ? 16\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\n ? Math.max(1, event.currentTarget.clientWidth)\n : 1;\n const previousScrollLeft = horizontalScrollbarRef.current.scrollLeft;\n const nextScrollLeft = syncHorizontalScrollLeft(previousScrollLeft + rawDelta * deltaScale);\n\n if (event.shiftKey && Math.abs(nextScrollLeft - previousScrollLeft) > 0.5) {\n event.preventDefault();\n }\n };\n\n const editingRowIds = useMemo(() => {\n const indexes = virtualized || groupingActive ? projectedDataIndexes : projectedDataIndexes.slice(pageStartIndex, pageStartIndex + pageSize);\n return indexes.map(index => state.rowIds[index]!);\n }, [projectedDataIndexes, state.rowIds, virtualized, groupingActive, pageStartIndex, pageSize]);\n const editingColumnIds = useMemo(() => visibleColumns.map(column => column.id), [visibleColumns]);\n const editingEnabled = cellSelection && Boolean(onChangeData) && !resolvedLoading && !resolvedLoadingMore;\n const reportClipboardError = (error: unknown) => onClipboardError?.(error instanceof Error ? error : new Error(\"Cell editing failed.\"));\n const canEditRange = (range: CominsCellRange) => isLoadedCellRange(range.anchor.rowId, range.focus.rowId);\n const cellFill = useCominsCellFill({\n enabled: fillHandle && editingEnabled, state, rowIds: editingRowIds, columnIds: editingColumnIds,\n root: tableRootRef, viewport: containerRef, addressAtPoint: getCellAddressFromPoint,\n canUseRange: canEditRange, registerGesture: registerActivePointerGesture,\n releaseGesture: cleanup => { if (activePointerGestureCleanupRef.current === cleanup) activePointerGestureCleanupRef.current = null; },\n scrollHorizontal: delta => syncHorizontalScrollLeft((horizontalScrollbarRef.current?.scrollLeft ?? 0) + delta),\n onFill: (source, target) => {\n if (!canEditRange(source) || !canEditRange(target)) return false;\n try {\n const current = stateRef.current, clipboardState = getClipboardState(current);\n const next = fillCominsCellRange(clipboardState, { source, target }, editingRowIds);\n if (next === clipboardState) return false;\n commitState({ ...next, columns: current.columns });\n return true;\n } catch (error) { reportClipboardError(error); return false; }\n },\n });\n const handleExternalPaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n if (!clipboardPaste || !editingEnabled || isNativeEditor(event.target) || event.defaultPrevented) return;\n const element = event.target instanceof Element ? event.target.closest<HTMLElement>(\"[data-comins-cell-column-id]\") : null;\n if (!element || element.closest(\"[data-comins-table-instance-id]\") !== tableRootRef.current) return;\n event.preventDefault(); event.stopPropagation();\n const current = stateRef.current;\n let target = { rowId: current.rowIds[Number(element.dataset.cominsDataIndex)]!, columnId: element.dataset.cominsCellColumnId! };\n if (current.selection.range) {\n const { anchor, focus } = current.selection.range;\n const firstRow = Math.min(editingRowIds.indexOf(anchor.rowId), editingRowIds.indexOf(focus.rowId));\n const firstColumn = Math.min(editingColumnIds.indexOf(anchor.columnId), editingColumnIds.indexOf(focus.columnId));\n if (firstRow >= 0 && firstColumn >= 0) target = { rowId: editingRowIds[firstRow]!, columnId: editingColumnIds[firstColumn]! };\n }\n try {\n const text = readCominsClipboardEvent(event.clipboardData);\n if (text === null) return;\n const matrix = parseCominsClipboardText(text);\n const start = editingRowIds.indexOf(target.rowId), end = Math.min(editingRowIds.length - 1, start + matrix.length - 1);\n if (viewportContext) {\n const absolute = viewportIndexById?.get(target.rowId);\n const expected = Math.min(matrix.length, viewportContext.data.rowCount - (absolute ?? 0));\n if (start < 0 || end - start + 1 !== expected || !isLoadedCellRange(target.rowId, editingRowIds[end]!)) throw new Error(\"Paste requires a contiguous loaded Viewport range.\");\n }\n const clipboardState = getClipboardState(current);\n const next = pasteCominsText(clipboardState, target, text, editingRowIds);\n if (next !== clipboardState) commitState({ ...next, columns: current.columns });\n } catch (error) { reportClipboardError(error); }\n };\n\n return (\n <div\n className={[\"comins-table comins-typography-base h-full w-full overflow-hidden\", densityClass, currentTheme.className, className]\n .filter(Boolean)\n .join(\" \")}\n aria-busy={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-comins-table-instance-id={tableInstanceId}\n data-comins-viewport-row-count={viewportContext?.data.rowCount}\n data-comins-viewport-blocks={viewportContext?.data.blocks.length}\n data-comins-viewport-requests={viewportContext?.data.requests.length}\n data-comins-viewport-height-blocks={viewportHeightIndex?.measuredBlockCount}\n data-comins-transfer-scope={normalizedTableTransfer?.scope}\n data-comins-transfer-table-id={normalizedTableTransfer?.tableId}\n data-filter-active={filteringActive ? \"true\" : undefined}\n data-loading={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-show-header={renderedHeaderVisible ? \"true\" : undefined}\n onPaste={handleExternalPaste}\n onCopy={(event) => {\n if (!clipboard || isNativeEditor(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n const result = prepareSelectionCopy();\n writeCominsClipboardEvent(event.clipboardData, result?.text ?? \"\");\n }}\n ref={tableRootRef}\n style={{ ...currentTheme.style, ...style }}\n tabIndex={-1}\n >\n {cellFill.menu}\n {renderedHeaderVisible ? (\n <div\n className=\"comins-table__header\"\n ref={headerRef}\n style={{ width: synchronizedHorizontalViewportWidth }}\n >\n <table\n className=\"comins-table__table comins-table__header-table min-w-full table-fixed\"\n style={{ width: tableWidth }}\n >\n {renderColumnSizing()}\n <thead className=\"comins-table__thead\">\n {headerRows.map((headerRow, rowIndex) => (\n <tr key={`header-row-${rowIndex}`}>\n {headerRow.map((cell, cellIndex) => renderHeaderCell(cell, cellIndex))}\n </tr>\n ))}\n </thead>\n </table>\n {hasHorizontalOverflow ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-table__horizontal-range-spacer\"\n style={{ width: synchronizedHorizontalContentWidth }}\n />\n ) : null}\n </div>\n ) : null}\n <div\n className=\"comins-table__body-viewport\"\n data-horizontal-overflow={hasHorizontalOverflow ? \"true\" : undefined}\n data-virtualized={virtualized ? \"true\" : undefined}\n data-testid={dataTestId}\n onFocusCapture={(event) => {\n const row = (event.target as Element).closest<HTMLElement>(\"[data-comins-row-data-index]\");\n const dataIndex = row ? Number(row.dataset.cominsRowDataIndex) : Number.NaN;\n\n focusedLeafDataIndexRef.current = Number.isInteger(dataIndex) ? dataIndex : null;\n }}\n onScroll={handleBodyScroll}\n onWheel={handleBodyWheel}\n ref={containerRef}\n >\n <table\n className={[\n \"comins-table__table comins-table__body-table min-w-full table-fixed\",\n virtualized ? \"comins-table__body-table--virtualized\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={\n virtualized\n ? {\n transform: `translate3d(0, ${rowWindow.renderOffset}px, 0)`,\n width: tableWidth,\n }\n : { width: tableWidth }\n }\n >\n {renderColumnSizing()}\n <tbody>\n {shouldRenderSkeleton\n ? Array.from({ length: resolvedSkeletonRowCount }).map((_, skeletonIndex) => (\n <tr\n aria-hidden=\"true\"\n className=\"comins-table__tr comins-table__skeleton-row\"\n data-comins-row-parity={skeletonIndex % 2 === 0 ? \"even\" : \"odd\"}\n data-testid=\"loading-skeleton-row\"\n key={`loading-skeleton-${skeletonIndex}`}\n style={{ height: rowHeight }}\n >\n {visibleColumns.length > 0 ? (\n visibleColumns.map((column) => {\n const pinnedColumn = getPinnedColumnAttributes(column.id);\n\n return (\n <td\n className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\"\n data-comins-pin-boundary={pinnedColumn.boundary ? \"true\" : undefined}\n data-comins-pinned={pinnedColumn.pinned}\n data-testid={`loading-skeleton-cell-${skeletonIndex}-${column.id}`}\n key={column.id}\n style={{ height: rowHeight, ...pinnedColumn.style }}\n >\n <span className=\"comins-table__skeleton-block\" />\n </td>\n );\n })\n ) : (\n <td className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\">\n <span className=\"comins-table__skeleton-block\" />\n </td>\n )}\n </tr>\n ))\n : null}\n {shouldRenderEmpty ? (\n <tr className=\"comins-table__tr comins-table__empty-state-row\" style={{ height: rowHeight }}>\n <td className=\"comins-table__td comins-table__empty-state-cell\" colSpan={Math.max(1, visibleColumns.length)}>\n <div data-testid=\"data-table-empty-state\" className=\"comins-table__empty-state\">\n {emptyContent?.render ? resolveDefaultRender(emptyContent.render(), \"표시할 데이터가 없습니다.\") : emptyComponent ?? \"표시할 데이터가 없습니다.\"}\n </div>\n </td>\n </tr>\n ) : null}\n {rowWindow.slots.map((slot, entryIndex) => {\n if (slot.kind === \"group\") {\n const node = orderedGroupModel?.groupsById.get(slot.groupId);\n\n if (!node) {\n return null;\n }\n\n const expanded = expandedGroupIdSet.has(slot.groupId);\n const isLastRenderedSlot = entryIndex === rowWindow.slots.length - 1;\n const isLastLogicalSlot = fullProjectionSlots.at(-1)?.key === slot.key;\n const virtualContentFillsViewport = rowWindow.scrollHeight >= containerHeight - 1;\n const isViewportEndRow =\n isLastRenderedSlot &&\n (virtualized\n ? isLastLogicalSlot && virtualContentFillsViewport\n : emptyFillerHeight === 0);\n const aggregateValues = Object.fromEntries(\n [...node.aggregationState].map(([columnId, aggregateState]) => [\n columnId,\n getCominsAggregateValue(aggregateState),\n ]),\n );\n const groupRenderParams = {\n aggregateValues,\n expanded,\n group: node.group,\n groupId: node.groupId,\n groupIndex: node.groupIndex,\n isEmpty: node.leafSourceIndexes.length === 0,\n rowCount: node.leafSourceIndexes.length,\n };\n const groupRowProps = rowGrouping?.getGroupRowProps?.(groupRenderParams);\n const groupRender = rowGrouping?.content?.render ?? rowGrouping?.renderGroupContent;\n const customContent = groupRender?.(groupRenderParams);\n const useDefaultGroupContent = !groupRender || (Boolean(rowGrouping?.content?.render) && customContent === undefined);\n const aggregateContent = Object.entries(aggregateValues).flatMap(([columnId, value]) => {\n if (value === null) {\n return [];\n }\n\n const column = state.columns.find((candidate) => candidate.id === columnId);\n\n return [\n <span className=\"comins-row-group-aggregate\" key={columnId}>\n {String(column?.label ?? columnId)}: {String(value)}\n </span>,\n ];\n });\n const groupDraggable =\n rowGrouping?.groupDraggable === true &&\n (typeof rowGrouping.onChangeGroups === \"function\" || Boolean(normalizedTableTransfer));\n const groupDropPosition =\n rowGroupMoveState?.targetTableId === undefined &&\n rowGroupMoveState?.targetGroupId === slot.groupId &&\n rowGroupMoveState.sourceGroupId !== slot.groupId\n ? rowGroupMoveState.position\n : undefined;\n const isRowDropTarget =\n rowMoveState?.targetTableId === undefined &&\n rowMoveState?.targetGroupId === slot.groupId;\n\n return (\n <tr\n className={[\n \"comins-table__tr comins-table__group-row\",\n groupRowProps?.className,\n isViewportEndRow ? \"comins-table__tr--viewport-end\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-comins-group-id={String(slot.groupId)}\n data-comins-group-index={node.groupIndex}\n data-comins-group-row=\"true\"\n data-comins-transfer-group-id={getCominsTransferIdentity(slot.groupId)}\n data-comins-group-drag-source={\n rowGroupMoveState?.sourceGroupId === slot.groupId ? \"true\" : undefined\n }\n data-comins-group-drop-position={groupDropPosition}\n data-comins-row-drop-valid={\n isRowDropTarget ? (rowMoveState.valid ? \"true\" : \"false\") : undefined\n }\n data-testid={`group-row-${encodeURIComponent(String(slot.groupId))}`}\n key={slot.key}\n style={{ ...groupRowProps?.style, height: rowHeight }}\n >\n <th\n className=\"comins-table__td comins-table__group-cell px-3 py-2\"\n colSpan={Math.max(1, visibleColumns.length)}\n scope=\"rowgroup\"\n style={{ height: rowHeight }}\n >\n <span className=\"comins-row-group-cell-content\">\n {groupDraggable ? (\n <CominsTableIconButton\n aria-label={`Move ${String(node.label)} group`}\n className=\"comins-row-group-drag-handle\"\n data-testid={`group-drag-handle-${encodeURIComponent(String(slot.groupId))}`}\n icon=\"columnMove\"\n onPointerDown={(event) => beginRowGroupHandlePointerDrag(event, slot.groupId)}\n />\n ) : null}\n <CominsTableIconButton\n aria-expanded={expanded}\n aria-label={`${expanded ? \"Collapse\" : \"Expand\"} ${String(node.label)} group`}\n className=\"comins-row-group-expander\"\n data-testid={`group-toggle-${encodeURIComponent(String(slot.groupId))}`}\n disabled={typeof rowGrouping?.onChangeExpandedGroupIds !== \"function\"}\n icon={expanded ? \"disclosureExpanded\" : \"disclosureCollapsed\"}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n toggleRowGroup(slot.groupId);\n }}\n ref={createDisclosureElementRef(groupDisclosureElementsRef, slot.groupId)}\n />\n <span className=\"comins-row-group-content\">\n {!useDefaultGroupContent ? customContent : (\n <>\n <span className=\"comins-row-group-label\">{node.label}</span>\n <span className=\"comins-row-group-count\">\n {node.leafSourceIndexes.length} Rows\n </span>\n {aggregateContent}\n </>\n )}\n </span>\n </span>\n </th>\n </tr>\n );\n }\n\n if (slot.kind === \"placeholder\") {\n const request = viewportContext?.data.requests.find(request => request.startIndex <= slot.absoluteIndex && request.endIndex > slot.absoluteIndex);\n return (\n <tr className=\"comins-table__tr comins-table__skeleton-row\" data-testid=\"viewport-placeholder\" data-comins-absolute-index={slot.absoluteIndex} key={slot.key} style={{ height: slot.height }}>\n {visibleColumns.map((column, columnIndex) => <td className=\"comins-table__td comins-table__skeleton-cell\" key={column.id} style={{ height: slot.height, ...getPinnedColumnAttributes(column.id).style }}>{request?.status === \"error\" && columnIndex === 0 ? <button type=\"button\" data-testid=\"viewport-retry\" onClick={() => retryViewport(slot.absoluteIndex)}>Retry loading rows</button> : <span className=\"comins-table__skeleton-block\" />}</td>)}\n </tr>\n ); }\n const entry = slot;\n const actualRowStyleHeight = entry.autoHeight ? \"auto\" : entry.rowHeight ?? rowHeight;\n const rowRuntimeProps = resolveRowProps(effectiveRowProps, entry.row, entry.visibleIndex);\n const isRowSelected = selectedRowIdSet.has(entry.rowId);\n const isLastRenderedSlot = entryIndex === rowWindow.slots.length - 1;\n const isLastLogicalRow = fullProjectionSlots.at(-1)?.key === entry.key;\n const virtualContentFillsViewport = rowWindow.scrollHeight >= containerHeight - 1;\n const isViewportEndRow =\n isLastRenderedSlot &&\n (virtualized\n ? isLastLogicalRow && virtualContentFillsViewport\n : emptyFillerHeight === 0);\n const rowCustomBackground = getRowCustomBackground(rowRuntimeProps.style);\n const rowRenderKey =\n virtualized && (rowWindow.mixed || rowDetailEnabled)\n ? entry.key\n : virtualized\n ? `virtual-row-slot-${entryIndex}`\n : String(entry.rowId);\n const rowDetailParams: CominsRowDetailParams<TData> = { row: createEventRow(entry) };\n const rowDetailExpandable = rowDetailEnabled && (isRowExpandable?.(rowDetailParams) ?? true);\n const rowDetailExpanded = rowDetailExpandable && effectiveExpandedRowIdSet.has(entry.rowId);\n const rowDetailFixedHeight =\n rowDetailExpanded && entry.detail?.mode === \"fixed\"\n ? entry.detail.height\n : undefined;\n const rowDetailMode = entry.detail?.mode ?? \"fixed\";\n const rowDetailIdToken = `${typeof entry.rowId}-${encodeURIComponent(String(entry.rowId))}`;\n const rowDetailId = `comins-row-detail-${encodeURIComponent(rowDetailIdPrefix)}-${rowDetailIdToken}`;\n const rowDetailContentId = `${rowDetailId}-content`;\n const rowDetailToggleId = `${rowDetailId}-toggle`;\n\n return (\n <Fragment key={rowRenderKey}>\n {\n rowMoveState?.targetTableId === undefined &&\n rowMoveState?.targetDataIndex === entry.dataIndex &&\n rowMoveState.sourceRowId !== entry.rowId ? (\n <tr\n aria-hidden=\"true\"\n className=\"comins-row-move-placeholder\"\n data-comins-row-drop-valid={rowMoveState.valid ? \"true\" : \"false\"}\n >\n <td colSpan={Math.max(1, visibleColumns.length)}>\n <div data-testid=\"row-move-placeholder\">이 위치로 이동</div>\n </td>\n </tr>\n ) : null}\n <tr\n aria-disabled={rowRuntimeProps.disabled ? \"true\" : undefined}\n ref={entry.autoHeight ? element => registerDetailElement(entry.rowId, \"auto\", element, \"row\") : undefined}\n data-comins-row-auto-height={entry.autoHeight ? \"true\" : undefined}\n aria-selected={isRowSelected}\n className={[\n \"comins-table__tr\",\n isViewportEndRow && !rowDetailExpanded ? \"comins-table__tr--viewport-end\" : undefined,\n isRowSelected ? \"comins-row-selected\" : undefined,\n rowRuntimeProps.className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-disabled={rowRuntimeProps.disabled ? \"true\" : undefined}\n data-comins-row-custom-background={rowCustomBackground === undefined ? undefined : \"true\"}\n data-comins-row-data-index={entry.dataIndex}\n data-comins-absolute-index={entry.absoluteIndex}\n data-comins-tree-drop={treeContext?.drag.preview?.context.target.rowId === entry.rowId ? treeContext.drag.preview.context.position : undefined}\n data-comins-tree-drop-valid={treeContext?.drag.preview?.context.target.rowId === entry.rowId ? String(treeContext.drag.preview.valid) : undefined}\n data-comins-row-parity={entry.visibleIndex % 2 === 0 ? \"even\" : \"odd\"}\n data-comins-transfer-row-id={getCominsTransferIdentity(entry.rowId)}\n data-row-draggable={rowRuntimeProps.draggable ? \"true\" : \"false\"}\n data-selected-row={isRowSelected ? \"true\" : undefined}\n data-testid={`row-${String(entry.rowId)}`}\n draggable={false}\n key={rowRenderKey}\n onClick={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n if (rowSelectionOnClick && !(event as React.MouseEvent<HTMLTableRowElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled) {\n selectRowFromInteraction(event, entry);\n }\n onClickRow?.(createRowPayload(event, entry));\n }}\n onContextMenu={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n if (rowSelectionOnClick) commitState((current) => selectRowForContextMenu(current, entry.rowId));\n lastRowAnchorRef.current = entry.rowId;\n onContextMenuRow?.(createRowPayload(event, entry));\n }}\n onDoubleClick={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n onDoubleClickRow?.(createRowPayload(event, entry));\n }}\n onKeyDown={(event) => handleRowKeyDown(event, entry, rowRuntimeProps.disabled)}\n style={{ ...getResolvedRowStyle(rowHeight, rowRuntimeProps.style, rowCustomBackground), ...(getRowHeight ? { height: actualRowStyleHeight } : {}) }}\n tabIndex={rowRuntimeProps.disabled ? -1 : 0}\n >\n {visibleColumns.map((column, columnIndex) => {\n const pinnedColumn = getPinnedColumnAttributes(column.id);\n const rawValue = getCominsCellValue(state, entry.row, column.id);\n const address = { columnId: column.id, rowId: entry.rowId };\n const isCellInRange = cellSelection && isCominsCellInSelectedRange(\n state,\n address,\n getSelectionRowOrder(),\n );\n const isCellSelected = cellSelection && isCominsCellSelected(state, address);\n // 기본 셀은 콜백용 payload를 사용하지 않으므로 설정이 있을 때만 생성한다.\n const cellPayload = column.cell ? createCellComponentPayload(\n entry,\n rowRuntimeProps.disabled,\n isRowSelected,\n state.selection.rowIds.length,\n column,\n columnIndex,\n rawValue,\n ) : undefined;\n const cellProps = cellPayload ? resolveRenderableCellProps(column, cellPayload) : undefined;\n const cellDisabled = rowRuntimeProps.disabled || (cellPayload !== undefined && isRenderableCellDisabled(cellProps, cellPayload));\n const componentInteraction: CominsBuiltInComponentInteraction = {\n requestRowSelection: ({ event, mode }) => {\n if (cellDisabled) {\n return false;\n }\n\n if (mode === \"exclusive\") {\n commitState((current) => selectRow(current, entry.rowId));\n lastRowAnchorRef.current = entry.rowId;\n return true;\n }\n\n selectRowFromInteraction(event, entry);\n return true;\n },\n };\n const cellClassName = cellPayload ? toClassName(getRenderableCellClassName(cellProps, cellPayload)) : undefined;\n const cellStyle = cellPayload ? getRenderableCellStyle(cellProps, cellPayload) : undefined;\n const hasCellComponents = Boolean(column.cell?.components?.length);\n const configuredCellValue = cellPayload ? formatRenderableCellValue(column, cellPayload) : deferredDefaultCellValue;\n const cellComponents = column.cell?.components?.map((component) => {\n if (component.type !== \"input\") {\n return component;\n }\n\n const onValueChange = component.onValueChange;\n\n return {\n ...component,\n onValueChange: (payload) => {\n commitState((current) =>\n updateCominsRows(current, [\n {\n id: payload.row.id,\n patch: (currentRow) =>\n setCominsNestedInputValue(currentRow, payload.column.field, payload.value),\n },\n ]),\n );\n onValueChange?.(payload);\n },\n } satisfies CominsCellComponent<TData>;\n });\n const visibleCellComponents = cellPayload ? getRenderableCominsComponents(cellComponents, cellPayload) : [];\n const cellRender = column.cell?.render ?? column.cell?.renderer;\n const customCellContent = cellRender?.(cellPayload!);\n const useDefaultCellContent = !cellRender || (Boolean(column.cell?.render) && customCellContent === undefined);\n const formattedCellValue = configuredCellValue === deferredDefaultCellValue\n ? useDefaultCellContent && visibleCellComponents.length === 0\n ? rawValue == null ? \"\" : String(rawValue)\n : undefined\n : configuredCellValue;\n const cellContent = !useDefaultCellContent ? customCellContent : hasCellComponents ? (\n renderCominsContentWithComponents(formattedCellValue, cellComponents, cellPayload!, {\n interaction: componentInteraction,\n showContent: false,\n })\n ) : (\n <span className=\"comins-table__cell-value\">{formattedCellValue}</span>\n );\n const tooltip =\n typeof column.cell?.tooltip === \"function\" ? column.cell.tooltip(cellPayload!) : column.cell?.tooltip;\n const tooltipConfig = column.cell?.tooltip;\n const customTooltip = typeof tooltipConfig === \"object\" && tooltipConfig !== null ? tooltipConfig : undefined;\n const tooltipKey = JSON.stringify([typeof entry.rowId, entry.rowId, column.id]);\n if (cellTooltip.active?.ready && cellTooltip.active.key === tooltipKey && customTooltip?.render) {\n activeCellTooltipContent = customTooltip.render(cellPayload!);\n }\n const treeEntry =\n column.id === treeContext?.treeColumnId\n ? treeContext.entriesByRowId.get(entry.rowId)\n : undefined;\n const treeSlots = treeContext?.slots;\n const treeSlotParams = treeEntry ? { ...treeEntry, defaultContent: cellContent } : null;\n const hasTreeSlots = Boolean(treeSlots?.leading || treeSlots?.content || treeSlots?.trailing);\n const renderedCellContent = treeEntry ? (\n <span\n className={`comins-tree-cell-content${hasTreeSlots ? \" comins-tree-cell-content--slots\" : \"\"}`}\n style={{ \"--comins-tree-depth\": treeEntry.depth } as React.CSSProperties}\n >\n {treeEntry.hasChildren ? (\n <CominsTableIconButton\n aria-expanded={treeEntry.expanded}\n aria-label={`${treeEntry.expanded ? \"Collapse\" : \"Expand\"} ${String(entry.rowId)}`}\n className=\"comins-tree-expander\"\n data-testid={`tree-expander-${String(entry.rowId)}`}\n icon={treeEntry.expanded ? \"disclosureExpanded\" : \"disclosureCollapsed\"}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n treeContext?.onToggle(entry.rowId);\n }}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n />\n ) : (\n <span aria-hidden=\"true\" className=\"comins-tree-expander-spacer\" />\n )}\n {treeSlotParams && treeSlots?.leading ? renderTreeSlot(\"leading\", resolveTreeSlotContent(treeSlots.leading, treeSlotParams)) : null}\n <span className=\"comins-tree-cell-value\">\n {treeSlotParams && treeSlots?.content ? renderTreeSlot(\"content\", resolveTreeSlotContent(treeSlots.content, treeSlotParams, cellContent)) : cellContent}\n </span>\n {treeSlotParams && treeSlots?.trailing ? renderTreeSlot(\"trailing\", resolveTreeSlotContent(treeSlots.trailing, treeSlotParams)) : null}\n </span>\n ) : (\n cellContent\n );\n\n return (\n <td\n aria-disabled={cellDisabled ? \"true\" : undefined}\n className={[\n \"comins-table__td px-3 py-2\",\n isCellInRange ? \"comins-cell-range-selected\" : undefined,\n cellFill.isPreview(address) ? \"comins-cell-fill-preview\" : undefined,\n cellClassName,\n ]\n .filter(Boolean)\n .join(\" \")}\n\t data-disabled={cellDisabled ? \"true\" : undefined}\n\t data-comins-cell-column-id={column.id}\n\t data-comins-component-cell={visibleCellComponents.length > 0 ? \"true\" : undefined}\n data-comins-data-index={entry.dataIndex}\n data-comins-pin-boundary={pinnedColumn.boundary ? \"true\" : undefined}\n data-comins-pinned={pinnedColumn.pinned}\n data-range-selected={isCellInRange ? \"true\" : undefined}\n data-selected={isCellSelected ? \"true\" : undefined}\n data-testid={`cell-${String(entry.rowId)}-${column.id}`}\n draggable={false}\n key={column.id}\n onClick={(event) => {\n if (onClickCell) {\n event.stopPropagation();\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (rangeDragMovedRef.current) {\n rangeDragMovedRef.current = false;\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n return;\n }\n\n const anchor = cellSelection ? (state.selection.cell ?? lastCellAnchorRef.current) : null;\n\n if (event.shiftKey && anchor) {\n if (!isLoadedCellRange(anchor.rowId, address.rowId)) { event.preventDefault(); event.stopPropagation(); return; }\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastCellAnchorRef.current = anchor;\n commitState((current) => {\n const nextRows = !rowSelectionOnClick ? current :\n lastRowAnchorRef.current !== null\n ? selectRows(\n current,\n getVisibleRowIdsBetween(current, lastRowAnchorRef.current, entry.rowId),\n )\n : selectRow(current, entry.rowId);\n\n return selectCellRange(nextRows, { anchor, focus: address });\n });\n lastRowAnchorRef.current = entry.rowId;\n return;\n }\n\n if (cellSelection) {\n lastCellAnchorRef.current = address;\n }\n\n commitState((current) => {\n const nextRows = !rowSelectionOnClick ? current : selectRow(current, entry.rowId, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n });\n\n return cellSelection\n ? selectCell(nextRows, address, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n })\n : nextRows;\n });\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastRowAnchorRef.current = entry.rowId;\n onClickCell?.(createCellPayload(event, entry, column, columnIndex, rawValue));\n }}\n onContextMenu={(event) => {\n if ((event.target as Element).closest(\".comins-row-detail-expander\")) {\n event.stopPropagation();\n return;\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n commitState((current) => {\n const nextRows = rowSelectionOnClick ? selectRowForContextMenu(current, entry.rowId) : current;\n const alreadySelected = isCominsCellSelected(current, address)\n || isCominsCellInSelectedRange(current, address, getSelectionRowOrder());\n return cellSelection && !alreadySelected ? selectCell(nextRows, address) : nextRows;\n });\n lastRowAnchorRef.current = entry.rowId;\n\n if (cellSelection) {\n lastCellAnchorRef.current = address;\n }\n\n if (onContextMenuCell) {\n event.stopPropagation();\n onContextMenuCell(createCellPayload(event, entry, column, columnIndex, rawValue));\n }\n }}\n onDoubleClick={(event) => {\n if ((event.target as Element).closest(\".comins-row-detail-expander\")) {\n event.stopPropagation();\n return;\n }\n\n if (onDoubleClickCell) {\n event.stopPropagation();\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n onDoubleClickCell?.(createCellPayload(event, entry, column, columnIndex, rawValue));\n }}\n data-comins-tooltip-key={customTooltip?.render ? tooltipKey : undefined}\n onFocusCapture={(event) => { if (customTooltip?.render) cellTooltip.enter(tooltipKey, event.currentTarget, \"focus\"); }}\n onBlurCapture={(event) => { if (!event.currentTarget.contains(event.relatedTarget as Node | null)) cellTooltip.leave(tooltipKey, \"focus\"); }}\n onKeyDown={(event) => handleCellKeyDown(event, entry, column, columnIndex, address, cellDisabled)}\n onMouseDown={(event) => beginCellRangeDrag(event, address, cellDisabled)}\n onMouseOver={(event) => {\n if (event.buttons === 1 && !activePointerGestureCleanupRef.current) {\n updateCellRangeDrag(address);\n }\n }}\n onMouseUp={endCellRangeDrag}\n onPointerDown={(event) => beginCellRangePointerDrag(event, address, cellDisabled)}\n onPointerEnter={(event) => {\n if (customTooltip?.render && event.buttons === 0) cellTooltip.enter(tooltipKey, event.currentTarget, \"hover\");\n if (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\n onPointerLeave={() => cellTooltip.leave(tooltipKey, \"hover\")}\n onPointerMove={(event) => {\n if (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\n onPointerUp={endCellRangeDrag}\n style={{ height: rowHeight, ...cellStyle, ...pinnedColumn.style, ...(getRowHeight ? { height: actualRowStyleHeight } : {}) }}\n title={typeof tooltip === \"string\" ? tooltip : undefined}\n tabIndex={cellDisabled ? -1 : 0}\n >\n {columnIndex === 0 && (rowDetailEnabled || rowRuntimeProps.draggable) ? (\n <div className=\"comins-row-cell-content\">\n <span className=\"comins-row-leading-controls\">\n {rowDetailEnabled ? (\n rowDetailExpandable ? (\n <CominsRowDetailToggle\n controlsId={rowDetailContentId}\n disabled={!onChangeExpandedRowIds}\n expanded={rowDetailExpanded}\n id={rowDetailToggleId}\n label={`${rowDetailExpanded ? \"Collapse\" : \"Expand\"} ${String(entry.rowId)} details`}\n onElement={createDisclosureElementRef(rowDetailToggleElementsRef, entry.rowId)}\n onToggle={() => toggleRowDetail(entry.rowId, rowDetailExpandable)}\n testId={`row-detail-toggle-${String(entry.rowId)}`}\n />\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"comins-row-detail-expander-spacer\"\n data-comins-row-leading-control=\"disclosure\"\n />\n )\n ) : null}\n {rowRuntimeProps.draggable && treeContext ? (\n <button\n type=\"button\"\n aria-label={`Move ${String(entry.rowId)}`}\n className=\"comins-row-drag-handle\"\n data-comins-tree-drag-handle=\"true\"\n data-testid={`row-drag-handle-${String(entry.rowId)}`}\n disabled={rowRuntimeProps.disabled}\n onClick={(event) => { event.preventDefault(); event.stopPropagation(); }}\n onPointerDown={(event) => { if (!rowRuntimeProps.disabled) treeContext.drag.onPointerDown(event, createEventRow(entry)); }}\n onKeyDown={(event) => treeContext.drag.onKeyDown(event, createEventRow(entry))}\n />\n ) : rowRuntimeProps.draggable ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-row-drag-handle\"\n data-comins-row-leading-control=\"drag\"\n data-testid={`row-drag-handle-${String(entry.rowId)}`}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) =>\n beginRowHandlePointerDrag(\n event,\n entry,\n rowRuntimeProps.disabled,\n rowRuntimeProps.draggable,\n )\n }\n />\n ) : null}\n </span>\n <div className=\"comins-row-cell-content__value\">{renderedCellContent}</div>\n </div>\n ) : (\n renderedCellContent\n )}\n {!cellDisabled && cellFill.handleAddress?.rowId === address.rowId && cellFill.handleAddress.columnId === address.columnId ? cellFill.handle : null}\n </td>\n );\n })}\n </tr>\n {rowDetailExpanded ? (\n <CominsRowDetailRow\n colSpan={visibleColumns.length}\n contentId={rowDetailContentId}\n fixedHeight={rowDetailFixedHeight}\n labelId={rowDetailToggleId}\n onContentElement={(element) =>\n registerDetailElement(entry.rowId, rowDetailMode, element)\n }\n ownerId={String(entry.rowId)}\n testId={`row-detail-content-${String(entry.rowId)}`}\n getToggleElement={() => rowDetailToggleElementsRef.current.get(entry.rowId) ?? null}\n restoreFocus={detailFocusRestorer.restore}\n >\n {resolvedRowDetailRender?.(rowDetailParams)}\n </CominsRowDetailRow>\n ) : null}\n </Fragment>\n );\n })}\n {shouldRenderInfiniteLoadingRow ? (\n <tr className=\"comins-table__tr comins-table__infinite-loading-row\" style={{ height: rowHeight }}>\n <td\n className=\"comins-table__td comins-table__infinite-loading-cell\"\n colSpan={Math.max(1, visibleColumns.length)}\n data-testid=\"data-table-infinite-loading-row\"\n >\n <span className=\"comins-table__loading-spinner\" data-testid=\"data-table-infinite-loading-spinner\" />\n <span>데이터를 불러오는 중입니다.</span>\n </td>\n </tr>\n ) : null}\n {emptyFillerHeight > 0 ? (\n <tr aria-hidden=\"true\" className=\"comins-table-empty-filler\">\n <td\n colSpan={Math.max(1, visibleColumns.length)}\n data-testid=\"table-empty-filler\"\n style={{ height: emptyFillerHeight }}\n />\n </tr>\n ) : null}\n </tbody>\n </table>\n {virtualized ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-table__body-virtual-sizer\"\n style={{ height: rowWindow.scrollHeight, width: tableWidth }}\n />\n ) : null}\n {resolvedLoading && !isEmpty ? (\n <div\n className=\"comins-table__loading-overlay\"\n data-testid=\"data-table-loading-overlay\"\n role=\"status\"\n style={{ transform: `translate(${containerRef.current?.scrollLeft ?? 0}px, ${scrollTop}px)`, width: containerRef.current?.clientWidth }}\n >\n <span className=\"comins-table__loading-spinner\" data-testid=\"data-table-loading-spinner\" />\n <span>{loadingContent?.render ? resolveDefaultRender(loadingContent.render(), \"불러오는 중입니다.\") : loadingComponent ?? \"불러오는 중입니다.\"}</span>\n </div>\n ) : null}\n </div>\n {summary ? (\n <div\n aria-label=\"Table summary\"\n className=\"comins-table__summary\"\n ref={footerRef}\n style={{ width: synchronizedHorizontalViewportWidth }}\n >\n <table className=\"comins-table__table comins-table__summary-table min-w-full table-fixed\" style={{ width: tableWidth }}>\n {renderColumnSizing()}\n <tfoot>\n <tr\n className={[\"comins-table__summary-row\", summary.className].filter(Boolean).join(\" \")}\n style={summary.style}\n >\n {summaryCells.flatMap((cell) =>\n getCominsColumnPinningSpanFragments(\n columnPinning,\n cell.startIndex,\n cell.colSpan,\n ).map((fragment, fragmentIndex) => {\n const fragmentStyle = fragment.pinned\n ? {\n [fragment.pinned]: fragment.offset,\n position: \"sticky\",\n } as React.CSSProperties\n : undefined;\n\n return (\n <td\n className={[\"comins-table__summary-cell px-3 py-2\", cell.className].filter(Boolean).join(\" \")}\n colSpan={fragment.colSpan}\n data-comins-pin-boundary={fragment.boundary ? \"true\" : undefined}\n data-comins-pinned={fragment.pinned}\n data-comins-summary-column-id={fragmentIndex === 0 ? cell.column.id : undefined}\n data-testid={fragmentIndex === 0 ? `summary-cell-${cell.column.id}` : undefined}\n key={`${cell.column.id}-${fragment.startIndex}`}\n style={{ ...cell.style, ...fragmentStyle }}\n >\n {fragmentIndex === 0 ? cell.value : null}\n </td>\n );\n }),\n )}\n </tr>\n </tfoot>\n </table>\n {hasHorizontalOverflow ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-table__horizontal-range-spacer\"\n style={{ width: synchronizedHorizontalContentWidth }}\n />\n ) : null}\n </div>\n ) : null}\n {hasHorizontalOverflow ? (\n <div\n aria-label=\"Table horizontal scroll\"\n className=\"comins-table__horizontal-scrollbar\"\n data-testid=\"table-horizontal-scrollbar\"\n onScroll={(event) => {\n if (Math.abs(event.currentTarget.scrollLeft - synchronizedScrollLeftRef.current) > 0.5) {\n syncHorizontalScrollLeft(event.currentTarget.scrollLeft);\n }\n }}\n ref={horizontalScrollbarRef}\n role=\"region\"\n style={{ width: synchronizedHorizontalScrollbarWidth }}\n tabIndex={0}\n >\n <div\n aria-hidden=\"true\"\n className=\"comins-table__horizontal-scrollbar-content\"\n style={{ width: synchronizedHorizontalContentWidth }}\n />\n </div>\n ) : null}\n {cellTooltip.active ? <CominsCellTooltip controller={cellTooltip} content={activeCellTooltipContent} /> : null}\n {movingHeaderLabel && columnMovePointer ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-column-move-ghost\"\n data-testid=\"column-move-ghost\"\n style={{ left: columnMovePointer.x + 12, top: columnMovePointer.y + 12 }}\n >\n <CominsTableIcon name=\"columnMove\" />\n <span className=\"comins-column-move-ghost__label\">{movingHeaderLabel}</span>\n </div>\n ) : null}\n {transferRejectionFeedback ? (\n <CominsPointerTooltip\n icon={<span className=\"comins-tooltip-surface__warning\">!</span>}\n tone=\"danger\"\n x={transferRejectionFeedback.x}\n y={transferRejectionFeedback.y}\n >\n {transferRejectionFeedback.content}\n </CominsPointerTooltip>\n ) : null}\n {treeContext ? <span className=\"comins-table__sr-only\" role=\"status\" aria-live=\"polite\">{treeContext.drag.announcement}</span> : null}\n </div>\n );\n}\n\nfunction CominsTreeTableInner<TData>(\n {\n data,\n columnFiltering: _columnFiltering,\n defaultExpandAll = true,\n estimatedRowDetailHeight: _estimatedRowDetailHeight,\n expandedRowIds: _expandedRowIds,\n getRowDetailHeight: _getRowDetailHeight,\n getRowId,\n hasMoreRows: _hasMoreRows,\n infiniteScroll: _infiniteScroll,\n infiniteScrollThreshold: _infiniteScrollThreshold,\n lazyLoad: _lazyLoad,\n lazyLoadBatchSize: _lazyLoadBatchSize,\n lazyLoadMode: _lazyLoadMode,\n lazyLoadThreshold: _lazyLoadThreshold,\n loadingMore: _loadingMore,\n onChangeData,\n onChangeExpandedRowIds: _onChangeExpandedRowIds,\n onChangeSort,\n onChangeSortModel,\n onLazyLoad: _onLazyLoad,\n onLoadMore: _onLoadMore,\n rowGrouping: _rowGrouping,\n tableTransfer: _tableTransfer,\n rowProps,\n treeRowDrag,\n treeSlots,\n onBeforeRowDrag,\n onRowDrag,\n onAfterDragRow,\n isRowExpandable: _isRowExpandable,\n renderRowDetail: _renderRowDetail,\n rowDetail: _rowDetail,\n tree: _tree,\n ...props\n }: CominsTreeTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n const initialDefaultExpandAll = useRef(defaultExpandAll).current;\n const [treeSortModel, setTreeSortModel] = useState<CominsSortModel>([]);\n const treeColumns = useMemo(\n () =>\n props.columns.map((column, index) =>\n ({\n ...column,\n lockPosition: index === 0 ? true : column.lockPosition,\n pinned: undefined,\n }),\n ),\n [props.columns],\n );\n const treeColumnId = treeColumns[0]?.id ?? treeColumns[0]?.field ?? null;\n const sortedTree = useMemo(\n () => getSortedReactTree(data, treeColumns, treeSortModel),\n [data, treeColumns, treeSortModel],\n );\n const visibleTreeRows = useMemo(\n () => flattenCominsTree(sortedTree, getRowId, { defaultExpandAll: initialDefaultExpandAll }),\n [getRowId, initialDefaultExpandAll, sortedTree],\n );\n const entriesByRowId = useMemo(\n () => new Map(visibleTreeRows.map((entry) => [entry.rowId, entry] as const)),\n [visibleTreeRows],\n );\n const treeDrag = useCominsTreeDrag({ data, entries: visibleTreeRows, getRowId, config: treeRowDrag, rowProps, sorted: treeSortModel.length > 0, onChangeData, onBeforeRowDrag, onRowDrag, onAfterDragRow });\n const treeContext = useMemo<CominsTreeRenderContext<TData>>(\n () => ({\n drag: treeDrag,\n entriesByRowId,\n onExpand: (nodeIds) => {\n const nextData = setCominsTreeExpansion(data, nodeIds, true, getRowId, initialDefaultExpandAll);\n\n if (nextData !== data) {\n onChangeData?.([...nextData]);\n }\n },\n onFold: (nodeIds) => {\n const nextData = setCominsTreeExpansion(data, nodeIds, false, getRowId, initialDefaultExpandAll);\n\n if (nextData !== data) {\n onChangeData?.([...nextData]);\n }\n },\n onToggle: (rowId) =>\n onChangeData?.(toggleCominsTreeNode(data, rowId, getRowId, { defaultExpandAll: initialDefaultExpandAll })),\n summaryRows: getCominsTreeLeafItems(data),\n treeColumnId,\n slots: treeSlots,\n }),\n [data, entriesByRowId, getRowId, initialDefaultExpandAll, onChangeData, treeColumnId, treeDrag, treeSlots],\n );\n const handleFlatDataChange = (nextRows: TData[]) => {\n let nextTree: readonly CominsTreeNode<TData>[] = data;\n\n nextRows.forEach((nextItem, index) => {\n const entry = visibleTreeRows[index];\n\n if (entry && entry.item !== nextItem) {\n nextTree = updateCominsTreeItem(nextTree, entry.rowId, getRowId, () => nextItem);\n }\n });\n\n if (nextTree !== data) {\n onChangeData?.([...nextTree]);\n }\n };\n const flatProps: CominsTableProps<TData> = {\n ...props,\n columns: treeColumns,\n data: visibleTreeRows.map((entry) => entry.item),\n getRowId,\n hasMoreRows: false,\n infiniteScroll: false,\n infiniteScrollThreshold: undefined,\n lazyLoad: false,\n lazyLoadBatchSize: undefined,\n lazyLoadMode: undefined,\n lazyLoadThreshold: undefined,\n loadingMore: false,\n onChangeData: onChangeData ? handleFlatDataChange : undefined,\n onChangeSort,\n onChangeSortModel: (nextSortModel) => {\n setTreeSortModel(nextSortModel);\n onChangeSortModel?.(nextSortModel);\n },\n onLazyLoad: undefined,\n onLoadMore: undefined,\n pagination: { pageIndex: 0, pageSize: Math.max(1, visibleTreeRows.length) },\n rowProps: { ...rowProps, draggable: treeRowDrag && onChangeData && treeSortModel.length === 0 ? rowProps?.draggable ?? true : false },\n tree: false,\n };\n\n return <ForwardedCominsTableInner {...flatProps} ref={ref} treeContext={treeContext} />;\n}\n\nconst ForwardedCominsTableInner = forwardRef(CominsTableInner) as <TData, TGroup = unknown>(\n props: CominsTableInnerProps<TData, TGroup> & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nconst ForwardedCominsTreeTableInner = forwardRef(CominsTreeTableInner) as <TData>(\n props: CominsTreeTableProps<TData> & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nexport type CominsViewportTableProps<TData> = Omit<CominsFlatTableBaseProps<TData>, \"data\" | \"getRowId\" | \"onChangeData\" | \"viewportDatasource\" | \"virtualized\" | \"pagination\" | \"lazyLoad\" | \"infiniteScroll\" | \"hasMoreRows\" | \"loadingMore\" | \"onLazyLoad\" | \"onLoadMore\" | \"summary\" | \"onBeforeRowDrag\" | \"onRowDrag\" | \"onAfterDragRow\"> & {\n data: CominsViewportData<TData>;\n viewportDatasource: CominsViewportDatasource;\n getRowId: (row: TData, index: number) => CominsRowId;\n onViewportRequest: (request: CominsViewportRequest) => void | Promise<void>;\n onChangeData?: (data: CominsViewportData<TData>) => void;\n virtualized?: true;\n pagination?: never;\n lazyLoad?: never;\n infiniteScroll?: never;\n hasMoreRows?: never;\n loadingMore?: never;\n onLazyLoad?: never;\n onLoadMore?: never;\n summary?: never;\n rowGrouping?: never;\n columnFiltering?: never;\n tableTransfer?: never;\n renderRowDetail?: never;\n rowDetail?: never;\n};\n\nfunction CominsViewportTableInner<TData>(props: CominsViewportTableProps<TData>, ref: React.ForwardedRef<CominsTableRef<TData>>) {\n const snapshot = useMemo(() => props.data.revision === props.viewportDatasource.revision ? props.data : createCominsViewportData<TData>({ revision: props.viewportDatasource.revision, rowCount: props.data.rowCount, blockSize: props.data.blockSize, cacheSize: props.data.cacheSize }), [props.data, props.viewportDatasource.revision]);\n const loaded = useMemo(() => {\n if (!Number.isSafeInteger(snapshot.rowCount) || snapshot.rowCount < 0 || !Number.isSafeInteger(snapshot.blockSize) || snapshot.blockSize <= 0 || !Number.isSafeInteger(snapshot.cacheSize) || snapshot.cacheSize <= 0) throw new Error(\"Invalid Viewport snapshot\");\n const indices: number[] = [], rows: TData[] = [];\n const ids = new Set<CominsRowId>();\n let previousEnd = 0;\n for (const block of [...snapshot.blocks].sort((a, b) => a.startIndex - b.startIndex)) {\n if (!Number.isSafeInteger(block.startIndex) || block.startIndex < previousEnd || block.startIndex % snapshot.blockSize !== 0 || block.startIndex >= snapshot.rowCount || block.rows.length !== Math.min(snapshot.blockSize, snapshot.rowCount - block.startIndex)) throw new Error(\"Invalid Viewport block range\");\n for (const [offset, row] of block.rows.entries()) {\n if (row === undefined || row === null) throw new Error(\"Missing Viewport business row\");\n const index = block.startIndex + offset;\n const id = props.getRowId(row, index);\n if (ids.has(id)) throw new Error(`Duplicate viewport row id: ${String(id)}`);\n ids.add(id); indices.push(index); rows.push(row);\n }\n previousEnd = block.startIndex + block.rows.length;\n }\n return { indices, rows };\n }, [snapshot.blocks, snapshot.blockSize, snapshot.cacheSize, snapshot.rowCount, props.getRowId]);\n const rowId = useMemo(() => (row: TData, index: number) => props.getRowId(row, loaded.indices[index]!), [props.getRowId, loaded.indices]);\n const columns = useMemo(() => props.columns.map(column => ({ ...column, sort: false, filter: undefined })), [props.columns]);\n return <ForwardedCominsTableInner\n {...props}\n ref={ref}\n data={loaded.rows}\n columns={columns}\n getRowId={rowId}\n onChangeData={props.onChangeData ? next => {\n const changes = next.flatMap((row, index) => row !== loaded.rows[index] && loaded.indices[index] !== undefined ? [{ index: loaded.indices[index]!, row }] : []);\n const updated = reduceCominsViewportData(snapshot, { type: \"patch\", changes });\n if (updated !== snapshot) props.onChangeData?.(updated);\n } : undefined}\n viewportDatasource={undefined}\n viewportContext={{ data: snapshot, indices: loaded.indices, config: props.viewportDatasource, onRequest: props.onViewportRequest, onChangeData: props.onChangeData }}\n virtualized\n rowProps={{ ...props.rowProps, draggable: false }}\n rowGrouping={undefined}\n columnFiltering={undefined}\n tableTransfer={undefined}\n renderRowDetail={undefined}\n rowDetail={undefined}\n pagination={undefined}\n summary={undefined}\n lazyLoad={false}\n infiniteScroll={false}\n loading={false}\n loadingMore={false}\n tree={false}\n />;\n}\nconst ForwardedCominsViewportTableInner = forwardRef(CominsViewportTableInner) as <TData>(props: CominsViewportTableProps<TData> & React.RefAttributes<CominsTableRef<TData>>) => React.ReactElement | null;\n\nfunction CominsTableAdapter<TData, TGroup = unknown>(\n props: CominsTableProps<TData, TGroup> | CominsTreeTableProps<TData> | CominsViewportTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n if (props.viewportDatasource) return <ForwardedCominsViewportTableInner {...props} ref={ref} key={`${typeof props.viewportDatasource.revision}:${props.viewportDatasource.revision}:${props.data.rowCount}:${props.data.blockSize}`} />;\n return props.tree ? <ForwardedCominsTreeTableInner {...props} ref={ref} /> : <ForwardedCominsTableInner {...props} ref={ref} />;\n}\n\nexport const CominsTable = forwardRef(CominsTableAdapter) as <TData, TGroup = unknown>(\n props: (CominsTableProps<TData, TGroup> | CominsTreeTableProps<TData> | CominsViewportTableProps<TData>) & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nexport const cominsTablePackage = \"comins-table\";\n\nexport { getCominsColumnFilterOptions, setCominsColumnFilterValues } from \"./filtering\";\nexport type { CominsColumnFilterValue, CominsColumnConditionFilterOperator, CominsColumnConditionFilterRule, CominsColumnValueFilterRule, CominsColumnFilterOption, CominsColumnFilterOptionsResult, CominsColumnFilterValuesAction, CominsColumnFilterOptionsInput } from \"./filtering\";\n\nexport type { CominsValueFilterTriggerRenderParams, CominsValueFilterOptionRenderParams, CominsValueFilterPanelRenderParams, CominsValueFilterActions, CominsValueFilterPart, CominsFilterButtonGetter, CominsFilterCheckboxGetter, CominsFilterNativeOptions, CominsFilterCustomOptions, CominsFilterBinding } from \"./filtering\";\n"],"mappings":"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"}