comins-table 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/column-pointer.ts","../src/component-renderer.tsx","../src/summary.ts","../src/tree.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 { 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","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 React from \"react\";\nimport { Fragment, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } 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 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 { renderCominsBuiltInComponent, type CominsBuiltInComponentInteraction } from \"./component-renderer\";\nimport { getCominsSummaryValues } from \"./summary\";\nimport {\n flattenCominsTree,\n getCominsTreeLeafItems,\n sortCominsTreeSiblings,\n toggleCominsTreeNode,\n updateCominsTreeItem,\n} from \"./tree\";\n\nexport * from \"./core\";\nexport * from \"./summary\";\nexport * from \"./tree\";\n\nimport type { CominsTableSummaryConfig } from \"./summary\";\nimport type { CominsTreeNode, CominsVisibleTreeRow } from \"./tree\";\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 CominsColumnPointerOptions = {\n activate: (x: number, y: number) => void;\n commitTarget: (targetId: string) => void;\n event: React.PointerEvent<HTMLTableCellElement>;\n id: string;\n kind: \"column\" | \"group\";\n sortColumnId?: string;\n};\ntype CominsSuppressedSortClick = {\n cleanup: () => void;\n columnId: string;\n timer: number | null;\n};\ntype CominsRowMoveState = {\n sourceRowId: CominsRowId;\n targetDataIndex: number;\n};\n\nconst COMINS_MIN_COLUMN_WIDTH = 50;\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 CominsTableRef<TData = unknown> = {\n clearSort: () => void;\n expand: (nodeIds?: readonly CominsRowId[]) => void;\n fold: (nodeIds?: 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\nexport type CominsLazyLoadResult<TData> = {\n rows: readonly TData[];\n total?: number;\n};\n\nexport type CominsTableProps<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<CominsLazyLoadResult<TData>>;\n onLoadMore?: () => void;\n pagination?: Partial<CominsPaginationState>;\n persistHeaderWhenEmpty?: boolean;\n rowHeight?: number;\n rowProps?: CominsTableRowProps<TData>;\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\nexport type CominsTreeTableProps<TData> = Omit<\n CominsTableProps<TData>,\n | \"data\"\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 | \"tree\"\n> & {\n data: readonly CominsTreeNode<TData>[];\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 tree: true;\n};\n\ntype VisibleRowEntry<TData> = {\n dataIndex: number;\n row: TData;\n rowId: CominsRowId;\n visibleIndex: number;\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};\n\ntype CominsTableInnerProps<TData> = CominsTableProps<TData> & {\n treeContext?: CominsTreeRenderContext<TData>;\n};\n\nfunction createVisibleRowEntries<TData>(\n sortedRowIndexes: number[] | null,\n rows: TData[],\n rowIds: CominsRowId[],\n startIndex: number,\n endIndex: number,\n) {\n const safeStartIndex = Math.max(0, startIndex);\n const visibleRowCount = sortedRowIndexes?.length ?? rows.length;\n const safeEndIndex = Math.min(visibleRowCount, Math.max(safeStartIndex, endIndex));\n const entries: Array<VisibleRowEntry<TData>> = [];\n\n for (let visibleIndex = safeStartIndex; visibleIndex < safeEndIndex; visibleIndex += 1) {\n const dataIndex = sortedRowIndexes?.[visibleIndex] ?? visibleIndex;\n const row = rows[dataIndex];\n const rowId = rowIds[dataIndex];\n\n if (row !== undefined && rowId !== undefined) {\n entries.push({ dataIndex, row, rowId, visibleIndex });\n }\n }\n\n return entries;\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 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>(\n {\n \"buffer-size\": bufferSize,\n cellSelection = true,\n className,\n columnGroups,\n columns,\n data,\n \"data-testid\": dataTestId,\n emptyComponent,\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 onDoubleClickCell,\n onDoubleClickRow,\n onKeyDownCell,\n onKeyDownRow,\n onLazyLoad,\n onLoadMore,\n pagination,\n persistHeaderWhenEmpty = true,\n rowHeight = 36,\n rowProps,\n showHeader = true,\n skeletonRowCount,\n style,\n summary,\n theme,\n treeContext,\n virtualized = false,\n }: CominsTableInnerProps<TData>,\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 copiedCellRef = useRef<CominsCopiedCell | null>(null);\n const copiedRangeRef = useRef<CominsCopiedCellRange | null>(null);\n const copiedRowRef = useRef<CominsCopiedRow<TData> | null>(null);\n const activePointerGestureCleanupRef = useRef<(() => void) | null>(null);\n const columnPointerInteractionRef = useRef<CominsColumnPointerInteraction | null>(null);\n const lastCellAnchorRef = useRef<CominsCellAddress | null>(null);\n const lazyAbortControllerRef = useRef<AbortController | null>(null);\n const lazyLoadingReasonRef = useRef<CominsLazyLoadReason | null>(null);\n const lazyRequestIdRef = useRef(0);\n const lazyRowsRef = useRef<readonly TData[]>(data);\n const lazyTotalRowsRef = useRef<number | undefined>(undefined);\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 pendingScrollTopRef = useRef(0);\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 [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 [columnMoveTargetId, setColumnMoveTargetId] = useState<string | null>(null);\n const [lazyLoadingReason, setLazyLoadingReason] = useState<CominsLazyLoadReason | null>(null);\n const [lazyRows, setLazyRows] = useState<readonly TData[]>(data);\n const [lazyTotalRows, setLazyTotalRows] = useState<number | undefined>(undefined);\n const [resizingColumnId, setResizingColumnId] = useState<string | null>(null);\n const [rowMoveState, setRowMoveState] = useState<CominsRowMoveState | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const effectiveData = lazyLoad ? lazyRows : data;\n const [state, setState] = useState(() =>\n createCominsTableState({\n columnGroups,\n columns,\n getRowId,\n pagination,\n rows: effectiveData,\n showHeader,\n theme,\n }),\n );\n const stateRef = useRef(state);\n const stateInputRef = useRef({ columnGroups, columns, data: effectiveData, getRowId, pagination, 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 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\n const requestLazyLoad = (reason: CominsLazyLoadReason) => {\n if (!lazyLoad || lazyLoadMode !== \"append\" || !onLazyLoad || lazyLoadingReasonRef.current) {\n return;\n }\n\n const currentRowsLength = stateRef.current.rows.length;\n\n if (reason === \"scroll\" && lazyTotalRowsRef.current !== undefined && currentRowsLength >= lazyTotalRowsRef.current) {\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 setLazyLoadingReason(reason);\n\n void onLazyLoad({\n limit: resolvedLazyLoadBatchSize,\n offset,\n reason,\n signal: controller.signal,\n })\n .then((result) => {\n if (controller.signal.aborted || lazyRequestIdRef.current !== requestId) {\n return;\n }\n\n const nextRows = reason === \"scroll\" ? [...lazyRowsRef.current, ...result.rows] : [...result.rows];\n\n lazyRowsRef.current = nextRows;\n lazyTotalRowsRef.current = result.total;\n setLazyRows(nextRows);\n setLazyTotalRows(result.total);\n })\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 setLazyLoadingReason(null);\n });\n };\n\n useEffect(() => {\n lazyRowsRef.current = lazyRows;\n }, [lazyRows]);\n\n useEffect(() => {\n lazyTotalRowsRef.current = lazyTotalRows;\n }, [lazyTotalRows]);\n\n useEffect(() => {\n if (lazyLoad) {\n return;\n }\n\n lazyRowsRef.current = data;\n setLazyRows(data);\n lazyTotalRowsRef.current = undefined;\n setLazyTotalRows(undefined);\n }, [data, lazyLoad]);\n\n useEffect(() => {\n if (!lazyLoad || !onLazyLoad) {\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 }, [lazyLoad, onLazyLoad, 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 === pagination &&\n previousInput.showHeader === showHeader\n ) {\n return;\n }\n\n stateInputRef.current = { columnGroups, columns, data: effectiveData, getRowId, pagination, showHeader };\n const current = stateRef.current;\n const nextState = createCominsTableState({\n columnLayout: serializeCominsColumnLayout(current),\n columnGroups,\n columns,\n getRowId,\n pagination: pagination ?? current.pagination,\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 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, getRowId, pagination, 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\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 }\n });\n observer.observe(element);\n\n return () => observer.disconnect();\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 headerRows = useMemo(() => getCominsHeaderRows(state), [state]);\n const summaryValues = useMemo(\n () => (summary ? getCominsSummaryValues(treeContext?.summaryRows ?? state.rows, visibleColumns, summary) : null),\n [state.rows, 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 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 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 sortedRowIndexes = useMemo(\n () => (treeContext || state.sortModel.length === 0 ? null : getCominsSortedRowIndexes(state)),\n [state, treeContext],\n );\n const visibleRowCount = sortedRowIndexes?.length ?? state.rows.length;\n const pageStartIndex = Math.max(0, state.pagination.pageIndex) * Math.max(1, state.pagination.pageSize);\n const rowWindow = useMemo(() => {\n if (virtualized) {\n const safeRowHeight = Math.max(1, rowHeight);\n const viewportHeight = containerHeight || rowHeight * 12;\n const totalHeight = visibleRowCount * 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 visibleRowCount,\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 entries: createVisibleRowEntries(sortedRowIndexes, state.rows, state.rowIds, startIndex, endIndex),\n renderOffset,\n scrollHeight: physicalTotalHeight,\n };\n }\n\n return {\n entries: createVisibleRowEntries(\n sortedRowIndexes,\n state.rows,\n state.rowIds,\n pageStartIndex,\n pageStartIndex + Math.max(1, state.pagination.pageSize),\n ),\n renderOffset: 0,\n scrollHeight: 0,\n };\n }, [\n containerHeight,\n pageStartIndex,\n rowHeight,\n scrollTop,\n sortedRowIndexes,\n state.pagination.pageSize,\n state.rowIds,\n state.rows,\n virtualBufferSize,\n virtualized,\n visibleRowCount,\n ]);\n const currentTheme = theme ?? state.theme;\n const densityClass =\n currentTheme.density === \"compact\"\n ? \"text-[11px]\"\n : currentTheme.density === \"spacious\"\n ? \"text-[13px]\"\n : \"text-[length:var(--comins-font-size-base,12px)]\";\n const selectedRowIdSet = useMemo(() => new Set(state.selection.rowIds), [state.selection.rowIds]);\n const 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) => width ?? fallbackWidth);\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 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 hasHorizontalOverflow =\n typeof columnWidthTotal === \"number\" && containerWidth > 0 ? columnWidthTotal > containerWidth + 1 : false;\n const lazyHasMoreRows = lazyLoad && (lazyTotalRows === undefined || visibleRowCount < lazyTotalRows);\n const resolvedHasMoreRows = lazyLoad ? lazyHasMoreRows : hasMoreRows;\n const resolvedLoading = loading || lazyLoadingReason === \"initial\" || lazyLoadingReason === \"refresh\";\n const resolvedLoadingMore = loadingMore || lazyLoadingReason === \"scroll\";\n const isEmpty = visibleRowCount === 0;\n const shouldRenderSkeleton = resolvedLoading && isEmpty;\n const shouldRenderEmpty = !resolvedLoading && isEmpty;\n const shouldRenderInfiniteLoadingRow =\n (infiniteScroll || lazyLoad) && resolvedLoadingMore && resolvedHasMoreRows && !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 = (rowWindow.entries.length + 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) => rowWindow.entries[index];\n const getVisibleRowIdsBetween = (\n current: CominsTableState<TData>,\n anchorRowId: CominsRowId,\n focusRowId: CominsRowId,\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 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 getColumnMoveTargetId = (clientX: number, clientY: number) => {\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 if (targetHeader.dataset.cominsColumnId) {\n return targetHeader.dataset.cominsColumnId;\n }\n\n const groupId = targetHeader.dataset.cominsColumnGroupId;\n const targetGroup = groupId ? stateRef.current.columnGroups.find((group) => group.id === groupId) : undefined;\n\n return targetGroup?.children.find((childId) => visibleColumns.some((column) => column.id === childId)) ?? null;\n };\n\n useImperativeHandle(\n ref,\n () => ({\n clearSort: () => commitState((current) => clearCominsSortState(current)),\n expand: (nodeIds) => treeContext?.onExpand(nodeIds),\n fold: (nodeIds) => treeContext?.onFold(nodeIds),\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) {\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 [rowWindow.entries, state, treeContext],\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 setColumnMoveTargetId(null);\n };\n\n useEffect(\n () => () => {\n clearColumnPointerInteraction();\n clearSuppressedSortClick();\n },\n [],\n );\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 };\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 setColumnMoveTargetId(getColumnMoveTargetId(moveEvent.clientX, moveEvent.clientY));\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (current === interaction && current.active) {\n const targetId = getColumnMoveTargetId(upEvent.clientX, upEvent.clientY);\n\n if (targetId) {\n options.commitTarget(targetId);\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);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\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);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"blur\", handleWindowBlur);\n };\n\n const beginHeaderPointerInteraction = (\n event: React.PointerEvent<HTMLTableCellElement>,\n column: CominsTableRuntimeColumn<TData>,\n ) => {\n beginColumnPointerInteraction({\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setColumnMoveTargetId(column.id);\n setMovingGroupId(null);\n setMovingColumnId(column.id);\n },\n commitTarget: (targetId) => {\n if (targetId === column.id) {\n return;\n }\n\n const targetIndex = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === targetId);\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 commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: column.id,\n kind: \"column\",\n sortColumnId: column.id,\n });\n };\n\n const beginGroupPointerInteraction = (\n event: React.PointerEvent<HTMLTableCellElement>,\n group: CominsTableRuntimeColumnGroup,\n ) => {\n beginColumnPointerInteraction({\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setColumnMoveTargetId(group.children[0] ?? null);\n setMovingColumnId(null);\n setMovingGroupId(group.id);\n },\n commitTarget: (targetId) => {\n if (group.children.includes(targetId)) {\n return;\n }\n\n const targetIndex = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === targetId);\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 commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: group.id,\n kind: \"group\",\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 ? copyCominsCellRange(state) : 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(current, address, copiedRangeRef.current)\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 const setActiveRowMoveState = (next: CominsRowMoveState | null) => {\n rowMoveStateRef.current = next;\n setRowMoveState(next);\n };\n const updateTarget = (clientX: number, clientY: number) => {\n const targetRow = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-row-data-index]\");\n\n if (!targetRow || targetRow.dataset.cominsRowDataIndex === undefined) {\n return;\n }\n\n const targetDataIndex = Number(targetRow.dataset.cominsRowDataIndex);\n\n if (Number.isInteger(targetDataIndex)) {\n setActiveRowMoveState({ sourceRowId, targetDataIndex });\n }\n };\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\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n cleanup();\n updateTarget(upEvent.clientX, upEvent.clientY);\n\n const targetIndex = rowMoveStateRef.current?.targetDataIndex;\n setActiveRowMoveState(null);\n\n if (targetIndex !== undefined) {\n commitState((current) => moveCominsRow(current, sourceRowId, targetIndex));\n }\n };\n const handlePointerCancel = () => {\n cleanup();\n setActiveRowMoveState(null);\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 };\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?.label ?? movingGroup?.label;\n\n const renderHeaderCell = (cell: CominsHeaderCell<TData>, fallbackIndex: number) => {\n if (cell.kind === \"group\") {\n return (\n <th\n className={[\n \"comins-table__th comins-table__group-th px-3 py-2 text-left font-semibold\",\n movingGroupId === cell.groupId ? \"comins-column-moving\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n colSpan={cell.colSpan}\n data-column-moving={movingGroupId === cell.groupId ? \"true\" : undefined}\n data-column-placeholder={movingGroupId === cell.groupId ? \"true\" : undefined}\n data-comins-column-group-id={cell.groupId}\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 >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span className=\"comins-table__header-content\" data-comins-header-body=\"true\">\n <span className=\"comins-table__header-label\">{cell.group.label}</span>\n </span>\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 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(next, cell.groupId, startWidth + moveEvent.clientX - startX);\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 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 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 headerRendererBody = column.header?.renderer ? column.header.renderer(headerPayload) : null;\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\n return (\n <th\n {...headerProps}\n className={headerClassName}\n colSpan={cell.colSpan}\n data-column-drop-target={columnMoveTargetId === column.id ? \"true\" : undefined}\n data-column-moving={movingColumnId === column.id ? \"true\" : undefined}\n data-column-placeholder={isColumnPlaceholder ? \"true\" : undefined}\n data-comins-column-id={column.id}\n data-comins-column-index={safeIndex}\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-testid={`header-${column.id}`}\n aria-sort={column.sort ? getAriaSortState(state.sortModel, column.id) : undefined}\n key={`column-${column.id}`}\n onClick={(event) => {\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 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, column)}\n rowSpan={cell.rowSpan}\n scope=\"col\"\n style={{ width: columnState?.width ?? column.width, ...headerProps.style }}\n tabIndex={column.sort ? 0 : undefined}\n >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span\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 >\n <span className=\"comins-table__header-slot\" data-comins-header-slot=\"left\">\n {headerLeftSlots}\n </span>\n <span className=\"comins-table__header-label\">\n {column.header?.renderer ? headerRendererBody : 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 <span className=\"comins-sort-icon\" />\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 {headerRightSlots}\n </span>\n </span>\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 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.max(getEffectiveColumnMinWidth(column), 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 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 (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 handleBodyScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const bodyViewport = event.currentTarget;\n\n pendingScrollTopRef.current = bodyViewport.scrollTop;\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 let nextScrollLeft = Math.max(0, bodyViewport.scrollLeft);\n\n if (headerRef.current) {\n const headerMaxScrollLeft = Math.max(0, headerRef.current.scrollWidth - headerRef.current.clientWidth);\n const bodyMaxScrollLeft = Math.max(0, bodyViewport.scrollWidth - bodyViewport.clientWidth);\n const sharedMaxScrollLeft = Math.min(headerMaxScrollLeft, bodyMaxScrollLeft);\n nextScrollLeft = Math.min(sharedMaxScrollLeft, nextScrollLeft);\n\n if (Math.abs(bodyViewport.scrollLeft - nextScrollLeft) > 0.5) {\n bodyViewport.scrollLeft = nextScrollLeft;\n }\n\n headerRef.current.scrollLeft = nextScrollLeft;\n }\n\n if (footerRef.current) {\n footerRef.current.scrollLeft = nextScrollLeft;\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-loading={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-show-header={renderedHeaderVisible ? \"true\" : undefined}\n style={{ ...currentTheme.style, ...style }}\n >\n {renderedHeaderVisible ? (\n <div className=\"comins-table__header\" ref={headerRef}>\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 </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 onScroll={handleBodyScroll}\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 <td\n className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\"\n data-testid={`loading-skeleton-cell-${skeletonIndex}-${column.id}`}\n key={column.id}\n style={{ height: rowHeight }}\n >\n <span className=\"comins-table__skeleton-block\" />\n </td>\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.entries.map((entry, entryIndex) => {\n const rowRuntimeProps = resolveRowProps(rowProps, entry.row, entry.visibleIndex);\n const isRowSelected = selectedRowIdSet.has(entry.rowId);\n const isViewportEndRow = emptyFillerHeight === 0 && entryIndex === rowWindow.entries.length - 1;\n const rowCustomBackground = getRowCustomBackground(rowRuntimeProps.style);\n const rowRenderKey = virtualized ? `virtual-row-slot-${entryIndex}` : String(entry.rowId);\n\n return (\n <Fragment key={rowRenderKey}>\n {rowMoveState?.targetDataIndex === entry.dataIndex && rowMoveState.sourceRowId !== entry.rowId ? (\n <tr aria-hidden=\"true\" className=\"comins-row-move-placeholder\">\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 ? \"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-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) => selectRow(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 rawValue = getCominsCellValue(state, entry.row, column.id);\n const address = { columnId: column.id, rowId: entry.rowId };\n const isCellInRange = cellSelection && isCominsCellInSelectedRange(state, address);\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 = columnIndex === 0 ? treeContext?.entriesByRowId.get(entry.rowId) : 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 <button\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 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 type=\"button\"\n >\n {treeEntry.expanded ? \"▾\" : \"▸\"}\n </button>\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 columnIndex === 0 ? \"comins-table__td--with-row-handle\" : undefined,\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-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 (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n commitState((current) => {\n const nextRows = selectRow(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 (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 }}\n title={typeof tooltip === \"string\" ? tooltip : undefined}\n tabIndex={cellDisabled ? -1 : 0}\n >\n {columnIndex === 0 && rowRuntimeProps.draggable ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-row-drag-handle\"\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 {renderedCellContent}\n </td>\n );\n })}\n </tr>\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 aria-label=\"Table summary\" className=\"comins-table__summary\" ref={footerRef}>\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.map((cell) => (\n <td\n className={[\"comins-table__summary-cell px-3 py-2\", cell.className].filter(Boolean).join(\" \")}\n colSpan={cell.colSpan}\n data-testid={`summary-cell-${cell.column.id}`}\n key={cell.column.id}\n style={cell.style}\n >\n {cell.value}\n </td>\n ))}\n </tr>\n </tfoot>\n </table>\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 {movingHeaderLabel}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction CominsTreeTableInner<TData>(\n {\n data,\n defaultExpandAll = true,\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 onChangeSort,\n onChangeSortModel,\n onLazyLoad: _onLazyLoad,\n onLoadMore: _onLoadMore,\n rowProps,\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 sortedTree = useMemo(\n () => getSortedCominsTree(data, props.columns, treeSortModel),\n [data, props.columns, 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 }),\n [data, entriesByRowId, getRowId, initialDefaultExpandAll, onChangeData],\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 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>(\n props: CominsTableInnerProps<TData> & 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>(\n props: CominsTableProps<TData> | 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>(\n props: (CominsTableProps<TData> | 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/row-detail.tsx","../src/grouping.ts","../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","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 { 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 { renderCominsBuiltInComponent, type CominsBuiltInComponentInteraction } from \"./component-renderer\";\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 { 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\";\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\";\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 valid: boolean;\n};\ntype CominsRowGroupMoveState = {\n position: \"after\" | \"before\";\n sourceGroupId: CominsRowId;\n targetGroupId: CominsRowId;\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 CominsUngroupedTableProps<TData> = CominsFlatTableBaseProps<TData> & {\n columnFiltering?: undefined;\n rowGrouping?: undefined;\n};\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};\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};\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};\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 | \"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 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 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 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 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 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 [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 [scrollTop, setScrollTop] = useState(0);\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 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\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 ?? current.pagination,\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\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 }\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 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 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 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 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 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 ? visibleColumns.findIndex((visibleColumn) => visibleColumn.id === targetColumnId)\n : -1;\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 (column.lockPosition) {\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 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 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) {\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 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 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 const setActiveRowMoveState = (next: CominsRowMoveState | null) => {\n rowMoveStateRef.current = next;\n setRowMoveState(next);\n };\n const updateTarget = (clientX: number, clientY: number) => {\n const target = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-row-data-index], [data-comins-group-index]\");\n\n if (!target) {\n return;\n }\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 };\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\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n cleanup();\n updateTarget(upEvent.clientX, upEvent.clientY);\n\n const moveState = rowMoveStateRef.current;\n setActiveRowMoveState(null);\n\n if (!moveState?.valid) {\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 setActiveRowMoveState(null);\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 };\n const beginRowGroupHandlePointerDrag = (\n event: React.PointerEvent<HTMLElement>,\n sourceGroupId: CominsRowId,\n ) => {\n const onChangeGroups = rowGrouping?.onChangeGroups;\n\n if (\n event.button !== 0 ||\n !rowGrouping?.groupDraggable ||\n typeof onChangeGroups !== \"function\" ||\n !orderedGroupModel?.groupsById.has(sourceGroupId)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const setActiveGroupMoveState = (next: CominsRowGroupMoveState | null) => {\n rowGroupMoveStateRef.current = next;\n setRowGroupMoveState(next);\n };\n const updateTarget = (clientX: number, clientY: number) => {\n const targetRow = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-group-index]\");\n const targetGroupIndex = Number(targetRow?.dataset.cominsGroupIndex);\n const targetGroupId = Number.isInteger(targetGroupIndex)\n ? orderedGroupModel.groupIds[targetGroupIndex]\n : undefined;\n\n if (!targetRow || targetGroupId === undefined) {\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 };\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\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n cleanup();\n updateTarget(upEvent.clientX, upEvent.clientY);\n\n const moveState = rowGroupMoveStateRef.current;\n setActiveGroupMoveState(null);\n\n if (!moveState || moveState.sourceGroupId === moveState.targetGroupId) {\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 setActiveGroupMoveState(null);\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 };\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 = cell.group.lockPosition === true;\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-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 >\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 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(next, cell.groupId, startWidth + moveEvent.clientX - startX);\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 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 = column.lockPosition === true;\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-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 }}\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 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.max(getEffectiveColumnMinWidth(column), 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 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 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 let nextScrollLeft = Math.max(0, bodyViewport.scrollLeft);\n\n if (headerRef.current) {\n const headerMaxScrollLeft = Math.max(0, headerRef.current.scrollWidth - headerRef.current.clientWidth);\n const bodyMaxScrollLeft = Math.max(0, bodyViewport.scrollWidth - bodyViewport.clientWidth);\n const sharedMaxScrollLeft = Math.min(headerMaxScrollLeft, bodyMaxScrollLeft);\n nextScrollLeft = Math.min(sharedMaxScrollLeft, nextScrollLeft);\n\n if (Math.abs(bodyViewport.scrollLeft - nextScrollLeft) > 0.5) {\n bodyViewport.scrollLeft = nextScrollLeft;\n }\n\n headerRef.current.scrollLeft = nextScrollLeft;\n }\n\n if (footerRef.current) {\n footerRef.current.scrollLeft = nextScrollLeft;\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-filter-active={filteringActive ? \"true\" : undefined}\n data-loading={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-show-header={renderedHeaderVisible ? \"true\" : undefined}\n style={{ ...currentTheme.style, ...style }}\n >\n {renderedHeaderVisible ? (\n <div className=\"comins-table__header\" ref={headerRef}>\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 </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 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 <td\n className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\"\n data-testid={`loading-skeleton-cell-${skeletonIndex}-${column.id}`}\n key={column.id}\n style={{ height: rowHeight }}\n >\n <span className=\"comins-table__skeleton-block\" />\n </td>\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\";\n const groupDropPosition =\n rowGroupMoveState?.targetGroupId === slot.groupId &&\n rowGroupMoveState.sourceGroupId !== slot.groupId\n ? rowGroupMoveState.position\n : undefined;\n const isRowDropTarget = 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-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 {rowMoveState?.targetDataIndex === entry.dataIndex && 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-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 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-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 }}\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 aria-label=\"Table summary\" className=\"comins-table__summary\" ref={footerRef}>\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.map((cell) => (\n <td\n className={[\"comins-table__summary-cell px-3 py-2\", cell.className].filter(Boolean).join(\" \")}\n colSpan={cell.colSpan}\n data-comins-summary-column-id={cell.column.id}\n data-testid={`summary-cell-${cell.column.id}`}\n key={cell.column.id}\n style={cell.style}\n >\n {cell.value}\n </td>\n ))}\n </tr>\n </tfoot>\n </table>\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 </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 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 index === 0 ? { ...column, lockPosition: true } : column,\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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"}