ods-ant 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/{AutoComplete-gOMQxLvY.cjs → AutoComplete-C9LcpBRs.cjs} +3 -3
- package/dist-lib/{AutoComplete-gOMQxLvY.cjs.map → AutoComplete-C9LcpBRs.cjs.map} +1 -1
- package/dist-lib/{AutoComplete-cpf8hCnK.js → AutoComplete-CCYcFqfs.js} +2 -2
- package/dist-lib/{AutoComplete-cpf8hCnK.js.map → AutoComplete-CCYcFqfs.js.map} +1 -1
- package/dist-lib/{DatePicker-DTVtamsX.cjs → DatePicker-CQgt-WoB.cjs} +2 -2
- package/dist-lib/{DatePicker-DTVtamsX.cjs.map → DatePicker-CQgt-WoB.cjs.map} +1 -1
- package/dist-lib/{DatePicker-BpjYibJF.js → DatePicker-LXjOxVN5.js} +87 -33
- package/dist-lib/{DatePicker-BpjYibJF.js.map → DatePicker-LXjOxVN5.js.map} +1 -1
- package/dist-lib/display/Table.cjs +10 -10
- package/dist-lib/display/Table.cjs.map +1 -1
- package/dist-lib/display/Table.js +182 -125
- package/dist-lib/display/Table.js.map +1 -1
- package/dist-lib/forms/AccessibleDatePicker.cjs +1 -1
- package/dist-lib/forms/AccessibleDatePicker.js +1 -1
- package/dist-lib/forms/AutoComplete.cjs +1 -1
- package/dist-lib/forms/AutoComplete.js +1 -1
- package/dist-lib/forms/Button.cjs +2 -2
- package/dist-lib/forms/Button.cjs.map +1 -1
- package/dist-lib/forms/Button.js +24 -48
- package/dist-lib/forms/Button.js.map +1 -1
- package/dist-lib/forms/Cascader.cjs +2 -2
- package/dist-lib/forms/Cascader.js +3 -3
- package/dist-lib/forms/ClearableAutoComplete.cjs +1 -1
- package/dist-lib/forms/ClearableAutoComplete.js +1 -1
- package/dist-lib/forms/ClearableDatePicker.cjs +1 -1
- package/dist-lib/forms/ClearableDatePicker.cjs.map +1 -1
- package/dist-lib/forms/ClearableDatePicker.js +6 -5
- package/dist-lib/forms/ClearableDatePicker.js.map +1 -1
- package/dist-lib/forms/ClearableTransfer.cjs +1 -1
- package/dist-lib/forms/ClearableTransfer.cjs.map +1 -1
- package/dist-lib/forms/ClearableTransfer.js +5 -0
- package/dist-lib/forms/ClearableTransfer.js.map +1 -1
- package/dist-lib/forms/DatePicker.cjs +1 -1
- package/dist-lib/forms/DatePicker.js +1 -1
- package/dist-lib/forms/Select.cjs +1 -1
- package/dist-lib/forms/Select.cjs.map +1 -1
- package/dist-lib/forms/Select.js +45 -43
- package/dist-lib/forms/Select.js.map +1 -1
- package/dist-lib/forms/TreeSelect.cjs +60 -1
- package/dist-lib/forms/TreeSelect.cjs.map +1 -1
- package/dist-lib/forms/TreeSelect.js +148 -36
- package/dist-lib/forms/TreeSelect.js.map +1 -1
- package/dist-lib/forms/index.cjs +1 -1
- package/dist-lib/forms/index.js +2 -2
- package/dist-lib/index.cjs +1 -1
- package/dist-lib/index.js +2 -2
- package/dist-lib/{selectStyles-C8j5Vvgp.js → selectStyles-7f37TvzD.js} +182 -151
- package/dist-lib/selectStyles-7f37TvzD.js.map +1 -0
- package/dist-lib/{selectStyles-BFeXUMpO.cjs → selectStyles-KK5-1q0t.cjs} +180 -149
- package/dist-lib/selectStyles-KK5-1q0t.cjs.map +1 -0
- package/dist-lib/types/ds/accessibility.smoke.test.d.ts +2 -0
- package/dist-lib/types/ds/accessibility.smoke.test.d.ts.map +1 -0
- package/dist-lib/types/ds/display/Table.d.ts +50 -0
- package/dist-lib/types/ds/display/Table.d.ts.map +1 -1
- package/dist-lib/types/ds/forms/Button.d.ts +2 -3
- package/dist-lib/types/ds/forms/Button.d.ts.map +1 -1
- package/dist-lib/types/ds/forms/ClearableDatePicker.d.ts +8 -4
- package/dist-lib/types/ds/forms/ClearableDatePicker.d.ts.map +1 -1
- package/dist-lib/types/ds/forms/ClearableTransfer.d.ts.map +1 -1
- package/dist-lib/types/ds/forms/DatePicker.d.ts +6 -1
- package/dist-lib/types/ds/forms/DatePicker.d.ts.map +1 -1
- package/dist-lib/types/ds/forms/Select.d.ts +4 -1
- package/dist-lib/types/ds/forms/Select.d.ts.map +1 -1
- package/dist-lib/types/ds/forms/TreeSelect.d.ts +1 -1
- package/dist-lib/types/ds/forms/TreeSelect.d.ts.map +1 -1
- package/dist-lib/types/ds/forms/selectStyles.d.ts +1 -0
- package/dist-lib/types/ds/forms/selectStyles.d.ts.map +1 -1
- package/package.json +14 -2
- package/dist-lib/selectStyles-BFeXUMpO.cjs.map +0 -1
- package/dist-lib/selectStyles-C8j5Vvgp.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.cjs","names":[],"sources":["../../src/ds/display/Table.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { Table as AntTable, type TableProps as AntTableProps } from 'antd';\nimport { Input } from 'antd';\nimport { dsSemanticTokens } from '../../theme/ontadaTheme';\nimport { Icon } from '../../utils/icons';\nimport { Pagination as DSPagination } from '../navigation/Pagination';\nimport type { DSPaginationProps } from '../navigation/Pagination';\nimport { ensureTooltipStyles, Tooltip as DSTooltip } from './Tooltip';\nimport type { DSTooltipSize } from './Tooltip';\n\nexport type DSTableStyle = 'styleA' | 'styleAEditable' | 'styleACustomizable' | 'styleAFixedHeaderFooter' | 'styleAResizable' | 'styleB';\nexport type DSTableHeaderVariant = 'default' | 'white';\nexport type DSTableFrozenColumns = 'none' | 'first' | 'last' | 'both';\nexport type DSTableColumnWidths = Record<string, number>;\n\nexport type DSTableProps<RecordType = Record<string, unknown>> = AntTableProps<RecordType> & {\n /**\n * DS table style from Figma documentation.\n * styleA: full-width, white header, thicker header divider, no container border.\n * styleAEditable: styleA base with inline editable cells for selected columns.\n * styleB: warm layout background, cool header, 1px container border with 4px radius.\n */\n dsStyle?: DSTableStyle;\n /**\n * Header background variant for styleB.\n * default: cool gray header\n * white: white header (allowed alternative in Figma docs)\n */\n dsHeaderVariant?: DSTableHeaderVariant;\n /**\n * DS responsive frozen-column mode.\n * none: no DS freezing behavior\n * first: freeze first column on small screens\n * last: freeze last column on small screens\n * both: freeze first and last columns on small screens\n */\n dsFrozenColumns?: DSTableFrozenColumns;\n /**\n * Breakpoint (px) at or below which DS frozen columns become active.\n */\n dsFrozenBreakpoint?: number;\n /**\n * Default width for DS-frozen columns when column width is not defined.\n */\n dsFrozenColumnWidth?: number;\n /**\n * Truncates cell text based on available cell width.\n */\n dsTruncateCellText?: boolean;\n /**\n * Shows DS tooltip with the full value when truncated text is hovered.\n */\n dsTruncateTooltip?: boolean;\n /**\n * Delay (seconds) before showing the truncation tooltip on hover.\n */\n dsTruncateTooltipDelay?: number;\n /**\n * DS tooltip size variant used for truncation tooltips.\n */\n dsTruncateTooltipSize?: DSTooltipSize;\n /**\n * DS tooltip title used for truncation tooltips when using normal tooltip size.\n */\n dsTruncateTooltipTitle?: string;\n /**\n * Column keys or dataIndex values that are editable when dsStyle is styleAEditable.\n */\n dsEditableColumns?: string[] | string | Record<string, boolean>;\n /**\n * Called whenever editable table data changes.\n */\n dsOnEditableDataChange?: (nextData: RecordType[]) => void;\n /**\n * When true, enables column visibility controls above the table for dsStyle=\"styleACustomizable\".\n */\n dsCustomizable?: boolean;\n /**\n * Column keys or dataIndex values that are currently visible.\n * Only used when dsStyle=\"styleACustomizable\".\n */\n dsVisibleColumns?: string[];\n /**\n * Called when user toggles column visibility.\n */\n dsOnVisibleColumnsChange?: (nextVisible: string[]) => void;\n /**\n * Scrollable body height for dsStyle=\"styleAFixedHeaderFooter\".\n */\n dsFixedBodyHeight?: number | string;\n /**\n * Enables column resizing. Automatically enabled for dsStyle=\"styleAResizable\".\n */\n dsResizableColumns?: boolean;\n /**\n * Controlled column widths by column key or dataIndex.\n */\n dsColumnWidths?: DSTableColumnWidths;\n /**\n * Called whenever a resizable column width changes.\n */\n dsOnColumnWidthsChange?: (nextWidths: DSTableColumnWidths) => void;\n /**\n * Minimum resizable column width in px.\n */\n dsResizableColumnMinWidth?: number;\n /**\n * Maximum resizable column width in px.\n */\n dsResizableColumnMaxWidth?: number;\n /**\n * Default width in px for resizable columns without an explicit width.\n */\n dsResizableDefaultColumnWidth?: number;\n};\n\nconst STYLE_ID = 'ds-table-styles';\n\nconst isTextValue = (value: unknown): value is string | number =>\n typeof value === 'string' || typeof value === 'number';\n\nconst DSTruncatedCell: React.FC<{\n value: string | number;\n withTooltip: boolean;\n tooltipDelay: number;\n tooltipSize: DSTooltipSize;\n tooltipTitle?: string;\n}> = ({ value, withTooltip, tooltipDelay, tooltipSize, tooltipTitle }) => {\n const cellRef = React.useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = React.useState(false);\n const text = String(value);\n\n const updateTruncation = React.useCallback(() => {\n const cell = cellRef.current;\n if (!cell) return;\n const nextValue = cell.scrollWidth > cell.clientWidth;\n setIsTruncated((prev) => (prev === nextValue ? prev : nextValue));\n }, []);\n\n React.useEffect(() => {\n const cell = cellRef.current;\n if (!cell) return;\n\n updateTruncation();\n\n // Styles for truncation can be injected shortly after first render.\n // Re-check on subsequent frames so measurement reflects final layout.\n const rafId = requestAnimationFrame(() => {\n updateTruncation();\n requestAnimationFrame(updateTruncation);\n });\n const timeoutId = window.setTimeout(updateTruncation, 120);\n\n const resizeObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(updateTruncation) : null;\n if (resizeObserver) {\n resizeObserver.observe(cell);\n } else if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateTruncation);\n }\n\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateTruncation);\n }\n cancelAnimationFrame(rafId);\n window.clearTimeout(timeoutId);\n };\n }, [text, updateTruncation]);\n\n const content = (\n <span\n ref={cellRef}\n className=\"ds-table-cell-truncate\"\n onMouseOverCapture={updateTruncation}\n onFocus={updateTruncation}\n >\n {text}\n </span>\n );\n\n if (!withTooltip) {\n return content;\n }\n\n return (\n <DSTooltip\n title={isTruncated ? undefined : null}\n dsSize={tooltipSize}\n dsTitle={tooltipTitle}\n dsBody={text}\n mouseEnterDelay={tooltipDelay}\n trigger=\"hover\"\n >\n {content}\n </DSTooltip>\n );\n};\n\ntype DSTableSorterTooltip = Exclude<AntTableProps['showSorterTooltip'], boolean | undefined>;\n\nfunction mergeClassNames(...names: Array<string | undefined>) {\n return names.filter(Boolean).join(' ');\n}\n\nfunction getDSSorterTooltipProps(showSorterTooltip?: AntTableProps['showSorterTooltip']): AntTableProps['showSorterTooltip'] {\n if (showSorterTooltip === false) {\n return false;\n }\n\n const { tooltip } = dsSemanticTokens;\n const provided = showSorterTooltip && typeof showSorterTooltip === 'object'\n ? showSorterTooltip as DSTableSorterTooltip\n : undefined;\n\n return {\n ...provided,\n color: provided?.color ?? tooltip.surface.background,\n arrow: provided?.arrow ?? true,\n classNames: {\n ...provided?.classNames,\n root: mergeClassNames('ds-tooltip-overlay', 'ds-tooltip-size-normal', provided?.classNames?.root, provided?.overlayClassName),\n },\n styles: {\n ...provided?.styles,\n container: {\n borderRadius: tooltip.radius,\n color: tooltip.surface.body,\n letterSpacing: 0,\n minWidth: tooltip.width.normal.min,\n maxWidth: tooltip.width.normal.max,\n padding: tooltip.padding.normal,\n ...provided?.styles?.container,\n },\n },\n };\n}\n\nfunction withDSSortIcons(\n columns: any[] | undefined,\n tableShowSorterTooltip?: AntTableProps['showSorterTooltip'],\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSSortIcons(nextColumn.children, tableShowSorterTooltip);\n }\n\n if (nextColumn.sorter) {\n const columnShowSorterTooltip = nextColumn.showSorterTooltip === undefined\n ? tableShowSorterTooltip\n : nextColumn.showSorterTooltip;\n nextColumn.showSorterTooltip = getDSSorterTooltipProps(columnShowSorterTooltip);\n }\n\n if (nextColumn.sorter && !nextColumn.sortIcon) {\n nextColumn.sortIcon = ({ sortOrder }: { sortOrder?: 'ascend' | 'descend' }) => (\n <span className=\"ds-table-sort-icon\" aria-hidden=\"true\">\n <Icon\n name={sortOrder === 'ascend' ? 'arrowThickUp' : 'arrowThickDown'}\n size={10}\n style={{ color: 'inherit' }}\n />\n </span>\n );\n }\n\n return nextColumn;\n });\n}\n\nfunction withDSFrozenColumns(\n columns: any[] | undefined,\n mode: DSTableFrozenColumns,\n defaultFrozenWidth: number\n): any[] | undefined {\n if (!columns || mode === 'none' || columns.length === 0) return columns;\n\n const freezeFirst = mode === 'first' || mode === 'both';\n const freezeLast = mode === 'last' || mode === 'both';\n const lastIndex = columns.length - 1;\n\n return columns.map((column, index) => {\n const nextColumn = { ...column };\n\n const shouldFreezeLeft = freezeFirst && index === 0;\n const shouldFreezeRight = freezeLast && index === lastIndex;\n\n if (shouldFreezeLeft) {\n nextColumn.fixed = 'left';\n if (nextColumn.width == null) {\n nextColumn.width = defaultFrozenWidth;\n }\n }\n\n if (shouldFreezeRight) {\n nextColumn.fixed = 'right';\n if (nextColumn.width == null) {\n nextColumn.width = defaultFrozenWidth;\n }\n }\n\n return nextColumn;\n });\n}\n\nfunction withDSTruncatedCells(\n columns: any[] | undefined,\n withTooltip: boolean,\n tooltipDelay: number,\n tooltipSize: DSTooltipSize,\n tooltipTitle?: string\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSTruncatedCells(nextColumn.children, withTooltip, tooltipDelay, tooltipSize, tooltipTitle);\n return nextColumn;\n }\n\n const originalRender = nextColumn.render;\n\n if (nextColumn.ellipsis == null) {\n nextColumn.ellipsis = { showTitle: false };\n } else if (nextColumn.ellipsis === true) {\n nextColumn.ellipsis = { showTitle: false };\n } else if (typeof nextColumn.ellipsis === 'object') {\n nextColumn.ellipsis = { ...nextColumn.ellipsis, showTitle: false };\n }\n\n nextColumn.render = (value: unknown, record: unknown, index: number) => {\n const rendered = originalRender ? originalRender(value, record, index) : value;\n\n if (isTextValue(rendered)) {\n return <DSTruncatedCell value={rendered} withTooltip={withTooltip} tooltipDelay={tooltipDelay} tooltipSize={tooltipSize} tooltipTitle={tooltipTitle} />;\n }\n\n if (!originalRender && isTextValue(value)) {\n return <DSTruncatedCell value={value} withTooltip={withTooltip} tooltipDelay={tooltipDelay} tooltipSize={tooltipSize} tooltipTitle={tooltipTitle} />;\n }\n\n return rendered;\n };\n\n return nextColumn;\n });\n}\n\nfunction getColumnIdentity(column: any): string | undefined {\n if (typeof column?.key === 'string') return column.key;\n if (typeof column?.dataIndex === 'string') return column.dataIndex;\n if (typeof column?.dataIndex === 'number') return String(column.dataIndex);\n return undefined;\n}\n\nfunction getNumericColumnWidth(width: unknown): number | undefined {\n if (typeof width === 'number' && Number.isFinite(width)) return width;\n if (typeof width === 'string' && width.endsWith('px')) {\n const parsedWidth = Number(width.slice(0, -2));\n return Number.isFinite(parsedWidth) ? parsedWidth : undefined;\n }\n return undefined;\n}\n\nfunction clampColumnWidth(width: number, minWidth: number, maxWidth?: number): number {\n const widthWithMin = Math.max(minWidth, Math.round(width));\n return typeof maxWidth === 'number' ? Math.min(maxWidth, widthWithMin) : widthWithMin;\n}\n\nfunction getInitialColumnWidths(\n columns: any[] | undefined,\n defaultWidth: number,\n existingWidths: DSTableColumnWidths = {},\n): DSTableColumnWidths {\n if (!columns) return existingWidths;\n\n const nextWidths = { ...existingWidths };\n\n const traverse = (cols: any[]) => {\n cols.forEach((column) => {\n if (Array.isArray(column.children) && column.children.length > 0) {\n traverse(column.children);\n return;\n }\n\n const identity = getColumnIdentity(column);\n if (!identity || nextWidths[identity] != null) return;\n\n nextWidths[identity] = getNumericColumnWidth(column.width) ?? defaultWidth;\n });\n };\n\n traverse(columns);\n return nextWidths;\n}\n\nfunction getValueByDataIndex(record: Record<string, unknown>, dataIndex: unknown): unknown {\n if (Array.isArray(dataIndex)) {\n return dataIndex.reduce<unknown>((acc, key) => {\n if (acc && typeof acc === 'object') {\n return (acc as Record<string, unknown>)[String(key)];\n }\n return undefined;\n }, record);\n }\n\n if (typeof dataIndex === 'string' || typeof dataIndex === 'number') {\n return record[String(dataIndex)];\n }\n\n return undefined;\n}\n\nfunction setValueByDataIndex(record: Record<string, unknown>, dataIndex: unknown, value: unknown): Record<string, unknown> {\n if (Array.isArray(dataIndex) && dataIndex.length > 0) {\n const next = { ...record };\n let cursor: Record<string, unknown> = next;\n\n for (let i = 0; i < dataIndex.length - 1; i += 1) {\n const key = String(dataIndex[i]);\n const current = cursor[key];\n const cloned = current && typeof current === 'object' ? { ...(current as Record<string, unknown>) } : {};\n cursor[key] = cloned;\n cursor = cloned;\n }\n\n cursor[String(dataIndex[dataIndex.length - 1])] = value;\n return next;\n }\n\n if (typeof dataIndex === 'string' || typeof dataIndex === 'number') {\n return { ...record, [String(dataIndex)]: value };\n }\n\n return record;\n}\n\nfunction withDSEditableCells(\n columns: any[] | undefined,\n editableColumnKeys: Set<string>,\n onValueChange: (rowIndex: number, dataIndex: unknown, nextValue: unknown) => void,\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSEditableCells(nextColumn.children, editableColumnKeys, onValueChange);\n return nextColumn;\n }\n\n const identity = getColumnIdentity(nextColumn);\n const isEditable = Boolean(identity && editableColumnKeys.has(identity));\n\n if (!isEditable || nextColumn.dataIndex == null) {\n return nextColumn;\n }\n\n nextColumn.render = (_value: unknown, record: Record<string, unknown>, rowIndex: number) => {\n const currentValue = getValueByDataIndex(record, nextColumn.dataIndex);\n const isNumberValue = typeof currentValue === 'number';\n const inputValue = currentValue == null ? '' : String(currentValue);\n\n return (\n <Input\n className=\"ds-table-edit-input\"\n type={isNumberValue ? 'number' : 'text'}\n size=\"small\"\n value={inputValue}\n onChange={(event) => {\n const raw = event.target.value;\n const nextValue = isNumberValue ? (raw === '' ? null : Number(raw)) : raw;\n onValueChange(rowIndex, nextColumn.dataIndex, nextValue);\n }}\n />\n );\n };\n\n return nextColumn;\n });\n}\n\nfunction withDSVisibleColumnsFilter(\n columns: any[] | undefined,\n visibleColumnKeys: Set<string>,\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSVisibleColumnsFilter(nextColumn.children, visibleColumnKeys);\n return nextColumn;\n }\n\n const identity = getColumnIdentity(nextColumn);\n if (!identity || visibleColumnKeys.has(identity)) {\n return nextColumn;\n }\n\n return null;\n }).filter((col) => col !== null);\n}\n\nconst DSColumnVisibilityControl: React.FC<{\n columns: any[];\n visibleColumns: Set<string>;\n onToggle: (colKey: string, visible: boolean) => void;\n}> = ({ columns, visibleColumns, onToggle }) => {\n const columnOptions = React.useMemo(() => {\n const opts: Array<{ key: string; label: string }> = [];\n\n const traverse = (cols: any[]) => {\n cols.forEach((col) => {\n if (Array.isArray(col.children) && col.children.length > 0) {\n traverse(col.children);\n } else {\n const identity = getColumnIdentity(col);\n const label = col.title || (typeof col.dataIndex === 'string' ? col.dataIndex : 'Column');\n if (identity) {\n opts.push({ key: identity, label: String(label) });\n }\n }\n });\n };\n\n traverse(columns);\n return opts;\n }, [columns]);\n\n return (\n <div className=\"ds-table-column-visibility-control\">\n <label className=\"ds-table-control-label\">Columns:</label>\n <div className=\"ds-table-control-checkboxes\">\n {columnOptions.map(({ key, label }) => (\n <label key={key} className=\"ds-table-control-checkbox\">\n <input\n type=\"checkbox\"\n checked={visibleColumns.has(key)}\n onChange={(e) => onToggle(key, e.target.checked)}\n />\n <span>{label}</span>\n </label>\n ))}\n </div>\n </div>\n );\n};\n\ntype DSResizableHeaderCellProps = React.ThHTMLAttributes<HTMLTableCellElement> & {\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n onResize?: (nextWidth: number) => void;\n};\n\nconst DSResizableHeaderCell: React.FC<DSResizableHeaderCellProps> = ({\n width,\n minWidth = 96,\n maxWidth,\n onResize,\n children,\n className,\n style,\n ...restProps\n}) => {\n const startWidthRef = React.useRef(0);\n const startXRef = React.useRef(0);\n\n const updateWidth = React.useCallback((nextWidth: number) => {\n if (!onResize) return;\n onResize(clampColumnWidth(nextWidth, minWidth, maxWidth));\n }, [maxWidth, minWidth, onResize]);\n\n const handleMouseDown = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!onResize || typeof document === 'undefined') return;\n\n event.preventDefault();\n event.stopPropagation();\n startXRef.current = event.clientX;\n startWidthRef.current = width ?? event.currentTarget.parentElement?.getBoundingClientRect().width ?? minWidth;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const delta = moveEvent.clientX - startXRef.current;\n updateWidth(startWidthRef.current + delta);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [minWidth, onResize, updateWidth, width]);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (!onResize || width == null) return;\n\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n\n event.preventDefault();\n event.stopPropagation();\n const direction = event.key === 'ArrowLeft' ? -1 : 1;\n updateWidth(width + direction * (event.shiftKey ? 24 : 8));\n }, [onResize, updateWidth, width]);\n\n return (\n <th\n {...restProps}\n className={mergeClassNames(className, onResize ? 'ds-table-resizable-header-cell' : undefined)}\n style={{ ...style, width }}\n >\n {children}\n {onResize ? (\n <button\n type=\"button\"\n className=\"ds-table-resize-handle\"\n aria-label=\"Resize column\"\n onClick={(event) => event.stopPropagation()}\n onMouseDown={handleMouseDown}\n onKeyDown={handleKeyDown}\n />\n ) : null}\n </th>\n );\n};\n\nfunction withDSResizableColumns(\n columns: any[] | undefined,\n widths: DSTableColumnWidths,\n onColumnResize: (columnKey: string, nextWidth: number) => void,\n minWidth: number,\n maxWidth: number | undefined,\n defaultWidth: number,\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSResizableColumns(nextColumn.children, widths, onColumnResize, minWidth, maxWidth, defaultWidth);\n return nextColumn;\n }\n\n const identity = getColumnIdentity(nextColumn);\n if (!identity) return nextColumn;\n\n const width = widths[identity] ?? getNumericColumnWidth(nextColumn.width) ?? defaultWidth;\n const originalOnHeaderCell = nextColumn.onHeaderCell;\n nextColumn.width = width;\n nextColumn.onHeaderCell = (columnInstance: unknown) => {\n const providedHeaderCellProps = originalOnHeaderCell?.(columnInstance) ?? {};\n return {\n ...providedHeaderCellProps,\n width,\n minWidth,\n maxWidth,\n onResize: (nextWidth: number) => onColumnResize(identity, nextWidth),\n className: mergeClassNames(providedHeaderCellProps.className, 'ds-table-resizable-header'),\n };\n };\n\n return nextColumn;\n });\n}\n\nfunction injectStyles() {\n if (typeof document === 'undefined') return;\n const { table, checkbox } = dsSemanticTokens;\n\n let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement('style');\n style.id = STYLE_ID;\n document.head.appendChild(style);\n }\n\n style.textContent = `\n .ds-table {\n font-family: \"Nunito\", sans-serif;\n color: ${table.text.body};\n }\n\n .ds-table .ant-table {\n font-family: \"Nunito\", sans-serif;\n color: ${table.text.body};\n background: ${table.surface.container};\n }\n\n .ds-table .ant-table-thead > tr > th {\n color: ${table.text.header} !important;\n font-weight: ${table.typography.header.fontWeight} !important;\n font-size: ${table.typography.header.fontSize} !important;\n line-height: ${table.typography.header.lineHeight} !important;\n letter-spacing: ${table.typography.header.letterSpacing} !important;\n background: ${table.surface.container} !important;\n border-bottom: ${table.border.headerDividerWidth} solid ${table.border.container} !important;\n padding: ${table.padding.normal.header} !important;\n height: ${table.rowHeight.normal.header} !important;\n vertical-align: middle !important;\n box-sizing: border-box !important;\n }\n\n .ds-table .ant-table-thead > tr > th::before {\n display: none !important;\n }\n\n .ds-table .ant-table-tbody > tr > td {\n color: ${table.text.body} !important;\n font-weight: ${table.typography.body.fontWeight} !important;\n font-size: ${table.typography.body.fontSize} !important;\n line-height: ${table.typography.body.lineHeight} !important;\n letter-spacing: ${table.typography.body.letterSpacing} !important;\n border-bottom: 1px solid ${table.border.bodyDivider} !important;\n background: transparent !important;\n padding: ${table.padding.normal.body} !important;\n height: ${table.rowHeight.normal.body} !important;\n vertical-align: middle !important;\n transition: none !important;\n box-sizing: border-box !important;\n }\n\n .ds-table .ant-table-tbody > tr:hover > td {\n background: ${table.surface.rowHover} !important;\n }\n\n .ds-table .ant-table-tbody > tr.ant-table-row-selected > td,\n .ds-table .ant-table-tbody > tr.ant-table-row-selected:hover > td {\n background: ${table.surface.rowSelected} !important;\n }\n\n .ds-table .ant-table-selection-column .ant-checkbox.ant-checkbox-indeterminate {\n border-color: ${checkbox.border.checked} !important;\n background-color: ${checkbox.background.checked} !important;\n }\n\n .ds-table .ant-table-selection-column .ant-checkbox.ant-checkbox-indeterminate::after {\n content: '' !important;\n position: absolute !important;\n left: 50% !important;\n top: 50% !important;\n margin: 0 !important;\n border: 0 !important;\n border-radius: 1px !important;\n background: ${checkbox.mark.indeterminate} !important;\n width: ${checkbox.indeterminate.sm.width}px !important;\n height: ${checkbox.indeterminate.sm.height}px !important;\n transform: translate(-50%, -50%) !important;\n opacity: 1 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort:hover {\n color: ${table.text.header} !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters,\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover {\n color: ${table.text.header} !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-sorters {\n justify-content: flex-start !important;\n gap: 6px !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-title {\n flex: none !important;\n font-weight: 600 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-sorter {\n opacity: 0 !important;\n transition: none !important;\n margin-inline-start: 0 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ds-table-sort-icon {\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 10px !important;\n height: 10px !important;\n opacity: 0 !important;\n transition: none !important;\n color: inherit !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover .ant-table-column-sorter,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort .ant-table-column-sorter {\n opacity: 1 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover .ds-table-sort-icon,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort .ds-table-sort-icon {\n opacity: 1 !important;\n }\n\n .ds-table .ant-table-column-sorter,\n .ds-table .ant-table-column-sorter-up,\n .ds-table .ant-table-column-sorter-down {\n color: ${table.text.sorterMuted} !important;\n }\n\n .ds-table .ant-table-column-sorter-up.active,\n .ds-table .ant-table-column-sorter-down.active {\n color: ${table.text.header} !important;\n }\n\n .ds-table .ant-table-pagination.ant-pagination {\n margin-top: 16px !important;\n margin-bottom: 0 !important;\n }\n\n .ds-table .ant-table-row-expand-icon-cell {\n vertical-align: middle !important;\n }\n\n .ds-table .ant-table-row-expand-icon-cell .ds-table-expand-toggle {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n margin: 0 auto !important;\n line-height: 0 !important;\n }\n\n .ds-table .ant-table-row-expand-icon-cell .ds-table-expand-toggle svg {\n display: block !important;\n width: 16px !important;\n height: 16px !important;\n }\n\n .ds-table .ds-table-cell-truncate {\n display: block !important;\n width: 100% !important;\n overflow: hidden !important;\n white-space: nowrap !important;\n text-overflow: ellipsis !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-thead > tr > th,\n .ds-table.ds-table-size-small .ant-table-tbody > tr > td {\n vertical-align: middle !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-thead > tr > th {\n font-size: ${table.typography.compactHeader.fontSize} !important;\n line-height: ${table.typography.compactHeader.lineHeight} !important;\n font-weight: ${table.typography.compactHeader.fontWeight} !important;\n letter-spacing: ${table.typography.compactHeader.letterSpacing} !important;\n height: ${table.rowHeight.compact.header} !important;\n padding: ${table.padding.compact.header} !important;\n border-bottom: ${table.border.headerDividerWidth} solid ${table.border.container} !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-tbody > tr > td {\n font-size: ${table.typography.compactBody.fontSize} !important;\n line-height: ${table.typography.compactBody.lineHeight} !important;\n font-weight: ${table.typography.compactBody.fontWeight} !important;\n letter-spacing: ${table.typography.compactBody.letterSpacing} !important;\n height: ${table.rowHeight.compact.body} !important;\n min-height: ${table.rowHeight.compact.body} !important;\n max-height: ${table.rowHeight.compact.body} !important;\n padding: ${table.padding.compact.body} !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-tbody > tr {\n height: ${table.rowHeight.compact.body} !important;\n min-height: ${table.rowHeight.compact.body} !important;\n max-height: ${table.rowHeight.compact.body} !important;\n }\n\n .ds-table.ds-table-size-small .ant-tag {\n margin-inline-end: 0 !important;\n padding: 0 4px !important;\n height: 16px !important;\n line-height: 16px !important;\n font-size: 10px !important;\n border-radius: 2px !important;\n display: inline-flex !important;\n align-items: center !important;\n }\n\n .ds-table.ds-table-size-middle .ant-table-thead > tr > th,\n .ds-table.ds-table-size-middle .ant-table-tbody > tr > td {\n padding: 0 16px !important;\n vertical-align: middle !important;\n }\n\n .ds-table.ds-table-size-middle .ant-table-thead > tr > th {\n font-size: ${table.typography.header.fontSize} !important;\n line-height: ${table.typography.header.lineHeight} !important;\n letter-spacing: ${table.typography.header.letterSpacing} !important;\n height: ${table.rowHeight.normal.header} !important;\n font-weight: ${table.typography.header.fontWeight} !important;\n }\n\n .ds-table.ds-table-size-middle .ant-table-tbody > tr > td {\n font-size: ${table.typography.body.fontSize} !important;\n line-height: ${table.typography.body.lineHeight} !important;\n letter-spacing: ${table.typography.body.letterSpacing} !important;\n height: ${table.rowHeight.normal.body} !important;\n }\n\n .ds-table.ds-table-size-large .ant-table-thead > tr > th,\n .ds-table.ds-table-size-large .ant-table-tbody > tr > td {\n padding: 0 16px !important;\n vertical-align: middle !important;\n }\n\n .ds-table.ds-table-size-large .ant-table-thead > tr > th {\n font-size: 18px !important;\n line-height: 22px !important;\n letter-spacing: -0.036px !important;\n height: 50px !important;\n font-weight: 600 !important;\n }\n\n .ds-table.ds-table-size-large .ant-table-tbody > tr > td {\n font-size: 16px !important;\n line-height: 20px !important;\n letter-spacing: -0.016px !important;\n height: 46px !important;\n }\n\n .ds-table .ant-table-thead > tr > th,\n .ds-table .ant-table-thead > tr > th:hover {\n color: ${table.text.body} !important;\n font-weight: ${table.typography.body.fontWeight} !important;\n }\n\n .ds-table .ant-table-thead > tr > th .ant-table-column-title {\n color: inherit !important;\n font-weight: inherit !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters,\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort:hover {\n color: ${table.text.header} !important;\n font-weight: ${table.typography.header.fontWeight} !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-title,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort .ant-table-column-title {\n font-weight: ${table.typography.header.fontWeight} !important;\n }\n\n .ds-table.ds-table-styleA .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleA .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleA .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAEditable .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAEditable .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleAEditable .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleACustomizable .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleACustomizable .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleACustomizable .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAResizable .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAResizable .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleAResizable .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table .ds-table-resizable-header-cell {\n position: relative !important;\n }\n\n .ds-table .ds-table-resize-handle {\n position: absolute !important;\n top: 8px !important;\n inset-inline-end: 0 !important;\n bottom: 8px !important;\n width: 12px !important;\n padding: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n background: transparent !important;\n cursor: col-resize !important;\n touch-action: none !important;\n z-index: 2 !important;\n }\n\n .ds-table .ds-table-resize-handle::after {\n content: '' !important;\n position: absolute !important;\n top: 0 !important;\n bottom: 0 !important;\n inset-inline-end: 5px !important;\n width: 1px !important;\n background: ${table.border.bodyDivider} !important;\n opacity: 0 !important;\n transition: opacity 120ms ease !important;\n }\n\n .ds-table .ds-table-resizable-header-cell:hover .ds-table-resize-handle::after,\n .ds-table .ds-table-resize-handle:focus-visible::after {\n opacity: 1 !important;\n background: ${table.text.header} !important;\n }\n\n .ds-table .ds-table-resize-handle:focus-visible {\n outline: 2px solid ${table.text.header} !important;\n outline-offset: -2px !important;\n }\n\n .ds-table.ds-table-styleAFixedHeaderFooter .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAFixedHeaderFooter .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleAFixedHeaderFooter .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table-fixed-frame {\n display: flex !important;\n flex-direction: column !important;\n width: 100% !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table-fixed-frame > .ds-table.ant-table-wrapper,\n .ds-table-fixed-frame > .ant-table-wrapper {\n flex: 1 1 auto !important;\n min-height: 0 !important;\n }\n\n .ds-table-fixed-frame .ant-table-body {\n overflow-y: auto !important;\n }\n\n .ds-table-fixed-footer {\n flex: 0 0 auto !important;\n min-height: 56px !important;\n display: flex !important;\n align-items: center !important;\n justify-content: flex-end !important;\n padding: 12px 16px !important;\n border-top: 1px solid ${table.border.bodyDivider} !important;\n background: ${table.surface.container} !important;\n box-sizing: border-box !important;\n }\n\n .ds-table-column-visibility-control {\n display: flex !important;\n align-items: center !important;\n gap: 12px !important;\n margin-bottom: 16px !important;\n padding: 12px 0 !important;\n flex-wrap: wrap !important;\n }\n\n .ds-table-control-label {\n font-weight: 600 !important;\n font-size: 14px !important;\n color: ${table.text.body} !important;\n margin: 0 !important;\n }\n\n .ds-table-control-checkboxes {\n display: flex !important;\n gap: 12px !important;\n flex-wrap: wrap !important;\n }\n\n .ds-table-control-checkbox {\n display: inline-flex !important;\n align-items: center !important;\n gap: 6px !important;\n font-size: 14px !important;\n color: ${table.text.body} !important;\n cursor: pointer !important;\n user-select: none !important;\n margin: 0 !important;\n }\n\n .ds-table-control-checkbox input[type='checkbox'] {\n width: 16px !important;\n height: 16px !important;\n cursor: pointer !important;\n margin: 0 !important;\n }\n\n .ds-table .ds-table-edit-input.ant-input,\n .ds-table .ds-table-edit-input.ant-input-affix-wrapper {\n height: 26px !important;\n min-height: 26px !important;\n width: 100% !important;\n min-width: 0 !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n border-radius: 4px !important;\n border: 1px solid ${dsSemanticTokens.input.border.default} !important;\n background: ${dsSemanticTokens.input.background.default} !important;\n color: ${dsSemanticTokens.input.text.focus} !important;\n padding: 3px 8px !important;\n font-size: 12px !important;\n line-height: 16px !important;\n }\n\n .ds-table .ds-table-edit-input.ant-input:hover,\n .ds-table .ds-table-edit-input.ant-input-affix-wrapper:hover {\n border-color: ${dsSemanticTokens.input.border.hover} !important;\n }\n\n .ds-table .ds-table-edit-input.ant-input:focus,\n .ds-table .ds-table-edit-input.ant-input-focused,\n .ds-table .ds-table-edit-input.ant-input-affix-wrapper-focused {\n border-color: ${dsSemanticTokens.input.border.focus} !important;\n box-shadow: none !important;\n outline: none !important;\n }\n\n .ds-table.ds-table-styleB {\n background: ${table.surface.layout};\n padding: 0;\n }\n\n .ds-table.ds-table-styleB .ant-table {\n background: ${table.surface.layout} !important;\n }\n\n .ds-table.ds-table-styleB .ant-table-container {\n border: 1px solid ${table.border.container} !important;\n border-radius: ${table.border.radius} !important;\n overflow: hidden !important;\n background: ${table.surface.layout} !important;\n }\n\n .ds-table.ds-table-styleB .ant-table-thead > tr > th {\n border-bottom-width: ${table.border.headerDividerWidth} !important;\n background: ${table.surface.headerDefault} !important;\n }\n\n\n .ds-table.ds-table-styleB.ds-table-header-white .ant-table-thead > tr > th {\n background: ${table.surface.headerWhite} !important;\n }\n `;\n}\n\nexport const Table: React.FC<DSTableProps> = ({\n dsStyle = 'styleA',\n dsHeaderVariant = 'default',\n dsFrozenColumns = 'none',\n dsFrozenBreakpoint = 768,\n dsFrozenColumnWidth = 180,\n dsTruncateCellText = false,\n dsTruncateTooltip = true,\n dsTruncateTooltipDelay = 0.25,\n dsTruncateTooltipSize = 'normal',\n dsTruncateTooltipTitle = 'Title Heading',\n dsEditableColumns = [],\n dsOnEditableDataChange,\n dsCustomizable = false,\n dsVisibleColumns,\n dsOnVisibleColumnsChange,\n dsFixedBodyHeight = 320,\n dsResizableColumns = false,\n dsColumnWidths,\n dsOnColumnWidthsChange,\n dsResizableColumnMinWidth = 96,\n dsResizableColumnMaxWidth,\n dsResizableDefaultColumnWidth = 180,\n size = 'middle',\n className,\n columns,\n dataSource,\n pagination,\n ...antProps\n}) => {\n const [isAtOrBelowFrozenBreakpoint, setIsAtOrBelowFrozenBreakpoint] = React.useState(false);\n const [editableData, setEditableData] = React.useState<Record<string, unknown>[]>(\n Array.isArray(dataSource) ? (dataSource as Record<string, unknown>[]) : [],\n );\n const [localVisibleColumns, setLocalVisibleColumns] = React.useState<Set<string>>(() => {\n if (Array.isArray(dsVisibleColumns)) {\n return new Set(dsVisibleColumns.map(String));\n }\n if (columns && Array.isArray(columns)) {\n return new Set(\n columns\n .map((col) => getColumnIdentity(col))\n .filter((id) => Boolean(id)) as string[],\n );\n }\n return new Set();\n });\n const [localColumnWidths, setLocalColumnWidths] = React.useState<DSTableColumnWidths>(() => (\n dsColumnWidths ?? getInitialColumnWidths(columns as any[], dsResizableDefaultColumnWidth)\n ));\n\n useEffect(() => {\n injectStyles();\n ensureTooltipStyles();\n }, []);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const onResize = () => {\n setIsAtOrBelowFrozenBreakpoint(window.innerWidth <= dsFrozenBreakpoint);\n };\n\n onResize();\n window.addEventListener('resize', onResize);\n\n return () => {\n window.removeEventListener('resize', onResize);\n };\n }, [dsFrozenBreakpoint]);\n\n useEffect(() => {\n if (dsStyle !== 'styleAEditable') return;\n setEditableData(Array.isArray(dataSource) ? (dataSource as Record<string, unknown>[]) : []);\n }, [dataSource, dsStyle]);\n\n const {\n scroll: antScroll,\n tableLayout: antTableLayout,\n showSorterTooltip: antShowSorterTooltip,\n components: antComponents,\n ...restAntProps\n } = antProps;\n const useDSFrozenColumns = dsFrozenColumns !== 'none' && isAtOrBelowFrozenBreakpoint;\n const useEditableVariant = dsStyle === 'styleAEditable';\n const useCustomizableVariant = dsStyle === 'styleACustomizable' && dsCustomizable;\n const useFixedHeaderFooterVariant = dsStyle === 'styleAFixedHeaderFooter';\n const useResizableVariant = dsStyle === 'styleAResizable' || dsResizableColumns;\n const paginationConfig = pagination && typeof pagination === 'object' ? pagination : undefined;\n const [localCurrentPage, setLocalCurrentPage] = React.useState(paginationConfig?.defaultCurrent ?? 1);\n const [localPageSize, setLocalPageSize] = React.useState(paginationConfig?.defaultPageSize ?? paginationConfig?.pageSize ?? 10);\n\n useEffect(() => {\n if (!useCustomizableVariant) return;\n if (Array.isArray(dsVisibleColumns)) {\n setLocalVisibleColumns(new Set(dsVisibleColumns.map(String)));\n }\n }, [dsVisibleColumns, useCustomizableVariant]);\n\n useEffect(() => {\n if (!useResizableVariant) return;\n\n if (dsColumnWidths) {\n setLocalColumnWidths(dsColumnWidths);\n return;\n }\n\n setLocalColumnWidths((prev) => getInitialColumnWidths(columns as any[], dsResizableDefaultColumnWidth, prev));\n }, [columns, dsColumnWidths, dsResizableDefaultColumnWidth, useResizableVariant]);\n\n const handleColumnVisibilityToggle = React.useCallback(\n (colKey: string, visible: boolean) => {\n setLocalVisibleColumns((prev) => {\n const next = new Set(prev);\n if (visible) {\n next.add(colKey);\n } else {\n next.delete(colKey);\n }\n const nextArray = Array.from(next);\n dsOnVisibleColumnsChange?.(nextArray);\n return next;\n });\n },\n [dsOnVisibleColumnsChange],\n );\n const normalizedEditableColumns = React.useMemo(() => {\n if (Array.isArray(dsEditableColumns)) {\n return dsEditableColumns.map(String);\n }\n\n if (typeof dsEditableColumns === 'string') {\n return dsEditableColumns\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n }\n\n if (dsEditableColumns && typeof dsEditableColumns === 'object') {\n return Object.entries(dsEditableColumns)\n .filter(([, enabled]) => Boolean(enabled))\n .map(([key]) => key);\n }\n\n return [] as string[];\n }, [dsEditableColumns]);\n\n const handleEditableCellChange = React.useCallback((rowIndex: number, dataIndex: unknown, nextValue: unknown) => {\n setEditableData((prev) => {\n if (!Array.isArray(prev) || !prev[rowIndex]) {\n return prev;\n }\n\n const nextRows = [...prev];\n const currentRow = nextRows[rowIndex] as Record<string, unknown>;\n nextRows[rowIndex] = setValueByDataIndex(currentRow, dataIndex, nextValue);\n dsOnEditableDataChange?.(nextRows as unknown[] as Record<string, unknown>[]);\n return nextRows;\n });\n }, [dsOnEditableDataChange]);\n\n const handleColumnResize = React.useCallback((columnKey: string, nextWidth: number) => {\n const clampedWidth = clampColumnWidth(nextWidth, dsResizableColumnMinWidth, dsResizableColumnMaxWidth);\n\n setLocalColumnWidths((prev) => {\n const next = { ...prev, [columnKey]: clampedWidth };\n dsOnColumnWidthsChange?.(next);\n return next;\n });\n }, [dsOnColumnWidthsChange, dsResizableColumnMaxWidth, dsResizableColumnMinWidth]);\n\n const columnsWithDSBehavior = React.useMemo(() => {\n const withSortIcons = withDSSortIcons(columns as any[], antShowSorterTooltip);\n const withFrozenColumns = useDSFrozenColumns\n ? withDSFrozenColumns(withSortIcons, dsFrozenColumns, dsFrozenColumnWidth)\n : withSortIcons;\n\n const withVisibilityFilter = useCustomizableVariant\n ? withDSVisibleColumnsFilter(withFrozenColumns, localVisibleColumns)\n : withFrozenColumns;\n\n const editableColumnKeys = new Set(normalizedEditableColumns);\n const withEditableColumns = useEditableVariant\n ? withDSEditableCells(withVisibilityFilter, editableColumnKeys, handleEditableCellChange)\n : withVisibilityFilter;\n\n const withResizableColumns = useResizableVariant\n ? withDSResizableColumns(\n withEditableColumns,\n localColumnWidths,\n handleColumnResize,\n dsResizableColumnMinWidth,\n dsResizableColumnMaxWidth,\n dsResizableDefaultColumnWidth,\n )\n : withEditableColumns;\n\n if (!dsTruncateCellText || useEditableVariant) {\n return withResizableColumns;\n }\n\n return withDSTruncatedCells(\n withResizableColumns,\n dsTruncateTooltip,\n dsTruncateTooltipDelay,\n dsTruncateTooltipSize,\n dsTruncateTooltipTitle\n );\n }, [\n columns,\n antShowSorterTooltip,\n dsFrozenColumnWidth,\n dsFrozenColumns,\n dsTruncateCellText,\n dsTruncateTooltip,\n dsTruncateTooltipDelay,\n dsTruncateTooltipSize,\n dsTruncateTooltipTitle,\n normalizedEditableColumns,\n handleEditableCellChange,\n useResizableVariant,\n localColumnWidths,\n handleColumnResize,\n dsResizableColumnMinWidth,\n dsResizableColumnMaxWidth,\n dsResizableDefaultColumnWidth,\n useDSFrozenColumns,\n useEditableVariant,\n localVisibleColumns,\n useCustomizableVariant,\n handleColumnVisibilityToggle,\n ]);\n\n const effectiveScroll = React.useMemo(() => {\n if (useFixedHeaderFooterVariant) {\n const scrollBase = antScroll && typeof antScroll === 'object' ? antScroll : {};\n return {\n ...scrollBase,\n y: scrollBase.y ?? dsFixedBodyHeight,\n };\n }\n\n if (useResizableVariant) {\n if (!antScroll || typeof antScroll !== 'object') {\n return { x: 'max-content' as const };\n }\n\n return {\n ...antScroll,\n x: antScroll.x ?? ('max-content' as const),\n };\n }\n\n if (!useDSFrozenColumns) {\n return antScroll;\n }\n\n if (!antScroll || typeof antScroll !== 'object') {\n return { x: 'max-content' as const };\n }\n\n return {\n ...antScroll,\n x: antScroll.x ?? ('max-content' as const),\n };\n }, [antScroll, dsFixedBodyHeight, useDSFrozenColumns, useFixedHeaderFooterVariant, useResizableVariant]);\n\n const effectiveTableLayout = (useEditableVariant || useResizableVariant) ? (antTableLayout ?? 'fixed') : antTableLayout;\n const effectiveComponents = React.useMemo(() => {\n if (!useResizableVariant) return antComponents;\n\n return {\n ...antComponents,\n header: {\n ...antComponents?.header,\n cell: DSResizableHeaderCell,\n },\n };\n }, [antComponents, useResizableVariant]);\n\n const fixedPaginationTotal = paginationConfig?.total ?? (Array.isArray(dataSource) ? dataSource.length : 0);\n const fixedCurrentPage = paginationConfig?.current ?? localCurrentPage;\n const fixedPageSize = paginationConfig?.pageSize ?? localPageSize;\n const fixedDataSource = React.useMemo(() => {\n const source = useEditableVariant ? editableData : dataSource;\n if (!useFixedHeaderFooterVariant || !Array.isArray(source)) {\n return source;\n }\n\n if (paginationConfig?.total != null && paginationConfig.total > source.length) {\n return source;\n }\n\n const start = (fixedCurrentPage - 1) * fixedPageSize;\n return source.slice(start, start + fixedPageSize);\n }, [dataSource, editableData, fixedCurrentPage, fixedPageSize, paginationConfig?.total, useEditableVariant, useFixedHeaderFooterVariant]);\n\n const fixedFooterPaginationProps: DSPaginationProps = {\n ...paginationConfig,\n current: fixedCurrentPage,\n pageSize: fixedPageSize,\n total: fixedPaginationTotal,\n showSizeChanger: paginationConfig?.showSizeChanger ?? false,\n onChange: (page, pageSize) => {\n setLocalCurrentPage(page);\n setLocalPageSize(pageSize);\n paginationConfig?.onChange?.(page, pageSize);\n },\n onShowSizeChange: (page, pageSize) => {\n setLocalCurrentPage(page);\n setLocalPageSize(pageSize);\n paginationConfig?.onShowSizeChange?.(page, pageSize);\n },\n };\n\n const dsClassName = [\n 'ds-table',\n `ds-table-${dsStyle}`,\n `ds-table-size-${size}`,\n dsHeaderVariant === 'white' ? 'ds-table-header-white' : '',\n className || '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const tableElement = (\n <AntTable\n {...restAntProps}\n columns={columnsWithDSBehavior}\n dataSource={fixedDataSource}\n pagination={useFixedHeaderFooterVariant ? false : pagination}\n scroll={effectiveScroll}\n tableLayout={effectiveTableLayout}\n components={effectiveComponents}\n size={size}\n className={dsClassName}\n showSorterTooltip={getDSSorterTooltipProps(antShowSorterTooltip)}\n />\n );\n\n if (useFixedHeaderFooterVariant) {\n return (\n <div className={`${dsClassName} ds-table-fixed-frame`}>\n {tableElement}\n <div className=\"ds-table-fixed-footer\">\n <DSPagination {...fixedFooterPaginationProps} />\n </div>\n </div>\n );\n }\n\n return useCustomizableVariant ? (\n <div className={dsClassName}>\n <DSColumnVisibilityControl\n columns={columns as any[]}\n visibleColumns={localVisibleColumns}\n onToggle={handleColumnVisibilityToggle}\n />\n {tableElement}\n </div>\n ) : (\n tableElement\n );\n};\n\nexport default Table;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Table.cjs","names":[],"sources":["../../src/ds/display/Table.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { Table as AntTable, type TableProps as AntTableProps } from 'antd';\nimport { Input } from 'antd';\nimport { dsSemanticTokens } from '../../theme/ontadaTheme';\nimport { Icon } from '../../utils/icons';\nimport { Pagination as DSPagination } from '../navigation/Pagination';\nimport type { DSPaginationProps } from '../navigation/Pagination';\nimport { ensureTooltipStyles, Tooltip as DSTooltip } from './Tooltip';\nimport type { DSTooltipSize } from './Tooltip';\n\nexport type DSTableStyle = 'styleA' | 'styleAEditable' | 'styleACustomizable' | 'styleAFixedHeaderFooter' | 'styleAResizable' | 'styleB';\nexport type DSTableHeaderVariant = 'default' | 'white';\nexport type DSTableFrozenColumns = 'none' | 'first' | 'last' | 'both';\nexport type DSTableColumnWidths = Record<string, number>;\nexport type DSTableDensity = 'comfortable' | 'compact';\n\ntype DSAutoSizeConfig = {\n minWidth: number;\n maxWidth: number;\n sampleSize: number;\n cellPadding: number;\n enabledColumnKeys?: Set<string>;\n};\n\nexport type DSTableProps<RecordType = Record<string, unknown>> = AntTableProps<RecordType> & {\n /**\n * DS table style from Figma documentation.\n * styleA: full-width, white header, thicker header divider, no container border.\n * styleAEditable: styleA base with inline editable cells for selected columns.\n * styleB: warm layout background, cool header, 1px container border with 4px radius.\n */\n dsStyle?: DSTableStyle;\n /**\n * Header background variant for styleB.\n * default: cool gray header\n * white: white header (allowed alternative in Figma docs)\n */\n dsHeaderVariant?: DSTableHeaderVariant;\n /**\n * DS responsive frozen-column mode.\n * none: no DS freezing behavior\n * first: freeze first column on small screens\n * last: freeze last column on small screens\n * both: freeze first and last columns on small screens\n */\n dsFrozenColumns?: DSTableFrozenColumns;\n /**\n * Breakpoint (px) at or below which DS frozen columns become active.\n */\n dsFrozenBreakpoint?: number;\n /**\n * Default width for DS-frozen columns when column width is not defined.\n */\n dsFrozenColumnWidth?: number;\n /**\n * Truncates cell text based on available cell width.\n */\n dsTruncateCellText?: boolean;\n /**\n * Shows DS tooltip with the full value when truncated text is hovered.\n */\n dsTruncateTooltip?: boolean;\n /**\n * Delay (seconds) before showing the truncation tooltip on hover.\n */\n dsTruncateTooltipDelay?: number;\n /**\n * DS tooltip size variant used for truncation tooltips.\n */\n dsTruncateTooltipSize?: DSTooltipSize;\n /**\n * DS tooltip title used for truncation tooltips when using normal tooltip size.\n */\n dsTruncateTooltipTitle?: string;\n /**\n * Column keys or dataIndex values that are editable when dsStyle is styleAEditable.\n */\n dsEditableColumns?: string[] | string | Record<string, boolean>;\n /**\n * Called whenever editable table data changes.\n */\n dsOnEditableDataChange?: (nextData: RecordType[]) => void;\n /**\n * When true, enables column visibility controls above the table for dsStyle=\"styleACustomizable\".\n */\n dsCustomizable?: boolean;\n /**\n * Column keys or dataIndex values that are currently visible.\n * Only used when dsStyle=\"styleACustomizable\".\n */\n dsVisibleColumns?: string[];\n /**\n * Called when user toggles column visibility.\n */\n dsOnVisibleColumnsChange?: (nextVisible: string[]) => void;\n /**\n * Scrollable body height for dsStyle=\"styleAFixedHeaderFooter\".\n */\n dsFixedBodyHeight?: number | string;\n /**\n * Enables column resizing. Automatically enabled for dsStyle=\"styleAResizable\".\n */\n dsResizableColumns?: boolean;\n /**\n * Controlled column widths by column key or dataIndex.\n */\n dsColumnWidths?: DSTableColumnWidths;\n /**\n * Called whenever a resizable column width changes.\n */\n dsOnColumnWidthsChange?: (nextWidths: DSTableColumnWidths) => void;\n /**\n * Minimum resizable column width in px.\n */\n dsResizableColumnMinWidth?: number;\n /**\n * Maximum resizable column width in px.\n */\n dsResizableColumnMaxWidth?: number;\n /**\n * Default width in px for resizable columns without an explicit width.\n */\n dsResizableDefaultColumnWidth?: number;\n /**\n * Enables responsive table behavior by default.\n * When enabled, DS ensures horizontal scrolling is available for narrow layouts.\n */\n dsResponsive?: boolean;\n /**\n * Minimum width in px used per leaf column when deriving responsive table width.\n */\n dsResponsiveMinColumnWidth?: number;\n /**\n * DS density alias aligned with Material UI table density concepts.\n * comfortable -> Ant middle, compact -> Ant small.\n */\n dsDensity?: DSTableDensity;\n /**\n * Sticky header alias aligned with Material UI table behavior.\n */\n dsStickyHeader?: boolean;\n /**\n * Optional top offset for sticky header.\n */\n dsStickyOffsetHeader?: number;\n /**\n * Material UI-style rows-per-page options for pagination controls.\n */\n dsRowsPerPageOptions?: Array<number | string>;\n /**\n * Automatically sizes columns to fit content for DS leaf columns.\n * - true: auto-size all eligible leaf columns\n * - string[] / comma-separated string: auto-size only listed column keys/dataIndex values\n * - Record<string, boolean>: per-column on/off map by key/dataIndex\n */\n dsAutoSizeColumns?: boolean | string[] | string | Record<string, boolean>;\n /**\n * Minimum column width in px when using dsAutoSizeColumns.\n */\n dsAutoSizeMinWidth?: number;\n /**\n * Maximum column width in px when using dsAutoSizeColumns.\n */\n dsAutoSizeMaxWidth?: number;\n /**\n * Number of rows sampled for auto-sizing calculations.\n */\n dsAutoSizeSampleSize?: number;\n /**\n * Horizontal padding in px added to measured text width.\n */\n dsAutoSizeCellPadding?: number;\n};\n\nconst STYLE_ID = 'ds-table-styles';\n\nconst isTextValue = (value: unknown): value is string | number =>\n typeof value === 'string' || typeof value === 'number';\n\nconst DSTruncatedCell: React.FC<{\n value: string | number;\n withTooltip: boolean;\n tooltipDelay: number;\n tooltipSize: DSTooltipSize;\n tooltipTitle?: string;\n}> = ({ value, withTooltip, tooltipDelay, tooltipSize, tooltipTitle }) => {\n const cellRef = React.useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = React.useState(false);\n const text = String(value);\n\n const updateTruncation = React.useCallback(() => {\n const cell = cellRef.current;\n if (!cell) return;\n const nextValue = cell.scrollWidth > cell.clientWidth;\n setIsTruncated((prev) => (prev === nextValue ? prev : nextValue));\n }, []);\n\n React.useEffect(() => {\n const cell = cellRef.current;\n if (!cell) return;\n\n updateTruncation();\n\n // Styles for truncation can be injected shortly after first render.\n // Re-check on subsequent frames so measurement reflects final layout.\n const rafId = requestAnimationFrame(() => {\n updateTruncation();\n requestAnimationFrame(updateTruncation);\n });\n const timeoutId = window.setTimeout(updateTruncation, 120);\n\n const resizeObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(updateTruncation) : null;\n if (resizeObserver) {\n resizeObserver.observe(cell);\n } else if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateTruncation);\n }\n\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateTruncation);\n }\n cancelAnimationFrame(rafId);\n window.clearTimeout(timeoutId);\n };\n }, [text, updateTruncation]);\n\n const content = (\n <span\n ref={cellRef}\n className=\"ds-table-cell-truncate\"\n onMouseOverCapture={updateTruncation}\n onFocus={updateTruncation}\n >\n {text}\n </span>\n );\n\n if (!withTooltip) {\n return content;\n }\n\n return (\n <DSTooltip\n title={isTruncated ? undefined : null}\n dsSize={tooltipSize}\n dsTitle={tooltipTitle}\n dsBody={text}\n mouseEnterDelay={tooltipDelay}\n trigger=\"hover\"\n >\n {content}\n </DSTooltip>\n );\n};\n\ntype DSTableSorterTooltip = Exclude<AntTableProps['showSorterTooltip'], boolean | undefined>;\n\nfunction mergeClassNames(...names: Array<string | undefined>) {\n return names.filter(Boolean).join(' ');\n}\n\nfunction getDSSorterTooltipProps(showSorterTooltip?: AntTableProps['showSorterTooltip']): AntTableProps['showSorterTooltip'] {\n if (showSorterTooltip === false) {\n return false;\n }\n\n const { tooltip } = dsSemanticTokens;\n const provided = showSorterTooltip && typeof showSorterTooltip === 'object'\n ? showSorterTooltip as DSTableSorterTooltip\n : undefined;\n\n return {\n ...provided,\n color: provided?.color ?? tooltip.surface.background,\n arrow: provided?.arrow ?? true,\n classNames: {\n ...provided?.classNames,\n root: mergeClassNames('ds-tooltip-overlay', 'ds-tooltip-size-normal', provided?.classNames?.root, provided?.overlayClassName),\n },\n styles: {\n ...provided?.styles,\n container: {\n borderRadius: tooltip.radius,\n color: tooltip.surface.body,\n letterSpacing: 0,\n minWidth: tooltip.width.normal.min,\n maxWidth: tooltip.width.normal.max,\n padding: tooltip.padding.normal,\n ...provided?.styles?.container,\n },\n },\n };\n}\n\nfunction withDSSortIcons(\n columns: any[] | undefined,\n tableShowSorterTooltip?: AntTableProps['showSorterTooltip'],\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSSortIcons(nextColumn.children, tableShowSorterTooltip);\n }\n\n if (nextColumn.sorter) {\n const columnShowSorterTooltip = nextColumn.showSorterTooltip === undefined\n ? tableShowSorterTooltip\n : nextColumn.showSorterTooltip;\n nextColumn.showSorterTooltip = getDSSorterTooltipProps(columnShowSorterTooltip);\n }\n\n if (nextColumn.sorter && !nextColumn.sortIcon) {\n nextColumn.sortIcon = ({ sortOrder }: { sortOrder?: 'ascend' | 'descend' }) => (\n <span className=\"ds-table-sort-icon\" aria-hidden=\"true\">\n <Icon\n name={sortOrder === 'ascend' ? 'arrowThickUp' : 'arrowThickDown'}\n size={10}\n style={{ color: 'inherit' }}\n />\n </span>\n );\n }\n\n return nextColumn;\n });\n}\n\nfunction withDSFrozenColumns(\n columns: any[] | undefined,\n mode: DSTableFrozenColumns,\n defaultFrozenWidth: number\n): any[] | undefined {\n if (!columns || mode === 'none' || columns.length === 0) return columns;\n\n const freezeFirst = mode === 'first' || mode === 'both';\n const freezeLast = mode === 'last' || mode === 'both';\n const lastIndex = columns.length - 1;\n\n return columns.map((column, index) => {\n const nextColumn = { ...column };\n\n const shouldFreezeLeft = freezeFirst && index === 0;\n const shouldFreezeRight = freezeLast && index === lastIndex;\n\n if (shouldFreezeLeft) {\n nextColumn.fixed = 'left';\n if (nextColumn.width == null) {\n nextColumn.width = defaultFrozenWidth;\n }\n }\n\n if (shouldFreezeRight) {\n nextColumn.fixed = 'right';\n if (nextColumn.width == null) {\n nextColumn.width = defaultFrozenWidth;\n }\n }\n\n return nextColumn;\n });\n}\n\nfunction withDSTruncatedCells(\n columns: any[] | undefined,\n withTooltip: boolean,\n tooltipDelay: number,\n tooltipSize: DSTooltipSize,\n tooltipTitle?: string\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSTruncatedCells(nextColumn.children, withTooltip, tooltipDelay, tooltipSize, tooltipTitle);\n return nextColumn;\n }\n\n const originalRender = nextColumn.render;\n\n if (nextColumn.ellipsis == null) {\n nextColumn.ellipsis = { showTitle: false };\n } else if (nextColumn.ellipsis === true) {\n nextColumn.ellipsis = { showTitle: false };\n } else if (typeof nextColumn.ellipsis === 'object') {\n nextColumn.ellipsis = { ...nextColumn.ellipsis, showTitle: false };\n }\n\n nextColumn.render = (value: unknown, record: unknown, index: number) => {\n const rendered = originalRender ? originalRender(value, record, index) : value;\n\n if (isTextValue(rendered)) {\n return <DSTruncatedCell value={rendered} withTooltip={withTooltip} tooltipDelay={tooltipDelay} tooltipSize={tooltipSize} tooltipTitle={tooltipTitle} />;\n }\n\n if (!originalRender && isTextValue(value)) {\n return <DSTruncatedCell value={value} withTooltip={withTooltip} tooltipDelay={tooltipDelay} tooltipSize={tooltipSize} tooltipTitle={tooltipTitle} />;\n }\n\n return rendered;\n };\n\n return nextColumn;\n });\n}\n\nfunction getColumnIdentity(column: any): string | undefined {\n if (typeof column?.key === 'string') return column.key;\n if (typeof column?.dataIndex === 'string') return column.dataIndex;\n if (typeof column?.dataIndex === 'number') return String(column.dataIndex);\n return undefined;\n}\n\nfunction getNumericColumnWidth(width: unknown): number | undefined {\n if (typeof width === 'number' && Number.isFinite(width)) return width;\n if (typeof width === 'string' && width.endsWith('px')) {\n const parsedWidth = Number(width.slice(0, -2));\n return Number.isFinite(parsedWidth) ? parsedWidth : undefined;\n }\n return undefined;\n}\n\nfunction clampColumnWidth(width: number, minWidth: number, maxWidth?: number): number {\n const widthWithMin = Math.max(minWidth, Math.round(width));\n return typeof maxWidth === 'number' ? Math.min(maxWidth, widthWithMin) : widthWithMin;\n}\n\nfunction getInitialColumnWidths(\n columns: any[] | undefined,\n defaultWidth: number,\n existingWidths: DSTableColumnWidths = {},\n): DSTableColumnWidths {\n if (!columns) return existingWidths;\n\n const nextWidths = { ...existingWidths };\n\n const traverse = (cols: any[]) => {\n cols.forEach((column) => {\n if (Array.isArray(column.children) && column.children.length > 0) {\n traverse(column.children);\n return;\n }\n\n const identity = getColumnIdentity(column);\n if (!identity || nextWidths[identity] != null) return;\n const explicitWidth = getNumericColumnWidth(column.width);\n if (explicitWidth != null) {\n nextWidths[identity] = explicitWidth;\n }\n });\n };\n\n traverse(columns);\n return nextWidths;\n}\n\nfunction estimateTextWidth(value: unknown): number {\n const text = value == null ? '' : String(value);\n if (!text) return 0;\n return text.length * 8;\n}\n\nfunction getColumnTitleText(title: unknown): string {\n if (typeof title === 'string' || typeof title === 'number') {\n return String(title);\n }\n return '';\n}\n\nfunction withDSAutoSizedColumns(\n columns: any[] | undefined,\n data: Array<Record<string, unknown>>,\n config: DSAutoSizeConfig,\n): any[] | undefined {\n if (!columns) return columns;\n\n const sampledRows = data.slice(0, Math.max(0, config.sampleSize));\n\n const autoSizeColumn = (column: any): any => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = nextColumn.children.map(autoSizeColumn);\n return nextColumn;\n }\n\n if (nextColumn.width != null) {\n return nextColumn;\n }\n\n const identity = getColumnIdentity(nextColumn);\n if (config.enabledColumnKeys && (!identity || !config.enabledColumnKeys.has(identity))) {\n return nextColumn;\n }\n\n const titleWidth = estimateTextWidth(getColumnTitleText(nextColumn.title));\n const contentWidth = sampledRows.reduce((maxWidth, row, rowIndex) => {\n const rawValue = getValueByDataIndex(row, nextColumn.dataIndex);\n const rendered = typeof nextColumn.render === 'function'\n ? nextColumn.render(rawValue, row, rowIndex)\n : rawValue;\n const measured = isTextValue(rendered) ? estimateTextWidth(rendered) : estimateTextWidth(rawValue);\n return Math.max(maxWidth, measured);\n }, 0);\n\n const targetWidth = Math.max(titleWidth, contentWidth) + config.cellPadding;\n nextColumn.width = clampColumnWidth(targetWidth, config.minWidth, config.maxWidth);\n return nextColumn;\n };\n\n return columns.map(autoSizeColumn);\n}\n\nfunction normalizeAutoSizeColumnsSelection(selection: DSTableProps['dsAutoSizeColumns']): Set<string> | undefined {\n if (selection === true || selection === false || selection == null) {\n return undefined;\n }\n\n if (Array.isArray(selection)) {\n return new Set(selection.map(String));\n }\n\n if (typeof selection === 'string') {\n return new Set(\n selection\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean),\n );\n }\n\n if (typeof selection === 'object') {\n return new Set(\n Object.entries(selection)\n .filter(([, enabled]) => Boolean(enabled))\n .map(([key]) => key),\n );\n }\n\n return undefined;\n}\n\nfunction getValueByDataIndex(record: Record<string, unknown>, dataIndex: unknown): unknown {\n if (Array.isArray(dataIndex)) {\n return dataIndex.reduce<unknown>((acc, key) => {\n if (acc && typeof acc === 'object') {\n return (acc as Record<string, unknown>)[String(key)];\n }\n return undefined;\n }, record);\n }\n\n if (typeof dataIndex === 'string' || typeof dataIndex === 'number') {\n return record[String(dataIndex)];\n }\n\n return undefined;\n}\n\nfunction setValueByDataIndex(record: Record<string, unknown>, dataIndex: unknown, value: unknown): Record<string, unknown> {\n if (Array.isArray(dataIndex) && dataIndex.length > 0) {\n const next = { ...record };\n let cursor: Record<string, unknown> = next;\n\n for (let i = 0; i < dataIndex.length - 1; i += 1) {\n const key = String(dataIndex[i]);\n const current = cursor[key];\n const cloned = current && typeof current === 'object' ? { ...(current as Record<string, unknown>) } : {};\n cursor[key] = cloned;\n cursor = cloned;\n }\n\n cursor[String(dataIndex[dataIndex.length - 1])] = value;\n return next;\n }\n\n if (typeof dataIndex === 'string' || typeof dataIndex === 'number') {\n return { ...record, [String(dataIndex)]: value };\n }\n\n return record;\n}\n\nfunction withDSEditableCells(\n columns: any[] | undefined,\n editableColumnKeys: Set<string>,\n onValueChange: (rowIndex: number, dataIndex: unknown, nextValue: unknown) => void,\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSEditableCells(nextColumn.children, editableColumnKeys, onValueChange);\n return nextColumn;\n }\n\n const identity = getColumnIdentity(nextColumn);\n const isEditable = Boolean(identity && editableColumnKeys.has(identity));\n\n if (!isEditable || nextColumn.dataIndex == null) {\n return nextColumn;\n }\n\n nextColumn.render = (_value: unknown, record: Record<string, unknown>, rowIndex: number) => {\n const currentValue = getValueByDataIndex(record, nextColumn.dataIndex);\n const isNumberValue = typeof currentValue === 'number';\n const inputValue = currentValue == null ? '' : String(currentValue);\n\n return (\n <Input\n className=\"ds-table-edit-input\"\n type={isNumberValue ? 'number' : 'text'}\n size=\"small\"\n value={inputValue}\n onChange={(event) => {\n const raw = event.target.value;\n const nextValue = isNumberValue ? (raw === '' ? null : Number(raw)) : raw;\n onValueChange(rowIndex, nextColumn.dataIndex, nextValue);\n }}\n />\n );\n };\n\n return nextColumn;\n });\n}\n\nfunction withDSVisibleColumnsFilter(\n columns: any[] | undefined,\n visibleColumnKeys: Set<string>,\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSVisibleColumnsFilter(nextColumn.children, visibleColumnKeys);\n return nextColumn;\n }\n\n const identity = getColumnIdentity(nextColumn);\n if (!identity || visibleColumnKeys.has(identity)) {\n return nextColumn;\n }\n\n return null;\n }).filter((col) => col !== null);\n}\n\nconst DSColumnVisibilityControl: React.FC<{\n columns: any[];\n visibleColumns: Set<string>;\n onToggle: (colKey: string, visible: boolean) => void;\n}> = ({ columns, visibleColumns, onToggle }) => {\n const columnOptions = React.useMemo(() => {\n const opts: Array<{ key: string; label: string }> = [];\n\n const traverse = (cols: any[]) => {\n cols.forEach((col) => {\n if (Array.isArray(col.children) && col.children.length > 0) {\n traverse(col.children);\n } else {\n const identity = getColumnIdentity(col);\n const label = col.title || (typeof col.dataIndex === 'string' ? col.dataIndex : 'Column');\n if (identity) {\n opts.push({ key: identity, label: String(label) });\n }\n }\n });\n };\n\n traverse(columns);\n return opts;\n }, [columns]);\n\n return (\n <div className=\"ds-table-column-visibility-control\">\n <label className=\"ds-table-control-label\">Columns:</label>\n <div className=\"ds-table-control-checkboxes\">\n {columnOptions.map(({ key, label }) => (\n <label key={key} className=\"ds-table-control-checkbox\">\n <input\n type=\"checkbox\"\n checked={visibleColumns.has(key)}\n onChange={(e) => onToggle(key, e.target.checked)}\n />\n <span>{label}</span>\n </label>\n ))}\n </div>\n </div>\n );\n};\n\ntype DSResizableHeaderCellProps = React.ThHTMLAttributes<HTMLTableCellElement> & {\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n onResize?: (nextWidth: number) => void;\n};\n\nconst DSResizableHeaderCell: React.FC<DSResizableHeaderCellProps> = ({\n width,\n minWidth = 96,\n maxWidth,\n onResize,\n children,\n className,\n style,\n ...restProps\n}) => {\n const startWidthRef = React.useRef(0);\n const startXRef = React.useRef(0);\n\n const updateWidth = React.useCallback((nextWidth: number) => {\n if (!onResize) return;\n onResize(clampColumnWidth(nextWidth, minWidth, maxWidth));\n }, [maxWidth, minWidth, onResize]);\n\n const handleMouseDown = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!onResize || typeof document === 'undefined') return;\n\n event.preventDefault();\n event.stopPropagation();\n startXRef.current = event.clientX;\n startWidthRef.current = width ?? event.currentTarget.parentElement?.getBoundingClientRect().width ?? minWidth;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const delta = moveEvent.clientX - startXRef.current;\n updateWidth(startWidthRef.current + delta);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [minWidth, onResize, updateWidth, width]);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (!onResize || width == null) return;\n\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n\n event.preventDefault();\n event.stopPropagation();\n const direction = event.key === 'ArrowLeft' ? -1 : 1;\n updateWidth(width + direction * (event.shiftKey ? 24 : 8));\n }, [onResize, updateWidth, width]);\n\n return (\n <th\n {...restProps}\n className={mergeClassNames(className, onResize ? 'ds-table-resizable-header-cell' : undefined)}\n style={{ ...style, width }}\n >\n {children}\n {onResize ? (\n <button\n type=\"button\"\n className=\"ds-table-resize-handle\"\n aria-label=\"Resize column\"\n onClick={(event) => event.stopPropagation()}\n onMouseDown={handleMouseDown}\n onKeyDown={handleKeyDown}\n />\n ) : null}\n </th>\n );\n};\n\nfunction withDSResizableColumns(\n columns: any[] | undefined,\n widths: DSTableColumnWidths,\n onColumnResize: (columnKey: string, nextWidth: number) => void,\n minWidth: number,\n maxWidth: number | undefined,\n defaultWidth: number,\n): any[] | undefined {\n if (!columns) return columns;\n\n return columns.map((column) => {\n const nextColumn = { ...column };\n\n if (Array.isArray(nextColumn.children) && nextColumn.children.length > 0) {\n nextColumn.children = withDSResizableColumns(nextColumn.children, widths, onColumnResize, minWidth, maxWidth, defaultWidth);\n return nextColumn;\n }\n\n const identity = getColumnIdentity(nextColumn);\n if (!identity) return nextColumn;\n\n const width = widths[identity] ?? getNumericColumnWidth(nextColumn.width) ?? defaultWidth;\n const originalOnHeaderCell = nextColumn.onHeaderCell;\n nextColumn.width = width;\n nextColumn.onHeaderCell = (columnInstance: unknown) => {\n const providedHeaderCellProps = originalOnHeaderCell?.(columnInstance) ?? {};\n return {\n ...providedHeaderCellProps,\n width,\n minWidth,\n maxWidth,\n onResize: (nextWidth: number) => onColumnResize(identity, nextWidth),\n className: mergeClassNames(providedHeaderCellProps.className, 'ds-table-resizable-header'),\n };\n };\n\n return nextColumn;\n });\n}\n\nfunction getResponsiveScrollWidth(columns: any[] | undefined, minColumnWidth: number): number {\n if (!columns || columns.length === 0) return minColumnWidth;\n\n const collectLeafWidths = (cols: any[]): number[] => cols.flatMap((column) => {\n if (Array.isArray(column?.children) && column.children.length > 0) {\n return collectLeafWidths(column.children);\n }\n\n const width = getNumericColumnWidth(column?.width);\n return [width ?? minColumnWidth];\n });\n\n const widths = collectLeafWidths(columns);\n if (widths.length === 0) return minColumnWidth;\n return widths.reduce((sum, width) => sum + width, 0);\n}\n\nfunction injectStyles() {\n if (typeof document === 'undefined') return;\n const { table, checkbox } = dsSemanticTokens;\n\n let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement('style');\n style.id = STYLE_ID;\n document.head.appendChild(style);\n }\n\n style.textContent = `\n .ds-table {\n font-family: \"Nunito\", sans-serif;\n color: ${table.text.body};\n }\n\n .ds-table .ant-table {\n font-family: \"Nunito\", sans-serif;\n color: ${table.text.body};\n background: ${table.surface.container};\n }\n\n .ds-table .ant-table-thead > tr > th {\n color: ${table.text.header} !important;\n font-weight: ${table.typography.header.fontWeight} !important;\n font-size: ${table.typography.header.fontSize} !important;\n line-height: ${table.typography.header.lineHeight} !important;\n letter-spacing: ${table.typography.header.letterSpacing} !important;\n background: ${table.surface.container} !important;\n border-bottom: ${table.border.headerDividerWidth} solid ${table.border.container} !important;\n padding: ${table.padding.normal.header} !important;\n height: ${table.rowHeight.normal.header} !important;\n vertical-align: middle !important;\n box-sizing: border-box !important;\n }\n\n .ds-table .ant-table-thead > tr > th::before {\n display: none !important;\n }\n\n .ds-table .ant-table-tbody > tr:not(.ant-table-measure-row) > td {\n color: ${table.text.body} !important;\n font-weight: ${table.typography.body.fontWeight} !important;\n font-size: ${table.typography.body.fontSize} !important;\n line-height: ${table.typography.body.lineHeight} !important;\n letter-spacing: ${table.typography.body.letterSpacing} !important;\n border-bottom: 1px solid ${table.border.bodyDivider} !important;\n background: transparent !important;\n padding: ${table.padding.normal.body} !important;\n height: ${table.rowHeight.normal.body} !important;\n vertical-align: middle !important;\n transition: none !important;\n box-sizing: border-box !important;\n }\n\n .ds-table .ant-table-tbody > tr:hover > td {\n background: ${table.surface.rowHover} !important;\n }\n\n .ds-table .ant-table-tbody > tr.ant-table-row-selected > td,\n .ds-table .ant-table-tbody > tr.ant-table-row-selected:hover > td {\n background: ${table.surface.rowSelected} !important;\n }\n\n .ds-table .ant-table-selection-column .ant-checkbox.ant-checkbox-indeterminate {\n border-color: ${checkbox.border.checked} !important;\n background-color: ${checkbox.background.checked} !important;\n }\n\n .ds-table .ant-table-selection-column .ant-checkbox.ant-checkbox-indeterminate::after {\n content: '' !important;\n position: absolute !important;\n left: 50% !important;\n top: 50% !important;\n margin: 0 !important;\n border: 0 !important;\n border-radius: 1px !important;\n background: ${checkbox.mark.indeterminate} !important;\n width: ${checkbox.indeterminate.sm.width}px !important;\n height: ${checkbox.indeterminate.sm.height}px !important;\n transform: translate(-50%, -50%) !important;\n opacity: 1 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort:hover {\n color: ${table.text.header} !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters,\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover {\n color: ${table.text.header} !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-sorters {\n justify-content: flex-start !important;\n gap: 6px !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-title {\n flex: none !important;\n font-weight: 600 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-sorter {\n opacity: 0 !important;\n transition: none !important;\n margin-inline-start: 0 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ds-table-sort-icon {\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 10px !important;\n height: 10px !important;\n opacity: 0 !important;\n transition: none !important;\n color: inherit !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover .ant-table-column-sorter,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort .ant-table-column-sorter {\n opacity: 1 !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover .ds-table-sort-icon,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort .ds-table-sort-icon {\n opacity: 1 !important;\n }\n\n .ds-table .ant-table-column-sorter,\n .ds-table .ant-table-column-sorter-up,\n .ds-table .ant-table-column-sorter-down {\n color: ${table.text.sorterMuted} !important;\n }\n\n .ds-table .ant-table-column-sorter-up.active,\n .ds-table .ant-table-column-sorter-down.active {\n color: ${table.text.header} !important;\n }\n\n .ds-table .ant-table-pagination.ant-pagination {\n margin-top: 16px !important;\n margin-bottom: 0 !important;\n }\n\n .ds-table .ant-table-row-expand-icon-cell {\n vertical-align: middle !important;\n }\n\n .ds-table .ant-table-row-expand-icon-cell .ds-table-expand-toggle {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n margin: 0 auto !important;\n line-height: 0 !important;\n }\n\n .ds-table .ant-table-row-expand-icon-cell .ds-table-expand-toggle svg {\n display: block !important;\n width: 16px !important;\n height: 16px !important;\n }\n\n .ds-table .ds-table-cell-truncate {\n display: block !important;\n width: 100% !important;\n overflow: hidden !important;\n white-space: nowrap !important;\n text-overflow: ellipsis !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-thead > tr > th,\n .ds-table.ds-table-size-small .ant-table-tbody > tr:not(.ant-table-measure-row) > td {\n vertical-align: middle !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-thead > tr > th {\n font-size: ${table.typography.compactHeader.fontSize} !important;\n line-height: ${table.typography.compactHeader.lineHeight} !important;\n font-weight: ${table.typography.compactHeader.fontWeight} !important;\n letter-spacing: ${table.typography.compactHeader.letterSpacing} !important;\n height: ${table.rowHeight.compact.header} !important;\n padding: ${table.padding.compact.header} !important;\n border-bottom: ${table.border.headerDividerWidth} solid ${table.border.container} !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-tbody > tr:not(.ant-table-measure-row) > td {\n font-size: ${table.typography.compactBody.fontSize} !important;\n line-height: ${table.typography.compactBody.lineHeight} !important;\n font-weight: ${table.typography.compactBody.fontWeight} !important;\n letter-spacing: ${table.typography.compactBody.letterSpacing} !important;\n height: ${table.rowHeight.compact.body} !important;\n min-height: ${table.rowHeight.compact.body} !important;\n max-height: ${table.rowHeight.compact.body} !important;\n padding: ${table.padding.compact.body} !important;\n }\n\n .ds-table.ds-table-size-small .ant-table-tbody > tr:not(.ant-table-measure-row) {\n height: ${table.rowHeight.compact.body} !important;\n min-height: ${table.rowHeight.compact.body} !important;\n max-height: ${table.rowHeight.compact.body} !important;\n }\n\n .ds-table.ds-table-size-small .ant-tag {\n margin-inline-end: 0 !important;\n padding: 0 4px !important;\n height: 16px !important;\n line-height: 16px !important;\n font-size: 10px !important;\n border-radius: 2px !important;\n display: inline-flex !important;\n align-items: center !important;\n }\n\n .ds-table.ds-table-size-middle .ant-table-thead > tr > th,\n .ds-table.ds-table-size-middle .ant-table-tbody > tr:not(.ant-table-measure-row) > td {\n padding: 0 16px !important;\n vertical-align: middle !important;\n }\n\n .ds-table.ds-table-size-middle .ant-table-thead > tr > th {\n font-size: ${table.typography.header.fontSize} !important;\n line-height: ${table.typography.header.lineHeight} !important;\n letter-spacing: ${table.typography.header.letterSpacing} !important;\n height: ${table.rowHeight.normal.header} !important;\n font-weight: ${table.typography.header.fontWeight} !important;\n }\n\n .ds-table.ds-table-size-middle .ant-table-tbody > tr:not(.ant-table-measure-row) > td {\n font-size: ${table.typography.body.fontSize} !important;\n line-height: ${table.typography.body.lineHeight} !important;\n letter-spacing: ${table.typography.body.letterSpacing} !important;\n height: ${table.rowHeight.normal.body} !important;\n }\n\n .ds-table.ds-table-size-large .ant-table-thead > tr > th,\n .ds-table.ds-table-size-large .ant-table-tbody > tr:not(.ant-table-measure-row) > td {\n padding: 0 16px !important;\n vertical-align: middle !important;\n }\n\n .ds-table.ds-table-size-large .ant-table-thead > tr > th {\n font-size: 18px !important;\n line-height: 22px !important;\n letter-spacing: -0.036px !important;\n height: 50px !important;\n font-weight: 600 !important;\n }\n\n .ds-table.ds-table-size-large .ant-table-tbody > tr:not(.ant-table-measure-row) > td {\n font-size: 16px !important;\n line-height: 20px !important;\n letter-spacing: -0.016px !important;\n height: 46px !important;\n }\n\n .ds-table .ant-table-thead > tr > th,\n .ds-table .ant-table-thead > tr > th:hover {\n color: ${table.text.body} !important;\n font-weight: ${table.typography.body.fontWeight} !important;\n }\n\n .ds-table .ant-table-thead > tr > th .ant-table-column-title {\n color: inherit !important;\n font-weight: inherit !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters,\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters:hover,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort:hover {\n color: ${table.text.header} !important;\n font-weight: ${table.typography.header.fontWeight} !important;\n }\n\n .ds-table .ant-table-thead > tr > th.ant-table-column-has-sorters .ant-table-column-title,\n .ds-table .ant-table-thead > tr > th.ant-table-column-sort .ant-table-column-title {\n font-weight: ${table.typography.header.fontWeight} !important;\n }\n\n .ds-table.ds-table-styleA .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleA .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleA .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAEditable .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAEditable .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleAEditable .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleACustomizable .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleACustomizable .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleACustomizable .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAResizable .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAResizable .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleAResizable .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table .ds-table-resizable-header-cell {\n position: relative !important;\n }\n\n .ds-table .ds-table-resize-handle {\n position: absolute !important;\n top: 8px !important;\n inset-inline-end: 0 !important;\n bottom: 8px !important;\n width: 12px !important;\n padding: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n background: transparent !important;\n cursor: col-resize !important;\n touch-action: none !important;\n z-index: 2 !important;\n }\n\n .ds-table .ds-table-resize-handle::after {\n content: '' !important;\n position: absolute !important;\n top: 0 !important;\n bottom: 0 !important;\n inset-inline-end: 5px !important;\n width: 1px !important;\n background: ${table.border.bodyDivider} !important;\n opacity: 0 !important;\n transition: opacity 120ms ease !important;\n }\n\n .ds-table .ds-table-resizable-header-cell:hover .ds-table-resize-handle::after,\n .ds-table .ds-table-resize-handle:focus-visible::after {\n opacity: 1 !important;\n background: ${table.text.header} !important;\n }\n\n .ds-table .ds-table-resize-handle:focus-visible {\n outline: 2px solid ${table.text.header} !important;\n outline-offset: -2px !important;\n }\n\n .ds-table.ds-table-styleAFixedHeaderFooter .ant-table {\n background: ${table.surface.container} !important;\n }\n\n .ds-table.ds-table-styleAFixedHeaderFooter .ant-table-thead > tr > th {\n border-bottom-width: 2px !important;\n }\n\n .ds-table.ds-table-styleAFixedHeaderFooter .ant-table-container {\n border: none !important;\n border-radius: 0 !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table-fixed-frame {\n display: flex !important;\n flex-direction: column !important;\n width: 100% !important;\n background: ${table.surface.container} !important;\n }\n\n .ds-table-fixed-frame > .ds-table.ant-table-wrapper,\n .ds-table-fixed-frame > .ant-table-wrapper {\n flex: 1 1 auto !important;\n min-height: 0 !important;\n }\n\n .ds-table-fixed-frame .ant-table-body {\n overflow-y: auto !important;\n }\n\n .ds-table-fixed-footer {\n flex: 0 0 auto !important;\n min-height: 56px !important;\n display: flex !important;\n align-items: center !important;\n justify-content: flex-end !important;\n padding: 12px 16px !important;\n border-top: 1px solid ${table.border.bodyDivider} !important;\n background: ${table.surface.container} !important;\n box-sizing: border-box !important;\n }\n\n .ds-table-column-visibility-control {\n display: flex !important;\n align-items: center !important;\n gap: 12px !important;\n margin-bottom: 16px !important;\n padding: 12px 0 !important;\n flex-wrap: wrap !important;\n }\n\n .ds-table-control-label {\n font-weight: 600 !important;\n font-size: 14px !important;\n color: ${table.text.body} !important;\n margin: 0 !important;\n }\n\n .ds-table-control-checkboxes {\n display: flex !important;\n gap: 12px !important;\n flex-wrap: wrap !important;\n }\n\n .ds-table-control-checkbox {\n display: inline-flex !important;\n align-items: center !important;\n gap: 6px !important;\n font-size: 14px !important;\n color: ${table.text.body} !important;\n cursor: pointer !important;\n user-select: none !important;\n margin: 0 !important;\n }\n\n .ds-table-control-checkbox input[type='checkbox'] {\n width: 16px !important;\n height: 16px !important;\n cursor: pointer !important;\n margin: 0 !important;\n }\n\n .ds-table .ds-table-edit-input.ant-input,\n .ds-table .ds-table-edit-input.ant-input-affix-wrapper {\n height: 26px !important;\n min-height: 26px !important;\n width: 100% !important;\n min-width: 0 !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n border-radius: 4px !important;\n border: 1px solid ${dsSemanticTokens.input.border.default} !important;\n background: ${dsSemanticTokens.input.background.default} !important;\n color: ${dsSemanticTokens.input.text.focus} !important;\n padding: 3px 8px !important;\n font-size: 12px !important;\n line-height: 16px !important;\n }\n\n .ds-table .ds-table-edit-input.ant-input:hover,\n .ds-table .ds-table-edit-input.ant-input-affix-wrapper:hover {\n border-color: ${dsSemanticTokens.input.border.hover} !important;\n }\n\n .ds-table .ds-table-edit-input.ant-input:focus,\n .ds-table .ds-table-edit-input.ant-input-focused,\n .ds-table .ds-table-edit-input.ant-input-affix-wrapper-focused {\n border-color: ${dsSemanticTokens.input.border.focus} !important;\n box-shadow: none !important;\n outline: none !important;\n }\n\n .ds-table.ds-table-styleB {\n background: ${table.surface.layout};\n padding: 0;\n }\n\n .ds-table.ds-table-styleB .ant-table {\n background: ${table.surface.layout} !important;\n }\n\n .ds-table.ds-table-styleB .ant-table-container {\n border: 1px solid ${table.border.container} !important;\n border-radius: ${table.border.radius} !important;\n overflow: hidden !important;\n background: ${table.surface.layout} !important;\n }\n\n .ds-table.ds-table-styleB .ant-table-thead > tr > th {\n border-bottom-width: ${table.border.headerDividerWidth} !important;\n background: ${table.surface.headerDefault} !important;\n }\n\n\n .ds-table.ds-table-styleB.ds-table-header-white .ant-table-thead > tr > th {\n background: ${table.surface.headerWhite} !important;\n }\n `;\n}\n\nexport const Table: React.FC<DSTableProps> = ({\n dsStyle = 'styleA',\n dsHeaderVariant = 'default',\n dsFrozenColumns = 'none',\n dsFrozenBreakpoint = 768,\n dsFrozenColumnWidth = 180,\n dsTruncateCellText = false,\n dsTruncateTooltip = true,\n dsTruncateTooltipDelay = 0.25,\n dsTruncateTooltipSize = 'normal',\n dsTruncateTooltipTitle = 'Title Heading',\n dsEditableColumns = [],\n dsOnEditableDataChange,\n dsCustomizable = false,\n dsVisibleColumns,\n dsOnVisibleColumnsChange,\n dsFixedBodyHeight = 320,\n dsResizableColumns = false,\n dsColumnWidths,\n dsOnColumnWidthsChange,\n dsResizableColumnMinWidth = 96,\n dsResizableColumnMaxWidth,\n dsResizableDefaultColumnWidth = 180,\n dsResponsive = true,\n dsResponsiveMinColumnWidth = 160,\n dsDensity = 'comfortable',\n dsStickyHeader = false,\n dsStickyOffsetHeader = 0,\n dsRowsPerPageOptions,\n dsAutoSizeColumns = false,\n dsAutoSizeMinWidth = 96,\n dsAutoSizeMaxWidth = 520,\n dsAutoSizeSampleSize = 50,\n dsAutoSizeCellPadding = 32,\n size,\n className,\n columns,\n dataSource,\n pagination,\n ...antProps\n}) => {\n const [isAtOrBelowFrozenBreakpoint, setIsAtOrBelowFrozenBreakpoint] = React.useState(false);\n const [editableData, setEditableData] = React.useState<Record<string, unknown>[]>(\n Array.isArray(dataSource) ? (dataSource as Record<string, unknown>[]) : [],\n );\n const [localVisibleColumns, setLocalVisibleColumns] = React.useState<Set<string>>(() => {\n if (Array.isArray(dsVisibleColumns)) {\n return new Set(dsVisibleColumns.map(String));\n }\n if (columns && Array.isArray(columns)) {\n return new Set(\n columns\n .map((col) => getColumnIdentity(col))\n .filter((id) => Boolean(id)) as string[],\n );\n }\n return new Set();\n });\n const [localColumnWidths, setLocalColumnWidths] = React.useState<DSTableColumnWidths>(() => (\n dsColumnWidths ?? getInitialColumnWidths(columns as any[], dsResizableDefaultColumnWidth)\n ));\n\n useEffect(() => {\n injectStyles();\n ensureTooltipStyles();\n }, []);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const onResize = () => {\n setIsAtOrBelowFrozenBreakpoint(window.innerWidth <= dsFrozenBreakpoint);\n };\n\n onResize();\n window.addEventListener('resize', onResize);\n\n return () => {\n window.removeEventListener('resize', onResize);\n };\n }, [dsFrozenBreakpoint]);\n\n useEffect(() => {\n if (dsStyle !== 'styleAEditable') return;\n setEditableData(Array.isArray(dataSource) ? (dataSource as Record<string, unknown>[]) : []);\n }, [dataSource, dsStyle]);\n\n const {\n scroll: antScroll,\n tableLayout: antTableLayout,\n showSorterTooltip: antShowSorterTooltip,\n components: antComponents,\n sticky: antSticky,\n ...restAntProps\n } = antProps;\n const useDSFrozenColumns = dsFrozenColumns !== 'none' && isAtOrBelowFrozenBreakpoint;\n const useEditableVariant = dsStyle === 'styleAEditable';\n const useCustomizableVariant = dsStyle === 'styleACustomizable' && dsCustomizable;\n const useFixedHeaderFooterVariant = dsStyle === 'styleAFixedHeaderFooter';\n const useResizableVariant = dsStyle === 'styleAResizable' || dsResizableColumns;\n const paginationConfig = pagination && typeof pagination === 'object' ? pagination : undefined;\n const resolvedPaginationConfig = React.useMemo(() => {\n if (!paginationConfig) return paginationConfig;\n if (!dsRowsPerPageOptions || dsRowsPerPageOptions.length === 0) return paginationConfig;\n\n return {\n ...paginationConfig,\n pageSizeOptions: paginationConfig.pageSizeOptions ?? dsRowsPerPageOptions,\n showSizeChanger: paginationConfig.showSizeChanger ?? true,\n };\n }, [dsRowsPerPageOptions, paginationConfig]);\n\n const effectiveSize = size ?? (dsDensity === 'compact' ? 'small' : 'middle');\n const [localCurrentPage, setLocalCurrentPage] = React.useState(paginationConfig?.defaultCurrent ?? 1);\n const [localPageSize, setLocalPageSize] = React.useState(paginationConfig?.defaultPageSize ?? paginationConfig?.pageSize ?? 10);\n\n useEffect(() => {\n if (!useCustomizableVariant) return;\n if (Array.isArray(dsVisibleColumns)) {\n setLocalVisibleColumns(new Set(dsVisibleColumns.map(String)));\n }\n }, [dsVisibleColumns, useCustomizableVariant]);\n\n useEffect(() => {\n if (!useResizableVariant) return;\n\n if (dsColumnWidths) {\n setLocalColumnWidths(dsColumnWidths);\n return;\n }\n\n setLocalColumnWidths((prev) => getInitialColumnWidths(columns as any[], dsResizableDefaultColumnWidth, prev));\n }, [columns, dsColumnWidths, dsResizableDefaultColumnWidth, useResizableVariant]);\n\n const handleColumnVisibilityToggle = React.useCallback(\n (colKey: string, visible: boolean) => {\n setLocalVisibleColumns((prev) => {\n const next = new Set(prev);\n if (visible) {\n next.add(colKey);\n } else {\n next.delete(colKey);\n }\n const nextArray = Array.from(next);\n dsOnVisibleColumnsChange?.(nextArray);\n return next;\n });\n },\n [dsOnVisibleColumnsChange],\n );\n const normalizedEditableColumns = React.useMemo(() => {\n if (Array.isArray(dsEditableColumns)) {\n return dsEditableColumns.map(String);\n }\n\n if (typeof dsEditableColumns === 'string') {\n return dsEditableColumns\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n }\n\n if (dsEditableColumns && typeof dsEditableColumns === 'object') {\n return Object.entries(dsEditableColumns)\n .filter(([, enabled]) => Boolean(enabled))\n .map(([key]) => key);\n }\n\n return [] as string[];\n }, [dsEditableColumns]);\n\n const handleEditableCellChange = React.useCallback((rowIndex: number, dataIndex: unknown, nextValue: unknown) => {\n setEditableData((prev) => {\n if (!Array.isArray(prev) || !prev[rowIndex]) {\n return prev;\n }\n\n const nextRows = [...prev];\n const currentRow = nextRows[rowIndex] as Record<string, unknown>;\n nextRows[rowIndex] = setValueByDataIndex(currentRow, dataIndex, nextValue);\n dsOnEditableDataChange?.(nextRows as unknown[] as Record<string, unknown>[]);\n return nextRows;\n });\n }, [dsOnEditableDataChange]);\n\n const handleColumnResize = React.useCallback((columnKey: string, nextWidth: number) => {\n const clampedWidth = clampColumnWidth(nextWidth, dsResizableColumnMinWidth, dsResizableColumnMaxWidth);\n\n setLocalColumnWidths((prev) => {\n const next = { ...prev, [columnKey]: clampedWidth };\n dsOnColumnWidthsChange?.(next);\n return next;\n });\n }, [dsOnColumnWidthsChange, dsResizableColumnMaxWidth, dsResizableColumnMinWidth]);\n\n const columnsWithDSBehavior = React.useMemo(() => {\n const withSortIcons = withDSSortIcons(columns as any[], antShowSorterTooltip);\n const withFrozenColumns = useDSFrozenColumns\n ? withDSFrozenColumns(withSortIcons, dsFrozenColumns, dsFrozenColumnWidth)\n : withSortIcons;\n\n const withVisibilityFilter = useCustomizableVariant\n ? withDSVisibleColumnsFilter(withFrozenColumns, localVisibleColumns)\n : withFrozenColumns;\n\n const editableColumnKeys = new Set(normalizedEditableColumns);\n const withEditableColumns = useEditableVariant\n ? withDSEditableCells(withVisibilityFilter, editableColumnKeys, handleEditableCellChange)\n : withVisibilityFilter;\n\n const autoSizeSource = useEditableVariant\n ? editableData\n : (Array.isArray(dataSource) ? (dataSource as Array<Record<string, unknown>>) : []);\n\n const enabledAutoSizeColumns = normalizeAutoSizeColumnsSelection(dsAutoSizeColumns);\n const useAutoSizeColumns = dsAutoSizeColumns === true || Boolean(enabledAutoSizeColumns?.size);\n\n const withAutoSizedColumns = useAutoSizeColumns\n ? withDSAutoSizedColumns(withEditableColumns, autoSizeSource, {\n minWidth: dsAutoSizeMinWidth,\n maxWidth: dsAutoSizeMaxWidth,\n sampleSize: dsAutoSizeSampleSize,\n cellPadding: dsAutoSizeCellPadding,\n enabledColumnKeys: enabledAutoSizeColumns,\n })\n : withEditableColumns;\n\n const withResizableColumns = useResizableVariant\n ? withDSResizableColumns(\n withAutoSizedColumns,\n localColumnWidths,\n handleColumnResize,\n dsResizableColumnMinWidth,\n dsResizableColumnMaxWidth,\n dsResizableDefaultColumnWidth,\n )\n : withAutoSizedColumns;\n\n if (!dsTruncateCellText || useEditableVariant) {\n return withResizableColumns;\n }\n\n return withDSTruncatedCells(\n withResizableColumns,\n dsTruncateTooltip,\n dsTruncateTooltipDelay,\n dsTruncateTooltipSize,\n dsTruncateTooltipTitle\n );\n }, [\n columns,\n antShowSorterTooltip,\n dsFrozenColumnWidth,\n dsFrozenColumns,\n dsTruncateCellText,\n dsTruncateTooltip,\n dsTruncateTooltipDelay,\n dsTruncateTooltipSize,\n dsTruncateTooltipTitle,\n normalizedEditableColumns,\n handleEditableCellChange,\n useResizableVariant,\n localColumnWidths,\n handleColumnResize,\n dsResizableColumnMinWidth,\n dsResizableColumnMaxWidth,\n dsResizableDefaultColumnWidth,\n dsAutoSizeColumns,\n dsAutoSizeMinWidth,\n dsAutoSizeMaxWidth,\n dsAutoSizeSampleSize,\n dsAutoSizeCellPadding,\n useDSFrozenColumns,\n useEditableVariant,\n editableData,\n dataSource,\n localVisibleColumns,\n useCustomizableVariant,\n handleColumnVisibilityToggle,\n ]);\n\n const responsiveScrollX = React.useMemo(\n () => getResponsiveScrollWidth(columnsWithDSBehavior, dsResponsiveMinColumnWidth),\n [columnsWithDSBehavior, dsResponsiveMinColumnWidth],\n );\n\n const applyResponsiveDefaults = React.useCallback((scrollValue: AntTableProps['scroll']) => {\n if (!dsResponsive) {\n return scrollValue;\n }\n\n if (!scrollValue || typeof scrollValue !== 'object') {\n return { x: responsiveScrollX };\n }\n\n return {\n ...scrollValue,\n x: scrollValue.x ?? responsiveScrollX,\n };\n }, [dsResponsive, responsiveScrollX]);\n\n const effectiveScroll = React.useMemo(() => {\n if (useFixedHeaderFooterVariant) {\n const scrollBase = antScroll && typeof antScroll === 'object' ? antScroll : {};\n return applyResponsiveDefaults({\n ...scrollBase,\n y: scrollBase.y ?? dsFixedBodyHeight,\n });\n }\n\n if (useResizableVariant) {\n return applyResponsiveDefaults(antScroll);\n }\n\n if (!useDSFrozenColumns) {\n return applyResponsiveDefaults(antScroll);\n }\n return applyResponsiveDefaults(antScroll);\n }, [antScroll, applyResponsiveDefaults, dsFixedBodyHeight, useDSFrozenColumns, useFixedHeaderFooterVariant, useResizableVariant]);\n\n const effectiveTableLayout = (useEditableVariant || useResizableVariant || dsResponsive) ? (antTableLayout ?? 'fixed') : antTableLayout;\n const effectiveSticky = antSticky ?? (dsStickyHeader ? { offsetHeader: dsStickyOffsetHeader } : undefined);\n const effectiveComponents = React.useMemo(() => {\n if (!useResizableVariant) return antComponents;\n\n return {\n ...antComponents,\n header: {\n ...antComponents?.header,\n cell: DSResizableHeaderCell,\n },\n };\n }, [antComponents, useResizableVariant]);\n\n const fixedPaginationTotal = resolvedPaginationConfig?.total ?? (Array.isArray(dataSource) ? dataSource.length : 0);\n const fixedCurrentPage = resolvedPaginationConfig?.current ?? localCurrentPage;\n const fixedPageSize = resolvedPaginationConfig?.pageSize ?? localPageSize;\n const fixedDataSource = React.useMemo(() => {\n const source = useEditableVariant ? editableData : dataSource;\n if (!useFixedHeaderFooterVariant || !Array.isArray(source)) {\n return source;\n }\n\n if (resolvedPaginationConfig?.total != null && resolvedPaginationConfig.total > source.length) {\n return source;\n }\n\n const start = (fixedCurrentPage - 1) * fixedPageSize;\n return source.slice(start, start + fixedPageSize);\n }, [dataSource, editableData, fixedCurrentPage, fixedPageSize, resolvedPaginationConfig?.total, useEditableVariant, useFixedHeaderFooterVariant]);\n\n const fixedFooterPaginationProps: DSPaginationProps = {\n ...resolvedPaginationConfig,\n current: fixedCurrentPage,\n pageSize: fixedPageSize,\n total: fixedPaginationTotal,\n showSizeChanger: resolvedPaginationConfig?.showSizeChanger ?? false,\n onChange: (page, pageSize) => {\n setLocalCurrentPage(page);\n setLocalPageSize(pageSize);\n resolvedPaginationConfig?.onChange?.(page, pageSize);\n },\n onShowSizeChange: (page, pageSize) => {\n setLocalCurrentPage(page);\n setLocalPageSize(pageSize);\n resolvedPaginationConfig?.onShowSizeChange?.(page, pageSize);\n },\n };\n\n const dsClassName = [\n 'ds-table',\n `ds-table-${dsStyle}`,\n `ds-table-size-${effectiveSize}`,\n dsResponsive ? 'ds-table-responsive' : '',\n dsHeaderVariant === 'white' ? 'ds-table-header-white' : '',\n className || '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const tableElement = (\n <AntTable\n {...restAntProps}\n columns={columnsWithDSBehavior}\n dataSource={fixedDataSource}\n pagination={useFixedHeaderFooterVariant ? false : resolvedPaginationConfig ?? pagination}\n scroll={effectiveScroll}\n tableLayout={effectiveTableLayout}\n components={effectiveComponents}\n size={effectiveSize}\n className={dsClassName}\n sticky={effectiveSticky}\n showSorterTooltip={getDSSorterTooltipProps(antShowSorterTooltip)}\n />\n );\n\n if (useFixedHeaderFooterVariant) {\n return (\n <div className={`${dsClassName} ds-table-fixed-frame`}>\n {tableElement}\n <div className=\"ds-table-fixed-footer\">\n <DSPagination {...fixedFooterPaginationProps} />\n </div>\n </div>\n );\n }\n\n return useCustomizableVariant ? (\n <div className={dsClassName}>\n <DSColumnVisibilityControl\n columns={columns as any[]}\n visibleColumns={localVisibleColumns}\n onToggle={handleColumnVisibilityToggle}\n />\n {tableElement}\n </div>\n ) : (\n tableElement\n );\n};\n\nexport default Table;\n"],"mappings":"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"}
|