comins-table 0.2.0 → 0.2.1

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":[],"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/tree.ts","../src/core/rows/projection.ts","../src/react/rows.ts","../src/selection-data.ts","../src/core/rows/filtering.ts","../src/filtering.ts","../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 ? { ...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>, isViewport: boolean) {\n const changes = getCoreStateChanges(current, next);\n if (isViewport && 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 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 {\n CominsCellFormatParams,\n CominsTableRuntimeColumn,\n} from \"../model\";\nimport type { CominsRowId } from \"../model\";\nimport type { CominsColumnFilterConfig as CoreFilterConfig, CominsColumnFilterKind } from \"../model\";\n\nexport type { CominsColumnFilterKind } from \"../model\";\n\nexport type CominsColumnFilterOperator =\n | \"between\"\n | \"contains\"\n | \"endsWith\"\n | \"equals\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"notContains\"\n | \"notEquals\"\n | \"startsWith\";\n\nexport type CominsColumnFilterConfig<TData, TValue = unknown> = Omit<CoreFilterConfig<TData, TValue>, \"getValue\"> & {\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n};\n\nexport type CominsColumnFilterRule = {\n columnId: string;\n operator: CominsColumnFilterOperator;\n value?: boolean | null | number | string;\n valueTo?: null | number | string;\n};\n\nexport type CominsColumnFilterModel = readonly CominsColumnFilterRule[];\n\nexport type CominsColumnFilteringConfig = {\n model: CominsColumnFilterModel;\n onChangeModel?: (model: CominsColumnFilterRule[]) => void;\n onChangeOpenColumnId?: (columnId: string | null) => void;\n openColumnId?: string | null;\n};\n\nexport type CominsColumnFilteringSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\ntype CominsNormalizedFilterValue = boolean | number | string;\n\nexport type CominsNormalizedColumnFilterRule<TData> = {\n column: CominsTableRuntimeColumn<TData>;\n config: CominsColumnFilterConfig<TData>;\n operator: CominsColumnFilterOperator;\n value?: CominsNormalizedFilterValue;\n valueTo?: number;\n};\n\nconst operatorsByKind = {\n boolean: new Set<CominsColumnFilterOperator>([\n \"equals\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"notEquals\",\n ]),\n date: new Set<CominsColumnFilterOperator>([\n \"between\",\n \"equals\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"notEquals\",\n ]),\n number: new Set<CominsColumnFilterOperator>([\n \"between\",\n \"equals\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"notEquals\",\n ]),\n text: new Set<CominsColumnFilterOperator>([\n \"contains\",\n \"endsWith\",\n \"equals\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"notContains\",\n \"notEquals\",\n \"startsWith\",\n ]),\n} satisfies Record<CominsColumnFilterKind, Set<CominsColumnFilterOperator>>;\n\nexport function getCominsColumnFilterOperators(kind: CominsColumnFilterKind) {\n return [...operatorsByKind[kind]];\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 isEmptyFilterValue(value: unknown) {\n return value === null || value === undefined || value === \"\";\n}\n\nfunction getDateDayValue(value: unknown): number | null {\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/u.test(value)) {\n const [year, month, day] = value.split(\"-\").map(Number);\n const normalized = Date.UTC(year!, month! - 1, day!);\n const date = new Date(normalized);\n\n return date.getUTCFullYear() === year && date.getUTCMonth() === month! - 1 && date.getUTCDate() === day\n ? normalized\n : null;\n }\n\n const date = value instanceof Date\n ? value\n : typeof value === \"number\" || typeof value === \"string\"\n ? new Date(value)\n : null;\n\n if (!date || !Number.isFinite(date.getTime())) {\n return null;\n }\n\n return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\n}\n\nfunction normalizeRuleValue(\n kind: CominsColumnFilterKind,\n value: CominsColumnFilterRule[\"value\"],\n): CominsNormalizedFilterValue | null {\n switch (kind) {\n case \"boolean\":\n return typeof value === \"boolean\" ? value : null;\n case \"date\":\n return getDateDayValue(value);\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n case \"text\": {\n if (value === null || value === undefined) {\n return null;\n }\n\n const normalized = String(value);\n\n return normalized.length > 0 ? normalized : null;\n }\n }\n}\n\nfunction isColumnFilterKind(value: unknown): value is CominsColumnFilterKind {\n return value === \"boolean\" || value === \"date\" || value === \"number\" || value === \"text\";\n}\n\nfunction isColumnFilterOperator(value: unknown): value is CominsColumnFilterOperator {\n return typeof value === \"string\" && Object.values(operatorsByKind).some((operators) =>\n operators.has(value as CominsColumnFilterOperator));\n}\n\nexport function normalizeCominsColumnFilterModel<TData>({\n columns,\n model,\n}: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n model: unknown;\n}): CominsNormalizedColumnFilterRule<TData>[] {\n if (!Array.isArray(model)) {\n return [];\n }\n\n const columnById = new Map(columns.map((column) => [column.id, column]));\n const seenColumnIds = new Set<string>();\n const normalized: CominsNormalizedColumnFilterRule<TData>[] = [];\n\n for (const candidate of model) {\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n\n const rule = candidate as Partial<CominsColumnFilterRule>;\n const column = typeof rule.columnId === \"string\" ? columnById.get(rule.columnId) : undefined;\n const config = column?.filter;\n\n if (\n !column ||\n !config ||\n !isColumnFilterKind(config.kind) ||\n !isColumnFilterOperator(rule.operator) ||\n !operatorsByKind[config.kind].has(rule.operator) ||\n seenColumnIds.has(column.id)\n ) {\n continue;\n }\n\n if (rule.operator === \"isEmpty\" || rule.operator === \"isNotEmpty\") {\n seenColumnIds.add(column.id);\n normalized.push({ column, config, operator: rule.operator });\n continue;\n }\n\n const value = normalizeRuleValue(config.kind, rule.value);\n\n if (value === null) {\n continue;\n }\n\n if (rule.operator === \"between\") {\n const valueTo = normalizeRuleValue(config.kind, rule.valueTo);\n\n if (typeof value !== \"number\" || typeof valueTo !== \"number\") {\n continue;\n }\n\n seenColumnIds.add(column.id);\n normalized.push({\n column,\n config,\n operator: rule.operator,\n value: Math.min(value, valueTo),\n valueTo: Math.max(value, valueTo),\n });\n continue;\n }\n\n seenColumnIds.add(column.id);\n normalized.push({ column, config, operator: rule.operator, value });\n }\n\n return normalized;\n}\n\nfunction comparePrimitive(\n left: number | string,\n operator: CominsColumnFilterOperator,\n right: number | string,\n rightTo?: number,\n) {\n switch (operator) {\n case \"between\":\n return typeof left === \"number\" && typeof right === \"number\" && rightTo !== undefined\n ? left >= right && left <= rightTo\n : false;\n case \"equals\":\n return left === right;\n case \"greaterThan\":\n return left > right;\n case \"greaterThanOrEqual\":\n return left >= right;\n case \"lessThan\":\n return left < right;\n case \"lessThanOrEqual\":\n return left <= right;\n case \"notEquals\":\n return left !== right;\n default:\n return false;\n }\n}\n\nfunction matchesRule<TData>(\n sourceRow: CominsColumnFilteringSourceRow<TData>,\n rule: CominsNormalizedColumnFilterRule<TData>,\n) {\n const defaultValue = getNestedFieldValue(sourceRow.data, rule.column.field);\n const value = rule.config.getValue\n ? rule.config.getValue({\n column: rule.column,\n row: sourceRow.data,\n rowId: sourceRow.id,\n value: defaultValue,\n })\n : defaultValue;\n\n if (rule.operator === \"isEmpty\") {\n return isEmptyFilterValue(value);\n }\n\n if (rule.operator === \"isNotEmpty\") {\n return !isEmptyFilterValue(value);\n }\n\n if (isEmptyFilterValue(value) || rule.value === undefined) {\n return false;\n }\n\n switch (rule.config.kind) {\n case \"boolean\":\n return typeof value === \"boolean\" && typeof rule.value === \"boolean\"\n ? rule.operator === \"equals\" ? value === rule.value : value !== rule.value\n : false;\n case \"date\": {\n const normalized = getDateDayValue(value);\n\n return normalized !== null && typeof rule.value === \"number\"\n ? comparePrimitive(normalized, rule.operator, rule.value, rule.valueTo)\n : false;\n }\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value) && typeof rule.value === \"number\"\n ? comparePrimitive(value, rule.operator, rule.value, rule.valueTo)\n : false;\n case \"text\": {\n const rawLeft = String(value);\n const rawRight = String(rule.value);\n const left = rule.config.caseSensitive ? rawLeft : rawLeft.toLocaleLowerCase();\n const right = rule.config.caseSensitive ? rawRight : rawRight.toLocaleLowerCase();\n\n switch (rule.operator) {\n case \"contains\":\n return left.includes(right);\n case \"endsWith\":\n return left.endsWith(right);\n case \"equals\":\n return left === right;\n case \"notContains\":\n return !left.includes(right);\n case \"notEquals\":\n return left !== right;\n case \"startsWith\":\n return left.startsWith(right);\n default:\n return false;\n }\n }\n }\n}\n\nexport function getCominsFilteredRowIndexes<TData>({\n columns,\n model,\n rows,\n}: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n model: unknown;\n rows: readonly CominsColumnFilteringSourceRow<TData>[];\n}) {\n const rules = normalizeCominsColumnFilterModel({ columns, model });\n\n if (rules.length === 0) {\n return rows.map((row) => row.dataIndex);\n }\n\n return rows.flatMap((row) => rules.every((rule) => matchesRule(row, rule)) ? [row.dataIndex] : []);\n}\n","import type {\n CominsCellFormatParams,\n CominsTableRuntimeColumn,\n} from \"./react-types\";\nimport type { CominsRowId } from \"./model\";\nimport type { CominsColumnFilterConfig as CoreFilterConfig, CominsColumnFilterKind } from \"./core/model\";\n\nexport type { CominsColumnFilterKind } from \"./core/model\";\n\nexport type CominsColumnFilterOperator =\n | \"between\"\n | \"contains\"\n | \"endsWith\"\n | \"equals\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"notContains\"\n | \"notEquals\"\n | \"startsWith\";\n\nexport type CominsColumnFilterConfig<TData, TValue = unknown> = Omit<CoreFilterConfig<TData, TValue>, \"getValue\"> & {\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n};\n\nexport type CominsColumnFilterRule = {\n columnId: string;\n operator: CominsColumnFilterOperator;\n value?: boolean | null | number | string;\n valueTo?: null | number | string;\n};\n\nexport type CominsColumnFilterModel = readonly CominsColumnFilterRule[];\n\nexport type CominsColumnFilteringConfig = {\n model: CominsColumnFilterModel;\n onChangeModel?: (model: CominsColumnFilterRule[]) => void;\n onChangeOpenColumnId?: (columnId: string | null) => void;\n openColumnId?: string | null;\n};\n\nexport type CominsColumnFilteringSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\ntype CominsNormalizedFilterValue = boolean | number | string;\n\nexport type CominsNormalizedColumnFilterRule<TData> = {\n column: CominsTableRuntimeColumn<TData>;\n config: CominsColumnFilterConfig<TData>;\n operator: CominsColumnFilterOperator;\n value?: CominsNormalizedFilterValue;\n valueTo?: number;\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","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 {\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 CominsColumnFilterOperator,\n type CominsColumnFilterRule,\n type CominsNormalizedColumnFilterRule,\n} from \"./filtering\";\nimport { CominsTableIconButton } from \"./table-icons\";\n\nconst operatorLabels: Record<CominsColumnFilterOperator, 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): CominsColumnFilterOperator {\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 columnId,\n columnLabel,\n kind,\n getPortalContainer,\n onChangeRule,\n onOpenChange,\n open,\n rule,\n}: {\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<HTMLButtonElement | null>(null);\n const onOpenChangeRef = useRef(onOpenChange);\n const popoverRef = useRef<HTMLSpanElement | null>(null);\n const popoverId = useId();\n const [operator, setOperator] = useState<CominsColumnFilterOperator>(\n rule?.operator ?? 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 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 ?? 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 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, window.innerWidth - width - 8),\n );\n const below = bounds.bottom + 6;\n const top = below + height <= window.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 target instanceof Node &&\n (buttonRef.current?.contains(target) || popoverRef.current?.contains(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 // Layout shifts can move the anchor without a scroll or resize event.\n let positionFrame: number;\n const trackPosition = () => {\n updatePosition();\n positionFrame = window.requestAnimationFrame(trackPosition);\n };\n trackPosition();\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.cancelAnimationFrame(positionFrame);\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n window.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 const container = getPortalContainer?.();\n return container ? createPortal(content, container) : content;\n };\n const commitRule = (\n nextOperator: CominsColumnFilterOperator,\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 <CominsTableIconButton\n aria-controls={open ? popoverId : undefined}\n aria-expanded={open}\n aria-label={`Filter ${columnLabel}`}\n className=\"comins-column-filter__trigger\"\n data-active={active ? \"true\" : undefined}\n data-testid={`column-filter-trigger-${columnId}`}\n disabled={!onOpenChange}\n icon=\"filter\"\n onClick={() => onOpenChange?.(open ? null : columnId)}\n ref={buttonRef}\n />\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 style={position}\n >\n <strong className=\"comins-column-filter__title\">{columnLabel}</strong>\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 CominsColumnFilterOperator;\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 </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 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 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)) labels.set(id, input.config.getGroupLabel?.(group) ?? String(id));\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 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 CominsSummaryColumnConfig<TData> = {\n aggregate: CominsSummaryBuiltin | CominsSummaryAggregator<TData>;\n className?: string;\n colSpan?: number;\n format?: (payload: CominsSummaryFormatPayload<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 getCominsSummaryValues<TData>(\n rows: readonly TData[],\n columns: readonly CominsTableRuntimeColumn<TData>[],\n summary: CominsTableSummaryConfig<TData>,\n): Record<string, React.ReactNode> {\n return 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 valuesByColumnId[columnId] = config?.format ? config.format({ column, rows, value, values }) : value;\n\n return valuesByColumnId;\n }, {});\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 { 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 { getCominsSummaryValues } 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 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 * 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 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 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 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 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 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 | \"tree\"\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 estimatedRowDetailHeight?: never;\n expandedRowIds?: never;\n getRowDetailHeight?: never;\n isRowExpandable?: never;\n onChangeExpandedRowIds?: never;\n renderRowDetail?: 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};\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 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 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 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 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 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 }>());\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 rowDetailEnabled = typeof renderRowDetail === \"function\" && !treeContext;\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 content = feedback?.renderTooltip?.(rejection) ?? (\n <>\n <strong>Duplicate ID</strong>\n <span>{`The ID \"${String(duplicateId)}\" already exists.`}</span>\n </>\n );\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 }, Boolean(viewportContext));\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 }>();\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 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 ? getCominsSummaryValues(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?.[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 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 getRowGroupId: groupingGetRowGroupId,\n groups: groupingGroups,\n },\n })\n : null,\n [\n groupingAggregations,\n groupingGetGroupId,\n groupingGetGroupLabel,\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?.renderer;\n const cachedHeaderRendererBody = headerRenderer ? headerRendererBodyRef.current.get(column.id) : undefined;\n\n const shouldRefreshHeaderRendererBody =\n Boolean(headerRenderer) && (!isColumnPlaceholder || cachedHeaderRendererBody?.renderer !== headerRenderer);\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 });\n } else if (headerRenderer && cachedHeaderRendererBody) {\n renderedHeaderRendererBodies.set(column.id, cachedHeaderRendererBody);\n }\n const headerLeftSlots = !column.header?.renderer\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"left\")\n : [];\n const headerRightSlots = !column.header?.renderer\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 {column.header?.renderer ? 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 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 {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 customContent = rowGrouping?.renderGroupContent?.(groupRenderParams);\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 {typeof rowGrouping?.renderGroupContent === \"function\" ? 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 cellContent = column.cell?.renderer ? (\n column.cell.renderer(cellPayload)\n ) : 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 treeEntry =\n column.id === treeContext?.treeColumnId\n ? treeContext.entriesByRowId.get(entry.rowId)\n : undefined;\n const renderedCellContent = treeEntry ? (\n <span\n className=\"comins-tree-cell-content\"\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 <span className=\"comins-tree-cell-value\">{cellContent}</span>\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 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 (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\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 {renderRowDetail?.(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>{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 {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 onBeforeRowDrag,\n onRowDrag,\n onAfterDragRow,\n isRowExpandable: _isRowExpandable,\n renderRowDetail: _renderRowDetail,\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 }),\n [data, entriesByRowId, getRowId, initialDefaultExpandAll, onChangeData, treeColumnId, treeDrag],\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};\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 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"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"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/tree.ts","../src/core/rows/projection.ts","../src/react/rows.ts","../src/selection-data.ts","../src/core/rows/filtering.ts","../src/filtering.ts","../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 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 {\n CominsCellFormatParams,\n CominsTableRuntimeColumn,\n} from \"../model\";\nimport type { CominsRowId } from \"../model\";\nimport type { CominsColumnFilterConfig as CoreFilterConfig, CominsColumnFilterKind } from \"../model\";\n\nexport type { CominsColumnFilterKind } from \"../model\";\n\nexport type CominsColumnFilterOperator =\n | \"between\"\n | \"contains\"\n | \"endsWith\"\n | \"equals\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"notContains\"\n | \"notEquals\"\n | \"startsWith\";\n\nexport type CominsColumnFilterConfig<TData, TValue = unknown> = Omit<CoreFilterConfig<TData, TValue>, \"getValue\"> & {\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n};\n\nexport type CominsColumnFilterRule = {\n columnId: string;\n operator: CominsColumnFilterOperator;\n value?: boolean | null | number | string;\n valueTo?: null | number | string;\n};\n\nexport type CominsColumnFilterModel = readonly CominsColumnFilterRule[];\n\nexport type CominsColumnFilteringConfig = {\n model: CominsColumnFilterModel;\n onChangeModel?: (model: CominsColumnFilterRule[]) => void;\n onChangeOpenColumnId?: (columnId: string | null) => void;\n openColumnId?: string | null;\n};\n\nexport type CominsColumnFilteringSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\ntype CominsNormalizedFilterValue = boolean | number | string;\n\nexport type CominsNormalizedColumnFilterRule<TData> = {\n column: CominsTableRuntimeColumn<TData>;\n config: CominsColumnFilterConfig<TData>;\n operator: CominsColumnFilterOperator;\n value?: CominsNormalizedFilterValue;\n valueTo?: number;\n};\n\nconst operatorsByKind = {\n boolean: new Set<CominsColumnFilterOperator>([\n \"equals\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"notEquals\",\n ]),\n date: new Set<CominsColumnFilterOperator>([\n \"between\",\n \"equals\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"notEquals\",\n ]),\n number: new Set<CominsColumnFilterOperator>([\n \"between\",\n \"equals\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"notEquals\",\n ]),\n text: new Set<CominsColumnFilterOperator>([\n \"contains\",\n \"endsWith\",\n \"equals\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"notContains\",\n \"notEquals\",\n \"startsWith\",\n ]),\n} satisfies Record<CominsColumnFilterKind, Set<CominsColumnFilterOperator>>;\n\nexport function getCominsColumnFilterOperators(kind: CominsColumnFilterKind) {\n return [...operatorsByKind[kind]];\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 isEmptyFilterValue(value: unknown) {\n return value === null || value === undefined || value === \"\";\n}\n\nfunction getDateDayValue(value: unknown): number | null {\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/u.test(value)) {\n const [year, month, day] = value.split(\"-\").map(Number);\n const normalized = Date.UTC(year!, month! - 1, day!);\n const date = new Date(normalized);\n\n return date.getUTCFullYear() === year && date.getUTCMonth() === month! - 1 && date.getUTCDate() === day\n ? normalized\n : null;\n }\n\n const date = value instanceof Date\n ? value\n : typeof value === \"number\" || typeof value === \"string\"\n ? new Date(value)\n : null;\n\n if (!date || !Number.isFinite(date.getTime())) {\n return null;\n }\n\n return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\n}\n\nfunction normalizeRuleValue(\n kind: CominsColumnFilterKind,\n value: CominsColumnFilterRule[\"value\"],\n): CominsNormalizedFilterValue | null {\n switch (kind) {\n case \"boolean\":\n return typeof value === \"boolean\" ? value : null;\n case \"date\":\n return getDateDayValue(value);\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n case \"text\": {\n if (value === null || value === undefined) {\n return null;\n }\n\n const normalized = String(value);\n\n return normalized.length > 0 ? normalized : null;\n }\n }\n}\n\nfunction isColumnFilterKind(value: unknown): value is CominsColumnFilterKind {\n return value === \"boolean\" || value === \"date\" || value === \"number\" || value === \"text\";\n}\n\nfunction isColumnFilterOperator(value: unknown): value is CominsColumnFilterOperator {\n return typeof value === \"string\" && Object.values(operatorsByKind).some((operators) =>\n operators.has(value as CominsColumnFilterOperator));\n}\n\nexport function normalizeCominsColumnFilterModel<TData>({\n columns,\n model,\n}: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n model: unknown;\n}): CominsNormalizedColumnFilterRule<TData>[] {\n if (!Array.isArray(model)) {\n return [];\n }\n\n const columnById = new Map(columns.map((column) => [column.id, column]));\n const seenColumnIds = new Set<string>();\n const normalized: CominsNormalizedColumnFilterRule<TData>[] = [];\n\n for (const candidate of model) {\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n\n const rule = candidate as Partial<CominsColumnFilterRule>;\n const column = typeof rule.columnId === \"string\" ? columnById.get(rule.columnId) : undefined;\n const config = column?.filter;\n\n if (\n !column ||\n !config ||\n !isColumnFilterKind(config.kind) ||\n !isColumnFilterOperator(rule.operator) ||\n !operatorsByKind[config.kind].has(rule.operator) ||\n seenColumnIds.has(column.id)\n ) {\n continue;\n }\n\n if (rule.operator === \"isEmpty\" || rule.operator === \"isNotEmpty\") {\n seenColumnIds.add(column.id);\n normalized.push({ column, config, operator: rule.operator });\n continue;\n }\n\n const value = normalizeRuleValue(config.kind, rule.value);\n\n if (value === null) {\n continue;\n }\n\n if (rule.operator === \"between\") {\n const valueTo = normalizeRuleValue(config.kind, rule.valueTo);\n\n if (typeof value !== \"number\" || typeof valueTo !== \"number\") {\n continue;\n }\n\n seenColumnIds.add(column.id);\n normalized.push({\n column,\n config,\n operator: rule.operator,\n value: Math.min(value, valueTo),\n valueTo: Math.max(value, valueTo),\n });\n continue;\n }\n\n seenColumnIds.add(column.id);\n normalized.push({ column, config, operator: rule.operator, value });\n }\n\n return normalized;\n}\n\nfunction comparePrimitive(\n left: number | string,\n operator: CominsColumnFilterOperator,\n right: number | string,\n rightTo?: number,\n) {\n switch (operator) {\n case \"between\":\n return typeof left === \"number\" && typeof right === \"number\" && rightTo !== undefined\n ? left >= right && left <= rightTo\n : false;\n case \"equals\":\n return left === right;\n case \"greaterThan\":\n return left > right;\n case \"greaterThanOrEqual\":\n return left >= right;\n case \"lessThan\":\n return left < right;\n case \"lessThanOrEqual\":\n return left <= right;\n case \"notEquals\":\n return left !== right;\n default:\n return false;\n }\n}\n\nfunction matchesRule<TData>(\n sourceRow: CominsColumnFilteringSourceRow<TData>,\n rule: CominsNormalizedColumnFilterRule<TData>,\n) {\n const defaultValue = getNestedFieldValue(sourceRow.data, rule.column.field);\n const value = rule.config.getValue\n ? rule.config.getValue({\n column: rule.column,\n row: sourceRow.data,\n rowId: sourceRow.id,\n value: defaultValue,\n })\n : defaultValue;\n\n if (rule.operator === \"isEmpty\") {\n return isEmptyFilterValue(value);\n }\n\n if (rule.operator === \"isNotEmpty\") {\n return !isEmptyFilterValue(value);\n }\n\n if (isEmptyFilterValue(value) || rule.value === undefined) {\n return false;\n }\n\n switch (rule.config.kind) {\n case \"boolean\":\n return typeof value === \"boolean\" && typeof rule.value === \"boolean\"\n ? rule.operator === \"equals\" ? value === rule.value : value !== rule.value\n : false;\n case \"date\": {\n const normalized = getDateDayValue(value);\n\n return normalized !== null && typeof rule.value === \"number\"\n ? comparePrimitive(normalized, rule.operator, rule.value, rule.valueTo)\n : false;\n }\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value) && typeof rule.value === \"number\"\n ? comparePrimitive(value, rule.operator, rule.value, rule.valueTo)\n : false;\n case \"text\": {\n const rawLeft = String(value);\n const rawRight = String(rule.value);\n const left = rule.config.caseSensitive ? rawLeft : rawLeft.toLocaleLowerCase();\n const right = rule.config.caseSensitive ? rawRight : rawRight.toLocaleLowerCase();\n\n switch (rule.operator) {\n case \"contains\":\n return left.includes(right);\n case \"endsWith\":\n return left.endsWith(right);\n case \"equals\":\n return left === right;\n case \"notContains\":\n return !left.includes(right);\n case \"notEquals\":\n return left !== right;\n case \"startsWith\":\n return left.startsWith(right);\n default:\n return false;\n }\n }\n }\n}\n\nexport function getCominsFilteredRowIndexes<TData>({\n columns,\n model,\n rows,\n}: {\n columns: readonly CominsTableRuntimeColumn<TData>[];\n model: unknown;\n rows: readonly CominsColumnFilteringSourceRow<TData>[];\n}) {\n const rules = normalizeCominsColumnFilterModel({ columns, model });\n\n if (rules.length === 0) {\n return rows.map((row) => row.dataIndex);\n }\n\n return rows.flatMap((row) => rules.every((rule) => matchesRule(row, rule)) ? [row.dataIndex] : []);\n}\n","import type {\n CominsCellFormatParams,\n CominsTableRuntimeColumn,\n} from \"./react-types\";\nimport type { CominsRowId } from \"./model\";\nimport type { CominsColumnFilterConfig as CoreFilterConfig, CominsColumnFilterKind } from \"./core/model\";\n\nexport type { CominsColumnFilterKind } from \"./core/model\";\n\nexport type CominsColumnFilterOperator =\n | \"between\"\n | \"contains\"\n | \"endsWith\"\n | \"equals\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"notContains\"\n | \"notEquals\"\n | \"startsWith\";\n\nexport type CominsColumnFilterConfig<TData, TValue = unknown> = Omit<CoreFilterConfig<TData, TValue>, \"getValue\"> & {\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n};\n\nexport type CominsColumnFilterRule = {\n columnId: string;\n operator: CominsColumnFilterOperator;\n value?: boolean | null | number | string;\n valueTo?: null | number | string;\n};\n\nexport type CominsColumnFilterModel = readonly CominsColumnFilterRule[];\n\nexport type CominsColumnFilteringConfig = {\n model: CominsColumnFilterModel;\n onChangeModel?: (model: CominsColumnFilterRule[]) => void;\n onChangeOpenColumnId?: (columnId: string | null) => void;\n openColumnId?: string | null;\n};\n\nexport type CominsColumnFilteringSourceRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n};\n\ntype CominsNormalizedFilterValue = boolean | number | string;\n\nexport type CominsNormalizedColumnFilterRule<TData> = {\n column: CominsTableRuntimeColumn<TData>;\n config: CominsColumnFilterConfig<TData>;\n operator: CominsColumnFilterOperator;\n value?: CominsNormalizedFilterValue;\n valueTo?: number;\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","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 {\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 CominsColumnFilterOperator,\n type CominsColumnFilterRule,\n type CominsNormalizedColumnFilterRule,\n} from \"./filtering\";\nimport { CominsTableIconButton } from \"./table-icons\";\n\nconst operatorLabels: Record<CominsColumnFilterOperator, 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): CominsColumnFilterOperator {\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 columnId,\n columnLabel,\n kind,\n getPortalContainer,\n onChangeRule,\n onOpenChange,\n open,\n rule,\n}: {\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<HTMLButtonElement | null>(null);\n const onOpenChangeRef = useRef(onOpenChange);\n const popoverRef = useRef<HTMLSpanElement | null>(null);\n const popoverId = useId();\n const [operator, setOperator] = useState<CominsColumnFilterOperator>(\n rule?.operator ?? 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 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 ?? 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 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, window.innerWidth - width - 8),\n );\n const below = bounds.bottom + 6;\n const top = below + height <= window.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 target instanceof Node &&\n (buttonRef.current?.contains(target) || popoverRef.current?.contains(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 // Layout shifts can move the anchor without a scroll or resize event.\n let positionFrame: number;\n const trackPosition = () => {\n updatePosition();\n positionFrame = window.requestAnimationFrame(trackPosition);\n };\n trackPosition();\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.cancelAnimationFrame(positionFrame);\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n window.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 const container = getPortalContainer?.();\n return container ? createPortal(content, container) : content;\n };\n const commitRule = (\n nextOperator: CominsColumnFilterOperator,\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 <CominsTableIconButton\n aria-controls={open ? popoverId : undefined}\n aria-expanded={open}\n aria-label={`Filter ${columnLabel}`}\n className=\"comins-column-filter__trigger\"\n data-active={active ? \"true\" : undefined}\n data-testid={`column-filter-trigger-${columnId}`}\n disabled={!onOpenChange}\n icon=\"filter\"\n onClick={() => onOpenChange?.(open ? null : columnId)}\n ref={buttonRef}\n />\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 style={position}\n >\n <strong className=\"comins-column-filter__title\">{columnLabel}</strong>\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 CominsColumnFilterOperator;\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 </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 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 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)) labels.set(id, input.config.getGroupLabel?.(group) ?? String(id));\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 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 CominsSummaryColumnConfig<TData> = {\n aggregate: CominsSummaryBuiltin | CominsSummaryAggregator<TData>;\n className?: string;\n colSpan?: number;\n format?: (payload: CominsSummaryFormatPayload<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 getCominsSummaryValues<TData>(\n rows: readonly TData[],\n columns: readonly CominsTableRuntimeColumn<TData>[],\n summary: CominsTableSummaryConfig<TData>,\n): Record<string, React.ReactNode> {\n return 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 valuesByColumnId[columnId] = config?.format ? config.format({ column, rows, value, values }) : value;\n\n return valuesByColumnId;\n }, {});\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 { 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 { getCominsSummaryValues } 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 * 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 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 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 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 leading?: (params: CominsTreeSlotParams<TData>) => React.ReactNode;\n content?: (params: CominsTreeSlotParams<TData>) => React.ReactNode;\n trailing?: (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 | \"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 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 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 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 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 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 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 }>());\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 rowDetailEnabled = typeof renderRowDetail === \"function\" && !treeContext;\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 content = feedback?.renderTooltip?.(rejection) ?? (\n <>\n <strong>Duplicate ID</strong>\n <span>{`The ID \"${String(duplicateId)}\" already exists.`}</span>\n </>\n );\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 }>();\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 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 ? getCominsSummaryValues(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?.[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 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 getRowGroupId: groupingGetRowGroupId,\n groups: groupingGroups,\n },\n })\n : null,\n [\n groupingAggregations,\n groupingGetGroupId,\n groupingGetGroupLabel,\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?.renderer;\n const cachedHeaderRendererBody = headerRenderer ? headerRendererBodyRef.current.get(column.id) : undefined;\n\n const shouldRefreshHeaderRendererBody =\n Boolean(headerRenderer) && (!isColumnPlaceholder || cachedHeaderRendererBody?.renderer !== headerRenderer);\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 });\n } else if (headerRenderer && cachedHeaderRendererBody) {\n renderedHeaderRendererBodies.set(column.id, cachedHeaderRendererBody);\n }\n const headerLeftSlots = !column.header?.renderer\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"left\")\n : [];\n const headerRightSlots = !column.header?.renderer\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 {column.header?.renderer ? 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 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 {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 customContent = rowGrouping?.renderGroupContent?.(groupRenderParams);\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 {typeof rowGrouping?.renderGroupContent === \"function\" ? 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 cellContent = column.cell?.renderer ? (\n column.cell.renderer(cellPayload)\n ) : 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 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\", treeSlots.leading(treeSlotParams)) : null}\n <span className=\"comins-tree-cell-value\">\n {treeSlotParams && treeSlots?.content ? renderTreeSlot(\"content\", treeSlots.content(treeSlotParams)) : cellContent}\n </span>\n {treeSlotParams && treeSlots?.trailing ? renderTreeSlot(\"trailing\", 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 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 (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\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 {renderRowDetail?.(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>{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 {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 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};\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 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"],"mappings":"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"}