comins-table 0.1.8 → 0.1.9
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/CHANGELOG.md +9 -0
- package/DESIGN.md +132 -0
- package/README.md +47 -11
- package/dist/clipboard.js +1 -1
- package/dist/{core-BF1H3EEK.js → core-D01wEe-7.js} +78 -70
- package/dist/core-D01wEe-7.js.map +1 -0
- package/dist/core.d.ts +12 -2
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +1 -1
- package/dist/index.d.ts +32 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1715 -1617
- package/dist/index.js.map +1 -1
- package/dist/selection.d.ts +1 -1
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +1 -1
- package/package.json +4 -2
- package/styles.css +4 -0
- package/dist/core-BF1H3EEK.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/column-pointer.ts","../src/filtering.ts","../src/table-icons.tsx","../src/column-filter.tsx","../src/component-renderer.tsx","../src/drag-autoscroll.ts","../src/row-detail.tsx","../src/grouping.ts","../src/table-transfer.ts","../src/tooltip.tsx","../src/summary.ts","../src/tree.ts","../src/virtual-layout.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","import type {\n CominsCellFormatParams,\n CominsRowId,\n CominsTableRuntimeColumn,\n} from \"./core\";\n\nexport type CominsColumnFilterKind = \"boolean\" | \"date\" | \"number\" | \"text\";\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> = {\n caseSensitive?: boolean;\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n kind: CominsColumnFilterKind;\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 {\n CaretSortIcon,\n ChevronRightIcon,\n DragHandleDots2Icon,\n MagnifyingGlassIcon,\n ThickArrowDownIcon,\n ThickArrowUpIcon,\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: ThickArrowUpIcon,\n sortDescending: ThickArrowDownIcon,\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} from \"react\";\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 onChangeRule,\n onOpenChange,\n open,\n rule,\n}: {\n columnId: string;\n columnLabel: string;\n kind: CominsColumnFilterKind;\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 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 return;\n }\n\n setOperator(rule?.operator ?? getDefaultOperator(kind));\n setValue(getRuleInputValue(rule, kind));\n setValueTo(getRuleInputValueTo(rule, kind));\n }, [kind, open, rule?.operator, rule?.value, rule?.valueTo]);\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({ 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 updatePosition();\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.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 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 onChangeRule({ columnId, operator: nextOperator });\n return;\n }\n\n if (kind === \"text\") {\n onChangeRule(nextValue.length > 0\n ? { columnId, operator: nextOperator, value: nextValue }\n : null);\n return;\n }\n\n if (kind === \"boolean\") {\n onChangeRule(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 onChangeRule(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 onChangeRule({ columnId, operator: nextOperator, value: firstValue, valueTo: secondValue });\n return;\n }\n\n onChangeRule({ 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 ? (\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 onChangeRule?.(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 \"./core\";\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={stopComponentEvent}\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","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 { useLayoutEffect, useRef } from \"react\";\nimport type * as React from \"react\";\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}) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const getToggleElementRef = useRef(props.getToggleElement);\n const onContentElementRef = useRef(props.onContentElement);\n const automatic = props.fixedHeight === undefined;\n\n getToggleElementRef.current = props.getToggleElement;\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 if (element?.contains(document.activeElement)) {\n const restoreFocus = () => {\n const toggle = getToggleElementRef.current();\n\n if (toggle?.isConnected) {\n toggle.focus();\n }\n };\n\n restoreFocus();\n window.requestAnimationFrame(restoreFocus);\n }\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 type React from \"react\";\n\nimport type {\n CominsRowId,\n CominsSortModel,\n CominsTableRuntimeColumn,\n} from \"./core\";\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\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 label: input.config.getGroupLabel?.(group) ?? String(groupId),\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,\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 { CominsRowId } from \"./core\";\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 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 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\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 registrations: Map<\n string,\n Map<string, Set<CominsTableTransferRegistration<TData, TGroup>>>\n >;\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 registrations: new Map(),\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>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n scope: string,\n tableId: string,\n registration: CominsTableTransferRegistration<TData, TGroup>,\n) {\n const state = getCoordinatorState(coordinator);\n\n if (!state) {\n return () => undefined;\n }\n\n let scopeRegistrations = state.registrations.get(scope);\n\n if (!scopeRegistrations) {\n scopeRegistrations = new Map();\n state.registrations.set(scope, scopeRegistrations);\n }\n\n let tableRegistrations = scopeRegistrations.get(tableId);\n\n if (!tableRegistrations) {\n tableRegistrations = new Set();\n scopeRegistrations.set(tableId, tableRegistrations);\n }\n\n tableRegistrations.add(registration);\n\n return () => {\n tableRegistrations.delete(registration);\n\n if (tableRegistrations.size === 0) {\n scopeRegistrations.delete(tableId);\n }\n\n if (scopeRegistrations.size === 0) {\n state.registrations.delete(scope);\n }\n };\n}\n\nexport function getCominsTableTransferRegistration<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n scope: string,\n tableId: string,\n) {\n const registrations = getCoordinatorState(coordinator)\n ?.registrations.get(scope)\n ?.get(tableId);\n\n if (!registrations || registrations.size !== 1) {\n return null;\n }\n\n return [...registrations][0] ?? null;\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\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 { 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","import type React from \"react\";\n\nimport type { CominsTableRuntimeColumn } from \"./core\";\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\nfunction getNumericValues(values: readonly unknown[]) {\n return values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n}\n\nfunction getBuiltinSummaryValue(kind: CominsSummaryBuiltin, values: readonly unknown[]): React.ReactNode {\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\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 \"./core\";\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 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\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 { CominsRowId } from \"./core\";\n\nexport const COMINS_MAX_PHYSICAL_TOTAL_HEIGHT = 1_500_000;\n\nexport type CominsDataVirtualSlot<TData> = {\n dataIndex: number;\n detail?: {\n estimated: boolean;\n height: number;\n mode: \"auto\" | \"fixed\";\n };\n key: string;\n kind: \"data\";\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 CominsVirtualSlot<TData> =\n | CominsDataVirtualSlot<TData>\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 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 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 === \"group\"\n ? slot.height\n : 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: CominsHeightIndex;\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 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 getCominsCellValue,\n getCominsHeaderRows,\n getCominsSortedRowIndexes,\n getCominsVisibleColumns,\n isCominsCellInSelectedRange,\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 \"./core\";\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 {\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 getCominsTableTransferRegistration,\n isCominsTableTransferCoordinator,\n registerCominsTableTransfer,\n transferCominsGroupBetweenTables,\n transferCominsRowBetweenTables,\n} from \"./table-transfer\";\nimport { CominsPointerTooltip } from \"./tooltip\";\nimport { getCominsSummaryValues } from \"./summary\";\nimport {\n flattenCominsTree,\n getCominsTreeLeafItems,\n sortCominsTreeSiblings,\n toggleCominsTreeNode,\n updateCominsTreeItem,\n} from \"./tree\";\nimport {\n CominsHeightIndex,\n captureCominsScrollAnchor,\n createCominsDataVirtualSlot,\n getCominsDataSlotKey,\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 * from \"./core\";\nexport * from \"./summary\";\nexport * from \"./tree\";\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 } from \"./tree\";\nimport type {\n CominsGroupingProjectionEntry,\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 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 \"./core\";\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\nconst COMINS_MIN_COLUMN_WIDTH = 88;\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 draggable?: CominsRowPropValue<TData, boolean | undefined>;\n style?: CominsRowPropValue<TData, React.CSSProperties | undefined>;\n};\n\nexport type CominsEventRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n index: number;\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 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 \"buffer-size\"?: number;\n cellSelection?: boolean;\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 pagination?: Partial<CominsPaginationState>;\n persistHeaderWhenEmpty?: boolean;\n rowHeight?: 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 | \"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 pagination?: never;\n rowProps?: Omit<CominsTableRowProps<TData>, \"draggable\"> & { draggable?: never };\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 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 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: HTMLDivElement;\n rowId: CominsRowId;\n};\n\ntype CominsTreeRenderContext<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 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) !== false,\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.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.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\nfunction getEffectiveColumnMinWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return Math.max(COMINS_MIN_COLUMN_WIDTH, column.minWidth ?? COMINS_MIN_COLUMN_WIDTH);\n}\n\nfunction getEffectiveColumnMaxWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return column.maxWidth ?? Number.POSITIVE_INFINITY;\n}\n\nfunction getRuntimeColumnWidth<TData>(\n state: CominsTableState<TData>,\n column: CominsTableRuntimeColumn<TData>,\n) {\n return state.columnState[column.id]?.width ?? column.width ?? 100;\n}\n\nfunction clampColumnWidth(width: number, minWidth: number, maxWidth: number) {\n return Math.min(maxWidth, Math.max(minWidth, width));\n}\n\nfunction distributeRuntimeColumnWidths<TData>(\n state: CominsTableState<TData>,\n columns: Array<CominsTableRuntimeColumn<TData>>,\n targetWidth: number,\n) {\n const widths = columns.map((column) =>\n clampColumnWidth(getRuntimeColumnWidth(state, column), getEffectiveColumnMinWidth(column), getEffectiveColumnMaxWidth(column)),\n );\n const active = new Set(columns.map((_column, index) => index));\n const minWidths = columns.map(getEffectiveColumnMinWidth);\n const maxWidths = columns.map(getEffectiveColumnMaxWidth);\n const boundedTargetWidth = clampColumnWidth(\n targetWidth,\n minWidths.reduce((sum, width) => sum + width, 0),\n maxWidths.reduce((sum, width) => sum + width, 0),\n );\n\n while (active.size > 0) {\n const currentTotal = widths.reduce((sum, width) => sum + width, 0);\n const delta = boundedTargetWidth - currentTotal;\n\n if (Math.abs(delta) < 0.001) {\n break;\n }\n\n const activeIndexes = [...active];\n const activeWeight = activeIndexes.reduce((sum, index) => sum + Math.max(widths[index] ?? 0, 0), 0);\n let clamped = false;\n\n for (const index of activeIndexes) {\n const width = widths[index] ?? 0;\n const weight = activeWeight > 0 ? width / activeWeight : 1 / activeIndexes.length;\n const nextWidth = width + delta * weight;\n const clampedWidth = clampColumnWidth(nextWidth, minWidths[index] ?? 0, maxWidths[index] ?? Number.POSITIVE_INFINITY);\n\n widths[index] = clampedWidth;\n\n if (Math.abs(clampedWidth - nextWidth) > 0.001) {\n active.delete(index);\n clamped = true;\n }\n }\n\n if (!clamped) {\n break;\n }\n }\n\n return widths;\n}\n\nfunction setColumnWidthInsideParentGroup<TData>(\n state: CominsTableState<TData>,\n columnId: string,\n width: number,\n) {\n const group = state.columnGroups.find((candidate) => candidate.children.includes(columnId));\n\n if (!group || state.columnGroupState[group.id]?.hidden === true) {\n return setCominsColumnWidth(state, columnId, width);\n }\n\n const childColumns = group.children\n .map((childId) => state.columns.find((column) => column.id === childId))\n .filter((column): column is CominsTableRuntimeColumn<TData> => Boolean(column))\n .filter((column) => state.columnState[column.id]?.hidden !== true);\n const targetColumn = childColumns.find((column) => column.id === columnId);\n\n if (!targetColumn) {\n return setCominsColumnWidth(state, columnId, width);\n }\n\n const siblingColumns = childColumns.filter((column) => column.id !== columnId);\n\n if (siblingColumns.length === 0) {\n const currentGroupWidth = getRuntimeColumnWidth(state, targetColumn);\n\n return setCominsColumnWidth(\n state,\n columnId,\n clampColumnWidth(width, getEffectiveColumnMinWidth(targetColumn), Math.min(getEffectiveColumnMaxWidth(targetColumn), currentGroupWidth)),\n );\n }\n\n const currentGroupWidth = childColumns.reduce((sum, column) => sum + getRuntimeColumnWidth(state, column), 0);\n const siblingMinWidth = siblingColumns.reduce((sum, column) => sum + getEffectiveColumnMinWidth(column), 0);\n const siblingMaxWidth = siblingColumns.reduce((sum, column) => sum + getEffectiveColumnMaxWidth(column), 0);\n const minWidth = Math.max(getEffectiveColumnMinWidth(targetColumn), currentGroupWidth - siblingMaxWidth);\n const maxWidth = Math.max(minWidth, Math.min(getEffectiveColumnMaxWidth(targetColumn), currentGroupWidth - siblingMinWidth));\n const nextTargetWidth = clampColumnWidth(width, minWidth, maxWidth);\n const nextSiblingWidths = distributeRuntimeColumnWidths(state, siblingColumns, currentGroupWidth - nextTargetWidth);\n let next = setCominsColumnWidth(state, columnId, nextTargetWidth);\n\n siblingColumns.forEach((column, index) => {\n next = setCominsColumnWidth(next, column.id, nextSiblingWidths[index] ?? getRuntimeColumnWidth(next, column));\n });\n\n return next;\n}\n\nfunction setCominsNestedInputValue<TData>(row: TData, field: string, value: string): TData {\n if (!row || typeof row !== \"object\") {\n return row;\n }\n\n const keys = field.split(\".\");\n const [firstKey] = keys;\n\n if (!firstKey) {\n return row;\n }\n\n if (keys.length === 1) {\n return { ...row, [firstKey]: value };\n }\n\n const root = { ...(row as Record<string, unknown>) };\n let current: Record<string, unknown> = root;\n\n keys.slice(0, -1).forEach((key, index) => {\n const nextKey = keys[index + 1];\n const existing = current[key];\n const next =\n existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n\n current[key] = next;\n\n if (nextKey) {\n current = next;\n }\n });\n\n current[keys.at(-1)!] = value;\n\n return root as TData;\n}\n\nfunction 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}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction areRowIdSequencesEqual(left: readonly CominsRowId[], right: readonly CominsRowId[]) {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nfunction canPreserveSelection<TData>(\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\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 selectedRange = current.selection.range;\n\n if (selectedCell && !nextColumnIds.has(selectedCell.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\nfunction getTreeNestedFieldValue(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\nfunction compareTreeValues(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\nfunction getSortedCominsTree<TData>(\n data: readonly CominsTreeNode<TData>[],\n columns: readonly CominsTableColumn<TData>[],\n sortModel: CominsSortModel,\n) {\n if (sortModel.length === 0) {\n return data;\n }\n\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\n if (!column?.sort) {\n continue;\n }\n\n const leftValue = getTreeNestedFieldValue(leftRow, column.field);\n const rightValue = getTreeNestedFieldValue(rightRow, column.field);\n const result =\n typeof column.sort === \"function\"\n ? column.sort(leftValue, rightValue, leftRow, rightRow)\n : compareTreeValues(leftValue, rightValue);\n\n if (result !== 0) {\n return rule.direction === \"desc\" ? result * -1 : result;\n }\n }\n\n return 0;\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 className,\n columnFiltering,\n columnGroups,\n columns,\n data,\n \"data-testid\": dataTestId,\n emptyComponent,\n estimatedRowDetailHeight,\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 pagination,\n persistHeaderWhenEmpty = true,\n rowHeight = 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 virtualized = false,\n }: CominsTableInnerProps<TData, TGroup>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\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 detailElementsRef = useRef(\n new Map<Element, CominsObservedDetail>(),\n );\n const fallbackMeasuredDetailElementsRef = useRef(new Set<Element>());\n const detailObserverRef = useRef<ResizeObserver | null>(null);\n const detailObserverTargetsRef = useRef(new Set<Element>());\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 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 [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 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) => {\n if (!normalizedTableTransfer) {\n return null;\n }\n\n const registration = getCominsTableTransferRegistration(\n normalizedTableTransfer.coordinator,\n normalizedTableTransfer.scope,\n tableId,\n );\n const snapshot = registration?.getSnapshot() ?? null;\n\n if (\n !snapshot ||\n snapshot.config.coordinator !== normalizedTableTransfer.coordinator ||\n snapshot.config.scope !== normalizedTableTransfer.scope ||\n snapshot.config.tableId !== tableId ||\n snapshot.endpoint.tableId !== tableId\n ) {\n return null;\n }\n\n return snapshot;\n };\n const getCrossTableTransferHit = (\n clientX: number,\n clientY: number,\n ): CominsTransferTableHit<TData, TGroup> | null => {\n if (!normalizedTableTransfer) {\n return null;\n }\n\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const element = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n const root = element?.closest<HTMLElement>(\"[data-comins-table-instance-id]\") ?? null;\n const tableId = root?.dataset.cominsTransferTableId;\n\n if (\n !sourceSnapshot ||\n sourceSnapshot.instanceId !== tableInstanceId ||\n sourceSnapshot.root !== tableRootRef.current ||\n !element ||\n !root ||\n !tableId ||\n tableId === normalizedTableTransfer.tableId ||\n root.dataset.cominsTransferScope !== normalizedTableTransfer.scope\n ) {\n return null;\n }\n\n const snapshot = getRegisteredTransferSnapshot(tableId);\n\n if (\n !snapshot ||\n snapshot.root !== root ||\n snapshot.instanceId !== root.dataset.cominsTableInstanceId ||\n !snapshot.viewport ||\n !root.contains(snapshot.viewport)\n ) {\n return null;\n }\n\n return { element, root, snapshot };\n };\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 focusTarget.focus({ 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 root.focus({ preventScroll: true });\n };\n\n pendingTransferFocusFrameRef.current = window.requestAnimationFrame(attemptFocus);\n };\n 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: bounds.bottom, clientY, top: 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: bounds.bottom,\n clientY: nextClientY,\n top: 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\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 containerRef.current.scrollTop = 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 nextState = createCominsTableState({\n columnLayout: serializeCominsColumnLayout(current),\n columnGroups,\n columns,\n getRowId,\n pagination: effectivePagination,\n rows: effectiveData,\n showHeader,\n sortModel: current.sortModel,\n theme: current.theme,\n });\n const next = canPreserveSelection(current, nextState)\n ? { ...nextState, selection: current.selection }\n : nextState;\n\n if (previousInput.getRowId !== getRowId) {\n const previousRowById = new Map(\n current.rowIds.map((rowId, index) => [rowId, current.rows[index]]),\n );\n\n next.rowIds.forEach((rowId, index) => {\n if (previousRowById.has(rowId) && previousRowById.get(rowId) !== next.rows[index]) {\n detailMeasurementsRef.current.delete(rowId);\n }\n });\n }\n\n stateRef.current = next;\n setState(next);\n\n if (!areSortStatesEqual(next.sort, current.sort)) {\n onChangeSort?.(next.sort);\n }\n\n if (!areSortModelsEqual(next.sortModel, current.sortModel)) {\n onChangeSortModel?.(next.sortModel);\n }\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 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 || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n if (entry) {\n setContainerHeight(entry.contentRect.height);\n setContainerWidth(entry.contentRect.width);\n setHorizontalScrollContentWidth(element.scrollWidth);\n setHorizontalViewportOuterWidth(element.offsetWidth);\n setHorizontalViewportWidth(element.clientWidth);\n }\n });\n observer.observe(element);\n\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n reconcileCominsDetailMeasurements(\n detailMeasurementsRef.current,\n new Set(state.rowIds),\n );\n }, [state.rowIds]);\n\n const updateMixedProjectionDetailHeight = (\n snapshot: CominsCommittedDetailObserverSnapshot<TData>,\n rowId: CominsRowId,\n height: number,\n width: number,\n ) => {\n const projection = snapshot.projection;\n\n if (!projection || 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\" || slot.detail?.mode !== \"auto\") {\n return false;\n }\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 }>,\n ) => {\n const snapshot = committedDetailObserverSnapshotRef.current;\n\n if (!snapshot) {\n return;\n }\n\n const accepted = updates.filter(({ height, rowId, width }) => {\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 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 detailMeasurementsRef.current.set(update.rowId, {\n height: update.height,\n width: update.width,\n });\n updatedActiveIndex =\n updateMixedProjectionDetailHeight(\n snapshot,\n update.rowId,\n update.height,\n update.width,\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 (typeof ResizeObserver === \"undefined\") {\n return null;\n }\n\n const observer = new ResizeObserver((entries) => {\n const updates: Array<{\n height: number;\n rowId: CominsRowId;\n width: number;\n }> = [];\n\n for (const entry of entries) {\n const observed = detailElementsRef.current.get(entry.target);\n\n if (!observed) {\n continue;\n }\n\n const borderBox = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const height =\n borderBox?.blockSize ??\n (entry.target as HTMLElement).getBoundingClientRect().height;\n const width = Math.round(\n (entry.target as HTMLElement).getBoundingClientRect().width,\n );\n\n if (Number.isFinite(height) && height > 0) {\n updates.push({ height, rowId: observed.rowId, width });\n }\n }\n\n applyDetailMeasurementUpdates(updates);\n });\n\n detailObserverRef.current = observer;\n\n for (const observed of detailElementsRef.current.values()) {\n detailObserverTargetsRef.current.add(observed.element);\n observer.observe(observed.element);\n }\n\n return observer;\n };\n\n useLayoutEffect(() => {\n return () => {\n detailObserverRef.current?.disconnect();\n detailObserverRef.current = null;\n detailObserverTargetsRef.current.clear();\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?.disconnect();\n detailObserverRef.current = null;\n detailObserverTargetsRef.current.clear();\n }\n };\n\n const registerDetailElement = (\n rowId: CominsRowId,\n mode: \"auto\" | \"fixed\",\n element: HTMLDivElement | null,\n ) => {\n for (const [currentElement, observed] of detailElementsRef.current) {\n if (observed.rowId === rowId && currentElement !== element) {\n detailObserverRef.current?.unobserve(currentElement);\n detailObserverTargetsRef.current.delete(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 });\n };\n\n const notifyChanges = (\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n if (next.rows !== current.rows) {\n onChangeData?.(next.rows);\n }\n\n if (next.selection !== current.selection) {\n onChangeSelection?.(next.selection);\n }\n\n if (options.columnLayoutChanged) {\n onChangeColumnLayout?.(serializeCominsColumnLayout(next));\n }\n\n if (!areSortStatesEqual(next.sort, current.sort)) {\n onChangeSort?.(next.sort);\n }\n\n if (!areSortModelsEqual(next.sortModel, current.sortModel)) {\n onChangeSortModel?.(next.sortModel);\n }\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 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 const transferCoordinator = normalizedTableTransfer?.coordinator;\n const transferScope = normalizedTableTransfer?.scope;\n const transferTableId = normalizedTableTransfer?.tableId;\n useEffect(() => {\n if (!transferCoordinator || !transferScope || !transferTableId) {\n return undefined;\n }\n\n return registerCominsTableTransfer(\n transferCoordinator,\n transferScope,\n transferTableId,\n {\n getSnapshot: () => {\n const snapshot = transferSnapshotRef.current;\n\n return snapshot\n ? {\n ...snapshot,\n root: tableRootRef.current,\n viewport: containerRef.current,\n }\n : null;\n },\n },\n );\n }, [transferCoordinator, transferScope, transferTableId]);\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 disclosure.focus();\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 groupDisclosureElementsRef.current.get(fallbackGroupId)?.focus();\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 visibleRowCount = projectedDataIndexes.length;\n const visibleSlotCount = groupingProjection?.entries.length ?? visibleRowCount;\n const pageSize = Math.max(1, state.pagination.pageSize);\n const maxPageIndex = Math.max(0, Math.ceil(visibleRowCount / pageSize) - 1);\n const effectivePageIndex = Math.min(Math.max(0, state.pagination.pageIndex), maxPageIndex);\n const pageStartIndex = effectivePageIndex * pageSize;\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 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 && !rangeHidden) {\n return;\n }\n\n if (cellHidden) {\n lastCellAnchorRef.current = null;\n }\n rangeDragAnchorRef.current = null;\n rangeDragLastAddressRef.current = null;\n commitState({\n ...current,\n selection: {\n ...current.selection,\n cell: cellHidden ? null : current.selection.cell,\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 fullProjectionSlots = useMemo<Array<CominsVirtualSlot<TData>>>(() => {\n const safeRowHeight = Math.max(1, rowHeight);\n const entries: readonly CominsGroupingProjectionEntry[] = groupingProjection?.entries ?? projectedDataIndexes.map(\n (dataIndex, visibleLeafIndex) => {\n const rowId = state.rowIds[dataIndex];\n\n return rowId === undefined\n ? null\n : {\n dataIndex,\n key: getCominsDataSlotKey(rowId),\n kind: \"data\" as const,\n rowId,\n visibleLeafIndex,\n };\n },\n ).filter((entry): entry is Extract<CominsGroupingProjectionEntry, { kind: \"data\" }> => entry !== null);\n\n return entries.flatMap<CominsVirtualSlot<TData>>((projectionEntry) => {\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, visibleLeafIndex: visibleIndex } = projectionEntry;\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\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: safeRowHeight,\n rowId,\n visibleIndex,\n }),\n ];\n });\n }, [\n detailContentWidth,\n virtualized ? 0 : detailLayoutVersion,\n effectiveExpandedRowIdSet,\n estimatedRowDetailHeight,\n getRowDetailHeight,\n groupingProjection,\n projectedDataIndexes,\n rowHeight,\n state.rowIds,\n state.rows,\n ]);\n const mixedProjection = useMemo<CominsMixedVirtualProjection<TData> | null>(() => {\n if (!virtualized || effectiveExpandedRowIdSet.size === 0) {\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 ]);\n const detailObserverSnapshotCandidate = useMemo<\n CominsCommittedDetailObserverSnapshot<TData>\n >(\n () => ({\n contentWidth: detailContentWidth,\n projection: mixedProjection,\n viewportHeight:\n containerHeight || Math.max(1, rowHeight) * 12,\n }),\n [containerHeight, detailContentWidth, mixedProjection, rowHeight],\n );\n\n useLayoutEffect(() => {\n committedDetailObserverSnapshotRef.current =\n detailObserverSnapshotCandidate;\n\n if (detailElementsRef.current.size === 0) {\n disconnectDetailObserverIfIdle();\n return;\n }\n\n if (typeof ResizeObserver !== \"undefined\") {\n const currentObserver = detailObserverRef.current;\n const observer = currentObserver ?? createDetailObserver();\n\n if (currentObserver) {\n for (const observed of detailElementsRef.current.values()) {\n if (!detailObserverTargetsRef.current.has(observed.element)) {\n detailObserverTargetsRef.current.add(observed.element);\n observer?.observe(observed.element);\n }\n }\n }\n return;\n }\n\n const updates: Array<{\n height: number;\n rowId: CominsRowId;\n width: number;\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 = observed.element.getBoundingClientRect();\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 });\n }\n }\n\n applyDetailMeasurementUpdates(updates);\n });\n const rowWindow = useMemo<CominsVirtualWindow<TData>>(() => {\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 const renderOffset = scrollScale > 0 ? logicalTopSpacerHeight / scrollScale : 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 ]);\n const currentVirtualProjection = useMemo<CominsVirtualProjection | null>(\n () =>\n !virtualized\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 (!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 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 nextLogicalScrollTop = 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 nextPhysicalScrollTop = getCominsPhysicalScrollTop(\n nextLogicalScrollTop,\n nextLogicalTotalHeight,\n viewport.clientHeight || pendingAnchorTransaction.previousViewportHeight,\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 viewport.scrollTop = 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 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 (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 setCominsSortModel(current, getNextSortModel(current.sortModel, column.id, multiSort && additive)),\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 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 || 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 groupingProjection,\n groupingRequested,\n filteringRequested,\n normalizedExpandedGroupIds,\n orderedGroupModel,\n rowGrouping,\n rowWindow.slots,\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, element.getBoundingClientRect().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 - element.getBoundingClientRect().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 animatedElements[0]?.getBoundingClientRect();\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 (treeContext && (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 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 (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n event.stopPropagation();\n copiedRangeRef.current = state.selection.range\n ? copyCominsCellRange(\n state,\n state.selection.range,\n groupingProjection?.visibleLeafRowIds ?? state.rowIds,\n )\n : null;\n copiedCellRef.current = copiedRangeRef.current ? null : copyCominsCell(state, address);\n return;\n }\n\n if (isCopyPasteKey(event, \"v\") && (copiedRangeRef.current || copiedCellRef.current)) {\n event.preventDefault();\n event.stopPropagation();\n commitState((current) =>\n copiedRangeRef.current\n ? pasteCominsCellRange(\n current,\n address,\n copiedRangeRef.current,\n groupingProjection?.visibleLeafRowIds ?? current.rowIds,\n )\n : pasteCominsCell(current, address, copiedCellRef.current),\n );\n }\n };\n const beginCellRangeDrag = (\n event: { button: number; shiftKey: boolean },\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (!cellSelection) {\n return;\n }\n\n if (disabled || event.button !== 0 || event.shiftKey) {\n return;\n }\n\n rangeDragAnchorRef.current = address;\n rangeDragLastAddressRef.current = address;\n rangeDragMovedRef.current = false;\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 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 || (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 beginCellRangeDrag(event, address, disabled);\n\n if (disabled || event.button !== 0 || event.shiftKey) {\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 event.preventDefault();\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 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 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 = (clientX: number, clientY: number) => {\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 autoScroll.stop();\n\n if (target.dataset.cominsRowDataIndex !== undefined) {\n const targetDataIndex = Number(target.dataset.cominsRowDataIndex);\n\n if (!Number.isInteger(targetDataIndex)) {\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 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 }\n return;\n }\n\n if (targetTableInstanceId === tableInstanceId) {\n crossTarget = null;\n clearExternalDropMarker();\n autoScroll.stop();\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 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 };\n autoScroll = createCrossTableAutoScroll(updateTarget);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons !== 1) {\n return;\n }\n\n updateTarget(moveEvent.clientX, moveEvent.clientY);\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 = rowMoveStateRef.current;\n const finalCrossTarget = crossTarget;\n cleanup();\n clearExternalDropMarker();\n setActiveRowMoveState(null);\n\n if (!moveState?.valid) {\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 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 } 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 }\n return;\n }\n\n if (groupingActive && rowGrouping && moveState.targetGroupId !== undefined) {\n const sourceGroupId = rowGrouping.getRowGroupId(entry.row, entry.dataIndex);\n\n if (\n sourceGroupId !== moveState.targetGroupId &&\n !expandedGroupIdSet.has(moveState.targetGroupId)\n ) {\n pendingGroupDisclosureFocusRef.current = moveState.targetGroupId;\n }\n\n commitState((current) => 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 return;\n }\n\n if (moveState.targetDataIndex !== undefined) {\n commitState((current) => moveCominsRow(current, sourceRowId, moveState.targetDataIndex!));\n }\n };\n const handlePointerCancel = () => {\n cleanup();\n clearExternalDropMarker();\n setActiveRowMoveState(null);\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n handlePointerCancel();\n }\n };\n\n updateTarget(event.clientX, event.clientY);\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 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 = groupElement.getBoundingClientRect();\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 autoScroll.stop();\n\n if (typeof onChangeGroups !== \"function\") {\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 setActiveGroupMoveState(null);\n return;\n }\n\n const bounds = targetRow.getBoundingClientRect();\n const position = clientY >= bounds.top + bounds.height / 2 ? \"after\" : \"before\";\n\n setActiveGroupMoveState({ position, sourceGroupId, targetGroupId });\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-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 = event.currentTarget.closest<HTMLTableCellElement>(\"th\")?.getBoundingClientRect().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 = headerCell?.getBoundingClientRect().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\"]}\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-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 <span\n aria-hidden=\"true\"\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 >\n <CominsTableIcon\n name={\n sortIndicatorState === \"asc\"\n ? \"sortAscending\"\n : sortIndicatorState === \"desc\"\n ? \"sortDescending\"\n : \"sortUnsorted\"\n }\n />\n </span>\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 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 = event.currentTarget.closest<HTMLTableCellElement>(\"th\")?.getBoundingClientRect().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 = headerCell?.getBoundingClientRect().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 element.scrollLeft = 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 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 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-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 ref={tableRootRef}\n style={{ ...currentTheme.style, ...style }}\n tabIndex={-1}\n >\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 const entry = slot;\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\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)} data-testid=\"row-move-placeholder\">\n 이 위치로 이동\n </td>\n </tr>\n ) : null}\n <tr\n aria-disabled={rowRuntimeProps.disabled ? \"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-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 (!(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 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)}\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 groupingProjection?.visibleLeafRowIds ?? state.rowIds,\n );\n const isCellSelected =\n cellSelection &&\n state.selection.cell?.rowId === entry.rowId &&\n state.selection.cell.columnId === column.id;\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 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 (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastCellAnchorRef.current = anchor;\n commitState((current) => {\n const nextRows =\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 = selectRow(current, entry.rowId, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n });\n\n return cellSelection ? selectCell(nextRows, address) : 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 = selectRowForContextMenu(current, entry.rowId);\n\n return cellSelection ? 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 }}\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 ? (\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 </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 >\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={scrollTop > 0 ? { transform: `translateY(${scrollTop}px)` } : undefined}\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 </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 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 () => getSortedCominsTree(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 treeContext = useMemo<CominsTreeRenderContext<TData>>(\n () => ({\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],\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: handleFlatDataChange,\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: 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\nfunction CominsTableAdapter<TData, TGroup = unknown>(\n props: CominsTableProps<TData, TGroup> | CominsTreeTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\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>) & 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/filtering.ts","../src/table-icons.tsx","../src/column-filter.tsx","../src/component-renderer.tsx","../src/drag-autoscroll.ts","../src/row-detail.tsx","../src/grouping.ts","../src/table-transfer.ts","../src/tooltip.tsx","../src/summary.ts","../src/tree.ts","../src/virtual-layout.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","import type {\n CominsCellFormatParams,\n CominsRowId,\n CominsTableRuntimeColumn,\n} from \"./core\";\n\nexport type CominsColumnFilterKind = \"boolean\" | \"date\" | \"number\" | \"text\";\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> = {\n caseSensitive?: boolean;\n getValue?: (params: CominsCellFormatParams<TData, TValue>) => unknown;\n kind: CominsColumnFilterKind;\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 {\n CaretSortIcon,\n ChevronRightIcon,\n DragHandleDots2Icon,\n MagnifyingGlassIcon,\n ThickArrowDownIcon,\n ThickArrowUpIcon,\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: ThickArrowUpIcon,\n sortDescending: ThickArrowDownIcon,\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} from \"react\";\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 onChangeRule,\n onOpenChange,\n open,\n rule,\n}: {\n columnId: string;\n columnLabel: string;\n kind: CominsColumnFilterKind;\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 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 return;\n }\n\n setOperator(rule?.operator ?? getDefaultOperator(kind));\n setValue(getRuleInputValue(rule, kind));\n setValueTo(getRuleInputValueTo(rule, kind));\n }, [kind, open, rule?.operator, rule?.value, rule?.valueTo]);\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({ 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 updatePosition();\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.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 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 onChangeRule({ columnId, operator: nextOperator });\n return;\n }\n\n if (kind === \"text\") {\n onChangeRule(nextValue.length > 0\n ? { columnId, operator: nextOperator, value: nextValue }\n : null);\n return;\n }\n\n if (kind === \"boolean\") {\n onChangeRule(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 onChangeRule(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 onChangeRule({ columnId, operator: nextOperator, value: firstValue, valueTo: secondValue });\n return;\n }\n\n onChangeRule({ 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 ? (\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 onChangeRule?.(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 \"./core\";\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={stopComponentEvent}\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","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 { useLayoutEffect, useRef } from \"react\";\nimport type * as React from \"react\";\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}) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const getToggleElementRef = useRef(props.getToggleElement);\n const onContentElementRef = useRef(props.onContentElement);\n const automatic = props.fixedHeight === undefined;\n\n getToggleElementRef.current = props.getToggleElement;\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 if (element?.contains(document.activeElement)) {\n const restoreFocus = () => {\n const toggle = getToggleElementRef.current();\n\n if (toggle?.isConnected) {\n toggle.focus();\n }\n };\n\n restoreFocus();\n window.requestAnimationFrame(restoreFocus);\n }\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 type React from \"react\";\n\nimport type {\n CominsRowId,\n CominsSortModel,\n CominsTableRuntimeColumn,\n} from \"./core\";\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\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 label: input.config.getGroupLabel?.(group) ?? String(groupId),\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,\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 { CominsRowId } from \"./core\";\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 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 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\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 registrations: Map<\n string,\n Map<string, Set<CominsTableTransferRegistration<TData, TGroup>>>\n >;\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 registrations: new Map(),\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>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n scope: string,\n tableId: string,\n registration: CominsTableTransferRegistration<TData, TGroup>,\n) {\n const state = getCoordinatorState(coordinator);\n\n if (!state) {\n return () => undefined;\n }\n\n let scopeRegistrations = state.registrations.get(scope);\n\n if (!scopeRegistrations) {\n scopeRegistrations = new Map();\n state.registrations.set(scope, scopeRegistrations);\n }\n\n let tableRegistrations = scopeRegistrations.get(tableId);\n\n if (!tableRegistrations) {\n tableRegistrations = new Set();\n scopeRegistrations.set(tableId, tableRegistrations);\n }\n\n tableRegistrations.add(registration);\n\n return () => {\n tableRegistrations.delete(registration);\n\n if (tableRegistrations.size === 0) {\n scopeRegistrations.delete(tableId);\n }\n\n if (scopeRegistrations.size === 0) {\n state.registrations.delete(scope);\n }\n };\n}\n\nexport function getCominsTableTransferRegistration<TData, TGroup>(\n coordinator: CominsTableTransferCoordinator<TData, TGroup>,\n scope: string,\n tableId: string,\n) {\n const registrations = getCoordinatorState(coordinator)\n ?.registrations.get(scope)\n ?.get(tableId);\n\n if (!registrations || registrations.size !== 1) {\n return null;\n }\n\n return [...registrations][0] ?? null;\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\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 { 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","import type React from \"react\";\n\nimport type { CominsTableRuntimeColumn } from \"./core\";\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\nfunction getNumericValues(values: readonly unknown[]) {\n return values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n}\n\nfunction getBuiltinSummaryValue(kind: CominsSummaryBuiltin, values: readonly unknown[]): React.ReactNode {\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\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 \"./core\";\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 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\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 { CominsRowId } from \"./core\";\n\nexport const COMINS_MAX_PHYSICAL_TOTAL_HEIGHT = 1_500_000;\n\nexport type CominsDataVirtualSlot<TData> = {\n dataIndex: number;\n detail?: {\n estimated: boolean;\n height: number;\n mode: \"auto\" | \"fixed\";\n };\n key: string;\n kind: \"data\";\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 CominsVirtualSlot<TData> =\n | CominsDataVirtualSlot<TData>\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 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 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 === \"group\"\n ? slot.height\n : 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: CominsHeightIndex;\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 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 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 \"./core\";\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 {\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 getCominsTableTransferRegistration,\n isCominsTableTransferCoordinator,\n registerCominsTableTransfer,\n transferCominsGroupBetweenTables,\n transferCominsRowBetweenTables,\n} from \"./table-transfer\";\nimport { CominsPointerTooltip } from \"./tooltip\";\nimport { getCominsSummaryValues } from \"./summary\";\nimport {\n flattenCominsTree,\n getCominsTreeLeafItems,\n sortCominsTreeSiblings,\n toggleCominsTreeNode,\n updateCominsTreeItem,\n} from \"./tree\";\nimport {\n CominsHeightIndex,\n captureCominsScrollAnchor,\n createCominsDataVirtualSlot,\n getCominsDataSlotKey,\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 * from \"./core\";\nexport * from \"./summary\";\nexport * from \"./tree\";\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 } from \"./tree\";\nimport type {\n CominsGroupingProjectionEntry,\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 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 \"./core\";\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\nconst COMINS_MIN_COLUMN_WIDTH = 88;\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 draggable?: CominsRowPropValue<TData, boolean | undefined>;\n style?: CominsRowPropValue<TData, React.CSSProperties | undefined>;\n};\n\nexport type CominsEventRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n index: number;\n};\n\nexport type CominsRowDragTarget = {\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 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 \"buffer-size\"?: number;\n cellSelection?: boolean;\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 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?: never;\n onBeforeRowDrag?: never;\n onRowDrag?: never;\n pagination?: never;\n rowProps?: Omit<CominsTableRowProps<TData>, \"draggable\"> & { draggable?: never };\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 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 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: HTMLDivElement;\n rowId: CominsRowId;\n};\n\ntype CominsTreeRenderContext<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 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) !== false,\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.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.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\nfunction getEffectiveColumnMinWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return Math.max(COMINS_MIN_COLUMN_WIDTH, column.minWidth ?? COMINS_MIN_COLUMN_WIDTH);\n}\n\nfunction getEffectiveColumnMaxWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return column.maxWidth ?? Number.POSITIVE_INFINITY;\n}\n\nfunction getRuntimeColumnWidth<TData>(\n state: CominsTableState<TData>,\n column: CominsTableRuntimeColumn<TData>,\n) {\n return state.columnState[column.id]?.width ?? column.width ?? 100;\n}\n\nfunction clampColumnWidth(width: number, minWidth: number, maxWidth: number) {\n return Math.min(maxWidth, Math.max(minWidth, width));\n}\n\nfunction distributeRuntimeColumnWidths<TData>(\n state: CominsTableState<TData>,\n columns: Array<CominsTableRuntimeColumn<TData>>,\n targetWidth: number,\n) {\n const widths = columns.map((column) =>\n clampColumnWidth(getRuntimeColumnWidth(state, column), getEffectiveColumnMinWidth(column), getEffectiveColumnMaxWidth(column)),\n );\n const active = new Set(columns.map((_column, index) => index));\n const minWidths = columns.map(getEffectiveColumnMinWidth);\n const maxWidths = columns.map(getEffectiveColumnMaxWidth);\n const boundedTargetWidth = clampColumnWidth(\n targetWidth,\n minWidths.reduce((sum, width) => sum + width, 0),\n maxWidths.reduce((sum, width) => sum + width, 0),\n );\n\n while (active.size > 0) {\n const currentTotal = widths.reduce((sum, width) => sum + width, 0);\n const delta = boundedTargetWidth - currentTotal;\n\n if (Math.abs(delta) < 0.001) {\n break;\n }\n\n const activeIndexes = [...active];\n const activeWeight = activeIndexes.reduce((sum, index) => sum + Math.max(widths[index] ?? 0, 0), 0);\n let clamped = false;\n\n for (const index of activeIndexes) {\n const width = widths[index] ?? 0;\n const weight = activeWeight > 0 ? width / activeWeight : 1 / activeIndexes.length;\n const nextWidth = width + delta * weight;\n const clampedWidth = clampColumnWidth(nextWidth, minWidths[index] ?? 0, maxWidths[index] ?? Number.POSITIVE_INFINITY);\n\n widths[index] = clampedWidth;\n\n if (Math.abs(clampedWidth - nextWidth) > 0.001) {\n active.delete(index);\n clamped = true;\n }\n }\n\n if (!clamped) {\n break;\n }\n }\n\n return widths;\n}\n\nfunction setColumnWidthInsideParentGroup<TData>(\n state: CominsTableState<TData>,\n columnId: string,\n width: number,\n) {\n const group = state.columnGroups.find((candidate) => candidate.children.includes(columnId));\n\n if (!group || state.columnGroupState[group.id]?.hidden === true) {\n return setCominsColumnWidth(state, columnId, width);\n }\n\n const childColumns = group.children\n .map((childId) => state.columns.find((column) => column.id === childId))\n .filter((column): column is CominsTableRuntimeColumn<TData> => Boolean(column))\n .filter((column) => state.columnState[column.id]?.hidden !== true);\n const targetColumn = childColumns.find((column) => column.id === columnId);\n\n if (!targetColumn) {\n return setCominsColumnWidth(state, columnId, width);\n }\n\n const siblingColumns = childColumns.filter((column) => column.id !== columnId);\n\n if (siblingColumns.length === 0) {\n const currentGroupWidth = getRuntimeColumnWidth(state, targetColumn);\n\n return setCominsColumnWidth(\n state,\n columnId,\n clampColumnWidth(width, getEffectiveColumnMinWidth(targetColumn), Math.min(getEffectiveColumnMaxWidth(targetColumn), currentGroupWidth)),\n );\n }\n\n const currentGroupWidth = childColumns.reduce((sum, column) => sum + getRuntimeColumnWidth(state, column), 0);\n const siblingMinWidth = siblingColumns.reduce((sum, column) => sum + getEffectiveColumnMinWidth(column), 0);\n const siblingMaxWidth = siblingColumns.reduce((sum, column) => sum + getEffectiveColumnMaxWidth(column), 0);\n const minWidth = Math.max(getEffectiveColumnMinWidth(targetColumn), currentGroupWidth - siblingMaxWidth);\n const maxWidth = Math.max(minWidth, Math.min(getEffectiveColumnMaxWidth(targetColumn), currentGroupWidth - siblingMinWidth));\n const nextTargetWidth = clampColumnWidth(width, minWidth, maxWidth);\n const nextSiblingWidths = distributeRuntimeColumnWidths(state, siblingColumns, currentGroupWidth - nextTargetWidth);\n let next = setCominsColumnWidth(state, columnId, nextTargetWidth);\n\n siblingColumns.forEach((column, index) => {\n next = setCominsColumnWidth(next, column.id, nextSiblingWidths[index] ?? getRuntimeColumnWidth(next, column));\n });\n\n return next;\n}\n\nfunction setCominsNestedInputValue<TData>(row: TData, field: string, value: string): TData {\n if (!row || typeof row !== \"object\") {\n return row;\n }\n\n const keys = field.split(\".\");\n const [firstKey] = keys;\n\n if (!firstKey) {\n return row;\n }\n\n if (keys.length === 1) {\n return { ...row, [firstKey]: value };\n }\n\n const root = { ...(row as Record<string, unknown>) };\n let current: Record<string, unknown> = root;\n\n keys.slice(0, -1).forEach((key, index) => {\n const nextKey = keys[index + 1];\n const existing = current[key];\n const next =\n existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n\n current[key] = next;\n\n if (nextKey) {\n current = next;\n }\n });\n\n current[keys.at(-1)!] = value;\n\n return root as TData;\n}\n\nfunction 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}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction areRowIdSequencesEqual(left: readonly CominsRowId[], right: readonly CominsRowId[]) {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nfunction 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\nfunction 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\nfunction canPreserveSelection<TData>(\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\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\nfunction getTreeNestedFieldValue(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\nfunction compareTreeValues(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\nfunction getSortedCominsTree<TData>(\n data: readonly CominsTreeNode<TData>[],\n columns: readonly CominsTableColumn<TData>[],\n sortModel: CominsSortModel,\n) {\n if (sortModel.length === 0) {\n return data;\n }\n\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\n if (!column?.sort) {\n continue;\n }\n\n const leftValue = getTreeNestedFieldValue(leftRow, column.field);\n const rightValue = getTreeNestedFieldValue(rightRow, column.field);\n const result =\n typeof column.sort === \"function\"\n ? column.sort(leftValue, rightValue, leftRow, rightRow)\n : compareTreeValues(leftValue, rightValue);\n\n if (result !== 0) {\n return rule.direction === \"desc\" ? result * -1 : result;\n }\n }\n\n return 0;\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 className,\n columnFiltering,\n columnGroups,\n columns,\n data,\n \"data-testid\": dataTestId,\n emptyComponent,\n estimatedRowDetailHeight,\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 = 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 virtualized = false,\n }: CominsTableInnerProps<TData, TGroup>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\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 detailElementsRef = useRef(\n new Map<Element, CominsObservedDetail>(),\n );\n const fallbackMeasuredDetailElementsRef = useRef(new Set<Element>());\n const detailObserverRef = useRef<ResizeObserver | null>(null);\n const detailObserverTargetsRef = useRef(new Set<Element>());\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 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 [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) => {\n if (!normalizedTableTransfer) {\n return null;\n }\n\n const registration = getCominsTableTransferRegistration(\n normalizedTableTransfer.coordinator,\n normalizedTableTransfer.scope,\n tableId,\n );\n const snapshot = registration?.getSnapshot() ?? null;\n\n if (\n !snapshot ||\n snapshot.config.coordinator !== normalizedTableTransfer.coordinator ||\n snapshot.config.scope !== normalizedTableTransfer.scope ||\n snapshot.config.tableId !== tableId ||\n snapshot.endpoint.tableId !== tableId\n ) {\n return null;\n }\n\n return snapshot;\n };\n const getCrossTableTransferHit = (\n clientX: number,\n clientY: number,\n ): CominsTransferTableHit<TData, TGroup> | null => {\n if (!normalizedTableTransfer) {\n return null;\n }\n\n const sourceSnapshot = getRegisteredTransferSnapshot(normalizedTableTransfer.tableId);\n const element = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n const root = element?.closest<HTMLElement>(\"[data-comins-table-instance-id]\") ?? null;\n const tableId = root?.dataset.cominsTransferTableId;\n\n if (\n !sourceSnapshot ||\n sourceSnapshot.instanceId !== tableInstanceId ||\n sourceSnapshot.root !== tableRootRef.current ||\n !element ||\n !root ||\n !tableId ||\n tableId === normalizedTableTransfer.tableId ||\n root.dataset.cominsTransferScope !== normalizedTableTransfer.scope\n ) {\n return null;\n }\n\n const snapshot = getRegisteredTransferSnapshot(tableId);\n\n if (\n !snapshot ||\n snapshot.root !== root ||\n snapshot.instanceId !== root.dataset.cominsTableInstanceId ||\n !snapshot.viewport ||\n !root.contains(snapshot.viewport)\n ) {\n return null;\n }\n\n return { element, root, snapshot };\n };\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 focusTarget.focus({ 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 root.focus({ preventScroll: true });\n };\n\n pendingTransferFocusFrameRef.current = window.requestAnimationFrame(attemptFocus);\n };\n 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: bounds.bottom, clientY, top: 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: bounds.bottom,\n clientY: nextClientY,\n top: 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\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 containerRef.current.scrollTop = 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 declaredColumnOrder = columns.map((column) => String(column.id ?? column.field));\n const currentLayout = serializeCominsColumnLayout(current);\n const historicalOrder = reconcileColumnOrderHistory(\n columnOrderHistoryRef.current,\n current.columnOrder,\n current.columns.map((column) => column.id),\n );\n const nextState = createCominsTableState({\n columnLayout: {\n ...currentLayout,\n order: insertDeclaredColumnsIntoOrder(historicalOrder, declaredColumnOrder),\n },\n columnGroups,\n columns,\n getRowId,\n pagination: effectivePagination,\n rows: effectiveData,\n showHeader,\n sortModel: current.sortModel,\n theme: current.theme,\n });\n const next = canPreserveSelection(current, nextState)\n ? { ...nextState, selection: current.selection }\n : nextState;\n\n columnOrderHistoryRef.current = reconcileColumnOrderHistory(\n historicalOrder,\n next.columnOrder,\n declaredColumnOrder,\n );\n\n if (previousInput.getRowId !== getRowId) {\n const previousRowById = new Map(\n current.rowIds.map((rowId, index) => [rowId, current.rows[index]]),\n );\n\n next.rowIds.forEach((rowId, index) => {\n if (previousRowById.has(rowId) && previousRowById.get(rowId) !== next.rows[index]) {\n detailMeasurementsRef.current.delete(rowId);\n }\n });\n }\n\n stateRef.current = next;\n setState(next);\n\n if (!areSortStatesEqual(next.sort, current.sort)) {\n onChangeSort?.(next.sort);\n }\n\n if (!areSortModelsEqual(next.sortModel, current.sortModel)) {\n onChangeSortModel?.(next.sortModel);\n }\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 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 || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n if (entry) {\n setContainerHeight(entry.contentRect.height);\n setContainerWidth(entry.contentRect.width);\n setHorizontalScrollContentWidth(element.scrollWidth);\n setHorizontalViewportOuterWidth(element.offsetWidth);\n setHorizontalViewportWidth(element.clientWidth);\n }\n });\n observer.observe(element);\n\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n reconcileCominsDetailMeasurements(\n detailMeasurementsRef.current,\n new Set(state.rowIds),\n );\n }, [state.rowIds]);\n\n const updateMixedProjectionDetailHeight = (\n snapshot: CominsCommittedDetailObserverSnapshot<TData>,\n rowId: CominsRowId,\n height: number,\n width: number,\n ) => {\n const projection = snapshot.projection;\n\n if (!projection || 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\" || slot.detail?.mode !== \"auto\") {\n return false;\n }\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 }>,\n ) => {\n const snapshot = committedDetailObserverSnapshotRef.current;\n\n if (!snapshot) {\n return;\n }\n\n const accepted = updates.filter(({ height, rowId, width }) => {\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 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 detailMeasurementsRef.current.set(update.rowId, {\n height: update.height,\n width: update.width,\n });\n updatedActiveIndex =\n updateMixedProjectionDetailHeight(\n snapshot,\n update.rowId,\n update.height,\n update.width,\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 (typeof ResizeObserver === \"undefined\") {\n return null;\n }\n\n const observer = new ResizeObserver((entries) => {\n const updates: Array<{\n height: number;\n rowId: CominsRowId;\n width: number;\n }> = [];\n\n for (const entry of entries) {\n const observed = detailElementsRef.current.get(entry.target);\n\n if (!observed) {\n continue;\n }\n\n const borderBox = Array.isArray(entry.borderBoxSize)\n ? entry.borderBoxSize[0]\n : entry.borderBoxSize;\n const height =\n borderBox?.blockSize ??\n (entry.target as HTMLElement).getBoundingClientRect().height;\n const width = Math.round(\n (entry.target as HTMLElement).getBoundingClientRect().width,\n );\n\n if (Number.isFinite(height) && height > 0) {\n updates.push({ height, rowId: observed.rowId, width });\n }\n }\n\n applyDetailMeasurementUpdates(updates);\n });\n\n detailObserverRef.current = observer;\n\n for (const observed of detailElementsRef.current.values()) {\n detailObserverTargetsRef.current.add(observed.element);\n observer.observe(observed.element);\n }\n\n return observer;\n };\n\n useLayoutEffect(() => {\n return () => {\n detailObserverRef.current?.disconnect();\n detailObserverRef.current = null;\n detailObserverTargetsRef.current.clear();\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?.disconnect();\n detailObserverRef.current = null;\n detailObserverTargetsRef.current.clear();\n }\n };\n\n const registerDetailElement = (\n rowId: CominsRowId,\n mode: \"auto\" | \"fixed\",\n element: HTMLDivElement | null,\n ) => {\n for (const [currentElement, observed] of detailElementsRef.current) {\n if (observed.rowId === rowId && currentElement !== element) {\n detailObserverRef.current?.unobserve(currentElement);\n detailObserverTargetsRef.current.delete(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 });\n };\n\n const notifyChanges = (\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n if (next.rows !== current.rows) {\n onChangeData?.(next.rows);\n }\n\n if (next.selection !== current.selection) {\n onChangeSelection?.(next.selection);\n }\n\n if (options.columnLayoutChanged) {\n onChangeColumnLayout?.(serializeCominsColumnLayout(next));\n }\n\n if (!areSortStatesEqual(next.sort, current.sort)) {\n onChangeSort?.(next.sort);\n }\n\n if (!areSortModelsEqual(next.sortModel, current.sortModel)) {\n onChangeSortModel?.(next.sortModel);\n }\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 const transferCoordinator = normalizedTableTransfer?.coordinator;\n const transferScope = normalizedTableTransfer?.scope;\n const transferTableId = normalizedTableTransfer?.tableId;\n useEffect(() => {\n if (!transferCoordinator || !transferScope || !transferTableId) {\n return undefined;\n }\n\n return registerCominsTableTransfer(\n transferCoordinator,\n transferScope,\n transferTableId,\n {\n getSnapshot: () => {\n const snapshot = transferSnapshotRef.current;\n\n return snapshot\n ? {\n ...snapshot,\n root: tableRootRef.current,\n viewport: containerRef.current,\n }\n : null;\n },\n },\n );\n }, [transferCoordinator, transferScope, transferTableId]);\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 disclosure.focus();\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 groupDisclosureElementsRef.current.get(fallbackGroupId)?.focus();\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 visibleRowCount = projectedDataIndexes.length;\n const visibleSlotCount = groupingProjection?.entries.length ?? visibleRowCount;\n const pageSize = Math.max(1, state.pagination.pageSize);\n const maxPageIndex = Math.max(0, Math.ceil(visibleRowCount / pageSize) - 1);\n const effectivePageIndex = Math.min(Math.max(0, state.pagination.pageIndex), maxPageIndex);\n const pageStartIndex = effectivePageIndex * pageSize;\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 fullProjectionSlots = useMemo<Array<CominsVirtualSlot<TData>>>(() => {\n const safeRowHeight = Math.max(1, rowHeight);\n const entries: readonly CominsGroupingProjectionEntry[] = groupingProjection?.entries ?? projectedDataIndexes.map(\n (dataIndex, visibleLeafIndex) => {\n const rowId = state.rowIds[dataIndex];\n\n return rowId === undefined\n ? null\n : {\n dataIndex,\n key: getCominsDataSlotKey(rowId),\n kind: \"data\" as const,\n rowId,\n visibleLeafIndex,\n };\n },\n ).filter((entry): entry is Extract<CominsGroupingProjectionEntry, { kind: \"data\" }> => entry !== null);\n\n return entries.flatMap<CominsVirtualSlot<TData>>((projectionEntry) => {\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, visibleLeafIndex: visibleIndex } = projectionEntry;\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\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: safeRowHeight,\n rowId,\n visibleIndex,\n }),\n ];\n });\n }, [\n detailContentWidth,\n virtualized ? 0 : detailLayoutVersion,\n effectiveExpandedRowIdSet,\n estimatedRowDetailHeight,\n getRowDetailHeight,\n groupingProjection,\n projectedDataIndexes,\n rowHeight,\n state.rowIds,\n state.rows,\n ]);\n const mixedProjection = useMemo<CominsMixedVirtualProjection<TData> | null>(() => {\n if (!virtualized || effectiveExpandedRowIdSet.size === 0) {\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 ]);\n const detailObserverSnapshotCandidate = useMemo<\n CominsCommittedDetailObserverSnapshot<TData>\n >(\n () => ({\n contentWidth: detailContentWidth,\n projection: mixedProjection,\n viewportHeight:\n containerHeight || Math.max(1, rowHeight) * 12,\n }),\n [containerHeight, detailContentWidth, mixedProjection, rowHeight],\n );\n\n useLayoutEffect(() => {\n committedDetailObserverSnapshotRef.current =\n detailObserverSnapshotCandidate;\n\n if (detailElementsRef.current.size === 0) {\n disconnectDetailObserverIfIdle();\n return;\n }\n\n if (typeof ResizeObserver !== \"undefined\") {\n const currentObserver = detailObserverRef.current;\n const observer = currentObserver ?? createDetailObserver();\n\n if (currentObserver) {\n for (const observed of detailElementsRef.current.values()) {\n if (!detailObserverTargetsRef.current.has(observed.element)) {\n detailObserverTargetsRef.current.add(observed.element);\n observer?.observe(observed.element);\n }\n }\n }\n return;\n }\n\n const updates: Array<{\n height: number;\n rowId: CominsRowId;\n width: number;\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 = observed.element.getBoundingClientRect();\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 });\n }\n }\n\n applyDetailMeasurementUpdates(updates);\n });\n const rowWindow = useMemo<CominsVirtualWindow<TData>>(() => {\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 const renderOffset = scrollScale > 0 ? logicalTopSpacerHeight / scrollScale : 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 ]);\n const currentVirtualProjection = useMemo<CominsVirtualProjection | null>(\n () =>\n !virtualized\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 (!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 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 nextLogicalScrollTop = 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 nextPhysicalScrollTop = getCominsPhysicalScrollTop(\n nextLogicalScrollTop,\n nextLogicalTotalHeight,\n viewport.clientHeight || pendingAnchorTransaction.previousViewportHeight,\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 viewport.scrollTop = 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 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 (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 setCominsSortModel(current, getNextSortModel(current.sortModel, column.id, multiSort && additive)),\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 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 || 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 groupingProjection,\n groupingRequested,\n filteringRequested,\n normalizedExpandedGroupIds,\n orderedGroupModel,\n rowGrouping,\n rowWindow.slots,\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, element.getBoundingClientRect().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 - element.getBoundingClientRect().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 animatedElements[0]?.getBoundingClientRect();\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 (treeContext && (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 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 (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n event.stopPropagation();\n copiedRangeRef.current = state.selection.range\n ? copyCominsCellRange(\n state,\n state.selection.range,\n groupingProjection?.visibleLeafRowIds ?? state.rowIds,\n )\n : null;\n copiedCellRef.current = copiedRangeRef.current ? null : copyCominsCell(state, address);\n return;\n }\n\n if (isCopyPasteKey(event, \"v\") && (copiedRangeRef.current || copiedCellRef.current)) {\n event.preventDefault();\n event.stopPropagation();\n commitState((current) =>\n copiedRangeRef.current\n ? pasteCominsCellRange(\n current,\n address,\n copiedRangeRef.current,\n groupingProjection?.visibleLeafRowIds ?? current.rowIds,\n )\n : pasteCominsCell(current, address, copiedCellRef.current),\n );\n }\n };\n const beginCellRangeDrag = (\n event: { button: number; shiftKey: boolean },\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (!cellSelection) {\n return;\n }\n\n if (disabled || event.button !== 0 || event.shiftKey) {\n return;\n }\n\n rangeDragAnchorRef.current = address;\n rangeDragLastAddressRef.current = address;\n rangeDragMovedRef.current = false;\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 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 || (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 beginCellRangeDrag(event, address, disabled);\n\n if (disabled || event.button !== 0 || event.shiftKey) {\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 event.preventDefault();\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 autoScroll.stop();\n\n if (target.dataset.cominsRowDataIndex !== undefined) {\n const targetDataIndex = Number(target.dataset.cominsRowDataIndex);\n\n if (!Number.isInteger(targetDataIndex)) {\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 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 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 autoScroll.stop();\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 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 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 = groupElement.getBoundingClientRect();\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 autoScroll.stop();\n\n if (typeof onChangeGroups !== \"function\") {\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 setActiveGroupMoveState(null);\n return;\n }\n\n const bounds = targetRow.getBoundingClientRect();\n const position = clientY >= bounds.top + bounds.height / 2 ? \"after\" : \"before\";\n\n setActiveGroupMoveState({ position, sourceGroupId, targetGroupId });\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-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 = event.currentTarget.closest<HTMLTableCellElement>(\"th\")?.getBoundingClientRect().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 = headerCell?.getBoundingClientRect().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\"]}\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-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 <span\n aria-hidden=\"true\"\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 >\n <CominsTableIcon\n name={\n sortIndicatorState === \"asc\"\n ? \"sortAscending\"\n : sortIndicatorState === \"desc\"\n ? \"sortDescending\"\n : \"sortUnsorted\"\n }\n />\n </span>\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 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 = event.currentTarget.closest<HTMLTableCellElement>(\"th\")?.getBoundingClientRect().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 = headerCell?.getBoundingClientRect().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 element.scrollLeft = 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 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 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-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 ref={tableRootRef}\n style={{ ...currentTheme.style, ...style }}\n tabIndex={-1}\n >\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 const entry = slot;\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\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)} data-testid=\"row-move-placeholder\">\n 이 위치로 이동\n </td>\n </tr>\n ) : null}\n <tr\n aria-disabled={rowRuntimeProps.disabled ? \"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-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 (!(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 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)}\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 groupingProjection?.visibleLeafRowIds ?? state.rowIds,\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 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 (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastCellAnchorRef.current = anchor;\n commitState((current) => {\n const nextRows =\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 = 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 = selectRowForContextMenu(current, entry.rowId);\n\n return cellSelection ? 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 }}\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 ? (\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 </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 >\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={scrollTop > 0 ? { transform: `translateY(${scrollTop}px)` } : undefined}\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 </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 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 () => getSortedCominsTree(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 treeContext = useMemo<CominsTreeRenderContext<TData>>(\n () => ({\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],\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: handleFlatDataChange,\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: 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\nfunction CominsTableAdapter<TData, TGroup = unknown>(\n props: CominsTableProps<TData, TGroup> | CominsTreeTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\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>) & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nexport const cominsTablePackage = \"comins-table\";\n"],"mappings":"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"}
|