@ds-mo/ui 14.4.2 → 14.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.
@@ -1 +1 @@
1
- {"version":3,"names":["TABLE_COLUMN_WIDTH_TOKENS","xs","sm","md","lg","xl","isTableCellText","value","isTableCellPrimaryText","kind","isTableCellTag","isTableCellIcon","isTableCellImage","isTableCellAction","isTableCellEmpty","isTableCellBlank","tableCellPrimary","label","alt","ariaLabel","primary","tableRowSelectionLabel","row","columns","explicit","selectionLabel","trim","column","cells","id","String","nextTableSortState","current","columnId","direction","toggleTableGroupCollapsed","collapsedGroupIds","groupId","next","Set","has","delete","add","nextTableGroupsCollapsed","groupIds","length","collapsed","allCollapsed","every","tableCollapseAllHost","undefined","index","mode","clampTableColumnSize","size","Number","isFinite","minimum","minSize","maximum","maxSize","Math","max","POSITIVE_INFINITY","min","tableColumnSize","width","tableFlexibleColumnId","some","sticky","tableExplicitMinWidth","widths","map","filter","join","tableRows","rows","groups","grouped","flatMap","group","canSelectRow","selectable","disabled","deriveTableSelectionState","selectedRowIds","selected","selectableRowIds","selectedLoadedCount","reduce","count","allSelected","indeterminate","toggleTableRowSelection","toggleAllLoadedTableRows","loadedRows","state","toggleTableGroupSelection","groupRows","resolvedTableGroupCount","total","totalCount","TABLE_GROUP_INTENTS","isTableGroupIntent","includes","tableGroupIntentClass","intent","tableGroupLabelColor","formatTableResultSummary","displayed","locale","formatter","Intl","NumberFormat","replace","format","tableModelIssues","issues","columnIds","push","header","headerLabel","rowIds","resolveTableCellPresentation","cellType","variant","primaryText","text","fontFeature","singleLine","secondary","wraps","wrap","createTableRenderModel","input","selectionMode","allGroupsCollapsed","showCollapseAll","explicitMinWidth","flexibleColumnId","gridTracks","tableStyle","hasData","selection","loadedCount","totalLabel","countLabel","intentClass","labelColor","totalColumns","collapseAllHost","resolveTableLayoutMetrics","horizontalOverflow","scrollInlineSize","viewportInlineSize","visibleInlineSize","overflow","start","scrollInlineOffset","end","scrollable","scrollBlockSize","viewportBlockSize","inlineOffset","maxInlineOffset","collapseBlockOffset","collapseHeadBlockStart","collapseFrameBlockStart","TableLayoutController","constructor","options","this","connected","connectedViewport","resizeObserver","frame","schedule","requestAnimationFrame","sync","handleScroll","clampInlineOffset","clampVerticalOverscroll","clampBlockOffset","handleWheel","event","viewport","abs","deltaX","deltaY","scrollWidth","clientWidth","atStart","scrollLeft","atEnd","preventDefault","scrollHeight","clientHeight","scrollTop","verticalEdgeWheel","connect","refresh","disconnect","cancelAnimationFrame","removeEventListener","elements","elementsChanged","addEventListener","passive","ResizeObserver","observe","clamped","measureCollapse","floatingCollapseAll","documentStickyHeader","collapseAllOverlay","interactiveHead","metrics","getBoundingClientRect","top","setProperty","stickyHeaderTable","overflowChanged","element","property","style","getPropertyValue","TableLoadController","intersectionSupported","IntersectionObserver","intersectionObserver","observedSentinel","requestPending","requestedRowCount","previousLoadedRowCount","initialize","loadedRowCount","disconnectObserver","lazyLoading","loadMoreMode","hasMore","loadMoreError","sentinel","threshold","loadMoreThreshold","entries","entry","isIntersecting","request","root","containedScroll","rootMargin","structureChanged","resetRequest","dataChanged","nextCount","added","announce","rowsLoadedLabel","identityChanged","configurationChanged","loadingChanged","loading","loadingMoreLabel","errorChanged","error","hasMoreChanged","hadMore","endOfResultsLabel","reason","loadingMore","loadIdentity","groupIdentity","formatGroupLabel","template","split","TableGroupLoadController","snapshots","Map","pending","createSnapshots","enabled","target","dataset","sentinels","find","item","clear","nextSnapshots","snapshot","previous","get","identity","set","keys","resolveTableFitPageSize","headerBlockSize","itemBlockSize","availableBlockSize","floor","resolveTableViewportFitMetrics","insetBlockStart","insetBlockEnd","scrollportBlockEnd","scrollportBlockStart","scrollportBlockSize","settledBlockStart","reservedBlockSize","currentBlockStart","hostBlockStart","currentBlockSize","settled","TableViewportFitController","scrollRoot","host","surface","hostRect","scrollportRect","HTMLElement","height","window","innerHeight","insets","resolveCssLengthPx","blockStart","blockEnd","fitChanged","disconnectRuntime","clearGeometry","nextScrollRoot","findScrollRoot","scrollOuterBy","delta","scrollingElement","document","scrollY","documentElement","scrollTo","behavior","removeProperty","ancestor","composedParent","getComputedStyle","overflowY","assignedSlot","parentElement","focusRingCss","interactionFillCss","tableCss","Table","__stencil_proxyCustomElement","registerHost","grouping","sort","captionVisibility","resultSummaryLabel","stickyHeader","fitViewport","viewportInsetBlockStart","viewportInsetBlockEnd","skeletonRows","emptyHeading","emptyBody","errorHeading","errorBody","emptyCellLabel","dataMode","pagination","loadMoreLabel","retryLabel","groupLoadMoreLabel","groupLoadMoreAriaLabel","groupRetryLabel","groupLoadingMoreLabel","groupEndOfResultsLabel","groupRowsLoadedLabel","overflowStart","overflowEnd","announcement","activeStickyGroupId","viewportFitSettled","headerPresent","rootEl","viewportEl","frameEl","interactiveHeadEl","collapseAllOverlayEl","stickyHeaderTableEl","tableEl","sentinelEl","incrementalWindowActive","groupSentinelEls","previousModelWarning","hasLoaded","renderedModel","stickyGroupConnected","headerSlotObserver","fitResizeObserver","fitObservedViewport","fitObservedTable","fitMeasurementPending","layoutController","viewportFitController","loadController","currentLoadedRowCount","message","detail","dsLoadMore","emit","groupLoadController","dsGroupLoadMore","el","syncHeaderSlotPresence","querySelector","updateStickyGroup","bottom","activeGroupId","activeGroupTop","body","querySelectorAll","source","sourceRect","bodyRect","frameRect","syncFitPageSize","fitToPage","fitPageSize","pageSizeMode","pageSize","pageIndex","dsPaginationChange","totalItems","pageSizeOptions","fitPageSizeLabel","fitPageSizeTriggerLabel","itemLabel","pageSizeLabel","caption","previousPageIndex","previousPageSize","previousPageSizeMode","componentWillLoad","hasIncrementalState","warnModelIssues","componentDidLoad","syncStickyGroupConnection","connectHeaderSlotObserver","connectFitObserver","componentDidRender","connectedCallback","disconnectedCallback","disconnectStickyGroup","disconnectFitObserver","MutationObserver","childList","connectStickyGroup","capture","handleStructureChange","handleDataChange","handleLoadIdentityChange","handleLazyConfigurationChange","handleDataModeChange","handlePaginationChange","fitIdentity","handleLoadingMoreChange","handleLoadMoreErrorChange","handleHasMoreChange","fixedHeight","resolvedHeight","boundedComposition","resolvedMaxHeight","handlePaginationKeyDown","defaultPrevented","altKey","ctrlKey","metaKey","shiftKey","key","fromDirectionalControl","composedPath","node","tagName","isContentEditable","getAttribute","resolvePaginationState","totalPages","currentLoadedRows","createRenderModel","maxHeight","unshift","headerSegments","segment","sortKey","stickyStart","stickyEnd","console","warn","emitSort","sortable","dsSortChange","sortButtonLabel","emitRowSelection","dsSelectionChange","scope","changedRowId","emitAllSelection","emitGroupSelection","rowEventOwnsActivation","currentTarget","matches","emitRowActivation","interactive","dsRowActivate","rowId","handleRowKeydown","renderSelectionControl","checked","onActivate","h","class","type","role","onClick","presentation","renderStickyEdge","renderCollapseAllButton","icon","hasBorder","activeFill","pressScale","onDsClick","stopPropagation","emitAllGroupsCollapse","renderFloatingCollapseAll","model","ref","renderColumnHeader","presentational","groupedColumn","activeMemberSegment","activeMemberSort","activeSort","align","memberAriaSort","labelControl","segmentActive","segmentInteractive","as","emphasis","color","lineTruncation","control","separator","sortControl","isActive","collapseHost","actionCollapseHost","blankActionCollapseHost","collapseControl","renderColgroup","flexible","renderHeader","renderCellValue","cell","name","src","isInset","insetDepth","isInactive","isLoading","dsCellAction","actionId","tag","contrast","rounded","secondaryColor","renderRow","rowSelectable","tabIndex","onKeyDown","tagCell","iconCell","imageCell","actionCell","textCell","primaryTextCell","singleTextCell","emptyCell","blankCell","tagVariant","textVariant","emitGroupCollapse","dsGroupCollapseChange","renderGroupContent","groupModel","isCollapsed","groupSelection","expanded","formatGroupLoadLabel","renderGroupLoadRow","manualFallback","colSpan","renderStickyGroup","renderDataBodies","stickySourceHidden","renderSkeletonBody","round","Array","from","_","controlSize","renderSkeletonCell","rowIndex","skeleton","lines","image","action","blank","renderSkeletonCellContent","iconSize","iconOnly","primaryWidth","secondaryWidth","renderStateBody","heading","renderLazyBody","renderDocumentStickyHeader","resultSummary","displayedCount","hasResultFooter","renderResultFooter","summary","hasLeading","hasCopy","hasTrailing","onDsChange","renderCaptionBar","onSlotchange","render","regionLabel","scrollLabel","initialLoading","initialError","hasGroupedStructure","groupLoadingMore","viewportStyle","hostStyle","Host"],"sources":["src/wc/components/Table/table-model.ts","src/wc/components/Table/table-cell-model.ts","src/wc/components/Table/table-render-model.ts","src/wc/components/Table/table-layout-controller.ts","src/wc/components/Table/table-load-controller.ts","src/wc/components/Table/table-group-load-controller.ts","src/wc/components/Table/table-pagination-fit.ts","src/wc/components/Table/table-viewport-fit-controller.ts","src/wc/utils/focus-ring.css?tag=ds-table&encapsulation=scoped","src/wc/utils/interaction-fill.css?tag=ds-table&encapsulation=scoped","src/wc/components/Table/Table.css?tag=ds-table&encapsulation=scoped","src/wc/components/Table/Table.tsx"],"sourcesContent":["import type {\n TableCellBlank,\n TableCellAction,\n TableCellEmpty,\n TableCellIcon,\n TableCellImage,\n TableCellPrimaryText,\n TableCellText,\n TableCellTag,\n TableCellValue,\n TableColumn,\n TableGroup,\n TableRow,\n TableSortState,\n} from './table-types';\n\nexport interface TableSelectionState {\n selectableRowIds: string[];\n selectedLoadedCount: number;\n allSelected: boolean;\n indeterminate: boolean;\n}\n\nconst TABLE_COLUMN_WIDTH_TOKENS = {\n xs: '--dimension-table-column-width-xs',\n sm: '--dimension-table-column-width-sm',\n md: '--dimension-table-column-width-md',\n lg: '--dimension-table-column-width-lg',\n xl: '--dimension-table-column-width-xl',\n} as const;\n\nexport function isTableCellText(value: TableCellValue): value is TableCellText {\n return typeof value === 'object' && value !== null && 'primary' in value && !('kind' in value);\n}\n\nexport function isTableCellPrimaryText(value: TableCellValue): value is TableCellPrimaryText {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'primary-text';\n}\n\nexport function isTableCellTag(value: TableCellValue): value is TableCellTag {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'tag';\n}\n\nexport function isTableCellIcon(value: TableCellValue): value is TableCellIcon {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'icon';\n}\n\nexport function isTableCellImage(value: TableCellValue): value is TableCellImage {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'image';\n}\n\nexport function isTableCellAction(value: TableCellValue): value is TableCellAction {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'action';\n}\n\nexport function isTableCellEmpty(value: TableCellValue): value is TableCellEmpty {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'empty';\n}\n\nexport function isTableCellBlank(value: TableCellValue): value is TableCellBlank {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'blank';\n}\n\nexport function tableCellPrimary(value: TableCellValue): string | number | null {\n if (value == null) return null;\n if (isTableCellTag(value)) return value.label;\n if (isTableCellIcon(value)) return null;\n if (isTableCellImage(value)) return value.alt;\n if (isTableCellAction(value)) return value.label ?? value.ariaLabel;\n if (isTableCellPrimaryText(value)) return value.primary;\n if (isTableCellEmpty(value) || isTableCellBlank(value)) return null;\n return isTableCellText(value) ? value.primary : value;\n}\n\nexport function tableRowSelectionLabel(row: TableRow, columns: TableColumn[]): string {\n const explicit = row.selectionLabel?.trim();\n if (explicit) return explicit;\n\n for (const column of columns) {\n const primary = tableCellPrimary(row.cells[column.id]);\n if (primary != null && String(primary).trim()) return String(primary);\n }\n\n return row.id;\n}\n\nexport function nextTableSortState(\n current: TableSortState | null | undefined,\n columnId: string,\n): TableSortState {\n if (current?.columnId !== columnId) return { columnId, direction: 'asc' };\n if (current.direction === 'asc') return { columnId, direction: 'desc' };\n return { columnId, direction: 'asc' };\n}\n\nexport function toggleTableGroupCollapsed(\n collapsedGroupIds: string[],\n groupId: string,\n): string[] {\n const next = new Set(collapsedGroupIds);\n if (next.has(groupId)) next.delete(groupId);\n else next.add(groupId);\n return [...next];\n}\n\nexport function nextTableGroupsCollapsed(\n collapsedGroupIds: string[],\n groupIds: string[],\n): string[] {\n if (groupIds.length === 0) return [];\n const collapsed = new Set(collapsedGroupIds);\n const allCollapsed = groupIds.every(id => collapsed.has(id));\n return allCollapsed ? [] : [...groupIds];\n}\n\n/** Host for grouped collapse-all: the trailing action lane or a scrollport-owned overlay. */\nexport type TableCollapseAllHost =\n | { columnId: string; mode: 'action' }\n | { mode: 'floating' };\n\nexport function tableCollapseAllHost(\n columns: TableColumn[],\n): TableCollapseAllHost | undefined {\n if (columns.length === 0) return undefined;\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const column = columns[index]!;\n if (column.kind === 'action') return { columnId: column.id, mode: 'action' };\n }\n return { mode: 'floating' };\n}\n\nexport function clampTableColumnSize(column: TableColumn): number | undefined {\n if (typeof column.size !== 'number' || !Number.isFinite(column.size) || column.size <= 0) {\n return undefined;\n }\n\n const minimum = Number.isFinite(column.minSize) && (column.minSize ?? 0) > 0\n ? column.minSize!\n : 0;\n const maximum = Number.isFinite(column.maxSize) && (column.maxSize ?? 0) > 0\n ? Math.max(column.maxSize!, minimum)\n : Number.POSITIVE_INFINITY;\n\n return Math.min(Math.max(column.size!, minimum), maximum);\n}\n\nexport function tableColumnSize(column: TableColumn): string | undefined {\n if (typeof column.size === 'string') {\n return `var(${TABLE_COLUMN_WIDTH_TOKENS[column.size]})`;\n }\n const width = clampTableColumnSize(column);\n if (width != null) return `${width}px`;\n return column.kind === 'action' ? 'var(--dimension-size-500)' : undefined;\n}\n\n/**\n * When every column has an explicit width, one ordinary lane must absorb spare\n * table width so fixed selection and action lanes are not expanded by the\n * native fixed-table layout algorithm.\n */\nexport function tableFlexibleColumnId(columns: TableColumn[]): string | undefined {\n if (columns.some(column => !tableColumnSize(column))) return undefined;\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const column = columns[index]!;\n if (column.kind !== 'action' && !column.sticky) return column.id;\n }\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const column = columns[index]!;\n if (column.kind !== 'action') return column.id;\n }\n return columns[columns.length - 1]?.id;\n}\n\nexport function tableExplicitMinWidth(columns: TableColumn[]): string | undefined {\n const widths = columns.map(tableColumnSize).filter((width): width is string => !!width);\n if (widths.length === 0) return undefined;\n return widths.length === 1 ? widths[0] : `calc(${widths.join(' + ')})`;\n}\n\nexport function tableRows(rows: TableRow[], groups: TableGroup[], grouped: boolean): TableRow[] {\n return grouped ? groups.flatMap(group => group.rows) : rows;\n}\n\nfunction canSelectRow(row: TableRow): boolean {\n return row.selectable !== false && !row.disabled;\n}\n\nexport function deriveTableSelectionState(\n rows: TableRow[],\n selectedRowIds: readonly string[],\n): TableSelectionState {\n const selected = new Set(selectedRowIds);\n const selectableRowIds = rows.filter(canSelectRow).map(row => row.id);\n const selectedLoadedCount = selectableRowIds.reduce(\n (count, id) => count + (selected.has(id) ? 1 : 0),\n 0,\n );\n\n return {\n selectableRowIds,\n selectedLoadedCount,\n allSelected: selectableRowIds.length > 0 && selectedLoadedCount === selectableRowIds.length,\n indeterminate: selectedLoadedCount > 0 && selectedLoadedCount < selectableRowIds.length,\n };\n}\n\nexport function toggleTableRowSelection(\n selectedRowIds: readonly string[],\n row: TableRow,\n): string[] {\n if (!canSelectRow(row)) return [...selectedRowIds];\n const selected = new Set(selectedRowIds);\n if (selected.has(row.id)) selected.delete(row.id);\n else selected.add(row.id);\n return [...selected];\n}\n\nexport function toggleAllLoadedTableRows(\n selectedRowIds: readonly string[],\n loadedRows: TableRow[],\n): string[] {\n const selected = new Set(selectedRowIds);\n const state = deriveTableSelectionState(loadedRows, selectedRowIds);\n\n for (const id of state.selectableRowIds) {\n if (state.allSelected) selected.delete(id);\n else selected.add(id);\n }\n\n return [...selected];\n}\n\n/** Toggle every selectable loaded row that belongs to a group. */\nexport function toggleTableGroupSelection(\n selectedRowIds: readonly string[],\n groupRows: TableRow[],\n): string[] {\n return toggleAllLoadedTableRows(selectedRowIds, groupRows);\n}\n\nexport function resolvedTableGroupCount(group: TableGroup): number {\n const total = Number.isFinite(group.totalCount) ? Math.max(0, group.totalCount!) : 0;\n return Math.max(total, group.rows.length);\n}\n\nexport const TABLE_GROUP_INTENTS = [\n 'brand',\n 'neutral',\n 'negative',\n 'warning',\n 'caution',\n 'positive',\n] as const;\n\nexport function isTableGroupIntent(\n value: unknown,\n): value is (typeof TABLE_GROUP_INTENTS)[number] {\n return (\n typeof value === 'string' &&\n (TABLE_GROUP_INTENTS as readonly string[]).includes(value)\n );\n}\n\nexport function tableGroupIntentClass(\n intent: (typeof TABLE_GROUP_INTENTS)[number] | undefined,\n): string | undefined {\n return isTableGroupIntent(intent) ? `ds-table__group-cell--intent-${intent}` : undefined;\n}\n\n/** Title color for an intentful group label; defaults to primary when unset. */\nexport function tableGroupLabelColor(\n intent: (typeof TABLE_GROUP_INTENTS)[number] | undefined,\n): 'primary' | 'brand' | 'negative' | 'warning' | 'caution' | 'positive' | `var(--${string})` {\n if (!isTableGroupIntent(intent)) return 'primary';\n if (intent === 'neutral') return 'var(--color-foreground-bold-neutral)';\n return intent;\n}\n\n/** Formats the optional table result footer. Returns null when either count is missing. */\nexport function formatTableResultSummary(\n displayed: number | null | undefined,\n total: number | null | undefined,\n label = 'Displaying {displayed} of {total}',\n locale?: string,\n): string | null {\n if (!Number.isFinite(displayed) || !Number.isFinite(total)) return null;\n const formatter = new Intl.NumberFormat(locale);\n return label\n .replace('{displayed}', formatter.format(displayed as number))\n .replace('{total}', formatter.format(total as number));\n}\n\nexport function tableModelIssues(\n columns: TableColumn[],\n rows: TableRow[],\n groups: TableGroup[],\n grouped: boolean,\n): string[] {\n const issues: string[] = [];\n const columnIds = new Set<string>();\n for (const column of columns) {\n if (!column.id.trim()) issues.push('Every column requires a non-empty id.');\n else if (columnIds.has(column.id)) issues.push(`Duplicate column id: ${column.id}`);\n if (!column.header.trim() && !column.headerLabel?.trim()) {\n issues.push(`Column ${column.id || '(missing id)'} requires a visible header or headerLabel.`);\n }\n columnIds.add(column.id);\n }\n\n const groupIds = new Set<string>();\n if (grouped) {\n for (const group of groups) {\n if (!group.id.trim()) issues.push('Every group requires a non-empty id.');\n else if (groupIds.has(group.id)) issues.push(`Duplicate group id: ${group.id}`);\n groupIds.add(group.id);\n if (group.totalCount != null && group.totalCount < group.rows.length) {\n issues.push(`Group ${group.id} totalCount is smaller than its loaded row count.`);\n }\n if (group.intent != null && !isTableGroupIntent(group.intent)) {\n issues.push(`Group ${group.id} has an unsupported intent.`);\n }\n }\n }\n\n const rowIds = new Set<string>();\n for (const row of tableRows(rows, groups, grouped)) {\n if (!row.id.trim()) issues.push('Every row requires a non-empty id.');\n else if (rowIds.has(row.id)) issues.push(`Duplicate row id: ${row.id}`);\n rowIds.add(row.id);\n }\n\n return [...new Set(issues)];\n}\n","import {\n isTableCellAction,\n isTableCellBlank,\n isTableCellEmpty,\n isTableCellIcon,\n isTableCellImage,\n isTableCellPrimaryText,\n isTableCellTag,\n isTableCellText,\n} from './table-model';\nimport type {\n TableCellAction,\n TableCellBlank,\n TableCellEmpty,\n TableCellIcon,\n TableCellImage,\n TableCellTag,\n TableCellTagVariant,\n TableCellValue,\n TableColumn,\n} from './table-types';\nimport type { TextColor } from '../Text/text-types';\n\nexport interface ResolvedTableCellText {\n primary: string | number;\n secondary?: string | number;\n secondaryColor?: TextColor;\n wrap?: boolean;\n fontFeature?: 'normal' | 'tabular-nums';\n}\n\nexport type TableCellPresentation =\n | { kind: 'blank'; cellType: 'blank'; value: TableCellBlank }\n | { kind: 'empty'; cellType: 'empty'; value: TableCellEmpty | null | undefined }\n | { kind: 'icon'; cellType: 'icon'; value: TableCellIcon }\n | { kind: 'image'; cellType: 'image'; value: TableCellImage }\n | { kind: 'action'; cellType: 'action'; value: TableCellAction }\n | {\n kind: 'tag';\n cellType: 'tag';\n value: TableCellTag;\n variant: TableCellTagVariant;\n }\n | {\n kind: 'text';\n cellType: 'text' | 'primary-text';\n value: ResolvedTableCellText;\n primaryText: boolean;\n singleLine: boolean;\n variant: 'single' | 'multi' | 'primary-pair';\n wraps: boolean;\n };\n\n/** Resolve a cell's semantic and visual recipe once for both markup and classes. */\nexport function resolveTableCellPresentation(\n value: TableCellValue,\n column: TableColumn,\n): TableCellPresentation {\n if (isTableCellBlank(value)) return { kind: 'blank', cellType: 'blank', value };\n if (value == null || isTableCellEmpty(value)) {\n return { kind: 'empty', cellType: 'empty', value };\n }\n if (isTableCellIcon(value)) return { kind: 'icon', cellType: 'icon', value };\n if (isTableCellImage(value)) return { kind: 'image', cellType: 'image', value };\n if (isTableCellAction(value)) return { kind: 'action', cellType: 'action', value };\n if (isTableCellTag(value)) {\n return {\n kind: 'tag',\n cellType: 'tag',\n value,\n variant: value.variant ?? 'tag-only',\n };\n }\n\n const primaryText = isTableCellPrimaryText(value);\n const text: ResolvedTableCellText = isTableCellText(value) || primaryText\n ? value\n : {\n primary: value,\n fontFeature: typeof value === 'number' ? 'tabular-nums' : 'normal',\n };\n const singleLine = !primaryText && (text.secondary === undefined || text.secondary === '');\n return {\n kind: 'text',\n cellType: primaryText ? 'primary-text' : 'text',\n value: text,\n primaryText,\n singleLine,\n variant: primaryText ? 'primary-pair' : singleLine ? 'single' : 'multi',\n wraps: text.wrap ?? column.wrap ?? false,\n };\n}\n","import {\n deriveTableSelectionState,\n isTableGroupIntent,\n resolvedTableGroupCount,\n tableCollapseAllHost,\n tableColumnSize,\n tableExplicitMinWidth,\n tableFlexibleColumnId,\n tableGroupIntentClass,\n tableGroupLabelColor,\n tableRows,\n type TableCollapseAllHost,\n type TableSelectionState,\n} from './table-model';\nimport type {\n TableColumn,\n TableGroup,\n TableGroupIntent,\n TableRow,\n TableSelectionMode,\n} from './table-types';\n\nexport interface TableGroupRenderModel {\n group: TableGroup;\n count: number;\n loadedCount: number;\n countLabel: string;\n intent: TableGroupIntent | undefined;\n intentClass: string | undefined;\n labelColor: ReturnType<typeof tableGroupLabelColor>;\n collapsed: boolean;\n selection: TableSelectionState | null;\n}\n\nexport interface TableRenderModel {\n grouped: boolean;\n selectable: boolean;\n loadedRows: TableRow[];\n hasData: boolean;\n selectedRowIds: ReadonlySet<string>;\n selection: TableSelectionState;\n collapsedGroupIds: ReadonlySet<string>;\n groups: TableGroupRenderModel[];\n totalColumns: number;\n allGroupsCollapsed: boolean;\n showCollapseAll: boolean;\n collapseAllHost: TableCollapseAllHost | undefined;\n flexibleColumnId: string | undefined;\n tableStyle: Record<string, string> | undefined;\n}\n\nexport interface TableRenderModelInput {\n columns: TableColumn[];\n rows: TableRow[];\n groups: TableGroup[];\n grouped: boolean;\n selectionMode: TableSelectionMode;\n selectedRowIds: string[];\n collapsedGroupIds: string[];\n}\n\n/** Create one immutable snapshot of all derived state consumed during a render. */\nexport function createTableRenderModel(input: TableRenderModelInput): TableRenderModel {\n const selectable = input.selectionMode === 'multiple';\n const loadedRows = tableRows(input.rows, input.groups, input.grouped);\n const selectedRowIds = new Set(input.selectedRowIds);\n const collapsedGroupIds = new Set(input.collapsedGroupIds);\n const allGroupsCollapsed = input.grouped && input.groups.length > 0 &&\n input.groups.every(group => collapsedGroupIds.has(group.id));\n const showCollapseAll = input.grouped && input.groups.length > 0 && !allGroupsCollapsed;\n const explicitMinWidth = tableExplicitMinWidth(input.columns);\n const flexibleColumnId = tableFlexibleColumnId(input.columns);\n const gridTracks = [\n ...(selectable ? ['var(--_table-selection-column-inline-size)'] : []),\n ...input.columns.map(column => {\n const width = tableColumnSize(column);\n if (!width) return 'minmax(0, 1fr)';\n return column.id === flexibleColumnId ? `minmax(${width}, 1fr)` : width;\n }),\n ].join(' ');\n const tableStyle: Record<string, string> = {\n '--_table-grid-template-columns': gridTracks || 'minmax(0, 1fr)',\n };\n if (explicitMinWidth != null) {\n tableStyle['--ds-table-explicit-min-inline-size'] = explicitMinWidth;\n }\n\n return {\n grouped: input.grouped,\n selectable,\n loadedRows,\n hasData: loadedRows.length > 0,\n selectedRowIds,\n selection: deriveTableSelectionState(loadedRows, input.selectedRowIds),\n collapsedGroupIds,\n groups: input.groups.map(group => {\n const count = resolvedTableGroupCount(group);\n const loadedCount = group.rows.length;\n const totalLabel = group.countLabel ?? `${count} ${count === 1 ? 'item' : 'items'}`;\n const intent = isTableGroupIntent(group.intent) ? group.intent : undefined;\n return {\n group,\n count,\n loadedCount,\n countLabel: `${loadedCount} of ${totalLabel} loaded`,\n intent,\n intentClass: tableGroupIntentClass(intent),\n labelColor: tableGroupLabelColor(intent),\n collapsed: collapsedGroupIds.has(group.id),\n selection: selectable\n ? deriveTableSelectionState(group.rows, input.selectedRowIds)\n : null,\n };\n }),\n totalColumns: input.columns.length + (selectable ? 1 : 0),\n allGroupsCollapsed,\n showCollapseAll,\n collapseAllHost: showCollapseAll ? tableCollapseAllHost(input.columns) : undefined,\n flexibleColumnId,\n tableStyle,\n };\n}\n","export interface TableLayoutElements {\n viewport: HTMLElement | null;\n stickyHeaderTable: HTMLTableElement | null;\n collapseAllOverlay: HTMLElement | null;\n frame: HTMLElement | null;\n interactiveHead: HTMLTableSectionElement | null;\n}\n\nexport interface TableLayoutMode {\n documentStickyHeader: boolean;\n floatingCollapseAll: boolean;\n clampVerticalOverscroll: boolean;\n}\n\nexport interface TableOverflowState {\n start: boolean;\n end: boolean;\n scrollable: boolean;\n}\n\nexport interface TableLayoutControllerOptions {\n elements: () => TableLayoutElements;\n mode: () => TableLayoutMode;\n overflowChanged: (state: TableOverflowState) => void;\n verticalEdgeWheel?: (deltaY: number) => boolean;\n}\n\nexport interface TableLayoutMetricInput {\n viewportInlineSize: number;\n viewportBlockSize: number;\n scrollInlineSize: number;\n scrollBlockSize: number;\n scrollInlineOffset: number;\n collapseHeadBlockStart?: number;\n collapseFrameBlockStart?: number;\n}\n\nexport interface TableLayoutMetrics {\n visibleInlineSize: number;\n overflow: TableOverflowState;\n inlineOffset: number;\n maxInlineOffset: number;\n collapseBlockOffset: number | null;\n}\n\n/** Pure geometry resolution shared by the controller and focused tests. */\nexport function resolveTableLayoutMetrics(input: TableLayoutMetricInput): TableLayoutMetrics {\n const horizontalOverflow = input.scrollInlineSize - input.viewportInlineSize > 1;\n return {\n visibleInlineSize: input.viewportInlineSize,\n overflow: {\n start: horizontalOverflow && input.scrollInlineOffset > 1,\n end: horizontalOverflow &&\n input.scrollInlineOffset + input.viewportInlineSize < input.scrollInlineSize - 1,\n scrollable: horizontalOverflow || input.scrollBlockSize - input.viewportBlockSize > 1,\n },\n inlineOffset: input.scrollInlineOffset,\n maxInlineOffset: Math.max(0, input.scrollInlineSize - input.viewportInlineSize),\n collapseBlockOffset: input.collapseHeadBlockStart == null ||\n input.collapseFrameBlockStart == null\n ? null\n : Math.max(0, input.collapseHeadBlockStart - input.collapseFrameBlockStart),\n };\n}\n\n/**\n * Owns table viewport observation. It resolves newly rendered geometry\n * immediately so the first paint has the correct viewport-width chrome, then\n * batches observer-driven scroll and resize reads/writes into one animation frame.\n * The component remains responsible only for refs and reactive overflow state.\n */\nexport class TableLayoutController {\n private connected = false;\n private connectedViewport: HTMLElement | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private frame: number | null = null;\n private overflow: TableOverflowState | null = null;\n\n constructor(private readonly options: TableLayoutControllerOptions) {}\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n if (this.frame !== null) cancelAnimationFrame(this.frame);\n this.frame = null;\n this.connectedViewport?.removeEventListener('scroll', this.handleScroll);\n this.connectedViewport?.removeEventListener('wheel', this.handleWheel);\n this.connectedViewport = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n /** Reconcile newly rendered refs, observers, and pending geometry. */\n refresh(): void {\n if (!this.connected) return;\n const { viewport } = this.options.elements();\n const elementsChanged = viewport !== this.connectedViewport;\n if (elementsChanged) {\n this.connectedViewport?.removeEventListener('scroll', this.handleScroll);\n this.connectedViewport?.removeEventListener('wheel', this.handleWheel);\n this.resizeObserver?.disconnect();\n this.connectedViewport = viewport;\n viewport?.addEventListener('scroll', this.handleScroll, { passive: true });\n viewport?.addEventListener('wheel', this.handleWheel, { passive: false });\n\n if (typeof ResizeObserver !== 'undefined' && viewport) {\n this.resizeObserver ??= new ResizeObserver(this.schedule);\n this.resizeObserver.observe(viewport);\n }\n }\n // Resolve before componentDidRender returns so WebKit cannot paint or expose\n // one frame using the full spanning-cell width.\n this.sync();\n }\n\n private schedule = (): void => {\n if (!this.connected || this.frame !== null) return;\n this.frame = requestAnimationFrame(() => {\n this.frame = null;\n this.sync();\n });\n };\n\n private readonly handleScroll = (): void => {\n this.clampInlineOffset();\n if (this.options.mode().clampVerticalOverscroll) this.clampBlockOffset();\n this.schedule();\n };\n\n private readonly handleWheel = (event: WheelEvent): void => {\n const viewport = this.connectedViewport;\n if (!viewport) return;\n\n if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {\n const max = Math.max(0, viewport.scrollWidth - viewport.clientWidth);\n const atStart = viewport.scrollLeft <= 0 && event.deltaX < 0;\n const atEnd = viewport.scrollLeft >= max && event.deltaX > 0;\n if (atStart || atEnd) event.preventDefault();\n return;\n }\n\n if (!this.options.mode().clampVerticalOverscroll || event.deltaY === 0) return;\n const max = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n const atStart = viewport.scrollTop <= 0 && event.deltaY < 0;\n const atEnd = viewport.scrollTop >= max && event.deltaY > 0;\n if (!atStart && !atEnd) return;\n\n this.options.verticalEdgeWheel?.(event.deltaY);\n event.preventDefault();\n };\n\n private clampInlineOffset(): void {\n const viewport = this.connectedViewport;\n if (!viewport) return;\n const max = Math.max(0, viewport.scrollWidth - viewport.clientWidth);\n const clamped = Math.min(max, Math.max(0, viewport.scrollLeft));\n if (viewport.scrollLeft !== clamped) viewport.scrollLeft = clamped;\n }\n\n private clampBlockOffset(): void {\n const viewport = this.connectedViewport;\n if (!viewport) return;\n const max = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n const clamped = Math.min(max, Math.max(0, viewport.scrollTop));\n if (viewport.scrollTop !== clamped) viewport.scrollTop = clamped;\n }\n\n private sync(): void {\n const elements = this.options.elements();\n const viewport = elements.viewport;\n if (!viewport) return;\n\n // Read every layout value before writing styles or reactive state.\n const mode = this.options.mode();\n const measureCollapse = mode.floatingCollapseAll && !mode.documentStickyHeader &&\n elements.collapseAllOverlay && elements.frame && elements.interactiveHead;\n const metrics = resolveTableLayoutMetrics({\n viewportInlineSize: viewport.clientWidth,\n viewportBlockSize: viewport.clientHeight,\n scrollInlineSize: viewport.scrollWidth,\n scrollBlockSize: viewport.scrollHeight,\n scrollInlineOffset: viewport.scrollLeft,\n collapseHeadBlockStart: measureCollapse\n ? elements.interactiveHead!.getBoundingClientRect().top\n : undefined,\n collapseFrameBlockStart: measureCollapse\n ? elements.frame!.getBoundingClientRect().top\n : undefined,\n });\n\n this.setProperty(\n viewport,\n '--ds-table-visible-inline-size',\n `${metrics.visibleInlineSize}px`,\n );\n if (elements.stickyHeaderTable) {\n this.setProperty(\n elements.stickyHeaderTable,\n '--ds-table-inline-scroll-offset',\n `${metrics.inlineOffset}px`,\n );\n this.setProperty(\n elements.stickyHeaderTable,\n '--ds-table-inline-scroll-max-offset',\n `${metrics.maxInlineOffset}px`,\n );\n }\n if (metrics.collapseBlockOffset !== null && elements.collapseAllOverlay) {\n this.setProperty(\n elements.collapseAllOverlay,\n '--ds-table-collapse-all-block-offset',\n `${metrics.collapseBlockOffset}px`,\n );\n }\n\n if (\n !this.overflow ||\n this.overflow.start !== metrics.overflow.start ||\n this.overflow.end !== metrics.overflow.end ||\n this.overflow.scrollable !== metrics.overflow.scrollable\n ) {\n this.overflow = metrics.overflow;\n this.options.overflowChanged(metrics.overflow);\n }\n }\n\n private setProperty(element: HTMLElement, property: string, value: string): void {\n if (element.style.getPropertyValue(property) !== value) {\n element.style.setProperty(property, value);\n }\n }\n}\n","import type {\n TableLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\n\nexport interface TableLoadControllerState {\n lazyLoading: boolean;\n loadMoreMode: TableLoadMoreMode;\n hasMore: boolean;\n loadingMore: boolean;\n loadMoreError: string | undefined;\n loadIdentity: string | number;\n loadMoreThreshold: number;\n containedScroll: boolean;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n loadedRowCount: number;\n viewport: HTMLElement | null;\n sentinel: HTMLElement | null;\n}\n\nexport interface TableLoadControllerOptions {\n state: () => TableLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableLoadMoreDetail) => void;\n}\n\n/** Owns incremental-loading request guards, announcements, and observation. */\nexport class TableLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private intersectionObserver: IntersectionObserver | null = null;\n private observedSentinel: HTMLElement | null = null;\n private requestPending = false;\n private requestedRowCount = 0;\n private previousLoadedRowCount = 0;\n\n constructor(private readonly options: TableLoadControllerOptions) {}\n\n initialize(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n state.loadMoreMode !== 'auto' ||\n !state.hasMore ||\n !!state.loadMoreError?.trim() ||\n !this.intersectionSupported ||\n !state.viewport ||\n !state.sentinel\n ) {\n this.disconnectObserver();\n return;\n }\n\n if (this.intersectionObserver && this.observedSentinel === state.sentinel) return;\n this.disconnectObserver();\n const threshold = Number.isFinite(state.loadMoreThreshold)\n ? Math.max(0, state.loadMoreThreshold)\n : 0;\n this.intersectionObserver = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) this.request('auto');\n },\n {\n root: state.containedScroll ? state.viewport : null,\n rootMargin: `0px 0px ${threshold}px 0px`,\n },\n );\n this.observedSentinel = state.sentinel;\n this.intersectionObserver.observe(state.sentinel);\n }\n\n structureChanged(): void {\n this.resetRequest();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextCount = state.loadedRowCount;\n if (!state.lazyLoading) {\n this.previousLoadedRowCount = nextCount;\n this.resetRequest();\n return;\n }\n if (nextCount > this.previousLoadedRowCount) {\n const added = nextCount - this.previousLoadedRowCount;\n this.options.announce(\n state.rowsLoadedLabel\n .replace('{count}', String(added))\n .replace('{total}', String(nextCount)),\n );\n }\n if (nextCount > this.requestedRowCount) this.requestPending = false;\n this.previousLoadedRowCount = nextCount;\n this.disconnectObserver();\n }\n\n identityChanged(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n this.resetRequest();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n loadingChanged(loading: boolean): void {\n const state = this.options.state();\n if (!state.lazyLoading) {\n this.resetRequest();\n return;\n }\n if (loading) {\n this.requestPending = true;\n this.options.announce(state.loadingMoreLabel);\n } else if (state.loadMoreMode === 'manual') {\n // A completed manual request may append no rows; permit another explicit activation.\n this.requestPending = false;\n }\n this.disconnectObserver();\n }\n\n errorChanged(error: string | undefined): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (error?.trim()) {\n this.requestPending = false;\n this.options.announce(error);\n }\n this.disconnectObserver();\n }\n\n hasMoreChanged(hasMore: boolean, hadMore: boolean): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (!hasMore) {\n this.requestPending = false;\n if (hadMore) this.options.announce(this.options.state().endOfResultsLabel);\n }\n this.disconnectObserver();\n }\n\n request(reason: TableLoadMoreReason): void {\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n !state.hasMore ||\n state.loadingMore ||\n (reason !== 'retry' && !!state.loadMoreError?.trim()) ||\n this.requestPending\n ) return;\n\n this.requestPending = true;\n this.requestedRowCount = state.loadedRowCount;\n this.options.announce(state.loadingMoreLabel);\n this.options.request({\n reason,\n loadIdentity: state.loadIdentity,\n loadedRowCount: this.requestedRowCount,\n });\n }\n\n private resetRequest(): void {\n this.requestPending = false;\n this.requestedRowCount = this.options.state().loadedRowCount;\n this.disconnectObserver();\n }\n\n private disconnectObserver(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n this.observedSentinel = null;\n }\n}\n","import type {\n TableGroup,\n TableGroupLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\n\nexport interface TableGroupLoadControllerState {\n enabled: boolean;\n loadMoreMode: TableLoadMoreMode;\n loadMoreThreshold: number;\n containedScroll: boolean;\n groups: TableGroup[];\n viewport: HTMLElement | null;\n sentinels: ReadonlyMap<string, HTMLElement>;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n}\n\nexport interface TableGroupLoadControllerOptions {\n state: () => TableGroupLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableGroupLoadMoreDetail) => void;\n}\n\ninterface GroupSnapshot {\n count: number;\n hasMore: boolean;\n loading: boolean;\n error: string;\n identity: string | number;\n}\n\nfunction groupIdentity(group: TableGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: TableGroup, count?: number): string {\n return template\n .split('{group}').join(group.label)\n .split('{count}').join(String(count ?? group.rows.length))\n .split('{loaded}').join(String(group.rows.length))\n .split('{total}').join(String(group.totalCount ?? group.rows.length));\n}\n\n/** Owns request guards, announcements, and observation for independently loaded groups. */\nexport class TableGroupLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private intersectionObserver: IntersectionObserver | null = null;\n private snapshots = new Map<string, GroupSnapshot>();\n private pending = new Map<string, { identity: string | number; count: number }>();\n\n constructor(private readonly options: TableGroupLoadControllerOptions) {}\n\n initialize(): void {\n this.snapshots = this.createSnapshots();\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.enabled ||\n state.loadMoreMode !== 'auto' ||\n !this.intersectionSupported ||\n !state.viewport\n ) {\n this.disconnectObserver();\n return;\n }\n\n this.disconnectObserver();\n const threshold = Number.isFinite(state.loadMoreThreshold)\n ? Math.max(0, state.loadMoreThreshold)\n : 0;\n this.intersectionObserver = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n const groupId = (entry.target as HTMLElement).dataset.groupId;\n if (groupId) this.request(groupId, 'auto');\n }\n },\n {\n root: state.containedScroll ? state.viewport : null,\n rootMargin: `0px 0px ${threshold}px 0px`,\n },\n );\n\n for (const [groupId, sentinel] of state.sentinels) {\n const group = state.groups.find(item => item.id === groupId);\n if (!group?.hasMore || group.loadingMore || group.loadMoreError?.trim()) continue;\n this.intersectionObserver.observe(sentinel);\n }\n }\n\n structureChanged(): void {\n this.pending.clear();\n this.snapshots = this.createSnapshots();\n this.disconnectObserver();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextSnapshots = new Map<string, GroupSnapshot>();\n\n for (const group of state.groups) {\n const next = this.snapshot(group);\n const previous = this.snapshots.get(group.id);\n const pending = this.pending.get(group.id);\n\n if (!previous || previous.identity !== next.identity) {\n this.pending.delete(group.id);\n } else {\n if (next.count > previous.count) {\n this.options.announce(\n formatGroupLabel(state.rowsLoadedLabel, group, next.count - previous.count),\n );\n }\n if (!previous.error && next.error) {\n this.pending.delete(group.id);\n this.options.announce(next.error);\n }\n if (previous.hasMore && !next.hasMore) {\n this.pending.delete(group.id);\n this.options.announce(formatGroupLabel(state.endOfResultsLabel, group));\n }\n if (pending && next.count > pending.count) this.pending.delete(group.id);\n if (pending && previous.loading && !next.loading && next.count === pending.count) {\n this.pending.delete(group.id);\n }\n }\n\n nextSnapshots.set(group.id, next);\n }\n\n this.snapshots = nextSnapshots;\n for (const groupId of this.pending.keys()) {\n if (!nextSnapshots.has(groupId)) this.pending.delete(groupId);\n }\n this.disconnectObserver();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n request(groupId: string, reason: TableLoadMoreReason): void {\n const state = this.options.state();\n const group = state.groups.find(item => item.id === groupId);\n if (\n !state.enabled ||\n !group?.hasMore ||\n group.loadingMore ||\n (reason !== 'retry' && !!group.loadMoreError?.trim()) ||\n this.pending.has(groupId)\n ) return;\n\n const identity = groupIdentity(group);\n this.pending.set(groupId, { identity, count: group.rows.length });\n this.options.announce(formatGroupLabel(state.loadingMoreLabel, group));\n this.options.request({\n groupId,\n reason,\n loadIdentity: identity,\n loadedRowCount: group.rows.length,\n });\n }\n\n private createSnapshots(): Map<string, GroupSnapshot> {\n return new Map(this.options.state().groups.map(group => [group.id, this.snapshot(group)]));\n }\n\n private snapshot(group: TableGroup): GroupSnapshot {\n return {\n count: group.rows.length,\n hasMore: !!group.hasMore,\n loading: !!group.loadingMore,\n error: group.loadMoreError?.trim() ?? '',\n identity: groupIdentity(group),\n };\n }\n\n private disconnectObserver(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n }\n}\n","export interface TableFitPageSizeInput {\n viewportBlockSize: number;\n headerBlockSize: number;\n itemBlockSize: number;\n}\n\n/** Resolve how many complete top-level rows or group headers fit below the column header. */\nexport function resolveTableFitPageSize(input: TableFitPageSizeInput): number | undefined {\n if (\n !Number.isFinite(input.viewportBlockSize) ||\n !Number.isFinite(input.headerBlockSize) ||\n !Number.isFinite(input.itemBlockSize) ||\n input.viewportBlockSize <= 0 ||\n input.itemBlockSize <= 0\n ) {\n return undefined;\n }\n const availableBlockSize = Math.max(0, input.viewportBlockSize - input.headerBlockSize);\n return Math.max(1, Math.floor((availableBlockSize + 0.5) / input.itemBlockSize));\n}\n","import { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\n\nexport interface TableViewportFitMetricInput {\n scrollportBlockStart: number;\n scrollportBlockSize: number;\n hostBlockStart: number;\n insetBlockStart: number;\n insetBlockEnd: number;\n}\n\nexport interface TableViewportFitMetrics {\n reservedBlockSize: number;\n currentBlockSize: number;\n settled: boolean;\n}\n\nexport interface TableViewportFitElements {\n host: HTMLElement | null;\n surface: HTMLElement | null;\n}\n\nexport interface TableViewportFitControllerOptions {\n enabled: () => boolean;\n elements: () => TableViewportFitElements;\n insets: () => { blockStart: string | number; blockEnd: string | number };\n fitChanged: (metrics: TableViewportFitMetrics | null) => void;\n}\n\n/** Resolve the reserved compact-state height and the height currently visible. */\nexport function resolveTableViewportFitMetrics(\n input: TableViewportFitMetricInput,\n): TableViewportFitMetrics {\n const insetBlockStart = Math.max(0, input.insetBlockStart);\n const insetBlockEnd = Math.max(0, input.insetBlockEnd);\n const scrollportBlockEnd = input.scrollportBlockStart + input.scrollportBlockSize;\n const settledBlockStart = input.scrollportBlockStart + insetBlockStart;\n const reservedBlockSize = Math.max(\n 0,\n input.scrollportBlockSize - insetBlockStart - insetBlockEnd,\n );\n const currentBlockStart = Math.max(input.hostBlockStart, settledBlockStart);\n const currentBlockSize = Math.min(\n reservedBlockSize,\n Math.max(0, scrollportBlockEnd - insetBlockEnd - currentBlockStart),\n );\n\n return {\n reservedBlockSize,\n currentBlockSize,\n settled: input.hostBlockStart <= settledBlockStart + 0.5,\n };\n}\n\n/**\n * Fits the complete table chrome to its nearest vertical scrollport. The host\n * reserves its compact-state height so the outer page can consume collapsing\n * header travel without changing document height. The visible table surface\n * grows into that reservation until it reaches the supplied sticky inset.\n */\nexport class TableViewportFitController {\n private connected = false;\n private scrollRoot: HTMLElement | Window | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private metrics: TableViewportFitMetrics | null = null;\n\n constructor(private readonly options: TableViewportFitControllerOptions) {}\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectRuntime();\n this.clearGeometry();\n }\n\n refresh(): void {\n if (!this.connected) return;\n if (!this.options.enabled()) {\n this.disconnectRuntime();\n this.clearGeometry();\n return;\n }\n\n const host = this.options.elements().host;\n if (!host) return;\n const nextScrollRoot = this.findScrollRoot(host);\n if (nextScrollRoot !== this.scrollRoot) {\n this.disconnectRuntime();\n this.scrollRoot = nextScrollRoot;\n this.scrollRoot.addEventListener('scroll', this.sync, { passive: true });\n window.addEventListener('resize', this.sync, { passive: true });\n if (typeof ResizeObserver !== 'undefined' && this.scrollRoot instanceof HTMLElement) {\n this.resizeObserver = new ResizeObserver(this.sync);\n this.resizeObserver.observe(this.scrollRoot);\n }\n }\n this.sync();\n }\n\n /** Pass a fitted table's boundary wheel delta to its owning page scrollport. */\n scrollOuterBy(delta: number): boolean {\n if (!this.scrollRoot || delta === 0) return false;\n if (this.scrollRoot instanceof HTMLElement) {\n const previous = this.scrollRoot.scrollTop;\n const max = Math.max(0, this.scrollRoot.scrollHeight - this.scrollRoot.clientHeight);\n this.scrollRoot.scrollTop = Math.min(max, Math.max(0, previous + delta));\n return this.scrollRoot.scrollTop !== previous;\n }\n\n const scrollingElement = document.scrollingElement;\n const previous = window.scrollY;\n const max = Math.max(\n 0,\n (scrollingElement?.scrollHeight ?? document.documentElement.scrollHeight) -\n window.innerHeight,\n );\n const next = Math.min(max, Math.max(0, previous + delta));\n if (next !== previous) window.scrollTo({ top: next, behavior: 'auto' });\n return next !== previous;\n }\n\n private disconnectRuntime(): void {\n this.scrollRoot?.removeEventListener('scroll', this.sync);\n window.removeEventListener('resize', this.sync);\n this.scrollRoot = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n private clearGeometry(): void {\n const { host, surface } = this.options.elements();\n host?.style.removeProperty('--_table-viewport-fit-reserved-block-size');\n surface?.style.removeProperty('--_table-viewport-fit-current-block-size');\n if (this.metrics !== null) {\n this.metrics = null;\n this.options.fitChanged(null);\n }\n }\n\n private readonly sync = (): void => {\n if (!this.connected || !this.options.enabled() || !this.scrollRoot) return;\n const { host, surface } = this.options.elements();\n if (!host || !surface) return;\n\n const hostRect = host.getBoundingClientRect();\n const scrollportRect = this.scrollRoot instanceof HTMLElement\n ? this.scrollRoot.getBoundingClientRect()\n : { top: 0, height: window.innerHeight };\n const insets = this.options.insets();\n const next = resolveTableViewportFitMetrics({\n scrollportBlockStart: scrollportRect.top,\n scrollportBlockSize: scrollportRect.height,\n hostBlockStart: hostRect.top,\n insetBlockStart: resolveCssLengthPx(insets.blockStart, 0, host),\n insetBlockEnd: resolveCssLengthPx(insets.blockEnd, 0, host),\n });\n\n this.setProperty(\n host,\n '--_table-viewport-fit-reserved-block-size',\n `${next.reservedBlockSize}px`,\n );\n this.setProperty(\n surface,\n '--_table-viewport-fit-current-block-size',\n `${next.currentBlockSize}px`,\n );\n if (\n !this.metrics ||\n this.metrics.reservedBlockSize !== next.reservedBlockSize ||\n this.metrics.currentBlockSize !== next.currentBlockSize ||\n this.metrics.settled !== next.settled\n ) {\n this.metrics = next;\n this.options.fitChanged(next);\n }\n };\n\n private findScrollRoot(host: HTMLElement): HTMLElement | Window {\n let ancestor = this.composedParent(host);\n while (ancestor && ancestor !== document.documentElement) {\n const overflow = getComputedStyle(ancestor).overflowY;\n if (overflow === 'auto' || overflow === 'scroll' || overflow === 'overlay') {\n return ancestor as HTMLElement;\n }\n ancestor = this.composedParent(ancestor);\n }\n return window;\n }\n\n private composedParent(element: Element): Element | null {\n return (element as HTMLElement).assignedSlot?.parentElement ?? element.parentElement;\n }\n\n private setProperty(element: HTMLElement, property: string, value: string): void {\n if (element.style.getPropertyValue(property) !== value) {\n element.style.setProperty(property, value);\n }\n }\n}\n","@import './forced-colors.css';\n\n:host {\n --ds-focus-ring-width: var(--dimension-stroke-width-025, 2px);\n --ds-focus-ring-offset: var(--dimension-space-025, 2px);\n --ds-focus-ring-color: var(--color-interaction-focus);\n}\n\n:host(.ds-focus-ring),\n.ds-focus-ring,\n:host(.ds-focus-ring-inset),\n.ds-focus-ring-inset {\n outline: none;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n}\n\n:host(.ds-focus-ring:focus-visible),\n.ds-focus-ring:focus-visible {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: var(--ds-focus-ring-offset);\n}\n\n:host(.ds-focus-ring.ds-focus-ring--visible),\n.ds-focus-ring.ds-focus-ring--visible {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: var(--ds-focus-ring-offset);\n}\n\n:host(.ds-focus-ring-inset:focus-visible),\n.ds-focus-ring-inset:focus-visible {\n outline: none;\n}\n\n:host(.ds-focus-ring-inset:focus-visible)::after,\n.ds-focus-ring-inset:focus-visible::after {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: calc(-1 * var(--ds-focus-ring-width));\n}\n\n:host(.ds-focus-ring-inset.ds-focus-ring--visible),\n.ds-focus-ring-inset.ds-focus-ring--visible {\n outline: none;\n}\n\n:host(.ds-focus-ring-inset.ds-focus-ring--visible)::after,\n.ds-focus-ring-inset.ds-focus-ring--visible::after {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: calc(-1 * var(--ds-focus-ring-width));\n}\n\n@media (forced-colors: active) {\n :host {\n --ds-focus-ring-color: var(--ds-forced-color-selected);\n }\n}\n","@import './forced-colors.css';\n\n/**\n * Interaction fill — selected (`::before`) + hover/press (`::after`) overlays.\n *\n * Paint translucent interaction tokens *over* the control’s own background —\n * never by swapping `background-color` on `:hover` / `:active`, and never via\n * `color-mix(bg, fg)` for control chrome.\n *\n * Paint order (bottom → top):\n * 1. Element background (intent / surface)\n * 2. `::before` — selected / active (opt-in via `.ds-interaction-fill--selected`)\n * 3. Label / icon / badge content (`.ds-interaction-fill__content` or z-index: 2)\n * 4. `::after` — hover / press wash + optional inset border + inset focus ring\n *\n * Apply `.ds-interaction-fill` on the interactive element (host or inner row).\n * Omit `.ds-interaction-fill--selected` when chrome wants icon-color-only\n * selection (`activeFill={false}` on unfilled icon buttons).\n *\n * Fills use positive z-index so they paint *above* an opaque host background\n * (Chip, ButtonFilled). Content sits under the hover wash so badge dots are\n * covered; raise label/icon with `.ds-interaction-fill__content` (z-index: 2)\n * — never above `::after` (z-index: 3).\n *\n * Inset borders must paint on `::after` (not the element’s own `box-shadow`)\n * so the stroke stays visible above selected / hover washes. Set\n * `--ds-interaction-border-*` or use `.ds-interaction-fill--bordered`.\n * Do not use a layout `border` on interaction targets.\n *\n * If the control uses `all: unset`, re-assert `position: relative; z-index: 0`\n * after the unset so this util’s stacking context still applies.\n *\n * Surface helpers remap tokens + `--ds-focus-ring-color`:\n * `.ds-interaction-fill--on-faint|medium|bold|strong|translucent|inverted|media|always-dark|navigation`\n *\n * Override hooks: `--ds-interaction-hover`, `--ds-interaction-pressed`,\n * `--ds-interaction-active`, `--ds-interaction-border-color`,\n * `--ds-interaction-border-width`, `--ds-interaction-divider-color`, and\n * `--ds-interaction-divider-width`, plus the corresponding inline-start/end\n * divider hooks.\n *\n * @see AGENTS.md — \"Interaction fill\"\n */\n\n:host(.ds-interaction-fill),\n.ds-interaction-fill {\n position: var(--ds-interaction-position, relative);\n z-index: var(--ds-interaction-z-index, 0);\n cursor: default;\n --ds-interaction-hover: var(--color-interaction-hover);\n --ds-interaction-pressed: var(--color-interaction-pressed);\n --ds-interaction-active: var(--color-interaction-active-brand);\n /* Inset stroke on ::after — default off (transparent / zero width). */\n --ds-interaction-border-width: 0px;\n --ds-interaction-border-color: transparent;\n --ds-interaction-divider-width: 0px;\n --ds-interaction-divider-color: transparent;\n --ds-interaction-divider-inline-start-width: 0px;\n --ds-interaction-divider-inline-start-color: transparent;\n --ds-interaction-divider-inline-end-width: 0px;\n --ds-interaction-divider-inline-end-color: transparent;\n}\n\n:host(.ds-interaction-fill)::before,\n.ds-interaction-fill::before,\n:host(.ds-interaction-fill)::after,\n.ds-interaction-fill::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: transparent;\n pointer-events: none;\n cursor: inherit;\n transition: none;\n}\n\n/* Layer stack (bottom → top): selected → content → hover/press + border (topmost). */\n:host(.ds-interaction-fill)::before,\n.ds-interaction-fill::before {\n z-index: 1;\n}\n\n:host(.ds-interaction-fill)::after,\n.ds-interaction-fill::after {\n z-index: 3;\n /* Border above selected (::before) and this pseudo’s own hover wash. */\n box-shadow:\n inset 0 calc(-1 * var(--ds-interaction-divider-width)) 0 var(--ds-interaction-divider-color),\n inset var(--ds-interaction-divider-inline-start-width) 0 0\n var(--ds-interaction-divider-inline-start-color),\n inset calc(-1 * var(--ds-interaction-divider-inline-end-width)) 0 0\n var(--ds-interaction-divider-inline-end-color),\n inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Opt-in secondary inset border (override color via `--ds-interaction-border-color`). */\n:host(.ds-interaction-fill--bordered),\n.ds-interaction-fill--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--color-border-secondary);\n}\n\n:host(.ds-interaction-fill--selected)::before,\n.ds-interaction-fill--selected::before {\n background: var(--ds-interaction-active);\n}\n\n/*\n * Notification-dot halo: when selected fill is on, set `--ds-interaction-dot-ring`\n * to the active wash so rings can match. Prefer also remapping the consumer’s\n * surface ring token (e.g. `--ds-button-unfilled-dot-ring`) or passing\n * `background=\"var(--ds-interaction-active)\"` from the parent when selected —\n * custom-property fallbacks through nested scoped hosts are easy to miss.\n * Omit `--selected` (chrome `activeFill={false}`) to keep the surface ring.\n */\n:host(.ds-interaction-fill--selected),\n.ds-interaction-fill--selected {\n --ds-interaction-dot-ring: var(--ds-interaction-active);\n}\n\n/*\n * Touch browsers can latch :hover after a tap. Only hover-capable fine\n * pointers receive the hover wash; touch still receives :active press feedback.\n */\n@media (hover: hover) and (pointer: fine) {\n :host(.ds-interaction-fill:hover:not(:disabled))::after,\n .ds-interaction-fill:hover:not(:disabled)::after {\n background: var(--ds-interaction-hover);\n }\n}\n\n:host(.ds-interaction-fill:active:not(:disabled))::after,\n.ds-interaction-fill:active:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* A parent row/list may coordinate one fill across several sibling targets. */\n:host(.ds-interaction-fill--grouped)::after,\n.ds-interaction-fill--grouped::after,\n:host(.ds-interaction-fill--grouped:active:not(:disabled))::after,\n.ds-interaction-fill--grouped:active:not(:disabled)::after {\n background: var(--ds-interaction-group-fill, transparent);\n}\n\n@media (hover: hover) and (pointer: fine) {\n :host(.ds-interaction-fill--grouped:hover:not(:disabled))::after,\n .ds-interaction-fill--grouped:hover:not(:disabled)::after {\n background: var(--ds-interaction-group-fill, transparent);\n }\n}\n\n:host(.ds-interaction-fill--grouped),\n.ds-interaction-fill--grouped {\n --ds-interaction-divider-width: var(--ds-interaction-group-divider-width, 0px);\n --ds-interaction-divider-color: var(--ds-interaction-group-divider-color, transparent);\n --ds-interaction-divider-inline-start-width: var(\n --ds-interaction-group-divider-inline-start-width,\n 0px\n );\n --ds-interaction-divider-inline-start-color: var(\n --ds-interaction-group-divider-inline-start-color,\n transparent\n );\n --ds-interaction-divider-inline-end-width: var(\n --ds-interaction-group-divider-inline-end-width,\n 0px\n );\n --ds-interaction-divider-inline-end-color: var(\n --ds-interaction-group-divider-inline-end-color,\n transparent\n );\n}\n\n/* Content under the hover wash (so badge dots are covered by ::after). */\n:host(.ds-interaction-fill) > .ds-interaction-fill__content,\n.ds-interaction-fill > .ds-interaction-fill__content,\n.ds-interaction-fill__content {\n position: relative;\n z-index: 2;\n cursor: inherit;\n}\n\n/* ── Surface context ─────────────────────────────────────────────────────── */\n\n:host(.ds-interaction-fill--on-faint),\n.ds-interaction-fill--on-faint {\n --ds-interaction-active: var(--color-interaction-active);\n}\n\n:host(.ds-interaction-fill--on-medium),\n.ds-interaction-fill--on-medium {\n --ds-interaction-hover: var(--color-interaction-on-medium-background-hover);\n --ds-interaction-pressed: var(--color-interaction-on-medium-background-pressed);\n --ds-interaction-active: var(--color-interaction-on-medium-background-active);\n --ds-focus-ring-color: var(--color-interaction-on-medium-background-focus);\n}\n\n:host(.ds-interaction-fill--on-bold),\n.ds-interaction-fill--on-bold {\n --ds-interaction-hover: var(--color-interaction-on-bold-background-hover);\n --ds-interaction-pressed: var(--color-interaction-on-bold-background-pressed);\n --ds-interaction-active: var(--color-interaction-on-bold-background-active);\n --ds-focus-ring-color: var(--color-interaction-on-bold-background-focus);\n}\n\n:host(.ds-interaction-fill--on-strong),\n.ds-interaction-fill--on-strong {\n --ds-interaction-hover: var(--color-interaction-on-strong-background-hover);\n --ds-interaction-pressed: var(--color-interaction-on-strong-background-pressed);\n --ds-interaction-active: var(--color-interaction-on-strong-background-active);\n --ds-focus-ring-color: var(--color-interaction-on-strong-background-focus);\n}\n\n:host(.ds-interaction-fill--on-translucent),\n.ds-interaction-fill--on-translucent {\n --ds-interaction-hover: var(--color-translucent-interaction-hover);\n --ds-interaction-pressed: var(--color-translucent-interaction-pressed);\n --ds-interaction-active: var(--color-translucent-interaction-active-brand);\n --ds-focus-ring-color: var(--color-translucent-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-inverted),\n.ds-interaction-fill--on-inverted {\n --ds-interaction-hover: var(--color-inverted-interaction-hover);\n --ds-interaction-pressed: var(--color-inverted-interaction-pressed);\n --ds-interaction-active: var(--color-inverted-interaction-active-brand);\n --ds-focus-ring-color: var(--color-inverted-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-media),\n.ds-interaction-fill--on-media {\n --ds-interaction-hover: var(--color-media-interaction-hover);\n --ds-interaction-pressed: var(--color-media-interaction-pressed);\n --ds-interaction-active: var(--color-media-interaction-active);\n --ds-focus-ring-color: var(--color-media-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-always-dark),\n.ds-interaction-fill--on-always-dark {\n --ds-interaction-hover: var(--color-always-dark-interaction-hover);\n --ds-interaction-pressed: var(--color-always-dark-interaction-pressed);\n --ds-interaction-active: var(--color-always-dark-interaction-active-brand);\n --ds-focus-ring-color: var(--color-always-dark-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-navigation),\n.ds-interaction-fill--on-navigation {\n --ds-interaction-hover: var(--color-navigation-interaction-hover);\n --ds-interaction-pressed: var(--color-navigation-interaction-pressed);\n --ds-interaction-active: var(--color-navigation-interaction-active);\n --ds-focus-ring-color: var(--color-navigation-interaction-focus);\n}\n\n@media (forced-colors: active) {\n /*\n * Forced-colors removes box-shadows and remaps translucent fills. Restore\n * boundaries with outlines and make selection a non-color-only inset ring.\n * Focus-ring selectors remain more specific and replace this outline while\n * keyboard focus is visible.\n */\n :host(.ds-interaction-fill)::after,\n .ds-interaction-fill::after {\n box-shadow: none;\n outline:\n var(--ds-interaction-border-width) solid\n var(--ds-forced-color-control-boundary);\n outline-offset: calc(-1 * var(--ds-interaction-border-width));\n }\n\n :host(.ds-interaction-fill--selected)::before,\n .ds-interaction-fill--selected::before {\n background: transparent;\n outline: var(--dimension-stroke-width-025) solid var(--ds-forced-color-selected);\n outline-offset: calc(-1 * var(--dimension-stroke-width-025));\n }\n}\n\n@media (forced-colors: active) and (hover: hover) and (pointer: fine) {\n :host(.ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible))::after,\n .ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible)::after {\n outline-color: var(--ds-forced-color-selected);\n outline-width: var(--dimension-stroke-width-012);\n }\n}\n","@import '../../styles/table.css';\n@import '../../styles/control-elevation.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/control-density.css';\n\n:host {\n display: block;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n}\n\n:host(.table-host--bounded) {\n min-block-size: 0;\n}\n\n:host(.table-host--fixed-height) {\n block-size: var(--_table-fixed-block-size);\n}\n\n:host(.table-host--viewport-fit) {\n block-size: var(--_table-viewport-fit-reserved-block-size, auto);\n min-block-size: var(--_table-viewport-fit-reserved-block-size, auto);\n}\n\n/*\n * The public table recipe stays at zero specificity for product-owned native\n * markup. Inside the component, these classes sit on ds-text hosts whose reset\n * intentionally owns display, padding, and border with higher specificity.\n * Reassert only those collided properties so component geometry cannot depend\n * on whether ds-text or ds-table happens to hydrate first.\n */\nds-text.ds-table__header-label-box {\n padding-inline: var(--dimension-space-025);\n}\n\nds-text.ds-table__cell-track {\n display: flex;\n}\n\nds-text.ds-table__cell-track--text {\n padding-inline: var(--_table-cell-track-label-inset);\n}\n\nds-text.ds-table__cell-secondary {\n padding-block: var(--dimension-space-025);\n}\n\n.ds-table__cell--primary-text ds-text.ds-table__cell-secondary {\n padding-block: 0;\n}\n\n.ds-table__cell-tag-stack--tag-with-text ds-text.ds-table__cell-tag-text {\n padding-inline: var(--_table-cell-track-padding-inline);\n padding-block: var(--dimension-space-025);\n}\n\n.ds-table__cell-tag-stack--text-with-tag ds-text.ds-table__cell-tag-text {\n padding-inline: var(--_table-cell-track-label-inset);\n}\n\nds-text.ds-table__load-content {\n display: inline-flex;\n}\n\nds-text.ds-table__bar-text {\n display: inline-flex;\n width: auto;\n max-width: 100%;\n padding-inline: var(--ds-control-label-inset, var(--dimension-space-025));\n}\n\nds-text.ds-table__footer-summary {\n margin-inline-start: auto;\n}\n\n.ds-table__bar-trailing ds-pagination {\n max-inline-size: 100%;\n}\n\n.ds-table__bar-status slot::slotted(*) {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n}\n\nds-skeleton.ds-table__skeleton-image-shape {\n display: flex;\n width: 100%;\n height: 100%;\n --ds-control-height: 100%;\n}\n\nds-skeleton.ds-table__skeleton-checkbox {\n --ds-control-height: var(--dimension-iconography-sm);\n}\n\n.ds-table__skeleton-checkbox-canvas {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--dimension-iconography-md);\n block-size: var(--dimension-iconography-md);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n deriveTableSelectionState,\n formatTableResultSummary,\n nextTableSortState,\n tableColumnSize,\n tableModelIssues,\n tableRows,\n tableRowSelectionLabel,\n toggleAllLoadedTableRows,\n toggleTableGroupCollapsed,\n toggleTableGroupSelection,\n nextTableGroupsCollapsed,\n toggleTableRowSelection,\n} from './table-model';\nimport {\n resolveTableCellPresentation,\n type TableCellPresentation,\n} from './table-cell-model';\nimport {\n createTableRenderModel,\n type TableRenderModel,\n} from './table-render-model';\nimport { TableLayoutController } from './table-layout-controller';\nimport { TableLoadController } from './table-load-controller';\nimport { TableGroupLoadController } from './table-group-load-controller';\nimport type { PaginationChangeDetail } from '../Pagination/pagination-types';\nimport { resolvePaginationState } from '../Pagination/pagination-model';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport { resolveTableFitPageSize } from './table-pagination-fit';\nimport {\n TableViewportFitController,\n type TableViewportFitMetrics,\n} from './table-viewport-fit-controller';\nimport type {\n TableCaptionVisibility,\n TableCellActionDetail,\n TableCellSkeleton,\n TableColumn,\n TableDataMode,\n TableGroup,\n TableGroupCollapseChangeDetail,\n TableGroupLoadMoreDetail,\n TableGroupingState,\n TableLoadMoreDetail,\n TableLoadMoreMode,\n TablePaginationState,\n TableRow,\n TableRowActivateDetail,\n TableSelectionChangeDetail,\n TableSelectionMode,\n TableSortChangeDetail,\n TableSortState,\n} from './table-types';\n\n@Component({\n tag: 'ds-table',\n styleUrls: [\n '../../utils/focus-ring.css',\n '../../utils/interaction-fill.css',\n 'Table.css',\n ],\n scoped: true,\n})\nexport class Table {\n @Element() el!: HTMLElement;\n /** Stable column definitions. Assign through JavaScript. */\n @Prop() columns: TableColumn[] = [];\n /** Ungrouped row data. Ignored while grouping is active. Assign through JavaScript. */\n @Prop() rows: TableRow[] = [];\n /** One level of application-owned grouped data. Assign through JavaScript. */\n @Prop() groups: TableGroup[] = [];\n /** Controlled grouping column. Applications supply groups in their final fixed order. */\n @Prop() grouping: TableGroupingState | null = null;\n /** Controlled member-row sort state. */\n @Prop() sort: TableSortState | null = null;\n /** Controlled collapsed group identities. Groups not listed remain expanded. */\n @Prop() collapsedGroupIds: string[] = [];\n\n /** Required accessible table name, retained as a native caption. */\n @Prop() caption!: string;\n /** Shows a matching presentational title bar above the native table frame. */\n @Prop() captionVisibility: TableCaptionVisibility = 'hidden';\n /**\n * Optional result summary footer. When both `displayedCount` and `totalCount`\n * are finite numbers, the table shows “Displaying {displayed} of {total}”.\n */\n @Prop() displayedCount: number | undefined;\n @Prop() totalCount: number | undefined;\n /** Supports {displayed} and {total} placeholders. */\n @Prop() resultSummaryLabel: string = 'Displaying {displayed} of {total}';\n @Prop() stickyHeader: boolean = false;\n /** Maximum scroll-region height. Numbers resolve to CSS pixels. */\n @Prop() maxHeight: string | number | undefined;\n /** Fixed height for the complete header, table frame, and footer composition. */\n @Prop() height: string | number | undefined;\n /** Fit the complete table composition to its nearest vertical scrollport. */\n @Prop() fitViewport: boolean = false;\n /** Reserved space above a viewport-fitted table once surrounding chrome is compact. */\n @Prop() viewportInsetBlockStart: string | number = 0;\n /** Reserved space below a viewport-fitted table. */\n @Prop() viewportInsetBlockEnd: string | number = 0;\n /** Optional explicit label for the horizontal/vertical scroll region. */\n @Prop() scrollLabel: string | undefined;\n\n @Prop() selectionMode: TableSelectionMode = 'none';\n /** Controlled selected row identities. IDs outside the loaded rows are preserved. */\n @Prop() selectedRowIds: string[] = [];\n\n /** Initial loading state. Existing rows stay visible; incremental loading uses loadingMore. */\n @Prop() loading: boolean = false;\n /** Initial-loading rows. Defaults to ten so bounded tables retain a useful filled viewport. */\n @Prop() skeletonRows: number = 10;\n @Prop() emptyHeading: string = 'No results';\n @Prop() emptyBody: string = 'No data is available.';\n /** Initial error state. Existing rows stay visible; incremental failures use loadMoreError. */\n @Prop() error: boolean = false;\n @Prop() errorHeading: string = 'Unable to load data';\n @Prop() errorBody: string = 'The data could not be loaded.';\n @Prop() emptyCellLabel: string = 'Not available';\n\n /** Top-level data-window strategy. Group member loading remains group-owned. */\n @Prop() dataMode: TableDataMode = 'infinite';\n /** Controlled top-level pagination state. Required when dataMode is pagination. */\n @Prop() pagination: TablePaginationState | null = null;\n @Prop() loadMoreMode: TableLoadMoreMode = 'auto';\n @Prop() hasMore: boolean = false;\n @Prop() loadingMore: boolean = false;\n @Prop() loadMoreError: string | undefined;\n /** Reset key for a new query/group/sort dataset. */\n @Prop() loadIdentity: string | number = 'default';\n /** IntersectionObserver root margin in CSS pixels. */\n @Prop() loadMoreThreshold: number = 0;\n @Prop() loadMoreLabel: string = 'Load more';\n @Prop() retryLabel: string = 'Retry';\n @Prop() loadingMoreLabel: string = 'Loading more items';\n @Prop() endOfResultsLabel: string = 'All results loaded';\n /** Supports {count} and {total} placeholders. */\n @Prop() rowsLoadedLabel: string = '{count} more rows loaded. {total} rows loaded.';\n @Prop() groupLoadMoreLabel: string = 'Load more';\n /** Supports the {group} placeholder. */\n @Prop() groupLoadMoreAriaLabel: string = 'Load more {group} results';\n /** Supports the {group} placeholder. */\n @Prop() groupRetryLabel: string = 'Retry loading {group} results';\n /** Supports the {group} placeholder. */\n @Prop() groupLoadingMoreLabel: string = 'Loading more items';\n /** Supports the {group} placeholder. */\n @Prop() groupEndOfResultsLabel: string = 'All {group} results loaded';\n /** Supports {group}, {count}, {loaded}, and {total} placeholders. */\n @Prop() groupRowsLoadedLabel: string = '{count} more rows loaded in {group}. {loaded} of {total} rows loaded.';\n\n @Event() dsSortChange!: EventEmitter<TableSortChangeDetail>;\n @Event() dsGroupCollapseChange!: EventEmitter<TableGroupCollapseChangeDetail>;\n @Event() dsSelectionChange!: EventEmitter<TableSelectionChangeDetail>;\n @Event() dsLoadMore!: EventEmitter<TableLoadMoreDetail>;\n @Event() dsGroupLoadMore!: EventEmitter<TableGroupLoadMoreDetail>;\n @Event() dsPaginationChange!: EventEmitter<PaginationChangeDetail>;\n @Event() dsCellAction!: EventEmitter<TableCellActionDetail>;\n @Event() dsRowActivate!: EventEmitter<TableRowActivateDetail>;\n\n @State() private overflowStart = false;\n @State() private overflowEnd = false;\n @State() private scrollable = false;\n @State() private announcement = '';\n @State() private activeStickyGroupId: string | null = null;\n @State() private viewportFitSettled = false;\n @State() private headerPresent = false;\n @State() private fitPageSize: number | undefined;\n\n private rootEl: HTMLElement | null = null;\n private viewportEl: HTMLElement | null = null;\n private frameEl: HTMLElement | null = null;\n private interactiveHeadEl: HTMLTableSectionElement | null = null;\n private collapseAllOverlayEl: HTMLElement | null = null;\n private stickyHeaderTableEl: HTMLTableElement | null = null;\n private tableEl: HTMLTableElement | null = null;\n private sentinelEl: HTMLElement | null = null;\n private incrementalWindowActive = false;\n private readonly groupSentinelEls = new Map<string, HTMLElement>();\n private previousModelWarning = '';\n private hasLoaded = false;\n private renderedModel: TableRenderModel | null = null;\n private stickyGroupConnected = false;\n private headerSlotObserver: MutationObserver | null = null;\n private fitResizeObserver: ResizeObserver | null = null;\n private fitObservedViewport: HTMLElement | null = null;\n private fitObservedTable: HTMLTableElement | null = null;\n private fitMeasurementPending = false;\n private readonly layoutController = new TableLayoutController({\n elements: () => ({\n viewport: this.viewportEl,\n stickyHeaderTable: this.stickyHeaderTableEl,\n collapseAllOverlay: this.collapseAllOverlayEl,\n frame: this.frameEl,\n interactiveHead: this.interactiveHeadEl,\n }),\n mode: () => ({\n documentStickyHeader: this.documentStickyHeader,\n floatingCollapseAll: this.renderedModel?.collapseAllHost?.mode === 'floating',\n clampVerticalOverscroll: this.fitViewport && this.viewportFitSettled,\n }),\n verticalEdgeWheel: deltaY => this.viewportFitController.scrollOuterBy(deltaY),\n overflowChanged: state => {\n if (state.start !== this.overflowStart) this.overflowStart = state.start;\n if (state.end !== this.overflowEnd) this.overflowEnd = state.end;\n if (state.scrollable !== this.scrollable) this.scrollable = state.scrollable;\n },\n });\n private readonly loadController = new TableLoadController({\n state: () => ({\n lazyLoading: this.dataMode === 'infinite' && !this.grouped,\n loadMoreMode: this.loadMoreMode,\n hasMore: this.hasMore,\n loadingMore: this.loadingMore,\n loadMoreError: this.loadMoreError,\n loadIdentity: this.loadIdentity,\n loadMoreThreshold: this.loadMoreThreshold,\n containedScroll: this.containedScroll,\n loadingMoreLabel: this.loadingMoreLabel,\n endOfResultsLabel: this.endOfResultsLabel,\n rowsLoadedLabel: this.rowsLoadedLabel,\n loadedRowCount: this.currentLoadedRowCount(),\n viewport: this.viewportEl,\n sentinel: this.sentinelEl,\n }),\n announce: message => {\n this.announcement = message;\n },\n request: detail => {\n this.dsLoadMore.emit(detail);\n },\n });\n private readonly groupLoadController = new TableGroupLoadController({\n state: () => ({\n enabled: this.grouped,\n loadMoreMode: this.loadMoreMode,\n loadMoreThreshold: this.loadMoreThreshold,\n containedScroll: this.containedScroll,\n groups: this.groups,\n viewport: this.viewportEl,\n sentinels: this.groupSentinelEls,\n loadingMoreLabel: this.groupLoadingMoreLabel,\n endOfResultsLabel: this.groupEndOfResultsLabel,\n rowsLoadedLabel: this.groupRowsLoadedLabel,\n }),\n announce: message => {\n this.announcement = message;\n },\n request: detail => {\n this.dsGroupLoadMore.emit(detail);\n },\n });\n private readonly viewportFitController = new TableViewportFitController({\n enabled: () => this.fitViewport,\n elements: () => ({ host: this.el, surface: this.rootEl }),\n insets: () => ({\n blockStart: this.viewportInsetBlockStart,\n blockEnd: this.viewportInsetBlockEnd,\n }),\n fitChanged: (metrics: TableViewportFitMetrics | null) => {\n const settled = metrics?.settled ?? false;\n if (settled !== this.viewportFitSettled) this.viewportFitSettled = settled;\n },\n });\n\n componentWillLoad(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.syncHeaderSlotPresence();\n this.loadController.initialize();\n this.groupLoadController.initialize();\n this.warnModelIssues();\n }\n\n componentDidLoad(): void {\n this.hasLoaded = true;\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFitObserver();\n this.syncFitPageSize();\n }\n\n componentDidRender(): void {\n this.layoutController.refresh();\n this.loadController.refresh();\n this.groupLoadController.refresh();\n this.viewportFitController.refresh();\n this.syncStickyGroupConnection();\n this.connectFitObserver();\n this.syncFitPageSize();\n if (this.stickyGroupConnected) this.updateStickyGroup();\n }\n\n connectedCallback(): void {\n if (!this.hasLoaded) return;\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFitObserver();\n }\n\n disconnectedCallback(): void {\n this.layoutController.disconnect();\n this.loadController.disconnect();\n this.groupLoadController.disconnect();\n this.viewportFitController.disconnect();\n this.disconnectStickyGroup();\n this.headerSlotObserver?.disconnect();\n this.headerSlotObserver = null;\n this.disconnectFitObserver();\n }\n\n private syncHeaderSlotPresence = () => {\n this.headerPresent = !!this.el.querySelector('[slot=\"header\"]');\n };\n\n private connectHeaderSlotObserver(): void {\n if (this.headerSlotObserver || typeof MutationObserver === 'undefined') return;\n this.headerSlotObserver = new MutationObserver(this.syncHeaderSlotPresence);\n this.headerSlotObserver.observe(this.el, { childList: true });\n this.syncHeaderSlotPresence();\n }\n\n private connectStickyGroup(): void {\n if (this.stickyGroupConnected || typeof window === 'undefined') return;\n this.stickyGroupConnected = true;\n document.addEventListener('scroll', this.updateStickyGroup, {\n capture: true,\n passive: true,\n });\n window.addEventListener('resize', this.updateStickyGroup, { passive: true });\n this.updateStickyGroup();\n }\n\n private syncStickyGroupConnection(): void {\n if (this.documentStickyHeader && this.grouped) {\n this.connectStickyGroup();\n return;\n }\n\n this.disconnectStickyGroup();\n this.frameEl?.style.removeProperty('--_table-sticky-group-top');\n if (this.activeStickyGroupId !== null) {\n this.activeStickyGroupId = null;\n }\n }\n\n private disconnectStickyGroup(): void {\n if (!this.stickyGroupConnected || typeof window === 'undefined') return;\n this.stickyGroupConnected = false;\n document.removeEventListener('scroll', this.updateStickyGroup, true);\n window.removeEventListener('resize', this.updateStickyGroup);\n }\n\n private readonly updateStickyGroup = (): void => {\n if (!this.documentStickyHeader || !this.grouped || !this.frameEl || !this.tableEl) {\n if (this.activeStickyGroupId !== null) this.activeStickyGroupId = null;\n return;\n }\n\n const stickyHeader = this.frameEl.querySelector<HTMLElement>(\n '.ds-table__document-sticky-header',\n );\n if (!stickyHeader) return;\n const threshold = stickyHeader.getBoundingClientRect().bottom;\n let activeGroupId: string | null = null;\n let activeGroupTop = threshold;\n for (const body of this.tableEl.querySelectorAll<HTMLElement>('tbody[data-group-id]')) {\n const source = body.querySelector<HTMLElement>('.ds-table__group-cell');\n if (!source) continue;\n const sourceRect = source.getBoundingClientRect();\n const bodyRect = body.getBoundingClientRect();\n if (sourceRect.top <= threshold && bodyRect.bottom > threshold) {\n activeGroupId = body.dataset.groupId ?? null;\n // A sticky section is bounded by its own row group. As that boundary\n // approaches the sticky lane, move the outgoing section bar with it so\n // the incoming source bar pushes it away instead of rendering beneath it.\n activeGroupTop = Math.min(threshold, bodyRect.bottom - sourceRect.height);\n }\n }\n\n const frameRect = this.frameEl.getBoundingClientRect();\n this.frameEl.style.setProperty(\n '--_table-sticky-group-top',\n `${activeGroupTop - frameRect.top}px`,\n );\n\n if (activeGroupId !== this.activeStickyGroupId) {\n this.activeStickyGroupId = activeGroupId;\n return;\n }\n };\n\n @Watch('columns')\n @Watch('grouping')\n handleStructureChange(): void {\n this.warnModelIssues();\n this.loadController.structureChanged();\n this.groupLoadController.structureChanged();\n }\n\n @Watch('rows')\n @Watch('groups')\n handleDataChange(): void {\n if (this.grouped) this.groupLoadController.dataChanged();\n else this.loadController.dataChanged();\n this.warnModelIssues();\n }\n\n @Watch('loadIdentity')\n handleLoadIdentityChange(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.loadController.identityChanged();\n }\n\n @Watch('loadMoreMode')\n @Watch('loadMoreThreshold')\n handleLazyConfigurationChange(): void {\n this.loadController.configurationChanged();\n this.groupLoadController.configurationChanged();\n }\n\n @Watch('dataMode')\n handleDataModeChange(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.handleLazyConfigurationChange();\n }\n\n @Watch('pagination')\n handlePaginationChange(\n pagination: TablePaginationState | null,\n previous: TablePaginationState | null,\n ): void {\n if (\n pagination?.pageSizeMode === 'fit' &&\n pagination.fitIdentity !== previous?.fitIdentity\n ) {\n this.fitMeasurementPending = true;\n }\n }\n\n @Watch('loadingMore')\n handleLoadingMoreChange(loading: boolean): void {\n if (loading) this.incrementalWindowActive = true;\n if (!this.grouped) this.loadController.loadingChanged(loading);\n }\n\n @Watch('loadMoreError')\n handleLoadMoreErrorChange(error: string | undefined): void {\n if (error?.trim()) this.incrementalWindowActive = true;\n if (!this.grouped) this.loadController.errorChanged(error);\n }\n\n @Watch('hasMore')\n handleHasMoreChange(hasMore: boolean, hadMore: boolean): void {\n if (hasMore) this.incrementalWindowActive = true;\n if (!this.grouped) this.loadController.hasMoreChanged(hasMore, hadMore);\n }\n\n private get grouped(): boolean {\n return this.grouping !== null;\n }\n\n private get hasIncrementalState(): boolean {\n return this.dataMode === 'infinite' &&\n (this.hasMore || this.loadingMore || !!this.loadMoreError?.trim());\n }\n\n private get selectable(): boolean {\n return this.selectionMode === 'multiple';\n }\n\n private get documentStickyHeader(): boolean {\n return this.stickyHeader && !this.containedScroll;\n }\n\n private get fixedHeight(): boolean {\n return !this.fitViewport && this.resolvedHeight !== undefined;\n }\n\n private get boundedComposition(): boolean {\n return this.fitViewport || this.fixedHeight;\n }\n\n private get containedScroll(): boolean {\n return this.boundedComposition || this.resolvedMaxHeight !== undefined;\n }\n\n private connectFitObserver(): void {\n if (typeof ResizeObserver === 'undefined') return;\n if (this.fitObservedViewport === this.viewportEl && this.fitObservedTable === this.tableEl) {\n return;\n }\n this.disconnectFitObserver();\n this.fitObservedViewport = this.viewportEl;\n this.fitObservedTable = this.tableEl;\n this.fitResizeObserver = new ResizeObserver(this.syncFitPageSize);\n if (this.fitObservedViewport) this.fitResizeObserver.observe(this.fitObservedViewport);\n if (this.fitObservedTable) this.fitResizeObserver.observe(this.fitObservedTable);\n }\n\n private disconnectFitObserver(): void {\n this.fitResizeObserver?.disconnect();\n this.fitResizeObserver = null;\n this.fitObservedViewport = null;\n this.fitObservedTable = null;\n }\n\n private readonly syncFitPageSize = (): void => {\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (!pagination?.fitToPage || !this.containedScroll || !this.viewportEl || !this.tableEl) {\n if (this.fitPageSize !== undefined) this.fitPageSize = undefined;\n this.fitMeasurementPending = false;\n return;\n }\n const header = this.tableEl.querySelector<HTMLElement>(\n '.ds-table__head .ds-table__header-row',\n );\n const item = this.tableEl.querySelector<HTMLElement>(\n this.grouped ? '.ds-table__group-row' : '.ds-table__body .ds-table__row',\n );\n const itemBlockSize = item?.getBoundingClientRect().height || resolveCssLengthPx(\n 'var(--ds-table-row-min-block-size, var(--dimension-size-500))',\n 0,\n this.rootEl ?? this.el,\n );\n const next = resolveTableFitPageSize({\n viewportBlockSize: this.viewportEl.clientHeight,\n headerBlockSize: header?.getBoundingClientRect().height ?? 0,\n itemBlockSize,\n });\n if (next !== this.fitPageSize) this.fitPageSize = next;\n if (!this.fitMeasurementPending || pagination.pageSizeMode !== 'fit' || next === undefined) {\n return;\n }\n this.fitMeasurementPending = false;\n if (next === pagination.pageSize && pagination.pageIndex === 0) return;\n this.dsPaginationChange.emit({\n pageIndex: 0,\n pageSize: next,\n pageSizeMode: 'fit',\n totalItems: pagination.totalItems,\n pageSizeOptions: pagination.pageSizeOptions ?? [25, 50, 100, 200],\n fitToPage: true,\n fitPageSize: next,\n fitPageSizeLabel: pagination.fitPageSizeLabel ?? 'Fit to page',\n fitPageSizeTriggerLabel: pagination.fitPageSizeTriggerLabel ?? 'Fit',\n itemLabel: pagination.itemLabel ?? 'items',\n pageSizeLabel: pagination.pageSizeLabel ?? 'Items',\n ariaLabel: pagination.ariaLabel ?? `${this.caption} pagination`,\n previousPageIndex: pagination.pageIndex,\n previousPageSize: pagination.pageSize,\n previousPageSizeMode: 'fit',\n reason: 'fit',\n });\n };\n\n private handlePaginationKeyDown(event: KeyboardEvent): void {\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (\n !pagination ||\n this.loading ||\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey ||\n (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')\n ) {\n return;\n }\n\n const fromDirectionalControl = event.composedPath().some(node => {\n if (!(node instanceof HTMLElement)) return false;\n return node.tagName === 'DS-SELECT' ||\n ['INPUT', 'SELECT', 'TEXTAREA'].includes(node.tagName) ||\n node.isContentEditable ||\n node.getAttribute('role') === 'slider';\n });\n if (fromDirectionalControl) return;\n\n const state = resolvePaginationState(pagination);\n const pageIndex = event.key === 'ArrowLeft' ? state.pageIndex - 1 : state.pageIndex + 1;\n if (pageIndex < 0 || pageIndex >= state.totalPages) return;\n\n event.preventDefault();\n this.dsPaginationChange.emit({\n pageIndex,\n pageSize: state.pageSize,\n pageSizeMode: state.pageSizeMode,\n totalItems: state.totalItems,\n pageSizeOptions: state.pageSizeOptions,\n fitToPage: pagination.fitToPage ?? false,\n fitPageSize: this.fitPageSize ?? pagination.fitPageSize,\n fitPageSizeLabel: pagination.fitPageSizeLabel ?? 'Fit to page',\n fitPageSizeTriggerLabel: pagination.fitPageSizeTriggerLabel ?? 'Fit',\n itemLabel: pagination.itemLabel ?? 'items',\n pageSizeLabel: pagination.pageSizeLabel ?? 'Items',\n ariaLabel: pagination.ariaLabel ?? `${this.caption} pagination`,\n previousPageIndex: state.pageIndex,\n previousPageSize: state.pageSize,\n previousPageSizeMode: state.pageSizeMode,\n reason: 'page',\n });\n }\n\n private currentLoadedRows(): TableRow[] {\n return tableRows(this.rows, this.groups, this.grouped);\n }\n\n private currentLoadedRowCount(): number {\n return this.grouped\n ? this.groups.reduce((count, group) => count + group.rows.length, 0)\n : this.rows.length;\n }\n\n private createRenderModel(): TableRenderModel {\n return createTableRenderModel({\n columns: this.columns,\n rows: this.rows,\n groups: this.groups,\n grouped: this.grouped,\n selectionMode: this.selectionMode,\n selectedRowIds: this.selectedRowIds,\n collapsedGroupIds: this.collapsedGroupIds,\n });\n }\n\n private get resolvedMaxHeight(): string | undefined {\n if (this.maxHeight == null || this.maxHeight === '') return undefined;\n return typeof this.maxHeight === 'number' ? `${Math.max(0, this.maxHeight)}px` : this.maxHeight;\n }\n\n private get resolvedHeight(): string | undefined {\n if (this.height == null || this.height === '') return undefined;\n return typeof this.height === 'number' ? `${Math.max(0, this.height)}px` : this.height;\n }\n\n private warnModelIssues(): void {\n const issues = tableModelIssues(this.columns, this.rows, this.groups, this.grouped);\n if (!this.caption?.trim()) issues.unshift('A non-empty caption is required.');\n if (this.grouping && !this.columns.some(column => column.id === this.grouping!.columnId)) {\n issues.push(`Grouping references unknown column id: ${this.grouping.columnId}`);\n }\n if (\n this.sort &&\n !this.columns.some(column =>\n column.id === this.sort!.columnId ||\n column.headerSegments?.some(segment => segment.sortKey === this.sort!.columnId),\n )\n ) {\n issues.push(`Sorting references unknown column id: ${this.sort.columnId}`);\n }\n const stickyStart = this.columns.filter(column => column.sticky === 'start');\n const stickyEnd = this.columns.filter(column => column.sticky === 'end');\n if (stickyStart.length > 1 || (this.selectable && stickyStart.length > 0)) {\n issues.push('Only one sticky start column is supported, and row selection already owns that lane.');\n }\n if (stickyEnd.length > 1) issues.push('Only one sticky end column is supported.');\n for (const column of [...stickyStart, ...stickyEnd]) {\n if (!tableColumnSize(column)) issues.push(`Sticky column ${column.id} requires an explicit size.`);\n }\n const message = issues.join(' ');\n if (!message || message === this.previousModelWarning) return;\n this.previousModelWarning = message;\n console.warn(`[ds-table] ${message}`);\n }\n\n private emitSort(column: TableColumn, sortKey = column.id): void {\n if (!column.sortable) return;\n this.dsSortChange.emit({ sort: nextTableSortState(this.sort, sortKey) });\n }\n\n private sortButtonLabel(column: TableColumn, sortKey = column.id, label = column.header): string {\n if (this.sort?.columnId !== sortKey) return `Sort ${label} ascending`;\n if (this.sort.direction === 'asc') return `Sort ${label} descending. Currently ascending.`;\n return `Sort ${label} ascending. Currently descending.`;\n }\n\n private emitRowSelection(row: TableRow): void {\n const next = toggleTableRowSelection(this.selectedRowIds, row);\n const selected = next.includes(row.id);\n this.dsSelectionChange.emit({\n selectedRowIds: next,\n scope: 'row',\n changedRowId: row.id,\n selected,\n });\n }\n\n private emitAllSelection(): void {\n const loadedRows = this.currentLoadedRows();\n const selection = deriveTableSelectionState(loadedRows, this.selectedRowIds);\n this.dsSelectionChange.emit({\n selectedRowIds: toggleAllLoadedTableRows(this.selectedRowIds, loadedRows),\n scope: 'all-loaded',\n selected: !selection.allSelected,\n });\n }\n\n private emitGroupSelection(group: TableGroup): void {\n const state = deriveTableSelectionState(group.rows, this.selectedRowIds);\n this.dsSelectionChange.emit({\n selectedRowIds: toggleTableGroupSelection(this.selectedRowIds, group.rows),\n scope: 'group',\n groupId: group.id,\n selected: !state.allSelected,\n });\n }\n\n private rowEventOwnsActivation(event: Event): boolean {\n const currentTarget = event.currentTarget;\n return !event.composedPath().some(target => {\n if (!(target instanceof HTMLElement) || target === currentTarget) return false;\n return target.matches(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"checkbox\"], ds-button-unfilled',\n );\n });\n }\n\n private emitRowActivation(row: TableRow, event: Event): void {\n if (!row.interactive || row.disabled || !this.rowEventOwnsActivation(event)) return;\n this.dsRowActivate.emit({ rowId: row.id });\n }\n\n private handleRowKeydown(row: TableRow, event: KeyboardEvent): void {\n if (event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' ')) return;\n event.preventDefault();\n this.emitRowActivation(row, event);\n }\n\n private renderSelectionControl(\n label: string,\n checked: boolean,\n indeterminate: boolean,\n disabled: boolean,\n onActivate: () => void,\n ) {\n return (\n <button\n class=\"ds-table__selection-control ds-focus-ring ds-interaction-fill__content\"\n type=\"button\"\n role=\"checkbox\"\n aria-label={label}\n aria-checked={indeterminate ? 'mixed' : String(checked)}\n disabled={disabled}\n onClick={onActivate}\n >\n <ds-checkbox\n label=\"\"\n size=\"md\"\n checked={checked}\n indeterminate={indeterminate}\n presentation={true}\n />\n </button>\n );\n }\n\n private renderStickyEdge(sticky: TableColumn['sticky']) {\n if (!sticky) return null;\n return (\n <span\n class={`ds-table__sticky-edge ds-table__sticky-edge--${sticky}`}\n aria-hidden=\"true\"\n />\n );\n }\n\n private renderCollapseAllButton() {\n return (\n <ds-button-unfilled\n class=\"ds-table__collapse-all\"\n variant=\"icon\"\n icon=\"ChevronDownUp\"\n size=\"xs\"\n style={{ width: 'var(--dimension-size-300)' }}\n aria-label=\"Collapse all groups\"\n hasBorder={false}\n activeFill={false}\n pressScale={false}\n onDsClick={event => {\n event.stopPropagation();\n this.emitAllGroupsCollapse();\n }}\n />\n );\n }\n\n private renderFloatingCollapseAll(model: TableRenderModel) {\n if (model.collapseAllHost?.mode !== 'floating') return null;\n return (\n <span\n class=\"ds-table__collapse-all-overlay\"\n ref={element => {\n this.collapseAllOverlayEl = element ?? null;\n }}\n >\n <span class=\"ds-table__collapse-all-surface ds-control-elevation ds-control-elevation--md\">\n {this.renderCollapseAllButton()}\n </span>\n </span>\n );\n }\n\n private renderColumnHeader(\n column: TableColumn,\n model: TableRenderModel,\n interactive = true,\n presentational = false,\n ) {\n const groupedColumn = this.grouping?.columnId === column.id;\n const headerSegments = column.headerSegments?.length\n ? column.headerSegments\n : [{ label: column.header, sortKey: column.id }];\n const activeMemberSegment = headerSegments.find(\n segment => segment.sortKey === this.sort?.columnId,\n );\n const activeMemberSort = !!activeMemberSegment;\n const activeSort = activeMemberSort;\n const align = column.align ?? 'start';\n const direction = activeMemberSort ? this.sort!.direction : undefined;\n const memberAriaSort = activeMemberSort\n ? (this.sort!.direction === 'asc' ? 'ascending' : 'descending')\n : undefined;\n\n const labelControl = (\n <span class=\"ds-table__header-labels\">\n {headerSegments.map((segment, index) => {\n const segmentActive = activeMemberSegment?.sortKey === segment.sortKey;\n const segmentInteractive = interactive && !!column.sortable;\n const label = (\n <ds-text\n class=\"ds-table__header-label-box ds-control-label-box\"\n as=\"span\"\n variant=\"text-caption\"\n emphasis={segmentActive}\n color=\"inherit\"\n lineTruncation={1}\n >\n {segment.label}\n </ds-text>\n );\n const control = segmentInteractive ? (\n <button\n class=\"ds-table__header-label ds-table__header-label--interactive ds-focus-ring\"\n type=\"button\"\n aria-label={this.sortButtonLabel(column, segment.sortKey, segment.label)}\n data-sort-control=\"label\"\n data-sort-key={segment.sortKey}\n data-sort-active={segmentActive ? 'true' : undefined}\n onClick={() => this.emitSort(column, segment.sortKey)}\n >\n {label}\n </button>\n ) : (\n <span class=\"ds-table__header-label ds-table__header-static\">{label}</span>\n );\n\n return (\n <span class=\"ds-table__header-segment\" key={segment.sortKey}>\n {control}\n {index < headerSegments.length - 1 && (\n <ds-text\n class=\"ds-table__header-separator\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"tertiary\"\n aria-hidden=\"true\"\n >\n {segment.separator ?? '/'}\n </ds-text>\n )}\n </span>\n );\n })}\n </span>\n );\n const sortControl = interactive ? (\n <span class=\"ds-table__sort-slot\">\n {activeSort && (\n <ds-button-unfilled\n class=\"ds-table__sort-direction\"\n variant=\"icon\"\n icon={direction === 'asc' ? 'ArrowUp' : 'ArrowDown'}\n size=\"xs\"\n aria-label={this.sortButtonLabel(\n column,\n activeMemberSegment?.sortKey ?? column.id,\n activeMemberSegment?.label ?? column.header,\n )}\n hasBorder={false}\n activeFill={false}\n isActive={true}\n pressScale={false}\n data-sort-control=\"direction\"\n onDsClick={() => this.emitSort(column, activeMemberSegment?.sortKey ?? column.id)}\n />\n )}\n </span>\n ) : null;\n const collapseHost = model.collapseAllHost;\n const actionCollapseHost = collapseHost?.mode === 'action' && collapseHost.columnId === column.id;\n const blankActionCollapseHost = actionCollapseHost &&\n !column.header.trim() &&\n !column.headerSegments?.length;\n const collapseControl =\n interactive && actionCollapseHost ? (\n <span class=\"ds-table__collapse-slot\">\n {this.renderCollapseAllButton()}\n </span>\n ) : null;\n\n return (\n <th\n key={column.id}\n class={{\n 'ds-table__header-cell': true,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--sticky-start': column.sticky === 'start',\n 'ds-table__cell--sticky-end': column.sticky === 'end',\n 'ds-table__header-cell--collapse-all': actionCollapseHost,\n }}\n scope={presentational ? undefined : 'col'}\n aria-sort={presentational ? undefined : memberAriaSort}\n data-column-id={column.id}\n data-grouped={groupedColumn ? 'true' : undefined}\n data-sort-active={activeSort ? 'true' : undefined}\n >\n {!column.header.trim() && column.headerLabel?.trim() && (\n <span class=\"ds-visually-hidden\">{column.headerLabel}</span>\n )}\n {blankActionCollapseHost ? (\n <span class=\"ds-table__header-content ds-table__header-content--collapse-all\">\n {collapseControl}\n </span>\n ) : (\n <span class=\"ds-table__header-content\">\n {align === 'end' && sortControl}\n {align === 'center' && (\n <span\n class=\"ds-table__sort-slot ds-table__sort-slot--balance\"\n data-sort-balance=\"true\"\n aria-hidden=\"true\"\n />\n )}\n {labelControl}\n {align !== 'end' && sortControl}\n {collapseControl}\n </span>\n )}\n {this.renderStickyEdge(column.sticky)}\n </th>\n );\n }\n\n private renderColgroup(model: TableRenderModel) {\n return (\n <colgroup>\n {model.selectable && <col class=\"ds-table__selection-column\" />}\n {this.columns.map(column => {\n const width = tableColumnSize(column);\n const flexible = column.id === model.flexibleColumnId;\n return (\n <col\n key={column.id}\n class={{\n 'ds-table__action-column': column.kind === 'action',\n 'ds-table__flexible-column': flexible,\n }}\n style={width && !flexible ? { width } : undefined}\n />\n );\n })}\n </colgroup>\n );\n }\n\n private renderHeader(\n model: TableRenderModel,\n interactive = true,\n presentational = false,\n ) {\n const selection = model.selection;\n return (\n <thead class={{\n 'ds-table__head': true,\n 'ds-table__head--semantic-copy': !interactive,\n }} ref={element => {\n if (interactive) this.interactiveHeadEl = element ?? null;\n }}>\n <tr class=\"ds-table__header-row\">\n {model.selectable && (\n <th\n class=\"ds-table__header-cell ds-table__selection-cell ds-table__cell--sticky-start\"\n scope={presentational ? undefined : 'col'}\n >\n {interactive ? this.renderSelectionControl(\n selection.allSelected ? 'Deselect all loaded rows' : 'Select all loaded rows',\n selection.allSelected,\n selection.indeterminate,\n selection.selectableRowIds.length === 0,\n () => this.emitAllSelection(),\n ) : (\n <span class=\"ds-visually-hidden\">Select rows</span>\n )}\n {this.renderStickyEdge('start')}\n </th>\n )}\n {this.columns.map(column => (\n this.renderColumnHeader(column, model, interactive, presentational)\n ))}\n </tr>\n </thead>\n );\n }\n\n private renderCellValue(\n cell: TableCellPresentation,\n column: TableColumn,\n row: TableRow,\n ) {\n if (cell.kind === 'blank') return null;\n\n if (cell.kind === 'empty') {\n return (\n <ds-text\n class=\"ds-table__cell-track ds-table__cell-track--text\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"tertiary\"\n >\n <span aria-hidden=\"true\">—</span>\n <span class=\"ds-visually-hidden\">{this.emptyCellLabel}</span>\n </ds-text>\n );\n }\n\n if (cell.kind === 'icon') {\n const value = cell.value;\n return (\n <ds-icon\n name={value.icon}\n size=\"md\"\n color={value.color ?? 'secondary'}\n label={value.label}\n />\n );\n }\n\n if (cell.kind === 'image') {\n const value = cell.value;\n return (\n <span class=\"ds-table__cell-image\">\n {value.src ? (\n <img class=\"ds-table__cell-image-content\" src={value.src} alt={value.alt} loading=\"lazy\" />\n ) : (\n <span\n class=\"ds-table__cell-image-placeholder\"\n role=\"img\"\n aria-label={value.alt}\n />\n )}\n </span>\n );\n }\n\n if (cell.kind === 'action') {\n const value = cell.value;\n return (\n <ds-button-unfilled\n variant={value.variant ?? 'label'}\n size=\"md\"\n isInset={true}\n insetDepth=\"double\"\n label={value.label ?? ''}\n icon={value.icon ?? ''}\n aria-label={value.ariaLabel ?? null}\n hasBorder={value.hasBorder ?? false}\n isInactive={value.isInactive ?? false}\n isLoading={value.isLoading ?? false}\n onDsClick={event => {\n event.stopPropagation();\n this.dsCellAction.emit({\n actionId: value.actionId,\n rowId: row.id,\n columnId: column.id,\n });\n }}\n />\n );\n }\n\n if (cell.kind === 'tag') {\n const value = cell.value;\n const variant = cell.variant;\n const tag = (\n <ds-tag\n label={value.label}\n intent={value.intent ?? 'neutral'}\n contrast={value.contrast ?? 'faint'}\n size={variant === 'text-with-tag' ? 'sm' : 'md'}\n icon={value.icon ?? ''}\n rounded={value.rounded ?? false}\n isInset\n insetDepth=\"double\"\n />\n );\n\n if (variant === 'tag-only') return tag;\n\n return (\n <span class={`ds-table__cell-tag-stack ds-table__cell-tag-stack--${variant}`}>\n {variant === 'tag-with-text' && tag}\n <ds-text\n class=\"ds-table__cell-tag-text ds-table__cell-track\"\n as=\"span\"\n variant={variant === 'tag-with-text' ? 'text-body-small' : 'text-body-medium'}\n color=\"secondary\"\n lineTruncation={1}\n >\n {value.text}\n </ds-text>\n {variant === 'text-with-tag' && (\n <span class=\"ds-table__cell-tag-control-track\">{tag}</span>\n )}\n </span>\n );\n }\n\n const text = cell.value;\n const wraps = cell.wraps;\n\n return (\n <span class={{ 'ds-table__cell-copy': true, 'ds-table__cell-copy--wrap': wraps }}>\n <ds-text\n class=\"ds-table__cell-primary ds-table__cell-track ds-table__cell-track--text\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"primary\"\n lineTruncation={wraps ? 'none' : 1}\n wrap={wraps ? 'wrap' : 'nowrap'}\n fontFeature={text.fontFeature ?? 'normal'}\n >\n {text.primary}\n </ds-text>\n {text.secondary !== undefined && text.secondary !== '' && (\n <ds-text\n class=\"ds-table__cell-secondary ds-table__cell-track ds-table__cell-track--text\"\n as=\"span\"\n variant={cell.primaryText ? 'text-body-medium' : 'text-body-small'}\n color={text.secondaryColor ?? (cell.primaryText ? 'primary' : 'secondary')}\n lineTruncation={wraps ? 'none' : 1}\n wrap={wraps ? 'wrap' : 'nowrap'}\n >\n {text.secondary}\n </ds-text>\n )}\n </span>\n );\n }\n\n private renderRow(row: TableRow, model: TableRenderModel) {\n const selected = model.selectedRowIds.has(row.id);\n const rowSelectable = row.selectable !== false && !row.disabled;\n return (\n <tr\n key={row.id}\n class={{\n 'ds-table__row': true,\n 'ds-table__row--selected': selected,\n 'ds-table__row--disabled': !!row.disabled,\n 'ds-table__row--interactive': !!row.interactive && !row.disabled,\n 'ds-focus-ring': !!row.interactive && !row.disabled,\n }}\n data-row-id={row.id}\n data-selected={selected ? 'true' : undefined}\n aria-disabled={row.disabled ? 'true' : undefined}\n tabIndex={row.interactive && !row.disabled ? 0 : undefined}\n onClick={event => this.emitRowActivation(row, event)}\n onKeyDown={event => this.handleRowKeydown(row, event)}\n >\n {model.selectable && (\n <td class={{\n 'ds-table__cell': true,\n 'ds-table__selection-cell': true,\n 'ds-table__cell--sticky-start': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n }}>\n {this.renderSelectionControl(\n `${selected ? 'Deselect' : 'Select'} ${tableRowSelectionLabel(row, this.columns)}`,\n selected,\n false,\n !rowSelectable,\n () => this.emitRowSelection(row),\n )}\n {this.renderStickyEdge('start')}\n </td>\n )}\n {this.columns.map(column => {\n const align = column.align ?? 'start';\n const cell = resolveTableCellPresentation(row.cells[column.id], column);\n const tagCell = cell.kind === 'tag';\n const iconCell = cell.kind === 'icon';\n const imageCell = cell.kind === 'image';\n const actionCell = cell.kind === 'action';\n const textCell = cell.kind === 'text';\n const primaryTextCell = textCell && cell.primaryText;\n const singleTextCell = textCell && cell.singleLine;\n const emptyCell = cell.kind === 'empty';\n const blankCell = cell.kind === 'blank';\n const tagVariant = tagCell ? cell.variant : undefined;\n const textVariant = textCell ? cell.variant : undefined;\n return (\n <td\n key={`${row.id}:${column.id}`}\n class={{\n 'ds-table__cell': true,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--tag': tagCell,\n [`ds-table__cell--tag-${tagVariant}`]: tagCell,\n 'ds-table__cell--icon': iconCell,\n 'ds-table__cell--image': imageCell,\n 'ds-table__cell--action': actionCell,\n 'ds-table__cell--primary-text': primaryTextCell,\n 'ds-table__cell--text-single': singleTextCell,\n 'ds-table__cell--text-multi': textCell && !singleTextCell,\n 'ds-table__cell--empty': emptyCell,\n 'ds-table__cell--blank': blankCell,\n 'ds-table__cell--sticky-start': column.sticky === 'start',\n 'ds-table__cell--sticky-end': column.sticky === 'end',\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n }}\n data-column-id={column.id}\n data-cell-type={cell.cellType}\n data-cell-variant={tagVariant ?? textVariant}\n >\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {this.renderCellValue(cell, column, row)}\n </span>\n {this.renderStickyEdge(column.sticky)}\n </td>\n );\n })}\n </tr>\n );\n }\n\n private emitGroupCollapse(group: TableGroup) {\n const collapsedGroupIds = toggleTableGroupCollapsed(this.collapsedGroupIds, group.id);\n this.dsGroupCollapseChange.emit({\n scope: 'group',\n groupId: group.id,\n collapsed: collapsedGroupIds.includes(group.id),\n collapsedGroupIds,\n });\n }\n\n private emitAllGroupsCollapse() {\n const groupIds = this.groups.map(group => group.id);\n const collapsedGroupIds = nextTableGroupsCollapsed(this.collapsedGroupIds, groupIds);\n this.dsGroupCollapseChange.emit({\n scope: 'all',\n collapsed: collapsedGroupIds.length > 0,\n collapsedGroupIds,\n });\n }\n\n private renderGroupContent(groupModel: TableRenderModel['groups'][number]) {\n const {\n group,\n count,\n loadedCount,\n countLabel,\n collapsed: isCollapsed,\n labelColor,\n selection: groupSelection,\n } = groupModel;\n return (\n <span class=\"ds-table__group-content\">\n {groupSelection && (\n <span class=\"ds-table__group-selection\">\n {this.renderSelectionControl(\n groupSelection.allSelected\n ? `Deselect loaded rows in ${group.label} group`\n : `Select loaded rows in ${group.label} group`,\n groupSelection.allSelected,\n groupSelection.indeterminate,\n groupSelection.selectableRowIds.length === 0,\n () => this.emitGroupSelection(group),\n )}\n </span>\n )}\n <span class=\"ds-table__group-copy\">\n <ds-text\n class=\"ds-table__group-label\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis={true}\n color={labelColor}\n >\n {group.label}\n </ds-text>\n <ds-text\n class=\"ds-table__group-separator\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>\n <ds-text\n class=\"ds-table__group-count\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n {loadedCount} of {count}\n </ds-text>\n <span class=\"ds-visually-hidden\">{countLabel}</span>\n </span>\n <ds-button-unfilled\n class=\"ds-table__group-toggle\"\n variant=\"icon\"\n size=\"md\"\n isInset={true}\n insetDepth=\"double\"\n icon={isCollapsed ? 'ChevronDown' : 'ChevronUp'}\n expanded={!isCollapsed}\n aria-label={\n isCollapsed\n ? `Expand ${group.label} group`\n : `Collapse ${group.label} group`\n }\n hasBorder={false}\n onDsClick={event => {\n event.stopPropagation();\n this.emitGroupCollapse(group);\n }}\n />\n </span>\n );\n }\n\n private formatGroupLoadLabel(template: string, group: TableGroup): string {\n return template.split('{group}').join(group.label);\n }\n\n private renderGroupLoadRow(group: TableGroup, totalColumns: number) {\n const error = group.loadMoreError?.trim();\n if (!error && !group.loadingMore && !group.hasMore) return null;\n const manualFallback = this.loadMoreMode === 'manual' ||\n !this.groupLoadController.intersectionSupported;\n\n return (\n <tr\n class=\"ds-table__load-row ds-table__group-load-row\"\n data-group-id={group.id}\n ref={element => {\n if (element) this.groupSentinelEls.set(group.id, element);\n else this.groupSentinelEls.delete(group.id);\n }}\n >\n <td class=\"ds-table__load-cell\" colSpan={totalColumns}>\n <div class=\"ds-table__viewport-band ds-table__load-band\">\n {error ? (\n <span class=\"ds-table__load-content ds-table__load-content--error\">\n <span class=\"ds-table__load-copy\">\n <ds-icon name=\"ErrorTriangle\" size=\"md\" color=\"secondary\" aria-hidden=\"true\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">{error}</ds-text>\n </span>\n <ds-button-unfilled\n label={this.formatGroupLoadLabel(this.groupRetryLabel, group)}\n size=\"md\"\n onDsClick={() => this.groupLoadController.request(group.id, 'retry')}\n />\n </span>\n ) : group.loadingMore ? (\n <span class=\"ds-table__load-content\">\n <ds-loader size=\"md\" color=\"secondary\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {this.formatGroupLoadLabel(this.groupLoadingMoreLabel, group)}\n </ds-text>\n </span>\n ) : group.hasMore && manualFallback ? (\n <span class=\"ds-table__load-content\">\n <ds-button-unfilled\n label={this.groupLoadMoreLabel}\n aria-label={this.formatGroupLoadLabel(this.groupLoadMoreAriaLabel, group)}\n size=\"md\"\n onDsClick={() => this.groupLoadController.request(group.id, 'manual')}\n />\n </span>\n ) : (\n <span class=\"ds-table__auto-sentinel\" aria-hidden=\"true\" />\n )}\n </div>\n </td>\n </tr>\n );\n }\n\n private renderStickyGroup(model: TableRenderModel) {\n if (!this.documentStickyHeader || !this.activeStickyGroupId) return null;\n const groupModel = model.groups.find(item => item.group.id === this.activeStickyGroupId);\n if (!groupModel) return null;\n return (\n <div\n class={{\n 'ds-table__sticky-group': true,\n 'ds-table__sticky-group--selectable': model.selectable,\n [groupModel.intentClass ?? '']: !!groupModel.intentClass,\n }}\n data-group-id={groupModel.group.id}\n data-group-intent={groupModel.intent}\n >\n {this.renderGroupContent(groupModel)}\n </div>\n );\n }\n\n private renderDataBodies(model: TableRenderModel) {\n if (!model.grouped) {\n return (\n <tbody class=\"ds-table__body\">\n {this.rows.map(row => this.renderRow(row, model))}\n </tbody>\n );\n }\n\n return model.groups.map(groupModel => {\n const { group, collapsed: isCollapsed, intent, intentClass } = groupModel;\n const stickySourceHidden = this.documentStickyHeader && this.activeStickyGroupId === group.id;\n return (\n <tbody\n class=\"ds-table__body ds-table__group\"\n role=\"rowgroup\"\n data-group-id={group.id}\n data-group-intent={intent}\n data-collapsed={isCollapsed ? 'true' : undefined}\n aria-busy={!isCollapsed && group.loadingMore ? 'true' : undefined}\n key={group.id}\n >\n <tr\n role=\"row\"\n aria-hidden={stickySourceHidden ? 'true' : undefined}\n class={{\n 'ds-table__group-row': true,\n 'ds-table__group-row--native-sticky': this.stickyHeader && !this.documentStickyHeader,\n }}\n >\n <th\n class={{\n 'ds-table__group-cell': true,\n 'ds-table__group-cell--sticky-source-hidden': stickySourceHidden,\n [intentClass ?? '']: !!intentClass,\n }}\n role=\"rowheader\"\n scope=\"rowgroup\"\n colSpan={model.totalColumns}\n >\n {this.renderGroupContent(groupModel)}\n </th>\n </tr>\n {!isCollapsed && group.rows.map(row => this.renderRow(row, model))}\n {!isCollapsed && this.renderGroupLoadRow(group, model.totalColumns)}\n </tbody>\n );\n });\n }\n\n private renderSkeletonBody(model: TableRenderModel) {\n const count = Math.min(20, Math.max(1, Math.round(this.skeletonRows) || 1));\n return (\n <tbody class=\"ds-table__body ds-table__skeleton-body\">\n {Array.from({ length: count }, (_, index) => (\n <tr class=\"ds-table__row ds-table__skeleton-row\" key={`skeleton-${index}`}>\n {model.selectable && (\n <td\n class=\"ds-table__cell ds-table__selection-cell ds-table__cell--sticky-start ds-table__skeleton-cell ds-interaction-fill ds-interaction-fill--grouped\"\n data-skeleton-kind=\"checkbox\"\n >\n <span class=\"ds-table__skeleton-checkbox-canvas ds-interaction-fill__content\">\n <ds-skeleton\n class=\"ds-table__skeleton-checkbox\"\n variant=\"control\"\n controlSize=\"xs\"\n width=\"var(--dimension-iconography-sm)\"\n />\n </span>\n {this.renderStickyEdge('start')}\n </td>\n )}\n {this.columns.map(column => this.renderSkeletonCell(column, index))}\n </tr>\n ))}\n </tbody>\n );\n }\n\n private renderSkeletonCell(column: TableColumn, rowIndex: number) {\n const skeleton = column.skeleton ?? (\n column.kind === 'action'\n ? { kind: 'action', variant: 'icon' }\n : { kind: 'text', lines: 1 }\n ) satisfies TableCellSkeleton;\n const align = column.align ?? 'start';\n const text = skeleton.kind === 'text';\n const lines = text ? skeleton.lines ?? 1 : 1;\n const tag = skeleton.kind === 'tag';\n const icon = skeleton.kind === 'icon';\n const image = skeleton.kind === 'image';\n const action = skeleton.kind === 'action';\n const blank = skeleton.kind === 'blank';\n\n return (\n <td\n class={{\n 'ds-table__cell': true,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__skeleton-cell': true,\n 'ds-table__cell--text-single': text && lines === 1,\n 'ds-table__cell--text-multi': text && lines === 2,\n 'ds-table__cell--tag': tag,\n 'ds-table__cell--tag-tag-only': tag,\n 'ds-table__cell--icon': icon,\n 'ds-table__cell--image': image,\n 'ds-table__cell--action': action,\n 'ds-table__cell--blank': blank,\n 'ds-table__cell--sticky-start': column.sticky === 'start',\n 'ds-table__cell--sticky-end': column.sticky === 'end',\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n }}\n data-column-id={column.id}\n data-skeleton-kind={skeleton.kind}\n key={`skeleton-${rowIndex}:${column.id}`}\n >\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {this.renderSkeletonCellContent(skeleton)}\n </span>\n {this.renderStickyEdge(column.sticky)}\n </td>\n );\n }\n\n private renderSkeletonCellContent(skeleton: TableCellSkeleton) {\n if (skeleton.kind === 'blank') return null;\n\n if (skeleton.kind === 'image') {\n return (\n <span class=\"ds-table__cell-image ds-table__skeleton-image\">\n <ds-skeleton\n class=\"ds-table__skeleton-image-shape\"\n variant=\"control\"\n controlSize=\"md\"\n width=\"100%\"\n />\n </span>\n );\n }\n\n if (skeleton.kind === 'icon') {\n return <ds-skeleton variant=\"icon\" iconSize=\"md\" rounded={skeleton.rounded ?? false} />;\n }\n\n if (skeleton.kind === 'tag') {\n return (\n <ds-skeleton\n variant=\"control\"\n controlSize=\"sm\"\n width={skeleton.width ?? '64%'}\n />\n );\n }\n\n if (skeleton.kind === 'action') {\n const iconOnly = (skeleton.variant ?? 'icon') === 'icon';\n return (\n <ds-skeleton\n variant=\"control\"\n controlSize=\"sm\"\n width={skeleton.width ?? (iconOnly ? '24px' : '72%')}\n />\n );\n }\n\n const lines = skeleton.lines ?? 1;\n return (\n <span class=\"ds-table__cell-copy\">\n <span class=\"ds-table__cell-track ds-table__cell-track--text\">\n <ds-skeleton\n variant=\"text\"\n textVariant=\"text-body-medium\"\n width={skeleton.primaryWidth ?? '100%'}\n />\n </span>\n {lines === 2 && (\n <span class=\"ds-table__cell-secondary ds-table__cell-track ds-table__cell-track--text\">\n <ds-skeleton\n variant=\"text\"\n textVariant=\"text-body-small\"\n width={skeleton.secondaryWidth ?? '72%'}\n />\n </span>\n )}\n </span>\n );\n }\n\n private renderStateBody(kind: 'empty' | 'error', totalColumns: number) {\n const error = kind === 'error';\n return (\n <tbody class=\"ds-table__body ds-table__state-body\">\n <tr class=\"ds-table__state-row\">\n <td class=\"ds-table__state-cell\" colSpan={totalColumns}>\n <div class=\"ds-table__viewport-band ds-table__state-band\">\n <ds-empty-state\n icon={error ? 'ErrorTriangle' : 'Inbox'}\n heading={error ? this.errorHeading : this.emptyHeading}\n body={error ? this.errorBody : this.emptyBody}\n />\n </div>\n </td>\n </tr>\n </tbody>\n );\n }\n\n private renderLazyBody(model: TableRenderModel) {\n if (\n this.dataMode !== 'infinite' ||\n !this.incrementalWindowActive ||\n !model.hasData ||\n model.grouped\n ) return null;\n const error = this.loadMoreError?.trim();\n const manualFallback = this.loadMoreMode === 'manual' ||\n !this.loadController.intersectionSupported;\n\n return (\n <tbody class=\"ds-table__body ds-table__load-body\">\n <tr\n class=\"ds-table__load-row\"\n ref={element => {\n this.sentinelEl = element ?? null;\n }}\n >\n <td class=\"ds-table__load-cell\" colSpan={model.totalColumns}>\n <div class=\"ds-table__viewport-band ds-table__load-band\">\n {error ? (\n <span class=\"ds-table__load-content ds-table__load-content--error\">\n <span class=\"ds-table__load-copy\">\n <ds-icon name=\"ErrorTriangle\" size=\"md\" color=\"secondary\" aria-hidden=\"true\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">{error}</ds-text>\n </span>\n <ds-button-unfilled\n label={this.retryLabel}\n size=\"md\"\n onDsClick={() => this.loadController.request('retry')}\n />\n </span>\n ) : this.loadingMore ? (\n <span class=\"ds-table__load-content\">\n <ds-loader size=\"md\" color=\"secondary\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {this.loadingMoreLabel}\n </ds-text>\n </span>\n ) : this.hasMore && manualFallback ? (\n <span class=\"ds-table__load-content\">\n <ds-button-unfilled\n label={this.loadMoreLabel}\n size=\"md\"\n onDsClick={() => this.loadController.request('manual')}\n />\n </span>\n ) : this.hasMore ? (\n <span class=\"ds-table__auto-sentinel\" aria-hidden=\"true\" />\n ) : (\n <ds-text\n class=\"ds-table__load-content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n >\n {this.endOfResultsLabel}\n </ds-text>\n )}\n </div>\n </td>\n </tr>\n </tbody>\n );\n }\n\n private renderDocumentStickyHeader(model: TableRenderModel) {\n if (!this.documentStickyHeader) return null;\n return (\n <div\n class=\"ds-table__document-sticky-header\"\n >\n <table\n class={{\n 'ds-table__table': true,\n 'ds-table__sticky-header-table': true,\n 'ds-table__table--selectable': model.selectable,\n 'ds-table__table--grouped': model.grouped,\n }}\n style={model.tableStyle}\n role=\"presentation\"\n ref={element => {\n this.stickyHeaderTableEl = element ?? null;\n }}\n >\n {this.renderColgroup(model)}\n {this.renderHeader(model, true, true)}\n </table>\n {this.renderFloatingCollapseAll(model)}\n </div>\n );\n }\n\n private get resultSummary(): string | null {\n if (this.dataMode === 'pagination') return null;\n return formatTableResultSummary(\n this.displayedCount,\n this.totalCount,\n this.resultSummaryLabel,\n );\n }\n\n private get hasResultFooter(): boolean {\n return (this.dataMode === 'pagination' && !!this.pagination) ||\n !!this.resultSummary || !!this.el.querySelector(\n '[slot=\"footer-leading\"], [slot=\"footer\"], [slot=\"footer-trailing\"]',\n );\n }\n\n private renderResultFooter() {\n const summary = this.resultSummary;\n const hasLeading = !!this.el.querySelector('[slot=\"footer-leading\"]');\n const hasCopy = !!this.el.querySelector('[slot=\"footer\"]');\n const hasTrailing = !!this.el.querySelector('[slot=\"footer-trailing\"]');\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (!this.hasResultFooter) return null;\n return (\n <div class=\"ds-table__footer ds-table__bar ds-chrome-header ds-control--md\">\n <div class=\"ds-table__bar-copy ds-chrome-header__copy ds-control--md\">\n {hasLeading && (\n <div class=\"ds-table__bar-status ds-chrome-header__heading\">\n <slot name=\"footer-leading\" />\n </div>\n )}\n {hasCopy ? (\n <slot name=\"footer\" />\n ) : summary ? (\n <ds-text\n class=\"ds-table__footer-summary ds-table__bar-text\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n >\n {summary}\n </ds-text>\n ) : null}\n </div>\n {(pagination || hasTrailing) && (\n <div class=\"ds-table__bar-trailing ds-chrome-header__trailing\">\n {pagination && (\n <ds-pagination\n pageIndex={pagination.pageIndex}\n pageSize={pagination.pageSize}\n pageSizeMode={pagination.pageSizeMode ?? 'fixed'}\n totalItems={pagination.totalItems}\n pageSizeOptions={pagination.pageSizeOptions ?? [25, 50, 100, 200]}\n fitToPage={pagination.fitToPage ?? false}\n fitPageSize={this.fitPageSize ?? pagination.fitPageSize}\n fitPageSizeLabel={pagination.fitPageSizeLabel ?? 'Fit to page'}\n fitPageSizeTriggerLabel={pagination.fitPageSizeTriggerLabel ?? 'Fit'}\n itemLabel={pagination.itemLabel ?? 'items'}\n pageSizeLabel={pagination.pageSizeLabel ?? 'Items'}\n label={pagination.ariaLabel ?? `${this.caption} pagination`}\n loading={this.loading}\n onDsChange={(event: CustomEvent<PaginationChangeDetail>) =>\n this.dsPaginationChange.emit(event.detail)}\n />\n )}\n <slot name=\"footer-trailing\" />\n </div>\n )}\n </div>\n );\n }\n\n private renderCaptionBar() {\n if (this.captionVisibility !== 'visible') return null;\n return (\n <div class=\"ds-table__caption-bar ds-table__bar ds-control--md\">\n <div class=\"ds-table__caption-content\">\n <slot\n name=\"header\"\n onSlotchange={this.syncHeaderSlotPresence}\n />\n {!this.headerPresent ? (\n <ds-text\n class=\"ds-table__caption-title ds-table__bar-text\"\n as=\"div\"\n variant=\"text-title-small\"\n emphasis={true}\n color=\"primary\"\n aria-hidden=\"true\"\n >\n {this.caption}\n </ds-text>\n ) : null}\n </div>\n </div>\n );\n }\n\n render() {\n this.groupSentinelEls.clear();\n const model = this.createRenderModel();\n this.renderedModel = model;\n const regionLabel = this.scrollLabel?.trim() || `${this.caption} scroll area`;\n const initialLoading = this.loading && !model.hasData;\n const initialError = !model.hasData && this.error;\n const hasGroupedStructure = model.grouped && model.groups.length > 0;\n const groupLoadingMore = hasGroupedStructure && this.groups.some(group => group.loadingMore);\n const viewportStyle = !this.boundedComposition && this.resolvedMaxHeight\n ? { '--ds-table-max-block-size': this.resolvedMaxHeight }\n : undefined;\n const hostStyle = this.fixedHeight\n ? { '--_table-fixed-block-size': this.resolvedHeight }\n : undefined;\n\n return (\n <Host\n class={{\n 'table-host': true,\n 'table-host--bounded': this.boundedComposition,\n 'table-host--fixed-height': this.fixedHeight,\n 'table-host--viewport-fit': this.fitViewport,\n }}\n style={hostStyle}\n onKeyDown={(event: KeyboardEvent) => this.handlePaginationKeyDown(event)}\n >\n <div class={{\n 'ds-table': true,\n 'ds-table--bounded': this.boundedComposition,\n 'ds-table--contained-scroll': this.containedScroll,\n 'ds-table--fixed-height': this.fixedHeight,\n 'ds-table--viewport-fit': this.fitViewport,\n 'ds-table--viewport-fit-pending': this.fitViewport && !this.viewportFitSettled,\n 'ds-table--viewport-fit-settled': this.fitViewport && this.viewportFitSettled,\n 'ds-table--sticky-header': this.stickyHeader,\n 'ds-table--document-sticky-header': this.documentStickyHeader,\n 'ds-table--contained-sticky-header': this.stickyHeader && !this.documentStickyHeader,\n 'ds-table--caption-visible': this.captionVisibility === 'visible',\n 'ds-table--footer-visible': this.hasResultFooter,\n }} ref={element => {\n this.rootEl = element ?? null;\n }}>\n {this.renderCaptionBar()}\n <div\n class={{\n 'ds-table__frame': true,\n 'ds-table__frame--overflow-start': this.overflowStart,\n 'ds-table__frame--overflow-end': this.overflowEnd,\n }}\n ref={element => {\n this.frameEl = element ?? null;\n }}\n >\n {this.renderDocumentStickyHeader(model)}\n {this.renderStickyGroup(model)}\n {!this.documentStickyHeader && this.renderFloatingCollapseAll(model)}\n <div\n class={{\n 'ds-table__viewport': true,\n 'ds-focus-ring': this.scrollable,\n }}\n style={viewportStyle}\n ref={element => {\n this.viewportEl = element ?? null;\n }}\n role={this.scrollable ? 'region' : undefined}\n aria-label={this.scrollable ? regionLabel : undefined}\n tabIndex={this.scrollable ? 0 : undefined}\n >\n <table\n class={{\n 'ds-table__table': true,\n 'ds-table__table--selectable': model.selectable,\n 'ds-table__table--grouped': model.grouped,\n 'ds-table__table--native-group-sticky': model.grouped &&\n this.stickyHeader && !this.documentStickyHeader,\n }}\n style={model.tableStyle}\n aria-busy={initialLoading || this.loadingMore || groupLoadingMore ? 'true' : undefined}\n ref={element => {\n this.tableEl = element ?? null;\n }}\n >\n <caption class=\"ds-table__caption ds-visually-hidden\">\n <ds-text as=\"span\" variant=\"text-title-small\" emphasis={true} color=\"primary\">\n {this.caption}\n </ds-text>\n </caption>\n {this.renderColgroup(model)}\n {this.renderHeader(model, !this.documentStickyHeader)}\n {initialLoading\n ? this.renderSkeletonBody(model)\n : initialError\n ? this.renderStateBody('error', model.totalColumns)\n : model.hasData || hasGroupedStructure\n ? this.renderDataBodies(model)\n : this.renderStateBody('empty', model.totalColumns)}\n {!initialLoading && !initialError && this.renderLazyBody(model)}\n </table>\n </div>\n </div>\n {this.renderResultFooter()}\n <div class=\"ds-visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {this.announcement}\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"ujBAuBA,MAAMA,EAA4B,CAChCC,GAAI,oCACJC,GAAI,oCACJC,GAAI,oCACJC,GAAI,oCACJC,GAAI,qCAGA,SAAUC,EAAgBC,GAC9B,cAAcA,IAAU,UAAYA,IAAU,MAAQ,YAAaA,KAAW,SAAUA,EAC1F,CAEM,SAAUC,EAAuBD,GACrC,cAAcA,IAAU,UAAYA,IAAU,MAAQ,SAAUA,GAASA,EAAME,OAAS,cAC1F,CAEM,SAAUC,EAAeH,GAC7B,cAAcA,IAAU,UAAYA,IAAU,MAAQ,SAAUA,GAASA,EAAME,OAAS,KAC1F,CAEM,SAAUE,EAAgBJ,GAC9B,cAAcA,IAAU,UAAYA,IAAU,MAAQ,SAAUA,GAASA,EAAME,OAAS,MAC1F,CAEM,SAAUG,EAAiBL,GAC/B,cAAcA,IAAU,UAAYA,IAAU,MAAQ,SAAUA,GAASA,EAAME,OAAS,OAC1F,CAEM,SAAUI,EAAkBN,GAChC,cAAcA,IAAU,UAAYA,IAAU,MAAQ,SAAUA,GAASA,EAAME,OAAS,QAC1F,CAEM,SAAUK,EAAiBP,GAC/B,cAAcA,IAAU,UAAYA,IAAU,MAAQ,SAAUA,GAASA,EAAME,OAAS,OAC1F,CAEM,SAAUM,EAAiBR,GAC/B,cAAcA,IAAU,UAAYA,IAAU,MAAQ,SAAUA,GAASA,EAAME,OAAS,OAC1F,CAEM,SAAUO,EAAiBT,GAC/B,GAAIA,GAAS,KAAM,OAAO,KAC1B,GAAIG,EAAeH,GAAQ,OAAOA,EAAMU,MACxC,GAAIN,EAAgBJ,GAAQ,OAAO,KACnC,GAAIK,EAAiBL,GAAQ,OAAOA,EAAMW,IAC1C,GAAIL,EAAkBN,GAAQ,OAAOA,EAAMU,OAASV,EAAMY,UAC1D,GAAIX,EAAuBD,GAAQ,OAAOA,EAAMa,QAChD,GAAIN,EAAiBP,IAAUQ,EAAiBR,GAAQ,OAAO,KAC/D,OAAOD,EAAgBC,GAASA,EAAMa,QAAUb,CAClD,CAEM,SAAUc,EAAuBC,EAAeC,GACpD,MAAMC,EAAWF,EAAIG,gBAAgBC,OACrC,GAAIF,EAAU,OAAOA,EAErB,IAAK,MAAMG,KAAUJ,EAAS,CAC5B,MAAMH,EAAUJ,EAAiBM,EAAIM,MAAMD,EAAOE,KAClD,GAAIT,GAAW,MAAQU,OAAOV,GAASM,OAAQ,OAAOI,OAAOV,E,CAG/D,OAAOE,EAAIO,EACb,CAEM,SAAUE,EACdC,EACAC,GAEA,GAAID,GAASC,WAAaA,EAAU,MAAO,CAAEA,WAAUC,UAAW,OAClE,GAAIF,EAAQE,YAAc,MAAO,MAAO,CAAED,WAAUC,UAAW,QAC/D,MAAO,CAAED,WAAUC,UAAW,MAChC,CAEM,SAAUC,EACdC,EACAC,GAEA,MAAMC,EAAO,IAAIC,IAAIH,GACrB,GAAIE,EAAKE,IAAIH,GAAUC,EAAKG,OAAOJ,QAC9BC,EAAKI,IAAIL,GACd,MAAO,IAAIC,EACb,CAEM,SAAUK,EACdP,EACAQ,GAEA,GAAIA,EAASC,SAAW,EAAG,MAAO,GAClC,MAAMC,EAAY,IAAIP,IAAIH,GAC1B,MAAMW,EAAeH,EAASI,OAAMnB,GAAMiB,EAAUN,IAAIX,KACxD,OAAOkB,EAAe,GAAK,IAAIH,EACjC,CAOM,SAAUK,EACd1B,GAEA,GAAIA,EAAQsB,SAAW,EAAG,OAAOK,UACjC,IAAK,IAAIC,EAAQ5B,EAAQsB,OAAS,EAAGM,GAAS,EAAGA,GAAS,EAAG,CAC3D,MAAMxB,EAASJ,EAAQ4B,GACvB,GAAIxB,EAAOlB,OAAS,SAAU,MAAO,CAAEwB,SAAUN,EAAOE,GAAIuB,KAAM,S,CAEpE,MAAO,CAAEA,KAAM,WACjB,CAEM,SAAUC,EAAqB1B,GACnC,UAAWA,EAAO2B,OAAS,WAAaC,OAAOC,SAAS7B,EAAO2B,OAAS3B,EAAO2B,MAAQ,EAAG,CACxF,OAAOJ,S,CAGT,MAAMO,EAAUF,OAAOC,SAAS7B,EAAO+B,WAAa/B,EAAO+B,SAAW,GAAK,EACvE/B,EAAO+B,QACP,EACJ,MAAMC,EAAUJ,OAAOC,SAAS7B,EAAOiC,WAAajC,EAAOiC,SAAW,GAAK,EACvEC,KAAKC,IAAInC,EAAOiC,QAAUH,GAC1BF,OAAOQ,kBAEX,OAAOF,KAAKG,IAAIH,KAAKC,IAAInC,EAAO2B,KAAOG,GAAUE,EACnD,CAEM,SAAUM,EAAgBtC,GAC9B,UAAWA,EAAO2B,OAAS,SAAU,CACnC,MAAO,OAAOtD,EAA0B2B,EAAO2B,Q,CAEjD,MAAMY,EAAQb,EAAqB1B,GACnC,GAAIuC,GAAS,KAAM,MAAO,GAAGA,MAC7B,OAAOvC,EAAOlB,OAAS,SAAW,4BAA8ByC,SAClE,CAOM,SAAUiB,EAAsB5C,GACpC,GAAIA,EAAQ6C,MAAKzC,IAAWsC,EAAgBtC,KAAU,OAAOuB,UAC7D,IAAK,IAAIC,EAAQ5B,EAAQsB,OAAS,EAAGM,GAAS,EAAGA,GAAS,EAAG,CAC3D,MAAMxB,EAASJ,EAAQ4B,GACvB,GAAIxB,EAAOlB,OAAS,WAAakB,EAAO0C,OAAQ,OAAO1C,EAAOE,E,CAEhE,IAAK,IAAIsB,EAAQ5B,EAAQsB,OAAS,EAAGM,GAAS,EAAGA,GAAS,EAAG,CAC3D,MAAMxB,EAASJ,EAAQ4B,GACvB,GAAIxB,EAAOlB,OAAS,SAAU,OAAOkB,EAAOE,E,CAE9C,OAAON,EAAQA,EAAQsB,OAAS,IAAIhB,EACtC,CAEM,SAAUyC,EAAsB/C,GACpC,MAAMgD,EAAShD,EAAQiD,IAAIP,GAAiBQ,QAAQP,KAA6BA,IACjF,GAAIK,EAAO1B,SAAW,EAAG,OAAOK,UAChC,OAAOqB,EAAO1B,SAAW,EAAI0B,EAAO,GAAK,QAAQA,EAAOG,KAAK,SAC/D,C,SAEgBC,EAAUC,EAAkBC,EAAsBC,GAChE,OAAOA,EAAUD,EAAOE,SAAQC,GAASA,EAAMJ,OAAQA,CACzD,CAEA,SAASK,EAAa3D,GACpB,OAAOA,EAAI4D,aAAe,QAAU5D,EAAI6D,QAC1C,CAEM,SAAUC,EACdR,EACAS,GAEA,MAAMC,EAAW,IAAI/C,IAAI8C,GACzB,MAAME,EAAmBX,EAAKH,OAAOQ,GAAcT,KAAIlD,GAAOA,EAAIO,KAClE,MAAM2D,EAAsBD,EAAiBE,QAC3C,CAACC,EAAO7D,IAAO6D,GAASJ,EAAS9C,IAAIX,GAAM,EAAI,IAC/C,GAGF,MAAO,CACL0D,mBACAC,sBACAG,YAAaJ,EAAiB1C,OAAS,GAAK2C,IAAwBD,EAAiB1C,OACrF+C,cAAeJ,EAAsB,GAAKA,EAAsBD,EAAiB1C,OAErF,CAEM,SAAUgD,EACdR,EACA/D,GAEA,IAAK2D,EAAa3D,GAAM,MAAO,IAAI+D,GACnC,MAAMC,EAAW,IAAI/C,IAAI8C,GACzB,GAAIC,EAAS9C,IAAIlB,EAAIO,IAAKyD,EAAS7C,OAAOnB,EAAIO,SACzCyD,EAAS5C,IAAIpB,EAAIO,IACtB,MAAO,IAAIyD,EACb,CAEM,SAAUQ,EACdT,EACAU,GAEA,MAAMT,EAAW,IAAI/C,IAAI8C,GACzB,MAAMW,EAAQZ,EAA0BW,EAAYV,GAEpD,IAAK,MAAMxD,KAAMmE,EAAMT,iBAAkB,CACvC,GAAIS,EAAML,YAAaL,EAAS7C,OAAOZ,QAClCyD,EAAS5C,IAAIb,E,CAGpB,MAAO,IAAIyD,EACb,CAGM,SAAUW,EACdZ,EACAa,GAEA,OAAOJ,EAAyBT,EAAgBa,EAClD,CAEM,SAAUC,EAAwBnB,GACtC,MAAMoB,EAAQ7C,OAAOC,SAASwB,EAAMqB,YAAcxC,KAAKC,IAAI,EAAGkB,EAAMqB,YAAe,EACnF,OAAOxC,KAAKC,IAAIsC,EAAOpB,EAAMJ,KAAK/B,OACpC,CAEO,MAAMyD,EAAsB,CACjC,QACA,UACA,WACA,UACA,UACA,YAGI,SAAUC,EACdhG,GAEA,cACSA,IAAU,UAChB+F,EAA0CE,SAASjG,EAExD,CAEM,SAAUkG,EACdC,GAEA,OAAOH,EAAmBG,GAAU,gCAAgCA,IAAWxD,SACjF,CAGM,SAAUyD,EACdD,GAEA,IAAKH,EAAmBG,GAAS,MAAO,UACxC,GAAIA,IAAW,UAAW,MAAO,uCACjC,OAAOA,CACT,CAGM,SAAUE,EACdC,EACAT,EACAnF,EAAQ,oCACR6F,GAEA,IAAKvD,OAAOC,SAASqD,KAAetD,OAAOC,SAAS4C,GAAQ,OAAO,KACnE,MAAMW,EAAY,IAAIC,KAAKC,aAAaH,GACxC,OAAO7F,EACJiG,QAAQ,cAAeH,EAAUI,OAAON,IACxCK,QAAQ,UAAWH,EAAUI,OAAOf,GACzC,CAEM,SAAUgB,EACd7F,EACAqD,EACAC,EACAC,GAEA,MAAMuC,EAAmB,GACzB,MAAMC,EAAY,IAAI/E,IACtB,IAAK,MAAMZ,KAAUJ,EAAS,CAC5B,IAAKI,EAAOE,GAAGH,OAAQ2F,EAAOE,KAAK,8CAC9B,GAAID,EAAU9E,IAAIb,EAAOE,IAAKwF,EAAOE,KAAK,wBAAwB5F,EAAOE,MAC9E,IAAKF,EAAO6F,OAAO9F,SAAWC,EAAO8F,aAAa/F,OAAQ,CACxD2F,EAAOE,KAAK,UAAU5F,EAAOE,IAAM,2D,CAErCyF,EAAU5E,IAAIf,EAAOE,G,CAGvB,MAAMe,EAAW,IAAIL,IACrB,GAAIuC,EAAS,CACX,IAAK,MAAME,KAASH,EAAQ,CAC1B,IAAKG,EAAMnD,GAAGH,OAAQ2F,EAAOE,KAAK,6CAC7B,GAAI3E,EAASJ,IAAIwC,EAAMnD,IAAKwF,EAAOE,KAAK,uBAAuBvC,EAAMnD,MAC1Ee,EAASF,IAAIsC,EAAMnD,IACnB,GAAImD,EAAMqB,YAAc,MAAQrB,EAAMqB,WAAarB,EAAMJ,KAAK/B,OAAQ,CACpEwE,EAAOE,KAAK,SAASvC,EAAMnD,sD,CAE7B,GAAImD,EAAM0B,QAAU,OAASH,EAAmBvB,EAAM0B,QAAS,CAC7DW,EAAOE,KAAK,SAASvC,EAAMnD,gC,GAKjC,MAAM6F,EAAS,IAAInF,IACnB,IAAK,MAAMjB,KAAOqD,EAAUC,EAAMC,EAAQC,GAAU,CAClD,IAAKxD,EAAIO,GAAGH,OAAQ2F,EAAOE,KAAK,2CAC3B,GAAIG,EAAOlF,IAAIlB,EAAIO,IAAKwF,EAAOE,KAAK,qBAAqBjG,EAAIO,MAClE6F,EAAOhF,IAAIpB,EAAIO,G,CAGjB,MAAO,IAAI,IAAIU,IAAI8E,GACrB,CCtRM,SAAUM,EACdpH,EACAoB,GAEA,GAAIZ,EAAiBR,GAAQ,MAAO,CAAEE,KAAM,QAASmH,SAAU,QAASrH,SACxE,GAAIA,GAAS,MAAQO,EAAiBP,GAAQ,CAC5C,MAAO,CAAEE,KAAM,QAASmH,SAAU,QAASrH,Q,CAE7C,GAAII,EAAgBJ,GAAQ,MAAO,CAAEE,KAAM,OAAQmH,SAAU,OAAQrH,SACrE,GAAIK,EAAiBL,GAAQ,MAAO,CAAEE,KAAM,QAASmH,SAAU,QAASrH,SACxE,GAAIM,EAAkBN,GAAQ,MAAO,CAAEE,KAAM,SAAUmH,SAAU,SAAUrH,SAC3E,GAAIG,EAAeH,GAAQ,CACzB,MAAO,CACLE,KAAM,MACNmH,SAAU,MACVrH,QACAsH,QAAStH,EAAMsH,SAAW,W,CAI9B,MAAMC,EAActH,EAAuBD,GAC3C,MAAMwH,EAA8BzH,EAAgBC,IAAUuH,EAC1DvH,EACA,CACEa,QAASb,EACTyH,mBAAoBzH,IAAU,SAAW,eAAiB,UAEhE,MAAM0H,GAAcH,IAAgBC,EAAKG,YAAchF,WAAa6E,EAAKG,YAAc,IACvF,MAAO,CACLzH,KAAM,OACNmH,SAAUE,EAAc,eAAiB,OACzCvH,MAAOwH,EACPD,cACAG,aACAJ,QAASC,EAAc,eAAiBG,EAAa,SAAW,QAChEE,MAAOJ,EAAKK,MAAQzG,EAAOyG,MAAQ,MAEvC,CC7BM,SAAUC,GAAuBC,GACrC,MAAMpD,EAAaoD,EAAMC,gBAAkB,WAC3C,MAAMxC,EAAapB,EAAU2D,EAAM1D,KAAM0D,EAAMzD,OAAQyD,EAAMxD,SAC7D,MAAMO,EAAiB,IAAI9C,IAAI+F,EAAMjD,gBACrC,MAAMjD,EAAoB,IAAIG,IAAI+F,EAAMlG,mBACxC,MAAMoG,EAAqBF,EAAMxD,SAAWwD,EAAMzD,OAAOhC,OAAS,GAChEyF,EAAMzD,OAAO7B,OAAMgC,GAAS5C,EAAkBI,IAAIwC,EAAMnD,MAC1D,MAAM4G,EAAkBH,EAAMxD,SAAWwD,EAAMzD,OAAOhC,OAAS,IAAM2F,EACrE,MAAME,EAAmBpE,EAAsBgE,EAAM/G,SACrD,MAAMoH,EAAmBxE,EAAsBmE,EAAM/G,SACrD,MAAMqH,EAAa,IACb1D,EAAa,CAAC,8CAAgD,MAC/DoD,EAAM/G,QAAQiD,KAAI7C,IACnB,MAAMuC,EAAQD,EAAgBtC,GAC9B,IAAKuC,EAAO,MAAO,iBACnB,OAAOvC,EAAOE,KAAO8G,EAAmB,UAAUzE,UAAgBA,CAAK,KAEzEQ,KAAK,KACP,MAAMmE,EAAqC,CACzC,iCAAkCD,GAAc,kBAElD,GAAIF,GAAoB,KAAM,CAC5BG,EAAW,uCAAyCH,C,CAGtD,MAAO,CACL5D,QAASwD,EAAMxD,QACfI,aACAa,aACA+C,QAAS/C,EAAWlD,OAAS,EAC7BwC,iBACA0D,UAAW3D,EAA0BW,EAAYuC,EAAMjD,gBACvDjD,oBACAyC,OAAQyD,EAAMzD,OAAOL,KAAIQ,IACvB,MAAMU,EAAQS,EAAwBnB,GACtC,MAAMgE,EAAchE,EAAMJ,KAAK/B,OAC/B,MAAMoG,EAAajE,EAAMkE,YAAc,GAAGxD,KAASA,IAAU,EAAI,OAAS,UAC1E,MAAMgB,EAASH,EAAmBvB,EAAM0B,QAAU1B,EAAM0B,OAASxD,UACjE,MAAO,CACL8B,QACAU,QACAsD,cACAE,WAAY,GAAGF,QAAkBC,WACjCvC,SACAyC,YAAa1C,EAAsBC,GACnC0C,WAAYzC,EAAqBD,GACjC5D,UAAWV,EAAkBI,IAAIwC,EAAMnD,IACvCkH,UAAW7D,EACPE,EAA0BJ,EAAMJ,KAAM0D,EAAMjD,gBAC5C,KACL,IAEHgE,aAAcf,EAAM/G,QAAQsB,QAAUqC,EAAa,EAAI,GACvDsD,qBACAC,kBACAa,gBAAiBb,EAAkBxF,EAAqBqF,EAAM/G,SAAW2B,UACzEyF,mBACAE,aAEJ,CC3EM,SAAUU,GAA0BjB,GACxC,MAAMkB,EAAqBlB,EAAMmB,iBAAmBnB,EAAMoB,mBAAqB,EAC/E,MAAO,CACLC,kBAAmBrB,EAAMoB,mBACzBE,SAAU,CACRC,MAAOL,GAAsBlB,EAAMwB,mBAAqB,EACxDC,IAAKP,GACHlB,EAAMwB,mBAAqBxB,EAAMoB,mBAAqBpB,EAAMmB,iBAAmB,EACjFO,WAAYR,GAAsBlB,EAAM2B,gBAAkB3B,EAAM4B,kBAAoB,GAEtFC,aAAc7B,EAAMwB,mBACpBM,gBAAiBvG,KAAKC,IAAI,EAAGwE,EAAMmB,iBAAmBnB,EAAMoB,oBAC5DW,oBAAqB/B,EAAMgC,wBAA0B,MACnDhC,EAAMiC,yBAA2B,KAC/B,KACA1G,KAAKC,IAAI,EAAGwE,EAAMgC,uBAAyBhC,EAAMiC,yBAEzD,C,MAQaC,GAOX,WAAAC,CAA6BC,GAAAC,KAAAD,UANrBC,KAAAC,UAAY,MACZD,KAAAE,kBAAwC,KACxCF,KAAAG,eAAwC,KACxCH,KAAAI,MAAuB,KACvBJ,KAAAf,SAAsC,KA2CtCe,KAAAK,SAAW,KACjB,IAAKL,KAAKC,WAAaD,KAAKI,QAAU,KAAM,OAC5CJ,KAAKI,MAAQE,uBAAsB,KACjCN,KAAKI,MAAQ,KACbJ,KAAKO,MAAM,GACX,EAGaP,KAAAQ,aAAe,KAC9BR,KAAKS,oBACL,GAAIT,KAAKD,QAAQtH,OAAOiI,wBAAyBV,KAAKW,mBACtDX,KAAKK,UAAU,EAGAL,KAAAY,YAAeC,IAC9B,MAAMC,EAAWd,KAAKE,kBACtB,IAAKY,EAAU,OAEf,GAAI5H,KAAK6H,IAAIF,EAAMG,QAAU9H,KAAK6H,IAAIF,EAAMI,QAAS,CACnD,MAAM9H,EAAMD,KAAKC,IAAI,EAAG2H,EAASI,YAAcJ,EAASK,aACxD,MAAMC,EAAUN,EAASO,YAAc,GAAKR,EAAMG,OAAS,EAC3D,MAAMM,EAAQR,EAASO,YAAclI,GAAO0H,EAAMG,OAAS,EAC3D,GAAII,GAAWE,EAAOT,EAAMU,iBAC5B,M,CAGF,IAAKvB,KAAKD,QAAQtH,OAAOiI,yBAA2BG,EAAMI,SAAW,EAAG,OACxE,MAAM9H,EAAMD,KAAKC,IAAI,EAAG2H,EAASU,aAAeV,EAASW,cACzD,MAAML,EAAUN,EAASY,WAAa,GAAKb,EAAMI,OAAS,EAC1D,MAAMK,EAAQR,EAASY,WAAavI,GAAO0H,EAAMI,OAAS,EAC1D,IAAKG,IAAYE,EAAO,OAExBtB,KAAKD,QAAQ4B,oBAAoBd,EAAMI,QACvCJ,EAAMU,gBAAgB,C,CAxExB,OAAAK,GACE5B,KAAKC,UAAY,KACjBD,KAAK6B,S,CAGP,UAAAC,GACE9B,KAAKC,UAAY,MACjB,GAAID,KAAKI,QAAU,KAAM2B,qBAAqB/B,KAAKI,OACnDJ,KAAKI,MAAQ,KACbJ,KAAKE,mBAAmB8B,oBAAoB,SAAUhC,KAAKQ,cAC3DR,KAAKE,mBAAmB8B,oBAAoB,QAAShC,KAAKY,aAC1DZ,KAAKE,kBAAoB,KACzBF,KAAKG,gBAAgB2B,aACrB9B,KAAKG,eAAiB,I,CAIxB,OAAA0B,GACE,IAAK7B,KAAKC,UAAW,OACrB,MAAMa,SAAEA,GAAad,KAAKD,QAAQkC,WAClC,MAAMC,EAAkBpB,IAAad,KAAKE,kBAC1C,GAAIgC,EAAiB,CACnBlC,KAAKE,mBAAmB8B,oBAAoB,SAAUhC,KAAKQ,cAC3DR,KAAKE,mBAAmB8B,oBAAoB,QAAShC,KAAKY,aAC1DZ,KAAKG,gBAAgB2B,aACrB9B,KAAKE,kBAAoBY,EACzBA,GAAUqB,iBAAiB,SAAUnC,KAAKQ,aAAc,CAAE4B,QAAS,OACnEtB,GAAUqB,iBAAiB,QAASnC,KAAKY,YAAa,CAAEwB,QAAS,QAEjE,UAAWC,iBAAmB,aAAevB,EAAU,CACrDd,KAAKG,iBAALH,KAAKG,eAAmB,IAAIkC,eAAerC,KAAKK,WAChDL,KAAKG,eAAemC,QAAQxB,E,EAKhCd,KAAKO,M,CAuCC,iBAAAE,GACN,MAAMK,EAAWd,KAAKE,kBACtB,IAAKY,EAAU,OACf,MAAM3H,EAAMD,KAAKC,IAAI,EAAG2H,EAASI,YAAcJ,EAASK,aACxD,MAAMoB,EAAUrJ,KAAKG,IAAIF,EAAKD,KAAKC,IAAI,EAAG2H,EAASO,aACnD,GAAIP,EAASO,aAAekB,EAASzB,EAASO,WAAakB,C,CAGrD,gBAAA5B,GACN,MAAMG,EAAWd,KAAKE,kBACtB,IAAKY,EAAU,OACf,MAAM3H,EAAMD,KAAKC,IAAI,EAAG2H,EAASU,aAAeV,EAASW,cACzD,MAAMc,EAAUrJ,KAAKG,IAAIF,EAAKD,KAAKC,IAAI,EAAG2H,EAASY,YACnD,GAAIZ,EAASY,YAAca,EAASzB,EAASY,UAAYa,C,CAGnD,IAAAhC,GACN,MAAM0B,EAAWjC,KAAKD,QAAQkC,WAC9B,MAAMnB,EAAWmB,EAASnB,SAC1B,IAAKA,EAAU,OAGf,MAAMrI,EAAOuH,KAAKD,QAAQtH,OAC1B,MAAM+J,EAAkB/J,EAAKgK,sBAAwBhK,EAAKiK,sBACxDT,EAASU,oBAAsBV,EAAS7B,OAAS6B,EAASW,gBAC5D,MAAMC,EAAUjE,GAA0B,CACxCG,mBAAoB+B,EAASK,YAC7B5B,kBAAmBuB,EAASW,aAC5B3C,iBAAkBgC,EAASI,YAC3B5B,gBAAiBwB,EAASU,aAC1BrC,mBAAoB2B,EAASO,WAC7B1B,uBAAwB6C,EACpBP,EAASW,gBAAiBE,wBAAwBC,IAClDxK,UACJqH,wBAAyB4C,EACrBP,EAAS7B,MAAO0C,wBAAwBC,IACxCxK,YAGNyH,KAAKgD,YACHlC,EACA,iCACA,GAAG+B,EAAQ7D,uBAEb,GAAIiD,EAASgB,kBAAmB,CAC9BjD,KAAKgD,YACHf,EAASgB,kBACT,kCACA,GAAGJ,EAAQrD,kBAEbQ,KAAKgD,YACHf,EAASgB,kBACT,sCACA,GAAGJ,EAAQpD,oB,CAGf,GAAIoD,EAAQnD,sBAAwB,MAAQuC,EAASU,mBAAoB,CACvE3C,KAAKgD,YACHf,EAASU,mBACT,uCACA,GAAGE,EAAQnD,wB,CAIf,IACGM,KAAKf,UACNe,KAAKf,SAASC,QAAU2D,EAAQ5D,SAASC,OACzCc,KAAKf,SAASG,MAAQyD,EAAQ5D,SAASG,KACvCY,KAAKf,SAASI,aAAewD,EAAQ5D,SAASI,WAC9C,CACAW,KAAKf,SAAW4D,EAAQ5D,SACxBe,KAAKD,QAAQmD,gBAAgBL,EAAQ5D,S,EAIjC,WAAA+D,CAAYG,EAAsBC,EAAkBxN,GAC1D,GAAIuN,EAAQE,MAAMC,iBAAiBF,KAAcxN,EAAO,CACtDuN,EAAQE,MAAML,YAAYI,EAAUxN,E,SC1M7B2N,GAUX,WAAAzD,CAA6BC,GAAAC,KAAAD,UATpBC,KAAAwD,6BAA+BC,uBAAyB,YAEzDzD,KAAAC,UAAY,MACZD,KAAA0D,qBAAoD,KACpD1D,KAAA2D,iBAAuC,KACvC3D,KAAA4D,eAAiB,MACjB5D,KAAA6D,kBAAoB,EACpB7D,KAAA8D,uBAAyB,C,CAIjC,UAAAC,GACE/D,KAAK8D,uBAAyB9D,KAAKD,QAAQ1E,QAAQ2I,c,CAGrD,OAAApC,GACE5B,KAAKC,UAAY,KACjBD,KAAK6B,S,CAGP,UAAAC,GACE9B,KAAKC,UAAY,MACjBD,KAAKiE,oB,CAGP,OAAApC,GACE,IAAK7B,KAAKC,UAAW,OACrB,MAAM5E,EAAQ2E,KAAKD,QAAQ1E,QAC3B,IACGA,EAAM6I,aACP7I,EAAM8I,eAAiB,SACtB9I,EAAM+I,WACL/I,EAAMgJ,eAAetN,SACtBiJ,KAAKwD,wBACLnI,EAAMyF,WACNzF,EAAMiJ,SACP,CACAtE,KAAKiE,qBACL,M,CAGF,GAAIjE,KAAK0D,sBAAwB1D,KAAK2D,mBAAqBtI,EAAMiJ,SAAU,OAC3EtE,KAAKiE,qBACL,MAAMM,EAAY3L,OAAOC,SAASwC,EAAMmJ,mBACpCtL,KAAKC,IAAI,EAAGkC,EAAMmJ,mBAClB,EACJxE,KAAK0D,qBAAuB,IAAID,sBAC9BgB,IACE,GAAIA,EAAQhL,MAAKiL,GAASA,EAAMC,iBAAiB3E,KAAK4E,QAAQ,OAAO,GAEvE,CACEC,KAAMxJ,EAAMyJ,gBAAkBzJ,EAAMyF,SAAW,KAC/CiE,WAAY,WAAWR,YAG3BvE,KAAK2D,iBAAmBtI,EAAMiJ,SAC9BtE,KAAK0D,qBAAqBpB,QAAQjH,EAAMiJ,S,CAG1C,gBAAAU,GACEhF,KAAKiF,c,CAGP,WAAAC,GACE,MAAM7J,EAAQ2E,KAAKD,QAAQ1E,QAC3B,MAAM8J,EAAY9J,EAAM2I,eACxB,IAAK3I,EAAM6I,YAAa,CACtBlE,KAAK8D,uBAAyBqB,EAC9BnF,KAAKiF,eACL,M,CAEF,GAAIE,EAAYnF,KAAK8D,uBAAwB,CAC3C,MAAMsB,EAAQD,EAAYnF,KAAK8D,uBAC/B9D,KAAKD,QAAQsF,SACXhK,EAAMiK,gBACH/I,QAAQ,UAAWpF,OAAOiO,IAC1B7I,QAAQ,UAAWpF,OAAOgO,I,CAGjC,GAAIA,EAAYnF,KAAK6D,kBAAmB7D,KAAK4D,eAAiB,MAC9D5D,KAAK8D,uBAAyBqB,EAC9BnF,KAAKiE,oB,CAGP,eAAAsB,GACEvF,KAAK8D,uBAAyB9D,KAAKD,QAAQ1E,QAAQ2I,eACnDhE,KAAKiF,c,CAGP,oBAAAO,GACExF,KAAKiE,oB,CAGP,cAAAwB,CAAeC,GACb,MAAMrK,EAAQ2E,KAAKD,QAAQ1E,QAC3B,IAAKA,EAAM6I,YAAa,CACtBlE,KAAKiF,eACL,M,CAEF,GAAIS,EAAS,CACX1F,KAAK4D,eAAiB,KACtB5D,KAAKD,QAAQsF,SAAShK,EAAMsK,iB,MACvB,GAAItK,EAAM8I,eAAiB,SAAU,CAE1CnE,KAAK4D,eAAiB,K,CAExB5D,KAAKiE,oB,CAGP,YAAA2B,CAAaC,GACX,IAAK7F,KAAKD,QAAQ1E,QAAQ6I,YAAa,CACrClE,KAAKiF,eACL,M,CAEF,GAAIY,GAAO9O,OAAQ,CACjBiJ,KAAK4D,eAAiB,MACtB5D,KAAKD,QAAQsF,SAASQ,E,CAExB7F,KAAKiE,oB,CAGP,cAAA6B,CAAe1B,EAAkB2B,GAC/B,IAAK/F,KAAKD,QAAQ1E,QAAQ6I,YAAa,CACrClE,KAAKiF,eACL,M,CAEF,IAAKb,EAAS,CACZpE,KAAK4D,eAAiB,MACtB,GAAImC,EAAS/F,KAAKD,QAAQsF,SAASrF,KAAKD,QAAQ1E,QAAQ2K,kB,CAE1DhG,KAAKiE,oB,CAGP,OAAAW,CAAQqB,GACN,MAAM5K,EAAQ2E,KAAKD,QAAQ1E,QAC3B,IACGA,EAAM6I,cACN7I,EAAM+I,SACP/I,EAAM6K,aACLD,IAAW,WAAa5K,EAAMgJ,eAAetN,QAC9CiJ,KAAK4D,eACL,OAEF5D,KAAK4D,eAAiB,KACtB5D,KAAK6D,kBAAoBxI,EAAM2I,eAC/BhE,KAAKD,QAAQsF,SAAShK,EAAMsK,kBAC5B3F,KAAKD,QAAQ6E,QAAQ,CACnBqB,SACAE,aAAc9K,EAAM8K,aACpBnC,eAAgBhE,KAAK6D,mB,CAIjB,YAAAoB,GACNjF,KAAK4D,eAAiB,MACtB5D,KAAK6D,kBAAoB7D,KAAKD,QAAQ1E,QAAQ2I,eAC9ChE,KAAKiE,oB,CAGC,kBAAAA,GACNjE,KAAK0D,sBAAsB5B,aAC3B9B,KAAK0D,qBAAuB,KAC5B1D,KAAK2D,iBAAmB,I,EC/J5B,SAASyC,GAAc/L,GACrB,OAAOA,EAAM8L,cAAgB9L,EAAMnD,EACrC,CAEA,SAASmP,GAAiBC,EAAkBjM,EAAmBU,GAC7D,OAAOuL,EACJC,MAAM,WAAWxM,KAAKM,EAAM/D,OAC5BiQ,MAAM,WAAWxM,KAAK5C,OAAO4D,GAASV,EAAMJ,KAAK/B,SACjDqO,MAAM,YAAYxM,KAAK5C,OAAOkD,EAAMJ,KAAK/B,SACzCqO,MAAM,WAAWxM,KAAK5C,OAAOkD,EAAMqB,YAAcrB,EAAMJ,KAAK/B,QACjE,C,MAGasO,GAQX,WAAA1G,CAA6BC,GAAAC,KAAAD,UAPpBC,KAAAwD,6BAA+BC,uBAAyB,YAEzDzD,KAAAC,UAAY,MACZD,KAAA0D,qBAAoD,KACpD1D,KAAAyG,UAAY,IAAIC,IAChB1G,KAAA2G,QAAU,IAAID,G,CAItB,UAAA3C,GACE/D,KAAKyG,UAAYzG,KAAK4G,iB,CAGxB,OAAAhF,GACE5B,KAAKC,UAAY,KACjBD,KAAK6B,S,CAGP,UAAAC,GACE9B,KAAKC,UAAY,MACjBD,KAAKiE,oB,CAGP,OAAApC,GACE,IAAK7B,KAAKC,UAAW,OACrB,MAAM5E,EAAQ2E,KAAKD,QAAQ1E,QAC3B,IACGA,EAAMwL,SACPxL,EAAM8I,eAAiB,SACtBnE,KAAKwD,wBACLnI,EAAMyF,SACP,CACAd,KAAKiE,qBACL,M,CAGFjE,KAAKiE,qBACL,MAAMM,EAAY3L,OAAOC,SAASwC,EAAMmJ,mBACpCtL,KAAKC,IAAI,EAAGkC,EAAMmJ,mBAClB,EACJxE,KAAK0D,qBAAuB,IAAID,sBAC9BgB,IACE,IAAK,MAAMC,KAASD,EAAS,CAC3B,IAAKC,EAAMC,eAAgB,SAC3B,MAAMjN,EAAWgN,EAAMoC,OAAuBC,QAAQrP,QACtD,GAAIA,EAASsI,KAAK4E,QAAQlN,EAAS,O,IAGvC,CACEmN,KAAMxJ,EAAMyJ,gBAAkBzJ,EAAMyF,SAAW,KAC/CiE,WAAY,WAAWR,YAI3B,IAAK,MAAO7M,EAAS4M,KAAajJ,EAAM2L,UAAW,CACjD,MAAM3M,EAAQgB,EAAMnB,OAAO+M,MAAKC,GAAQA,EAAKhQ,KAAOQ,IACpD,IAAK2C,GAAO+J,SAAW/J,EAAM6L,aAAe7L,EAAMgK,eAAetN,OAAQ,SACzEiJ,KAAK0D,qBAAqBpB,QAAQgC,E,EAItC,gBAAAU,GACEhF,KAAK2G,QAAQQ,QACbnH,KAAKyG,UAAYzG,KAAK4G,kBACtB5G,KAAKiE,oB,CAGP,WAAAiB,GACE,MAAM7J,EAAQ2E,KAAKD,QAAQ1E,QAC3B,MAAM+L,EAAgB,IAAIV,IAE1B,IAAK,MAAMrM,KAASgB,EAAMnB,OAAQ,CAChC,MAAMvC,EAAOqI,KAAKqH,SAAShN,GAC3B,MAAMiN,EAAWtH,KAAKyG,UAAUc,IAAIlN,EAAMnD,IAC1C,MAAMyP,EAAU3G,KAAK2G,QAAQY,IAAIlN,EAAMnD,IAEvC,IAAKoQ,GAAYA,EAASE,WAAa7P,EAAK6P,SAAU,CACpDxH,KAAK2G,QAAQ7O,OAAOuC,EAAMnD,G,KACrB,CACL,GAAIS,EAAKoD,MAAQuM,EAASvM,MAAO,CAC/BiF,KAAKD,QAAQsF,SACXgB,GAAiBhL,EAAMiK,gBAAiBjL,EAAO1C,EAAKoD,MAAQuM,EAASvM,O,CAGzE,IAAKuM,EAASzB,OAASlO,EAAKkO,MAAO,CACjC7F,KAAK2G,QAAQ7O,OAAOuC,EAAMnD,IAC1B8I,KAAKD,QAAQsF,SAAS1N,EAAKkO,M,CAE7B,GAAIyB,EAASlD,UAAYzM,EAAKyM,QAAS,CACrCpE,KAAK2G,QAAQ7O,OAAOuC,EAAMnD,IAC1B8I,KAAKD,QAAQsF,SAASgB,GAAiBhL,EAAM2K,kBAAmB3L,G,CAElE,GAAIsM,GAAWhP,EAAKoD,MAAQ4L,EAAQ5L,MAAOiF,KAAK2G,QAAQ7O,OAAOuC,EAAMnD,IACrE,GAAIyP,GAAWW,EAAS5B,UAAY/N,EAAK+N,SAAW/N,EAAKoD,QAAU4L,EAAQ5L,MAAO,CAChFiF,KAAK2G,QAAQ7O,OAAOuC,EAAMnD,G,EAI9BkQ,EAAcK,IAAIpN,EAAMnD,GAAIS,E,CAG9BqI,KAAKyG,UAAYW,EACjB,IAAK,MAAM1P,KAAWsI,KAAK2G,QAAQe,OAAQ,CACzC,IAAKN,EAAcvP,IAAIH,GAAUsI,KAAK2G,QAAQ7O,OAAOJ,E,CAEvDsI,KAAKiE,oB,CAGP,oBAAAuB,GACExF,KAAKiE,oB,CAGP,OAAAW,CAAQlN,EAAiBuO,GACvB,MAAM5K,EAAQ2E,KAAKD,QAAQ1E,QAC3B,MAAMhB,EAAQgB,EAAMnB,OAAO+M,MAAKC,GAAQA,EAAKhQ,KAAOQ,IACpD,IACG2D,EAAMwL,UACNxM,GAAO+J,SACR/J,EAAM6L,aACLD,IAAW,WAAa5L,EAAMgK,eAAetN,QAC9CiJ,KAAK2G,QAAQ9O,IAAIH,GACjB,OAEF,MAAM8P,EAAWpB,GAAc/L,GAC/B2F,KAAK2G,QAAQc,IAAI/P,EAAS,CAAE8P,WAAUzM,MAAOV,EAAMJ,KAAK/B,SACxD8H,KAAKD,QAAQsF,SAASgB,GAAiBhL,EAAMsK,iBAAkBtL,IAC/D2F,KAAKD,QAAQ6E,QAAQ,CACnBlN,UACAuO,SACAE,aAAcqB,EACdxD,eAAgB3J,EAAMJ,KAAK/B,Q,CAIvB,eAAA0O,GACN,OAAO,IAAIF,IAAI1G,KAAKD,QAAQ1E,QAAQnB,OAAOL,KAAIQ,GAAS,CAACA,EAAMnD,GAAI8I,KAAKqH,SAAShN,M,CAG3E,QAAAgN,CAAShN,GACf,MAAO,CACLU,MAAOV,EAAMJ,KAAK/B,OAClBkM,UAAW/J,EAAM+J,QACjBsB,UAAWrL,EAAM6L,YACjBL,MAAOxL,EAAMgK,eAAetN,QAAU,GACtCyQ,SAAUpB,GAAc/L,G,CAIpB,kBAAA4J,GACNjE,KAAK0D,sBAAsB5B,aAC3B9B,KAAK0D,qBAAuB,I,EC/L1B,SAAUiE,GAAwBhK,GACtC,IACG/E,OAAOC,SAAS8E,EAAM4B,qBACtB3G,OAAOC,SAAS8E,EAAMiK,mBACtBhP,OAAOC,SAAS8E,EAAMkK,gBACvBlK,EAAM4B,mBAAqB,GAC3B5B,EAAMkK,eAAiB,EACvB,CACA,OAAOtP,S,CAET,MAAMuP,EAAqB5O,KAAKC,IAAI,EAAGwE,EAAM4B,kBAAoB5B,EAAMiK,iBACvE,OAAO1O,KAAKC,IAAI,EAAGD,KAAK6O,OAAOD,EAAqB,IAAOnK,EAAMkK,eACnE,CCUM,SAAUG,GACdrK,GAEA,MAAMsK,EAAkB/O,KAAKC,IAAI,EAAGwE,EAAMsK,iBAC1C,MAAMC,EAAgBhP,KAAKC,IAAI,EAAGwE,EAAMuK,eACxC,MAAMC,EAAqBxK,EAAMyK,qBAAuBzK,EAAM0K,oBAC9D,MAAMC,EAAoB3K,EAAMyK,qBAAuBH,EACvD,MAAMM,EAAoBrP,KAAKC,IAC7B,EACAwE,EAAM0K,oBAAsBJ,EAAkBC,GAEhD,MAAMM,EAAoBtP,KAAKC,IAAIwE,EAAM8K,eAAgBH,GACzD,MAAMI,EAAmBxP,KAAKG,IAC5BkP,EACArP,KAAKC,IAAI,EAAGgP,EAAqBD,EAAgBM,IAGnD,MAAO,CACLD,oBACAG,mBACAC,QAAShL,EAAM8K,gBAAkBH,EAAoB,GAEzD,C,MAQaM,GAMX,WAAA9I,CAA6BC,GAAAC,KAAAD,UALrBC,KAAAC,UAAY,MACZD,KAAA6I,WAA0C,KAC1C7I,KAAAG,eAAwC,KACxCH,KAAA6C,QAA0C,KA+EjC7C,KAAAO,KAAO,KACtB,IAAKP,KAAKC,YAAcD,KAAKD,QAAQ8G,YAAc7G,KAAK6I,WAAY,OACpE,MAAMC,KAAEA,EAAIC,QAAEA,GAAY/I,KAAKD,QAAQkC,WACvC,IAAK6G,IAASC,EAAS,OAEvB,MAAMC,EAAWF,EAAKhG,wBACtB,MAAMmG,EAAiBjJ,KAAK6I,sBAAsBK,YAC9ClJ,KAAK6I,WAAW/F,wBAChB,CAAEC,IAAK,EAAGoG,OAAQC,OAAOC,aAC7B,MAAMC,EAAStJ,KAAKD,QAAQuJ,SAC5B,MAAM3R,EAAOqQ,GAA+B,CAC1CI,qBAAsBa,EAAelG,IACrCsF,oBAAqBY,EAAeE,OACpCV,eAAgBO,EAASjG,IACzBkF,gBAAiBsB,EAAmBD,EAAOE,WAAY,EAAGV,GAC1DZ,cAAeqB,EAAmBD,EAAOG,SAAU,EAAGX,KAGxD9I,KAAKgD,YACH8F,EACA,4CACA,GAAGnR,EAAK4Q,uBAEVvI,KAAKgD,YACH+F,EACA,2CACA,GAAGpR,EAAK+Q,sBAEV,IACG1I,KAAK6C,SACN7C,KAAK6C,QAAQ0F,oBAAsB5Q,EAAK4Q,mBACxCvI,KAAK6C,QAAQ6F,mBAAqB/Q,EAAK+Q,kBACvC1I,KAAK6C,QAAQ8F,UAAYhR,EAAKgR,QAC9B,CACA3I,KAAK6C,QAAUlL,EACfqI,KAAKD,QAAQ2J,WAAW/R,E,GA9G5B,OAAAiK,GACE5B,KAAKC,UAAY,KACjBD,KAAK6B,S,CAGP,UAAAC,GACE9B,KAAKC,UAAY,MACjBD,KAAK2J,oBACL3J,KAAK4J,e,CAGP,OAAA/H,GACE,IAAK7B,KAAKC,UAAW,OACrB,IAAKD,KAAKD,QAAQ8G,UAAW,CAC3B7G,KAAK2J,oBACL3J,KAAK4J,gBACL,M,CAGF,MAAMd,EAAO9I,KAAKD,QAAQkC,WAAW6G,KACrC,IAAKA,EAAM,OACX,MAAMe,EAAiB7J,KAAK8J,eAAehB,GAC3C,GAAIe,IAAmB7J,KAAK6I,WAAY,CACtC7I,KAAK2J,oBACL3J,KAAK6I,WAAagB,EAClB7J,KAAK6I,WAAW1G,iBAAiB,SAAUnC,KAAKO,KAAM,CAAE6B,QAAS,OACjEgH,OAAOjH,iBAAiB,SAAUnC,KAAKO,KAAM,CAAE6B,QAAS,OACxD,UAAWC,iBAAmB,aAAerC,KAAK6I,sBAAsBK,YAAa,CACnFlJ,KAAKG,eAAiB,IAAIkC,eAAerC,KAAKO,MAC9CP,KAAKG,eAAemC,QAAQtC,KAAK6I,W,EAGrC7I,KAAKO,M,CAIP,aAAAwJ,CAAcC,GACZ,IAAKhK,KAAK6I,YAAcmB,IAAU,EAAG,OAAO,MAC5C,GAAIhK,KAAK6I,sBAAsBK,YAAa,CAC1C,MAAM5B,EAAWtH,KAAK6I,WAAWnH,UACjC,MAAMvI,EAAMD,KAAKC,IAAI,EAAG6G,KAAK6I,WAAWrH,aAAexB,KAAK6I,WAAWpH,cACvEzB,KAAK6I,WAAWnH,UAAYxI,KAAKG,IAAIF,EAAKD,KAAKC,IAAI,EAAGmO,EAAW0C,IACjE,OAAOhK,KAAK6I,WAAWnH,YAAc4F,C,CAGvC,MAAM2C,EAAmBC,SAASD,iBAClC,MAAM3C,EAAW8B,OAAOe,QACxB,MAAMhR,EAAMD,KAAKC,IACf,GACC8Q,GAAkBzI,cAAgB0I,SAASE,gBAAgB5I,cAC1D4H,OAAOC,aAEX,MAAM1R,EAAOuB,KAAKG,IAAIF,EAAKD,KAAKC,IAAI,EAAGmO,EAAW0C,IAClD,GAAIrS,IAAS2P,EAAU8B,OAAOiB,SAAS,CAAEtH,IAAKpL,EAAM2S,SAAU,SAC9D,OAAO3S,IAAS2P,C,CAGV,iBAAAqC,GACN3J,KAAK6I,YAAY7G,oBAAoB,SAAUhC,KAAKO,MACpD6I,OAAOpH,oBAAoB,SAAUhC,KAAKO,MAC1CP,KAAK6I,WAAa,KAClB7I,KAAKG,gBAAgB2B,aACrB9B,KAAKG,eAAiB,I,CAGhB,aAAAyJ,GACN,MAAMd,KAAEA,EAAIC,QAAEA,GAAY/I,KAAKD,QAAQkC,WACvC6G,GAAMzF,MAAMkH,eAAe,6CAC3BxB,GAAS1F,MAAMkH,eAAe,4CAC9B,GAAIvK,KAAK6C,UAAY,KAAM,CACzB7C,KAAK6C,QAAU,KACf7C,KAAKD,QAAQ2J,WAAW,K,EA2CpB,cAAAI,CAAehB,GACrB,IAAI0B,EAAWxK,KAAKyK,eAAe3B,GACnC,MAAO0B,GAAYA,IAAaN,SAASE,gBAAiB,CACxD,MAAMnL,EAAWyL,iBAAiBF,GAAUG,UAC5C,GAAI1L,IAAa,QAAUA,IAAa,UAAYA,IAAa,UAAW,CAC1E,OAAOuL,C,CAETA,EAAWxK,KAAKyK,eAAeD,E,CAEjC,OAAOpB,M,CAGD,cAAAqB,CAAetH,GACrB,OAAQA,EAAwByH,cAAcC,eAAiB1H,EAAQ0H,a,CAGjE,WAAA7H,CAAYG,EAAsBC,EAAkBxN,GAC1D,GAAIuN,EAAQE,MAAMC,iBAAiBF,KAAcxN,EAAO,CACtDuN,EAAQE,MAAML,YAAYI,EAAUxN,E,GCvM1C,MAAMkV,GAAe,IAAM,65DCA3B,MAAMC,GAAqB,IAAM,ovQCAjC,MAAMC,GAAW,IAAM,+m2C,MC0EVC,GAAKC,EAAA,MAAAD,UAAA/B,EATlB,WAAApJ,CAAAqL,G,gaAYUnL,KAAApJ,QAAyB,GAEzBoJ,KAAA/F,KAAmB,GAEnB+F,KAAA9F,OAAuB,GAEvB8F,KAAAoL,SAAsC,KAEtCpL,KAAAqL,KAA8B,KAE9BrL,KAAAvI,kBAA8B,GAK9BuI,KAAAsL,kBAA4C,SAQ5CtL,KAAAuL,mBAA6B,oCAC7BvL,KAAAwL,aAAwB,MAMxBxL,KAAAyL,YAAuB,MAEvBzL,KAAA0L,wBAA2C,EAE3C1L,KAAA2L,sBAAyC,EAIzC3L,KAAApC,cAAoC,OAEpCoC,KAAAtF,eAA2B,GAG3BsF,KAAA0F,QAAmB,MAEnB1F,KAAA4L,aAAuB,GACvB5L,KAAA6L,aAAuB,aACvB7L,KAAA8L,UAAoB,wBAEpB9L,KAAA6F,MAAiB,MACjB7F,KAAA+L,aAAuB,sBACvB/L,KAAAgM,UAAoB,gCACpBhM,KAAAiM,eAAyB,gBAGzBjM,KAAAkM,SAA0B,WAE1BlM,KAAAmM,WAA0C,KAC1CnM,KAAAmE,aAAkC,OAClCnE,KAAAoE,QAAmB,MACnBpE,KAAAkG,YAAuB,MAGvBlG,KAAAmG,aAAgC,UAEhCnG,KAAAwE,kBAA4B,EAC5BxE,KAAAoM,cAAwB,YACxBpM,KAAAqM,WAAqB,QACrBrM,KAAA2F,iBAA2B,qBAC3B3F,KAAAgG,kBAA4B,qBAE5BhG,KAAAsF,gBAA0B,iDAC1BtF,KAAAsM,mBAA6B,YAE7BtM,KAAAuM,uBAAiC,4BAEjCvM,KAAAwM,gBAA0B,gCAE1BxM,KAAAyM,sBAAgC,qBAEhCzM,KAAA0M,uBAAiC,6BAEjC1M,KAAA2M,qBAA+B,wEAWtB3M,KAAA4M,cAAgB,MAChB5M,KAAA6M,YAAc,MACd7M,KAAAX,WAAa,MACbW,KAAA8M,aAAe,GACf9M,KAAA+M,oBAAqC,KACrC/M,KAAAgN,mBAAqB,MACrBhN,KAAAiN,cAAgB,MAGzBjN,KAAAkN,OAA6B,KAC7BlN,KAAAmN,WAAiC,KACjCnN,KAAAoN,QAA8B,KAC9BpN,KAAAqN,kBAAoD,KACpDrN,KAAAsN,qBAA2C,KAC3CtN,KAAAuN,oBAA+C,KAC/CvN,KAAAwN,QAAmC,KACnCxN,KAAAyN,WAAiC,KACjCzN,KAAA0N,wBAA0B,MACjB1N,KAAA2N,iBAAmB,IAAIjH,IAChC1G,KAAA4N,qBAAuB,GACvB5N,KAAA6N,UAAY,MACZ7N,KAAA8N,cAAyC,KACzC9N,KAAA+N,qBAAuB,MACvB/N,KAAAgO,mBAA8C,KAC9ChO,KAAAiO,kBAA2C,KAC3CjO,KAAAkO,oBAA0C,KAC1ClO,KAAAmO,iBAA4C,KAC5CnO,KAAAoO,sBAAwB,MACfpO,KAAAqO,iBAAmB,IAAIxO,GAAsB,CAC5DoC,SAAU,MACRnB,SAAUd,KAAKmN,WACflK,kBAAmBjD,KAAKuN,oBACxB5K,mBAAoB3C,KAAKsN,qBACzBlN,MAAOJ,KAAKoN,QACZxK,gBAAiB5C,KAAKqN,oBAExB5U,KAAM,MACJiK,qBAAsB1C,KAAK0C,qBAC3BD,oBAAqBzC,KAAK8N,eAAenP,iBAAiBlG,OAAS,WACnEiI,wBAAyBV,KAAKyL,aAAezL,KAAKgN,qBAEpDrL,kBAAmBV,GAAUjB,KAAKsO,sBAAsBvE,cAAc9I,GACtEiC,gBAAiB7H,IACf,GAAIA,EAAM6D,QAAUc,KAAK4M,cAAe5M,KAAK4M,cAAgBvR,EAAM6D,MACnE,GAAI7D,EAAM+D,MAAQY,KAAK6M,YAAa7M,KAAK6M,YAAcxR,EAAM+D,IAC7D,GAAI/D,EAAMgE,aAAeW,KAAKX,WAAYW,KAAKX,WAAahE,EAAMgE,UAAU,IAG/DW,KAAAuO,eAAiB,IAAIhL,GAAoB,CACxDlI,MAAO,MACL6I,YAAalE,KAAKkM,WAAa,aAAelM,KAAK7F,QACnDgK,aAAcnE,KAAKmE,aACnBC,QAASpE,KAAKoE,QACd8B,YAAalG,KAAKkG,YAClB7B,cAAerE,KAAKqE,cACpB8B,aAAcnG,KAAKmG,aACnB3B,kBAAmBxE,KAAKwE,kBACxBM,gBAAiB9E,KAAK8E,gBACtBa,iBAAkB3F,KAAK2F,iBACvBK,kBAAmBhG,KAAKgG,kBACxBV,gBAAiBtF,KAAKsF,gBACtBtB,eAAgBhE,KAAKwO,wBACrB1N,SAAUd,KAAKmN,WACf7I,SAAUtE,KAAKyN,aAEjBpI,SAAUoJ,IACRzO,KAAK8M,aAAe2B,CAAO,EAE7B7J,QAAS8J,IACP1O,KAAK2O,WAAWC,KAAKF,EAAO,IAGf1O,KAAA6O,oBAAsB,IAAIrI,GAAyB,CAClEnL,MAAO,MACLwL,QAAS7G,KAAK7F,QACdgK,aAAcnE,KAAKmE,aACnBK,kBAAmBxE,KAAKwE,kBACxBM,gBAAiB9E,KAAK8E,gBACtB5K,OAAQ8F,KAAK9F,OACb4G,SAAUd,KAAKmN,WACfnG,UAAWhH,KAAK2N,iBAChBhI,iBAAkB3F,KAAKyM,sBACvBzG,kBAAmBhG,KAAK0M,uBACxBpH,gBAAiBtF,KAAK2M,uBAExBtH,SAAUoJ,IACRzO,KAAK8M,aAAe2B,CAAO,EAE7B7J,QAAS8J,IACP1O,KAAK8O,gBAAgBF,KAAKF,EAAO,IAGpB1O,KAAAsO,sBAAwB,IAAI1F,GAA2B,CACtE/B,QAAS,IAAM7G,KAAKyL,YACpBxJ,SAAU,MAAS6G,KAAM9I,KAAK+O,GAAIhG,QAAS/I,KAAKkN,SAChD5D,OAAQ,MACNE,WAAYxJ,KAAK0L,wBACjBjC,SAAUzJ,KAAK2L,wBAEjBjC,WAAa7G,IACX,MAAM8F,EAAU9F,GAAS8F,SAAW,MACpC,GAAIA,IAAY3I,KAAKgN,mBAAoBhN,KAAKgN,mBAAqBrE,CAAO,IAyDtE3I,KAAAgP,uBAAyB,KAC/BhP,KAAKiN,gBAAkBjN,KAAK+O,GAAGE,cAAc,kBAAkB,EAyChDjP,KAAAkP,kBAAoB,KACnC,IAAKlP,KAAK0C,uBAAyB1C,KAAK7F,UAAY6F,KAAKoN,UAAYpN,KAAKwN,QAAS,CACjF,GAAIxN,KAAK+M,sBAAwB,KAAM/M,KAAK+M,oBAAsB,KAClE,M,CAGF,MAAMvB,EAAexL,KAAKoN,QAAQ6B,cAChC,qCAEF,IAAKzD,EAAc,OACnB,MAAMjH,EAAYiH,EAAa1I,wBAAwBqM,OACvD,IAAIC,EAA+B,KACnC,IAAIC,EAAiB9K,EACrB,IAAK,MAAM+K,KAAQtP,KAAKwN,QAAQ+B,iBAA8B,wBAAyB,CACrF,MAAMC,EAASF,EAAKL,cAA2B,yBAC/C,IAAKO,EAAQ,SACb,MAAMC,EAAaD,EAAO1M,wBAC1B,MAAM4M,EAAWJ,EAAKxM,wBACtB,GAAI2M,EAAW1M,KAAOwB,GAAamL,EAASP,OAAS5K,EAAW,CAC9D6K,EAAgBE,EAAKvI,QAAQrP,SAAW,KAIxC2X,EAAiBnW,KAAKG,IAAIkL,EAAWmL,EAASP,OAASM,EAAWtG,O,EAItE,MAAMwG,EAAY3P,KAAKoN,QAAQtK,wBAC/B9C,KAAKoN,QAAQ/J,MAAML,YACjB,4BACA,GAAGqM,EAAiBM,EAAU5M,SAGhC,GAAIqM,IAAkBpP,KAAK+M,oBAAqB,CAC9C/M,KAAK+M,oBAAsBqC,EAC3B,M,GAuHapP,KAAA4P,gBAAkB,KACjC,MAAMzD,EAAanM,KAAKkM,WAAa,aAAelM,KAAKmM,WAAa,KACtE,IAAKA,GAAY0D,YAAc7P,KAAK8E,kBAAoB9E,KAAKmN,aAAenN,KAAKwN,QAAS,CACxF,GAAIxN,KAAK8P,cAAgBvX,UAAWyH,KAAK8P,YAAcvX,UACvDyH,KAAKoO,sBAAwB,MAC7B,M,CAEF,MAAMvR,EAASmD,KAAKwN,QAAQyB,cAC1B,yCAEF,MAAM/H,EAAOlH,KAAKwN,QAAQyB,cACxBjP,KAAK7F,QAAU,uBAAyB,kCAE1C,MAAM0N,EAAgBX,GAAMpE,wBAAwBqG,QAAUI,EAC5D,gEACA,EACAvJ,KAAKkN,QAAUlN,KAAK+O,IAEtB,MAAMpX,EAAOgQ,GAAwB,CACnCpI,kBAAmBS,KAAKmN,WAAW1L,aACnCmG,gBAAiB/K,GAAQiG,wBAAwBqG,QAAU,EAC3DtB,kBAEF,GAAIlQ,IAASqI,KAAK8P,YAAa9P,KAAK8P,YAAcnY,EAClD,IAAKqI,KAAKoO,uBAAyBjC,EAAW4D,eAAiB,OAASpY,IAASY,UAAW,CAC1F,M,CAEFyH,KAAKoO,sBAAwB,MAC7B,GAAIzW,IAASwU,EAAW6D,UAAY7D,EAAW8D,YAAc,EAAG,OAChEjQ,KAAKkQ,mBAAmBtB,KAAK,CAC3BqB,UAAW,EACXD,SAAUrY,EACVoY,aAAc,MACdI,WAAYhE,EAAWgE,WACvBC,gBAAiBjE,EAAWiE,iBAAmB,CAAC,GAAI,GAAI,IAAK,KAC7DP,UAAW,KACXC,YAAanY,EACb0Y,iBAAkBlE,EAAWkE,kBAAoB,cACjDC,wBAAyBnE,EAAWmE,yBAA2B,MAC/DC,UAAWpE,EAAWoE,WAAa,QACnCC,cAAerE,EAAWqE,eAAiB,QAC3Cha,UAAW2V,EAAW3V,WAAa,GAAGwJ,KAAKyQ,qBAC3CC,kBAAmBvE,EAAW8D,UAC9BU,iBAAkBxE,EAAW6D,SAC7BY,qBAAsB,MACtB3K,OAAQ,OACR,CAu2CL,CA9oDC,iBAAA4K,GACE7Q,KAAK0N,wBAA0B1N,KAAK8Q,oBACpC9Q,KAAKgP,yBACLhP,KAAKuO,eAAexK,aACpB/D,KAAK6O,oBAAoB9K,aACzB/D,KAAK+Q,iB,CAGP,gBAAAC,GACEhR,KAAK6N,UAAY,KACjB7N,KAAKqO,iBAAiBzM,UACtB5B,KAAKuO,eAAe3M,UACpB5B,KAAK6O,oBAAoBjN,UACzB5B,KAAKsO,sBAAsB1M,UAC3B5B,KAAKiR,4BACLjR,KAAKkR,4BACLlR,KAAKmR,qBACLnR,KAAK4P,iB,CAGP,kBAAAwB,GACEpR,KAAKqO,iBAAiBxM,UACtB7B,KAAKuO,eAAe1M,UACpB7B,KAAK6O,oBAAoBhN,UACzB7B,KAAKsO,sBAAsBzM,UAC3B7B,KAAKiR,4BACLjR,KAAKmR,qBACLnR,KAAK4P,kBACL,GAAI5P,KAAK+N,qBAAsB/N,KAAKkP,mB,CAGtC,iBAAAmC,GACE,IAAKrR,KAAK6N,UAAW,OACrB7N,KAAKqO,iBAAiBzM,UACtB5B,KAAKuO,eAAe3M,UACpB5B,KAAK6O,oBAAoBjN,UACzB5B,KAAKsO,sBAAsB1M,UAC3B5B,KAAKiR,4BACLjR,KAAKkR,4BACLlR,KAAKmR,oB,CAGP,oBAAAG,GACEtR,KAAKqO,iBAAiBvM,aACtB9B,KAAKuO,eAAezM,aACpB9B,KAAK6O,oBAAoB/M,aACzB9B,KAAKsO,sBAAsBxM,aAC3B9B,KAAKuR,wBACLvR,KAAKgO,oBAAoBlM,aACzB9B,KAAKgO,mBAAqB,KAC1BhO,KAAKwR,uB,CAOC,yBAAAN,GACN,GAAIlR,KAAKgO,2BAA6ByD,mBAAqB,YAAa,OACxEzR,KAAKgO,mBAAqB,IAAIyD,iBAAiBzR,KAAKgP,wBACpDhP,KAAKgO,mBAAmB1L,QAAQtC,KAAK+O,GAAI,CAAE2C,UAAW,OACtD1R,KAAKgP,wB,CAGC,kBAAA2C,GACN,GAAI3R,KAAK+N,6BAA+B3E,SAAW,YAAa,OAChEpJ,KAAK+N,qBAAuB,KAC5B7D,SAAS/H,iBAAiB,SAAUnC,KAAKkP,kBAAmB,CAC1D0C,QAAS,KACTxP,QAAS,OAEXgH,OAAOjH,iBAAiB,SAAUnC,KAAKkP,kBAAmB,CAAE9M,QAAS,OACrEpC,KAAKkP,mB,CAGC,yBAAA+B,GACN,GAAIjR,KAAK0C,sBAAwB1C,KAAK7F,QAAS,CAC7C6F,KAAK2R,qBACL,M,CAGF3R,KAAKuR,wBACLvR,KAAKoN,SAAS/J,MAAMkH,eAAe,6BACnC,GAAIvK,KAAK+M,sBAAwB,KAAM,CACrC/M,KAAK+M,oBAAsB,I,EAIvB,qBAAAwE,GACN,IAAKvR,KAAK+N,6BAA+B3E,SAAW,YAAa,OACjEpJ,KAAK+N,qBAAuB,MAC5B7D,SAASlI,oBAAoB,SAAUhC,KAAKkP,kBAAmB,MAC/D9F,OAAOpH,oBAAoB,SAAUhC,KAAKkP,kB,CA4C5C,qBAAA2C,GACE7R,KAAK+Q,kBACL/Q,KAAKuO,eAAevJ,mBACpBhF,KAAK6O,oBAAoB7J,kB,CAK3B,gBAAA8M,GACE,GAAI9R,KAAK7F,QAAS6F,KAAK6O,oBAAoB3J,mBACtClF,KAAKuO,eAAerJ,cACzBlF,KAAK+Q,iB,CAIP,wBAAAgB,GACE/R,KAAK0N,wBAA0B1N,KAAK8Q,oBACpC9Q,KAAKuO,eAAehJ,iB,CAKtB,6BAAAyM,GACEhS,KAAKuO,eAAe/I,uBACpBxF,KAAK6O,oBAAoBrJ,sB,CAI3B,oBAAAyM,GACEjS,KAAK0N,wBAA0B1N,KAAK8Q,oBACpC9Q,KAAKgS,+B,CAIP,sBAAAE,CACE/F,EACA7E,GAEA,GACE6E,GAAY4D,eAAiB,OAC7B5D,EAAWgG,cAAgB7K,GAAU6K,YACrC,CACAnS,KAAKoO,sBAAwB,I,EAKjC,uBAAAgE,CAAwB1M,GACtB,GAAIA,EAAS1F,KAAK0N,wBAA0B,KAC5C,IAAK1N,KAAK7F,QAAS6F,KAAKuO,eAAe9I,eAAeC,E,CAIxD,yBAAA2M,CAA0BxM,GACxB,GAAIA,GAAO9O,OAAQiJ,KAAK0N,wBAA0B,KAClD,IAAK1N,KAAK7F,QAAS6F,KAAKuO,eAAe3I,aAAaC,E,CAItD,mBAAAyM,CAAoBlO,EAAkB2B,GACpC,GAAI3B,EAASpE,KAAK0N,wBAA0B,KAC5C,IAAK1N,KAAK7F,QAAS6F,KAAKuO,eAAezI,eAAe1B,EAAS2B,E,CAGjE,WAAY5L,GACV,OAAO6F,KAAKoL,WAAa,I,CAG3B,uBAAY0F,GACV,OAAO9Q,KAAKkM,WAAa,aACtBlM,KAAKoE,SAAWpE,KAAKkG,eAAiBlG,KAAKqE,eAAetN,O,CAG/D,cAAYwD,GACV,OAAOyF,KAAKpC,gBAAkB,U,CAGhC,wBAAY8E,GACV,OAAO1C,KAAKwL,eAAiBxL,KAAK8E,e,CAGpC,eAAYyN,GACV,OAAQvS,KAAKyL,aAAezL,KAAKwS,iBAAmBja,S,CAGtD,sBAAYka,GACV,OAAOzS,KAAKyL,aAAezL,KAAKuS,W,CAGlC,mBAAYzN,GACV,OAAO9E,KAAKyS,oBAAsBzS,KAAK0S,oBAAsBna,S,CAGvD,kBAAA4Y,GACN,UAAW9O,iBAAmB,YAAa,OAC3C,GAAIrC,KAAKkO,sBAAwBlO,KAAKmN,YAAcnN,KAAKmO,mBAAqBnO,KAAKwN,QAAS,CAC1F,M,CAEFxN,KAAKwR,wBACLxR,KAAKkO,oBAAsBlO,KAAKmN,WAChCnN,KAAKmO,iBAAmBnO,KAAKwN,QAC7BxN,KAAKiO,kBAAoB,IAAI5L,eAAerC,KAAK4P,iBACjD,GAAI5P,KAAKkO,oBAAqBlO,KAAKiO,kBAAkB3L,QAAQtC,KAAKkO,qBAClE,GAAIlO,KAAKmO,iBAAkBnO,KAAKiO,kBAAkB3L,QAAQtC,KAAKmO,iB,CAGzD,qBAAAqD,GACNxR,KAAKiO,mBAAmBnM,aACxB9B,KAAKiO,kBAAoB,KACzBjO,KAAKkO,oBAAsB,KAC3BlO,KAAKmO,iBAAmB,I,CAoDlB,uBAAAwE,CAAwB9R,GAC9B,MAAMsL,EAAanM,KAAKkM,WAAa,aAAelM,KAAKmM,WAAa,KACtE,IACGA,GACDnM,KAAK0F,SACL7E,EAAM+R,kBACN/R,EAAMgS,QACNhS,EAAMiS,SACNjS,EAAMkS,SACNlS,EAAMmS,UACLnS,EAAMoS,MAAQ,aAAepS,EAAMoS,MAAQ,aAC5C,CACA,M,CAGF,MAAMC,EAAyBrS,EAAMsS,eAAe1Z,MAAK2Z,IACvD,KAAMA,aAAgBlK,GAAc,OAAO,MAC3C,OAAOkK,EAAKC,UAAY,aACtB,CAAC,QAAS,SAAU,YAAYxX,SAASuX,EAAKC,UAC9CD,EAAKE,mBACLF,EAAKG,aAAa,UAAY,QAAQ,IAE1C,GAAIL,EAAwB,OAE5B,MAAM7X,EAAQmY,EAAuBrH,GACrC,MAAM8D,EAAYpP,EAAMoS,MAAQ,YAAc5X,EAAM4U,UAAY,EAAI5U,EAAM4U,UAAY,EACtF,GAAIA,EAAY,GAAKA,GAAa5U,EAAMoY,WAAY,OAEpD5S,EAAMU,iBACNvB,KAAKkQ,mBAAmBtB,KAAK,CAC3BqB,YACAD,SAAU3U,EAAM2U,SAChBD,aAAc1U,EAAM0U,aACpBI,WAAY9U,EAAM8U,WAClBC,gBAAiB/U,EAAM+U,gBACvBP,UAAW1D,EAAW0D,WAAa,MACnCC,YAAa9P,KAAK8P,aAAe3D,EAAW2D,YAC5CO,iBAAkBlE,EAAWkE,kBAAoB,cACjDC,wBAAyBnE,EAAWmE,yBAA2B,MAC/DC,UAAWpE,EAAWoE,WAAa,QACnCC,cAAerE,EAAWqE,eAAiB,QAC3Cha,UAAW2V,EAAW3V,WAAa,GAAGwJ,KAAKyQ,qBAC3CC,kBAAmBrV,EAAM4U,UACzBU,iBAAkBtV,EAAM2U,SACxBY,qBAAsBvV,EAAM0U,aAC5B9J,OAAQ,Q,CAIJ,iBAAAyN,GACN,OAAO1Z,EAAUgG,KAAK/F,KAAM+F,KAAK9F,OAAQ8F,KAAK7F,Q,CAGxC,qBAAAqU,GACN,OAAOxO,KAAK7F,QACR6F,KAAK9F,OAAOY,QAAO,CAACC,EAAOV,IAAUU,EAAQV,EAAMJ,KAAK/B,QAAQ,GAChE8H,KAAK/F,KAAK/B,M,CAGR,iBAAAyb,GACN,OAAOjW,GAAuB,CAC5B9G,QAASoJ,KAAKpJ,QACdqD,KAAM+F,KAAK/F,KACXC,OAAQ8F,KAAK9F,OACbC,QAAS6F,KAAK7F,QACdyD,cAAeoC,KAAKpC,cACpBlD,eAAgBsF,KAAKtF,eACrBjD,kBAAmBuI,KAAKvI,mB,CAI5B,qBAAYib,GACV,GAAI1S,KAAK4T,WAAa,MAAQ5T,KAAK4T,YAAc,GAAI,OAAOrb,UAC5D,cAAcyH,KAAK4T,YAAc,SAAW,GAAG1a,KAAKC,IAAI,EAAG6G,KAAK4T,eAAiB5T,KAAK4T,S,CAGxF,kBAAYpB,GACV,GAAIxS,KAAKmJ,QAAU,MAAQnJ,KAAKmJ,SAAW,GAAI,OAAO5Q,UACtD,cAAcyH,KAAKmJ,SAAW,SAAW,GAAGjQ,KAAKC,IAAI,EAAG6G,KAAKmJ,YAAcnJ,KAAKmJ,M,CAG1E,eAAA4H,GACN,MAAMrU,EAASD,EAAiBuD,KAAKpJ,QAASoJ,KAAK/F,KAAM+F,KAAK9F,OAAQ8F,KAAK7F,SAC3E,IAAK6F,KAAKyQ,SAAS1Z,OAAQ2F,EAAOmX,QAAQ,oCAC1C,GAAI7T,KAAKoL,WAAapL,KAAKpJ,QAAQ6C,MAAKzC,GAAUA,EAAOE,KAAO8I,KAAKoL,SAAU9T,WAAW,CACxFoF,EAAOE,KAAK,0CAA0CoD,KAAKoL,SAAS9T,W,CAEtE,GACE0I,KAAKqL,OACJrL,KAAKpJ,QAAQ6C,MAAKzC,GACjBA,EAAOE,KAAO8I,KAAKqL,KAAM/T,UACzBN,EAAO8c,gBAAgBra,MAAKsa,GAAWA,EAAQC,UAAYhU,KAAKqL,KAAM/T,aAExE,CACAoF,EAAOE,KAAK,yCAAyCoD,KAAKqL,KAAK/T,W,CAEjE,MAAM2c,EAAcjU,KAAKpJ,QAAQkD,QAAO9C,GAAUA,EAAO0C,SAAW,UACpE,MAAMwa,EAAYlU,KAAKpJ,QAAQkD,QAAO9C,GAAUA,EAAO0C,SAAW,QAClE,GAAIua,EAAY/b,OAAS,GAAM8H,KAAKzF,YAAc0Z,EAAY/b,OAAS,EAAI,CACzEwE,EAAOE,KAAK,uF,CAEd,GAAIsX,EAAUhc,OAAS,EAAGwE,EAAOE,KAAK,4CACtC,IAAK,MAAM5F,IAAU,IAAIid,KAAgBC,GAAY,CACnD,IAAK5a,EAAgBtC,GAAS0F,EAAOE,KAAK,iBAAiB5F,EAAOE,gC,CAEpE,MAAMuX,EAAU/R,EAAO3C,KAAK,KAC5B,IAAK0U,GAAWA,IAAYzO,KAAK4N,qBAAsB,OACvD5N,KAAK4N,qBAAuBa,EAC5B0F,QAAQC,KAAK,cAAc3F,I,CAGrB,QAAA4F,CAASrd,EAAqBgd,EAAUhd,EAAOE,IACrD,IAAKF,EAAOsd,SAAU,OACtBtU,KAAKuU,aAAa3F,KAAK,CAAEvD,KAAMjU,EAAmB4I,KAAKqL,KAAM2I,I,CAGvD,eAAAQ,CAAgBxd,EAAqBgd,EAAUhd,EAAOE,GAAIZ,EAAQU,EAAO6F,QAC/E,GAAImD,KAAKqL,MAAM/T,WAAa0c,EAAS,MAAO,QAAQ1d,cACpD,GAAI0J,KAAKqL,KAAK9T,YAAc,MAAO,MAAO,QAAQjB,qCAClD,MAAO,QAAQA,oC,CAGT,gBAAAme,CAAiB9d,GACvB,MAAMgB,EAAOuD,EAAwB8E,KAAKtF,eAAgB/D,GAC1D,MAAMgE,EAAWhD,EAAKkE,SAASlF,EAAIO,IACnC8I,KAAK0U,kBAAkB9F,KAAK,CAC1BlU,eAAgB/C,EAChBgd,MAAO,MACPC,aAAcje,EAAIO,GAClByD,Y,CAII,gBAAAka,GACN,MAAMzZ,EAAa4E,KAAK0T,oBACxB,MAAMtV,EAAY3D,EAA0BW,EAAY4E,KAAKtF,gBAC7DsF,KAAK0U,kBAAkB9F,KAAK,CAC1BlU,eAAgBS,EAAyB6E,KAAKtF,eAAgBU,GAC9DuZ,MAAO,aACPha,UAAWyD,EAAUpD,a,CAIjB,kBAAA8Z,CAAmBza,GACzB,MAAMgB,EAAQZ,EAA0BJ,EAAMJ,KAAM+F,KAAKtF,gBACzDsF,KAAK0U,kBAAkB9F,KAAK,CAC1BlU,eAAgBY,EAA0B0E,KAAKtF,eAAgBL,EAAMJ,MACrE0a,MAAO,QACPjd,QAAS2C,EAAMnD,GACfyD,UAAWU,EAAML,a,CAIb,sBAAA+Z,CAAuBlU,GAC7B,MAAMmU,EAAgBnU,EAAMmU,cAC5B,OAAQnU,EAAMsS,eAAe1Z,MAAKqN,IAChC,KAAMA,aAAkBoC,IAAgBpC,IAAWkO,EAAe,OAAO,MACzE,OAAOlO,EAAOmO,QACZ,6FACD,G,CAIG,iBAAAC,CAAkBve,EAAekK,GACvC,IAAKlK,EAAIwe,aAAexe,EAAI6D,WAAawF,KAAK+U,uBAAuBlU,GAAQ,OAC7Eb,KAAKoV,cAAcxG,KAAK,CAAEyG,MAAO1e,EAAIO,I,CAG/B,gBAAAoe,CAAiB3e,EAAekK,GACtC,GAAIA,EAAMiG,SAAWjG,EAAMmU,eAAkBnU,EAAMoS,MAAQ,SAAWpS,EAAMoS,MAAQ,IAAM,OAC1FpS,EAAMU,iBACNvB,KAAKkV,kBAAkBve,EAAKkK,E,CAGtB,sBAAA0U,CACNjf,EACAkf,EACAva,EACAT,EACAib,GAEA,OACEC,EAAA,UACEC,MAAM,yEACNC,KAAK,SACLC,KAAK,WAAU,aACHvf,EAAK,eACH2E,EAAgB,QAAU9D,OAAOqe,GAC/Chb,SAAUA,EACVsb,QAASL,GAETC,EAAA,eACEpf,MAAM,GACNqC,KAAK,KACL6c,QAASA,EACTva,cAAeA,EACf8a,aAAc,O,CAMd,gBAAAC,CAAiBtc,GACvB,IAAKA,EAAQ,OAAO,KACpB,OACEgc,EAAA,QACEC,MAAO,gDAAgDjc,IAAQ,cACnD,Q,CAKV,uBAAAuc,GACN,OACEP,EAAA,sBACEC,MAAM,yBACNzY,QAAQ,OACRgZ,KAAK,gBACLvd,KAAK,KACL0K,MAAO,CAAE9J,MAAO,6BAA6B,aAClC,sBACX4c,UAAW,MACXC,WAAY,MACZC,WAAY,MACZC,UAAWzV,IACTA,EAAM0V,kBACNvW,KAAKwW,uBAAuB,G,CAM5B,yBAAAC,CAA0BC,GAChC,GAAIA,EAAM/X,iBAAiBlG,OAAS,WAAY,OAAO,KACvD,OACEid,EAAA,QACEC,MAAM,iCACNgB,IAAKxT,IACHnD,KAAKsN,qBAAuBnK,GAAW,IAAI,GAG7CuS,EAAA,QAAMC,MAAM,gFACT3V,KAAKiW,2B,CAMN,kBAAAW,CACN5f,EACA0f,EACAvB,EAAc,KACd0B,EAAiB,OAEjB,MAAMC,EAAgB9W,KAAKoL,UAAU9T,WAAaN,EAAOE,GACzD,MAAM4c,EAAiB9c,EAAO8c,gBAAgB5b,OAC1ClB,EAAO8c,eACP,CAAC,CAAExd,MAAOU,EAAO6F,OAAQmX,QAAShd,EAAOE,KAC7C,MAAM6f,EAAsBjD,EAAe7M,MACzC8M,GAAWA,EAAQC,UAAYhU,KAAKqL,MAAM/T,WAE5C,MAAM0f,IAAqBD,EAC3B,MAAME,EAAaD,EACnB,MAAME,EAAQlgB,EAAOkgB,OAAS,QAC9B,MAAM3f,EAAYyf,EAAmBhX,KAAKqL,KAAM9T,UAAYgB,UAC5D,MAAM4e,EAAiBH,EAClBhX,KAAKqL,KAAM9T,YAAc,MAAQ,YAAc,aAChDgB,UAEJ,MAAM6e,EACJ1B,EAAA,QAAMC,MAAM,2BACT7B,EAAeja,KAAI,CAACka,EAASvb,KAC5B,MAAM6e,EAAgBN,GAAqB/C,UAAYD,EAAQC,QAC/D,MAAMsD,EAAqBnC,KAAiBne,EAAOsd,SACnD,MAAMhe,EACJof,EAAA,WACEC,MAAM,kDACN4B,GAAG,OACHra,QAAQ,eACRsa,SAAUH,EACVI,MAAM,UACNC,eAAgB,GAEf3D,EAAQzd,OAGb,MAAMqhB,EAAUL,EACd5B,EAAA,UACEC,MAAM,2EACNC,KAAK,SAAQ,aACD5V,KAAKwU,gBAAgBxd,EAAQ+c,EAAQC,QAASD,EAAQzd,OAAM,oBACtD,QAAO,gBACVyd,EAAQC,QAAO,mBACZqD,EAAgB,OAAS9e,UAC3Cud,QAAS,IAAM9V,KAAKqU,SAASrd,EAAQ+c,EAAQC,UAE5C1d,GAGHof,EAAA,QAAMC,MAAM,kDAAkDrf,GAGhE,OACEof,EAAA,QAAMC,MAAM,2BAA2B1C,IAAKc,EAAQC,SACjD2D,EACAnf,EAAQsb,EAAe5b,OAAS,GAC/Bwd,EAAA,WACEC,MAAM,6BACN4B,GAAG,OACHra,QAAQ,eACRua,MAAM,WAAU,cACJ,QAEX1D,EAAQ6D,WAAa,KAGrB,KAKf,MAAMC,EAAc1C,EAClBO,EAAA,QAAMC,MAAM,uBACTsB,GACCvB,EAAA,sBACEC,MAAM,2BACNzY,QAAQ,OACRgZ,KAAM3e,IAAc,MAAQ,UAAY,YACxCoB,KAAK,KAAI,aACGqH,KAAKwU,gBACfxd,EACA+f,GAAqB/C,SAAWhd,EAAOE,GACvC6f,GAAqBzgB,OAASU,EAAO6F,QAEvCsZ,UAAW,MACXC,WAAY,MACZ0B,SAAU,KACVzB,WAAY,MAAK,oBACC,YAClBC,UAAW,IAAMtW,KAAKqU,SAASrd,EAAQ+f,GAAqB/C,SAAWhd,EAAOE,OAIlF,KACJ,MAAM6gB,EAAerB,EAAM/X,gBAC3B,MAAMqZ,EAAqBD,GAActf,OAAS,UAAYsf,EAAazgB,WAAaN,EAAOE,GAC/F,MAAM+gB,EAA0BD,IAC7BhhB,EAAO6F,OAAO9F,SACdC,EAAO8c,gBAAgB5b,OAC1B,MAAMggB,EACJ/C,GAAe6C,EACbtC,EAAA,QAAMC,MAAM,2BACT3V,KAAKiW,2BAEN,KAEN,OACEP,EAAA,MACEzC,IAAKjc,EAAOE,GACZye,MAAO,CACL,wBAAyB,KACzB,CAAC,yBAAyBuB,KAAU,KACpC,+BAAgClgB,EAAO0C,SAAW,QAClD,6BAA8B1C,EAAO0C,SAAW,MAChD,sCAAuCse,GAEzCrD,MAAOkC,EAAiBte,UAAY,MAAK,YAC9Bse,EAAiBte,UAAY4e,EAAc,iBACtCngB,EAAOE,GAAE,eACX4f,EAAgB,OAASve,UAAS,mBAC9B0e,EAAa,OAAS1e,YAEtCvB,EAAO6F,OAAO9F,QAAUC,EAAO8F,aAAa/F,QAC5C2e,EAAA,QAAMC,MAAM,sBAAsB3e,EAAO8F,aAE1Cmb,EACCvC,EAAA,QAAMC,MAAM,mEACTuC,GAGHxC,EAAA,QAAMC,MAAM,4BACTuB,IAAU,OAASW,EACnBX,IAAU,UACTxB,EAAA,QACEC,MAAM,mDAAkD,oBACtC,OAAM,cACZ,SAGfyB,EACAF,IAAU,OAASW,EACnBK,GAGJlY,KAAKgW,iBAAiBhf,EAAO0C,Q,CAK5B,cAAAye,CAAezB,GACrB,OACEhB,EAAA,gBACGgB,EAAMnc,YAAcmb,EAAA,OAAKC,MAAM,+BAC/B3V,KAAKpJ,QAAQiD,KAAI7C,IAChB,MAAMuC,EAAQD,EAAgBtC,GAC9B,MAAMohB,EAAWphB,EAAOE,KAAOwf,EAAM1Y,iBACrC,OACE0X,EAAA,OACEzC,IAAKjc,EAAOE,GACZye,MAAO,CACL,0BAA2B3e,EAAOlB,OAAS,SAC3C,4BAA6BsiB,GAE/B/U,MAAO9J,IAAU6e,EAAW,CAAE7e,SAAUhB,WACxC,I,CAOJ,YAAA8f,CACN3B,EACAvB,EAAc,KACd0B,EAAiB,OAEjB,MAAMzY,EAAYsY,EAAMtY,UACxB,OACEsX,EAAA,SAAOC,MAAO,CACZ,iBAAkB,KAClB,iCAAkCR,GACjCwB,IAAKxT,IACN,GAAIgS,EAAanV,KAAKqN,kBAAoBlK,GAAW,IAAI,GAEzDuS,EAAA,MAAIC,MAAM,wBACPe,EAAMnc,YACLmb,EAAA,MACEC,MAAM,8EACNhB,MAAOkC,EAAiBte,UAAY,OAEnC4c,EAAcnV,KAAKuV,uBAClBnX,EAAUpD,YAAc,2BAA6B,yBACrDoD,EAAUpD,YACVoD,EAAUnD,cACVmD,EAAUxD,iBAAiB1C,SAAW,GACtC,IAAM8H,KAAK6U,qBAEXa,EAAA,QAAMC,MAAM,sBAAoB,eAEjC3V,KAAKgW,iBAAiB,UAG1BhW,KAAKpJ,QAAQiD,KAAI7C,GAChBgJ,KAAK4W,mBAAmB5f,EAAQ0f,EAAOvB,EAAa0B,M,CAOtD,eAAAyB,CACNC,EACAvhB,EACAL,GAEA,GAAI4hB,EAAKziB,OAAS,QAAS,OAAO,KAElC,GAAIyiB,EAAKziB,OAAS,QAAS,CACzB,OACE4f,EAAA,WACEC,MAAM,kDACN4B,GAAG,OACHra,QAAQ,mBACRua,MAAM,YAEN/B,EAAA,sBAAkB,QAAM,KACxBA,EAAA,QAAMC,MAAM,sBAAsB3V,KAAKiM,gB,CAK7C,GAAIsM,EAAKziB,OAAS,OAAQ,CACxB,MAAMF,EAAQ2iB,EAAK3iB,MACnB,OACE8f,EAAA,WACE8C,KAAM5iB,EAAMsgB,KACZvd,KAAK,KACL8e,MAAO7hB,EAAM6hB,OAAS,YACtBnhB,MAAOV,EAAMU,O,CAKnB,GAAIiiB,EAAKziB,OAAS,QAAS,CACzB,MAAMF,EAAQ2iB,EAAK3iB,MACnB,OACE8f,EAAA,QAAMC,MAAM,wBACT/f,EAAM6iB,IACL/C,EAAA,OAAKC,MAAM,+BAA+B8C,IAAK7iB,EAAM6iB,IAAKliB,IAAKX,EAAMW,IAAKmP,QAAQ,SAElFgQ,EAAA,QACEC,MAAM,mCACNE,KAAK,MAAK,aACEjgB,EAAMW,M,CAO5B,GAAIgiB,EAAKziB,OAAS,SAAU,CAC1B,MAAMF,EAAQ2iB,EAAK3iB,MACnB,OACE8f,EAAA,sBACExY,QAAStH,EAAMsH,SAAW,QAC1BvE,KAAK,KACL+f,QAAS,KACTC,WAAW,SACXriB,MAAOV,EAAMU,OAAS,GACtB4f,KAAMtgB,EAAMsgB,MAAQ,GAAE,aACVtgB,EAAMY,WAAa,KAC/B2f,UAAWvgB,EAAMugB,WAAa,MAC9ByC,WAAYhjB,EAAMgjB,YAAc,MAChCC,UAAWjjB,EAAMijB,WAAa,MAC9BvC,UAAWzV,IACTA,EAAM0V,kBACNvW,KAAK8Y,aAAalK,KAAK,CACrBmK,SAAUnjB,EAAMmjB,SAChB1D,MAAO1e,EAAIO,GACXI,SAAUN,EAAOE,IACjB,G,CAMV,GAAIqhB,EAAKziB,OAAS,MAAO,CACvB,MAAMF,EAAQ2iB,EAAK3iB,MACnB,MAAMsH,EAAUqb,EAAKrb,QACrB,MAAM8b,EACJtD,EAAA,UACEpf,MAAOV,EAAMU,MACbyF,OAAQnG,EAAMmG,QAAU,UACxBkd,SAAUrjB,EAAMqjB,UAAY,QAC5BtgB,KAAMuE,IAAY,gBAAkB,KAAO,KAC3CgZ,KAAMtgB,EAAMsgB,MAAQ,GACpBgD,QAAStjB,EAAMsjB,SAAW,MAC1BR,QAAO,KACPC,WAAW,WAIf,GAAIzb,IAAY,WAAY,OAAO8b,EAEnC,OACEtD,EAAA,QAAMC,MAAO,sDAAsDzY,KAChEA,IAAY,iBAAmB8b,EAChCtD,EAAA,WACEC,MAAM,+CACN4B,GAAG,OACHra,QAASA,IAAY,gBAAkB,kBAAoB,mBAC3Dua,MAAM,YACNC,eAAgB,GAEf9hB,EAAMwH,MAERF,IAAY,iBACXwY,EAAA,QAAMC,MAAM,oCAAoCqD,G,CAMxD,MAAM5b,EAAOmb,EAAK3iB,MAClB,MAAM4H,EAAQ+a,EAAK/a,MAEnB,OACEkY,EAAA,QAAMC,MAAO,CAAE,sBAAuB,KAAM,4BAA6BnY,IACvEkY,EAAA,WACEC,MAAM,yEACN4B,GAAG,OACHra,QAAQ,mBACRua,MAAM,UACNC,eAAgBla,EAAQ,OAAS,EACjCC,KAAMD,EAAQ,OAAS,SACvBH,YAAaD,EAAKC,aAAe,UAEhCD,EAAK3G,SAEP2G,EAAKG,YAAchF,WAAa6E,EAAKG,YAAc,IAClDmY,EAAA,WACEC,MAAM,2EACN4B,GAAG,OACHra,QAASqb,EAAKpb,YAAc,mBAAqB,kBACjDsa,MAAOra,EAAK+b,iBAAmBZ,EAAKpb,YAAc,UAAY,aAC9Dua,eAAgBla,EAAQ,OAAS,EACjCC,KAAMD,EAAQ,OAAS,UAEtBJ,EAAKG,W,CAOR,SAAA6b,CAAUziB,EAAe+f,GAC/B,MAAM/b,EAAW+b,EAAMhc,eAAe7C,IAAIlB,EAAIO,IAC9C,MAAMmiB,EAAgB1iB,EAAI4D,aAAe,QAAU5D,EAAI6D,SACvD,OACEkb,EAAA,MACEzC,IAAKtc,EAAIO,GACTye,MAAO,CACL,gBAAiB,KACjB,0BAA2Bhb,EAC3B,4BAA6BhE,EAAI6D,SACjC,+BAAgC7D,EAAIwe,cAAgBxe,EAAI6D,SACxD,kBAAmB7D,EAAIwe,cAAgBxe,EAAI6D,UAC5C,cACY7D,EAAIO,GAAE,gBACJyD,EAAW,OAASpC,UAAS,gBAC7B5B,EAAI6D,SAAW,OAASjC,UACvC+gB,SAAU3iB,EAAIwe,cAAgBxe,EAAI6D,SAAW,EAAIjC,UACjDud,QAASjV,GAASb,KAAKkV,kBAAkBve,EAAKkK,GAC9C0Y,UAAW1Y,GAASb,KAAKsV,iBAAiB3e,EAAKkK,IAE9C6V,EAAMnc,YACLmb,EAAA,MAAIC,MAAO,CACT,iBAAkB,KAClB,2BAA4B,KAC5B,+BAAgC,KAChC,sBAAuB,KACvB,+BAAgC,KAChC,gCAAiChb,IAEhCqF,KAAKuV,uBACJ,GAAG5a,EAAW,WAAa,YAAYjE,EAAuBC,EAAKqJ,KAAKpJ,WACxE+D,EACA,OACC0e,GACD,IAAMrZ,KAAKyU,iBAAiB9d,KAE7BqJ,KAAKgW,iBAAiB,UAG1BhW,KAAKpJ,QAAQiD,KAAI7C,IAChB,MAAMkgB,EAAQlgB,EAAOkgB,OAAS,QAC9B,MAAMqB,EAAOvb,EAA6BrG,EAAIM,MAAMD,EAAOE,IAAKF,GAChE,MAAMwiB,EAAUjB,EAAKziB,OAAS,MAC9B,MAAM2jB,EAAWlB,EAAKziB,OAAS,OAC/B,MAAM4jB,EAAYnB,EAAKziB,OAAS,QAChC,MAAM6jB,EAAapB,EAAKziB,OAAS,SACjC,MAAM8jB,EAAWrB,EAAKziB,OAAS,OAC/B,MAAM+jB,EAAkBD,GAAYrB,EAAKpb,YACzC,MAAM2c,EAAiBF,GAAYrB,EAAKjb,WACxC,MAAMyc,EAAYxB,EAAKziB,OAAS,QAChC,MAAMkkB,EAAYzB,EAAKziB,OAAS,QAChC,MAAMmkB,EAAaT,EAAUjB,EAAKrb,QAAU3E,UAC5C,MAAM2hB,EAAcN,EAAWrB,EAAKrb,QAAU3E,UAC9C,OACEmd,EAAA,MACEzC,IAAK,GAAGtc,EAAIO,MAAMF,EAAOE,KACzBye,MAAO,CACL,iBAAkB,KAClB,CAAC,yBAAyBuB,KAAU,KACpC,sBAAuBsC,EACvB,CAAC,uBAAuBS,KAAeT,EACvC,uBAAwBC,EACxB,wBAAyBC,EACzB,yBAA0BC,EAC1B,+BAAgCE,EAChC,8BAA+BC,EAC/B,6BAA8BF,IAAaE,EAC3C,wBAAyBC,EACzB,wBAAyBC,EACzB,+BAAgChjB,EAAO0C,SAAW,QAClD,6BAA8B1C,EAAO0C,SAAW,MAChD,sBAAuB,KACvB,+BAAgC,KAChC,gCAAiCiB,GAClC,iBACe3D,EAAOE,GAAE,iBACTqhB,EAAKtb,SAAQ,oBACVgd,GAAcC,GAEjCxE,EAAA,QAAMC,MAAM,uDACT3V,KAAKsY,gBAAgBC,EAAMvhB,EAAQL,IAErCqJ,KAAKgW,iBAAiBhf,EAAO0C,QAC3B,I,CAOP,iBAAAygB,CAAkB9f,GACxB,MAAM5C,EAAoBD,EAA0BwI,KAAKvI,kBAAmB4C,EAAMnD,IAClF8I,KAAKoa,sBAAsBxL,KAAK,CAC9B+F,MAAO,QACPjd,QAAS2C,EAAMnD,GACfiB,UAAWV,EAAkBoE,SAASxB,EAAMnD,IAC5CO,qB,CAII,qBAAA+e,GACN,MAAMve,EAAW+H,KAAK9F,OAAOL,KAAIQ,GAASA,EAAMnD,KAChD,MAAMO,EAAoBO,EAAyBgI,KAAKvI,kBAAmBQ,GAC3E+H,KAAKoa,sBAAsBxL,KAAK,CAC9B+F,MAAO,MACPxc,UAAWV,EAAkBS,OAAS,EACtCT,qB,CAII,kBAAA4iB,CAAmBC,GACzB,MAAMjgB,MACJA,EAAKU,MACLA,EAAKsD,YACLA,EAAWE,WACXA,EACApG,UAAWoiB,EAAW9b,WACtBA,EACAL,UAAWoc,GACTF,EACJ,OACE5E,EAAA,QAAMC,MAAM,2BACT6E,GACC9E,EAAA,QAAMC,MAAM,6BACT3V,KAAKuV,uBACJiF,EAAexf,YACX,2BAA2BX,EAAM/D,cACjC,yBAAyB+D,EAAM/D,cACnCkkB,EAAexf,YACfwf,EAAevf,cACfuf,EAAe5f,iBAAiB1C,SAAW,GAC3C,IAAM8H,KAAK8U,mBAAmBza,MAIpCqb,EAAA,QAAMC,MAAM,wBACVD,EAAA,WACEC,MAAM,wBACN4B,GAAG,OACHra,QAAQ,mBACRsa,SAAU,KACVC,MAAOhZ,GAENpE,EAAM/D,OAETof,EAAA,WACEC,MAAM,4BACN4B,GAAG,OACHra,QAAQ,mBACRua,MAAM,YAAW,cACL,QAAM,KAIpB/B,EAAA,WACEC,MAAM,wBACN4B,GAAG,OACHra,QAAQ,mBACRua,MAAM,YAAW,cACL,QAEXpZ,EAAW,OAAMtD,GAEpB2a,EAAA,QAAMC,MAAM,sBAAsBpX,IAEpCmX,EAAA,sBACEC,MAAM,yBACNzY,QAAQ,OACRvE,KAAK,KACL+f,QAAS,KACTC,WAAW,SACXzC,KAAMqE,EAAc,cAAgB,YACpCE,UAAWF,EAAW,aAEpBA,EACI,UAAUlgB,EAAM/D,cAChB,YAAY+D,EAAM/D,cAExB6f,UAAW,MACXG,UAAWzV,IACTA,EAAM0V,kBACNvW,KAAKma,kBAAkB9f,EAAM,I,CAO/B,oBAAAqgB,CAAqBpU,EAAkBjM,GAC7C,OAAOiM,EAASC,MAAM,WAAWxM,KAAKM,EAAM/D,M,CAGtC,kBAAAqkB,CAAmBtgB,EAAmBqE,GAC5C,MAAMmH,EAAQxL,EAAMgK,eAAetN,OACnC,IAAK8O,IAAUxL,EAAM6L,cAAgB7L,EAAM+J,QAAS,OAAO,KAC3D,MAAMwW,EAAiB5a,KAAKmE,eAAiB,WAC1CnE,KAAK6O,oBAAoBrL,sBAE5B,OACEkS,EAAA,MACEC,MAAM,8CAA6C,gBACpCtb,EAAMnD,GACrByf,IAAKxT,IACH,GAAIA,EAASnD,KAAK2N,iBAAiBlG,IAAIpN,EAAMnD,GAAIiM,QAC5CnD,KAAK2N,iBAAiB7V,OAAOuC,EAAMnD,GAAG,GAG7Cwe,EAAA,MAAIC,MAAM,sBAAsBkF,QAASnc,GACvCgX,EAAA,OAAKC,MAAM,+CACR9P,EACC6P,EAAA,QAAMC,MAAM,wDACVD,EAAA,QAAMC,MAAM,uBACVD,EAAA,WAAS8C,KAAK,gBAAgB7f,KAAK,KAAK8e,MAAM,YAAW,cAAa,SACtE/B,EAAA,WAAS6B,GAAG,OAAOra,QAAQ,mBAAmBua,MAAM,aAAa5R,IAEnE6P,EAAA,sBACEpf,MAAO0J,KAAK0a,qBAAqB1a,KAAKwM,gBAAiBnS,GACvD1B,KAAK,KACL2d,UAAW,IAAMtW,KAAK6O,oBAAoBjK,QAAQvK,EAAMnD,GAAI,YAG9DmD,EAAM6L,YACRwP,EAAA,QAAMC,MAAM,0BACVD,EAAA,aAAW/c,KAAK,KAAK8e,MAAM,cAC3B/B,EAAA,WAAS6B,GAAG,OAAOra,QAAQ,mBAAmBua,MAAM,aACjDzX,KAAK0a,qBAAqB1a,KAAKyM,sBAAuBpS,KAGzDA,EAAM+J,SAAWwW,EACnBlF,EAAA,QAAMC,MAAM,0BACVD,EAAA,sBACEpf,MAAO0J,KAAKsM,mBAAkB,aAClBtM,KAAK0a,qBAAqB1a,KAAKuM,uBAAwBlS,GACnE1B,KAAK,KACL2d,UAAW,IAAMtW,KAAK6O,oBAAoBjK,QAAQvK,EAAMnD,GAAI,aAIhEwe,EAAA,QAAMC,MAAM,0BAAyB,cAAa,W,CAQtD,iBAAAmF,CAAkBpE,GACxB,IAAK1W,KAAK0C,uBAAyB1C,KAAK+M,oBAAqB,OAAO,KACpE,MAAMuN,EAAa5D,EAAMxc,OAAO+M,MAAKC,GAAQA,EAAK7M,MAAMnD,KAAO8I,KAAK+M,sBACpE,IAAKuN,EAAY,OAAO,KACxB,OACE5E,EAAA,OACEC,MAAO,CACL,yBAA0B,KAC1B,qCAAsCe,EAAMnc,WAC5C,CAAC+f,EAAW9b,aAAe,MAAO8b,EAAW9b,aAC9C,gBACc8b,EAAWjgB,MAAMnD,GAAE,oBACfojB,EAAWve,QAE7BiE,KAAKqa,mBAAmBC,G,CAKvB,gBAAAS,CAAiBrE,GACvB,IAAKA,EAAMvc,QAAS,CAClB,OACEub,EAAA,SAAOC,MAAM,kBACV3V,KAAK/F,KAAKJ,KAAIlD,GAAOqJ,KAAKoZ,UAAUziB,EAAK+f,K,CAKhD,OAAOA,EAAMxc,OAAOL,KAAIygB,IACtB,MAAMjgB,MAAEA,EAAOlC,UAAWoiB,EAAWxe,OAAEA,EAAMyC,YAAEA,GAAgB8b,EAC/D,MAAMU,EAAqBhb,KAAK0C,sBAAwB1C,KAAK+M,sBAAwB1S,EAAMnD,GAC3F,OACEwe,EAAA,SACEC,MAAM,iCACNE,KAAK,WAAU,gBACAxb,EAAMnD,GAAE,oBACJ6E,EAAM,iBACTwe,EAAc,OAAShiB,UAAS,aACpCgiB,GAAelgB,EAAM6L,YAAc,OAAS3N,UACxD0a,IAAK5Y,EAAMnD,IAEXwe,EAAA,MACEG,KAAK,MAAK,cACGmF,EAAqB,OAASziB,UAC3Cod,MAAO,CACL,sBAAuB,KACvB,qCAAsC3V,KAAKwL,eAAiBxL,KAAK0C,uBAGnEgT,EAAA,MACEC,MAAO,CACL,uBAAwB,KACxB,6CAA8CqF,EAC9C,CAACxc,GAAe,MAAOA,GAEzBqX,KAAK,YACLlB,MAAM,WACNkG,QAASnE,EAAMhY,cAEdsB,KAAKqa,mBAAmBC,MAG3BC,GAAelgB,EAAMJ,KAAKJ,KAAIlD,GAAOqJ,KAAKoZ,UAAUziB,EAAK+f,MACzD6D,GAAeva,KAAK2a,mBAAmBtgB,EAAOqc,EAAMhY,cAChD,G,CAKN,kBAAAuc,CAAmBvE,GACzB,MAAM3b,EAAQ7B,KAAKG,IAAI,GAAIH,KAAKC,IAAI,EAAGD,KAAKgiB,MAAMlb,KAAK4L,eAAiB,IACxE,OACE8J,EAAA,SAAOC,MAAM,0CACVwF,MAAMC,KAAK,CAAEljB,OAAQ6C,IAAS,CAACsgB,EAAG7iB,IACjCkd,EAAA,MAAIC,MAAM,uCAAuC1C,IAAK,YAAYza,KAC/Dke,EAAMnc,YACLmb,EAAA,MACEC,MAAM,gJAA+I,qBAClI,YAEnBD,EAAA,QAAMC,MAAM,mEACVD,EAAA,eACEC,MAAM,8BACNzY,QAAQ,UACRoe,YAAY,KACZ/hB,MAAM,qCAGTyG,KAAKgW,iBAAiB,UAG1BhW,KAAKpJ,QAAQiD,KAAI7C,GAAUgJ,KAAKub,mBAAmBvkB,EAAQwB,Q,CAO9D,kBAAA+iB,CAAmBvkB,EAAqBwkB,GAC9C,MAAMC,EAAWzkB,EAAOykB,WACtBzkB,EAAOlB,OAAS,SACZ,CAAEA,KAAM,SAAUoH,QAAS,QAC3B,CAAEpH,KAAM,OAAQ4lB,MAAO,IAE7B,MAAMxE,EAAQlgB,EAAOkgB,OAAS,QAC9B,MAAM9Z,EAAOqe,EAAS3lB,OAAS,OAC/B,MAAM4lB,EAAQte,EAAOqe,EAASC,OAAS,EAAI,EAC3C,MAAM1C,EAAMyC,EAAS3lB,OAAS,MAC9B,MAAMogB,EAAOuF,EAAS3lB,OAAS,OAC/B,MAAM6lB,EAAQF,EAAS3lB,OAAS,QAChC,MAAM8lB,EAASH,EAAS3lB,OAAS,SACjC,MAAM+lB,EAAQJ,EAAS3lB,OAAS,QAEhC,OACE4f,EAAA,MACEC,MAAO,CACL,iBAAkB,KAClB,CAAC,yBAAyBuB,KAAU,KACpC,0BAA2B,KAC3B,8BAA+B9Z,GAAQse,IAAU,EACjD,6BAA8Bte,GAAQse,IAAU,EAChD,sBAAuB1C,EACvB,+BAAgCA,EAChC,uBAAwB9C,EACxB,wBAAyByF,EACzB,yBAA0BC,EAC1B,wBAAyBC,EACzB,+BAAgC7kB,EAAO0C,SAAW,QAClD,6BAA8B1C,EAAO0C,SAAW,MAChD,sBAAuB,KACvB,+BAAgC,MACjC,iBACe1C,EAAOE,GAAE,qBACLukB,EAAS3lB,KAC7Bmd,IAAK,YAAYuI,KAAYxkB,EAAOE,MAEpCwe,EAAA,QAAMC,MAAM,uDACT3V,KAAK8b,0BAA0BL,IAEjCzb,KAAKgW,iBAAiBhf,EAAO0C,Q,CAK5B,yBAAAoiB,CAA0BL,GAChC,GAAIA,EAAS3lB,OAAS,QAAS,OAAO,KAEtC,GAAI2lB,EAAS3lB,OAAS,QAAS,CAC7B,OACE4f,EAAA,QAAMC,MAAM,iDACVD,EAAA,eACEC,MAAM,iCACNzY,QAAQ,UACRoe,YAAY,KACZ/hB,MAAM,S,CAMd,GAAIkiB,EAAS3lB,OAAS,OAAQ,CAC5B,OAAO4f,EAAA,eAAaxY,QAAQ,OAAO6e,SAAS,KAAK7C,QAASuC,EAASvC,SAAW,O,CAGhF,GAAIuC,EAAS3lB,OAAS,MAAO,CAC3B,OACE4f,EAAA,eACExY,QAAQ,UACRoe,YAAY,KACZ/hB,MAAOkiB,EAASliB,OAAS,O,CAK/B,GAAIkiB,EAAS3lB,OAAS,SAAU,CAC9B,MAAMkmB,GAAYP,EAASve,SAAW,UAAY,OAClD,OACEwY,EAAA,eACExY,QAAQ,UACRoe,YAAY,KACZ/hB,MAAOkiB,EAASliB,QAAUyiB,EAAW,OAAS,Q,CAKpD,MAAMN,EAAQD,EAASC,OAAS,EAChC,OACEhG,EAAA,QAAMC,MAAM,uBACVD,EAAA,QAAMC,MAAM,mDACVD,EAAA,eACExY,QAAQ,OACRgd,YAAY,mBACZ3gB,MAAOkiB,EAASQ,cAAgB,UAGnCP,IAAU,GACThG,EAAA,QAAMC,MAAM,4EACVD,EAAA,eACExY,QAAQ,OACRgd,YAAY,kBACZ3gB,MAAOkiB,EAASS,gBAAkB,S,CAQtC,eAAAC,CAAgBrmB,EAAyB4I,GAC/C,MAAMmH,EAAQ/P,IAAS,QACvB,OACE4f,EAAA,SAAOC,MAAM,uCACXD,EAAA,MAAIC,MAAM,uBACRD,EAAA,MAAIC,MAAM,uBAAuBkF,QAASnc,GACxCgX,EAAA,OAAKC,MAAM,gDACTD,EAAA,kBACEQ,KAAMrQ,EAAQ,gBAAkB,QAChCuW,QAASvW,EAAQ7F,KAAK+L,aAAe/L,KAAK6L,aAC1CyD,KAAMzJ,EAAQ7F,KAAKgM,UAAYhM,KAAK8L,e,CAS1C,cAAAuQ,CAAe3F,GACrB,GACE1W,KAAKkM,WAAa,aACjBlM,KAAK0N,0BACLgJ,EAAMvY,SACPuY,EAAMvc,QACN,OAAO,KACT,MAAM0L,EAAQ7F,KAAKqE,eAAetN,OAClC,MAAM6jB,EAAiB5a,KAAKmE,eAAiB,WAC1CnE,KAAKuO,eAAe/K,sBAEvB,OACEkS,EAAA,SAAOC,MAAM,sCACXD,EAAA,MACEC,MAAM,qBACNgB,IAAKxT,IACHnD,KAAKyN,WAAatK,GAAW,IAAI,GAGnCuS,EAAA,MAAIC,MAAM,sBAAsBkF,QAASnE,EAAMhY,cAC7CgX,EAAA,OAAKC,MAAM,+CACR9P,EACC6P,EAAA,QAAMC,MAAM,wDACVD,EAAA,QAAMC,MAAM,uBACVD,EAAA,WAAS8C,KAAK,gBAAgB7f,KAAK,KAAK8e,MAAM,YAAW,cAAa,SACtE/B,EAAA,WAAS6B,GAAG,OAAOra,QAAQ,mBAAmBua,MAAM,aAAa5R,IAEnE6P,EAAA,sBACEpf,MAAO0J,KAAKqM,WACZ1T,KAAK,KACL2d,UAAW,IAAMtW,KAAKuO,eAAe3J,QAAQ,YAG/C5E,KAAKkG,YACPwP,EAAA,QAAMC,MAAM,0BACVD,EAAA,aAAW/c,KAAK,KAAK8e,MAAM,cAC3B/B,EAAA,WAAS6B,GAAG,OAAOra,QAAQ,mBAAmBua,MAAM,aACjDzX,KAAK2F,mBAGR3F,KAAKoE,SAAWwW,EAClBlF,EAAA,QAAMC,MAAM,0BACVD,EAAA,sBACEpf,MAAO0J,KAAKoM,cACZzT,KAAK,KACL2d,UAAW,IAAMtW,KAAKuO,eAAe3J,QAAQ,aAG/C5E,KAAKoE,QACPsR,EAAA,QAAMC,MAAM,0BAAyB,cAAa,SAElDD,EAAA,WACEC,MAAM,yBACN4B,GAAG,OACHra,QAAQ,mBACRua,MAAM,aAELzX,KAAKgG,sB,CAUd,0BAAAsW,CAA2B5F,GACjC,IAAK1W,KAAK0C,qBAAsB,OAAO,KACvC,OACEgT,EAAA,OACEC,MAAM,oCAEND,EAAA,SACEC,MAAO,CACL,kBAAmB,KACnB,gCAAiC,KACjC,8BAA+Be,EAAMnc,WACrC,2BAA4Bmc,EAAMvc,SAEpCkJ,MAAOqT,EAAMxY,WACb2X,KAAK,eACLc,IAAKxT,IACHnD,KAAKuN,oBAAsBpK,GAAW,IAAI,GAG3CnD,KAAKmY,eAAezB,GACpB1W,KAAKqY,aAAa3B,EAAO,KAAM,OAEjC1W,KAAKyW,0BAA0BC,G,CAKtC,iBAAY6F,GACV,GAAIvc,KAAKkM,WAAa,aAAc,OAAO,KAC3C,OAAOjQ,EACL+D,KAAKwc,eACLxc,KAAKtE,WACLsE,KAAKuL,mB,CAIT,mBAAYkR,GACV,OAAQzc,KAAKkM,WAAa,gBAAkBlM,KAAKmM,cAC7CnM,KAAKuc,iBAAmBvc,KAAK+O,GAAGE,cAClC,qE,CAII,kBAAAyN,GACN,MAAMC,EAAU3c,KAAKuc,cACrB,MAAMK,IAAe5c,KAAK+O,GAAGE,cAAc,2BAC3C,MAAM4N,IAAY7c,KAAK+O,GAAGE,cAAc,mBACxC,MAAM6N,IAAgB9c,KAAK+O,GAAGE,cAAc,4BAC5C,MAAM9C,EAAanM,KAAKkM,WAAa,aAAelM,KAAKmM,WAAa,KACtE,IAAKnM,KAAKyc,gBAAiB,OAAO,KAClC,OACE/G,EAAA,OAAKC,MAAM,kEACTD,EAAA,OAAKC,MAAM,4DACRiH,GACClH,EAAA,OAAKC,MAAM,kDACTD,EAAA,QAAM8C,KAAK,oBAGdqE,EACCnH,EAAA,QAAM8C,KAAK,WACTmE,EACFjH,EAAA,WACEC,MAAM,8CACN4B,GAAG,OACHra,QAAQ,mBACRua,MAAM,aAELkF,GAED,OAEJxQ,GAAc2Q,IACdpH,EAAA,OAAKC,MAAM,qDACRxJ,GACCuJ,EAAA,iBACEzF,UAAW9D,EAAW8D,UACtBD,SAAU7D,EAAW6D,SACrBD,aAAc5D,EAAW4D,cAAgB,QACzCI,WAAYhE,EAAWgE,WACvBC,gBAAiBjE,EAAWiE,iBAAmB,CAAC,GAAI,GAAI,IAAK,KAC7DP,UAAW1D,EAAW0D,WAAa,MACnCC,YAAa9P,KAAK8P,aAAe3D,EAAW2D,YAC5CO,iBAAkBlE,EAAWkE,kBAAoB,cACjDC,wBAAyBnE,EAAWmE,yBAA2B,MAC/DC,UAAWpE,EAAWoE,WAAa,QACnCC,cAAerE,EAAWqE,eAAiB,QAC3Cla,MAAO6V,EAAW3V,WAAa,GAAGwJ,KAAKyQ,qBACvC/K,QAAS1F,KAAK0F,QACdqX,WAAalc,GACXb,KAAKkQ,mBAAmBtB,KAAK/N,EAAM6N,UAGzCgH,EAAA,QAAM8C,KAAK,qB,CAOb,gBAAAwE,GACN,GAAIhd,KAAKsL,oBAAsB,UAAW,OAAO,KACjD,OACEoK,EAAA,OAAKC,MAAM,sDACTD,EAAA,OAAKC,MAAM,6BACTD,EAAA,QACE8C,KAAK,SACLyE,aAAcjd,KAAKgP,0BAEnBhP,KAAKiN,cACLyI,EAAA,WACEC,MAAM,6CACN4B,GAAG,MACHra,QAAQ,mBACRsa,SAAU,KACVC,MAAM,UAAS,cACH,QAEXzX,KAAKyQ,SAEN,M,CAMZ,MAAAyM,GACEld,KAAK2N,iBAAiBxG,QACtB,MAAMuP,EAAQ1W,KAAK2T,oBACnB3T,KAAK8N,cAAgB4I,EACrB,MAAMyG,EAAcnd,KAAKod,aAAarmB,QAAU,GAAGiJ,KAAKyQ,sBACxD,MAAM4M,EAAiBrd,KAAK0F,UAAYgR,EAAMvY,QAC9C,MAAMmf,GAAgB5G,EAAMvY,SAAW6B,KAAK6F,MAC5C,MAAM0X,EAAsB7G,EAAMvc,SAAWuc,EAAMxc,OAAOhC,OAAS,EACnE,MAAMslB,EAAmBD,GAAuBvd,KAAK9F,OAAOT,MAAKY,GAASA,EAAM6L,cAChF,MAAMuX,GAAiBzd,KAAKyS,oBAAsBzS,KAAK0S,kBACnD,CAAE,4BAA6B1S,KAAK0S,mBACpCna,UACJ,MAAMmlB,EAAY1d,KAAKuS,YACnB,CAAE,4BAA6BvS,KAAKwS,gBACpCja,UAEJ,OACEmd,EAACiI,EAAI,CAAA1K,IAAA,2CACH0C,MAAO,CACL,aAAc,KACd,sBAAuB3V,KAAKyS,mBAC5B,2BAA4BzS,KAAKuS,YACjC,2BAA4BvS,KAAKyL,aAEnCpI,MAAOqa,EACPnE,UAAY1Y,GAAyBb,KAAK2S,wBAAwB9R,IAElE6U,EAAA,OAAAzC,IAAA,2CAAK0C,MAAO,CACV,WAAY,KACZ,oBAAqB3V,KAAKyS,mBAC1B,6BAA8BzS,KAAK8E,gBACnC,yBAA0B9E,KAAKuS,YAC/B,yBAA0BvS,KAAKyL,YAC/B,iCAAkCzL,KAAKyL,cAAgBzL,KAAKgN,mBAC5D,iCAAkChN,KAAKyL,aAAezL,KAAKgN,mBAC3D,0BAA2BhN,KAAKwL,aAChC,mCAAoCxL,KAAK0C,qBACzC,oCAAqC1C,KAAKwL,eAAiBxL,KAAK0C,qBAChE,4BAA6B1C,KAAKsL,oBAAsB,UACxD,2BAA4BtL,KAAKyc,iBAChC9F,IAAKxT,IACNnD,KAAKkN,OAAS/J,GAAW,IAAI,GAE5BnD,KAAKgd,mBACNtH,EAAA,OAAAzC,IAAA,2CACE0C,MAAO,CACL,kBAAmB,KACnB,kCAAmC3V,KAAK4M,cACxC,gCAAiC5M,KAAK6M,aAExC8J,IAAKxT,IACHnD,KAAKoN,QAAUjK,GAAW,IAAI,GAG/BnD,KAAKsc,2BAA2B5F,GAChC1W,KAAK8a,kBAAkBpE,IACtB1W,KAAK0C,sBAAwB1C,KAAKyW,0BAA0BC,GAC9DhB,EAAA,OAAAzC,IAAA,2CACE0C,MAAO,CACL,qBAAsB,KACtB,gBAAiB3V,KAAKX,YAExBgE,MAAOoa,EACP9G,IAAKxT,IACHnD,KAAKmN,WAAahK,GAAW,IAAI,EAEnC0S,KAAM7V,KAAKX,WAAa,SAAW9G,UAAS,aAChCyH,KAAKX,WAAa8d,EAAc5kB,UAC5C+gB,SAAUtZ,KAAKX,WAAa,EAAI9G,WAEhCmd,EAAA,SAAAzC,IAAA,2CACE0C,MAAO,CACL,kBAAmB,KACnB,8BAA+Be,EAAMnc,WACrC,2BAA4Bmc,EAAMvc,QAClC,uCAAwCuc,EAAMvc,SAC5C6F,KAAKwL,eAAiBxL,KAAK0C,sBAE/BW,MAAOqT,EAAMxY,WAAU,YACZmf,GAAkBrd,KAAKkG,aAAesX,EAAmB,OAASjlB,UAC7Eoe,IAAKxT,IACHnD,KAAKwN,QAAUrK,GAAW,IAAI,GAGhCuS,EAAA,WAAAzC,IAAA,2CAAS0C,MAAM,wCACbD,EAAA,WAAAzC,IAAA,2CAASsE,GAAG,OAAOra,QAAQ,mBAAmBsa,SAAU,KAAMC,MAAM,WACjEzX,KAAKyQ,UAGTzQ,KAAKmY,eAAezB,GACpB1W,KAAKqY,aAAa3B,GAAQ1W,KAAK0C,sBAC/B2a,EACGrd,KAAKib,mBAAmBvE,GACxB4G,EACEtd,KAAKmc,gBAAgB,QAASzF,EAAMhY,cACpCgY,EAAMvY,SAAWof,EACfvd,KAAK+a,iBAAiBrE,GACtB1W,KAAKmc,gBAAgB,QAASzF,EAAMhY,eAC1C2e,IAAmBC,GAAgBtd,KAAKqc,eAAe3F,MAI9D1W,KAAK0c,qBACNhH,EAAA,OAAAzC,IAAA,2CAAK0C,MAAM,qBAAqBE,KAAK,SAAQ,YAAW,SAAQ,cAAa,QAC1E7V,KAAK8M,e","ignoreList":[]}
1
+ {"version":3,"names":["TABLE_COLUMN_WIDTH_TOKENS","xs","sm","md","lg","xl","isTableCellText","value","isTableCellPrimaryText","kind","isTableCellTag","isTableCellIcon","isTableCellIconText","isTableCellImage","isTableCellAction","isTableCellEmpty","isTableCellBlank","tableCellPrimary","label","primary","alt","ariaLabel","tableRowSelectionLabel","row","columns","explicit","selectionLabel","trim","column","cells","id","String","nextTableSortState","current","columnId","direction","toggleTableGroupCollapsed","collapsedGroupIds","groupId","next","Set","has","delete","add","nextTableGroupsCollapsed","groupIds","length","collapsed","allCollapsed","every","tableCollapseAllHost","undefined","index","mode","clampTableColumnSize","size","Number","isFinite","minimum","minSize","maximum","maxSize","Math","max","POSITIVE_INFINITY","min","tableColumnSize","width","tableFlexibleColumnId","some","sticky","tableExplicitMinWidth","widths","map","filter","join","tableRows","rows","groups","grouped","flatMap","group","canSelectRow","selectable","disabled","deriveTableSelectionState","selectedRowIds","selected","selectableRowIds","selectedLoadedCount","reduce","count","allSelected","indeterminate","toggleTableRowSelection","toggleAllLoadedTableRows","loadedRows","state","toggleTableGroupSelection","groupRows","resolvedTableGroupCount","total","totalCount","TABLE_GROUP_INTENTS","isTableGroupIntent","includes","tableGroupIntentClass","intent","tableGroupLabelColor","formatTableResultSummary","displayed","locale","formatter","Intl","NumberFormat","replace","format","tableModelIssues","issues","columnIds","push","header","headerLabel","rowIds","TABLE_CELL_TEXT_RUN_LIMIT","trackText","text","resolveTableCellImageTracks","tracks","tableCellImageVariant","normalizeTableCellTextTrack","track","items","Array","isArray","runs","item","color","resolveTextPresentation","source","options","secondary","tertiary","allowTertiary","secondaryColor","tertiaryColor","href","target","wrap","fontFeature","singleLine","primaryText","variant","wraps","resolveTableCellPresentation","cellType","icon","iconColor","iconLabel","createTableRenderModel","input","selectionMode","allGroupsCollapsed","showCollapseAll","explicitMinWidth","flexibleColumnId","gridTracks","tableStyle","hasData","selection","loadedCount","totalLabel","countLabel","intentClass","labelColor","totalColumns","collapseAllHost","resolveTableLayoutMetrics","horizontalOverflow","scrollInlineSize","viewportInlineSize","visibleInlineSize","overflow","start","scrollInlineOffset","end","scrollable","scrollBlockSize","viewportBlockSize","inlineOffset","maxInlineOffset","collapseBlockOffset","collapseHeadBlockStart","collapseFrameBlockStart","TableLayoutController","constructor","this","connected","connectedViewport","resizeObserver","frame","schedule","requestAnimationFrame","sync","handleScroll","clampInlineOffset","clampVerticalOverscroll","clampBlockOffset","handleWheel","event","viewport","abs","deltaX","deltaY","scrollWidth","clientWidth","atStart","scrollLeft","atEnd","preventDefault","scrollHeight","clientHeight","scrollTop","verticalEdgeWheel","connect","refresh","disconnect","cancelAnimationFrame","removeEventListener","elements","elementsChanged","addEventListener","passive","ResizeObserver","observe","clamped","measureCollapse","floatingCollapseAll","documentStickyHeader","collapseAllOverlay","interactiveHead","metrics","getBoundingClientRect","top","setProperty","stickyHeaderTable","overflowChanged","element","property","style","getPropertyValue","TableLoadController","intersectionSupported","IntersectionObserver","intersectionObserver","observedSentinel","requestPending","requestedRowCount","previousLoadedRowCount","initialize","loadedRowCount","disconnectObserver","lazyLoading","loadMoreMode","hasMore","loadMoreError","sentinel","threshold","loadMoreThreshold","entries","entry","isIntersecting","request","root","containedScroll","rootMargin","structureChanged","resetRequest","dataChanged","nextCount","added","announce","rowsLoadedLabel","identityChanged","configurationChanged","loadingChanged","loading","loadingMoreLabel","errorChanged","error","hasMoreChanged","hadMore","endOfResultsLabel","reason","loadingMore","loadIdentity","groupIdentity","formatGroupLabel","template","split","TableGroupLoadController","snapshots","Map","pending","createSnapshots","enabled","dataset","sentinels","find","clear","nextSnapshots","snapshot","previous","get","identity","set","keys","resolveTableFitPageSize","headerBlockSize","itemBlockSize","availableBlockSize","floor","resolveTableViewportFitMetrics","insetBlockStart","insetBlockEnd","scrollportBlockEnd","scrollportBlockStart","scrollportBlockSize","settledBlockStart","reservedBlockSize","currentBlockStart","hostBlockStart","currentBlockSize","settled","TableViewportFitController","scrollRoot","host","surface","hostRect","scrollportRect","HTMLElement","height","window","innerHeight","insets","resolveCssLengthPx","blockStart","blockEnd","fitChanged","disconnectRuntime","clearGeometry","nextScrollRoot","findScrollRoot","scrollOuterBy","delta","scrollingElement","document","scrollY","documentElement","scrollTo","behavior","removeProperty","ancestor","composedParent","getComputedStyle","overflowY","assignedSlot","parentElement","focusRingCss","interactionFillCss","tableCss","Table","__stencil_proxyCustomElement","registerHost","grouping","sort","captionVisibility","resultSummaryLabel","stickyHeader","fitViewport","viewportInsetBlockStart","viewportInsetBlockEnd","skeletonRows","emptyHeading","emptyBody","errorHeading","errorBody","emptyCellLabel","dataMode","pagination","loadMoreLabel","retryLabel","groupLoadMoreLabel","groupLoadMoreAriaLabel","groupRetryLabel","groupLoadingMoreLabel","groupEndOfResultsLabel","groupRowsLoadedLabel","overflowStart","overflowEnd","announcement","activeStickyGroupId","viewportFitSettled","headerPresent","rootEl","viewportEl","frameEl","interactiveHeadEl","collapseAllOverlayEl","stickyHeaderTableEl","tableEl","sentinelEl","incrementalWindowActive","groupSentinelEls","previousModelWarning","hasLoaded","renderedModel","stickyGroupConnected","headerSlotObserver","fitResizeObserver","fitObservedViewport","fitObservedTable","fitMeasurementPending","layoutController","viewportFitController","loadController","currentLoadedRowCount","message","detail","dsLoadMore","emit","groupLoadController","dsGroupLoadMore","el","syncHeaderSlotPresence","querySelector","updateStickyGroup","bottom","activeGroupId","activeGroupTop","body","querySelectorAll","sourceRect","bodyRect","frameRect","syncFitPageSize","fitToPage","fitPageSize","pageSizeMode","pageSize","pageIndex","dsPaginationChange","totalItems","pageSizeOptions","fitPageSizeLabel","fitPageSizeTriggerLabel","itemLabel","pageSizeLabel","caption","previousPageIndex","previousPageSize","previousPageSizeMode","componentWillLoad","hasIncrementalState","warnModelIssues","componentDidLoad","syncStickyGroupConnection","connectHeaderSlotObserver","connectFitObserver","componentDidRender","connectedCallback","disconnectedCallback","disconnectStickyGroup","disconnectFitObserver","MutationObserver","childList","connectStickyGroup","capture","handleStructureChange","handleDataChange","handleLoadIdentityChange","handleLazyConfigurationChange","handleDataModeChange","handlePaginationChange","fitIdentity","handleLoadingMoreChange","handleLoadMoreErrorChange","handleHasMoreChange","fixedHeight","resolvedHeight","boundedComposition","resolvedMaxHeight","handlePaginationKeyDown","defaultPrevented","altKey","ctrlKey","metaKey","shiftKey","key","fromDirectionalControl","composedPath","node","tagName","isContentEditable","getAttribute","resolvePaginationState","totalPages","currentLoadedRows","createRenderModel","maxHeight","unshift","headerSegments","segment","sortKey","stickyStart","stickyEnd","console","warn","emitSort","sortable","dsSortChange","sortButtonLabel","emitRowSelection","dsSelectionChange","scope","changedRowId","emitAllSelection","emitGroupSelection","rowEventOwnsActivation","currentTarget","matches","emitRowActivation","interactive","dsRowActivate","rowId","handleRowKeydown","renderSelectionControl","checked","onActivate","h","class","type","role","onClick","presentation","renderStickyEdge","renderCollapseAllButton","hasBorder","activeFill","pressScale","onDsClick","stopPropagation","emitAllGroupsCollapse","renderFloatingCollapseAll","model","ref","renderColumnHeader","presentational","groupedColumn","activeMemberSegment","activeMemberSort","activeSort","align","memberAriaSort","labelControl","segmentActive","segmentInteractive","as","emphasis","lineTruncation","control","separator","sortControl","isActive","collapseHost","actionCollapseHost","blankActionCollapseHost","collapseControl","renderColgroup","flexible","renderHeader","renderCellValue","cell","name","renderTextCopy","src","isInset","insetDepth","isInactive","isLoading","dsCellAction","actionId","tag","contrast","rounded","resolveSafeUrl","rel","renderTextTrack","defaultColor","wholeColor","trackClass","colorFor","run","renderRow","rowSelectable","tabIndex","onKeyDown","tagCell","iconCell","iconTextCell","imageCell","actionCell","textCell","primaryTextCell","singleTextCell","emptyCell","blankCell","tagVariant","textVariant","imageVariant","iconTextVariant","emitGroupCollapse","dsGroupCollapseChange","renderGroupContent","groupModel","isCollapsed","groupSelection","expanded","formatGroupLoadLabel","renderGroupLoadRow","manualFallback","colSpan","renderStickyGroup","renderDataBodies","stickySourceHidden","renderSkeletonBody","round","from","_","controlSize","renderSkeletonCell","rowIndex","skeleton","lines","iconText","image","action","blank","renderSkeletonCellContent","iconSize","iconOnly","copy","primaryWidth","secondaryWidth","tertiaryWidth","renderStateBody","heading","renderLazyBody","renderDocumentStickyHeader","resultSummary","displayedCount","hasResultFooter","renderResultFooter","summary","hasLeading","hasCopy","hasTrailing","onDsChange","renderCaptionBar","onSlotchange","render","regionLabel","scrollLabel","initialLoading","initialError","hasGroupedStructure","groupLoadingMore","viewportStyle","hostStyle","Host"],"sources":["src/wc/components/Table/table-model.ts","src/wc/components/Table/table-cell-model.ts","src/wc/components/Table/table-render-model.ts","src/wc/components/Table/table-layout-controller.ts","src/wc/components/Table/table-load-controller.ts","src/wc/components/Table/table-group-load-controller.ts","src/wc/components/Table/table-pagination-fit.ts","src/wc/components/Table/table-viewport-fit-controller.ts","src/wc/utils/focus-ring.css?tag=ds-table&encapsulation=scoped","src/wc/utils/interaction-fill.css?tag=ds-table&encapsulation=scoped","src/wc/components/Table/Table.css?tag=ds-table&encapsulation=scoped","src/wc/components/Table/Table.tsx"],"sourcesContent":["import type {\n TableCellBlank,\n TableCellAction,\n TableCellEmpty,\n TableCellIcon,\n TableCellIconText,\n TableCellImage,\n TableCellPrimaryText,\n TableCellText,\n TableCellTag,\n TableCellValue,\n TableColumn,\n TableGroup,\n TableRow,\n TableSortState,\n} from './table-types';\n\nexport interface TableSelectionState {\n selectableRowIds: string[];\n selectedLoadedCount: number;\n allSelected: boolean;\n indeterminate: boolean;\n}\n\nconst TABLE_COLUMN_WIDTH_TOKENS = {\n xs: '--dimension-table-column-width-xs',\n sm: '--dimension-table-column-width-sm',\n md: '--dimension-table-column-width-md',\n lg: '--dimension-table-column-width-lg',\n xl: '--dimension-table-column-width-xl',\n} as const;\n\nexport function isTableCellText(value: TableCellValue): value is TableCellText {\n return typeof value === 'object' && value !== null && 'primary' in value && !('kind' in value);\n}\n\nexport function isTableCellPrimaryText(value: TableCellValue): value is TableCellPrimaryText {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'primary-text';\n}\n\nexport function isTableCellTag(value: TableCellValue): value is TableCellTag {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'tag';\n}\n\nexport function isTableCellIcon(value: TableCellValue): value is TableCellIcon {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'icon';\n}\n\nexport function isTableCellIconText(value: TableCellValue): value is TableCellIconText {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'icon-text';\n}\n\nexport function isTableCellImage(value: TableCellValue): value is TableCellImage {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'image';\n}\n\nexport function isTableCellAction(value: TableCellValue): value is TableCellAction {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'action';\n}\n\nexport function isTableCellEmpty(value: TableCellValue): value is TableCellEmpty {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'empty';\n}\n\nexport function isTableCellBlank(value: TableCellValue): value is TableCellBlank {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'blank';\n}\n\nexport function tableCellPrimary(value: TableCellValue): string | number | null {\n if (value == null) return null;\n if (isTableCellTag(value)) return value.label;\n if (isTableCellIcon(value)) return null;\n if (isTableCellIconText(value)) return value.primary;\n if (isTableCellImage(value)) return value.alt;\n if (isTableCellAction(value)) return value.label ?? value.ariaLabel;\n if (isTableCellPrimaryText(value)) return value.primary;\n if (isTableCellEmpty(value) || isTableCellBlank(value)) return null;\n return isTableCellText(value) ? value.primary : value;\n}\n\nexport function tableRowSelectionLabel(row: TableRow, columns: TableColumn[]): string {\n const explicit = row.selectionLabel?.trim();\n if (explicit) return explicit;\n\n for (const column of columns) {\n const primary = tableCellPrimary(row.cells[column.id]);\n if (primary != null && String(primary).trim()) return String(primary);\n }\n\n return row.id;\n}\n\nexport function nextTableSortState(\n current: TableSortState | null | undefined,\n columnId: string,\n): TableSortState {\n if (current?.columnId !== columnId) return { columnId, direction: 'asc' };\n if (current.direction === 'asc') return { columnId, direction: 'desc' };\n return { columnId, direction: 'asc' };\n}\n\nexport function toggleTableGroupCollapsed(\n collapsedGroupIds: string[],\n groupId: string,\n): string[] {\n const next = new Set(collapsedGroupIds);\n if (next.has(groupId)) next.delete(groupId);\n else next.add(groupId);\n return [...next];\n}\n\nexport function nextTableGroupsCollapsed(\n collapsedGroupIds: string[],\n groupIds: string[],\n): string[] {\n if (groupIds.length === 0) return [];\n const collapsed = new Set(collapsedGroupIds);\n const allCollapsed = groupIds.every(id => collapsed.has(id));\n return allCollapsed ? [] : [...groupIds];\n}\n\n/** Host for grouped collapse-all: the trailing action lane or a scrollport-owned overlay. */\nexport type TableCollapseAllHost =\n | { columnId: string; mode: 'action' }\n | { mode: 'floating' };\n\nexport function tableCollapseAllHost(\n columns: TableColumn[],\n): TableCollapseAllHost | undefined {\n if (columns.length === 0) return undefined;\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const column = columns[index]!;\n if (column.kind === 'action') return { columnId: column.id, mode: 'action' };\n }\n return { mode: 'floating' };\n}\n\nexport function clampTableColumnSize(column: TableColumn): number | undefined {\n if (typeof column.size !== 'number' || !Number.isFinite(column.size) || column.size <= 0) {\n return undefined;\n }\n\n const minimum = Number.isFinite(column.minSize) && (column.minSize ?? 0) > 0\n ? column.minSize!\n : 0;\n const maximum = Number.isFinite(column.maxSize) && (column.maxSize ?? 0) > 0\n ? Math.max(column.maxSize!, minimum)\n : Number.POSITIVE_INFINITY;\n\n return Math.min(Math.max(column.size!, minimum), maximum);\n}\n\nexport function tableColumnSize(column: TableColumn): string | undefined {\n if (typeof column.size === 'string') {\n return `var(${TABLE_COLUMN_WIDTH_TOKENS[column.size]})`;\n }\n const width = clampTableColumnSize(column);\n if (width != null) return `${width}px`;\n return column.kind === 'action' ? 'var(--dimension-size-500)' : undefined;\n}\n\n/**\n * When every column has an explicit width, one ordinary lane must absorb spare\n * table width so fixed selection and action lanes are not expanded by the\n * native fixed-table layout algorithm.\n */\nexport function tableFlexibleColumnId(columns: TableColumn[]): string | undefined {\n if (columns.some(column => !tableColumnSize(column))) return undefined;\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const column = columns[index]!;\n if (column.kind !== 'action' && !column.sticky) return column.id;\n }\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const column = columns[index]!;\n if (column.kind !== 'action') return column.id;\n }\n return columns[columns.length - 1]?.id;\n}\n\nexport function tableExplicitMinWidth(columns: TableColumn[]): string | undefined {\n const widths = columns.map(tableColumnSize).filter((width): width is string => !!width);\n if (widths.length === 0) return undefined;\n return widths.length === 1 ? widths[0] : `calc(${widths.join(' + ')})`;\n}\n\nexport function tableRows(rows: TableRow[], groups: TableGroup[], grouped: boolean): TableRow[] {\n return grouped ? groups.flatMap(group => group.rows) : rows;\n}\n\nfunction canSelectRow(row: TableRow): boolean {\n return row.selectable !== false && !row.disabled;\n}\n\nexport function deriveTableSelectionState(\n rows: TableRow[],\n selectedRowIds: readonly string[],\n): TableSelectionState {\n const selected = new Set(selectedRowIds);\n const selectableRowIds = rows.filter(canSelectRow).map(row => row.id);\n const selectedLoadedCount = selectableRowIds.reduce(\n (count, id) => count + (selected.has(id) ? 1 : 0),\n 0,\n );\n\n return {\n selectableRowIds,\n selectedLoadedCount,\n allSelected: selectableRowIds.length > 0 && selectedLoadedCount === selectableRowIds.length,\n indeterminate: selectedLoadedCount > 0 && selectedLoadedCount < selectableRowIds.length,\n };\n}\n\nexport function toggleTableRowSelection(\n selectedRowIds: readonly string[],\n row: TableRow,\n): string[] {\n if (!canSelectRow(row)) return [...selectedRowIds];\n const selected = new Set(selectedRowIds);\n if (selected.has(row.id)) selected.delete(row.id);\n else selected.add(row.id);\n return [...selected];\n}\n\nexport function toggleAllLoadedTableRows(\n selectedRowIds: readonly string[],\n loadedRows: TableRow[],\n): string[] {\n const selected = new Set(selectedRowIds);\n const state = deriveTableSelectionState(loadedRows, selectedRowIds);\n\n for (const id of state.selectableRowIds) {\n if (state.allSelected) selected.delete(id);\n else selected.add(id);\n }\n\n return [...selected];\n}\n\n/** Toggle every selectable loaded row that belongs to a group. */\nexport function toggleTableGroupSelection(\n selectedRowIds: readonly string[],\n groupRows: TableRow[],\n): string[] {\n return toggleAllLoadedTableRows(selectedRowIds, groupRows);\n}\n\nexport function resolvedTableGroupCount(group: TableGroup): number {\n const total = Number.isFinite(group.totalCount) ? Math.max(0, group.totalCount!) : 0;\n return Math.max(total, group.rows.length);\n}\n\nexport const TABLE_GROUP_INTENTS = [\n 'brand',\n 'neutral',\n 'negative',\n 'warning',\n 'caution',\n 'positive',\n] as const;\n\nexport function isTableGroupIntent(\n value: unknown,\n): value is (typeof TABLE_GROUP_INTENTS)[number] {\n return (\n typeof value === 'string' &&\n (TABLE_GROUP_INTENTS as readonly string[]).includes(value)\n );\n}\n\nexport function tableGroupIntentClass(\n intent: (typeof TABLE_GROUP_INTENTS)[number] | undefined,\n): string | undefined {\n return isTableGroupIntent(intent) ? `ds-table__group-cell--intent-${intent}` : undefined;\n}\n\n/** Title color for an intentful group label; defaults to primary when unset. */\nexport function tableGroupLabelColor(\n intent: (typeof TABLE_GROUP_INTENTS)[number] | undefined,\n): 'primary' | 'brand' | 'negative' | 'warning' | 'caution' | 'positive' | `var(--${string})` {\n if (!isTableGroupIntent(intent)) return 'primary';\n if (intent === 'neutral') return 'var(--color-foreground-bold-neutral)';\n return intent;\n}\n\n/** Formats the optional table result footer. Returns null when either count is missing. */\nexport function formatTableResultSummary(\n displayed: number | null | undefined,\n total: number | null | undefined,\n label = 'Displaying {displayed} of {total}',\n locale?: string,\n): string | null {\n if (!Number.isFinite(displayed) || !Number.isFinite(total)) return null;\n const formatter = new Intl.NumberFormat(locale);\n return label\n .replace('{displayed}', formatter.format(displayed as number))\n .replace('{total}', formatter.format(total as number));\n}\n\nexport function tableModelIssues(\n columns: TableColumn[],\n rows: TableRow[],\n groups: TableGroup[],\n grouped: boolean,\n): string[] {\n const issues: string[] = [];\n const columnIds = new Set<string>();\n for (const column of columns) {\n if (!column.id.trim()) issues.push('Every column requires a non-empty id.');\n else if (columnIds.has(column.id)) issues.push(`Duplicate column id: ${column.id}`);\n if (!column.header.trim() && !column.headerLabel?.trim()) {\n issues.push(`Column ${column.id || '(missing id)'} requires a visible header or headerLabel.`);\n }\n columnIds.add(column.id);\n }\n\n const groupIds = new Set<string>();\n if (grouped) {\n for (const group of groups) {\n if (!group.id.trim()) issues.push('Every group requires a non-empty id.');\n else if (groupIds.has(group.id)) issues.push(`Duplicate group id: ${group.id}`);\n groupIds.add(group.id);\n if (group.totalCount != null && group.totalCount < group.rows.length) {\n issues.push(`Group ${group.id} totalCount is smaller than its loaded row count.`);\n }\n if (group.intent != null && !isTableGroupIntent(group.intent)) {\n issues.push(`Group ${group.id} has an unsupported intent.`);\n }\n }\n }\n\n const rowIds = new Set<string>();\n for (const row of tableRows(rows, groups, grouped)) {\n if (!row.id.trim()) issues.push('Every row requires a non-empty id.');\n else if (rowIds.has(row.id)) issues.push(`Duplicate row id: ${row.id}`);\n rowIds.add(row.id);\n }\n\n return [...new Set(issues)];\n}\n","import {\n isTableCellAction,\n isTableCellBlank,\n isTableCellEmpty,\n isTableCellIcon,\n isTableCellIconText,\n isTableCellImage,\n isTableCellPrimaryText,\n isTableCellTag,\n isTableCellText,\n} from './table-model';\nimport type {\n TableCellAction,\n TableCellBlank,\n TableCellEmpty,\n TableCellIcon,\n TableCellImage,\n TableCellImageTracks,\n TableCellTag,\n TableCellTagVariant,\n TableCellTextRun,\n TableCellTextTrack,\n TableCellValue,\n TableCellLinkTarget,\n TableColumn,\n} from './table-types';\nimport type { IconColor } from '../Icon/Icon';\nimport type { TextColor } from '../Text/text-types';\n\n/** Maximum independently colored runs on one secondary or tertiary track. */\nexport const TABLE_CELL_TEXT_RUN_LIMIT = 3;\n\nexport interface ResolvedTableCellText {\n primary: string | number;\n secondary?: TableCellTextRun[];\n tertiary?: TableCellTextRun[];\n secondaryColor?: TextColor;\n tertiaryColor?: TextColor;\n href?: string;\n target?: TableCellLinkTarget;\n wrap?: boolean;\n fontFeature?: 'normal' | 'tabular-nums';\n}\n\nexport type TableCellPresentation =\n | { kind: 'blank'; cellType: 'blank'; value: TableCellBlank }\n | { kind: 'empty'; cellType: 'empty'; value: TableCellEmpty | null | undefined }\n | { kind: 'icon'; cellType: 'icon'; value: TableCellIcon }\n | {\n kind: 'icon-text';\n cellType: 'icon-text';\n icon: string;\n iconColor?: IconColor;\n iconLabel?: string;\n value: ResolvedTableCellText;\n variant: 'single' | 'multi' | 'triple';\n wraps: boolean;\n }\n | {\n kind: 'image';\n cellType: 'image';\n value: TableCellImage;\n variant: 'single' | 'multi' | 'triple';\n }\n | { kind: 'action'; cellType: 'action'; value: TableCellAction }\n | {\n kind: 'tag';\n cellType: 'tag';\n value: TableCellTag;\n variant: TableCellTagVariant;\n }\n | {\n kind: 'text';\n cellType: 'text' | 'primary-text';\n value: ResolvedTableCellText;\n primaryText: boolean;\n singleLine: boolean;\n variant: 'single' | 'multi' | 'triple' | 'primary-pair';\n wraps: boolean;\n };\n\nfunction trackText(value: string | number | TableCellTextRun): string | undefined {\n if (typeof value === 'string' || typeof value === 'number') {\n const text = String(value);\n return text.trim() === '' ? undefined : text;\n }\n const text = value.text?.trim();\n return text ? value.text : undefined;\n}\n\n/** Resolve an image cell's track stack; unknown values fall back to one track. */\nexport function resolveTableCellImageTracks(\n tracks: TableCellImage['tracks'],\n): TableCellImageTracks {\n return tracks === 2 || tracks === 3 ? tracks : 1;\n}\n\n/** Map an image track stack onto the shared single/multi/triple cell variant. */\nexport function tableCellImageVariant(\n tracks: TableCellImageTracks,\n): 'single' | 'multi' | 'triple' {\n return tracks === 3 ? 'triple' : tracks === 2 ? 'multi' : 'single';\n}\n\n/** Collapse a consumer track into at most three non-empty runs. */\nexport function normalizeTableCellTextTrack(\n track: TableCellTextTrack | number | undefined,\n): TableCellTextRun[] | undefined {\n if (track == null) return undefined;\n const items = Array.isArray(track) ? track : [track];\n const runs: TableCellTextRun[] = [];\n for (const item of items) {\n if (runs.length >= TABLE_CELL_TEXT_RUN_LIMIT) break;\n const text = trackText(item);\n if (text === undefined) continue;\n runs.push(\n typeof item === 'object' && item !== null && 'color' in item && item.color\n ? { text, color: item.color }\n : { text },\n );\n }\n return runs.length ? runs : undefined;\n}\n\nfunction resolveTextPresentation(\n source: {\n primary: string | number;\n secondary?: TableCellTextTrack | number;\n tertiary?: TableCellTextTrack;\n secondaryColor?: TextColor;\n tertiaryColor?: TextColor;\n href?: string;\n target?: TableCellLinkTarget;\n wrap?: boolean;\n fontFeature?: 'normal' | 'tabular-nums';\n },\n column: TableColumn,\n options: { primaryText: boolean; allowTertiary: boolean },\n): {\n value: ResolvedTableCellText;\n singleLine: boolean;\n variant: 'single' | 'multi' | 'triple' | 'primary-pair';\n wraps: boolean;\n} {\n const secondary = normalizeTableCellTextTrack(source.secondary);\n const tertiary = options.allowTertiary\n ? normalizeTableCellTextTrack(source.tertiary)\n : undefined;\n const value: ResolvedTableCellText = {\n primary: source.primary,\n ...(secondary ? { secondary } : {}),\n ...(tertiary ? { tertiary } : {}),\n ...(source.secondaryColor ? { secondaryColor: source.secondaryColor } : {}),\n ...(source.tertiaryColor ? { tertiaryColor: source.tertiaryColor } : {}),\n ...(source.href ? { href: source.href } : {}),\n ...(source.target ? { target: source.target } : {}),\n ...(source.wrap ? { wrap: source.wrap } : {}),\n ...(source.fontFeature ? { fontFeature: source.fontFeature } : {}),\n };\n const singleLine = !options.primaryText && !secondary && !tertiary;\n return {\n value,\n singleLine,\n variant: options.primaryText\n ? 'primary-pair'\n : tertiary\n ? 'triple'\n : singleLine\n ? 'single'\n : 'multi',\n wraps: value.wrap ?? column.wrap ?? false,\n };\n}\n\n/** Resolve a cell's semantic and visual recipe once for both markup and classes. */\nexport function resolveTableCellPresentation(\n value: TableCellValue,\n column: TableColumn,\n): TableCellPresentation {\n if (isTableCellBlank(value)) return { kind: 'blank', cellType: 'blank', value };\n if (value == null || isTableCellEmpty(value)) {\n return { kind: 'empty', cellType: 'empty', value };\n }\n if (isTableCellIcon(value)) return { kind: 'icon', cellType: 'icon', value };\n if (isTableCellIconText(value)) {\n const text = resolveTextPresentation(value, column, {\n primaryText: false,\n allowTertiary: true,\n });\n return {\n kind: 'icon-text',\n cellType: 'icon-text',\n icon: value.icon,\n ...(value.iconColor ? { iconColor: value.iconColor } : {}),\n ...(value.iconLabel ? { iconLabel: value.iconLabel } : {}),\n value: text.value,\n variant: text.variant === 'primary-pair' ? 'single' : text.variant,\n wraps: text.wraps,\n };\n }\n if (isTableCellImage(value)) {\n return {\n kind: 'image',\n cellType: 'image',\n value,\n variant: tableCellImageVariant(resolveTableCellImageTracks(value.tracks)),\n };\n }\n if (isTableCellAction(value)) return { kind: 'action', cellType: 'action', value };\n if (isTableCellTag(value)) {\n return {\n kind: 'tag',\n cellType: 'tag',\n value,\n variant: value.variant ?? 'tag-only',\n };\n }\n\n const primaryText = isTableCellPrimaryText(value);\n const source = isTableCellText(value) || primaryText\n ? value\n : {\n primary: value,\n fontFeature: typeof value === 'number' ? 'tabular-nums' as const : 'normal' as const,\n };\n const text = resolveTextPresentation(\n isTableCellText(value)\n ? value\n : source,\n column,\n { primaryText, allowTertiary: isTableCellText(value) },\n );\n return {\n kind: 'text',\n cellType: primaryText ? 'primary-text' : 'text',\n value: text.value,\n primaryText,\n singleLine: text.singleLine,\n variant: text.variant,\n wraps: text.wraps,\n };\n}\n","import {\n deriveTableSelectionState,\n isTableGroupIntent,\n resolvedTableGroupCount,\n tableCollapseAllHost,\n tableColumnSize,\n tableExplicitMinWidth,\n tableFlexibleColumnId,\n tableGroupIntentClass,\n tableGroupLabelColor,\n tableRows,\n type TableCollapseAllHost,\n type TableSelectionState,\n} from './table-model';\nimport type {\n TableColumn,\n TableGroup,\n TableGroupIntent,\n TableRow,\n TableSelectionMode,\n} from './table-types';\n\nexport interface TableGroupRenderModel {\n group: TableGroup;\n count: number;\n loadedCount: number;\n countLabel: string;\n intent: TableGroupIntent | undefined;\n intentClass: string | undefined;\n labelColor: ReturnType<typeof tableGroupLabelColor>;\n collapsed: boolean;\n selection: TableSelectionState | null;\n}\n\nexport interface TableRenderModel {\n grouped: boolean;\n selectable: boolean;\n loadedRows: TableRow[];\n hasData: boolean;\n selectedRowIds: ReadonlySet<string>;\n selection: TableSelectionState;\n collapsedGroupIds: ReadonlySet<string>;\n groups: TableGroupRenderModel[];\n totalColumns: number;\n allGroupsCollapsed: boolean;\n showCollapseAll: boolean;\n collapseAllHost: TableCollapseAllHost | undefined;\n flexibleColumnId: string | undefined;\n tableStyle: Record<string, string> | undefined;\n}\n\nexport interface TableRenderModelInput {\n columns: TableColumn[];\n rows: TableRow[];\n groups: TableGroup[];\n grouped: boolean;\n selectionMode: TableSelectionMode;\n selectedRowIds: string[];\n collapsedGroupIds: string[];\n}\n\n/** Create one immutable snapshot of all derived state consumed during a render. */\nexport function createTableRenderModel(input: TableRenderModelInput): TableRenderModel {\n const selectable = input.selectionMode === 'multiple';\n const loadedRows = tableRows(input.rows, input.groups, input.grouped);\n const selectedRowIds = new Set(input.selectedRowIds);\n const collapsedGroupIds = new Set(input.collapsedGroupIds);\n const allGroupsCollapsed = input.grouped && input.groups.length > 0 &&\n input.groups.every(group => collapsedGroupIds.has(group.id));\n const showCollapseAll = input.grouped && input.groups.length > 0 && !allGroupsCollapsed;\n const explicitMinWidth = tableExplicitMinWidth(input.columns);\n const flexibleColumnId = tableFlexibleColumnId(input.columns);\n const gridTracks = [\n ...(selectable ? ['var(--_table-selection-column-inline-size)'] : []),\n ...input.columns.map(column => {\n const width = tableColumnSize(column);\n if (!width) return 'minmax(0, 1fr)';\n return column.id === flexibleColumnId ? `minmax(${width}, 1fr)` : width;\n }),\n ].join(' ');\n const tableStyle: Record<string, string> = {\n '--_table-grid-template-columns': gridTracks || 'minmax(0, 1fr)',\n };\n if (explicitMinWidth != null) {\n tableStyle['--ds-table-explicit-min-inline-size'] = explicitMinWidth;\n }\n\n return {\n grouped: input.grouped,\n selectable,\n loadedRows,\n hasData: loadedRows.length > 0,\n selectedRowIds,\n selection: deriveTableSelectionState(loadedRows, input.selectedRowIds),\n collapsedGroupIds,\n groups: input.groups.map(group => {\n const count = resolvedTableGroupCount(group);\n const loadedCount = group.rows.length;\n const totalLabel = group.countLabel ?? `${count} ${count === 1 ? 'item' : 'items'}`;\n const intent = isTableGroupIntent(group.intent) ? group.intent : undefined;\n return {\n group,\n count,\n loadedCount,\n countLabel: `${loadedCount} of ${totalLabel} loaded`,\n intent,\n intentClass: tableGroupIntentClass(intent),\n labelColor: tableGroupLabelColor(intent),\n collapsed: collapsedGroupIds.has(group.id),\n selection: selectable\n ? deriveTableSelectionState(group.rows, input.selectedRowIds)\n : null,\n };\n }),\n totalColumns: input.columns.length + (selectable ? 1 : 0),\n allGroupsCollapsed,\n showCollapseAll,\n collapseAllHost: showCollapseAll ? tableCollapseAllHost(input.columns) : undefined,\n flexibleColumnId,\n tableStyle,\n };\n}\n","export interface TableLayoutElements {\n viewport: HTMLElement | null;\n stickyHeaderTable: HTMLTableElement | null;\n collapseAllOverlay: HTMLElement | null;\n frame: HTMLElement | null;\n interactiveHead: HTMLTableSectionElement | null;\n}\n\nexport interface TableLayoutMode {\n documentStickyHeader: boolean;\n floatingCollapseAll: boolean;\n clampVerticalOverscroll: boolean;\n}\n\nexport interface TableOverflowState {\n start: boolean;\n end: boolean;\n scrollable: boolean;\n}\n\nexport interface TableLayoutControllerOptions {\n elements: () => TableLayoutElements;\n mode: () => TableLayoutMode;\n overflowChanged: (state: TableOverflowState) => void;\n verticalEdgeWheel?: (deltaY: number) => boolean;\n}\n\nexport interface TableLayoutMetricInput {\n viewportInlineSize: number;\n viewportBlockSize: number;\n scrollInlineSize: number;\n scrollBlockSize: number;\n scrollInlineOffset: number;\n collapseHeadBlockStart?: number;\n collapseFrameBlockStart?: number;\n}\n\nexport interface TableLayoutMetrics {\n visibleInlineSize: number;\n overflow: TableOverflowState;\n inlineOffset: number;\n maxInlineOffset: number;\n collapseBlockOffset: number | null;\n}\n\n/** Pure geometry resolution shared by the controller and focused tests. */\nexport function resolveTableLayoutMetrics(input: TableLayoutMetricInput): TableLayoutMetrics {\n const horizontalOverflow = input.scrollInlineSize - input.viewportInlineSize > 1;\n return {\n visibleInlineSize: input.viewportInlineSize,\n overflow: {\n start: horizontalOverflow && input.scrollInlineOffset > 1,\n end: horizontalOverflow &&\n input.scrollInlineOffset + input.viewportInlineSize < input.scrollInlineSize - 1,\n scrollable: horizontalOverflow || input.scrollBlockSize - input.viewportBlockSize > 1,\n },\n inlineOffset: input.scrollInlineOffset,\n maxInlineOffset: Math.max(0, input.scrollInlineSize - input.viewportInlineSize),\n collapseBlockOffset: input.collapseHeadBlockStart == null ||\n input.collapseFrameBlockStart == null\n ? null\n : Math.max(0, input.collapseHeadBlockStart - input.collapseFrameBlockStart),\n };\n}\n\n/**\n * Owns table viewport observation. It resolves newly rendered geometry\n * immediately so the first paint has the correct viewport-width chrome, then\n * batches observer-driven scroll and resize reads/writes into one animation frame.\n * The component remains responsible only for refs and reactive overflow state.\n */\nexport class TableLayoutController {\n private connected = false;\n private connectedViewport: HTMLElement | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private frame: number | null = null;\n private overflow: TableOverflowState | null = null;\n\n constructor(private readonly options: TableLayoutControllerOptions) {}\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n if (this.frame !== null) cancelAnimationFrame(this.frame);\n this.frame = null;\n this.connectedViewport?.removeEventListener('scroll', this.handleScroll);\n this.connectedViewport?.removeEventListener('wheel', this.handleWheel);\n this.connectedViewport = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n /** Reconcile newly rendered refs, observers, and pending geometry. */\n refresh(): void {\n if (!this.connected) return;\n const { viewport } = this.options.elements();\n const elementsChanged = viewport !== this.connectedViewport;\n if (elementsChanged) {\n this.connectedViewport?.removeEventListener('scroll', this.handleScroll);\n this.connectedViewport?.removeEventListener('wheel', this.handleWheel);\n this.resizeObserver?.disconnect();\n this.connectedViewport = viewport;\n viewport?.addEventListener('scroll', this.handleScroll, { passive: true });\n viewport?.addEventListener('wheel', this.handleWheel, { passive: false });\n\n if (typeof ResizeObserver !== 'undefined' && viewport) {\n this.resizeObserver ??= new ResizeObserver(this.schedule);\n this.resizeObserver.observe(viewport);\n }\n }\n // Resolve before componentDidRender returns so WebKit cannot paint or expose\n // one frame using the full spanning-cell width.\n this.sync();\n }\n\n private schedule = (): void => {\n if (!this.connected || this.frame !== null) return;\n this.frame = requestAnimationFrame(() => {\n this.frame = null;\n this.sync();\n });\n };\n\n private readonly handleScroll = (): void => {\n this.clampInlineOffset();\n if (this.options.mode().clampVerticalOverscroll) this.clampBlockOffset();\n this.schedule();\n };\n\n private readonly handleWheel = (event: WheelEvent): void => {\n const viewport = this.connectedViewport;\n if (!viewport) return;\n\n if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {\n const max = Math.max(0, viewport.scrollWidth - viewport.clientWidth);\n const atStart = viewport.scrollLeft <= 0 && event.deltaX < 0;\n const atEnd = viewport.scrollLeft >= max && event.deltaX > 0;\n if (atStart || atEnd) event.preventDefault();\n return;\n }\n\n if (!this.options.mode().clampVerticalOverscroll || event.deltaY === 0) return;\n const max = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n const atStart = viewport.scrollTop <= 0 && event.deltaY < 0;\n const atEnd = viewport.scrollTop >= max && event.deltaY > 0;\n if (!atStart && !atEnd) return;\n\n this.options.verticalEdgeWheel?.(event.deltaY);\n event.preventDefault();\n };\n\n private clampInlineOffset(): void {\n const viewport = this.connectedViewport;\n if (!viewport) return;\n const max = Math.max(0, viewport.scrollWidth - viewport.clientWidth);\n const clamped = Math.min(max, Math.max(0, viewport.scrollLeft));\n if (viewport.scrollLeft !== clamped) viewport.scrollLeft = clamped;\n }\n\n private clampBlockOffset(): void {\n const viewport = this.connectedViewport;\n if (!viewport) return;\n const max = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n const clamped = Math.min(max, Math.max(0, viewport.scrollTop));\n if (viewport.scrollTop !== clamped) viewport.scrollTop = clamped;\n }\n\n private sync(): void {\n const elements = this.options.elements();\n const viewport = elements.viewport;\n if (!viewport) return;\n\n // Read every layout value before writing styles or reactive state.\n const mode = this.options.mode();\n const measureCollapse = mode.floatingCollapseAll && !mode.documentStickyHeader &&\n elements.collapseAllOverlay && elements.frame && elements.interactiveHead;\n const metrics = resolveTableLayoutMetrics({\n viewportInlineSize: viewport.clientWidth,\n viewportBlockSize: viewport.clientHeight,\n scrollInlineSize: viewport.scrollWidth,\n scrollBlockSize: viewport.scrollHeight,\n scrollInlineOffset: viewport.scrollLeft,\n collapseHeadBlockStart: measureCollapse\n ? elements.interactiveHead!.getBoundingClientRect().top\n : undefined,\n collapseFrameBlockStart: measureCollapse\n ? elements.frame!.getBoundingClientRect().top\n : undefined,\n });\n\n this.setProperty(\n viewport,\n '--ds-table-visible-inline-size',\n `${metrics.visibleInlineSize}px`,\n );\n if (elements.stickyHeaderTable) {\n this.setProperty(\n elements.stickyHeaderTable,\n '--ds-table-inline-scroll-offset',\n `${metrics.inlineOffset}px`,\n );\n this.setProperty(\n elements.stickyHeaderTable,\n '--ds-table-inline-scroll-max-offset',\n `${metrics.maxInlineOffset}px`,\n );\n }\n if (metrics.collapseBlockOffset !== null && elements.collapseAllOverlay) {\n this.setProperty(\n elements.collapseAllOverlay,\n '--ds-table-collapse-all-block-offset',\n `${metrics.collapseBlockOffset}px`,\n );\n }\n\n if (\n !this.overflow ||\n this.overflow.start !== metrics.overflow.start ||\n this.overflow.end !== metrics.overflow.end ||\n this.overflow.scrollable !== metrics.overflow.scrollable\n ) {\n this.overflow = metrics.overflow;\n this.options.overflowChanged(metrics.overflow);\n }\n }\n\n private setProperty(element: HTMLElement, property: string, value: string): void {\n if (element.style.getPropertyValue(property) !== value) {\n element.style.setProperty(property, value);\n }\n }\n}\n","import type {\n TableLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\n\nexport interface TableLoadControllerState {\n lazyLoading: boolean;\n loadMoreMode: TableLoadMoreMode;\n hasMore: boolean;\n loadingMore: boolean;\n loadMoreError: string | undefined;\n loadIdentity: string | number;\n loadMoreThreshold: number;\n containedScroll: boolean;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n loadedRowCount: number;\n viewport: HTMLElement | null;\n sentinel: HTMLElement | null;\n}\n\nexport interface TableLoadControllerOptions {\n state: () => TableLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableLoadMoreDetail) => void;\n}\n\n/** Owns incremental-loading request guards, announcements, and observation. */\nexport class TableLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private intersectionObserver: IntersectionObserver | null = null;\n private observedSentinel: HTMLElement | null = null;\n private requestPending = false;\n private requestedRowCount = 0;\n private previousLoadedRowCount = 0;\n\n constructor(private readonly options: TableLoadControllerOptions) {}\n\n initialize(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n state.loadMoreMode !== 'auto' ||\n !state.hasMore ||\n !!state.loadMoreError?.trim() ||\n !this.intersectionSupported ||\n !state.viewport ||\n !state.sentinel\n ) {\n this.disconnectObserver();\n return;\n }\n\n if (this.intersectionObserver && this.observedSentinel === state.sentinel) return;\n this.disconnectObserver();\n const threshold = Number.isFinite(state.loadMoreThreshold)\n ? Math.max(0, state.loadMoreThreshold)\n : 0;\n this.intersectionObserver = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) this.request('auto');\n },\n {\n root: state.containedScroll ? state.viewport : null,\n rootMargin: `0px 0px ${threshold}px 0px`,\n },\n );\n this.observedSentinel = state.sentinel;\n this.intersectionObserver.observe(state.sentinel);\n }\n\n structureChanged(): void {\n this.resetRequest();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextCount = state.loadedRowCount;\n if (!state.lazyLoading) {\n this.previousLoadedRowCount = nextCount;\n this.resetRequest();\n return;\n }\n if (nextCount > this.previousLoadedRowCount) {\n const added = nextCount - this.previousLoadedRowCount;\n this.options.announce(\n state.rowsLoadedLabel\n .replace('{count}', String(added))\n .replace('{total}', String(nextCount)),\n );\n }\n if (nextCount > this.requestedRowCount) this.requestPending = false;\n this.previousLoadedRowCount = nextCount;\n this.disconnectObserver();\n }\n\n identityChanged(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n this.resetRequest();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n loadingChanged(loading: boolean): void {\n const state = this.options.state();\n if (!state.lazyLoading) {\n this.resetRequest();\n return;\n }\n if (loading) {\n this.requestPending = true;\n this.options.announce(state.loadingMoreLabel);\n } else if (state.loadMoreMode === 'manual') {\n // A completed manual request may append no rows; permit another explicit activation.\n this.requestPending = false;\n }\n this.disconnectObserver();\n }\n\n errorChanged(error: string | undefined): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (error?.trim()) {\n this.requestPending = false;\n this.options.announce(error);\n }\n this.disconnectObserver();\n }\n\n hasMoreChanged(hasMore: boolean, hadMore: boolean): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (!hasMore) {\n this.requestPending = false;\n if (hadMore) this.options.announce(this.options.state().endOfResultsLabel);\n }\n this.disconnectObserver();\n }\n\n request(reason: TableLoadMoreReason): void {\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n !state.hasMore ||\n state.loadingMore ||\n (reason !== 'retry' && !!state.loadMoreError?.trim()) ||\n this.requestPending\n ) return;\n\n this.requestPending = true;\n this.requestedRowCount = state.loadedRowCount;\n this.options.announce(state.loadingMoreLabel);\n this.options.request({\n reason,\n loadIdentity: state.loadIdentity,\n loadedRowCount: this.requestedRowCount,\n });\n }\n\n private resetRequest(): void {\n this.requestPending = false;\n this.requestedRowCount = this.options.state().loadedRowCount;\n this.disconnectObserver();\n }\n\n private disconnectObserver(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n this.observedSentinel = null;\n }\n}\n","import type {\n TableGroup,\n TableGroupLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\n\nexport interface TableGroupLoadControllerState {\n enabled: boolean;\n loadMoreMode: TableLoadMoreMode;\n loadMoreThreshold: number;\n containedScroll: boolean;\n groups: TableGroup[];\n viewport: HTMLElement | null;\n sentinels: ReadonlyMap<string, HTMLElement>;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n}\n\nexport interface TableGroupLoadControllerOptions {\n state: () => TableGroupLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableGroupLoadMoreDetail) => void;\n}\n\ninterface GroupSnapshot {\n count: number;\n hasMore: boolean;\n loading: boolean;\n error: string;\n identity: string | number;\n}\n\nfunction groupIdentity(group: TableGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: TableGroup, count?: number): string {\n return template\n .split('{group}').join(group.label)\n .split('{count}').join(String(count ?? group.rows.length))\n .split('{loaded}').join(String(group.rows.length))\n .split('{total}').join(String(group.totalCount ?? group.rows.length));\n}\n\n/** Owns request guards, announcements, and observation for independently loaded groups. */\nexport class TableGroupLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private intersectionObserver: IntersectionObserver | null = null;\n private snapshots = new Map<string, GroupSnapshot>();\n private pending = new Map<string, { identity: string | number; count: number }>();\n\n constructor(private readonly options: TableGroupLoadControllerOptions) {}\n\n initialize(): void {\n this.snapshots = this.createSnapshots();\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.enabled ||\n state.loadMoreMode !== 'auto' ||\n !this.intersectionSupported ||\n !state.viewport\n ) {\n this.disconnectObserver();\n return;\n }\n\n this.disconnectObserver();\n const threshold = Number.isFinite(state.loadMoreThreshold)\n ? Math.max(0, state.loadMoreThreshold)\n : 0;\n this.intersectionObserver = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n const groupId = (entry.target as HTMLElement).dataset.groupId;\n if (groupId) this.request(groupId, 'auto');\n }\n },\n {\n root: state.containedScroll ? state.viewport : null,\n rootMargin: `0px 0px ${threshold}px 0px`,\n },\n );\n\n for (const [groupId, sentinel] of state.sentinels) {\n const group = state.groups.find(item => item.id === groupId);\n if (!group?.hasMore || group.loadingMore || group.loadMoreError?.trim()) continue;\n this.intersectionObserver.observe(sentinel);\n }\n }\n\n structureChanged(): void {\n this.pending.clear();\n this.snapshots = this.createSnapshots();\n this.disconnectObserver();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextSnapshots = new Map<string, GroupSnapshot>();\n\n for (const group of state.groups) {\n const next = this.snapshot(group);\n const previous = this.snapshots.get(group.id);\n const pending = this.pending.get(group.id);\n\n if (!previous || previous.identity !== next.identity) {\n this.pending.delete(group.id);\n } else {\n if (next.count > previous.count) {\n this.options.announce(\n formatGroupLabel(state.rowsLoadedLabel, group, next.count - previous.count),\n );\n }\n if (!previous.error && next.error) {\n this.pending.delete(group.id);\n this.options.announce(next.error);\n }\n if (previous.hasMore && !next.hasMore) {\n this.pending.delete(group.id);\n this.options.announce(formatGroupLabel(state.endOfResultsLabel, group));\n }\n if (pending && next.count > pending.count) this.pending.delete(group.id);\n if (pending && previous.loading && !next.loading && next.count === pending.count) {\n this.pending.delete(group.id);\n }\n }\n\n nextSnapshots.set(group.id, next);\n }\n\n this.snapshots = nextSnapshots;\n for (const groupId of this.pending.keys()) {\n if (!nextSnapshots.has(groupId)) this.pending.delete(groupId);\n }\n this.disconnectObserver();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n request(groupId: string, reason: TableLoadMoreReason): void {\n const state = this.options.state();\n const group = state.groups.find(item => item.id === groupId);\n if (\n !state.enabled ||\n !group?.hasMore ||\n group.loadingMore ||\n (reason !== 'retry' && !!group.loadMoreError?.trim()) ||\n this.pending.has(groupId)\n ) return;\n\n const identity = groupIdentity(group);\n this.pending.set(groupId, { identity, count: group.rows.length });\n this.options.announce(formatGroupLabel(state.loadingMoreLabel, group));\n this.options.request({\n groupId,\n reason,\n loadIdentity: identity,\n loadedRowCount: group.rows.length,\n });\n }\n\n private createSnapshots(): Map<string, GroupSnapshot> {\n return new Map(this.options.state().groups.map(group => [group.id, this.snapshot(group)]));\n }\n\n private snapshot(group: TableGroup): GroupSnapshot {\n return {\n count: group.rows.length,\n hasMore: !!group.hasMore,\n loading: !!group.loadingMore,\n error: group.loadMoreError?.trim() ?? '',\n identity: groupIdentity(group),\n };\n }\n\n private disconnectObserver(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n }\n}\n","export interface TableFitPageSizeInput {\n viewportBlockSize: number;\n headerBlockSize: number;\n itemBlockSize: number;\n}\n\n/** Resolve how many complete top-level rows or group headers fit below the column header. */\nexport function resolveTableFitPageSize(input: TableFitPageSizeInput): number | undefined {\n if (\n !Number.isFinite(input.viewportBlockSize) ||\n !Number.isFinite(input.headerBlockSize) ||\n !Number.isFinite(input.itemBlockSize) ||\n input.viewportBlockSize <= 0 ||\n input.itemBlockSize <= 0\n ) {\n return undefined;\n }\n const availableBlockSize = Math.max(0, input.viewportBlockSize - input.headerBlockSize);\n return Math.max(1, Math.floor((availableBlockSize + 0.5) / input.itemBlockSize));\n}\n","import { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\n\nexport interface TableViewportFitMetricInput {\n scrollportBlockStart: number;\n scrollportBlockSize: number;\n hostBlockStart: number;\n insetBlockStart: number;\n insetBlockEnd: number;\n}\n\nexport interface TableViewportFitMetrics {\n reservedBlockSize: number;\n currentBlockSize: number;\n settled: boolean;\n}\n\nexport interface TableViewportFitElements {\n host: HTMLElement | null;\n surface: HTMLElement | null;\n}\n\nexport interface TableViewportFitControllerOptions {\n enabled: () => boolean;\n elements: () => TableViewportFitElements;\n insets: () => { blockStart: string | number; blockEnd: string | number };\n fitChanged: (metrics: TableViewportFitMetrics | null) => void;\n}\n\n/** Resolve the reserved compact-state height and the height currently visible. */\nexport function resolveTableViewportFitMetrics(\n input: TableViewportFitMetricInput,\n): TableViewportFitMetrics {\n const insetBlockStart = Math.max(0, input.insetBlockStart);\n const insetBlockEnd = Math.max(0, input.insetBlockEnd);\n const scrollportBlockEnd = input.scrollportBlockStart + input.scrollportBlockSize;\n const settledBlockStart = input.scrollportBlockStart + insetBlockStart;\n const reservedBlockSize = Math.max(\n 0,\n input.scrollportBlockSize - insetBlockStart - insetBlockEnd,\n );\n const currentBlockStart = Math.max(input.hostBlockStart, settledBlockStart);\n const currentBlockSize = Math.min(\n reservedBlockSize,\n Math.max(0, scrollportBlockEnd - insetBlockEnd - currentBlockStart),\n );\n\n return {\n reservedBlockSize,\n currentBlockSize,\n settled: input.hostBlockStart <= settledBlockStart + 0.5,\n };\n}\n\n/**\n * Fits the complete table chrome to its nearest vertical scrollport. The host\n * reserves its compact-state height so the outer page can consume collapsing\n * header travel without changing document height. The visible table surface\n * grows into that reservation until it reaches the supplied sticky inset.\n */\nexport class TableViewportFitController {\n private connected = false;\n private scrollRoot: HTMLElement | Window | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private metrics: TableViewportFitMetrics | null = null;\n\n constructor(private readonly options: TableViewportFitControllerOptions) {}\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectRuntime();\n this.clearGeometry();\n }\n\n refresh(): void {\n if (!this.connected) return;\n if (!this.options.enabled()) {\n this.disconnectRuntime();\n this.clearGeometry();\n return;\n }\n\n const host = this.options.elements().host;\n if (!host) return;\n const nextScrollRoot = this.findScrollRoot(host);\n if (nextScrollRoot !== this.scrollRoot) {\n this.disconnectRuntime();\n this.scrollRoot = nextScrollRoot;\n this.scrollRoot.addEventListener('scroll', this.sync, { passive: true });\n window.addEventListener('resize', this.sync, { passive: true });\n if (typeof ResizeObserver !== 'undefined' && this.scrollRoot instanceof HTMLElement) {\n this.resizeObserver = new ResizeObserver(this.sync);\n this.resizeObserver.observe(this.scrollRoot);\n }\n }\n this.sync();\n }\n\n /** Pass a fitted table's boundary wheel delta to its owning page scrollport. */\n scrollOuterBy(delta: number): boolean {\n if (!this.scrollRoot || delta === 0) return false;\n if (this.scrollRoot instanceof HTMLElement) {\n const previous = this.scrollRoot.scrollTop;\n const max = Math.max(0, this.scrollRoot.scrollHeight - this.scrollRoot.clientHeight);\n this.scrollRoot.scrollTop = Math.min(max, Math.max(0, previous + delta));\n return this.scrollRoot.scrollTop !== previous;\n }\n\n const scrollingElement = document.scrollingElement;\n const previous = window.scrollY;\n const max = Math.max(\n 0,\n (scrollingElement?.scrollHeight ?? document.documentElement.scrollHeight) -\n window.innerHeight,\n );\n const next = Math.min(max, Math.max(0, previous + delta));\n if (next !== previous) window.scrollTo({ top: next, behavior: 'auto' });\n return next !== previous;\n }\n\n private disconnectRuntime(): void {\n this.scrollRoot?.removeEventListener('scroll', this.sync);\n window.removeEventListener('resize', this.sync);\n this.scrollRoot = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n private clearGeometry(): void {\n const { host, surface } = this.options.elements();\n host?.style.removeProperty('--_table-viewport-fit-reserved-block-size');\n surface?.style.removeProperty('--_table-viewport-fit-current-block-size');\n if (this.metrics !== null) {\n this.metrics = null;\n this.options.fitChanged(null);\n }\n }\n\n private readonly sync = (): void => {\n if (!this.connected || !this.options.enabled() || !this.scrollRoot) return;\n const { host, surface } = this.options.elements();\n if (!host || !surface) return;\n\n const hostRect = host.getBoundingClientRect();\n const scrollportRect = this.scrollRoot instanceof HTMLElement\n ? this.scrollRoot.getBoundingClientRect()\n : { top: 0, height: window.innerHeight };\n const insets = this.options.insets();\n const next = resolveTableViewportFitMetrics({\n scrollportBlockStart: scrollportRect.top,\n scrollportBlockSize: scrollportRect.height,\n hostBlockStart: hostRect.top,\n insetBlockStart: resolveCssLengthPx(insets.blockStart, 0, host),\n insetBlockEnd: resolveCssLengthPx(insets.blockEnd, 0, host),\n });\n\n this.setProperty(\n host,\n '--_table-viewport-fit-reserved-block-size',\n `${next.reservedBlockSize}px`,\n );\n this.setProperty(\n surface,\n '--_table-viewport-fit-current-block-size',\n `${next.currentBlockSize}px`,\n );\n if (\n !this.metrics ||\n this.metrics.reservedBlockSize !== next.reservedBlockSize ||\n this.metrics.currentBlockSize !== next.currentBlockSize ||\n this.metrics.settled !== next.settled\n ) {\n this.metrics = next;\n this.options.fitChanged(next);\n }\n };\n\n private findScrollRoot(host: HTMLElement): HTMLElement | Window {\n let ancestor = this.composedParent(host);\n while (ancestor && ancestor !== document.documentElement) {\n const overflow = getComputedStyle(ancestor).overflowY;\n if (overflow === 'auto' || overflow === 'scroll' || overflow === 'overlay') {\n return ancestor as HTMLElement;\n }\n ancestor = this.composedParent(ancestor);\n }\n return window;\n }\n\n private composedParent(element: Element): Element | null {\n return (element as HTMLElement).assignedSlot?.parentElement ?? element.parentElement;\n }\n\n private setProperty(element: HTMLElement, property: string, value: string): void {\n if (element.style.getPropertyValue(property) !== value) {\n element.style.setProperty(property, value);\n }\n }\n}\n","@import './forced-colors.css';\n\n:host {\n --ds-focus-ring-width: var(--dimension-stroke-width-025, 2px);\n --ds-focus-ring-offset: var(--dimension-space-025, 2px);\n --ds-focus-ring-color: var(--color-interaction-focus);\n}\n\n:host(.ds-focus-ring),\n.ds-focus-ring,\n:host(.ds-focus-ring-inset),\n.ds-focus-ring-inset {\n outline: none;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n}\n\n:host(.ds-focus-ring:focus-visible),\n.ds-focus-ring:focus-visible {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: var(--ds-focus-ring-offset);\n}\n\n:host(.ds-focus-ring.ds-focus-ring--visible),\n.ds-focus-ring.ds-focus-ring--visible {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: var(--ds-focus-ring-offset);\n}\n\n:host(.ds-focus-ring-inset:focus-visible),\n.ds-focus-ring-inset:focus-visible {\n outline: none;\n}\n\n:host(.ds-focus-ring-inset:focus-visible)::after,\n.ds-focus-ring-inset:focus-visible::after {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: calc(-1 * var(--ds-focus-ring-width));\n}\n\n:host(.ds-focus-ring-inset.ds-focus-ring--visible),\n.ds-focus-ring-inset.ds-focus-ring--visible {\n outline: none;\n}\n\n:host(.ds-focus-ring-inset.ds-focus-ring--visible)::after,\n.ds-focus-ring-inset.ds-focus-ring--visible::after {\n outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);\n outline-offset: calc(-1 * var(--ds-focus-ring-width));\n}\n\n@media (forced-colors: active) {\n :host {\n --ds-focus-ring-color: var(--ds-forced-color-selected);\n }\n}\n","@import './forced-colors.css';\n\n/**\n * Interaction fill — selected (`::before`) + hover/press (`::after`) overlays.\n *\n * Paint translucent interaction tokens *over* the control’s own background —\n * never by swapping `background-color` on `:hover` / `:active`, and never via\n * `color-mix(bg, fg)` for control chrome.\n *\n * Paint order (bottom → top):\n * 1. Element background (intent / surface)\n * 2. `::before` — selected / active (opt-in via `.ds-interaction-fill--selected`)\n * 3. Label / icon / badge content (`.ds-interaction-fill__content` or z-index: 2)\n * 4. `::after` — hover / press wash + optional inset border + inset focus ring\n *\n * Apply `.ds-interaction-fill` on the interactive element (host or inner row).\n * Omit `.ds-interaction-fill--selected` when chrome wants icon-color-only\n * selection (`activeFill={false}` on unfilled icon buttons).\n *\n * Fills use positive z-index so they paint *above* an opaque host background\n * (Chip, ButtonFilled). Content sits under the hover wash so badge dots are\n * covered; raise label/icon with `.ds-interaction-fill__content` (z-index: 2)\n * — never above `::after` (z-index: 3).\n *\n * Inset borders must paint on `::after` (not the element’s own `box-shadow`)\n * so the stroke stays visible above selected / hover washes. Set\n * `--ds-interaction-border-*` or use `.ds-interaction-fill--bordered`.\n * Do not use a layout `border` on interaction targets.\n *\n * If the control uses `all: unset`, re-assert `position: relative; z-index: 0`\n * after the unset so this util’s stacking context still applies.\n *\n * Surface helpers remap tokens + `--ds-focus-ring-color`:\n * `.ds-interaction-fill--on-faint|medium|bold|strong|translucent|inverted|media|always-dark|navigation`\n *\n * Override hooks: `--ds-interaction-hover`, `--ds-interaction-pressed`,\n * `--ds-interaction-active`, `--ds-interaction-border-color`,\n * `--ds-interaction-border-width`, `--ds-interaction-divider-color`, and\n * `--ds-interaction-divider-width`, plus the corresponding inline-start/end\n * divider hooks.\n *\n * @see AGENTS.md — \"Interaction fill\"\n */\n\n:host(.ds-interaction-fill),\n.ds-interaction-fill {\n position: var(--ds-interaction-position, relative);\n z-index: var(--ds-interaction-z-index, 0);\n cursor: default;\n --ds-interaction-hover: var(--color-interaction-hover);\n --ds-interaction-pressed: var(--color-interaction-pressed);\n --ds-interaction-active: var(--color-interaction-active-brand);\n /* Inset stroke on ::after — default off (transparent / zero width). */\n --ds-interaction-border-width: 0px;\n --ds-interaction-border-color: transparent;\n --ds-interaction-divider-width: 0px;\n --ds-interaction-divider-color: transparent;\n --ds-interaction-divider-inline-start-width: 0px;\n --ds-interaction-divider-inline-start-color: transparent;\n --ds-interaction-divider-inline-end-width: 0px;\n --ds-interaction-divider-inline-end-color: transparent;\n}\n\n:host(.ds-interaction-fill)::before,\n.ds-interaction-fill::before,\n:host(.ds-interaction-fill)::after,\n.ds-interaction-fill::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: transparent;\n pointer-events: none;\n cursor: inherit;\n transition: none;\n}\n\n/* Layer stack (bottom → top): selected → content → hover/press + border (topmost). */\n:host(.ds-interaction-fill)::before,\n.ds-interaction-fill::before {\n z-index: 1;\n}\n\n:host(.ds-interaction-fill)::after,\n.ds-interaction-fill::after {\n z-index: 3;\n /* Border above selected (::before) and this pseudo’s own hover wash. */\n box-shadow:\n inset 0 calc(-1 * var(--ds-interaction-divider-width)) 0 var(--ds-interaction-divider-color),\n inset var(--ds-interaction-divider-inline-start-width) 0 0\n var(--ds-interaction-divider-inline-start-color),\n inset calc(-1 * var(--ds-interaction-divider-inline-end-width)) 0 0\n var(--ds-interaction-divider-inline-end-color),\n inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Opt-in secondary inset border (override color via `--ds-interaction-border-color`). */\n:host(.ds-interaction-fill--bordered),\n.ds-interaction-fill--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--color-border-secondary);\n}\n\n:host(.ds-interaction-fill--selected)::before,\n.ds-interaction-fill--selected::before {\n background: var(--ds-interaction-active);\n}\n\n/*\n * Notification-dot halo: when selected fill is on, set `--ds-interaction-dot-ring`\n * to the active wash so rings can match. Prefer also remapping the consumer’s\n * surface ring token (e.g. `--ds-button-unfilled-dot-ring`) or passing\n * `background=\"var(--ds-interaction-active)\"` from the parent when selected —\n * custom-property fallbacks through nested scoped hosts are easy to miss.\n * Omit `--selected` (chrome `activeFill={false}`) to keep the surface ring.\n */\n:host(.ds-interaction-fill--selected),\n.ds-interaction-fill--selected {\n --ds-interaction-dot-ring: var(--ds-interaction-active);\n}\n\n/*\n * Touch browsers can latch :hover after a tap. Only hover-capable fine\n * pointers receive the hover wash; touch still receives :active press feedback.\n */\n@media (hover: hover) and (pointer: fine) {\n :host(.ds-interaction-fill:hover:not(:disabled))::after,\n .ds-interaction-fill:hover:not(:disabled)::after {\n background: var(--ds-interaction-hover);\n }\n}\n\n:host(.ds-interaction-fill:active:not(:disabled))::after,\n.ds-interaction-fill:active:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* A parent row/list may coordinate one fill across several sibling targets. */\n:host(.ds-interaction-fill--grouped)::after,\n.ds-interaction-fill--grouped::after,\n:host(.ds-interaction-fill--grouped:active:not(:disabled))::after,\n.ds-interaction-fill--grouped:active:not(:disabled)::after {\n background: var(--ds-interaction-group-fill, transparent);\n}\n\n@media (hover: hover) and (pointer: fine) {\n :host(.ds-interaction-fill--grouped:hover:not(:disabled))::after,\n .ds-interaction-fill--grouped:hover:not(:disabled)::after {\n background: var(--ds-interaction-group-fill, transparent);\n }\n}\n\n:host(.ds-interaction-fill--grouped),\n.ds-interaction-fill--grouped {\n --ds-interaction-divider-width: var(--ds-interaction-group-divider-width, 0px);\n --ds-interaction-divider-color: var(--ds-interaction-group-divider-color, transparent);\n --ds-interaction-divider-inline-start-width: var(\n --ds-interaction-group-divider-inline-start-width,\n 0px\n );\n --ds-interaction-divider-inline-start-color: var(\n --ds-interaction-group-divider-inline-start-color,\n transparent\n );\n --ds-interaction-divider-inline-end-width: var(\n --ds-interaction-group-divider-inline-end-width,\n 0px\n );\n --ds-interaction-divider-inline-end-color: var(\n --ds-interaction-group-divider-inline-end-color,\n transparent\n );\n}\n\n/* Content under the hover wash (so badge dots are covered by ::after). */\n:host(.ds-interaction-fill) > .ds-interaction-fill__content,\n.ds-interaction-fill > .ds-interaction-fill__content,\n.ds-interaction-fill__content {\n position: relative;\n z-index: 2;\n cursor: inherit;\n}\n\n/* ── Surface context ─────────────────────────────────────────────────────── */\n\n:host(.ds-interaction-fill--on-faint),\n.ds-interaction-fill--on-faint {\n --ds-interaction-active: var(--color-interaction-active);\n}\n\n:host(.ds-interaction-fill--on-medium),\n.ds-interaction-fill--on-medium {\n --ds-interaction-hover: var(--color-interaction-on-medium-background-hover);\n --ds-interaction-pressed: var(--color-interaction-on-medium-background-pressed);\n --ds-interaction-active: var(--color-interaction-on-medium-background-active);\n --ds-focus-ring-color: var(--color-interaction-on-medium-background-focus);\n}\n\n:host(.ds-interaction-fill--on-bold),\n.ds-interaction-fill--on-bold {\n --ds-interaction-hover: var(--color-interaction-on-bold-background-hover);\n --ds-interaction-pressed: var(--color-interaction-on-bold-background-pressed);\n --ds-interaction-active: var(--color-interaction-on-bold-background-active);\n --ds-focus-ring-color: var(--color-interaction-on-bold-background-focus);\n}\n\n:host(.ds-interaction-fill--on-strong),\n.ds-interaction-fill--on-strong {\n --ds-interaction-hover: var(--color-interaction-on-strong-background-hover);\n --ds-interaction-pressed: var(--color-interaction-on-strong-background-pressed);\n --ds-interaction-active: var(--color-interaction-on-strong-background-active);\n --ds-focus-ring-color: var(--color-interaction-on-strong-background-focus);\n}\n\n:host(.ds-interaction-fill--on-translucent),\n.ds-interaction-fill--on-translucent {\n --ds-interaction-hover: var(--color-translucent-interaction-hover);\n --ds-interaction-pressed: var(--color-translucent-interaction-pressed);\n --ds-interaction-active: var(--color-translucent-interaction-active-brand);\n --ds-focus-ring-color: var(--color-translucent-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-inverted),\n.ds-interaction-fill--on-inverted {\n --ds-interaction-hover: var(--color-inverted-interaction-hover);\n --ds-interaction-pressed: var(--color-inverted-interaction-pressed);\n --ds-interaction-active: var(--color-inverted-interaction-active-brand);\n --ds-focus-ring-color: var(--color-inverted-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-media),\n.ds-interaction-fill--on-media {\n --ds-interaction-hover: var(--color-media-interaction-hover);\n --ds-interaction-pressed: var(--color-media-interaction-pressed);\n --ds-interaction-active: var(--color-media-interaction-active);\n --ds-focus-ring-color: var(--color-media-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-always-dark),\n.ds-interaction-fill--on-always-dark {\n --ds-interaction-hover: var(--color-always-dark-interaction-hover);\n --ds-interaction-pressed: var(--color-always-dark-interaction-pressed);\n --ds-interaction-active: var(--color-always-dark-interaction-active-brand);\n --ds-focus-ring-color: var(--color-always-dark-interaction-focus);\n}\n\n:host(.ds-interaction-fill--on-navigation),\n.ds-interaction-fill--on-navigation {\n --ds-interaction-hover: var(--color-navigation-interaction-hover);\n --ds-interaction-pressed: var(--color-navigation-interaction-pressed);\n --ds-interaction-active: var(--color-navigation-interaction-active);\n --ds-focus-ring-color: var(--color-navigation-interaction-focus);\n}\n\n@media (forced-colors: active) {\n /*\n * Forced-colors removes box-shadows and remaps translucent fills. Restore\n * boundaries with outlines and make selection a non-color-only inset ring.\n * Focus-ring selectors remain more specific and replace this outline while\n * keyboard focus is visible.\n */\n :host(.ds-interaction-fill)::after,\n .ds-interaction-fill::after {\n box-shadow: none;\n outline:\n var(--ds-interaction-border-width) solid\n var(--ds-forced-color-control-boundary);\n outline-offset: calc(-1 * var(--ds-interaction-border-width));\n }\n\n :host(.ds-interaction-fill--selected)::before,\n .ds-interaction-fill--selected::before {\n background: transparent;\n outline: var(--dimension-stroke-width-025) solid var(--ds-forced-color-selected);\n outline-offset: calc(-1 * var(--dimension-stroke-width-025));\n }\n}\n\n@media (forced-colors: active) and (hover: hover) and (pointer: fine) {\n :host(.ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible))::after,\n .ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible)::after {\n outline-color: var(--ds-forced-color-selected);\n outline-width: var(--dimension-stroke-width-012);\n }\n}\n","@import '../../styles/table.css';\n@import '../../styles/control-elevation.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/control-density.css';\n@import '../../utils/text-decoration.css';\n\n:host {\n display: block;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n}\n\n:host(.table-host--bounded) {\n min-block-size: 0;\n}\n\n:host(.table-host--fixed-height) {\n block-size: var(--_table-fixed-block-size);\n}\n\n:host(.table-host--viewport-fit) {\n block-size: var(--_table-viewport-fit-reserved-block-size, auto);\n min-block-size: var(--_table-viewport-fit-reserved-block-size, auto);\n}\n\n/*\n * The public table recipe stays at zero specificity for product-owned native\n * markup. Inside the component, these classes sit on ds-text hosts whose reset\n * intentionally owns display, padding, and border with higher specificity.\n * Reassert only those collided properties so component geometry cannot depend\n * on whether ds-text or ds-table happens to hydrate first.\n */\nds-text.ds-table__header-label-box {\n padding-inline: var(--dimension-space-025);\n}\n\nds-text.ds-table__cell-track {\n display: flex;\n}\n\nds-text.ds-table__cell-track--text {\n padding-inline: var(--_table-cell-track-padding-inline);\n}\n\nds-text.ds-table__cell-primary,\n.ds-table__cell--empty ds-text.ds-table__cell-track {\n padding-block: var(--dimension-space-025);\n}\n\nds-text.ds-table__cell-secondary,\nds-text.ds-table__cell-tertiary {\n padding-block: var(--dimension-space-025);\n}\n\n.ds-table__cell--primary-text ds-text.ds-table__cell-secondary {\n padding-block: 0;\n}\n\nds-text.ds-table__cell-run,\nds-text.ds-table__cell-run-separator {\n display: flex;\n}\n\n.ds-table__cell-tag-stack--tag-with-text ds-text.ds-table__cell-tag-text {\n padding-inline: var(--_table-cell-track-padding-inline);\n padding-block: var(--dimension-space-025);\n}\n\n.ds-table__cell-tag-stack--text-with-tag ds-text.ds-table__cell-tag-text {\n padding-inline: var(--_table-cell-track-padding-inline);\n padding-block: var(--dimension-space-025);\n}\n\nds-text.ds-table__load-content {\n display: inline-flex;\n}\n\nds-text.ds-table__bar-text {\n display: inline-flex;\n width: auto;\n max-width: 100%;\n padding-inline: var(--ds-control-label-inset, var(--dimension-space-025));\n}\n\nds-text.ds-table__footer-summary {\n margin-inline-start: auto;\n}\n\n.ds-table__bar-trailing ds-pagination {\n max-inline-size: 100%;\n}\n\n.ds-table__bar-status slot::slotted(*) {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n}\n\nds-skeleton.ds-table__skeleton-image-shape {\n display: flex;\n width: 100%;\n height: 100%;\n --ds-control-height: 100%;\n}\n\nds-skeleton.ds-table__skeleton-checkbox {\n --ds-control-height: var(--dimension-iconography-sm);\n}\n\n.ds-table__skeleton-checkbox-canvas {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--dimension-size-300);\n block-size: var(--dimension-size-300);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n deriveTableSelectionState,\n formatTableResultSummary,\n nextTableSortState,\n tableColumnSize,\n tableModelIssues,\n tableRows,\n tableRowSelectionLabel,\n toggleAllLoadedTableRows,\n toggleTableGroupCollapsed,\n toggleTableGroupSelection,\n nextTableGroupsCollapsed,\n toggleTableRowSelection,\n} from './table-model';\nimport {\n resolveTableCellImageTracks,\n resolveTableCellPresentation,\n tableCellImageVariant,\n type TableCellPresentation,\n} from './table-cell-model';\nimport {\n createTableRenderModel,\n type TableRenderModel,\n} from './table-render-model';\nimport { TableLayoutController } from './table-layout-controller';\nimport { TableLoadController } from './table-load-controller';\nimport { TableGroupLoadController } from './table-group-load-controller';\nimport type { PaginationChangeDetail } from '../Pagination/pagination-types';\nimport { resolvePaginationState } from '../Pagination/pagination-model';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport { resolveSafeUrl } from '../../utils/safe-url';\nimport { resolveTableFitPageSize } from './table-pagination-fit';\nimport {\n TableViewportFitController,\n type TableViewportFitMetrics,\n} from './table-viewport-fit-controller';\nimport type {\n TableCaptionVisibility,\n TableCellActionDetail,\n TableCellSkeleton,\n TableCellTextRun,\n TableColumn,\n TableDataMode,\n TableGroup,\n TableGroupCollapseChangeDetail,\n TableGroupLoadMoreDetail,\n TableGroupingState,\n TableLoadMoreDetail,\n TableLoadMoreMode,\n TablePaginationState,\n TableRow,\n TableRowActivateDetail,\n TableSelectionChangeDetail,\n TableSelectionMode,\n TableSortChangeDetail,\n TableSortState,\n} from './table-types';\n\n@Component({\n tag: 'ds-table',\n styleUrls: [\n '../../utils/focus-ring.css',\n '../../utils/interaction-fill.css',\n 'Table.css',\n ],\n scoped: true,\n})\nexport class Table {\n @Element() el!: HTMLElement;\n /** Stable column definitions. Assign through JavaScript. */\n @Prop() columns: TableColumn[] = [];\n /** Ungrouped row data. Ignored while grouping is active. Assign through JavaScript. */\n @Prop() rows: TableRow[] = [];\n /** One level of application-owned grouped data. Assign through JavaScript. */\n @Prop() groups: TableGroup[] = [];\n /** Controlled grouping column. Applications supply groups in their final fixed order. */\n @Prop() grouping: TableGroupingState | null = null;\n /** Controlled member-row sort state. */\n @Prop() sort: TableSortState | null = null;\n /** Controlled collapsed group identities. Groups not listed remain expanded. */\n @Prop() collapsedGroupIds: string[] = [];\n\n /** Required accessible table name, retained as a native caption. */\n @Prop() caption!: string;\n /** Shows a matching presentational title bar above the native table frame. */\n @Prop() captionVisibility: TableCaptionVisibility = 'hidden';\n /**\n * Optional result summary footer. When both `displayedCount` and `totalCount`\n * are finite numbers, the table shows “Displaying {displayed} of {total}”.\n */\n @Prop() displayedCount: number | undefined;\n @Prop() totalCount: number | undefined;\n /** Supports {displayed} and {total} placeholders. */\n @Prop() resultSummaryLabel: string = 'Displaying {displayed} of {total}';\n @Prop() stickyHeader: boolean = false;\n /** Maximum scroll-region height. Numbers resolve to CSS pixels. */\n @Prop() maxHeight: string | number | undefined;\n /** Fixed height for the complete header, table frame, and footer composition. */\n @Prop() height: string | number | undefined;\n /** Fit the complete table composition to its nearest vertical scrollport. */\n @Prop() fitViewport: boolean = false;\n /** Reserved space above a viewport-fitted table once surrounding chrome is compact. */\n @Prop() viewportInsetBlockStart: string | number = 0;\n /** Reserved space below a viewport-fitted table. */\n @Prop() viewportInsetBlockEnd: string | number = 0;\n /** Optional explicit label for the horizontal/vertical scroll region. */\n @Prop() scrollLabel: string | undefined;\n\n @Prop() selectionMode: TableSelectionMode = 'none';\n /** Controlled selected row identities. IDs outside the loaded rows are preserved. */\n @Prop() selectedRowIds: string[] = [];\n\n /** Initial loading state. Existing rows stay visible; incremental loading uses loadingMore. */\n @Prop() loading: boolean = false;\n /** Initial-loading rows. Defaults to ten so bounded tables retain a useful filled viewport. */\n @Prop() skeletonRows: number = 10;\n @Prop() emptyHeading: string = 'No results';\n @Prop() emptyBody: string = 'No data is available.';\n /** Initial error state. Existing rows stay visible; incremental failures use loadMoreError. */\n @Prop() error: boolean = false;\n @Prop() errorHeading: string = 'Unable to load data';\n @Prop() errorBody: string = 'The data could not be loaded.';\n @Prop() emptyCellLabel: string = 'Not available';\n\n /** Top-level data-window strategy. Group member loading remains group-owned. */\n @Prop() dataMode: TableDataMode = 'infinite';\n /** Controlled top-level pagination state. Required when dataMode is pagination. */\n @Prop() pagination: TablePaginationState | null = null;\n @Prop() loadMoreMode: TableLoadMoreMode = 'auto';\n @Prop() hasMore: boolean = false;\n @Prop() loadingMore: boolean = false;\n @Prop() loadMoreError: string | undefined;\n /** Reset key for a new query/group/sort dataset. */\n @Prop() loadIdentity: string | number = 'default';\n /** IntersectionObserver root margin in CSS pixels. */\n @Prop() loadMoreThreshold: number = 0;\n @Prop() loadMoreLabel: string = 'Load more';\n @Prop() retryLabel: string = 'Retry';\n @Prop() loadingMoreLabel: string = 'Loading more items';\n @Prop() endOfResultsLabel: string = 'All results loaded';\n /** Supports {count} and {total} placeholders. */\n @Prop() rowsLoadedLabel: string = '{count} more rows loaded. {total} rows loaded.';\n @Prop() groupLoadMoreLabel: string = 'Load more';\n /** Supports the {group} placeholder. */\n @Prop() groupLoadMoreAriaLabel: string = 'Load more {group} results';\n /** Supports the {group} placeholder. */\n @Prop() groupRetryLabel: string = 'Retry loading {group} results';\n /** Supports the {group} placeholder. */\n @Prop() groupLoadingMoreLabel: string = 'Loading more items';\n /** Supports the {group} placeholder. */\n @Prop() groupEndOfResultsLabel: string = 'All {group} results loaded';\n /** Supports {group}, {count}, {loaded}, and {total} placeholders. */\n @Prop() groupRowsLoadedLabel: string = '{count} more rows loaded in {group}. {loaded} of {total} rows loaded.';\n\n @Event() dsSortChange!: EventEmitter<TableSortChangeDetail>;\n @Event() dsGroupCollapseChange!: EventEmitter<TableGroupCollapseChangeDetail>;\n @Event() dsSelectionChange!: EventEmitter<TableSelectionChangeDetail>;\n @Event() dsLoadMore!: EventEmitter<TableLoadMoreDetail>;\n @Event() dsGroupLoadMore!: EventEmitter<TableGroupLoadMoreDetail>;\n @Event() dsPaginationChange!: EventEmitter<PaginationChangeDetail>;\n @Event() dsCellAction!: EventEmitter<TableCellActionDetail>;\n @Event() dsRowActivate!: EventEmitter<TableRowActivateDetail>;\n\n @State() private overflowStart = false;\n @State() private overflowEnd = false;\n @State() private scrollable = false;\n @State() private announcement = '';\n @State() private activeStickyGroupId: string | null = null;\n @State() private viewportFitSettled = false;\n @State() private headerPresent = false;\n @State() private fitPageSize: number | undefined;\n\n private rootEl: HTMLElement | null = null;\n private viewportEl: HTMLElement | null = null;\n private frameEl: HTMLElement | null = null;\n private interactiveHeadEl: HTMLTableSectionElement | null = null;\n private collapseAllOverlayEl: HTMLElement | null = null;\n private stickyHeaderTableEl: HTMLTableElement | null = null;\n private tableEl: HTMLTableElement | null = null;\n private sentinelEl: HTMLElement | null = null;\n private incrementalWindowActive = false;\n private readonly groupSentinelEls = new Map<string, HTMLElement>();\n private previousModelWarning = '';\n private hasLoaded = false;\n private renderedModel: TableRenderModel | null = null;\n private stickyGroupConnected = false;\n private headerSlotObserver: MutationObserver | null = null;\n private fitResizeObserver: ResizeObserver | null = null;\n private fitObservedViewport: HTMLElement | null = null;\n private fitObservedTable: HTMLTableElement | null = null;\n private fitMeasurementPending = false;\n private readonly layoutController = new TableLayoutController({\n elements: () => ({\n viewport: this.viewportEl,\n stickyHeaderTable: this.stickyHeaderTableEl,\n collapseAllOverlay: this.collapseAllOverlayEl,\n frame: this.frameEl,\n interactiveHead: this.interactiveHeadEl,\n }),\n mode: () => ({\n documentStickyHeader: this.documentStickyHeader,\n floatingCollapseAll: this.renderedModel?.collapseAllHost?.mode === 'floating',\n clampVerticalOverscroll: this.fitViewport && this.viewportFitSettled,\n }),\n verticalEdgeWheel: deltaY => this.viewportFitController.scrollOuterBy(deltaY),\n overflowChanged: state => {\n if (state.start !== this.overflowStart) this.overflowStart = state.start;\n if (state.end !== this.overflowEnd) this.overflowEnd = state.end;\n if (state.scrollable !== this.scrollable) this.scrollable = state.scrollable;\n },\n });\n private readonly loadController = new TableLoadController({\n state: () => ({\n lazyLoading: this.dataMode === 'infinite' && !this.grouped,\n loadMoreMode: this.loadMoreMode,\n hasMore: this.hasMore,\n loadingMore: this.loadingMore,\n loadMoreError: this.loadMoreError,\n loadIdentity: this.loadIdentity,\n loadMoreThreshold: this.loadMoreThreshold,\n containedScroll: this.containedScroll,\n loadingMoreLabel: this.loadingMoreLabel,\n endOfResultsLabel: this.endOfResultsLabel,\n rowsLoadedLabel: this.rowsLoadedLabel,\n loadedRowCount: this.currentLoadedRowCount(),\n viewport: this.viewportEl,\n sentinel: this.sentinelEl,\n }),\n announce: message => {\n this.announcement = message;\n },\n request: detail => {\n this.dsLoadMore.emit(detail);\n },\n });\n private readonly groupLoadController = new TableGroupLoadController({\n state: () => ({\n enabled: this.grouped,\n loadMoreMode: this.loadMoreMode,\n loadMoreThreshold: this.loadMoreThreshold,\n containedScroll: this.containedScroll,\n groups: this.groups,\n viewport: this.viewportEl,\n sentinels: this.groupSentinelEls,\n loadingMoreLabel: this.groupLoadingMoreLabel,\n endOfResultsLabel: this.groupEndOfResultsLabel,\n rowsLoadedLabel: this.groupRowsLoadedLabel,\n }),\n announce: message => {\n this.announcement = message;\n },\n request: detail => {\n this.dsGroupLoadMore.emit(detail);\n },\n });\n private readonly viewportFitController = new TableViewportFitController({\n enabled: () => this.fitViewport,\n elements: () => ({ host: this.el, surface: this.rootEl }),\n insets: () => ({\n blockStart: this.viewportInsetBlockStart,\n blockEnd: this.viewportInsetBlockEnd,\n }),\n fitChanged: (metrics: TableViewportFitMetrics | null) => {\n const settled = metrics?.settled ?? false;\n if (settled !== this.viewportFitSettled) this.viewportFitSettled = settled;\n },\n });\n\n componentWillLoad(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.syncHeaderSlotPresence();\n this.loadController.initialize();\n this.groupLoadController.initialize();\n this.warnModelIssues();\n }\n\n componentDidLoad(): void {\n this.hasLoaded = true;\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFitObserver();\n this.syncFitPageSize();\n }\n\n componentDidRender(): void {\n this.layoutController.refresh();\n this.loadController.refresh();\n this.groupLoadController.refresh();\n this.viewportFitController.refresh();\n this.syncStickyGroupConnection();\n this.connectFitObserver();\n this.syncFitPageSize();\n if (this.stickyGroupConnected) this.updateStickyGroup();\n }\n\n connectedCallback(): void {\n if (!this.hasLoaded) return;\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFitObserver();\n }\n\n disconnectedCallback(): void {\n this.layoutController.disconnect();\n this.loadController.disconnect();\n this.groupLoadController.disconnect();\n this.viewportFitController.disconnect();\n this.disconnectStickyGroup();\n this.headerSlotObserver?.disconnect();\n this.headerSlotObserver = null;\n this.disconnectFitObserver();\n }\n\n private syncHeaderSlotPresence = () => {\n this.headerPresent = !!this.el.querySelector('[slot=\"header\"]');\n };\n\n private connectHeaderSlotObserver(): void {\n if (this.headerSlotObserver || typeof MutationObserver === 'undefined') return;\n this.headerSlotObserver = new MutationObserver(this.syncHeaderSlotPresence);\n this.headerSlotObserver.observe(this.el, { childList: true });\n this.syncHeaderSlotPresence();\n }\n\n private connectStickyGroup(): void {\n if (this.stickyGroupConnected || typeof window === 'undefined') return;\n this.stickyGroupConnected = true;\n document.addEventListener('scroll', this.updateStickyGroup, {\n capture: true,\n passive: true,\n });\n window.addEventListener('resize', this.updateStickyGroup, { passive: true });\n this.updateStickyGroup();\n }\n\n private syncStickyGroupConnection(): void {\n if (this.documentStickyHeader && this.grouped) {\n this.connectStickyGroup();\n return;\n }\n\n this.disconnectStickyGroup();\n this.frameEl?.style.removeProperty('--_table-sticky-group-top');\n if (this.activeStickyGroupId !== null) {\n this.activeStickyGroupId = null;\n }\n }\n\n private disconnectStickyGroup(): void {\n if (!this.stickyGroupConnected || typeof window === 'undefined') return;\n this.stickyGroupConnected = false;\n document.removeEventListener('scroll', this.updateStickyGroup, true);\n window.removeEventListener('resize', this.updateStickyGroup);\n }\n\n private readonly updateStickyGroup = (): void => {\n if (!this.documentStickyHeader || !this.grouped || !this.frameEl || !this.tableEl) {\n if (this.activeStickyGroupId !== null) this.activeStickyGroupId = null;\n return;\n }\n\n const stickyHeader = this.frameEl.querySelector<HTMLElement>(\n '.ds-table__document-sticky-header',\n );\n if (!stickyHeader) return;\n const threshold = stickyHeader.getBoundingClientRect().bottom;\n let activeGroupId: string | null = null;\n let activeGroupTop = threshold;\n for (const body of this.tableEl.querySelectorAll<HTMLElement>('tbody[data-group-id]')) {\n const source = body.querySelector<HTMLElement>('.ds-table__group-cell');\n if (!source) continue;\n const sourceRect = source.getBoundingClientRect();\n const bodyRect = body.getBoundingClientRect();\n if (sourceRect.top <= threshold && bodyRect.bottom > threshold) {\n activeGroupId = body.dataset.groupId ?? null;\n // A sticky section is bounded by its own row group. As that boundary\n // approaches the sticky lane, move the outgoing section bar with it so\n // the incoming source bar pushes it away instead of rendering beneath it.\n activeGroupTop = Math.min(threshold, bodyRect.bottom - sourceRect.height);\n }\n }\n\n const frameRect = this.frameEl.getBoundingClientRect();\n this.frameEl.style.setProperty(\n '--_table-sticky-group-top',\n `${activeGroupTop - frameRect.top}px`,\n );\n\n if (activeGroupId !== this.activeStickyGroupId) {\n this.activeStickyGroupId = activeGroupId;\n return;\n }\n };\n\n @Watch('columns')\n @Watch('grouping')\n handleStructureChange(): void {\n this.warnModelIssues();\n this.loadController.structureChanged();\n this.groupLoadController.structureChanged();\n }\n\n @Watch('rows')\n @Watch('groups')\n handleDataChange(): void {\n if (this.grouped) this.groupLoadController.dataChanged();\n else this.loadController.dataChanged();\n this.warnModelIssues();\n }\n\n @Watch('loadIdentity')\n handleLoadIdentityChange(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.loadController.identityChanged();\n }\n\n @Watch('loadMoreMode')\n @Watch('loadMoreThreshold')\n handleLazyConfigurationChange(): void {\n this.loadController.configurationChanged();\n this.groupLoadController.configurationChanged();\n }\n\n @Watch('dataMode')\n handleDataModeChange(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.handleLazyConfigurationChange();\n }\n\n @Watch('pagination')\n handlePaginationChange(\n pagination: TablePaginationState | null,\n previous: TablePaginationState | null,\n ): void {\n if (\n pagination?.pageSizeMode === 'fit' &&\n pagination.fitIdentity !== previous?.fitIdentity\n ) {\n this.fitMeasurementPending = true;\n }\n }\n\n @Watch('loadingMore')\n handleLoadingMoreChange(loading: boolean): void {\n if (loading) this.incrementalWindowActive = true;\n if (!this.grouped) this.loadController.loadingChanged(loading);\n }\n\n @Watch('loadMoreError')\n handleLoadMoreErrorChange(error: string | undefined): void {\n if (error?.trim()) this.incrementalWindowActive = true;\n if (!this.grouped) this.loadController.errorChanged(error);\n }\n\n @Watch('hasMore')\n handleHasMoreChange(hasMore: boolean, hadMore: boolean): void {\n if (hasMore) this.incrementalWindowActive = true;\n if (!this.grouped) this.loadController.hasMoreChanged(hasMore, hadMore);\n }\n\n private get grouped(): boolean {\n return this.grouping !== null;\n }\n\n private get hasIncrementalState(): boolean {\n return this.dataMode === 'infinite' &&\n (this.hasMore || this.loadingMore || !!this.loadMoreError?.trim());\n }\n\n private get selectable(): boolean {\n return this.selectionMode === 'multiple';\n }\n\n private get documentStickyHeader(): boolean {\n return this.stickyHeader && !this.containedScroll;\n }\n\n private get fixedHeight(): boolean {\n return !this.fitViewport && this.resolvedHeight !== undefined;\n }\n\n private get boundedComposition(): boolean {\n return this.fitViewport || this.fixedHeight;\n }\n\n private get containedScroll(): boolean {\n return this.boundedComposition || this.resolvedMaxHeight !== undefined;\n }\n\n private connectFitObserver(): void {\n if (typeof ResizeObserver === 'undefined') return;\n if (this.fitObservedViewport === this.viewportEl && this.fitObservedTable === this.tableEl) {\n return;\n }\n this.disconnectFitObserver();\n this.fitObservedViewport = this.viewportEl;\n this.fitObservedTable = this.tableEl;\n this.fitResizeObserver = new ResizeObserver(this.syncFitPageSize);\n if (this.fitObservedViewport) this.fitResizeObserver.observe(this.fitObservedViewport);\n if (this.fitObservedTable) this.fitResizeObserver.observe(this.fitObservedTable);\n }\n\n private disconnectFitObserver(): void {\n this.fitResizeObserver?.disconnect();\n this.fitResizeObserver = null;\n this.fitObservedViewport = null;\n this.fitObservedTable = null;\n }\n\n private readonly syncFitPageSize = (): void => {\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (!pagination?.fitToPage || !this.containedScroll || !this.viewportEl || !this.tableEl) {\n if (this.fitPageSize !== undefined) this.fitPageSize = undefined;\n this.fitMeasurementPending = false;\n return;\n }\n const header = this.tableEl.querySelector<HTMLElement>(\n '.ds-table__head .ds-table__header-row',\n );\n const item = this.tableEl.querySelector<HTMLElement>(\n this.grouped ? '.ds-table__group-row' : '.ds-table__body .ds-table__row',\n );\n const itemBlockSize = item?.getBoundingClientRect().height || resolveCssLengthPx(\n 'var(--ds-table-row-min-block-size, var(--dimension-size-500))',\n 0,\n this.rootEl ?? this.el,\n );\n const next = resolveTableFitPageSize({\n viewportBlockSize: this.viewportEl.clientHeight,\n headerBlockSize: header?.getBoundingClientRect().height ?? 0,\n itemBlockSize,\n });\n if (next !== this.fitPageSize) this.fitPageSize = next;\n if (!this.fitMeasurementPending || pagination.pageSizeMode !== 'fit' || next === undefined) {\n return;\n }\n this.fitMeasurementPending = false;\n if (next === pagination.pageSize && pagination.pageIndex === 0) return;\n this.dsPaginationChange.emit({\n pageIndex: 0,\n pageSize: next,\n pageSizeMode: 'fit',\n totalItems: pagination.totalItems,\n pageSizeOptions: pagination.pageSizeOptions ?? [25, 50, 100, 200],\n fitToPage: true,\n fitPageSize: next,\n fitPageSizeLabel: pagination.fitPageSizeLabel ?? 'Fit to page',\n fitPageSizeTriggerLabel: pagination.fitPageSizeTriggerLabel ?? 'Fit',\n itemLabel: pagination.itemLabel ?? 'items',\n pageSizeLabel: pagination.pageSizeLabel ?? 'Items',\n ariaLabel: pagination.ariaLabel ?? `${this.caption} pagination`,\n previousPageIndex: pagination.pageIndex,\n previousPageSize: pagination.pageSize,\n previousPageSizeMode: 'fit',\n reason: 'fit',\n });\n };\n\n private handlePaginationKeyDown(event: KeyboardEvent): void {\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (\n !pagination ||\n this.loading ||\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey ||\n (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')\n ) {\n return;\n }\n\n const fromDirectionalControl = event.composedPath().some(node => {\n if (!(node instanceof HTMLElement)) return false;\n return node.tagName === 'DS-SELECT' ||\n ['INPUT', 'SELECT', 'TEXTAREA'].includes(node.tagName) ||\n node.isContentEditable ||\n node.getAttribute('role') === 'slider';\n });\n if (fromDirectionalControl) return;\n\n const state = resolvePaginationState(pagination);\n const pageIndex = event.key === 'ArrowLeft' ? state.pageIndex - 1 : state.pageIndex + 1;\n if (pageIndex < 0 || pageIndex >= state.totalPages) return;\n\n event.preventDefault();\n this.dsPaginationChange.emit({\n pageIndex,\n pageSize: state.pageSize,\n pageSizeMode: state.pageSizeMode,\n totalItems: state.totalItems,\n pageSizeOptions: state.pageSizeOptions,\n fitToPage: pagination.fitToPage ?? false,\n fitPageSize: this.fitPageSize ?? pagination.fitPageSize,\n fitPageSizeLabel: pagination.fitPageSizeLabel ?? 'Fit to page',\n fitPageSizeTriggerLabel: pagination.fitPageSizeTriggerLabel ?? 'Fit',\n itemLabel: pagination.itemLabel ?? 'items',\n pageSizeLabel: pagination.pageSizeLabel ?? 'Items',\n ariaLabel: pagination.ariaLabel ?? `${this.caption} pagination`,\n previousPageIndex: state.pageIndex,\n previousPageSize: state.pageSize,\n previousPageSizeMode: state.pageSizeMode,\n reason: 'page',\n });\n }\n\n private currentLoadedRows(): TableRow[] {\n return tableRows(this.rows, this.groups, this.grouped);\n }\n\n private currentLoadedRowCount(): number {\n return this.grouped\n ? this.groups.reduce((count, group) => count + group.rows.length, 0)\n : this.rows.length;\n }\n\n private createRenderModel(): TableRenderModel {\n return createTableRenderModel({\n columns: this.columns,\n rows: this.rows,\n groups: this.groups,\n grouped: this.grouped,\n selectionMode: this.selectionMode,\n selectedRowIds: this.selectedRowIds,\n collapsedGroupIds: this.collapsedGroupIds,\n });\n }\n\n private get resolvedMaxHeight(): string | undefined {\n if (this.maxHeight == null || this.maxHeight === '') return undefined;\n return typeof this.maxHeight === 'number' ? `${Math.max(0, this.maxHeight)}px` : this.maxHeight;\n }\n\n private get resolvedHeight(): string | undefined {\n if (this.height == null || this.height === '') return undefined;\n return typeof this.height === 'number' ? `${Math.max(0, this.height)}px` : this.height;\n }\n\n private warnModelIssues(): void {\n const issues = tableModelIssues(this.columns, this.rows, this.groups, this.grouped);\n if (!this.caption?.trim()) issues.unshift('A non-empty caption is required.');\n if (this.grouping && !this.columns.some(column => column.id === this.grouping!.columnId)) {\n issues.push(`Grouping references unknown column id: ${this.grouping.columnId}`);\n }\n if (\n this.sort &&\n !this.columns.some(column =>\n column.id === this.sort!.columnId ||\n column.headerSegments?.some(segment => segment.sortKey === this.sort!.columnId),\n )\n ) {\n issues.push(`Sorting references unknown column id: ${this.sort.columnId}`);\n }\n const stickyStart = this.columns.filter(column => column.sticky === 'start');\n const stickyEnd = this.columns.filter(column => column.sticky === 'end');\n if (stickyStart.length > 1 || (this.selectable && stickyStart.length > 0)) {\n issues.push('Only one sticky start column is supported, and row selection already owns that lane.');\n }\n if (stickyEnd.length > 1) issues.push('Only one sticky end column is supported.');\n for (const column of [...stickyStart, ...stickyEnd]) {\n if (!tableColumnSize(column)) issues.push(`Sticky column ${column.id} requires an explicit size.`);\n }\n const message = issues.join(' ');\n if (!message || message === this.previousModelWarning) return;\n this.previousModelWarning = message;\n console.warn(`[ds-table] ${message}`);\n }\n\n private emitSort(column: TableColumn, sortKey = column.id): void {\n if (!column.sortable) return;\n this.dsSortChange.emit({ sort: nextTableSortState(this.sort, sortKey) });\n }\n\n private sortButtonLabel(column: TableColumn, sortKey = column.id, label = column.header): string {\n if (this.sort?.columnId !== sortKey) return `Sort ${label} ascending`;\n if (this.sort.direction === 'asc') return `Sort ${label} descending. Currently ascending.`;\n return `Sort ${label} ascending. Currently descending.`;\n }\n\n private emitRowSelection(row: TableRow): void {\n const next = toggleTableRowSelection(this.selectedRowIds, row);\n const selected = next.includes(row.id);\n this.dsSelectionChange.emit({\n selectedRowIds: next,\n scope: 'row',\n changedRowId: row.id,\n selected,\n });\n }\n\n private emitAllSelection(): void {\n const loadedRows = this.currentLoadedRows();\n const selection = deriveTableSelectionState(loadedRows, this.selectedRowIds);\n this.dsSelectionChange.emit({\n selectedRowIds: toggleAllLoadedTableRows(this.selectedRowIds, loadedRows),\n scope: 'all-loaded',\n selected: !selection.allSelected,\n });\n }\n\n private emitGroupSelection(group: TableGroup): void {\n const state = deriveTableSelectionState(group.rows, this.selectedRowIds);\n this.dsSelectionChange.emit({\n selectedRowIds: toggleTableGroupSelection(this.selectedRowIds, group.rows),\n scope: 'group',\n groupId: group.id,\n selected: !state.allSelected,\n });\n }\n\n private rowEventOwnsActivation(event: Event): boolean {\n const currentTarget = event.currentTarget;\n return !event.composedPath().some(target => {\n if (!(target instanceof HTMLElement) || target === currentTarget) return false;\n return target.matches(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"checkbox\"], ds-button-unfilled',\n );\n });\n }\n\n private emitRowActivation(row: TableRow, event: Event): void {\n if (!row.interactive || row.disabled || !this.rowEventOwnsActivation(event)) return;\n this.dsRowActivate.emit({ rowId: row.id });\n }\n\n private handleRowKeydown(row: TableRow, event: KeyboardEvent): void {\n if (event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' ')) return;\n event.preventDefault();\n this.emitRowActivation(row, event);\n }\n\n private renderSelectionControl(\n label: string,\n checked: boolean,\n indeterminate: boolean,\n disabled: boolean,\n onActivate: () => void,\n ) {\n return (\n <button\n class=\"ds-table__selection-control ds-focus-ring ds-interaction-fill__content\"\n type=\"button\"\n role=\"checkbox\"\n aria-label={label}\n aria-checked={indeterminate ? 'mixed' : String(checked)}\n disabled={disabled}\n onClick={onActivate}\n >\n <ds-checkbox\n label=\"\"\n size=\"md\"\n checked={checked}\n indeterminate={indeterminate}\n presentation={true}\n />\n </button>\n );\n }\n\n private renderStickyEdge(sticky: TableColumn['sticky']) {\n if (!sticky) return null;\n return (\n <span\n class={`ds-table__sticky-edge ds-table__sticky-edge--${sticky}`}\n aria-hidden=\"true\"\n />\n );\n }\n\n private renderCollapseAllButton() {\n return (\n <ds-button-unfilled\n class=\"ds-table__collapse-all\"\n variant=\"icon\"\n icon=\"ChevronDownUp\"\n size=\"xs\"\n style={{ width: 'var(--dimension-size-300)' }}\n aria-label=\"Collapse all groups\"\n hasBorder={false}\n activeFill={false}\n pressScale={false}\n onDsClick={event => {\n event.stopPropagation();\n this.emitAllGroupsCollapse();\n }}\n />\n );\n }\n\n private renderFloatingCollapseAll(model: TableRenderModel) {\n if (model.collapseAllHost?.mode !== 'floating') return null;\n return (\n <span\n class=\"ds-table__collapse-all-overlay\"\n ref={element => {\n this.collapseAllOverlayEl = element ?? null;\n }}\n >\n <span class=\"ds-table__collapse-all-surface ds-control-elevation ds-control-elevation--md\">\n {this.renderCollapseAllButton()}\n </span>\n </span>\n );\n }\n\n private renderColumnHeader(\n column: TableColumn,\n model: TableRenderModel,\n interactive = true,\n presentational = false,\n ) {\n const groupedColumn = this.grouping?.columnId === column.id;\n const headerSegments = column.headerSegments?.length\n ? column.headerSegments\n : [{ label: column.header, sortKey: column.id }];\n const activeMemberSegment = headerSegments.find(\n segment => segment.sortKey === this.sort?.columnId,\n );\n const activeMemberSort = !!activeMemberSegment;\n const activeSort = activeMemberSort;\n const align = column.align ?? 'start';\n const direction = activeMemberSort ? this.sort!.direction : undefined;\n const memberAriaSort = activeMemberSort\n ? (this.sort!.direction === 'asc' ? 'ascending' : 'descending')\n : undefined;\n\n const labelControl = (\n <span class=\"ds-table__header-labels\">\n {headerSegments.map((segment, index) => {\n const segmentActive = activeMemberSegment?.sortKey === segment.sortKey;\n const segmentInteractive = interactive && !!column.sortable;\n const label = (\n <ds-text\n class=\"ds-table__header-label-box ds-control-label-box\"\n as=\"span\"\n variant=\"text-caption\"\n emphasis={segmentActive}\n color=\"inherit\"\n lineTruncation={1}\n >\n {segment.label}\n </ds-text>\n );\n const control = segmentInteractive ? (\n <button\n class=\"ds-table__header-label ds-table__header-label--interactive ds-focus-ring\"\n type=\"button\"\n aria-label={this.sortButtonLabel(column, segment.sortKey, segment.label)}\n data-sort-control=\"label\"\n data-sort-key={segment.sortKey}\n data-sort-active={segmentActive ? 'true' : undefined}\n onClick={() => this.emitSort(column, segment.sortKey)}\n >\n {label}\n </button>\n ) : (\n <span class=\"ds-table__header-label ds-table__header-static\">{label}</span>\n );\n\n return (\n <span class=\"ds-table__header-segment\" key={segment.sortKey}>\n {control}\n {index < headerSegments.length - 1 && (\n <ds-text\n class=\"ds-table__header-separator\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"tertiary\"\n aria-hidden=\"true\"\n >\n {segment.separator ?? '/'}\n </ds-text>\n )}\n </span>\n );\n })}\n </span>\n );\n const sortControl = interactive ? (\n <span class=\"ds-table__sort-slot\">\n {activeSort && (\n <ds-button-unfilled\n class=\"ds-table__sort-direction\"\n variant=\"icon\"\n icon={direction === 'asc' ? 'ArrowUp' : 'ArrowDown'}\n size=\"xs\"\n aria-label={this.sortButtonLabel(\n column,\n activeMemberSegment?.sortKey ?? column.id,\n activeMemberSegment?.label ?? column.header,\n )}\n hasBorder={false}\n activeFill={false}\n isActive={true}\n pressScale={false}\n data-sort-control=\"direction\"\n onDsClick={() => this.emitSort(column, activeMemberSegment?.sortKey ?? column.id)}\n />\n )}\n </span>\n ) : null;\n const collapseHost = model.collapseAllHost;\n const actionCollapseHost = collapseHost?.mode === 'action' && collapseHost.columnId === column.id;\n const blankActionCollapseHost = actionCollapseHost &&\n !column.header.trim() &&\n !column.headerSegments?.length;\n const collapseControl =\n interactive && actionCollapseHost ? (\n <span class=\"ds-table__collapse-slot\">\n {this.renderCollapseAllButton()}\n </span>\n ) : null;\n\n return (\n <th\n key={column.id}\n class={{\n 'ds-table__header-cell': true,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--sticky-start': column.sticky === 'start',\n 'ds-table__cell--sticky-end': column.sticky === 'end',\n 'ds-table__header-cell--collapse-all': actionCollapseHost,\n }}\n scope={presentational ? undefined : 'col'}\n aria-sort={presentational ? undefined : memberAriaSort}\n data-column-id={column.id}\n data-grouped={groupedColumn ? 'true' : undefined}\n data-sort-active={activeSort ? 'true' : undefined}\n >\n {!column.header.trim() && column.headerLabel?.trim() && (\n <span class=\"ds-visually-hidden\">{column.headerLabel}</span>\n )}\n {blankActionCollapseHost ? (\n <span class=\"ds-table__header-content ds-table__header-content--collapse-all\">\n {collapseControl}\n </span>\n ) : (\n <span class=\"ds-table__header-content\">\n {align === 'end' && sortControl}\n {align === 'center' && (\n <span\n class=\"ds-table__sort-slot ds-table__sort-slot--balance\"\n data-sort-balance=\"true\"\n aria-hidden=\"true\"\n />\n )}\n {labelControl}\n {align !== 'end' && sortControl}\n {collapseControl}\n </span>\n )}\n {this.renderStickyEdge(column.sticky)}\n </th>\n );\n }\n\n private renderColgroup(model: TableRenderModel) {\n return (\n <colgroup>\n {model.selectable && <col class=\"ds-table__selection-column\" />}\n {this.columns.map(column => {\n const width = tableColumnSize(column);\n const flexible = column.id === model.flexibleColumnId;\n return (\n <col\n key={column.id}\n class={{\n 'ds-table__action-column': column.kind === 'action',\n 'ds-table__flexible-column': flexible,\n }}\n style={width && !flexible ? { width } : undefined}\n />\n );\n })}\n </colgroup>\n );\n }\n\n private renderHeader(\n model: TableRenderModel,\n interactive = true,\n presentational = false,\n ) {\n const selection = model.selection;\n return (\n <thead class={{\n 'ds-table__head': true,\n 'ds-table__head--semantic-copy': !interactive,\n }} ref={element => {\n if (interactive) this.interactiveHeadEl = element ?? null;\n }}>\n <tr class=\"ds-table__header-row\">\n {model.selectable && (\n <th\n class=\"ds-table__header-cell ds-table__selection-cell ds-table__cell--sticky-start\"\n scope={presentational ? undefined : 'col'}\n >\n {interactive ? this.renderSelectionControl(\n selection.allSelected ? 'Deselect all loaded rows' : 'Select all loaded rows',\n selection.allSelected,\n selection.indeterminate,\n selection.selectableRowIds.length === 0,\n () => this.emitAllSelection(),\n ) : (\n <span class=\"ds-visually-hidden\">Select rows</span>\n )}\n {this.renderStickyEdge('start')}\n </th>\n )}\n {this.columns.map(column => (\n this.renderColumnHeader(column, model, interactive, presentational)\n ))}\n </tr>\n </thead>\n );\n }\n\n private renderCellValue(\n cell: TableCellPresentation,\n column: TableColumn,\n row: TableRow,\n ) {\n if (cell.kind === 'blank') return null;\n\n if (cell.kind === 'empty') {\n return (\n <ds-text\n class=\"ds-table__cell-track ds-table__cell-track--text\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"tertiary\"\n >\n <span aria-hidden=\"true\">—</span>\n <span class=\"ds-visually-hidden\">{this.emptyCellLabel}</span>\n </ds-text>\n );\n }\n\n if (cell.kind === 'icon') {\n const value = cell.value;\n return (\n <ds-icon\n name={value.icon}\n size=\"md\"\n color={value.color ?? 'secondary'}\n label={value.label}\n />\n );\n }\n\n if (cell.kind === 'icon-text') {\n return (\n <span class=\"ds-table__cell-icon-text\">\n <span class=\"ds-table__cell-icon-text-icon\">\n <ds-icon\n name={cell.icon}\n size=\"md\"\n color={cell.iconColor ?? 'secondary'}\n label={cell.iconLabel}\n />\n </span>\n {this.renderTextCopy(cell)}\n </span>\n );\n }\n\n if (cell.kind === 'image') {\n const value = cell.value;\n return (\n <span class=\"ds-table__cell-image\">\n {value.src ? (\n <img class=\"ds-table__cell-image-content\" src={value.src} alt={value.alt} loading=\"lazy\" />\n ) : (\n <span\n class=\"ds-table__cell-image-placeholder\"\n role=\"img\"\n aria-label={value.alt}\n />\n )}\n </span>\n );\n }\n\n if (cell.kind === 'action') {\n const value = cell.value;\n return (\n <ds-button-unfilled\n variant={value.variant ?? 'label'}\n size=\"md\"\n isInset={true}\n insetDepth=\"double\"\n label={value.label ?? ''}\n icon={value.icon ?? ''}\n aria-label={value.ariaLabel ?? null}\n hasBorder={value.hasBorder ?? false}\n isInactive={value.isInactive ?? false}\n isLoading={value.isLoading ?? false}\n onDsClick={event => {\n event.stopPropagation();\n this.dsCellAction.emit({\n actionId: value.actionId,\n rowId: row.id,\n columnId: column.id,\n });\n }}\n />\n );\n }\n\n if (cell.kind === 'tag') {\n const value = cell.value;\n const variant = cell.variant;\n const tag = (\n <ds-tag\n label={value.label}\n intent={value.intent ?? 'neutral'}\n contrast={value.contrast ?? 'faint'}\n size={variant === 'text-with-tag' ? 'sm' : 'md'}\n icon={value.icon ?? ''}\n rounded={value.rounded ?? false}\n isInset\n insetDepth={variant === 'text-with-tag' ? 'single' : 'double'}\n />\n );\n\n if (variant === 'tag-only') return tag;\n\n return (\n <span class={`ds-table__cell-tag-stack ds-table__cell-tag-stack--${variant}`}>\n {variant === 'tag-with-text' && tag}\n <ds-text\n class=\"ds-table__cell-tag-text ds-table__cell-track\"\n as=\"span\"\n variant={variant === 'tag-with-text' ? 'text-body-small' : 'text-body-medium'}\n color=\"secondary\"\n lineTruncation={1}\n >\n {value.text}\n </ds-text>\n {variant === 'text-with-tag' && (\n <span class=\"ds-table__cell-tag-control-track\">{tag}</span>\n )}\n </span>\n );\n }\n\n if (cell.kind !== 'text') return null;\n return this.renderTextCopy(cell);\n }\n\n private renderTextCopy(\n cell: Extract<TableCellPresentation, { kind: 'text' | 'icon-text' }>,\n ) {\n const text = cell.value;\n const wraps = cell.wraps;\n const primaryText = cell.kind === 'text' && cell.primaryText;\n const href = resolveSafeUrl(text.href);\n const primary = (\n <ds-text\n class=\"ds-table__cell-primary ds-table__cell-track ds-table__cell-track--text\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={href ? 'inherit' : 'primary'}\n lineTruncation={wraps ? 'none' : 1}\n wrap={wraps ? 'wrap' : 'nowrap'}\n fontFeature={text.fontFeature ?? 'normal'}\n >\n {text.primary}\n </ds-text>\n );\n\n return (\n <span class={{ 'ds-table__cell-copy': true, 'ds-table__cell-copy--wrap': wraps }}>\n {href ? (\n <a\n class=\"ds-table__cell-link ds-text-action ds-focus-ring\"\n href={href}\n target={text.target === '_blank' ? '_blank' : undefined}\n rel={text.target === '_blank' ? 'noopener noreferrer' : undefined}\n >\n {primary}\n </a>\n ) : primary}\n {this.renderTextTrack(text.secondary, {\n track: 'secondary',\n variant: primaryText ? 'text-body-medium' : 'text-body-small',\n defaultColor: primaryText ? 'primary' : 'secondary',\n wholeColor: text.secondaryColor,\n wraps,\n })}\n {this.renderTextTrack(text.tertiary, {\n track: 'tertiary',\n variant: 'text-body-small',\n defaultColor: 'secondary',\n wholeColor: text.tertiaryColor,\n wraps,\n })}\n </span>\n );\n }\n\n private renderTextTrack(\n runs: TableCellTextRun[] | undefined,\n options: {\n track: 'secondary' | 'tertiary';\n variant: 'text-body-medium' | 'text-body-small';\n defaultColor: 'primary' | 'secondary';\n wholeColor?: TableCellTextRun['color'];\n wraps: boolean;\n },\n ) {\n if (!runs?.length) return null;\n const trackClass = `ds-table__cell-${options.track} ds-table__cell-track ds-table__cell-track--text`;\n const colorFor = (run: TableCellTextRun) =>\n run.color ?? options.wholeColor ?? options.defaultColor;\n if (runs.length === 1) {\n return (\n <ds-text\n class={trackClass}\n as=\"span\"\n variant={options.variant}\n color={colorFor(runs[0])}\n lineTruncation={options.wraps ? 'none' : 1}\n wrap={options.wraps ? 'wrap' : 'nowrap'}\n >\n {runs[0].text}\n </ds-text>\n );\n }\n\n return (\n <span class={`${trackClass} ds-table__cell-track--runs`}>\n {runs.map((run, index) => [\n index > 0 && (\n <ds-text\n key={`${options.track}-sep-${index}`}\n class=\"ds-table__cell-run-separator\"\n as=\"span\"\n variant={options.variant}\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>\n ),\n <ds-text\n key={`${options.track}-run-${index}`}\n class=\"ds-table__cell-run\"\n as=\"span\"\n variant={options.variant}\n color={colorFor(run)}\n lineTruncation={options.wraps ? 'none' : 1}\n wrap={options.wraps ? 'wrap' : 'nowrap'}\n >\n {run.text}\n </ds-text>,\n ])}\n </span>\n );\n }\n\n private renderRow(row: TableRow, model: TableRenderModel) {\n const selected = model.selectedRowIds.has(row.id);\n const rowSelectable = row.selectable !== false && !row.disabled;\n return (\n <tr\n key={row.id}\n class={{\n 'ds-table__row': true,\n 'ds-table__row--selected': selected,\n 'ds-table__row--disabled': !!row.disabled,\n 'ds-table__row--interactive': !!row.interactive && !row.disabled,\n 'ds-focus-ring': !!row.interactive && !row.disabled,\n }}\n data-row-id={row.id}\n data-selected={selected ? 'true' : undefined}\n aria-disabled={row.disabled ? 'true' : undefined}\n tabIndex={row.interactive && !row.disabled ? 0 : undefined}\n onClick={event => this.emitRowActivation(row, event)}\n onKeyDown={event => this.handleRowKeydown(row, event)}\n >\n {model.selectable && (\n <td class={{\n 'ds-table__cell': true,\n 'ds-table__selection-cell': true,\n 'ds-table__cell--sticky-start': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n }}>\n {this.renderSelectionControl(\n `${selected ? 'Deselect' : 'Select'} ${tableRowSelectionLabel(row, this.columns)}`,\n selected,\n false,\n !rowSelectable,\n () => this.emitRowSelection(row),\n )}\n {this.renderStickyEdge('start')}\n </td>\n )}\n {this.columns.map(column => {\n const align = column.align ?? 'start';\n const cell = resolveTableCellPresentation(row.cells[column.id], column);\n const tagCell = cell.kind === 'tag';\n const iconCell = cell.kind === 'icon';\n const iconTextCell = cell.kind === 'icon-text';\n const imageCell = cell.kind === 'image';\n const actionCell = cell.kind === 'action';\n const textCell = cell.kind === 'text';\n const primaryTextCell = textCell && cell.primaryText;\n const singleTextCell = textCell && cell.singleLine;\n const emptyCell = cell.kind === 'empty';\n const blankCell = cell.kind === 'blank';\n const tagVariant = tagCell ? cell.variant : undefined;\n const textVariant = textCell ? cell.variant : undefined;\n const imageVariant = cell.kind === 'image' ? cell.variant : undefined;\n const iconTextVariant = iconTextCell ? cell.variant : undefined;\n return (\n <td\n key={`${row.id}:${column.id}`}\n class={{\n 'ds-table__cell': true,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--tag': tagCell,\n [`ds-table__cell--tag-${tagVariant}`]: tagCell,\n 'ds-table__cell--icon': iconCell,\n 'ds-table__cell--icon-text': iconTextCell,\n [`ds-table__cell--icon-text-${iconTextVariant}`]: iconTextCell,\n 'ds-table__cell--image': imageCell,\n [`ds-table__cell--image-${imageVariant}`]: imageCell,\n 'ds-table__cell--action': actionCell,\n 'ds-table__cell--primary-text': primaryTextCell,\n 'ds-table__cell--text-single': singleTextCell,\n 'ds-table__cell--text-multi': textCell && !singleTextCell && textVariant !== 'triple',\n 'ds-table__cell--text-triple': textVariant === 'triple',\n 'ds-table__cell--empty': emptyCell,\n 'ds-table__cell--blank': blankCell,\n 'ds-table__cell--sticky-start': column.sticky === 'start',\n 'ds-table__cell--sticky-end': column.sticky === 'end',\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n }}\n data-column-id={column.id}\n data-cell-type={cell.cellType}\n data-cell-variant={tagVariant ?? textVariant ?? imageVariant ?? iconTextVariant}\n >\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {this.renderCellValue(cell, column, row)}\n </span>\n {this.renderStickyEdge(column.sticky)}\n </td>\n );\n })}\n </tr>\n );\n }\n\n private emitGroupCollapse(group: TableGroup) {\n const collapsedGroupIds = toggleTableGroupCollapsed(this.collapsedGroupIds, group.id);\n this.dsGroupCollapseChange.emit({\n scope: 'group',\n groupId: group.id,\n collapsed: collapsedGroupIds.includes(group.id),\n collapsedGroupIds,\n });\n }\n\n private emitAllGroupsCollapse() {\n const groupIds = this.groups.map(group => group.id);\n const collapsedGroupIds = nextTableGroupsCollapsed(this.collapsedGroupIds, groupIds);\n this.dsGroupCollapseChange.emit({\n scope: 'all',\n collapsed: collapsedGroupIds.length > 0,\n collapsedGroupIds,\n });\n }\n\n private renderGroupContent(groupModel: TableRenderModel['groups'][number]) {\n const {\n group,\n count,\n loadedCount,\n countLabel,\n collapsed: isCollapsed,\n labelColor,\n selection: groupSelection,\n } = groupModel;\n return (\n <span class=\"ds-table__group-content\">\n {groupSelection && (\n <span class=\"ds-table__group-selection\">\n {this.renderSelectionControl(\n groupSelection.allSelected\n ? `Deselect loaded rows in ${group.label} group`\n : `Select loaded rows in ${group.label} group`,\n groupSelection.allSelected,\n groupSelection.indeterminate,\n groupSelection.selectableRowIds.length === 0,\n () => this.emitGroupSelection(group),\n )}\n </span>\n )}\n <span class=\"ds-table__group-copy\">\n <ds-text\n class=\"ds-table__group-label\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis={true}\n color={labelColor}\n >\n {group.label}\n </ds-text>\n <ds-text\n class=\"ds-table__group-separator\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>\n <ds-text\n class=\"ds-table__group-count\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n {loadedCount} of {count}\n </ds-text>\n <span class=\"ds-visually-hidden\">{countLabel}</span>\n </span>\n <ds-button-unfilled\n class=\"ds-table__group-toggle\"\n variant=\"icon\"\n size=\"md\"\n isInset={true}\n insetDepth=\"double\"\n icon={isCollapsed ? 'ChevronDown' : 'ChevronUp'}\n expanded={!isCollapsed}\n aria-label={\n isCollapsed\n ? `Expand ${group.label} group`\n : `Collapse ${group.label} group`\n }\n hasBorder={false}\n onDsClick={event => {\n event.stopPropagation();\n this.emitGroupCollapse(group);\n }}\n />\n </span>\n );\n }\n\n private formatGroupLoadLabel(template: string, group: TableGroup): string {\n return template.split('{group}').join(group.label);\n }\n\n private renderGroupLoadRow(group: TableGroup, totalColumns: number) {\n const error = group.loadMoreError?.trim();\n if (!error && !group.loadingMore && !group.hasMore) return null;\n const manualFallback = this.loadMoreMode === 'manual' ||\n !this.groupLoadController.intersectionSupported;\n\n return (\n <tr\n class=\"ds-table__load-row ds-table__group-load-row\"\n data-group-id={group.id}\n ref={element => {\n if (element) this.groupSentinelEls.set(group.id, element);\n else this.groupSentinelEls.delete(group.id);\n }}\n >\n <td class=\"ds-table__load-cell\" colSpan={totalColumns}>\n <div class=\"ds-table__viewport-band ds-table__load-band\">\n {error ? (\n <span class=\"ds-table__load-content ds-table__load-content--error\">\n <span class=\"ds-table__load-copy\">\n <ds-icon name=\"ErrorTriangle\" size=\"md\" color=\"secondary\" aria-hidden=\"true\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">{error}</ds-text>\n </span>\n <ds-button-unfilled\n label={this.formatGroupLoadLabel(this.groupRetryLabel, group)}\n size=\"md\"\n onDsClick={() => this.groupLoadController.request(group.id, 'retry')}\n />\n </span>\n ) : group.loadingMore ? (\n <span class=\"ds-table__load-content\">\n <ds-loader size=\"md\" color=\"secondary\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {this.formatGroupLoadLabel(this.groupLoadingMoreLabel, group)}\n </ds-text>\n </span>\n ) : group.hasMore && manualFallback ? (\n <span class=\"ds-table__load-content\">\n <ds-button-unfilled\n label={this.groupLoadMoreLabel}\n aria-label={this.formatGroupLoadLabel(this.groupLoadMoreAriaLabel, group)}\n size=\"md\"\n onDsClick={() => this.groupLoadController.request(group.id, 'manual')}\n />\n </span>\n ) : (\n <span class=\"ds-table__auto-sentinel\" aria-hidden=\"true\" />\n )}\n </div>\n </td>\n </tr>\n );\n }\n\n private renderStickyGroup(model: TableRenderModel) {\n if (!this.documentStickyHeader || !this.activeStickyGroupId) return null;\n const groupModel = model.groups.find(item => item.group.id === this.activeStickyGroupId);\n if (!groupModel) return null;\n return (\n <div\n class={{\n 'ds-table__sticky-group': true,\n 'ds-table__sticky-group--selectable': model.selectable,\n [groupModel.intentClass ?? '']: !!groupModel.intentClass,\n }}\n data-group-id={groupModel.group.id}\n data-group-intent={groupModel.intent}\n >\n {this.renderGroupContent(groupModel)}\n </div>\n );\n }\n\n private renderDataBodies(model: TableRenderModel) {\n if (!model.grouped) {\n return (\n <tbody class=\"ds-table__body\">\n {this.rows.map(row => this.renderRow(row, model))}\n </tbody>\n );\n }\n\n return model.groups.map(groupModel => {\n const { group, collapsed: isCollapsed, intent, intentClass } = groupModel;\n const stickySourceHidden = this.documentStickyHeader && this.activeStickyGroupId === group.id;\n return (\n <tbody\n class=\"ds-table__body ds-table__group\"\n role=\"rowgroup\"\n data-group-id={group.id}\n data-group-intent={intent}\n data-collapsed={isCollapsed ? 'true' : undefined}\n aria-busy={!isCollapsed && group.loadingMore ? 'true' : undefined}\n key={group.id}\n >\n <tr\n role=\"row\"\n aria-hidden={stickySourceHidden ? 'true' : undefined}\n class={{\n 'ds-table__group-row': true,\n 'ds-table__group-row--native-sticky': this.stickyHeader && !this.documentStickyHeader,\n }}\n >\n <th\n class={{\n 'ds-table__group-cell': true,\n 'ds-table__group-cell--sticky-source-hidden': stickySourceHidden,\n [intentClass ?? '']: !!intentClass,\n }}\n role=\"rowheader\"\n scope=\"rowgroup\"\n colSpan={model.totalColumns}\n >\n {this.renderGroupContent(groupModel)}\n </th>\n </tr>\n {!isCollapsed && group.rows.map(row => this.renderRow(row, model))}\n {!isCollapsed && this.renderGroupLoadRow(group, model.totalColumns)}\n </tbody>\n );\n });\n }\n\n private renderSkeletonBody(model: TableRenderModel) {\n const count = Math.min(20, Math.max(1, Math.round(this.skeletonRows) || 1));\n return (\n <tbody class=\"ds-table__body ds-table__skeleton-body\">\n {Array.from({ length: count }, (_, index) => (\n <tr class=\"ds-table__row ds-table__skeleton-row\" key={`skeleton-${index}`}>\n {model.selectable && (\n <td\n class=\"ds-table__cell ds-table__selection-cell ds-table__cell--sticky-start ds-table__skeleton-cell ds-interaction-fill ds-interaction-fill--grouped\"\n data-skeleton-kind=\"checkbox\"\n >\n <span class=\"ds-table__skeleton-checkbox-canvas ds-interaction-fill__content\">\n <ds-skeleton\n class=\"ds-table__skeleton-checkbox\"\n variant=\"control\"\n controlSize=\"xs\"\n width=\"var(--dimension-iconography-sm)\"\n />\n </span>\n {this.renderStickyEdge('start')}\n </td>\n )}\n {this.columns.map(column => this.renderSkeletonCell(column, index))}\n </tr>\n ))}\n </tbody>\n );\n }\n\n private renderSkeletonCell(column: TableColumn, rowIndex: number) {\n const skeleton = column.skeleton ?? (\n column.kind === 'action'\n ? { kind: 'action', variant: 'icon' }\n : { kind: 'text', lines: 1 }\n ) satisfies TableCellSkeleton;\n const align = column.align ?? 'start';\n const text = skeleton.kind === 'text';\n const iconText = skeleton.kind === 'icon-text';\n const lines = text || iconText ? skeleton.lines ?? 1 : 1;\n const tag = skeleton.kind === 'tag';\n const icon = skeleton.kind === 'icon';\n const image = skeleton.kind === 'image';\n const imageVariant = image\n ? tableCellImageVariant(resolveTableCellImageTracks(skeleton.tracks))\n : undefined;\n const iconTextVariant = iconText\n ? lines === 3 ? 'triple' : lines === 2 ? 'multi' : 'single'\n : undefined;\n const action = skeleton.kind === 'action';\n const blank = skeleton.kind === 'blank';\n\n return (\n <td\n class={{\n 'ds-table__cell': true,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__skeleton-cell': true,\n 'ds-table__cell--text-single': text && lines === 1,\n 'ds-table__cell--text-multi': text && lines === 2,\n 'ds-table__cell--text-triple': text && lines === 3,\n 'ds-table__cell--tag': tag,\n 'ds-table__cell--tag-tag-only': tag,\n 'ds-table__cell--icon': icon,\n 'ds-table__cell--icon-text': iconText,\n [`ds-table__cell--icon-text-${iconTextVariant}`]: iconText,\n 'ds-table__cell--image': image,\n [`ds-table__cell--image-${imageVariant}`]: image,\n 'ds-table__cell--action': action,\n 'ds-table__cell--blank': blank,\n 'ds-table__cell--sticky-start': column.sticky === 'start',\n 'ds-table__cell--sticky-end': column.sticky === 'end',\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n }}\n data-column-id={column.id}\n data-skeleton-kind={skeleton.kind}\n data-cell-variant={imageVariant ?? iconTextVariant}\n key={`skeleton-${rowIndex}:${column.id}`}\n >\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {this.renderSkeletonCellContent(skeleton)}\n </span>\n {this.renderStickyEdge(column.sticky)}\n </td>\n );\n }\n\n private renderSkeletonCellContent(skeleton: TableCellSkeleton) {\n if (skeleton.kind === 'blank') return null;\n\n if (skeleton.kind === 'image') {\n return (\n <span class=\"ds-table__cell-image ds-table__skeleton-image\">\n <ds-skeleton\n class=\"ds-table__skeleton-image-shape\"\n variant=\"control\"\n controlSize=\"md\"\n width=\"100%\"\n />\n </span>\n );\n }\n\n if (skeleton.kind === 'icon') {\n return <ds-skeleton variant=\"icon\" iconSize=\"md\" rounded={skeleton.rounded ?? false} />;\n }\n\n if (skeleton.kind === 'tag') {\n return (\n <ds-skeleton\n variant=\"control\"\n controlSize=\"sm\"\n width={skeleton.width ?? '64%'}\n />\n );\n }\n\n if (skeleton.kind === 'action') {\n const iconOnly = (skeleton.variant ?? 'icon') === 'icon';\n return (\n <ds-skeleton\n variant=\"control\"\n controlSize=\"sm\"\n width={skeleton.width ?? (iconOnly ? '24px' : '72%')}\n />\n );\n }\n\n const lines = skeleton.lines ?? 1;\n const copy = (\n <span class=\"ds-table__cell-copy\">\n <span class=\"ds-table__cell-primary ds-table__cell-track ds-table__cell-track--text\">\n <ds-skeleton\n variant=\"text\"\n textVariant=\"text-body-medium\"\n width={skeleton.primaryWidth ?? '100%'}\n />\n </span>\n {lines >= 2 && (\n <span class=\"ds-table__cell-secondary ds-table__cell-track ds-table__cell-track--text\">\n <ds-skeleton\n variant=\"text\"\n textVariant=\"text-body-small\"\n width={skeleton.secondaryWidth ?? '72%'}\n />\n </span>\n )}\n {lines === 3 && (\n <span class=\"ds-table__cell-tertiary ds-table__cell-track ds-table__cell-track--text\">\n <ds-skeleton\n variant=\"text\"\n textVariant=\"text-body-small\"\n width={skeleton.tertiaryWidth ?? '56%'}\n />\n </span>\n )}\n </span>\n );\n if (skeleton.kind === 'icon-text') {\n return (\n <span class=\"ds-table__cell-icon-text\">\n <span class=\"ds-table__cell-icon-text-icon\">\n <ds-skeleton variant=\"icon\" iconSize=\"md\" />\n </span>\n {copy}\n </span>\n );\n }\n return copy;\n }\n\n private renderStateBody(kind: 'empty' | 'error', totalColumns: number) {\n const error = kind === 'error';\n return (\n <tbody class=\"ds-table__body ds-table__state-body\">\n <tr class=\"ds-table__state-row\">\n <td class=\"ds-table__state-cell\" colSpan={totalColumns}>\n <div class=\"ds-table__viewport-band ds-table__state-band\">\n <ds-empty-state\n icon={error ? 'ErrorTriangle' : 'Inbox'}\n heading={error ? this.errorHeading : this.emptyHeading}\n body={error ? this.errorBody : this.emptyBody}\n />\n </div>\n </td>\n </tr>\n </tbody>\n );\n }\n\n private renderLazyBody(model: TableRenderModel) {\n if (\n this.dataMode !== 'infinite' ||\n !this.incrementalWindowActive ||\n !model.hasData ||\n model.grouped\n ) return null;\n const error = this.loadMoreError?.trim();\n const manualFallback = this.loadMoreMode === 'manual' ||\n !this.loadController.intersectionSupported;\n\n return (\n <tbody class=\"ds-table__body ds-table__load-body\">\n <tr\n class=\"ds-table__load-row\"\n ref={element => {\n this.sentinelEl = element ?? null;\n }}\n >\n <td class=\"ds-table__load-cell\" colSpan={model.totalColumns}>\n <div class=\"ds-table__viewport-band ds-table__load-band\">\n {error ? (\n <span class=\"ds-table__load-content ds-table__load-content--error\">\n <span class=\"ds-table__load-copy\">\n <ds-icon name=\"ErrorTriangle\" size=\"md\" color=\"secondary\" aria-hidden=\"true\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">{error}</ds-text>\n </span>\n <ds-button-unfilled\n label={this.retryLabel}\n size=\"md\"\n onDsClick={() => this.loadController.request('retry')}\n />\n </span>\n ) : this.loadingMore ? (\n <span class=\"ds-table__load-content\">\n <ds-loader size=\"md\" color=\"secondary\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {this.loadingMoreLabel}\n </ds-text>\n </span>\n ) : this.hasMore && manualFallback ? (\n <span class=\"ds-table__load-content\">\n <ds-button-unfilled\n label={this.loadMoreLabel}\n size=\"md\"\n onDsClick={() => this.loadController.request('manual')}\n />\n </span>\n ) : this.hasMore ? (\n <span class=\"ds-table__auto-sentinel\" aria-hidden=\"true\" />\n ) : (\n <ds-text\n class=\"ds-table__load-content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n >\n {this.endOfResultsLabel}\n </ds-text>\n )}\n </div>\n </td>\n </tr>\n </tbody>\n );\n }\n\n private renderDocumentStickyHeader(model: TableRenderModel) {\n if (!this.documentStickyHeader) return null;\n return (\n <div\n class=\"ds-table__document-sticky-header\"\n >\n <table\n class={{\n 'ds-table__table': true,\n 'ds-table__sticky-header-table': true,\n 'ds-table__table--selectable': model.selectable,\n 'ds-table__table--grouped': model.grouped,\n }}\n style={model.tableStyle}\n role=\"presentation\"\n ref={element => {\n this.stickyHeaderTableEl = element ?? null;\n }}\n >\n {this.renderColgroup(model)}\n {this.renderHeader(model, true, true)}\n </table>\n {this.renderFloatingCollapseAll(model)}\n </div>\n );\n }\n\n private get resultSummary(): string | null {\n if (this.dataMode === 'pagination') return null;\n return formatTableResultSummary(\n this.displayedCount,\n this.totalCount,\n this.resultSummaryLabel,\n );\n }\n\n private get hasResultFooter(): boolean {\n return (this.dataMode === 'pagination' && !!this.pagination) ||\n !!this.resultSummary || !!this.el.querySelector(\n '[slot=\"footer-leading\"], [slot=\"footer\"], [slot=\"footer-trailing\"]',\n );\n }\n\n private renderResultFooter() {\n const summary = this.resultSummary;\n const hasLeading = !!this.el.querySelector('[slot=\"footer-leading\"]');\n const hasCopy = !!this.el.querySelector('[slot=\"footer\"]');\n const hasTrailing = !!this.el.querySelector('[slot=\"footer-trailing\"]');\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (!this.hasResultFooter) return null;\n return (\n <div class=\"ds-table__footer ds-table__bar ds-chrome-header ds-control--md\">\n <div class=\"ds-table__bar-copy ds-chrome-header__copy ds-control--md\">\n {hasLeading && (\n <div class=\"ds-table__bar-status ds-chrome-header__heading\">\n <slot name=\"footer-leading\" />\n </div>\n )}\n {hasCopy ? (\n <slot name=\"footer\" />\n ) : summary ? (\n <ds-text\n class=\"ds-table__footer-summary ds-table__bar-text\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n >\n {summary}\n </ds-text>\n ) : null}\n </div>\n {(pagination || hasTrailing) && (\n <div class=\"ds-table__bar-trailing ds-chrome-header__trailing\">\n {pagination && (\n <ds-pagination\n pageIndex={pagination.pageIndex}\n pageSize={pagination.pageSize}\n pageSizeMode={pagination.pageSizeMode ?? 'fixed'}\n totalItems={pagination.totalItems}\n pageSizeOptions={pagination.pageSizeOptions ?? [25, 50, 100, 200]}\n fitToPage={pagination.fitToPage ?? false}\n fitPageSize={this.fitPageSize ?? pagination.fitPageSize}\n fitPageSizeLabel={pagination.fitPageSizeLabel ?? 'Fit to page'}\n fitPageSizeTriggerLabel={pagination.fitPageSizeTriggerLabel ?? 'Fit'}\n itemLabel={pagination.itemLabel ?? 'items'}\n pageSizeLabel={pagination.pageSizeLabel ?? 'Items'}\n label={pagination.ariaLabel ?? `${this.caption} pagination`}\n loading={this.loading}\n onDsChange={(event: CustomEvent<PaginationChangeDetail>) =>\n this.dsPaginationChange.emit(event.detail)}\n />\n )}\n <slot name=\"footer-trailing\" />\n </div>\n )}\n </div>\n );\n }\n\n private renderCaptionBar() {\n if (this.captionVisibility !== 'visible') return null;\n return (\n <div class=\"ds-table__caption-bar ds-table__bar ds-control--md\">\n <div class=\"ds-table__caption-content\">\n <slot\n name=\"header\"\n onSlotchange={this.syncHeaderSlotPresence}\n />\n {!this.headerPresent ? (\n <ds-text\n class=\"ds-table__caption-title ds-table__bar-text\"\n as=\"div\"\n variant=\"text-title-small\"\n emphasis={true}\n color=\"primary\"\n aria-hidden=\"true\"\n >\n {this.caption}\n </ds-text>\n ) : null}\n </div>\n </div>\n );\n }\n\n render() {\n this.groupSentinelEls.clear();\n const model = this.createRenderModel();\n this.renderedModel = model;\n const regionLabel = this.scrollLabel?.trim() || `${this.caption} scroll area`;\n const initialLoading = this.loading && !model.hasData;\n const initialError = !model.hasData && this.error;\n const hasGroupedStructure = model.grouped && model.groups.length > 0;\n const groupLoadingMore = hasGroupedStructure && this.groups.some(group => group.loadingMore);\n const viewportStyle = !this.boundedComposition && this.resolvedMaxHeight\n ? { '--ds-table-max-block-size': this.resolvedMaxHeight }\n : undefined;\n const hostStyle = this.fixedHeight\n ? { '--_table-fixed-block-size': this.resolvedHeight }\n : undefined;\n\n return (\n <Host\n class={{\n 'table-host': true,\n 'table-host--bounded': this.boundedComposition,\n 'table-host--fixed-height': this.fixedHeight,\n 'table-host--viewport-fit': this.fitViewport,\n }}\n style={hostStyle}\n onKeyDown={(event: KeyboardEvent) => this.handlePaginationKeyDown(event)}\n >\n <div class={{\n 'ds-table': true,\n 'ds-table--bounded': this.boundedComposition,\n 'ds-table--contained-scroll': this.containedScroll,\n 'ds-table--fixed-height': this.fixedHeight,\n 'ds-table--viewport-fit': this.fitViewport,\n 'ds-table--viewport-fit-pending': this.fitViewport && !this.viewportFitSettled,\n 'ds-table--viewport-fit-settled': this.fitViewport && this.viewportFitSettled,\n 'ds-table--sticky-header': this.stickyHeader,\n 'ds-table--document-sticky-header': this.documentStickyHeader,\n 'ds-table--contained-sticky-header': this.stickyHeader && !this.documentStickyHeader,\n 'ds-table--caption-visible': this.captionVisibility === 'visible',\n 'ds-table--footer-visible': this.hasResultFooter,\n }} ref={element => {\n this.rootEl = element ?? null;\n }}>\n {this.renderCaptionBar()}\n <div\n class={{\n 'ds-table__frame': true,\n 'ds-table__frame--overflow-start': this.overflowStart,\n 'ds-table__frame--overflow-end': this.overflowEnd,\n }}\n ref={element => {\n this.frameEl = element ?? null;\n }}\n >\n {this.renderDocumentStickyHeader(model)}\n {this.renderStickyGroup(model)}\n {!this.documentStickyHeader && this.renderFloatingCollapseAll(model)}\n <div\n class={{\n 'ds-table__viewport': true,\n 'ds-focus-ring': this.scrollable,\n }}\n style={viewportStyle}\n ref={element => {\n this.viewportEl = element ?? null;\n }}\n role={this.scrollable ? 'region' : undefined}\n aria-label={this.scrollable ? regionLabel : undefined}\n tabIndex={this.scrollable ? 0 : undefined}\n >\n <table\n class={{\n 'ds-table__table': true,\n 'ds-table__table--selectable': model.selectable,\n 'ds-table__table--grouped': model.grouped,\n 'ds-table__table--native-group-sticky': model.grouped &&\n this.stickyHeader && !this.documentStickyHeader,\n }}\n style={model.tableStyle}\n aria-busy={initialLoading || this.loadingMore || groupLoadingMore ? 'true' : undefined}\n ref={element => {\n this.tableEl = element ?? null;\n }}\n >\n <caption class=\"ds-table__caption ds-visually-hidden\">\n <ds-text as=\"span\" variant=\"text-title-small\" emphasis={true} color=\"primary\">\n {this.caption}\n </ds-text>\n </caption>\n {this.renderColgroup(model)}\n {this.renderHeader(model, !this.documentStickyHeader)}\n {initialLoading\n ? this.renderSkeletonBody(model)\n : initialError\n ? this.renderStateBody('error', model.totalColumns)\n : model.hasData || hasGroupedStructure\n ? this.renderDataBodies(model)\n : this.renderStateBody('empty', model.totalColumns)}\n {!initialLoading && !initialError && this.renderLazyBody(model)}\n </table>\n </div>\n </div>\n {this.renderResultFooter()}\n <div class=\"ds-visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {this.announcement}\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}