comins-table 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +25 -5
- package/THIRD_PARTY_NOTICES.md +71 -0
- package/dist/core.d.ts +21 -31
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +120 -99
- package/dist/core.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +690 -671
- package/dist/index.js.map +1 -1
- package/package.json +4 -6
- package/styles.css +62 -0
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 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 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 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 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 onChangeColumnLayout?: (layout: CominsColumnLayout) => void;\n onChangeData?: (data: TData[]) => void;\n onChangeSelection?: (selection: CominsSelectionState) => void;\n onChangeSort?: (sort: CominsSortState | null) => 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\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 direction: state.sort?.columnId === column.id ? state.sort.direction : null,\n enabled: Boolean(column.sort),\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 getSortIndicatorState(current: CominsSortState | null, columnId: string) {\n if (current?.columnId !== columnId) {\n return \"none\";\n }\n\n return current.direction;\n}\n\nfunction getAriaSortState(current: CominsSortState | null, columnId: string) {\n if (current?.columnId !== columnId) {\n return \"none\";\n }\n\n return current.direction === \"asc\" ? \"ascending\" : \"descending\";\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 sort: CominsSortState | null,\n) {\n if (!sort) {\n return data;\n }\n\n const column = columns.find((candidate) => (candidate.id ?? candidate.field) === sort.columnId);\n\n if (!column?.sort) {\n return data;\n }\n\n return sortCominsTreeSiblings(data, (leftRow, rightRow) => {\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 return sort.direction === \"desc\" ? result * -1 : result;\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 onChangeColumnLayout,\n onChangeData,\n onChangeSelection,\n onChangeSort,\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 setState((current) => {\n const next = createCominsTableState({\n columnLayout: serializeCominsColumnLayout(current),\n columnGroups,\n columns,\n getRowId,\n pagination: pagination ?? current.pagination,\n rows: effectiveData,\n showHeader,\n sort: current.sort,\n theme: current.theme,\n });\n\n return canPreserveSelection(current, next) ? { ...next, selection: current.selection } : next;\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; sortChanged?: 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 (options.sortChanged || next.sort !== current.sort) {\n onChangeSort?.(next.sort);\n }\n };\n\n const commitState = (\n updater: CominsTableState<TData> | ((current: CominsTableState<TData>) => CominsTableState<TData>),\n options: { columnLayoutChanged?: boolean; sortChanged?: 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.sort ? 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>) => {\n if (!column.sort) {\n return;\n }\n\n commitState((current) => setCominsSortState(current, getNextSort(current.sort, column.id)), {\n sortChanged: true,\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), { sortChanged: true }),\n expand: (nodeIds) => treeContext?.onExpand(nodeIds),\n fold: (nodeIds) => treeContext?.onFold(nodeIds),\n getColumnLayout: () => serializeCominsColumnLayout(state),\n getSortState: () => state.sort,\n setColumnLayout: (layout) =>\n commitState((current) => applyCominsColumnLayout(current, layout), { columnLayoutChanged: true }),\n setMoveTargetRow: (targetIdx, sourceIdx) =>\n commitState(\n (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 };\n },\n { sortChanged: true },\n ),\n setSelectedRow: (index) => selectRowsByVisibleIndexes([index]),\n setSelectedRows: (indexes) => selectRowsByVisibleIndexes(indexes),\n setSortState: (sort) => commitState((current) => setCominsSortState(current, sort), { sortChanged: true }),\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 sortIndicatorState = getSortIndicatorState(state.sort, column.id);\n const sortIndicatorVisible = sortIndicatorState === \"asc\" || sortIndicatorState === \"desc\";\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-direction={state.sort?.columnId === column.id ? state.sort.direction : undefined}\n data-sortable={column.sort ? \"true\" : \"false\"}\n data-testid={`header-${column.id}`}\n aria-sort={column.sort ? getAriaSortState(state.sort, 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);\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);\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\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 <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 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 [treeSort, setTreeSort] = useState<CominsSortState | null>(null);\n const sortedTree = useMemo(() => getSortedCominsTree(data, props.columns, treeSort), [data, props.columns, treeSort]);\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: (nextSort) => {\n setTreeSort(nextSort);\n onChangeSort?.(nextSort);\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/summary.ts","../src/tree.ts","../src/index.tsx"],"sourcesContent":["export const COMINS_COLUMN_MOUSE_DRAG_THRESHOLD = 6;\n\nexport type CominsColumnMouseIntent = \"activate\" | \"cancel\" | \"pending\";\n\nexport function getCominsColumnMouseIntent({\n clientX,\n clientY,\n startX,\n startY,\n}: {\n clientX: number;\n clientY: number;\n startX: number;\n startY: number;\n}): CominsColumnMouseIntent {\n const horizontalDelta = Math.abs(clientX - startX);\n const verticalDelta = Math.abs(clientY - startY);\n\n if (horizontalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && horizontalDelta > verticalDelta) {\n return \"activate\";\n }\n\n if (verticalDelta >= COMINS_COLUMN_MOUSE_DRAG_THRESHOLD && verticalDelta >= horizontalDelta) {\n return \"cancel\";\n }\n\n return \"pending\";\n}\n","import { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type React from \"react\";\n\nimport type {\n CominsCellComponentConfig,\n CominsCellComponentPayload,\n CominsTableComponentOption,\n CominsTableMenuItem,\n CominsHeaderComponentConfig,\n CominsHeaderComponentPayload,\n CominsVirtualListItem,\n} from \"./core\";\n\ntype CominsAnyComponentPayload<TData, TValue> =\n | CominsCellComponentPayload<TData, TValue>\n | CominsHeaderComponentPayload<TData, TValue>;\ntype CominsAnyComponentConfig<TData, TValue> =\n | CominsCellComponentConfig<TData, TValue>\n | CominsHeaderComponentConfig<TData, TValue>;\n\nfunction mergeClassName(...values: Array<string | undefined>) {\n return values.filter(Boolean).join(\" \");\n}\n\nfunction resolveComponentProps<TProps>(value: unknown, payload: unknown): TProps {\n return (typeof value === \"function\" ? (value as (payload: unknown) => TProps)(payload) : value ?? {}) as TProps;\n}\n\nfunction resolveComponentOptions(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\"\n ? (value as (payload: unknown) => CominsTableComponentOption[])(payload)\n : value\n ) as CominsTableComponentOption[];\n}\n\nfunction resolveComponentMenuItems(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\" ? (value as (payload: unknown) => CominsTableMenuItem[])(payload) : value\n ) as CominsTableMenuItem[];\n}\n\nfunction resolveVirtualListItems(value: unknown, payload: unknown) {\n return (\n typeof value === \"function\" ? (value as (payload: unknown) => CominsVirtualListItem[])(payload) : value\n ) as CominsVirtualListItem[];\n}\n\nfunction toSearchableText(value: React.ReactNode): string {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.map(toSearchableText).join(\" \");\n }\n\n return \"\";\n}\n\nfunction isMenuSelectableItem(\n item: CominsTableMenuItem,\n): item is Extract<CominsTableMenuItem, { value: string | number | boolean }> {\n return item.type !== \"divider\" && item.type !== \"label\";\n}\n\nfunction isNodeInside(element: HTMLElement | null, target: EventTarget | null) {\n return Boolean(element && target instanceof Node && element.contains(target));\n}\n\nfunction stopComponentEvent(event: React.SyntheticEvent | Event) {\n event.stopPropagation();\n}\n\nfunction preventAndStopComponentEvent(event: React.SyntheticEvent | Event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nfunction toComponentInputValue(value: unknown) {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\nfunction CominsInputComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"input\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.InputHTMLAttributes<HTMLInputElement>>(component.props, payload);\n const {\n defaultValue,\n onBlur,\n onChange: _propsOnChange,\n onClick,\n onKeyDown,\n onMouseDown,\n onPointerDown,\n value,\n ...inputProps\n } = props;\n const propValue = toComponentInputValue(value ?? defaultValue);\n const [draftValue, setDraftValue] = useState(propValue);\n const lastCommittedValueRef = useRef(propValue);\n\n useEffect(() => {\n setDraftValue(propValue);\n lastCommittedValueRef.current = propValue;\n }, [propValue]);\n\n const commitValue = (event: React.FocusEvent<HTMLInputElement> | React.KeyboardEvent<HTMLInputElement>) => {\n if (draftValue === lastCommittedValueRef.current) {\n return;\n }\n\n lastCommittedValueRef.current = draftValue;\n component.onChange?.({ ...payload, event, value: draftValue } as never);\n component.onValueChange?.({ ...payload, value: draftValue } as never);\n };\n\n return (\n <input\n {...inputProps}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-input\", props.className)}\n onBlur={(event) => {\n onBlur?.(event);\n stopComponentEvent(event);\n commitValue(event);\n }}\n onChange={(event) => {\n stopComponentEvent(event);\n setDraftValue(event.currentTarget.value);\n }}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n\n if (event.key === \"Enter\") {\n event.preventDefault();\n commitValue(event);\n event.currentTarget.blur();\n }\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n value={draftValue}\n />\n );\n}\n\nfunction CominsCheckboxComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"checkbox\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.InputHTMLAttributes<HTMLInputElement>>(component.props, payload);\n const { checked, defaultChecked, onChange, onClick, onKeyDown, onMouseDown, onPointerDown, style, ...inputProps } = props;\n const [optimisticChecked, setOptimisticChecked] = useState(Boolean(checked ?? defaultChecked));\n\n useEffect(() => {\n if (checked !== undefined) {\n setOptimisticChecked(Boolean(checked));\n }\n }, [checked]);\n\n return (\n <input\n {...inputProps}\n checked={optimisticChecked}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-checkbox\", props.className)}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onChange={(event) => {\n onChange?.(event);\n stopComponentEvent(event);\n setOptimisticChecked(event.currentTarget.checked);\n component.onCheckedChange?.({ ...payload, checked: event.currentTarget.checked } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n style={{ height: 20, width: 20, ...style }}\n type=\"checkbox\"\n />\n );\n}\n\nfunction CominsToggleComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsAnyComponentConfig<TData, TValue>, { type: \"toggle\" }>;\n payload: CominsAnyComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement> & { checked?: boolean }>(\n component.props,\n payload,\n );\n const { checked, ...buttonProps } = props;\n const { onClick, onKeyDown, onMouseDown, onPointerDown, ...restButtonProps } = buttonProps;\n const [optimisticChecked, setOptimisticChecked] = useState(Boolean(checked));\n\n useEffect(() => {\n if (checked !== undefined) {\n setOptimisticChecked(Boolean(checked));\n }\n }, [checked]);\n\n const buttonChildren =\n typeof buttonProps.children === \"string\" && (buttonProps.children === \"ON\" || buttonProps.children === \"OFF\")\n ? optimisticChecked\n ? \"ON\"\n : \"OFF\"\n : buttonProps.children;\n\n return (\n <button\n {...restButtonProps}\n aria-pressed={optimisticChecked}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-toggle\",\n buttonProps.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n const nextChecked = !optimisticChecked;\n setOptimisticChecked(nextChecked);\n component.onCheckedChange?.({ ...payload, checked: nextChecked } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n type={buttonProps.type ?? \"button\"}\n >\n {buttonChildren}\n </button>\n );\n}\n\nfunction CominsHeaderMenuComponent<TData, TValue>({\n component,\n payload,\n}: {\n component: Extract<CominsHeaderComponentConfig<TData, TValue>, { type: \"menu\" }>;\n payload: CominsHeaderComponentPayload<TData, TValue>;\n}) {\n const [open, setOpen] = useState(false);\n const menuId = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [menuPosition, setMenuPosition] = useState<React.CSSProperties>({\n left: 0,\n position: \"fixed\",\n top: 0,\n });\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement>>(component.props, payload);\n const items = useMemo(() => resolveComponentMenuItems(component.items, payload), [component.items, payload]);\n\n const updateMenuPosition = () => {\n const trigger = triggerRef.current;\n\n if (!trigger || typeof window === \"undefined\") {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const menuWidth = Math.max(menuRef.current?.offsetWidth ?? 136, 136);\n\n setMenuPosition({\n left: Math.max(8, Math.min(rect.left, window.innerWidth - menuWidth - 8)),\n position: \"fixed\",\n top: Math.min(rect.bottom + 4, window.innerHeight - 8),\n zIndex: 9999,\n });\n };\n\n const requestOpen = (nextOpen: boolean, event?: Event | React.SyntheticEvent) => {\n if (nextOpen === open) {\n return;\n }\n\n const beforeResult = component.onBeforeChange?.({ ...payload, event, open: nextOpen } as never);\n\n if (beforeResult === false) {\n return;\n }\n\n setOpen(nextOpen);\n component.onOpenChange?.({ ...payload, event, open: nextOpen } as never);\n };\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n if (isNodeInside(triggerRef.current, event.target) || isNodeInside(menuRef.current, event.target)) {\n return;\n }\n\n requestOpen(false, event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n requestOpen(false, event);\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [open]);\n\n useLayoutEffect(() => {\n if (!open) {\n return undefined;\n }\n\n updateMenuPosition();\n\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n window.addEventListener(\"resize\", updateMenuPosition);\n window.addEventListener(\"scroll\", updateMenuPosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updateMenuPosition);\n window.removeEventListener(\"scroll\", updateMenuPosition, true);\n };\n }, [open]);\n\n const menu = open ? (\n <span\n aria-label=\"Header menu\"\n className=\"comins-table__component-menu-popover\"\n id={menuId}\n ref={menuRef}\n role=\"menu\"\n style={menuPosition}\n >\n {items.map((item, index) => {\n if (item.type === \"divider\") {\n return (\n <span\n aria-orientation=\"horizontal\"\n className=\"comins-table__component-menu-divider\"\n key={`divider-${index}`}\n role=\"separator\"\n />\n );\n }\n\n if (item.type === \"label\") {\n return (\n <span className=\"comins-table__component-menu-label\" key={`label-${index}`} role=\"presentation\">\n {item.label}\n </span>\n );\n }\n\n return (\n <button\n className=\"comins-table__component-menu-item\"\n disabled={item.disabled}\n key={`${String(item.value)}-${index}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n\n if (item.disabled || !isMenuSelectableItem(item)) {\n return;\n }\n\n requestOpen(false, event);\n component.onSelect?.({ ...payload, event, item, value: item.value } as never);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"menuitem\"\n type=\"button\"\n >\n {item.label}\n </button>\n );\n })}\n </span>\n ) : null;\n\n return (\n <span className=\"comins-table__component comins-table__component-menu\">\n <button\n {...props}\n aria-controls={open ? menuId : undefined}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label={props[\"aria-label\"] ?? \"Header menu\"}\n className={mergeClassName(\"comins-table__component-menu-trigger\", props.className)}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n requestOpen(!open, event);\n }}\n onKeyDown={(event) => {\n props.onKeyDown?.(event);\n\n if (event.key === \"Escape\" && open) {\n preventAndStopComponentEvent(event);\n requestOpen(false, event);\n return;\n }\n\n stopComponentEvent(event);\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={(event) => {\n props.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n ref={triggerRef}\n type={props.type ?? \"button\"}\n >\n {props.children ?? \"메뉴\"}\n </button>\n {menu}\n </span>\n );\n}\n\nfunction CominsCellVirtualListComponent<TData, TValue>({\n component,\n interaction,\n payload,\n}: {\n component: Extract<CominsCellComponentConfig<TData, TValue>, { type: \"virtual-list\" }>;\n interaction?: CominsBuiltInComponentInteraction;\n payload: CominsCellComponentPayload<TData, TValue>;\n}) {\n const props = resolveComponentProps<\n React.HTMLAttributes<HTMLDivElement> & {\n height?: number | string;\n itemHeight?: number;\n limit?: number;\n more?: boolean;\n searchable?: boolean;\n }\n >(component.props, payload);\n const {\n height,\n itemHeight: itemHeightProp,\n limit: limitProp,\n more = false,\n searchable = false,\n style,\n ...rootProps\n } = props;\n const items = useMemo(() => resolveVirtualListItems(component.items, payload), [component.items, payload]);\n const limit = Math.max(1, Number(limitProp ?? 5));\n const itemHeight = Math.max(1, Number(itemHeightProp ?? 28));\n const defaultHeight = itemHeight * 5;\n const hasExplicitHeight = height !== undefined || style?.height !== undefined;\n const [query, setQuery] = useState(\"\");\n const [expanded, setExpanded] = useState(false);\n const [scrollTop, setScrollTop] = useState(0);\n const [selectedValue, setSelectedValue] = useState<string | number | boolean | null>(null);\n const [viewportHeight, setViewportHeight] = useState(defaultHeight);\n const itemsViewportRef = useRef<HTMLDivElement>(null);\n const isSingleRowSelected = payload.row.selected && payload.selection.selectedRowCount === 1;\n const searchEnabled = Boolean(searchable && isSingleRowSelected);\n const activeQuery = searchEnabled ? query : \"\";\n\n useEffect(() => {\n setExpanded(false);\n setScrollTop(0);\n }, [items.length, limit]);\n\n useLayoutEffect(() => {\n const viewport = itemsViewportRef.current;\n\n if (!viewport) {\n return;\n }\n\n const measuredHeight = viewport.clientHeight > 0 ? viewport.clientHeight : defaultHeight;\n\n setViewportHeight(hasExplicitHeight ? measuredHeight : Math.min(measuredHeight, defaultHeight));\n }, [defaultHeight, expanded, activeQuery, hasExplicitHeight]);\n\n useEffect(() => {\n const viewport = itemsViewportRef.current;\n\n if (!viewport) {\n return;\n }\n\n viewport.scrollTop = 0;\n setScrollTop(0);\n }, [activeQuery]);\n\n useEffect(() => {\n if (isSingleRowSelected) {\n return;\n }\n\n const viewport = itemsViewportRef.current;\n\n if (viewport) {\n viewport.scrollTop = 0;\n }\n\n setExpanded(false);\n setQuery(\"\");\n setScrollTop(0);\n }, [isSingleRowSelected]);\n\n const filteredEntries = useMemo(() => {\n const normalizedQuery = activeQuery.trim().toLowerCase();\n\n return items\n .map((item, itemIndex) => ({ item, itemIndex }))\n .filter(({ item, itemIndex }) => {\n if (!normalizedQuery) {\n return true;\n }\n\n if (component.searchFilter) {\n return component.searchFilter({ item, itemIndex, value: activeQuery });\n }\n\n return toSearchableText(item.label).toLowerCase().includes(normalizedQuery);\n });\n }, [activeQuery, component, items]);\n const hasOverflow = filteredEntries.length > limit;\n const virtualized = Boolean(\n isSingleRowSelected && (expanded || activeQuery.trim().length > 0 || (!more && hasOverflow)),\n );\n const showOverflowControl = hasOverflow && !virtualized;\n const overscan = searchEnabled && !expanded ? 0 : 2;\n const safeViewportHeight = Math.max(\n itemHeight,\n hasExplicitHeight ? viewportHeight || defaultHeight : Math.min(viewportHeight || defaultHeight, defaultHeight),\n );\n const visibleStart = Math.max(0, Math.floor(Math.max(0, scrollTop) / itemHeight) - overscan);\n const visibleEnd = Math.min(\n filteredEntries.length,\n Math.ceil((Math.max(0, scrollTop) + safeViewportHeight) / itemHeight) + overscan,\n );\n const renderedEntries = virtualized\n ? filteredEntries.slice(visibleStart, visibleEnd)\n : filteredEntries.slice(0, hasOverflow ? limit : filteredEntries.length);\n const topSpacerHeight = virtualized ? visibleStart * itemHeight : 0;\n const bottomSpacerHeight = virtualized ? Math.max(0, filteredEntries.length - visibleEnd) * itemHeight : 0;\n const listId = `${String(payload.row.id)}-${payload.column.id}`;\n const rootStyle = {\n ...style,\n \"--comins-table-virtual-list-item-height\": `${itemHeight}px`,\n height: height ?? style?.height ?? defaultHeight,\n } as React.CSSProperties;\n\n const selectItem = (\n item: CominsVirtualListItem,\n itemIndex: number,\n event: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>,\n ) => {\n if (item.disabled) {\n return;\n }\n\n const accepted = interaction?.requestRowSelection?.({ event, mode: \"row-click\" });\n\n if (accepted === false) {\n return;\n }\n\n setSelectedValue(item.value);\n component.onClickItem?.({ ...payload, event, item, itemIndex, value: item.value } as never);\n };\n\n return (\n <div\n {...rootProps}\n aria-label={rootProps[\"aria-label\"] ?? \"Virtual list\"}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-virtual-list\", rootProps.className)}\n data-comins-virtual-list-expanded={virtualized ? \"true\" : undefined}\n data-comins-virtual-list-visible-count={renderedEntries.length}\n data-testid={`virtual-list-${listId}`}\n onClick={(event) => {\n rootProps.onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onContextMenu={stopComponentEvent}\n onDoubleClick={stopComponentEvent}\n onMouseUp={stopComponentEvent}\n onPointerUp={stopComponentEvent}\n onPointerMove={stopComponentEvent}\n onPointerEnter={stopComponentEvent}\n onMouseOver={stopComponentEvent}\n onMouseOut={stopComponentEvent}\n onPointerLeave={stopComponentEvent}\n onBlur={stopComponentEvent}\n onFocus={stopComponentEvent}\n onInput={stopComponentEvent}\n onChange={stopComponentEvent}\n onMouseMove={stopComponentEvent}\n onMouseEnter={stopComponentEvent}\n onMouseLeave={stopComponentEvent}\n onTouchStart={stopComponentEvent}\n onTouchMove={stopComponentEvent}\n onTouchEnd={stopComponentEvent}\n onWheel={(event) => {\n rootProps.onWheel?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n rootProps.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n role=\"listbox\"\n style={rootStyle}\n >\n <div\n className=\"comins-table__component-virtual-list-items\"\n onScroll={(event) => {\n stopComponentEvent(event);\n setScrollTop(event.currentTarget.scrollTop);\n const measuredHeight = event.currentTarget.clientHeight > 0 ? event.currentTarget.clientHeight : defaultHeight;\n setViewportHeight(hasExplicitHeight ? measuredHeight : Math.min(measuredHeight, defaultHeight));\n }}\n ref={itemsViewportRef}\n role=\"presentation\"\n >\n {topSpacerHeight > 0 ? (\n <span aria-hidden=\"true\" className=\"comins-table__component-virtual-list-spacer\" style={{ height: topSpacerHeight }} />\n ) : null}\n {renderedEntries.map(({ item, itemIndex }) => (\n <button\n aria-selected={selectedValue === item.value}\n className=\"comins-table__component-virtual-list-item\"\n data-comins-virtual-list-item=\"true\"\n disabled={item.disabled}\n key={`${String(item.value)}-${itemIndex}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n selectItem(item, itemIndex, event);\n }}\n onContextMenu={(event) => {\n stopComponentEvent(event);\n\n if (item.disabled) {\n return;\n }\n\n component.onContextMenuItem?.({ ...payload, event, item, itemIndex, value: item.value } as never);\n }}\n onKeyDown={(event) => {\n stopComponentEvent(event);\n\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n selectItem(item, itemIndex, event);\n }\n }}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"option\"\n type=\"button\"\n >\n <span className=\"comins-table__component-virtual-list-item-label\">{item.label}</span>\n </button>\n ))}\n {bottomSpacerHeight > 0 ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-table__component-virtual-list-spacer\"\n style={{ height: bottomSpacerHeight }}\n />\n ) : null}\n </div>\n <div className=\"comins-table__component-virtual-list-controls\">\n {more && hasOverflow ? (\n <button\n aria-expanded={virtualized}\n aria-label=\"전체 목록 보기\"\n className=\"comins-table__component-virtual-list-overflow comins-table__component-virtual-list-more\"\n data-testid={`virtual-list-overflow-${listId}`}\n onClick={(event) => {\n preventAndStopComponentEvent(event);\n\n if (interaction?.requestRowSelection?.({ event, mode: \"exclusive\" }) === false) {\n return;\n }\n\n setExpanded(true);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n type=\"button\"\n >\n ...\n </button>\n ) : showOverflowControl ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-table__component-virtual-list-overflow comins-table__component-virtual-list-more\"\n data-testid={`virtual-list-overflow-${listId}`}\n >\n ...\n </span>\n ) : null}\n {searchEnabled ? (\n <input\n aria-label={`${rootProps[\"aria-label\"] ?? \"Virtual list\"} 검색`}\n className=\"comins-table__component-virtual-list-search\"\n data-testid={`virtual-list-search-${listId}`}\n onChange={(event) => {\n stopComponentEvent(event);\n setQuery(event.currentTarget.value);\n }}\n onClick={stopComponentEvent}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n placeholder=\"검색\"\n value={query}\n />\n ) : null}\n </div>\n </div>\n );\n}\n\nexport type CominsBuiltInComponentInteraction = {\n requestRowSelection?: (request: {\n event: React.KeyboardEvent<HTMLButtonElement> | React.MouseEvent<HTMLButtonElement>;\n mode: \"exclusive\" | \"row-click\";\n }) => boolean;\n};\n\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsCellComponentConfig<TData, TValue>,\n payload: CominsCellComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsHeaderComponentConfig<TData, TValue>,\n payload: CominsHeaderComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsAnyComponentConfig<TData, TValue>,\n payload: CominsAnyComponentPayload<TData, TValue>,\n interaction?: CominsBuiltInComponentInteraction,\n): React.ReactNode {\n if (component.type === \"menu\") {\n return <CominsHeaderMenuComponent component={component} payload={payload as CominsHeaderComponentPayload<TData, TValue>} />;\n }\n\n if (component.type === \"virtual-list\") {\n return (\n <CominsCellVirtualListComponent\n component={component}\n interaction={interaction}\n payload={payload as CominsCellComponentPayload<TData, TValue>}\n />\n );\n }\n\n if (component.type === \"button\") {\n const props = resolveComponentProps<React.ButtonHTMLAttributes<HTMLButtonElement>>(component.props, payload);\n const { onClick, onKeyDown, onMouseDown, onPointerDown, ...buttonProps } = props;\n\n return (\n <button\n {...buttonProps}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-button\",\n props.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n component.onClick?.({ ...payload, event } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n type={props.type ?? \"button\"}\n />\n );\n }\n\n if (component.type === \"input\") {\n return <CominsInputComponent component={component} payload={payload} />;\n }\n\n if (component.type === \"checkbox\") {\n return <CominsCheckboxComponent component={component} payload={payload} />;\n }\n\n if (component.type === \"select\") {\n const props = resolveComponentProps<React.SelectHTMLAttributes<HTMLSelectElement>>(component.props, payload);\n const options = resolveComponentOptions(component.options, payload);\n const { onChange, onClick, onKeyDown, onMouseDown, onPointerDown, ...selectProps } = props;\n\n return (\n <select\n {...selectProps}\n className={mergeClassName(\n \"comins-table__component\",\n \"comins-table__component-select\",\n props.className,\n )}\n onClick={(event) => {\n onClick?.(event);\n stopComponentEvent(event);\n }}\n onChange={(event) => {\n onChange?.(event);\n stopComponentEvent(event);\n component.onValueChange?.({ ...payload, value: event.currentTarget.value } as never);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n >\n {options.map((option) => (\n <option disabled={option.disabled} key={String(option.value)} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n if (component.type === \"radio\") {\n const props = resolveComponentProps<\n React.HTMLAttributes<HTMLDivElement> & { value?: string | number | boolean }\n >(component.props, payload);\n const options = resolveComponentOptions(component.options, payload);\n const selectedValue =\n props.value ?? (\"value\" in payload ? (payload as CominsCellComponentPayload<TData, TValue>).value : undefined);\n const groupName =\n \"row\" in payload\n ? `${payload.column.id}-${String((payload as CominsCellComponentPayload<TData, TValue>).row.id)}-radio`\n : `${payload.column.id}-header-radio`;\n const { value: _value, ...divProps } = props;\n\n return (\n <div\n {...divProps}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-radio\", divProps.className)}\n onClick={(event) => {\n divProps.onClick?.(event);\n stopComponentEvent(event);\n }}\n onKeyDown={(event) => {\n divProps.onKeyDown?.(event);\n stopComponentEvent(event);\n }}\n onMouseDown={(event) => {\n divProps.onMouseDown?.(event);\n stopComponentEvent(event);\n }}\n onPointerDown={(event) => {\n divProps.onPointerDown?.(event);\n stopComponentEvent(event);\n }}\n role=\"radiogroup\"\n >\n {options.map((option) => (\n <label key={String(option.value)} onClick={stopComponentEvent} onMouseDown={stopComponentEvent}>\n <input\n checked={selectedValue === undefined ? undefined : String(selectedValue) === String(option.value)}\n disabled={option.disabled}\n name={groupName}\n onClick={stopComponentEvent}\n onChange={(event) => {\n stopComponentEvent(event);\n\n if (event.currentTarget.checked) {\n component.onValueChange?.({ ...payload, value: String(option.value) } as never);\n }\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n style={{ height: 20, width: 20 }}\n type=\"radio\"\n value={String(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n );\n }\n\n if (component.type === \"toggle\") {\n return <CominsToggleComponent component={component} payload={payload} />;\n }\n\n const props = resolveComponentProps<React.HTMLAttributes<HTMLDivElement> & { max?: number; value?: number }>(\n component.props,\n payload,\n );\n const value = Number(props.value ?? 0);\n const max = Math.max(1, Number(props.max ?? 100));\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div\n {...props}\n aria-valuemax={max}\n aria-valuemin={0}\n aria-valuenow={value}\n className={mergeClassName(\"comins-table__component\", \"comins-table__component-progress\", props.className)}\n onClick={stopComponentEvent}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n role=\"progressbar\"\n >\n <span style={{ width: `${percent}%` }} />\n </div>\n );\n}\n","import type React from \"react\";\n\nimport type { CominsTableRuntimeColumn } from \"./core\";\n\nexport type CominsSummaryBuiltin = \"avg\" | \"count\" | \"max\" | \"min\" | \"sum\";\n\nexport type CominsSummaryAggregator<TData> = (input: {\n column: CominsTableRuntimeColumn<TData>;\n rows: readonly TData[];\n values: readonly unknown[];\n}) => React.ReactNode;\n\nexport type CominsSummaryFormatPayload<TData> = {\n column: CominsTableRuntimeColumn<TData>;\n rows: readonly TData[];\n value: React.ReactNode;\n values: readonly unknown[];\n};\n\nexport type CominsSummaryColumnConfig<TData> = {\n aggregate: CominsSummaryBuiltin | CominsSummaryAggregator<TData>;\n className?: string;\n colSpan?: number;\n format?: (payload: CominsSummaryFormatPayload<TData>) => React.ReactNode;\n style?: React.CSSProperties;\n};\n\nexport type CominsSummaryColumn<TData> =\n | CominsSummaryBuiltin\n | CominsSummaryAggregator<TData>\n | CominsSummaryColumnConfig<TData>;\n\nexport type CominsTableSummaryConfig<TData> = {\n className?: string;\n columns: Partial<Record<string, CominsSummaryColumn<TData>>>;\n label?: React.ReactNode;\n style?: React.CSSProperties;\n};\n\nfunction getNestedFieldValue(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, key) => {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[key];\n }, row);\n}\n\nfunction getNumericValues(values: readonly unknown[]) {\n return values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n}\n\nfunction getBuiltinSummaryValue(kind: CominsSummaryBuiltin, values: readonly unknown[]): React.ReactNode {\n if (kind === \"count\") {\n return values.length;\n }\n\n const numericValues = getNumericValues(values);\n\n if (numericValues.length === 0) {\n return null;\n }\n\n if (kind === \"sum\") {\n return numericValues.reduce((total, value) => total + value, 0);\n }\n\n if (kind === \"avg\") {\n return numericValues.reduce((total, value) => total + value, 0) / numericValues.length;\n }\n\n return kind === \"min\" ? Math.min(...numericValues) : Math.max(...numericValues);\n}\n\nexport function getCominsSummaryValues<TData>(\n rows: readonly TData[],\n columns: readonly CominsTableRuntimeColumn<TData>[],\n summary: CominsTableSummaryConfig<TData>,\n): Record<string, React.ReactNode> {\n return Object.entries(summary.columns).reduce<Record<string, React.ReactNode>>((valuesByColumnId, [columnId, configuredColumn]) => {\n const column = columns.find((candidate) => candidate.id === columnId);\n\n if (!column || !configuredColumn) {\n return valuesByColumnId;\n }\n\n const config =\n typeof configuredColumn === \"object\" && configuredColumn !== null ? configuredColumn : undefined;\n const aggregate =\n typeof configuredColumn === \"object\" && configuredColumn !== null\n ? configuredColumn.aggregate\n : configuredColumn;\n const values = rows.map((row) => getNestedFieldValue(row, column.field));\n const value =\n typeof aggregate === \"function\" ? aggregate({ column, rows, values }) : getBuiltinSummaryValue(aggregate, values);\n valuesByColumnId[columnId] = config?.format ? config.format({ column, rows, value, values }) : value;\n\n return valuesByColumnId;\n }, {});\n}\n","import type { CominsRowId } from \"./core\";\n\nexport type CominsTreeNode<TItem> = {\n children?: readonly CominsTreeNode<TItem>[];\n expand?: boolean;\n item: TItem;\n};\n\nexport type CominsTreeExpansionOptions = {\n defaultExpandAll?: boolean;\n};\n\nexport type CominsVisibleTreeRow<TItem> = {\n depth: number;\n expanded: boolean;\n hasChildren: boolean;\n item: TItem;\n path: readonly number[];\n rowId: CominsRowId;\n};\n\ntype CominsTreeNodeIndex<TItem> = {\n byId: Map<CominsRowId, readonly number[]>;\n idByPath: Map<string, CominsRowId>;\n};\n\nfunction getPathKey(path: readonly number[]) {\n return path.join(\".\");\n}\n\nfunction createCominsTreeNodeIndex<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n getRowId: (item: TItem, index: number) => CominsRowId,\n): CominsTreeNodeIndex<TItem> {\n const byId = new Map<CominsRowId, readonly number[]>();\n const idByPath = new Map<string, CominsRowId>();\n let itemIndex = 0;\n\n const visit = (currentNodes: readonly CominsTreeNode<TItem>[], parentPath: readonly number[]) => {\n currentNodes.forEach((node, childIndex) => {\n const path = [...parentPath, childIndex];\n const rowId = getRowId(node.item, itemIndex);\n itemIndex += 1;\n\n if (byId.has(rowId)) {\n throw new Error(`Duplicate tree row id: ${String(rowId)}`);\n }\n\n byId.set(rowId, path);\n idByPath.set(getPathKey(path), rowId);\n\n if (node.children?.length) {\n visit(node.children, path);\n }\n });\n };\n\n visit(nodes, []);\n\n return { byId, idByPath };\n}\n\nfunction updateCominsTreeNodeAtPath<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n path: readonly number[],\n update: (node: CominsTreeNode<TItem>) => CominsTreeNode<TItem>,\n): CominsTreeNode<TItem>[] {\n const [targetIndex, ...remainingPath] = path;\n\n if (targetIndex === undefined) {\n return [...nodes];\n }\n\n return nodes.map((node, index) => {\n if (index !== targetIndex) {\n return node;\n }\n\n if (remainingPath.length === 0) {\n return update(node);\n }\n\n if (!node.children) {\n return node;\n }\n\n return {\n ...node,\n children: updateCominsTreeNodeAtPath(node.children, remainingPath, update),\n };\n });\n}\n\nexport function flattenCominsTree<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: CominsTreeExpansionOptions = {},\n): CominsVisibleTreeRow<TItem>[] {\n const index = createCominsTreeNodeIndex(nodes, getRowId);\n const visibleRows: CominsVisibleTreeRow<TItem>[] = [];\n\n const visit = (currentNodes: readonly CominsTreeNode<TItem>[], depth: number, parentPath: readonly number[]) => {\n currentNodes.forEach((node, childIndex) => {\n const path = [...parentPath, childIndex];\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n const expanded = node.expand ?? options.defaultExpandAll ?? false;\n const rowId = index.idByPath.get(getPathKey(path));\n\n if (rowId === undefined) {\n return;\n }\n\n visibleRows.push({ depth, expanded, hasChildren, item: node.item, path, rowId });\n\n if (hasChildren && expanded) {\n visit(children, depth + 1, path);\n }\n });\n };\n\n visit(nodes, 0, []);\n\n return visibleRows;\n}\n\nexport function getCominsTreeLeafItems<TItem>(nodes: readonly CominsTreeNode<TItem>[]): TItem[] {\n return nodes.flatMap((node) => (node.children?.length ? getCominsTreeLeafItems(node.children) : [node.item]));\n}\n\nexport function toggleCominsTreeNode<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n getRowId: (item: TItem, index: number) => CominsRowId,\n options: CominsTreeExpansionOptions = {},\n): CominsTreeNode<TItem>[] {\n const path = createCominsTreeNodeIndex(nodes, getRowId).byId.get(rowId);\n\n if (!path) {\n return [...nodes];\n }\n\n return updateCominsTreeNodeAtPath(nodes, path, (node) => ({\n ...node,\n expand: !(node.expand ?? options.defaultExpandAll ?? false),\n }));\n}\n\nexport function updateCominsTreeItem<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n rowId: CominsRowId,\n getRowId: (item: TItem, index: number) => CominsRowId,\n update: (item: TItem) => TItem,\n): CominsTreeNode<TItem>[] {\n const path = createCominsTreeNodeIndex(nodes, getRowId).byId.get(rowId);\n\n if (!path) {\n return [...nodes];\n }\n\n return updateCominsTreeNodeAtPath(nodes, path, (node) => ({ ...node, item: update(node.item) }));\n}\n\nexport function sortCominsTreeSiblings<TItem>(\n nodes: readonly CominsTreeNode<TItem>[],\n compare: (left: TItem, right: TItem) => number,\n): CominsTreeNode<TItem>[] {\n return [...nodes]\n .sort((left, right) => compare(left.item, right.item))\n .map((node) => ({\n ...node,\n children: node.children ? sortCominsTreeSiblings(node.children, compare) : undefined,\n }));\n}\n","import type React from \"react\";\nimport { Fragment, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from \"react\";\n\nimport {\n applyCominsColumnLayout,\n clearCominsSortState,\n copyCominsCell,\n copyCominsCellRange,\n copyCominsRow,\n createCominsTableState,\n getCominsCellValue,\n getCominsHeaderRows,\n getCominsSortedRowIndexes,\n getCominsVisibleColumns,\n isCominsCellInSelectedRange,\n moveCominsColumn,\n moveCominsColumnGroup,\n moveCominsRow,\n pasteCominsCell,\n pasteCominsCellRange,\n pasteCominsRow,\n selectCell,\n selectCellRange,\n selectRow,\n selectRows,\n serializeCominsColumnLayout,\n setCominsColumnWidth,\n setCominsColumnGroupWidth,\n setCominsSortModel,\n setCominsSortState,\n updateCominsRows,\n} from \"./core\";\nimport { getCominsColumnMouseIntent } from \"./column-pointer\";\nimport { renderCominsBuiltInComponent, type CominsBuiltInComponentInteraction } from \"./component-renderer\";\nimport { getCominsSummaryValues } from \"./summary\";\nimport {\n flattenCominsTree,\n getCominsTreeLeafItems,\n sortCominsTreeSiblings,\n toggleCominsTreeNode,\n updateCominsTreeItem,\n} from \"./tree\";\n\nexport * from \"./core\";\nexport * from \"./summary\";\nexport * from \"./tree\";\n\nimport type { CominsTableSummaryConfig } from \"./summary\";\nimport type { CominsTreeNode, CominsVisibleTreeRow } from \"./tree\";\n\nimport type {\n CominsCellAddress,\n CominsCellComponent,\n CominsCellComponentPayload,\n CominsClipboardGuard,\n CominsColumnLayout,\n CominsColumnProps,\n CominsCopiedCell,\n CominsCopiedCellRange,\n CominsCopiedRow,\n CominsTableColumn,\n CominsTableColumnGroup,\n CominsTableRuntimeColumn,\n CominsTableRuntimeColumnGroup,\n CominsHeaderCell,\n CominsTableState,\n CominsTableTheme,\n CominsEventColumn,\n CominsHeaderComponent,\n CominsHeaderComponentPayload,\n CominsPaginationState,\n CominsRowId,\n CominsSelectionState,\n CominsSortModel,\n CominsSortState,\n} from \"./core\";\n\ntype CominsClassValue = string | Record<string, boolean> | undefined;\ntype CominsRowPropValue<TData, TValue> = TValue | ((row: TData, index: number) => TValue);\ntype CominsColumnPointerInteraction = {\n active: boolean;\n blocked: boolean;\n cancelSort: boolean;\n cleanup: () => void;\n id: string;\n kind: \"column\" | \"group\";\n pointerType: string;\n startX: number;\n startY: number;\n timer: number | null;\n};\ntype CominsColumnPointerOptions = {\n activate: (x: number, y: number) => void;\n commitTarget: (targetId: string) => void;\n event: React.PointerEvent<HTMLTableCellElement>;\n id: string;\n kind: \"column\" | \"group\";\n sortColumnId?: string;\n};\ntype CominsSuppressedSortClick = {\n cleanup: () => void;\n columnId: string;\n timer: number | null;\n};\ntype CominsRowMoveState = {\n sourceRowId: CominsRowId;\n targetDataIndex: number;\n};\n\nconst COMINS_MIN_COLUMN_WIDTH = 50;\n\nexport type CominsTableRowProps<TData> = {\n className?: CominsRowPropValue<TData, CominsClassValue>;\n disabled?: CominsRowPropValue<TData, boolean | undefined>;\n draggable?: CominsRowPropValue<TData, boolean | undefined>;\n style?: CominsRowPropValue<TData, React.CSSProperties | undefined>;\n};\n\nexport type CominsEventRow<TData> = {\n data: TData;\n dataIndex: number;\n id: CominsRowId;\n index: number;\n};\n\nexport type CominsRowEventPayload<TData, TEvent = React.MouseEvent<HTMLTableRowElement>> = {\n event: TEvent;\n index: number;\n row: CominsEventRow<TData>;\n};\n\nexport type CominsCellEventPayload<TData, TValue = unknown, TEvent = React.MouseEvent<HTMLTableCellElement>> = {\n column: CominsEventColumn<TData, TValue>;\n event: TEvent;\n index: number;\n row: CominsEventRow<TData>;\n value: TValue;\n};\n\nexport type CominsRowKeyboardEventPayload<TData> = CominsRowEventPayload<\n TData,\n React.KeyboardEvent<HTMLTableRowElement>\n>;\n\nexport type CominsCellKeyboardEventPayload<TData, TValue = unknown> = CominsCellEventPayload<\n TData,\n TValue,\n React.KeyboardEvent<HTMLTableCellElement>\n>;\n\nexport type CominsTableRef<TData = unknown> = {\n clearSort: () => void;\n expand: (nodeIds?: readonly CominsRowId[]) => void;\n fold: (nodeIds?: readonly CominsRowId[]) => void;\n getColumnLayout: () => CominsColumnLayout;\n getSortModel: () => CominsSortModel;\n getSortState: () => CominsSortState | null;\n setColumnLayout: (layout: CominsColumnLayout) => void;\n setMoveTargetRow: (targetIdx: number, sourceIdx: number) => void;\n setSelectedRow: (index: number) => void;\n setSelectedRows: (indexes: number[]) => void;\n setSortModel: (sortModel: CominsSortModel) => void;\n setSortState: (sort: CominsSortState | null) => void;\n};\n\nexport type CominsLazyLoadReason = \"initial\" | \"scroll\" | \"refresh\";\n\nexport type CominsLazyLoadRequest = {\n limit: number;\n offset: number;\n reason: CominsLazyLoadReason;\n signal: AbortSignal;\n};\n\nexport type CominsLazyLoadResult<TData> = {\n rows: readonly TData[];\n total?: number;\n};\n\nexport type CominsTableProps<TData> = {\n \"buffer-size\"?: number;\n cellSelection?: boolean;\n className?: string;\n columnGroups?: Array<CominsTableColumnGroup>;\n columns: Array<CominsTableColumn<TData>>;\n data: readonly TData[];\n \"data-testid\"?: string;\n emptyComponent?: React.ReactNode;\n getRowId?: (row: TData, index: number) => CominsRowId;\n hasMoreRows?: boolean;\n infiniteScroll?: boolean;\n infiniteScrollThreshold?: number;\n lazyLoad?: boolean;\n lazyLoadBatchSize?: number;\n lazyLoadMode?: \"append\";\n lazyLoadThreshold?: number;\n loading?: boolean;\n loadingComponent?: React.ReactNode;\n loadingMore?: boolean;\n multiSort?: boolean;\n onChangeColumnLayout?: (layout: CominsColumnLayout) => void;\n onChangeData?: (data: TData[]) => void;\n onChangeSelection?: (selection: CominsSelectionState) => void;\n onChangeSort?: (sort: CominsSortState | null) => void;\n onChangeSortModel?: (sortModel: CominsSortModel) => void;\n onClickCell?: (payload: CominsCellEventPayload<TData>) => void;\n onClickRow?: (payload: CominsRowEventPayload<TData>) => void;\n onContextMenuCell?: (payload: CominsCellEventPayload<TData>) => void;\n onContextMenuRow?: (payload: CominsRowEventPayload<TData>) => void;\n onDoubleClickCell?: (payload: CominsCellEventPayload<TData>) => void;\n onDoubleClickRow?: (payload: CominsRowEventPayload<TData>) => void;\n onKeyDownCell?: (payload: CominsCellKeyboardEventPayload<TData>) => void;\n onKeyDownRow?: (payload: CominsRowKeyboardEventPayload<TData>) => void;\n onLazyLoad?: (request: CominsLazyLoadRequest) => Promise<CominsLazyLoadResult<TData>>;\n onLoadMore?: () => void;\n pagination?: Partial<CominsPaginationState>;\n persistHeaderWhenEmpty?: boolean;\n rowHeight?: number;\n rowProps?: CominsTableRowProps<TData>;\n showHeader?: boolean;\n skeletonRowCount?: number;\n style?: React.CSSProperties;\n summary?: CominsTableSummaryConfig<TData>;\n theme?: CominsTableTheme;\n tree?: false;\n virtualized?: boolean;\n};\n\nexport type CominsTreeTableProps<TData> = Omit<\n CominsTableProps<TData>,\n | \"data\"\n | \"getRowId\"\n | \"hasMoreRows\"\n | \"infiniteScroll\"\n | \"infiniteScrollThreshold\"\n | \"lazyLoad\"\n | \"lazyLoadBatchSize\"\n | \"lazyLoadMode\"\n | \"lazyLoadThreshold\"\n | \"loadingMore\"\n | \"onChangeData\"\n | \"onLazyLoad\"\n | \"onLoadMore\"\n | \"pagination\"\n | \"rowProps\"\n | \"tree\"\n> & {\n data: readonly CominsTreeNode<TData>[];\n defaultExpandAll?: boolean;\n getRowId: (item: TData, index: number) => CominsRowId;\n hasMoreRows?: never;\n infiniteScroll?: never;\n infiniteScrollThreshold?: never;\n lazyLoad?: never;\n lazyLoadBatchSize?: never;\n lazyLoadMode?: never;\n lazyLoadThreshold?: never;\n loadingMore?: never;\n onChangeData?: (data: CominsTreeNode<TData>[]) => void;\n onLazyLoad?: never;\n onLoadMore?: never;\n pagination?: never;\n rowProps?: Omit<CominsTableRowProps<TData>, \"draggable\"> & { draggable?: never };\n tree: true;\n};\n\ntype VisibleRowEntry<TData> = {\n dataIndex: number;\n row: TData;\n rowId: CominsRowId;\n visibleIndex: number;\n};\n\ntype CominsTreeRenderContext<TData> = {\n entriesByRowId: Map<CominsRowId, CominsVisibleTreeRow<TData>>;\n onExpand: (nodeIds?: readonly CominsRowId[]) => void;\n onFold: (nodeIds?: readonly CominsRowId[]) => void;\n onToggle: (rowId: CominsRowId) => void;\n summaryRows: readonly TData[];\n};\n\ntype CominsTableInnerProps<TData> = CominsTableProps<TData> & {\n treeContext?: CominsTreeRenderContext<TData>;\n};\n\nfunction createVisibleRowEntries<TData>(\n sortedRowIndexes: number[] | null,\n rows: TData[],\n rowIds: CominsRowId[],\n startIndex: number,\n endIndex: number,\n) {\n const safeStartIndex = Math.max(0, startIndex);\n const visibleRowCount = sortedRowIndexes?.length ?? rows.length;\n const safeEndIndex = Math.min(visibleRowCount, Math.max(safeStartIndex, endIndex));\n const entries: Array<VisibleRowEntry<TData>> = [];\n\n for (let visibleIndex = safeStartIndex; visibleIndex < safeEndIndex; visibleIndex += 1) {\n const dataIndex = sortedRowIndexes?.[visibleIndex] ?? visibleIndex;\n const row = rows[dataIndex];\n const rowId = rowIds[dataIndex];\n\n if (row !== undefined && rowId !== undefined) {\n entries.push({ dataIndex, row, rowId, visibleIndex });\n }\n }\n\n return entries;\n}\n\nfunction toClassName(value: CominsClassValue) {\n if (!value || typeof value === \"string\") {\n return value;\n }\n\n return Object.entries(value)\n .filter(([, enabled]) => enabled)\n .map(([className]) => className)\n .join(\" \");\n}\n\nfunction resolveRowProp<TData, TValue>(\n value: CominsRowPropValue<TData, TValue> | undefined,\n row: TData,\n index: number,\n) {\n return typeof value === \"function\" ? (value as (row: TData, index: number) => TValue)(row, index) : value;\n}\n\nfunction resolveRowProps<TData>(\n rowProps: CominsTableRowProps<TData> | undefined,\n row: TData,\n index: number,\n) {\n const disabled = resolveRowProp(rowProps?.disabled, row, index) === true;\n\n return {\n className: toClassName(resolveRowProp(rowProps?.className, row, index)),\n disabled,\n draggable: !disabled && resolveRowProp(rowProps?.draggable, row, index) !== false,\n style: resolveRowProp(rowProps?.style, row, index),\n };\n}\n\nfunction getRowCustomBackground(style: React.CSSProperties | undefined) {\n const background = style?.background ?? style?.backgroundColor;\n\n return typeof background === \"string\" || typeof background === \"number\" ? background : undefined;\n}\n\nfunction getResolvedRowStyle(\n rowHeight: number,\n style: React.CSSProperties | undefined,\n customBackground: string | number | undefined,\n) {\n const resolvedStyle = { height: rowHeight, ...style };\n\n if (customBackground === undefined) {\n return resolvedStyle;\n }\n\n return {\n ...resolvedStyle,\n \"--comins-table-row-custom-background\": customBackground,\n } as React.CSSProperties;\n}\n\nfunction createEventRow<TData>(entry: VisibleRowEntry<TData>): CominsEventRow<TData> {\n return {\n data: entry.row,\n dataIndex: entry.dataIndex,\n id: entry.rowId,\n index: entry.visibleIndex,\n };\n}\n\nfunction createEventColumn<TData>(\n column: CominsTableRuntimeColumn<TData>,\n index: number,\n): CominsEventColumn<TData> {\n return {\n definition: column,\n field: column.field,\n id: column.id,\n index,\n label: column.label,\n };\n}\n\nfunction createRowPayload<TData, TEvent>(\n event: TEvent,\n entry: VisibleRowEntry<TData>,\n): CominsRowEventPayload<TData, TEvent> {\n return {\n event,\n index: entry.visibleIndex,\n row: createEventRow(entry),\n };\n}\n\nfunction createCellPayload<TData, TEvent>(\n event: TEvent,\n entry: VisibleRowEntry<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n value: unknown,\n): CominsCellEventPayload<TData, unknown, TEvent> {\n return {\n column: createEventColumn(column, columnIndex),\n event,\n index: entry.visibleIndex,\n row: createEventRow(entry),\n value,\n };\n}\n\nfunction createComponentColumnPayload<TData>(\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n): CominsCellComponentPayload<TData>[\"column\"] {\n return {\n definition: column,\n field: column.field,\n id: column.id,\n index: columnIndex,\n label: column.label,\n };\n}\n\nfunction createCellComponentPayload<TData>(\n entry: VisibleRowEntry<TData>,\n rowDisabled: boolean,\n rowSelected: boolean,\n selectedRowCount: number,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n value: unknown,\n): CominsCellComponentPayload<TData> {\n return {\n column: createComponentColumnPayload(column, columnIndex),\n row: {\n data: entry.row,\n dataIndex: entry.dataIndex,\n disabled: rowDisabled,\n id: entry.rowId,\n index: entry.visibleIndex,\n selected: rowSelected,\n },\n selection: {\n selectedRowCount,\n },\n value,\n };\n}\n\nfunction resolveRenderableCellProps<TData>(\n column: CominsTableRuntimeColumn<TData>,\n payload: CominsCellComponentPayload<TData>,\n): CominsColumnProps<TData> | undefined {\n const props = column.cell?.props;\n\n return typeof props === \"function\" ? props(payload) : props;\n}\n\nfunction resolveRenderableCellGuard<TData>(\n guard: CominsClipboardGuard<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n if (guard === undefined) {\n return true;\n }\n\n return typeof guard === \"boolean\" ? guard : guard(payload);\n}\n\nfunction isRenderableCellDisabled<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n return props?.disabled !== undefined && resolveRenderableCellGuard(props.disabled, payload) === true;\n}\n\nfunction getRenderableCellClassName<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n const className = props?.className;\n\n return typeof className === \"function\" ? className(payload) : className;\n}\n\nfunction getRenderableCellStyle<TData>(\n props: CominsColumnProps<TData> | undefined,\n payload: CominsCellComponentPayload<TData>,\n) {\n const style = props?.style;\n\n return typeof style === \"function\" ? style(payload) : style;\n}\n\nfunction formatRenderableCellValue<TData>(\n column: CominsTableRuntimeColumn<TData>,\n rawValue: unknown,\n payload: CominsCellComponentPayload<TData>,\n) {\n if (column.cell?.format) {\n return column.cell.format(payload);\n }\n\n return rawValue == null ? \"\" : String(rawValue);\n}\n\nfunction createHeaderComponentPayload<TData>(\n state: CominsTableState<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n): CominsHeaderComponentPayload<TData> {\n const columnState = state.columnState[column.id];\n const sortRule = getSortRule(state.sortModel, column.id);\n\n return {\n column: createComponentColumnPayload(column, columnIndex),\n layout: {\n hidden: columnState?.hidden === true || column.hidden === true,\n width: columnState?.width ?? column.width,\n },\n sort: {\n count: state.sortModel.length,\n direction: sortRule?.rule.direction ?? null,\n enabled: Boolean(column.sort),\n priority: sortRule?.priority ?? null,\n },\n };\n}\n\ntype CominsRenderableComponent<TData> = CominsCellComponent<TData> | CominsHeaderComponent<TData>;\ntype CominsRenderablePayload<TData> = CominsCellComponentPayload<TData> | CominsHeaderComponentPayload<TData>;\n\nfunction isCominsCellComponentPayload<TData>(\n payload: CominsRenderablePayload<TData>,\n): payload is CominsCellComponentPayload<TData> {\n return \"row\" in payload && \"selection\" in payload;\n}\n\nfunction shouldRenderCominsComponent<TData>(\n component: CominsRenderableComponent<TData>,\n payload: CominsRenderablePayload<TData>,\n) {\n if (!isCominsCellComponentPayload(payload) || (component.type !== \"input\" && component.type !== \"select\")) {\n return true;\n }\n\n return payload.selection.selectedRowCount === 1 && payload.row.selected;\n}\n\nfunction getRenderableCominsComponents<TData>(\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n) {\n return (components ?? []).filter((component) => shouldRenderCominsComponent(component, payload));\n}\n\nfunction renderCominsComponentSlots<TData>(\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n direction: \"left\" | \"right\",\n interaction?: CominsBuiltInComponentInteraction,\n) {\n return getRenderableCominsComponents(components, payload)\n .map((component, index) => ({ component, index }))\n .filter(({ component }) => (component.direction ?? \"left\") === direction)\n .map(({ component, index }) => (\n <span\n className=\"comins-table__component-slot\"\n data-comins-component-align={component.align ?? \"center\"}\n data-comins-component-direction={direction}\n data-comins-component-id={component.id ?? `${component.type}-${index}`}\n key={component.id ?? `${component.type}-${index}`}\n >\n {renderCominsBuiltInComponent(component as never, payload as never, interaction)}\n </span>\n ));\n}\n\nfunction renderCominsContentWithComponents<TData>(\n content: React.ReactNode,\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n options: {\n interaction?: CominsBuiltInComponentInteraction;\n showContent?: boolean;\n } = {},\n) {\n if (!components?.length) {\n return content;\n }\n\n const showContent = options.showContent ?? true;\n const renderableComponents = getRenderableCominsComponents(components, payload);\n\n if (!renderableComponents.length) {\n return content;\n }\n\n const leftSlots = renderCominsComponentSlots(renderableComponents, payload, \"left\", options.interaction);\n const rightSlots = renderCominsComponentSlots(renderableComponents, payload, \"right\", options.interaction);\n\n if (!showContent) {\n return (\n <span className=\"comins-table__component-layout\" data-comins-component-only=\"true\">\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"all\">\n {leftSlots}\n {rightSlots}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"comins-table__component-layout\">\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"left\">\n {leftSlots}\n </span>\n <span className=\"comins-table__component-content\">{content}</span>\n <span className=\"comins-table__component-group\" data-comins-component-direction=\"right\">\n {rightSlots}\n </span>\n </span>\n );\n}\n\nfunction getEffectiveColumnMinWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return Math.max(COMINS_MIN_COLUMN_WIDTH, column.minWidth ?? COMINS_MIN_COLUMN_WIDTH);\n}\n\nfunction getEffectiveColumnMaxWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return column.maxWidth ?? Number.POSITIVE_INFINITY;\n}\n\nfunction getRuntimeColumnWidth<TData>(\n state: CominsTableState<TData>,\n column: CominsTableRuntimeColumn<TData>,\n) {\n return state.columnState[column.id]?.width ?? column.width ?? 100;\n}\n\nfunction clampColumnWidth(width: number, minWidth: number, maxWidth: number) {\n return Math.min(maxWidth, Math.max(minWidth, width));\n}\n\nfunction distributeRuntimeColumnWidths<TData>(\n state: CominsTableState<TData>,\n columns: Array<CominsTableRuntimeColumn<TData>>,\n targetWidth: number,\n) {\n const widths = columns.map((column) =>\n clampColumnWidth(getRuntimeColumnWidth(state, column), getEffectiveColumnMinWidth(column), getEffectiveColumnMaxWidth(column)),\n );\n const active = new Set(columns.map((_column, index) => index));\n const minWidths = columns.map(getEffectiveColumnMinWidth);\n const maxWidths = columns.map(getEffectiveColumnMaxWidth);\n const boundedTargetWidth = clampColumnWidth(\n targetWidth,\n minWidths.reduce((sum, width) => sum + width, 0),\n maxWidths.reduce((sum, width) => sum + width, 0),\n );\n\n while (active.size > 0) {\n const currentTotal = widths.reduce((sum, width) => sum + width, 0);\n const delta = boundedTargetWidth - currentTotal;\n\n if (Math.abs(delta) < 0.001) {\n break;\n }\n\n const activeIndexes = [...active];\n const activeWeight = activeIndexes.reduce((sum, index) => sum + Math.max(widths[index] ?? 0, 0), 0);\n let clamped = false;\n\n for (const index of activeIndexes) {\n const width = widths[index] ?? 0;\n const weight = activeWeight > 0 ? width / activeWeight : 1 / activeIndexes.length;\n const nextWidth = width + delta * weight;\n const clampedWidth = clampColumnWidth(nextWidth, minWidths[index] ?? 0, maxWidths[index] ?? Number.POSITIVE_INFINITY);\n\n widths[index] = clampedWidth;\n\n if (Math.abs(clampedWidth - nextWidth) > 0.001) {\n active.delete(index);\n clamped = true;\n }\n }\n\n if (!clamped) {\n break;\n }\n }\n\n return widths;\n}\n\nfunction setColumnWidthInsideParentGroup<TData>(\n state: CominsTableState<TData>,\n columnId: string,\n width: number,\n) {\n const group = state.columnGroups.find((candidate) => candidate.children.includes(columnId));\n\n if (!group || state.columnGroupState[group.id]?.hidden === true) {\n return setCominsColumnWidth(state, columnId, width);\n }\n\n const childColumns = group.children\n .map((childId) => state.columns.find((column) => column.id === childId))\n .filter((column): column is CominsTableRuntimeColumn<TData> => Boolean(column))\n .filter((column) => state.columnState[column.id]?.hidden !== true);\n const targetColumn = childColumns.find((column) => column.id === columnId);\n\n if (!targetColumn) {\n return setCominsColumnWidth(state, columnId, width);\n }\n\n const siblingColumns = childColumns.filter((column) => column.id !== columnId);\n\n if (siblingColumns.length === 0) {\n const currentGroupWidth = getRuntimeColumnWidth(state, targetColumn);\n\n return setCominsColumnWidth(\n state,\n columnId,\n clampColumnWidth(width, getEffectiveColumnMinWidth(targetColumn), Math.min(getEffectiveColumnMaxWidth(targetColumn), currentGroupWidth)),\n );\n }\n\n const currentGroupWidth = childColumns.reduce((sum, column) => sum + getRuntimeColumnWidth(state, column), 0);\n const siblingMinWidth = siblingColumns.reduce((sum, column) => sum + getEffectiveColumnMinWidth(column), 0);\n const siblingMaxWidth = siblingColumns.reduce((sum, column) => sum + getEffectiveColumnMaxWidth(column), 0);\n const minWidth = Math.max(getEffectiveColumnMinWidth(targetColumn), currentGroupWidth - siblingMaxWidth);\n const maxWidth = Math.max(minWidth, Math.min(getEffectiveColumnMaxWidth(targetColumn), currentGroupWidth - siblingMinWidth));\n const nextTargetWidth = clampColumnWidth(width, minWidth, maxWidth);\n const nextSiblingWidths = distributeRuntimeColumnWidths(state, siblingColumns, currentGroupWidth - nextTargetWidth);\n let next = setCominsColumnWidth(state, columnId, nextTargetWidth);\n\n siblingColumns.forEach((column, index) => {\n next = setCominsColumnWidth(next, column.id, nextSiblingWidths[index] ?? getRuntimeColumnWidth(next, column));\n });\n\n return next;\n}\n\nfunction setCominsNestedInputValue<TData>(row: TData, field: string, value: string): TData {\n if (!row || typeof row !== \"object\") {\n return row;\n }\n\n const keys = field.split(\".\");\n const [firstKey] = keys;\n\n if (!firstKey) {\n return row;\n }\n\n if (keys.length === 1) {\n return { ...row, [firstKey]: value };\n }\n\n const root = { ...(row as Record<string, unknown>) };\n let current: Record<string, unknown> = root;\n\n keys.slice(0, -1).forEach((key, index) => {\n const nextKey = keys[index + 1];\n const existing = current[key];\n const next =\n existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n\n current[key] = next;\n\n if (nextKey) {\n current = next;\n }\n });\n\n current[keys.at(-1)!] = value;\n\n return root as TData;\n}\n\nfunction getNextSort(current: CominsSortState | null, columnId: string): CominsSortState | null {\n if (current?.columnId !== columnId) {\n return { columnId, direction: \"asc\" };\n }\n\n if (current.direction === \"asc\") {\n return { columnId, direction: \"desc\" };\n }\n\n return null;\n}\n\nfunction getNextSortModel(current: CominsSortModel, columnId: string, additive: boolean): CominsSortState[] {\n const currentIndex = current.findIndex((rule) => rule.columnId === columnId);\n const currentRule = currentIndex < 0 ? null : current[currentIndex] ?? null;\n const nextRule = getNextSort(currentRule, columnId);\n\n if (!additive) {\n return nextRule ? [nextRule] : [];\n }\n\n if (!nextRule) {\n return current.filter((rule) => rule.columnId !== columnId);\n }\n\n if (currentIndex < 0) {\n return [...current, nextRule];\n }\n\n return current.map((rule, index) => (index === currentIndex ? nextRule : rule));\n}\n\nfunction getSortRule(current: CominsSortModel, columnId: string) {\n const index = current.findIndex((rule) => rule.columnId === columnId);\n\n return index < 0 ? null : { priority: index + 1, rule: current[index]! };\n}\n\nfunction getSortIndicatorState(current: CominsSortModel, columnId: string) {\n const currentRule = getSortRule(current, columnId)?.rule;\n\n if (!currentRule) {\n return \"none\";\n }\n\n return currentRule.direction;\n}\n\nfunction getAriaSortState(current: CominsSortModel, columnId: string) {\n const currentRule = getSortRule(current, columnId);\n\n if (!currentRule) {\n return current.length > 1 ? undefined : \"none\";\n }\n\n if (currentRule.priority > 1) {\n return undefined;\n }\n\n return currentRule.rule.direction === \"asc\" ? \"ascending\" : \"descending\";\n}\n\nfunction areSortStatesEqual(left: CominsSortState | null, right: CominsSortState | null) {\n if (!left || !right) {\n return left === right;\n }\n\n return left.columnId === right.columnId && left.direction === right.direction;\n}\n\nfunction areSortModelsEqual(left: CominsSortModel, right: CominsSortModel) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every(\n (rule, index) => rule.columnId === right[index]?.columnId && rule.direction === right[index]?.direction,\n );\n}\n\nfunction areRowIdSequencesEqual(left: readonly CominsRowId[], right: readonly CominsRowId[]) {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nfunction canPreserveSelection<TData>(\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\n) {\n if (!areRowIdSequencesEqual(current.rowIds, next.rowIds)) {\n return false;\n }\n\n const nextColumnIds = new Set(next.columns.map((column) => column.id));\n const selectedCell = current.selection.cell;\n const selectedRange = current.selection.range;\n\n if (selectedCell && !nextColumnIds.has(selectedCell.columnId)) {\n return false;\n }\n\n if (\n selectedRange &&\n (!nextColumnIds.has(selectedRange.anchor.columnId) || !nextColumnIds.has(selectedRange.focus.columnId))\n ) {\n return false;\n }\n\n return true;\n}\n\nfunction getTreeNestedFieldValue(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, key) => {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[key];\n }, row);\n}\n\nfunction compareTreeValues(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n\nfunction getSortedCominsTree<TData>(\n data: readonly CominsTreeNode<TData>[],\n columns: readonly CominsTableColumn<TData>[],\n sortModel: CominsSortModel,\n) {\n if (sortModel.length === 0) {\n return data;\n }\n\n return sortCominsTreeSiblings(data, (leftRow, rightRow) => {\n for (const rule of sortModel) {\n const column = columns.find((candidate) => (candidate.id ?? candidate.field) === rule.columnId);\n\n if (!column?.sort) {\n continue;\n }\n\n const leftValue = getTreeNestedFieldValue(leftRow, column.field);\n const rightValue = getTreeNestedFieldValue(rightRow, column.field);\n const result =\n typeof column.sort === \"function\"\n ? column.sort(leftValue, rightValue, leftRow, rightRow)\n : compareTreeValues(leftValue, rightValue);\n\n if (result !== 0) {\n return rule.direction === \"desc\" ? result * -1 : result;\n }\n }\n\n return 0;\n });\n}\n\nfunction setCominsTreeExpansion<TData>(\n data: readonly CominsTreeNode<TData>[],\n nodeIds: readonly CominsRowId[] | undefined,\n expanded: boolean,\n getRowId: (item: TData, index: number) => CominsRowId,\n defaultExpandAll: boolean,\n): readonly CominsTreeNode<TData>[] {\n if (nodeIds?.length === 0) {\n return data;\n }\n\n type ExpansionEntry = {\n ancestorIds: readonly CominsRowId[];\n hasChildren: boolean;\n node: CominsTreeNode<TData>;\n rowId: CominsRowId;\n };\n\n const entries: ExpansionEntry[] = [];\n const idByNode = new Map<CominsTreeNode<TData>, CominsRowId>();\n let itemIndex = 0;\n\n const visit = (nodes: readonly CominsTreeNode<TData>[], ancestorIds: readonly CominsRowId[]) => {\n nodes.forEach((node) => {\n const rowId = getRowId(node.item, itemIndex);\n const hasChildren = Boolean(node.children?.length);\n itemIndex += 1;\n entries.push({ ancestorIds, hasChildren, node, rowId });\n idByNode.set(node, rowId);\n\n if (node.children?.length) {\n visit(node.children, [...ancestorIds, rowId]);\n }\n });\n };\n\n visit(data, []);\n\n const requestedIds = nodeIds ? new Set(nodeIds) : null;\n const targets = entries.filter((entry) => entry.hasChildren && (!requestedIds || requestedIds.has(entry.rowId)));\n const requestedBranchIds = new Set(targets.map((entry) => entry.rowId));\n const expandedById = new Map(\n entries.map((entry) => [entry.rowId, entry.node.expand ?? defaultExpandAll] as const),\n );\n const changes = new Map<CominsRowId, boolean>();\n\n targets.forEach((entry) => {\n const ancestorsAllowExpand =\n !expanded ||\n !requestedIds ||\n entry.ancestorIds.every((ancestorId) => expandedById.get(ancestorId) === true || requestedBranchIds.has(ancestorId));\n const currentExpanded = entry.node.expand ?? defaultExpandAll;\n\n if (ancestorsAllowExpand && currentExpanded !== expanded) {\n changes.set(entry.rowId, expanded);\n }\n });\n\n if (changes.size === 0) {\n return data;\n }\n\n const applyChanges = (nodes: readonly CominsTreeNode<TData>[]): readonly CominsTreeNode<TData>[] => {\n let changed = false;\n const nextNodes = nodes.map((node) => {\n const rowId = idByNode.get(node);\n const nextExpanded = rowId === undefined ? undefined : changes.get(rowId);\n const nextChildren = node.children ? applyChanges(node.children) : node.children;\n\n if (nextExpanded === undefined && nextChildren === node.children) {\n return node;\n }\n\n changed = true;\n return {\n ...node,\n children: nextChildren,\n ...(nextExpanded === undefined ? {} : { expand: nextExpanded }),\n };\n });\n\n return changed ? nextNodes : nodes;\n };\n\n return applyChanges(data);\n}\n\nfunction CominsTableInner<TData>(\n {\n \"buffer-size\": bufferSize,\n cellSelection = true,\n className,\n columnGroups,\n columns,\n data,\n \"data-testid\": dataTestId,\n emptyComponent,\n getRowId,\n hasMoreRows = false,\n infiniteScroll = false,\n infiniteScrollThreshold = 160,\n lazyLoad = false,\n lazyLoadBatchSize = 30,\n lazyLoadMode = \"append\",\n lazyLoadThreshold,\n loading = false,\n loadingComponent,\n loadingMore = false,\n multiSort = false,\n onChangeColumnLayout,\n onChangeData,\n onChangeSelection,\n onChangeSort,\n onChangeSortModel,\n onClickCell,\n onClickRow,\n onContextMenuCell,\n onContextMenuRow,\n onDoubleClickCell,\n onDoubleClickRow,\n onKeyDownCell,\n onKeyDownRow,\n onLazyLoad,\n onLoadMore,\n pagination,\n persistHeaderWhenEmpty = true,\n rowHeight = 36,\n rowProps,\n showHeader = true,\n skeletonRowCount,\n style,\n summary,\n theme,\n treeContext,\n virtualized = false,\n }: CominsTableInnerProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const footerRef = useRef<HTMLDivElement | null>(null);\n const headerRef = useRef<HTMLDivElement | null>(null);\n const copiedCellRef = useRef<CominsCopiedCell | null>(null);\n const copiedRangeRef = useRef<CominsCopiedCellRange | null>(null);\n const copiedRowRef = useRef<CominsCopiedRow<TData> | null>(null);\n const activePointerGestureCleanupRef = useRef<(() => void) | null>(null);\n const columnPointerInteractionRef = useRef<CominsColumnPointerInteraction | null>(null);\n const lastCellAnchorRef = useRef<CominsCellAddress | null>(null);\n const lazyAbortControllerRef = useRef<AbortController | null>(null);\n const lazyLoadingReasonRef = useRef<CominsLazyLoadReason | null>(null);\n const lazyRequestIdRef = useRef(0);\n const lazyRowsRef = useRef<readonly TData[]>(data);\n const lazyTotalRowsRef = useRef<number | undefined>(undefined);\n const lastLoadMoreRowCountRef = useRef<number | null>(null);\n const lastRowAnchorRef = useRef<CominsRowId | null>(null);\n const rangeDragAnchorRef = useRef<CominsCellAddress | null>(null);\n const rangeDragLastAddressRef = useRef<CominsCellAddress | null>(null);\n const rangeDragMovedRef = useRef(false);\n const rowMoveStateRef = useRef<CominsRowMoveState | null>(null);\n const pendingScrollTopRef = useRef(0);\n const scrollCommitTimeoutRef = useRef<number | null>(null);\n const scrollFrameRef = useRef<number | null>(null);\n const suppressedSortClickRef = useRef<CominsSuppressedSortClick | null>(null);\n const [containerHeight, setContainerHeight] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n const [movingColumnId, setMovingColumnId] = useState<string | null>(null);\n const [movingGroupId, setMovingGroupId] = useState<string | null>(null);\n const [columnMovePointer, setColumnMovePointer] = useState<{ x: number; y: number } | null>(null);\n const [columnMoveTargetId, setColumnMoveTargetId] = useState<string | null>(null);\n const [lazyLoadingReason, setLazyLoadingReason] = useState<CominsLazyLoadReason | null>(null);\n const [lazyRows, setLazyRows] = useState<readonly TData[]>(data);\n const [lazyTotalRows, setLazyTotalRows] = useState<number | undefined>(undefined);\n const [resizingColumnId, setResizingColumnId] = useState<string | null>(null);\n const [rowMoveState, setRowMoveState] = useState<CominsRowMoveState | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const effectiveData = lazyLoad ? lazyRows : data;\n const [state, setState] = useState(() =>\n createCominsTableState({\n columnGroups,\n columns,\n getRowId,\n pagination,\n rows: effectiveData,\n showHeader,\n theme,\n }),\n );\n const stateRef = useRef(state);\n const stateInputRef = useRef({ columnGroups, columns, data: effectiveData, getRowId, pagination, showHeader });\n const virtualBufferSize = Math.max(0, Math.floor(Number.isFinite(bufferSize) ? Number(bufferSize) : 10));\n const resolvedLazyLoadBatchSize = Math.max(1, Math.floor(lazyLoadBatchSize));\n const resolvedLazyLoadThreshold = Math.max(0, Math.floor(lazyLoadThreshold ?? infiniteScrollThreshold));\n const clearActivePointerGesture = () => {\n const cleanup = activePointerGestureCleanupRef.current;\n\n activePointerGestureCleanupRef.current = null;\n cleanup?.();\n };\n const registerActivePointerGesture = (cleanup: () => void) => {\n clearActivePointerGesture();\n activePointerGestureCleanupRef.current = cleanup;\n };\n\n const requestLazyLoad = (reason: CominsLazyLoadReason) => {\n if (!lazyLoad || lazyLoadMode !== \"append\" || !onLazyLoad || lazyLoadingReasonRef.current) {\n return;\n }\n\n const currentRowsLength = stateRef.current.rows.length;\n\n if (reason === \"scroll\" && lazyTotalRowsRef.current !== undefined && currentRowsLength >= lazyTotalRowsRef.current) {\n return;\n }\n\n const controller = new AbortController();\n const requestId = lazyRequestIdRef.current + 1;\n const offset = reason === \"scroll\" ? currentRowsLength : 0;\n\n lazyRequestIdRef.current = requestId;\n lazyAbortControllerRef.current?.abort();\n lazyAbortControllerRef.current = controller;\n lazyLoadingReasonRef.current = reason;\n if (reason !== \"scroll\") {\n pendingScrollTopRef.current = 0;\n setScrollTop(0);\n if (containerRef.current) {\n containerRef.current.scrollTop = 0;\n }\n }\n setLazyLoadingReason(reason);\n\n void onLazyLoad({\n limit: resolvedLazyLoadBatchSize,\n offset,\n reason,\n signal: controller.signal,\n })\n .then((result) => {\n if (controller.signal.aborted || lazyRequestIdRef.current !== requestId) {\n return;\n }\n\n const nextRows = reason === \"scroll\" ? [...lazyRowsRef.current, ...result.rows] : [...result.rows];\n\n lazyRowsRef.current = nextRows;\n lazyTotalRowsRef.current = result.total;\n setLazyRows(nextRows);\n setLazyTotalRows(result.total);\n })\n .catch(() => {\n // Error and retry UI are intentionally left to the consumer in this API pass.\n })\n .finally(() => {\n if (lazyRequestIdRef.current !== requestId) {\n return;\n }\n\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current = null;\n setLazyLoadingReason(null);\n });\n };\n\n useEffect(() => {\n lazyRowsRef.current = lazyRows;\n }, [lazyRows]);\n\n useEffect(() => {\n lazyTotalRowsRef.current = lazyTotalRows;\n }, [lazyTotalRows]);\n\n useEffect(() => {\n if (lazyLoad) {\n return;\n }\n\n lazyRowsRef.current = data;\n setLazyRows(data);\n lazyTotalRowsRef.current = undefined;\n setLazyTotalRows(undefined);\n }, [data, lazyLoad]);\n\n useEffect(() => {\n if (!lazyLoad || !onLazyLoad) {\n return undefined;\n }\n\n requestLazyLoad(\"initial\");\n\n return () => {\n lazyRequestIdRef.current += 1;\n lazyLoadingReasonRef.current = null;\n lazyAbortControllerRef.current?.abort();\n lazyAbortControllerRef.current = null;\n };\n }, [lazyLoad, onLazyLoad, resolvedLazyLoadBatchSize]);\n\n useEffect(() => {\n const previousInput = stateInputRef.current;\n\n if (\n previousInput.columns === columns &&\n previousInput.columnGroups === columnGroups &&\n previousInput.data === effectiveData &&\n previousInput.getRowId === getRowId &&\n previousInput.pagination === pagination &&\n previousInput.showHeader === showHeader\n ) {\n return;\n }\n\n stateInputRef.current = { columnGroups, columns, data: effectiveData, getRowId, pagination, showHeader };\n const current = stateRef.current;\n const nextState = createCominsTableState({\n columnLayout: serializeCominsColumnLayout(current),\n columnGroups,\n columns,\n getRowId,\n pagination: pagination ?? current.pagination,\n rows: effectiveData,\n showHeader,\n sortModel: current.sortModel,\n theme: current.theme,\n });\n const next = canPreserveSelection(current, nextState)\n ? { ...nextState, selection: current.selection }\n : nextState;\n\n stateRef.current = next;\n setState(next);\n\n if (!areSortStatesEqual(next.sort, current.sort)) {\n onChangeSort?.(next.sort);\n }\n\n if (!areSortModelsEqual(next.sortModel, current.sortModel)) {\n onChangeSortModel?.(next.sortModel);\n }\n }, [columnGroups, columns, effectiveData, getRowId, pagination, showHeader]);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n if (lastLoadMoreRowCountRef.current !== null && lastLoadMoreRowCountRef.current !== state.rows.length) {\n lastLoadMoreRowCountRef.current = null;\n }\n }, [state.rows.length]);\n\n useEffect(() => {\n return () => {\n clearActivePointerGesture();\n\n if (scrollFrameRef.current !== null) {\n window.cancelAnimationFrame(scrollFrameRef.current);\n }\n\n if (scrollCommitTimeoutRef.current !== null) {\n window.clearTimeout(scrollCommitTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n const element = containerRef.current;\n\n if (!element || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n if (entry) {\n setContainerHeight(entry.contentRect.height);\n setContainerWidth(entry.contentRect.width);\n }\n });\n observer.observe(element);\n\n return () => observer.disconnect();\n }, []);\n\n const notifyChanges = (\n current: CominsTableState<TData>,\n next: CominsTableState<TData>,\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n if (next.rows !== current.rows) {\n onChangeData?.(next.rows);\n }\n\n if (next.selection !== current.selection) {\n onChangeSelection?.(next.selection);\n }\n\n if (options.columnLayoutChanged) {\n onChangeColumnLayout?.(serializeCominsColumnLayout(next));\n }\n\n if (!areSortStatesEqual(next.sort, current.sort)) {\n onChangeSort?.(next.sort);\n }\n\n if (!areSortModelsEqual(next.sortModel, current.sortModel)) {\n onChangeSortModel?.(next.sortModel);\n }\n };\n\n const commitState = (\n updater: CominsTableState<TData> | ((current: CominsTableState<TData>) => CominsTableState<TData>),\n options: { columnLayoutChanged?: boolean } = {},\n ) => {\n const current = stateRef.current;\n const next = typeof updater === \"function\" ? updater(current) : updater;\n\n stateRef.current = next;\n setState(next);\n notifyChanges(current, next, options);\n };\n\n const visibleColumns = useMemo(() => getCominsVisibleColumns(state), [state]);\n const headerRows = useMemo(() => getCominsHeaderRows(state), [state]);\n const summaryValues = useMemo(\n () => (summary ? getCominsSummaryValues(treeContext?.summaryRows ?? state.rows, visibleColumns, summary) : null),\n [state.rows, summary, treeContext?.summaryRows, visibleColumns],\n );\n const summaryCells = useMemo(() => {\n if (!summary) {\n return [];\n }\n\n const cells: Array<{\n className?: string;\n colSpan: number;\n column: CominsTableRuntimeColumn<TData>;\n style?: React.CSSProperties;\n value: React.ReactNode;\n }> = [];\n let columnIndex = 0;\n\n while (columnIndex < visibleColumns.length) {\n const column = visibleColumns[columnIndex]!;\n const configuredColumn = summary.columns[column.id];\n const config =\n typeof configuredColumn === \"object\" && configuredColumn !== null ? configuredColumn : undefined;\n const requestedColSpan = config?.colSpan;\n const normalizedColSpan =\n typeof requestedColSpan === \"number\" && Number.isFinite(requestedColSpan)\n ? Math.max(1, Math.floor(requestedColSpan))\n : 1;\n const colSpan = Math.min(normalizedColSpan, visibleColumns.length - columnIndex);\n\n cells.push({\n className: config?.className,\n colSpan,\n column,\n style: config?.style,\n value: summaryValues?.[column.id] ?? (cells.length === 0 ? summary.label : null),\n });\n columnIndex += colSpan;\n }\n\n return cells;\n }, [summary, summaryValues, visibleColumns]);\n const sortedRowIndexes = useMemo(\n () => (treeContext || state.sortModel.length === 0 ? null : getCominsSortedRowIndexes(state)),\n [state, treeContext],\n );\n const visibleRowCount = sortedRowIndexes?.length ?? state.rows.length;\n const pageStartIndex = Math.max(0, state.pagination.pageIndex) * Math.max(1, state.pagination.pageSize);\n const rowWindow = useMemo(() => {\n if (virtualized) {\n const safeRowHeight = Math.max(1, rowHeight);\n const viewportHeight = containerHeight || rowHeight * 12;\n const totalHeight = visibleRowCount * safeRowHeight;\n const maxPhysicalTotalHeight = 1_500_000;\n const physicalTotalHeight = Math.min(totalHeight, maxPhysicalTotalHeight);\n const logicalScrollableHeight = Math.max(0, totalHeight - viewportHeight);\n const physicalScrollableHeight = Math.max(0, physicalTotalHeight - viewportHeight);\n const scrollScale =\n logicalScrollableHeight > 0 && physicalScrollableHeight > 0\n ? logicalScrollableHeight / physicalScrollableHeight\n : 1;\n const logicalScrollTop = Math.min(logicalScrollableHeight, Math.max(0, scrollTop) * scrollScale);\n const startIndex = Math.max(0, Math.floor(logicalScrollTop / safeRowHeight) - virtualBufferSize);\n const endIndex = Math.min(\n visibleRowCount,\n Math.ceil((logicalScrollTop + Math.max(0, viewportHeight)) / safeRowHeight) + virtualBufferSize,\n );\n const logicalTopSpacerHeight = startIndex * safeRowHeight;\n const renderOffset = scrollScale > 0 ? logicalTopSpacerHeight / scrollScale : logicalTopSpacerHeight;\n\n return {\n entries: createVisibleRowEntries(sortedRowIndexes, state.rows, state.rowIds, startIndex, endIndex),\n renderOffset,\n scrollHeight: physicalTotalHeight,\n };\n }\n\n return {\n entries: createVisibleRowEntries(\n sortedRowIndexes,\n state.rows,\n state.rowIds,\n pageStartIndex,\n pageStartIndex + Math.max(1, state.pagination.pageSize),\n ),\n renderOffset: 0,\n scrollHeight: 0,\n };\n }, [\n containerHeight,\n pageStartIndex,\n rowHeight,\n scrollTop,\n sortedRowIndexes,\n state.pagination.pageSize,\n state.rowIds,\n state.rows,\n virtualBufferSize,\n virtualized,\n visibleRowCount,\n ]);\n const currentTheme = theme ?? state.theme;\n const densityClass =\n currentTheme.density === \"compact\"\n ? \"text-[11px]\"\n : currentTheme.density === \"spacious\"\n ? \"text-[13px]\"\n : \"text-[length:var(--comins-font-size-base,12px)]\";\n const selectedRowIdSet = useMemo(() => new Set(state.selection.rowIds), [state.selection.rowIds]);\n const columnWidths = useMemo(() => {\n const columnCount = visibleColumns.length;\n\n if (columnCount === 0) {\n return [];\n }\n\n const configuredWidths = visibleColumns.map((column) => state.columnState[column.id]?.width ?? column.width);\n\n if (containerWidth <= 0) {\n const fallbackWidth = `${100 / columnCount}%`;\n\n return configuredWidths.map((width) => width ?? fallbackWidth);\n }\n\n let fixedTotal = 0;\n\n for (const width of configuredWidths) {\n fixedTotal += width ?? 0;\n }\n\n const flexibleColumns = visibleColumns.filter((_column, index) => configuredWidths[index] === undefined);\n const flexibleWidth =\n flexibleColumns.length > 0 ? Math.max(0, (containerWidth - fixedTotal) / flexibleColumns.length) : 0;\n\n return visibleColumns.map((column, index) => {\n const width = configuredWidths[index] ?? flexibleWidth;\n const minWidth = getEffectiveColumnMinWidth(column);\n const maxWidth = column.maxWidth ?? Number.POSITIVE_INFINITY;\n\n return Math.min(maxWidth, Math.max(minWidth, width));\n });\n }, [containerWidth, state.columnState, visibleColumns]);\n const columnWidthTotal = useMemo(() => {\n let totalWidth = 0;\n\n for (const width of columnWidths) {\n if (typeof width !== \"number\") {\n return undefined;\n }\n\n totalWidth += width;\n }\n\n return totalWidth;\n }, [columnWidths]);\n const tableWidth = useMemo(() => {\n if (typeof columnWidthTotal !== \"number\") {\n return undefined;\n }\n\n return Math.max(containerWidth, columnWidthTotal);\n }, [columnWidthTotal, containerWidth]);\n const hasHorizontalOverflow =\n typeof columnWidthTotal === \"number\" && containerWidth > 0 ? columnWidthTotal > containerWidth + 1 : false;\n const lazyHasMoreRows = lazyLoad && (lazyTotalRows === undefined || visibleRowCount < lazyTotalRows);\n const resolvedHasMoreRows = lazyLoad ? lazyHasMoreRows : hasMoreRows;\n const resolvedLoading = loading || lazyLoadingReason === \"initial\" || lazyLoadingReason === \"refresh\";\n const resolvedLoadingMore = loadingMore || lazyLoadingReason === \"scroll\";\n const isEmpty = visibleRowCount === 0;\n const shouldRenderSkeleton = resolvedLoading && isEmpty;\n const shouldRenderEmpty = !resolvedLoading && isEmpty;\n const shouldRenderInfiniteLoadingRow =\n (infiniteScroll || lazyLoad) && resolvedLoadingMore && resolvedHasMoreRows && !isEmpty;\n const resolvedSkeletonRowCount = Math.max(\n 1,\n Math.floor(skeletonRowCount ?? Math.min(Math.max(1, state.pagination.pageSize), 5)),\n );\n const stateRowCount =\n (shouldRenderSkeleton ? resolvedSkeletonRowCount : shouldRenderEmpty ? 1 : 0) +\n (shouldRenderInfiniteLoadingRow ? 1 : 0);\n const renderedRowsHeight = (rowWindow.entries.length + stateRowCount) * rowHeight;\n const emptyFillerHeight = virtualized ? 0 : Math.max(0, containerHeight - renderedRowsHeight);\n const renderedHeaderVisible = state.showHeader && (persistHeaderWhenEmpty || !isEmpty || resolvedLoading);\n\n const isCopyPasteKey = (event: React.KeyboardEvent, key: \"c\" | \"v\") =>\n (event.ctrlKey || event.metaKey) && event.key.toLowerCase() === key;\n const getVisibleEntryByRenderedIndex = (index: number) => rowWindow.entries[index];\n const getVisibleRowIdsBetween = (\n current: CominsTableState<TData>,\n anchorRowId: CominsRowId,\n focusRowId: CominsRowId,\n ) => {\n const visibleRowIndexes = treeContext ? current.rows.map((_row, index) => index) : getCominsSortedRowIndexes(current);\n const visibleEntries = visibleRowIndexes.flatMap<VisibleRowEntry<TData>>((dataIndex, visibleIndex) => {\n const row = current.rows[dataIndex];\n const rowId = current.rowIds[dataIndex];\n\n return row === undefined || rowId === undefined ? [] : [{ dataIndex, row, rowId, visibleIndex }];\n });\n const anchorIndex = visibleEntries.findIndex((entry) => entry.rowId === anchorRowId);\n const focusIndex = visibleEntries.findIndex((entry) => entry.rowId === focusRowId);\n\n if (anchorIndex < 0 || focusIndex < 0) {\n return [focusRowId];\n }\n\n const start = Math.min(anchorIndex, focusIndex);\n const end = Math.max(anchorIndex, focusIndex);\n\n return visibleEntries.slice(start, end + 1).map((entry) => entry.rowId);\n };\n const selectRowRangeByIds = (anchorRowId: CominsRowId, focusRowId: CominsRowId) => {\n commitState((current) => selectRows(current, getVisibleRowIdsBetween(current, anchorRowId, focusRowId)));\n };\n const selectRowsByVisibleIndexes = (indexes: readonly number[]) => {\n commitState((current) => {\n const rowIds = indexes.flatMap((index) => {\n const entry = getVisibleEntryByRenderedIndex(index);\n\n return entry ? [entry.rowId] : [];\n });\n\n return selectRows(current, rowIds);\n });\n };\n const clearSuppressedSortClick = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n suppressed.cleanup();\n\n if (suppressed.timer !== null) {\n window.clearTimeout(suppressed.timer);\n }\n\n suppressedSortClickRef.current = null;\n };\n const suppressNextSortClick = (columnId: string) => {\n if (suppressedSortClickRef.current?.columnId === columnId) {\n return;\n }\n\n clearSuppressedSortClick();\n suppressedSortClickRef.current = { cleanup: () => undefined, columnId, timer: null };\n };\n const scheduleSuppressedSortClickClear = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n suppressed.cleanup();\n suppressed.cleanup = () => undefined;\n suppressed.timer = window.setTimeout(() => {\n if (suppressedSortClickRef.current === suppressed) {\n suppressedSortClickRef.current = null;\n }\n }, 0);\n };\n const keepSuppressedSortClickUntilPointerEnd = () => {\n const suppressed = suppressedSortClickRef.current;\n\n if (!suppressed) {\n return;\n }\n\n const handlePointerUp = () => scheduleSuppressedSortClickClear();\n const handlePointerCancel = () => clearSuppressedSortClick();\n const handleWindowBlur = () => clearSuppressedSortClick();\n\n suppressed.cleanup();\n suppressed.cleanup = () => {\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handleWindowBlur);\n };\n window.addEventListener(\"pointerup\", handlePointerUp, { once: true });\n window.addEventListener(\"pointercancel\", handlePointerCancel, { once: true });\n window.addEventListener(\"blur\", handleWindowBlur, { once: true });\n };\n const consumeSuppressedSortClick = (columnId: string) => {\n if (suppressedSortClickRef.current?.columnId !== columnId) {\n return false;\n }\n\n clearSuppressedSortClick();\n\n return true;\n };\n const activateHeaderSort = (column: CominsTableRuntimeColumn<TData>, additive: boolean) => {\n if (!column.sort) {\n return;\n }\n\n commitState((current) =>\n setCominsSortModel(current, getNextSortModel(current.sortModel, column.id, multiSort && additive)),\n );\n };\n\n const getColumnMoveTargetId = (clientX: number, clientY: number) => {\n const targetHeader = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-column-id], [data-comins-column-group-id]\");\n\n if (!targetHeader) {\n return null;\n }\n\n if (targetHeader.dataset.cominsColumnId) {\n return targetHeader.dataset.cominsColumnId;\n }\n\n const groupId = targetHeader.dataset.cominsColumnGroupId;\n const targetGroup = groupId ? stateRef.current.columnGroups.find((group) => group.id === groupId) : undefined;\n\n return targetGroup?.children.find((childId) => visibleColumns.some((column) => column.id === childId)) ?? null;\n };\n\n useImperativeHandle(\n ref,\n () => ({\n clearSort: () => commitState((current) => clearCominsSortState(current)),\n expand: (nodeIds) => treeContext?.onExpand(nodeIds),\n fold: (nodeIds) => treeContext?.onFold(nodeIds),\n getColumnLayout: () => serializeCominsColumnLayout(state),\n getSortModel: () => state.sortModel,\n getSortState: () => state.sort,\n setColumnLayout: (layout) =>\n commitState((current) => applyCominsColumnLayout(current, layout), { columnLayoutChanged: true }),\n setMoveTargetRow: (targetIdx, sourceIdx) =>\n commitState((current) => {\n if (treeContext) {\n return current;\n }\n\n const visibleRowIds = getCominsSortedRowIndexes(current).flatMap((dataIndex) => {\n const rowId = current.rowIds[dataIndex];\n\n return rowId === undefined ? [] : [rowId];\n });\n const sourceRowId = visibleRowIds[sourceIdx];\n\n if (sourceRowId === undefined || targetIdx < 0 || sourceIdx < 0) {\n return current;\n }\n\n const nextVisibleRowIds = visibleRowIds.filter((rowId) => rowId !== sourceRowId);\n const targetPosition = Math.min(nextVisibleRowIds.length, targetIdx);\n nextVisibleRowIds.splice(targetPosition, 0, sourceRowId);\n\n const rowById = new Map(current.rowIds.map((rowId, index) => [rowId, current.rows[index]] as const));\n const nextRows = nextVisibleRowIds.flatMap((rowId) => {\n const row = rowById.get(rowId);\n\n return row === undefined ? [] : [row];\n });\n\n if (nextRows.length !== current.rows.length) {\n return current;\n }\n\n return {\n ...current,\n rowIds: nextVisibleRowIds,\n rows: nextRows,\n sort: null,\n sortModel: [],\n };\n }),\n setSelectedRow: (index) => selectRowsByVisibleIndexes([index]),\n setSelectedRows: (indexes) => selectRowsByVisibleIndexes(indexes),\n setSortModel: (sortModel) => commitState((current) => setCominsSortModel(current, sortModel)),\n setSortState: (sort) => commitState((current) => setCominsSortState(current, sort)),\n }),\n [rowWindow.entries, state, treeContext],\n );\n\n const clearColumnPointerInteraction = () => {\n const interaction = columnPointerInteractionRef.current;\n\n if (interaction) {\n interaction.cleanup();\n\n if (interaction.timer !== null) {\n window.clearTimeout(interaction.timer);\n }\n }\n\n columnPointerInteractionRef.current = null;\n setMovingColumnId(null);\n setMovingGroupId(null);\n setColumnMovePointer(null);\n setColumnMoveTargetId(null);\n };\n\n useEffect(\n () => () => {\n clearColumnPointerInteraction();\n clearSuppressedSortClick();\n },\n [],\n );\n\n const beginColumnPointerInteraction = (options: CominsColumnPointerOptions) => {\n if (options.event.button !== 0) {\n return;\n }\n\n const pointerType: string = options.event.pointerType;\n const isMousePointer = pointerType === \"mouse\" || pointerType === \"\";\n const suppressPendingSort = () => {\n if (options.sortColumnId) {\n suppressNextSortClick(options.sortColumnId);\n }\n };\n const activateCurrent = (x: number, y: number) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current !== interaction || current.active || current.blocked) {\n return;\n }\n\n current.active = true;\n current.cancelSort = true;\n suppressPendingSort();\n options.activate(x, y);\n };\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current !== interaction) {\n return;\n }\n\n if (!current.active && !current.blocked && isMousePointer) {\n const intent = getCominsColumnMouseIntent({\n clientX: moveEvent.clientX,\n clientY: moveEvent.clientY,\n startX: current.startX,\n startY: current.startY,\n });\n\n if (intent === \"activate\") {\n activateCurrent(moveEvent.clientX, moveEvent.clientY);\n } else if (intent === \"cancel\") {\n current.blocked = true;\n current.cancelSort = true;\n suppressPendingSort();\n }\n }\n\n if (!current.active && !current.blocked && !isMousePointer) {\n const distance = Math.hypot(moveEvent.clientX - current.startX, moveEvent.clientY - current.startY);\n\n if (distance > 4) {\n current.blocked = true;\n current.cancelSort = true;\n window.clearTimeout(current.timer ?? undefined);\n suppressPendingSort();\n }\n }\n\n if (current.active) {\n moveEvent.preventDefault();\n setColumnMovePointer({ x: moveEvent.clientX, y: moveEvent.clientY });\n setColumnMoveTargetId(getColumnMoveTargetId(moveEvent.clientX, moveEvent.clientY));\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (current === interaction && current.active) {\n const targetId = getColumnMoveTargetId(upEvent.clientX, upEvent.clientY);\n\n if (targetId) {\n options.commitTarget(targetId);\n }\n }\n\n if (current === interaction && current.cancelSort) {\n scheduleSuppressedSortClickClear();\n }\n\n clearColumnPointerInteraction();\n };\n const handlePointerCancel = () => {\n clearSuppressedSortClick();\n clearColumnPointerInteraction();\n };\n const handleKeyDown = (keyEvent: KeyboardEvent) => {\n if (keyEvent.key === \"Escape\") {\n keyEvent.preventDefault();\n\n if (columnPointerInteractionRef.current === interaction && interaction.cancelSort) {\n keepSuppressedSortClickUntilPointerEnd();\n }\n\n clearColumnPointerInteraction();\n }\n };\n const handleWindowBlur = () => {\n clearSuppressedSortClick();\n clearColumnPointerInteraction();\n };\n const interaction: CominsColumnPointerInteraction = {\n active: false,\n blocked: false,\n cancelSort: false,\n cleanup: () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"blur\", handleWindowBlur);\n },\n id: options.id,\n kind: options.kind,\n pointerType,\n startX: options.event.clientX,\n startY: options.event.clientY,\n timer: null,\n };\n\n clearColumnPointerInteraction();\n clearSuppressedSortClick();\n\n if (!isMousePointer) {\n interaction.timer = window.setTimeout(() => {\n const current = columnPointerInteractionRef.current;\n\n if (current === interaction && !current.active && !current.blocked) {\n activateCurrent(current.startX, current.startY);\n }\n }, 1000);\n }\n\n columnPointerInteractionRef.current = interaction;\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"blur\", handleWindowBlur);\n };\n\n const beginHeaderPointerInteraction = (\n event: React.PointerEvent<HTMLTableCellElement>,\n column: CominsTableRuntimeColumn<TData>,\n ) => {\n beginColumnPointerInteraction({\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setColumnMoveTargetId(column.id);\n setMovingGroupId(null);\n setMovingColumnId(column.id);\n },\n commitTarget: (targetId) => {\n if (targetId === column.id) {\n return;\n }\n\n const targetIndex = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === targetId);\n\n if (targetIndex >= 0) {\n const current = stateRef.current;\n const next = moveCominsColumn(current, column.id, targetIndex);\n\n if (\n next !== current &&\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index])\n ) {\n commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: column.id,\n kind: \"column\",\n sortColumnId: column.id,\n });\n };\n\n const beginGroupPointerInteraction = (\n event: React.PointerEvent<HTMLTableCellElement>,\n group: CominsTableRuntimeColumnGroup,\n ) => {\n beginColumnPointerInteraction({\n activate: (x, y) => {\n setColumnMovePointer({ x, y });\n setColumnMoveTargetId(group.children[0] ?? null);\n setMovingColumnId(null);\n setMovingGroupId(group.id);\n },\n commitTarget: (targetId) => {\n if (group.children.includes(targetId)) {\n return;\n }\n\n const targetIndex = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === targetId);\n\n if (targetIndex >= 0) {\n const current = stateRef.current;\n const next = moveCominsColumnGroup(current, group.id, targetIndex);\n\n if (\n next !== current &&\n next.columnOrder.some((columnId, index) => columnId !== current.columnOrder[index])\n ) {\n commitState(next, { columnLayoutChanged: true });\n }\n }\n },\n event,\n id: group.id,\n kind: \"group\",\n });\n };\n\n type CominsRowSelectionModifierEvent = Pick<\n React.KeyboardEvent | React.MouseEvent,\n \"ctrlKey\" | \"metaKey\" | \"shiftKey\"\n >;\n\n const selectRowFromInteraction = (\n event: CominsRowSelectionModifierEvent,\n entry: VisibleRowEntry<TData>,\n ) => {\n if (event.shiftKey && lastRowAnchorRef.current !== null) {\n selectRowRangeByIds(lastRowAnchorRef.current, entry.rowId);\n lastRowAnchorRef.current = entry.rowId;\n return;\n }\n\n commitState((current) =>\n selectRow(current, entry.rowId, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n }),\n );\n lastRowAnchorRef.current = entry.rowId;\n };\n\n const handleRowKeyDown = (\n event: React.KeyboardEvent<HTMLTableRowElement>,\n entry: VisibleRowEntry<TData>,\n disabled: boolean,\n ) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n\n onKeyDownRow?.(createRowPayload(event, entry));\n\n if (event.defaultPrevented || event.target !== event.currentTarget) {\n return;\n }\n\n if (treeContext && (isCopyPasteKey(event, \"c\") || isCopyPasteKey(event, \"v\"))) {\n event.preventDefault();\n return;\n }\n\n if (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n copiedRowRef.current = copyCominsRow(state, entry.rowId);\n return;\n }\n\n if (isCopyPasteKey(event, \"v\") && copiedRowRef.current) {\n event.preventDefault();\n commitState((current) => pasteCominsRow(current, copiedRowRef.current!, { mode: \"insert-after\", targetRowId: entry.rowId }));\n }\n };\n const handleCellKeyDown = (\n event: React.KeyboardEvent<HTMLTableCellElement>,\n entry: VisibleRowEntry<TData>,\n column: CominsTableRuntimeColumn<TData>,\n columnIndex: number,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n onKeyDownCell?.(createCellPayload(event, entry, column, columnIndex, getCominsCellValue(state, entry.row, column.id)));\n\n if (event.defaultPrevented) {\n return;\n }\n\n if (isCopyPasteKey(event, \"c\")) {\n event.preventDefault();\n event.stopPropagation();\n copiedRangeRef.current = state.selection.range ? copyCominsCellRange(state) : null;\n copiedCellRef.current = copiedRangeRef.current ? null : copyCominsCell(state, address);\n return;\n }\n\n if (isCopyPasteKey(event, \"v\") && (copiedRangeRef.current || copiedCellRef.current)) {\n event.preventDefault();\n event.stopPropagation();\n commitState((current) =>\n copiedRangeRef.current\n ? pasteCominsCellRange(current, address, copiedRangeRef.current)\n : pasteCominsCell(current, address, copiedCellRef.current),\n );\n }\n };\n const beginCellRangeDrag = (\n event: { button: number; shiftKey: boolean },\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n if (!cellSelection) {\n return;\n }\n\n if (disabled || event.button !== 0 || event.shiftKey) {\n return;\n }\n\n rangeDragAnchorRef.current = address;\n rangeDragLastAddressRef.current = address;\n rangeDragMovedRef.current = false;\n };\n const getCellAddressFromPoint = (clientX: number, clientY: number): CominsCellAddress | null => {\n const element = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-cell-column-id][data-comins-data-index]\");\n const columnId = element?.dataset.cominsCellColumnId;\n const dataIndex = element?.dataset.cominsDataIndex === undefined ? NaN : Number(element.dataset.cominsDataIndex);\n const rowId = Number.isInteger(dataIndex) ? state.rowIds[dataIndex] : undefined;\n\n return columnId && rowId !== undefined ? { columnId, rowId } : null;\n };\n const updateCellRangeDrag = (address: CominsCellAddress) => {\n if (!cellSelection) {\n return;\n }\n\n const anchor = rangeDragAnchorRef.current;\n\n if (!anchor || (anchor.rowId === address.rowId && anchor.columnId === address.columnId)) {\n return;\n }\n\n rangeDragMovedRef.current = true;\n rangeDragLastAddressRef.current = address;\n lastCellAnchorRef.current = anchor;\n commitState((current) => selectCellRange(current, { anchor, focus: address }));\n };\n const endCellRangeDrag = () => {\n if (!cellSelection) {\n return;\n }\n\n rangeDragAnchorRef.current = null;\n rangeDragLastAddressRef.current = null;\n };\n const beginCellRangePointerDrag = (\n event: React.PointerEvent<HTMLTableCellElement>,\n address: CominsCellAddress,\n disabled: boolean,\n ) => {\n beginCellRangeDrag(event, address, disabled);\n\n if (disabled || event.button !== 0 || event.shiftKey) {\n return;\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons !== 1) {\n return;\n }\n\n const nextAddress = getCellAddressFromPoint(moveEvent.clientX, moveEvent.clientY);\n\n if (nextAddress) {\n updateCellRangeDrag(nextAddress);\n }\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n endCellRangeDrag();\n };\n const handlePointerCancel = () => {\n cleanup();\n endCellRangeDrag();\n };\n\n event.preventDefault();\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n };\n const beginRowHandlePointerDrag = (\n event: React.PointerEvent<HTMLElement>,\n entry: VisibleRowEntry<TData>,\n disabled: boolean,\n draggable: boolean,\n ) => {\n if (disabled || !draggable || event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const sourceRowId = entry.rowId;\n const setActiveRowMoveState = (next: CominsRowMoveState | null) => {\n rowMoveStateRef.current = next;\n setRowMoveState(next);\n };\n const updateTarget = (clientX: number, clientY: number) => {\n const targetRow = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>(\"[data-comins-row-data-index]\");\n\n if (!targetRow || targetRow.dataset.cominsRowDataIndex === undefined) {\n return;\n }\n\n const targetDataIndex = Number(targetRow.dataset.cominsRowDataIndex);\n\n if (Number.isInteger(targetDataIndex)) {\n setActiveRowMoveState({ sourceRowId, targetDataIndex });\n }\n };\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.buttons !== 1) {\n return;\n }\n\n updateTarget(moveEvent.clientX, moveEvent.clientY);\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = (upEvent: PointerEvent) => {\n cleanup();\n updateTarget(upEvent.clientX, upEvent.clientY);\n\n const targetIndex = rowMoveStateRef.current?.targetDataIndex;\n setActiveRowMoveState(null);\n\n if (targetIndex !== undefined) {\n commitState((current) => moveCominsRow(current, sourceRowId, targetIndex));\n }\n };\n const handlePointerCancel = () => {\n cleanup();\n setActiveRowMoveState(null);\n };\n\n updateTarget(event.clientX, event.clientY);\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n };\n const movingColumn = movingColumnId\n ? visibleColumns.find((visibleColumn) => visibleColumn.id === movingColumnId)\n : undefined;\n const movingGroup = movingGroupId ? state.columnGroups.find((group) => group.id === movingGroupId) : undefined;\n const movingHeaderLabel = movingColumn?.label ?? movingGroup?.label;\n\n const renderHeaderCell = (cell: CominsHeaderCell<TData>, fallbackIndex: number) => {\n if (cell.kind === \"group\") {\n return (\n <th\n className={[\n \"comins-table__th comins-table__group-th px-3 py-2 text-left font-semibold\",\n movingGroupId === cell.groupId ? \"comins-column-moving\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n colSpan={cell.colSpan}\n data-column-moving={movingGroupId === cell.groupId ? \"true\" : undefined}\n data-column-placeholder={movingGroupId === cell.groupId ? \"true\" : undefined}\n data-comins-column-group-id={cell.groupId}\n data-testid={`header-group-${cell.groupId}`}\n key={`group-${cell.groupId}`}\n onPointerDown={(event) => beginGroupPointerInteraction(event, cell.group)}\n rowSpan={cell.rowSpan}\n scope=\"colgroup\"\n >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span className=\"comins-table__header-content\" data-comins-header-body=\"true\">\n <span className=\"comins-table__header-label\">{cell.group.label}</span>\n </span>\n <span\n aria-hidden=\"true\"\n className=\"comins-table__resize\"\n data-resizing={resizingColumnId === cell.groupId ? \"true\" : undefined}\n data-testid={`resize-group-${cell.groupId}`}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const measuredWidth = event.currentTarget.closest<HTMLTableCellElement>(\"th\")?.getBoundingClientRect().width;\n const visibleWidthSnapshot = new Map<string, number>();\n\n for (const childId of cell.group.children) {\n const visibleColumn = visibleColumns.find((column) => column.id === childId);\n\n if (!visibleColumn) {\n continue;\n }\n\n const headerCell = Array.from(\n headerRef.current?.querySelectorAll<HTMLTableCellElement>(\"[data-comins-column-id]\") ?? [],\n ).find((element) => element.dataset.cominsColumnId === visibleColumn.id);\n const measuredColumnWidth = headerCell?.getBoundingClientRect().width;\n const fallbackWidth = stateRef.current.columnState[visibleColumn.id]?.width ?? visibleColumn.width ?? 160;\n\n visibleWidthSnapshot.set(\n visibleColumn.id,\n measuredColumnWidth && Number.isFinite(measuredColumnWidth) ? measuredColumnWidth : fallbackWidth,\n );\n }\n\n const fallbackGroupWidth = [...visibleWidthSnapshot.values()].reduce((sum, width) => sum + width, 0);\n const startWidth =\n measuredWidth && Number.isFinite(measuredWidth) ? measuredWidth : Math.max(1, fallbackGroupWidth);\n setResizingColumnId(cell.groupId);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n commitState(\n (current) => {\n let next = current;\n\n for (const [visibleColumnId, visibleColumnWidth] of visibleWidthSnapshot) {\n next = setCominsColumnWidth(next, visibleColumnId, visibleColumnWidth);\n }\n\n return setCominsColumnGroupWidth(next, cell.groupId, startWidth + moveEvent.clientX - startX);\n },\n { columnLayoutChanged: true },\n );\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n setResizingColumnId(null);\n };\n const handlePointerCancel = () => {\n cleanup();\n setResizingColumnId(null);\n };\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n }}\n >\n <span className=\"comins-table__resize-line\" />\n </span>\n </th>\n );\n }\n\n const column = cell.column;\n const index = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === column.id);\n const safeIndex = index >= 0 ? index : fallbackIndex;\n const columnState = state.columnState[column.id];\n const headerProps = column.header?.props ?? {};\n const sortRule = getSortRule(state.sortModel, column.id);\n const sortIndicatorState = getSortIndicatorState(state.sortModel, column.id);\n const sortIndicatorVisible = sortIndicatorState === \"asc\" || sortIndicatorState === \"desc\";\n const showSortPriority = sortRule !== null && state.sortModel.length > 1;\n const isMovingGroupChild = Boolean(movingGroup?.children.includes(column.id));\n const isColumnPlaceholder = movingColumnId === column.id || isMovingGroupChild;\n const headerClassName = [\n \"comins-table__th px-3 py-2 text-left font-semibold\",\n movingColumnId === column.id ? \"comins-column-moving\" : undefined,\n headerProps.className,\n ]\n .filter(Boolean)\n .join(\" \");\n const headerPayload = createHeaderComponentPayload(state, column, safeIndex);\n const headerRendererBody = column.header?.renderer ? column.header.renderer(headerPayload) : null;\n const headerLeftSlots = !column.header?.renderer\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"left\")\n : [];\n const headerRightSlots = !column.header?.renderer\n ? renderCominsComponentSlots(column.header?.components, headerPayload, \"right\")\n : [];\n const hasHeaderComponents = headerLeftSlots.length > 0 || headerRightSlots.length > 0;\n\n return (\n <th\n {...headerProps}\n className={headerClassName}\n colSpan={cell.colSpan}\n data-column-drop-target={columnMoveTargetId === column.id ? \"true\" : undefined}\n data-column-moving={movingColumnId === column.id ? \"true\" : undefined}\n data-column-placeholder={isColumnPlaceholder ? \"true\" : undefined}\n data-comins-column-id={column.id}\n data-comins-column-index={safeIndex}\n data-sort-count={sortRule ? state.sortModel.length : undefined}\n data-sort-direction={sortRule?.rule.direction}\n data-sort-priority={sortRule?.priority}\n data-sortable={column.sort ? \"true\" : \"false\"}\n data-testid={`header-${column.id}`}\n aria-sort={column.sort ? getAriaSortState(state.sortModel, column.id) : undefined}\n key={`column-${column.id}`}\n onClick={(event) => {\n headerProps.onClick?.(event);\n\n if (event.defaultPrevented || !column.sort) {\n return;\n }\n\n if (consumeSuppressedSortClick(column.id)) {\n return;\n }\n\n activateHeaderSort(column, event.shiftKey);\n }}\n onKeyDown={(event) => {\n headerProps.onKeyDown?.(event);\n\n if (event.defaultPrevented || !column.sort) {\n return;\n }\n\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n activateHeaderSort(column, event.shiftKey);\n }\n }}\n onPointerDown={(event) => beginHeaderPointerInteraction(event, column)}\n rowSpan={cell.rowSpan}\n scope=\"col\"\n style={{ width: columnState?.width ?? column.width, ...headerProps.style }}\n tabIndex={column.sort ? 0 : undefined}\n >\n <span aria-hidden=\"true\" className=\"comins-column-drop-marker\" />\n <span\n className=\"comins-table__header-content\"\n data-comins-header-body=\"true\"\n data-comins-header-components={hasHeaderComponents ? \"true\" : undefined}\n data-comins-sort-indicator-visible={sortIndicatorVisible ? \"true\" : undefined}\n >\n <span className=\"comins-table__header-slot\" data-comins-header-slot=\"left\">\n {headerLeftSlots}\n </span>\n <span className=\"comins-table__header-label\">\n {column.header?.renderer ? headerRendererBody : column.label}\n </span>\n <span className=\"comins-sort-meta\" data-sort-visible={sortIndicatorVisible ? \"true\" : undefined}>\n <span\n aria-hidden=\"true\"\n className=\"comins-sort-indicator\"\n data-sort-state={sortIndicatorState}\n data-sort-visible={sortIndicatorVisible ? \"true\" : undefined}\n data-testid={`sort-indicator-${column.id}`}\n >\n <span className=\"comins-sort-icon\" />\n </span>\n {showSortPriority ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-sort-priority\"\n data-testid={`sort-priority-${column.id}`}\n >\n {sortRule.priority}\n </span>\n ) : null}\n </span>\n {showSortPriority ? (\n <span className=\"comins-table__sort-status\">\n {`Sorted ${sortRule.rule.direction === \"asc\" ? \"ascending\" : \"descending\"}, priority ${sortRule.priority} of ${state.sortModel.length}`}\n </span>\n ) : null}\n <span className=\"comins-table__header-slot\" data-comins-header-slot=\"right\">\n {headerRightSlots}\n </span>\n </span>\n <span\n aria-hidden=\"true\"\n className=\"comins-table__resize\"\n data-resizing={resizingColumnId === column.id ? \"true\" : undefined}\n data-testid={`resize-${column.id}`}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const measuredWidth = event.currentTarget.closest<HTMLTableCellElement>(\"th\")?.getBoundingClientRect().width;\n const visibleWidthSnapshot = new Map<string, number>();\n\n for (const visibleColumn of visibleColumns) {\n const headerCell = Array.from(\n headerRef.current?.querySelectorAll<HTMLTableCellElement>(\"[data-comins-column-id]\") ?? [],\n ).find((element) => element.dataset.cominsColumnId === visibleColumn.id);\n const measuredColumnWidth = headerCell?.getBoundingClientRect().width;\n const fallbackWidth = stateRef.current.columnState[visibleColumn.id]?.width ?? visibleColumn.width ?? 160;\n\n visibleWidthSnapshot.set(\n visibleColumn.id,\n measuredColumnWidth && Number.isFinite(measuredColumnWidth) ? measuredColumnWidth : fallbackWidth,\n );\n }\n\n const startWidth =\n visibleWidthSnapshot.get(column.id) ??\n (measuredWidth && Number.isFinite(measuredWidth) ? measuredWidth : (columnState?.width ?? column.width ?? 160));\n setResizingColumnId(column.id);\n const handlePointerMove = (moveEvent: PointerEvent) => {\n commitState(\n (current) => {\n let next = current;\n\n for (const [visibleColumnId, visibleColumnWidth] of visibleWidthSnapshot) {\n next = setCominsColumnWidth(next, visibleColumnId, visibleColumnWidth);\n }\n\n return setColumnWidthInsideParentGroup(\n next,\n column.id,\n Math.max(getEffectiveColumnMinWidth(column), startWidth + moveEvent.clientX - startX),\n );\n },\n { columnLayoutChanged: true },\n );\n };\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerCancel);\n window.removeEventListener(\"blur\", handlePointerCancel);\n\n if (activePointerGestureCleanupRef.current === cleanup) {\n activePointerGestureCleanupRef.current = null;\n }\n };\n const handlePointerUp = () => {\n cleanup();\n setResizingColumnId(null);\n };\n const handlePointerCancel = () => {\n cleanup();\n setResizingColumnId(null);\n };\n registerActivePointerGesture(cleanup);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerCancel);\n window.addEventListener(\"blur\", handlePointerCancel);\n }}\n >\n <span className=\"comins-table__resize-line\" />\n </span>\n </th>\n );\n };\n\n const renderColumnSizing = () => (\n <colgroup>\n {visibleColumns.map((column, index) => (\n <col key={column.id} style={{ width: columnWidths[index] }} />\n ))}\n </colgroup>\n );\n const commitPendingScrollTop = () => {\n setScrollTop((current) => {\n const next = pendingScrollTopRef.current;\n\n return Math.abs(current - next) > 0.5 ? next : current;\n });\n };\n const requestInfiniteLoadIfNeeded = (bodyViewport: HTMLDivElement) => {\n if (lazyLoad) {\n if (!onLazyLoad || lazyLoadingReasonRef.current) {\n return;\n }\n\n const remainingScroll = bodyViewport.scrollHeight - bodyViewport.scrollTop - bodyViewport.clientHeight;\n\n if (remainingScroll <= resolvedLazyLoadThreshold) {\n requestLazyLoad(\"scroll\");\n }\n\n return;\n }\n\n if (!infiniteScroll || !hasMoreRows || loadingMore || !onLoadMore) {\n return;\n }\n\n const safeThreshold = Math.max(0, infiniteScrollThreshold);\n const remainingScroll = bodyViewport.scrollHeight - bodyViewport.scrollTop - bodyViewport.clientHeight;\n\n if (remainingScroll > safeThreshold) {\n return;\n }\n\n const currentRowCount = stateRef.current.rows.length;\n\n if (lastLoadMoreRowCountRef.current === currentRowCount) {\n return;\n }\n\n lastLoadMoreRowCountRef.current = currentRowCount;\n onLoadMore();\n };\n const handleBodyScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const bodyViewport = event.currentTarget;\n\n pendingScrollTopRef.current = bodyViewport.scrollTop;\n requestInfiniteLoadIfNeeded(bodyViewport);\n\n if (scrollCommitTimeoutRef.current !== null) {\n window.clearTimeout(scrollCommitTimeoutRef.current);\n scrollCommitTimeoutRef.current = null;\n }\n\n if (scrollFrameRef.current === null) {\n scrollFrameRef.current = window.requestAnimationFrame(() => {\n scrollFrameRef.current = null;\n commitPendingScrollTop();\n });\n }\n\n let nextScrollLeft = Math.max(0, bodyViewport.scrollLeft);\n\n if (headerRef.current) {\n const headerMaxScrollLeft = Math.max(0, headerRef.current.scrollWidth - headerRef.current.clientWidth);\n const bodyMaxScrollLeft = Math.max(0, bodyViewport.scrollWidth - bodyViewport.clientWidth);\n const sharedMaxScrollLeft = Math.min(headerMaxScrollLeft, bodyMaxScrollLeft);\n nextScrollLeft = Math.min(sharedMaxScrollLeft, nextScrollLeft);\n\n if (Math.abs(bodyViewport.scrollLeft - nextScrollLeft) > 0.5) {\n bodyViewport.scrollLeft = nextScrollLeft;\n }\n\n headerRef.current.scrollLeft = nextScrollLeft;\n }\n\n if (footerRef.current) {\n footerRef.current.scrollLeft = nextScrollLeft;\n }\n };\n\n return (\n <div\n className={[\"comins-table comins-typography-base h-full w-full overflow-hidden\", densityClass, currentTheme.className, className]\n .filter(Boolean)\n .join(\" \")}\n aria-busy={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-loading={resolvedLoading || resolvedLoadingMore ? \"true\" : undefined}\n data-show-header={renderedHeaderVisible ? \"true\" : undefined}\n style={{ ...currentTheme.style, ...style }}\n >\n {renderedHeaderVisible ? (\n <div className=\"comins-table__header\" ref={headerRef}>\n <table\n className=\"comins-table__table comins-table__header-table min-w-full table-fixed\"\n style={{ width: tableWidth }}\n >\n {renderColumnSizing()}\n <thead className=\"comins-table__thead\">\n {headerRows.map((headerRow, rowIndex) => (\n <tr key={`header-row-${rowIndex}`}>\n {headerRow.map((cell, cellIndex) => renderHeaderCell(cell, cellIndex))}\n </tr>\n ))}\n </thead>\n </table>\n </div>\n ) : null}\n <div\n className=\"comins-table__body-viewport\"\n data-horizontal-overflow={hasHorizontalOverflow ? \"true\" : undefined}\n data-virtualized={virtualized ? \"true\" : undefined}\n data-testid={dataTestId}\n onScroll={handleBodyScroll}\n ref={containerRef}\n >\n <table\n className={[\n \"comins-table__table comins-table__body-table min-w-full table-fixed\",\n virtualized ? \"comins-table__body-table--virtualized\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={\n virtualized\n ? {\n transform: `translate3d(0, ${rowWindow.renderOffset}px, 0)`,\n width: tableWidth,\n }\n : { width: tableWidth }\n }\n >\n {renderColumnSizing()}\n <tbody>\n {shouldRenderSkeleton\n ? Array.from({ length: resolvedSkeletonRowCount }).map((_, skeletonIndex) => (\n <tr\n aria-hidden=\"true\"\n className=\"comins-table__tr comins-table__skeleton-row\"\n data-comins-row-parity={skeletonIndex % 2 === 0 ? \"even\" : \"odd\"}\n data-testid=\"loading-skeleton-row\"\n key={`loading-skeleton-${skeletonIndex}`}\n style={{ height: rowHeight }}\n >\n {visibleColumns.length > 0 ? (\n visibleColumns.map((column) => (\n <td\n className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\"\n data-testid={`loading-skeleton-cell-${skeletonIndex}-${column.id}`}\n key={column.id}\n style={{ height: rowHeight }}\n >\n <span className=\"comins-table__skeleton-block\" />\n </td>\n ))\n ) : (\n <td className=\"comins-table__td comins-table__skeleton-cell px-3 py-2\">\n <span className=\"comins-table__skeleton-block\" />\n </td>\n )}\n </tr>\n ))\n : null}\n {shouldRenderEmpty ? (\n <tr className=\"comins-table__tr comins-table__empty-state-row\" style={{ height: rowHeight }}>\n <td className=\"comins-table__td comins-table__empty-state-cell\" colSpan={Math.max(1, visibleColumns.length)}>\n <div data-testid=\"data-table-empty-state\" className=\"comins-table__empty-state\">\n {emptyComponent ?? \"표시할 데이터가 없습니다.\"}\n </div>\n </td>\n </tr>\n ) : null}\n {rowWindow.entries.map((entry, entryIndex) => {\n const rowRuntimeProps = resolveRowProps(rowProps, entry.row, entry.visibleIndex);\n const isRowSelected = selectedRowIdSet.has(entry.rowId);\n const isViewportEndRow = emptyFillerHeight === 0 && entryIndex === rowWindow.entries.length - 1;\n const rowCustomBackground = getRowCustomBackground(rowRuntimeProps.style);\n const rowRenderKey = virtualized ? `virtual-row-slot-${entryIndex}` : String(entry.rowId);\n\n return (\n <Fragment key={rowRenderKey}>\n {rowMoveState?.targetDataIndex === entry.dataIndex && rowMoveState.sourceRowId !== entry.rowId ? (\n <tr aria-hidden=\"true\" className=\"comins-row-move-placeholder\">\n <td colSpan={Math.max(1, visibleColumns.length)} data-testid=\"row-move-placeholder\">\n 이 위치로 이동\n </td>\n </tr>\n ) : null}\n <tr\n aria-disabled={rowRuntimeProps.disabled ? \"true\" : undefined}\n aria-selected={isRowSelected}\n className={[\n \"comins-table__tr\",\n isViewportEndRow ? \"comins-table__tr--viewport-end\" : undefined,\n isRowSelected ? \"comins-row-selected\" : undefined,\n rowRuntimeProps.className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-disabled={rowRuntimeProps.disabled ? \"true\" : undefined}\n data-comins-row-custom-background={rowCustomBackground === undefined ? undefined : \"true\"}\n data-comins-row-data-index={entry.dataIndex}\n data-comins-row-parity={entry.visibleIndex % 2 === 0 ? \"even\" : \"odd\"}\n data-row-draggable={rowRuntimeProps.draggable ? \"true\" : \"false\"}\n data-selected-row={isRowSelected ? \"true\" : undefined}\n data-testid={`row-${String(entry.rowId)}`}\n draggable={false}\n key={rowRenderKey}\n onClick={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n if (!(event as React.MouseEvent<HTMLTableRowElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled) {\n selectRowFromInteraction(event, entry);\n }\n onClickRow?.(createRowPayload(event, entry));\n }}\n onContextMenu={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n commitState((current) => selectRow(current, entry.rowId));\n lastRowAnchorRef.current = entry.rowId;\n onContextMenuRow?.(createRowPayload(event, entry));\n }}\n onDoubleClick={(event) => {\n if (rowRuntimeProps.disabled) {\n event.preventDefault();\n return;\n }\n\n onDoubleClickRow?.(createRowPayload(event, entry));\n }}\n onKeyDown={(event) => handleRowKeyDown(event, entry, rowRuntimeProps.disabled)}\n style={getResolvedRowStyle(rowHeight, rowRuntimeProps.style, rowCustomBackground)}\n tabIndex={rowRuntimeProps.disabled ? -1 : 0}\n >\n {visibleColumns.map((column, columnIndex) => {\n const rawValue = getCominsCellValue(state, entry.row, column.id);\n const address = { columnId: column.id, rowId: entry.rowId };\n const isCellInRange = cellSelection && isCominsCellInSelectedRange(state, address);\n const isCellSelected =\n cellSelection &&\n state.selection.cell?.rowId === entry.rowId &&\n state.selection.cell.columnId === column.id;\n const cellPayload = createCellComponentPayload(\n entry,\n rowRuntimeProps.disabled,\n isRowSelected,\n state.selection.rowIds.length,\n column,\n columnIndex,\n rawValue,\n );\n const cellProps = resolveRenderableCellProps(column, cellPayload);\n const cellDisabled = rowRuntimeProps.disabled || isRenderableCellDisabled(cellProps, cellPayload);\n const componentInteraction: CominsBuiltInComponentInteraction = {\n requestRowSelection: ({ event, mode }) => {\n if (cellDisabled) {\n return false;\n }\n\n if (mode === \"exclusive\") {\n commitState((current) => selectRow(current, entry.rowId));\n lastRowAnchorRef.current = entry.rowId;\n return true;\n }\n\n selectRowFromInteraction(event, entry);\n return true;\n },\n };\n const cellClassName = toClassName(getRenderableCellClassName(cellProps, cellPayload));\n const cellStyle = getRenderableCellStyle(cellProps, cellPayload);\n const hasCellComponents = Boolean(column.cell?.components?.length);\n const formattedCellValue = formatRenderableCellValue(column, rawValue, cellPayload);\n const cellComponents = column.cell?.components?.map((component) => {\n if (component.type !== \"input\") {\n return component;\n }\n\n const onValueChange = component.onValueChange;\n\n return {\n ...component,\n onValueChange: (payload) => {\n commitState((current) =>\n updateCominsRows(current, [\n {\n id: payload.row.id,\n patch: (currentRow) =>\n setCominsNestedInputValue(currentRow, payload.column.field, payload.value),\n },\n ]),\n );\n onValueChange?.(payload);\n },\n } satisfies CominsCellComponent<TData>;\n });\n const visibleCellComponents = getRenderableCominsComponents(cellComponents, cellPayload);\n const cellContent = column.cell?.renderer ? (\n column.cell.renderer(cellPayload)\n ) : hasCellComponents ? (\n renderCominsContentWithComponents(formattedCellValue, cellComponents, cellPayload, {\n interaction: componentInteraction,\n showContent: false,\n })\n ) : (\n <span className=\"comins-table__cell-value\">{formattedCellValue}</span>\n );\n const tooltip =\n typeof column.cell?.tooltip === \"function\" ? column.cell.tooltip(cellPayload) : column.cell?.tooltip;\n const treeEntry = columnIndex === 0 ? treeContext?.entriesByRowId.get(entry.rowId) : undefined;\n const renderedCellContent = treeEntry ? (\n <span\n className=\"comins-tree-cell-content\"\n style={{ \"--comins-tree-depth\": treeEntry.depth } as React.CSSProperties}\n >\n {treeEntry.hasChildren ? (\n <button\n aria-expanded={treeEntry.expanded}\n aria-label={`${treeEntry.expanded ? \"Collapse\" : \"Expand\"} ${String(entry.rowId)}`}\n className=\"comins-tree-expander\"\n data-testid={`tree-expander-${String(entry.rowId)}`}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n treeContext?.onToggle(entry.rowId);\n }}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n type=\"button\"\n >\n {treeEntry.expanded ? \"▾\" : \"▸\"}\n </button>\n ) : (\n <span aria-hidden=\"true\" className=\"comins-tree-expander-spacer\" />\n )}\n <span className=\"comins-tree-cell-value\">{cellContent}</span>\n </span>\n ) : (\n cellContent\n );\n\n return (\n <td\n aria-disabled={cellDisabled ? \"true\" : undefined}\n className={[\n \"comins-table__td px-3 py-2\",\n columnIndex === 0 ? \"comins-table__td--with-row-handle\" : undefined,\n isCellInRange ? \"comins-cell-range-selected\" : undefined,\n cellClassName,\n ]\n .filter(Boolean)\n .join(\" \")}\n\t data-disabled={cellDisabled ? \"true\" : undefined}\n\t data-comins-cell-column-id={column.id}\n\t data-comins-component-cell={visibleCellComponents.length > 0 ? \"true\" : undefined}\n data-comins-data-index={entry.dataIndex}\n data-range-selected={isCellInRange ? \"true\" : undefined}\n data-selected={isCellSelected ? \"true\" : undefined}\n data-testid={`cell-${String(entry.rowId)}-${column.id}`}\n draggable={false}\n key={column.id}\n onClick={(event) => {\n if (onClickCell) {\n event.stopPropagation();\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (rangeDragMovedRef.current) {\n rangeDragMovedRef.current = false;\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n return;\n }\n\n const anchor = cellSelection ? (state.selection.cell ?? lastCellAnchorRef.current) : null;\n\n if (event.shiftKey && anchor) {\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastCellAnchorRef.current = anchor;\n commitState((current) => {\n const nextRows =\n lastRowAnchorRef.current !== null\n ? selectRows(\n current,\n getVisibleRowIdsBetween(current, lastRowAnchorRef.current, entry.rowId),\n )\n : selectRow(current, entry.rowId);\n\n return selectCellRange(nextRows, { anchor, focus: address });\n });\n lastRowAnchorRef.current = entry.rowId;\n return;\n }\n\n if (cellSelection) {\n lastCellAnchorRef.current = address;\n }\n\n commitState((current) => {\n const nextRows = selectRow(current, entry.rowId, {\n multi: event.ctrlKey || event.metaKey,\n toggle: event.ctrlKey || event.metaKey,\n });\n\n return cellSelection ? selectCell(nextRows, address) : nextRows;\n });\n (event as React.MouseEvent<HTMLTableCellElement> & { __cominsCellSelectionHandled?: boolean })\n .__cominsCellSelectionHandled = true;\n lastRowAnchorRef.current = entry.rowId;\n onClickCell?.(createCellPayload(event, entry, column, columnIndex, rawValue));\n }}\n onContextMenu={(event) => {\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n commitState((current) => {\n const nextRows = selectRow(current, entry.rowId);\n\n return cellSelection ? selectCell(nextRows, address) : nextRows;\n });\n lastRowAnchorRef.current = entry.rowId;\n\n if (cellSelection) {\n lastCellAnchorRef.current = address;\n }\n\n if (onContextMenuCell) {\n event.stopPropagation();\n onContextMenuCell(createCellPayload(event, entry, column, columnIndex, rawValue));\n }\n }}\n onDoubleClick={(event) => {\n if (onDoubleClickCell) {\n event.stopPropagation();\n }\n\n if (cellDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n onDoubleClickCell?.(createCellPayload(event, entry, column, columnIndex, rawValue));\n }}\n onKeyDown={(event) => handleCellKeyDown(event, entry, column, columnIndex, address, cellDisabled)}\n onMouseDown={(event) => beginCellRangeDrag(event, address, cellDisabled)}\n onMouseOver={(event) => {\n if (event.buttons === 1 && !activePointerGestureCleanupRef.current) {\n updateCellRangeDrag(address);\n }\n }}\n onMouseUp={endCellRangeDrag}\n onPointerDown={(event) => beginCellRangePointerDrag(event, address, cellDisabled)}\n onPointerEnter={(event) => {\n if (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\n onPointerMove={(event) => {\n if (event.buttons === 1) {\n updateCellRangeDrag(address);\n }\n }}\n onPointerUp={endCellRangeDrag}\n style={{ height: rowHeight, ...cellStyle }}\n title={typeof tooltip === \"string\" ? tooltip : undefined}\n tabIndex={cellDisabled ? -1 : 0}\n >\n {columnIndex === 0 && rowRuntimeProps.draggable ? (\n <span\n aria-hidden=\"true\"\n className=\"comins-row-drag-handle\"\n data-testid={`row-drag-handle-${String(entry.rowId)}`}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onPointerDown={(event) =>\n beginRowHandlePointerDrag(\n event,\n entry,\n rowRuntimeProps.disabled,\n rowRuntimeProps.draggable,\n )\n }\n />\n ) : null}\n {renderedCellContent}\n </td>\n );\n })}\n </tr>\n </Fragment>\n );\n })}\n {shouldRenderInfiniteLoadingRow ? (\n <tr className=\"comins-table__tr comins-table__infinite-loading-row\" style={{ height: rowHeight }}>\n <td\n className=\"comins-table__td comins-table__infinite-loading-cell\"\n colSpan={Math.max(1, visibleColumns.length)}\n data-testid=\"data-table-infinite-loading-row\"\n >\n <span className=\"comins-table__loading-spinner\" data-testid=\"data-table-infinite-loading-spinner\" />\n <span>데이터를 불러오는 중입니다.</span>\n </td>\n </tr>\n ) : null}\n {emptyFillerHeight > 0 ? (\n <tr aria-hidden=\"true\" className=\"comins-table-empty-filler\">\n <td\n colSpan={Math.max(1, visibleColumns.length)}\n data-testid=\"table-empty-filler\"\n style={{ height: emptyFillerHeight }}\n />\n </tr>\n ) : null}\n </tbody>\n </table>\n {virtualized ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-table__body-virtual-sizer\"\n style={{ height: rowWindow.scrollHeight, width: tableWidth }}\n />\n ) : null}\n {resolvedLoading && !isEmpty ? (\n <div\n className=\"comins-table__loading-overlay\"\n data-testid=\"data-table-loading-overlay\"\n role=\"status\"\n style={scrollTop > 0 ? { transform: `translateY(${scrollTop}px)` } : undefined}\n >\n <span className=\"comins-table__loading-spinner\" data-testid=\"data-table-loading-spinner\" />\n <span>{loadingComponent ?? \"불러오는 중입니다.\"}</span>\n </div>\n ) : null}\n </div>\n {summary ? (\n <div aria-label=\"Table summary\" className=\"comins-table__summary\" ref={footerRef}>\n <table className=\"comins-table__table comins-table__summary-table min-w-full table-fixed\" style={{ width: tableWidth }}>\n {renderColumnSizing()}\n <tfoot>\n <tr\n className={[\"comins-table__summary-row\", summary.className].filter(Boolean).join(\" \")}\n style={summary.style}\n >\n {summaryCells.map((cell) => (\n <td\n className={[\"comins-table__summary-cell px-3 py-2\", cell.className].filter(Boolean).join(\" \")}\n colSpan={cell.colSpan}\n data-testid={`summary-cell-${cell.column.id}`}\n key={cell.column.id}\n style={cell.style}\n >\n {cell.value}\n </td>\n ))}\n </tr>\n </tfoot>\n </table>\n </div>\n ) : null}\n {movingHeaderLabel && columnMovePointer ? (\n <div\n aria-hidden=\"true\"\n className=\"comins-column-move-ghost\"\n data-testid=\"column-move-ghost\"\n style={{ left: columnMovePointer.x + 12, top: columnMovePointer.y + 12 }}\n >\n {movingHeaderLabel}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction CominsTreeTableInner<TData>(\n {\n data,\n defaultExpandAll = true,\n getRowId,\n hasMoreRows: _hasMoreRows,\n infiniteScroll: _infiniteScroll,\n infiniteScrollThreshold: _infiniteScrollThreshold,\n lazyLoad: _lazyLoad,\n lazyLoadBatchSize: _lazyLoadBatchSize,\n lazyLoadMode: _lazyLoadMode,\n lazyLoadThreshold: _lazyLoadThreshold,\n loadingMore: _loadingMore,\n onChangeData,\n onChangeSort,\n onChangeSortModel,\n onLazyLoad: _onLazyLoad,\n onLoadMore: _onLoadMore,\n rowProps,\n tree: _tree,\n ...props\n }: CominsTreeTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n const initialDefaultExpandAll = useRef(defaultExpandAll).current;\n const [treeSortModel, setTreeSortModel] = useState<CominsSortModel>([]);\n const sortedTree = useMemo(\n () => getSortedCominsTree(data, props.columns, treeSortModel),\n [data, props.columns, treeSortModel],\n );\n const visibleTreeRows = useMemo(\n () => flattenCominsTree(sortedTree, getRowId, { defaultExpandAll: initialDefaultExpandAll }),\n [getRowId, initialDefaultExpandAll, sortedTree],\n );\n const entriesByRowId = useMemo(\n () => new Map(visibleTreeRows.map((entry) => [entry.rowId, entry] as const)),\n [visibleTreeRows],\n );\n const treeContext = useMemo<CominsTreeRenderContext<TData>>(\n () => ({\n entriesByRowId,\n onExpand: (nodeIds) => {\n const nextData = setCominsTreeExpansion(data, nodeIds, true, getRowId, initialDefaultExpandAll);\n\n if (nextData !== data) {\n onChangeData?.([...nextData]);\n }\n },\n onFold: (nodeIds) => {\n const nextData = setCominsTreeExpansion(data, nodeIds, false, getRowId, initialDefaultExpandAll);\n\n if (nextData !== data) {\n onChangeData?.([...nextData]);\n }\n },\n onToggle: (rowId) =>\n onChangeData?.(toggleCominsTreeNode(data, rowId, getRowId, { defaultExpandAll: initialDefaultExpandAll })),\n summaryRows: getCominsTreeLeafItems(data),\n }),\n [data, entriesByRowId, getRowId, initialDefaultExpandAll, onChangeData],\n );\n const handleFlatDataChange = (nextRows: TData[]) => {\n let nextTree: readonly CominsTreeNode<TData>[] = data;\n\n nextRows.forEach((nextItem, index) => {\n const entry = visibleTreeRows[index];\n\n if (entry && entry.item !== nextItem) {\n nextTree = updateCominsTreeItem(nextTree, entry.rowId, getRowId, () => nextItem);\n }\n });\n\n if (nextTree !== data) {\n onChangeData?.([...nextTree]);\n }\n };\n const flatProps: CominsTableProps<TData> = {\n ...props,\n data: visibleTreeRows.map((entry) => entry.item),\n getRowId,\n hasMoreRows: false,\n infiniteScroll: false,\n infiniteScrollThreshold: undefined,\n lazyLoad: false,\n lazyLoadBatchSize: undefined,\n lazyLoadMode: undefined,\n lazyLoadThreshold: undefined,\n loadingMore: false,\n onChangeData: handleFlatDataChange,\n onChangeSort,\n onChangeSortModel: (nextSortModel) => {\n setTreeSortModel(nextSortModel);\n onChangeSortModel?.(nextSortModel);\n },\n onLazyLoad: undefined,\n onLoadMore: undefined,\n pagination: { pageIndex: 0, pageSize: Math.max(1, visibleTreeRows.length) },\n rowProps: { ...rowProps, draggable: false },\n tree: false,\n };\n\n return <ForwardedCominsTableInner {...flatProps} ref={ref} treeContext={treeContext} />;\n}\n\nconst ForwardedCominsTableInner = forwardRef(CominsTableInner) as <TData>(\n props: CominsTableInnerProps<TData> & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nconst ForwardedCominsTreeTableInner = forwardRef(CominsTreeTableInner) as <TData>(\n props: CominsTreeTableProps<TData> & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nfunction CominsTableAdapter<TData>(\n props: CominsTableProps<TData> | CominsTreeTableProps<TData>,\n ref: React.ForwardedRef<CominsTableRef<TData>>,\n) {\n return props.tree ? <ForwardedCominsTreeTableInner {...props} ref={ref} /> : <ForwardedCominsTableInner {...props} ref={ref} />;\n}\n\nexport const CominsTable = forwardRef(CominsTableAdapter) as <TData>(\n props: (CominsTableProps<TData> | CominsTreeTableProps<TData>) & React.RefAttributes<CominsTableRef<TData>>,\n) => React.ReactElement | null;\n\nexport const cominsTablePackage = \"comins-table\";\n"],"mappings":"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"}
|