comins-table 0.1.4 → 0.1.6

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":["../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/lucide-react/dist/esm/context.mjs","../node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/lucide-react/dist/esm/icons/arrow-up.mjs","../src/column-pointer.ts","../src/component-renderer.tsx","../src/summary.ts","../src/tree.ts","../src/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n];\nconst ArrowUp = createLucideIcon(\"arrow-up\", __iconNode);\n\nexport { __iconNode, ArrowUp as default };\n//# sourceMappingURL=arrow-up.mjs.map\n","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\";\nimport { ArrowUp } from \"lucide-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 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\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 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 handlePointerUp = () => {\n endCellRangeDrag();\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n\n event.preventDefault();\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\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 handlePointerUp = (upEvent: PointerEvent) => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\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\n updateTarget(event.clientX, event.clientY);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\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 handlePointerUp = () => {\n setResizingColumnId(null);\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\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 <ArrowUp className=\"comins-sort-icon\" focusable=\"false\" size={14} strokeWidth={2.25} />\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 handlePointerUp = () => {\n setResizingColumnId(null);\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\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={() => updateCellRangeDrag(address)}\n onMouseUp={endCellRangeDrag}\n onPointerDown={(event) => beginCellRangePointerDrag(event, address, cellDisabled)}\n onPointerEnter={() => updateCellRangeDrag(address)}\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"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/column-pointer.ts","../src/component-renderer.tsx","../src/table-icons.tsx","../src/row-detail.tsx","../src/summary.ts","../src/tree.ts","../src/virtual-layout.ts","../src/index.tsx"],"sourcesContent":["export const COMINS_COLUMN_MOUSE_DRAG_THRESHOLD = 6;\n\nexport type CominsColumnMouseIntent = \"activate\" | \"cancel\" | \"pending\";\n\nexport function getCominsColumnMouseIntent({\n clientX,\n clientY,\n startX,\n startY,\n}: {\n clientX: number;\n clientY: number;\n startX: number;\n startY: number;\n}): CominsColumnMouseIntent {\n const horizontalDelta = Math.abs(clientX - startX);\n const verticalDelta = Math.abs(clientY - startY);\n\n if (horizontalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && horizontalDelta > verticalDelta) {\n return \"activate\";\n }\n\n if (verticalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && verticalDelta >= horizontalDelta) {\n return \"cancel\";\n }\n\n return \"pending\";\n}\n","import { 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 {\n CaretSortIcon,\n ChevronRightIcon,\n DragHandleDots2Icon,\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 | \"sortAscending\"\n | \"sortDescending\"\n | \"sortUnsorted\";\n\nconst icons = {\n columnMove: DragHandleDots2Icon,\n disclosureCollapsed: ChevronRightIcon,\n disclosureExpanded: ChevronRightIcon,\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 { 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 { 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: string;\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 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 { CominsRowDetailRow, CominsRowDetailToggle } from \"./row-detail\";\nimport { CominsTableIcon, CominsTableIconButton } from \"./table-icons\";\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\";\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 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};\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 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\ntype CominsTableFlatProps<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\nexport type CominsTableProps<TData> = CominsTableFlatProps<TData> & CominsRowDetailProps<TData>;\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 | \"estimatedRowDetailHeight\"\n | \"expandedRowIds\"\n | \"getRowDetailHeight\"\n | \"isRowExpandable\"\n | \"onChangeExpandedRowIds\"\n | \"renderRowDetail\"\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 estimatedRowDetailHeight?: never;\n expandedRowIds?: never;\n getRowDetailHeight?: never;\n isRowExpandable?: never;\n onChangeExpandedRowIds?: never;\n renderRowDetail?: 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<CominsDataVirtualSlot<TData>>;\n};\n\ntype CominsCommittedDetailObserverSnapshot<TData> = Readonly<{\n contentWidth: number;\n projection: CominsMixedVirtualProjection<TData> | null;\n viewportHeight: number;\n}>;\n\ntype CominsVirtualProjection = {\n mixed: false;\n projectedDataIndexes: readonly number[];\n rowHeight: number;\n rowIds: readonly CominsRowId[];\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> = 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 getCominsVirtualProjectionKeys(projection: CominsVirtualProjection) {\n if (projection.mixed) {\n return projection.keys;\n }\n\n return projection.projectedDataIndexes.flatMap((dataIndex) => {\n const rowId = projection.rowIds[dataIndex];\n\n return rowId === undefined ? [] : [getCominsDataSlotKey(rowId)];\n });\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>(\n {\n \"buffer-size\": bufferSize,\n cellSelection = true,\n className,\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 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>,\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 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 [scrollTop, setScrollTop] = useState(0);\n const rowDetailIdPrefix = useId();\n const effectiveData = 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 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 (!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 (!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 }, [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 === 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 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, 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 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?.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 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 projectedDataIndexes = useMemo(\n () => sortedRowIndexes ?? state.rows.map((_row, index) => index),\n [sortedRowIndexes, state.rows],\n );\n const visibleRowCount = projectedDataIndexes.length;\n const pageSize = Math.max(1, state.pagination.pageSize);\n const pageStartIndex = Math.max(0, state.pagination.pageIndex) * pageSize;\n const effectiveExpandedRowIdSet = useMemo(() => {\n if (!rowDetailEnabled) {\n return new Set<CominsRowId>();\n }\n\n const next = new Set<CominsRowId>();\n const startIndex = virtualized ? 0 : pageStartIndex;\n const endIndex = virtualized\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 isRowExpandable,\n pageSize,\n pageStartIndex,\n projectedDataIndexes,\n rowDetailEnabled,\n state.rowIds,\n state.rows,\n virtualized,\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 = projectedDataIndexes.flatMap<CominsDataVirtualSlot<TData>>(\n (dataIndex, visibleIndex) => {\n const row = state.rows[dataIndex];\n const rowId = state.rowIds[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 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 rowId = slots[slotIndex]?.rowId;\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 detailContentWidth,\n estimatedRowDetailHeight,\n getRowDetailHeight,\n projectedDataIndexes,\n rowHeight,\n state.rowIds,\n state.rows,\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 = 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 const entries = createVisibleRowEntries(\n sortedRowIndexes,\n state.rows,\n state.rowIds,\n startIndex,\n endIndex,\n );\n\n return {\n mixed: false,\n renderOffset,\n scrollHeight: physicalTotalHeight,\n slots: entries.map((entry) =>\n createCominsDataVirtualSlot({\n ...entry,\n detail: null,\n rowHeight: safeRowHeight,\n }),\n ),\n };\n }\n\n const entries = createVisibleRowEntries(\n sortedRowIndexes,\n state.rows,\n state.rowIds,\n pageStartIndex,\n pageStartIndex + pageSize,\n );\n\n return {\n mixed: false,\n renderOffset: 0,\n scrollHeight: 0,\n slots: entries.map((entry) => {\n let detail: CominsDataVirtualSlot<TData>[\"detail\"] | null = null;\n\n if (effectiveExpandedRowIdSet.has(entry.rowId)) {\n const params = { row: createEventRow(entry) };\n const normalized = normalizeCominsDetailHeight(\n getRowDetailHeight?.(params),\n );\n\n detail =\n normalized.mode === \"auto\"\n ? {\n ...resolveCominsMeasuredDetailHeight(\n detailMeasurementsRef.current,\n entry.rowId,\n detailContentWidth,\n normalizeCominsDetailEstimate(estimatedRowDetailHeight, rowHeight),\n ),\n mode: \"auto\",\n }\n : {\n estimated: false,\n height: normalized.height,\n mode: \"fixed\",\n };\n }\n\n return createCominsDataVirtualSlot({\n ...entry,\n detail,\n rowHeight,\n });\n }),\n };\n }, [\n containerHeight,\n detailContentWidth,\n detailLayoutVersion,\n effectiveExpandedRowIdSet,\n estimatedRowDetailHeight,\n getRowDetailHeight,\n logicalAnchorTransaction,\n mixedProjection,\n pageStartIndex,\n rowHeight,\n scrollTop,\n pageSize,\n sortedRowIndexes,\n state.rowIds,\n state.rows,\n virtualBufferSize,\n virtualized,\n visibleRowCount,\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 mixed: false,\n projectedDataIndexes,\n rowHeight: Math.max(1, rowHeight),\n rowIds: state.rowIds,\n visibleRowCount,\n },\n [\n mixedProjection,\n projectedDataIndexes,\n rowHeight,\n state.rowIds,\n virtualized,\n visibleRowCount,\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 = hasMoreRows;\n const resolvedLoading = loading;\n const resolvedLoadingMore = loadingMore;\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 =\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 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 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 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.slots, 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 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 ? 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\n ? getCominsColumnPlaceholderText(movingColumn.label, movingColumn.id)\n : movingGroup\n ? getCominsColumnPlaceholderText(movingGroup.label, movingGroup.id)\n : undefined;\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\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-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 {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 (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-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.slots.map((slot, entryIndex) => {\n if (slot.kind !== \"data\") {\n return null;\n }\n\n const entry = slot;\n const rowRuntimeProps = resolveRowProps(rowProps, entry.row, entry.visibleIndex);\n const isRowSelected = selectedRowIdSet.has(entry.rowId);\n const isLastRenderedSlot = entryIndex === rowWindow.slots.length - 1;\n const isLastLogicalRow = entry.visibleIndex === visibleRowCount - 1;\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 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 && !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(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 =\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 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 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>(\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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"}