comins-table 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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/component-renderer.tsx","../src/summary.ts","../src/tree.ts","../src/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.24.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.24.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.24.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.24.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.24.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.24.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.24.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.24.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.24.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.24.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","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 payload,\n}: {\n component: Extract<CominsCellComponentConfig<TData, TValue>, { type: \"virtual-list\" }>;\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 moreEnabled = Boolean(more && 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 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 {showOverflowControl ? (\n moreEnabled ? (\n <button\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 setExpanded(true);\n }}\n onKeyDown={stopComponentEvent}\n onMouseDown={stopComponentEvent}\n onPointerDown={stopComponentEvent}\n type=\"button\"\n >\n ...\n </button>\n ) : (\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 )\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 function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsCellComponentConfig<TData, TValue>,\n payload: CominsCellComponentPayload<TData, TValue>,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsHeaderComponentConfig<TData, TValue>,\n payload: CominsHeaderComponentPayload<TData, TValue>,\n): React.ReactNode;\nexport function renderCominsBuiltInComponent<TData, TValue>(\n component: CominsAnyComponentConfig<TData, TValue>,\n payload: CominsAnyComponentPayload<TData, TValue>,\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 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 CominsTableSummaryConfig<TData> = {\n columns: Partial<Record<string, CominsSummaryBuiltin | CominsSummaryAggregator<TData>>>;\n label?: React.ReactNode;\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, aggregate]) => {\n const column = columns.find((candidate) => candidate.id === columnId);\n\n if (!column || !aggregate) {\n return valuesByColumnId;\n }\n\n const values = rows.map((row) => getNestedFieldValue(row, column.field));\n valuesByColumnId[columnId] =\n typeof aggregate === \"function\" ? aggregate({ column, rows, values }) : getBuiltinSummaryValue(aggregate, values);\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 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): 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 === true;\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): 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, expand: node.expand !== true }));\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 { renderCominsBuiltInComponent } 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 cancelSort: boolean;\n id: string;\n kind: \"column\" | \"group\";\n movedBeforeLongPress: boolean;\n startedAt: number;\n startX: number;\n startY: number;\n timer: number;\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 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 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 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) {\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)}\n </span>\n ));\n}\n\nfunction renderCominsContentWithComponents<TData>(\n content: React.ReactNode,\n components: ReadonlyArray<CominsRenderableComponent<TData>> | undefined,\n payload: CominsRenderablePayload<TData>,\n options: { showContent?: boolean } = {},\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\");\n const rightSlots = renderCominsComponentSlots(renderableComponents, payload, \"right\");\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 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 suppressedSortColumnIdRef = useRef<string | 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 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 activateHeaderSort = (column: CominsTableRuntimeColumn<TData>) => {\n if (suppressedSortColumnIdRef.current === column.id) {\n suppressedSortColumnIdRef.current = null;\n return;\n }\n\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 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 window.clearTimeout(interaction.timer);\n }\n\n columnPointerInteractionRef.current = null;\n setMovingColumnId(null);\n setMovingGroupId(null);\n setColumnMovePointer(null);\n setColumnMoveTargetId(null);\n };\n\n const beginHeaderPointerInteraction = (\n event: React.PointerEvent<HTMLTableCellElement>,\n column: CominsTableRuntimeColumn<TData>,\n ) => {\n if (event.button !== 0) {\n return;\n }\n\n const activateColumnMove = (current: CominsColumnPointerInteraction, x: number, y: number) => {\n current.active = true;\n current.cancelSort = true;\n suppressedSortColumnIdRef.current = column.id;\n setColumnMovePointer({ x, y });\n setColumnMoveTargetId(column.id);\n setMovingGroupId(null);\n setMovingColumnId(column.id);\n };\n const interaction: CominsColumnPointerInteraction = {\n active: false,\n cancelSort: false,\n id: column.id,\n kind: \"column\",\n movedBeforeLongPress: false,\n startedAt: performance.now(),\n startX: event.clientX,\n startY: event.clientY,\n timer: window.setTimeout(() => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current.id !== column.id || current.kind !== \"column\" || current.movedBeforeLongPress) {\n return;\n }\n\n activateColumnMove(current, current.startX, current.startY);\n }, 1000),\n };\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current.id !== column.id || current.kind !== \"column\") {\n return;\n }\n\n const distance = Math.hypot(moveEvent.clientX - current.startX, moveEvent.clientY - current.startY);\n\n if (!current.active && performance.now() - current.startedAt >= 1000 && !current.movedBeforeLongPress) {\n activateColumnMove(current, moveEvent.clientX, moveEvent.clientY);\n }\n\n if (!current.active && distance > 4) {\n current.movedBeforeLongPress = true;\n current.cancelSort = true;\n suppressedSortColumnIdRef.current = column.id;\n window.clearTimeout(current.timer);\n return;\n }\n\n if (current.active) {\n moveEvent.preventDefault();\n setColumnMovePointer({ x: moveEvent.clientX, y: moveEvent.clientY });\n\n setColumnMoveTargetId(getColumnMoveTargetId(moveEvent.clientX, moveEvent.clientY));\n }\n };\n\n const handlePointerUp = (upEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n\n if (!current || current.id !== column.id || current.kind !== \"column\") {\n clearColumnPointerInteraction();\n return;\n }\n\n window.clearTimeout(current.timer);\n\n if (current.active) {\n const targetColumnId = getColumnMoveTargetId(upEvent.clientX, upEvent.clientY);\n\n if (targetColumnId) {\n const targetIndex = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === targetColumnId);\n\n if (targetIndex >= 0) {\n commitState((stateCurrent) => moveCominsColumn(stateCurrent, column.id, targetIndex), {\n columnLayoutChanged: true,\n });\n }\n }\n }\n\n if (current.cancelSort || current.active) {\n suppressedSortColumnIdRef.current = column.id;\n }\n\n clearColumnPointerInteraction();\n };\n\n clearColumnPointerInteraction();\n columnPointerInteractionRef.current = interaction;\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n };\n\n const beginGroupPointerInteraction = (\n event: React.PointerEvent<HTMLTableCellElement>,\n group: CominsTableRuntimeColumnGroup,\n ) => {\n if (event.button !== 0) {\n return;\n }\n\n const activateGroupMove = (current: CominsColumnPointerInteraction, x: number, y: number) => {\n current.active = true;\n current.cancelSort = true;\n setColumnMovePointer({ x, y });\n setColumnMoveTargetId(group.children[0] ?? null);\n setMovingColumnId(null);\n setMovingGroupId(group.id);\n };\n const interaction: CominsColumnPointerInteraction = {\n active: false,\n cancelSort: false,\n id: group.id,\n kind: \"group\",\n movedBeforeLongPress: false,\n startedAt: performance.now(),\n startX: event.clientX,\n startY: event.clientY,\n timer: window.setTimeout(() => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current.id !== group.id || current.kind !== \"group\" || current.movedBeforeLongPress) {\n return;\n }\n\n activateGroupMove(current, current.startX, current.startY);\n }, 1000),\n };\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n if (!current || current.id !== group.id || current.kind !== \"group\") {\n return;\n }\n\n const distance = Math.hypot(moveEvent.clientX - current.startX, moveEvent.clientY - current.startY);\n\n if (!current.active && performance.now() - current.startedAt >= 1000 && !current.movedBeforeLongPress) {\n activateGroupMove(current, moveEvent.clientX, moveEvent.clientY);\n }\n\n if (!current.active && distance > 4) {\n current.movedBeforeLongPress = true;\n current.cancelSort = true;\n window.clearTimeout(current.timer);\n return;\n }\n\n if (current.active) {\n moveEvent.preventDefault();\n setColumnMovePointer({ x: moveEvent.clientX, y: moveEvent.clientY });\n\n setColumnMoveTargetId(getColumnMoveTargetId(moveEvent.clientX, moveEvent.clientY));\n }\n };\n\n const handlePointerUp = (upEvent: PointerEvent) => {\n const current = columnPointerInteractionRef.current;\n\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n\n if (!current || current.id !== group.id || current.kind !== \"group\") {\n clearColumnPointerInteraction();\n return;\n }\n\n window.clearTimeout(current.timer);\n\n if (current.active) {\n const targetColumnId = getColumnMoveTargetId(upEvent.clientX, upEvent.clientY);\n\n if (targetColumnId) {\n const targetIndex = visibleColumns.findIndex((visibleColumn) => visibleColumn.id === targetColumnId);\n\n if (targetIndex >= 0) {\n commitState((stateCurrent) => moveCominsColumnGroup(stateCurrent, group.id, targetIndex), {\n columnLayoutChanged: true,\n });\n }\n }\n }\n\n clearColumnPointerInteraction();\n };\n\n clearColumnPointerInteraction();\n columnPointerInteractionRef.current = interaction;\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n };\n\n const selectRowFromClick = (event: React.MouseEvent, entry: VisibleRowEntry<TData>) => {\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-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 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-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 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 selectRowFromClick(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 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 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 className=\"comins-table__summary-row\">\n {visibleColumns.map((column, index) => (\n <td className=\"comins-table__summary-cell px-3 py-2\" data-testid={`summary-cell-${column.id}`} key={column.id}>\n {summaryValues?.[column.id] ?? (index === 0 ? summary.label : null)}\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 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 [treeSort, setTreeSort] = useState<CominsSortState | null>(null);\n const sortedTree = useMemo(() => getSortedCominsTree(data, props.columns, treeSort), [data, props.columns, treeSort]);\n const visibleTreeRows = useMemo(() => flattenCominsTree(sortedTree, getRowId), [getRowId, sortedTree]);\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 onToggle: (rowId) => onChangeData?.(toggleCominsTreeNode(data, rowId, getRowId)),\n summaryRows: getCominsTreeLeafItems(data),\n }),\n [data, entriesByRowId, getRowId, 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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"}
@@ -0,0 +1,3 @@
1
+ export { clearCominsCellRange, clearCominsSelection, getCominsSelectedCellRange, isCominsCellInSelectedRange, isCominsCellSelected, isCominsRowSelected, selectCell, selectCellRange, selectRow, } from "./core";
2
+ export type { CominsCellAddress, CominsCellRange, CominsRowSelectionOptions, CominsSelectionState, } from "./core";
3
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,SAAS,GACV,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { clearCominsCellRange as e, clearCominsSelection as t, getCominsSelectedCellRange as n, isCominsCellInSelectedRange as r, isCominsCellSelected as i, isCominsRowSelected as a, selectCell as o, selectCellRange as s, selectRow as c } from "./core.js";
2
+ export { e as clearCominsCellRange, t as clearCominsSelection, n as getCominsSelectedCellRange, r as isCominsCellInSelectedRange, i as isCominsCellSelected, a as isCominsRowSelected, o as selectCell, s as selectCellRange, c as selectRow };
@@ -0,0 +1,14 @@
1
+ import type React from "react";
2
+ import type { CominsTableRuntimeColumn } from "./core";
3
+ export type CominsSummaryBuiltin = "avg" | "count" | "max" | "min" | "sum";
4
+ export type CominsSummaryAggregator<TData> = (input: {
5
+ column: CominsTableRuntimeColumn<TData>;
6
+ rows: readonly TData[];
7
+ values: readonly unknown[];
8
+ }) => React.ReactNode;
9
+ export type CominsTableSummaryConfig<TData> = {
10
+ columns: Partial<Record<string, CominsSummaryBuiltin | CominsSummaryAggregator<TData>>>;
11
+ label?: React.ReactNode;
12
+ };
13
+ export declare function getCominsSummaryValues<TData>(rows: readonly TData[], columns: readonly CominsTableRuntimeColumn<TData>[], summary: CominsTableSummaryConfig<TData>): Record<string, React.ReactNode>;
14
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAE3E,MAAM,MAAM,uBAAuB,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;IACnD,MAAM,EAAE,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,EAAE,SAAS,KAAK,EAAE,CAAC;IACvB,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CAC5B,KAAK,KAAK,CAAC,SAAS,CAAC;AAEtB,MAAM,MAAM,wBAAwB,CAAC,KAAK,IAAI;IAC5C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACzB,CAAC;AAsCF,wBAAgB,sBAAsB,CAAC,KAAK,EAC1C,IAAI,EAAE,SAAS,KAAK,EAAE,EACtB,OAAO,EAAE,SAAS,wBAAwB,CAAC,KAAK,CAAC,EAAE,EACnD,OAAO,EAAE,wBAAwB,CAAC,KAAK,CAAC,GACvC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAcjC"}
package/dist/tree.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import type { CominsRowId } from "./core";
2
+ export type CominsTreeNode<TItem> = {
3
+ children?: readonly CominsTreeNode<TItem>[];
4
+ expand?: boolean;
5
+ item: TItem;
6
+ };
7
+ export type CominsVisibleTreeRow<TItem> = {
8
+ depth: number;
9
+ expanded: boolean;
10
+ hasChildren: boolean;
11
+ item: TItem;
12
+ path: readonly number[];
13
+ rowId: CominsRowId;
14
+ };
15
+ export declare function flattenCominsTree<TItem>(nodes: readonly CominsTreeNode<TItem>[], getRowId: (item: TItem, index: number) => CominsRowId): CominsVisibleTreeRow<TItem>[];
16
+ export declare function getCominsTreeLeafItems<TItem>(nodes: readonly CominsTreeNode<TItem>[]): TItem[];
17
+ export declare function toggleCominsTreeNode<TItem>(nodes: readonly CominsTreeNode<TItem>[], rowId: CominsRowId, getRowId: (item: TItem, index: number) => CominsRowId): CominsTreeNode<TItem>[];
18
+ export declare function updateCominsTreeItem<TItem>(nodes: readonly CominsTreeNode<TItem>[], rowId: CominsRowId, getRowId: (item: TItem, index: number) => CominsRowId, update: (item: TItem) => TItem): CominsTreeNode<TItem>[];
19
+ export declare function sortCominsTreeSiblings<TItem>(nodes: readonly CominsTreeNode<TItem>[], compare: (left: TItem, right: TItem) => number): CominsTreeNode<TItem>[];
20
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,MAAM,MAAM,cAAc,CAAC,KAAK,IAAI;IAClC,QAAQ,CAAC,EAAE,SAAS,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,KAAK,IAAI;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AA0EF,wBAAgB,iBAAiB,CAAC,KAAK,EACrC,KAAK,EAAE,SAAS,cAAc,CAAC,KAAK,CAAC,EAAE,EACvC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,GACpD,oBAAoB,CAAC,KAAK,CAAC,EAAE,CA2B/B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,CAE9F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EACxC,KAAK,EAAE,SAAS,cAAc,CAAC,KAAK,CAAC,EAAE,EACvC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,GACpD,cAAc,CAAC,KAAK,CAAC,EAAE,CAQzB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EACxC,KAAK,EAAE,SAAS,cAAc,CAAC,KAAK,CAAC,EAAE,EACvC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,EACrD,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,GAC7B,cAAc,CAAC,KAAK,CAAC,EAAE,CAQzB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAC1C,KAAK,EAAE,SAAS,cAAc,CAAC,KAAK,CAAC,EAAE,EACvC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,MAAM,GAC7C,cAAc,CAAC,KAAK,CAAC,EAAE,CAOzB"}