@ds-mo/ui 15.11.0 → 15.11.2

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.
Files changed (232) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +1 -1
  4. package/dist/components/THIRD-PARTY-NOTICES +1 -1
  5. package/dist/components/bundled-dependencies.json +1 -1
  6. package/dist/components/ds-agent-questionnaire.js +1 -1
  7. package/dist/components/ds-agent-response.js +1 -1
  8. package/dist/components/ds-banner.js +1 -1
  9. package/dist/components/ds-bar-nav.js +1 -1
  10. package/dist/components/ds-bar-page-title.js +1 -1
  11. package/dist/components/ds-bar-title.js +1 -1
  12. package/dist/components/ds-bar-workflow.js +1 -1
  13. package/dist/components/ds-button-unfilled.js +1 -1
  14. package/dist/components/ds-calendar.js +1 -1
  15. package/dist/components/ds-card-chart.js +1 -1
  16. package/dist/components/ds-card-overview.js +1 -1
  17. package/dist/components/ds-card-setting.js +1 -1
  18. package/dist/components/ds-chart.js +1 -1
  19. package/dist/components/ds-code-block.js +1 -1
  20. package/dist/components/ds-data-customize.js +1 -1
  21. package/dist/components/ds-data-filter.js +1 -1
  22. package/dist/components/ds-data-group.js +1 -1
  23. package/dist/components/ds-data-preferences.js +1 -1
  24. package/dist/components/ds-data-saved-views.js +1 -1
  25. package/dist/components/ds-data-search.js +1 -1
  26. package/dist/components/ds-data-sort.js +1 -1
  27. package/dist/components/ds-filter-menu.js +1 -1
  28. package/dist/components/ds-input-date.js +1 -1
  29. package/dist/components/ds-input-time.js +1 -1
  30. package/dist/components/ds-input.js +1 -1
  31. package/dist/components/ds-markdown.js +1 -1
  32. package/dist/components/ds-menu.js +1 -1
  33. package/dist/components/ds-message-actions.js +1 -1
  34. package/dist/components/ds-message-composer.js +1 -1
  35. package/dist/components/ds-message-scroller.js +1 -1
  36. package/dist/components/ds-mobile-header.js +1 -1
  37. package/dist/components/ds-mobile-section-switcher.js +1 -1
  38. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  39. package/dist/components/ds-modal.js +1 -1
  40. package/dist/components/ds-pagination.js +1 -1
  41. package/dist/components/ds-panel-nav.js +1 -1
  42. package/dist/components/ds-panel-tool-header.js +1 -1
  43. package/dist/components/ds-panel-tool-search.js +1 -1
  44. package/dist/components/ds-panel-tools.js +1 -1
  45. package/dist/components/ds-select.js +1 -1
  46. package/dist/components/ds-shell-app.js +1 -1
  47. package/dist/components/ds-shell-tools.js +1 -1
  48. package/dist/components/ds-table.js +1 -1
  49. package/dist/components/ds-table.js.map +1 -1
  50. package/dist/components/ds-toast.js +1 -1
  51. package/dist/components/ds-tooltip-chart.js +1 -1
  52. package/dist/components/ds-tooltip.js +1 -1
  53. package/dist/components/{p-B9Q7fXxW.js → p-4qKHg502.js} +2 -2
  54. package/dist/components/{p-DixX2_Bd.js → p-529k8euH.js} +2 -2
  55. package/dist/components/{p-CEB8RFih.js → p-BI6L3JoU.js} +2 -2
  56. package/dist/components/p-BjYoM1f8.js +2 -0
  57. package/dist/components/{p-BqIRExej.js.map → p-BjYoM1f8.js.map} +1 -1
  58. package/dist/components/p-BkKdzYZP.js +2 -0
  59. package/dist/components/{p-B5rN3slq.js.map → p-BkKdzYZP.js.map} +1 -1
  60. package/dist/components/{p-DKG26pp5.js → p-BrJebF5t.js} +2 -2
  61. package/dist/components/{p-y2Sdv9M3.js → p-BvlkO__o.js} +2 -2
  62. package/dist/components/{p-DvMCOJwc.js → p-C31AjGbg.js} +2 -2
  63. package/dist/components/{p-DwFnt0W0.js → p-C4kVTIBc.js} +2 -2
  64. package/dist/components/{p-BNnw_O4e.js → p-C6VWVB87.js} +2 -2
  65. package/dist/components/{p-CaNMVLhm.js → p-CC4X8rpT.js} +2 -2
  66. package/dist/components/{p-S5QCVAdH.js → p-CJ-igzsZ.js} +2 -2
  67. package/dist/components/{p-D-cZ6cRI.js → p-CTstnsLe.js} +2 -2
  68. package/dist/components/{p-Ba-dSshd.js → p-CXF8wj9I.js} +2 -2
  69. package/dist/components/{p-OFJpWJcN.js → p-Cqg9T781.js} +2 -2
  70. package/dist/components/p-D0kzIzGQ.js +2 -0
  71. package/dist/components/p-D0kzIzGQ.js.map +1 -0
  72. package/dist/components/p-DEJLfD7k.js +2 -0
  73. package/dist/components/p-DEJLfD7k.js.map +1 -0
  74. package/dist/components/{p-BkajUPiA.js → p-DHmHllUM.js} +2 -2
  75. package/dist/components/p-DNtwJJOC.js +2 -0
  76. package/dist/components/p-DNtwJJOC.js.map +1 -0
  77. package/dist/components/{p-DfwvHxYi.js → p-DXEInGEq.js} +2 -2
  78. package/dist/components/{p-DGDF4NMV.js → p-DcVK0W4X.js} +2 -2
  79. package/dist/components/{p-Cxk1A7Sx.js → p-Ds58qo_J.js} +2 -2
  80. package/dist/components/{p-CMrHRjjH.js → p-DwcAROOo.js} +2 -2
  81. package/dist/components/{p-CW-7vLUB.js → p-DxVokKm8.js} +2 -2
  82. package/dist/components/{p-CqW2eyiF.js → p-E0RqkUNq.js} +2 -2
  83. package/dist/components/p-HNktxWtF.js +2 -0
  84. package/dist/components/p-HNktxWtF.js.map +1 -0
  85. package/dist/components/{p-DfzXyVoM.js → p-YE1r-XSR.js} +2 -2
  86. package/dist/components/{p-CeXf9-X3.js → p-mSCnWLhL.js} +2 -2
  87. package/dist/components/{p-C8D853vs.js → p-vrRbdZAI.js} +2 -2
  88. package/dist/docs/components.json +16 -16
  89. package/dist/mcp-data/registry/agent-activity.json +2 -2
  90. package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
  91. package/dist/mcp-data/registry/agent-response.json +2 -2
  92. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  93. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  94. package/dist/mcp-data/registry/attachment-list.json +2 -2
  95. package/dist/mcp-data/registry/avatar.json +2 -2
  96. package/dist/mcp-data/registry/badge.json +2 -2
  97. package/dist/mcp-data/registry/banner.json +2 -2
  98. package/dist/mcp-data/registry/bar-action.json +2 -2
  99. package/dist/mcp-data/registry/bar-nav.json +2 -2
  100. package/dist/mcp-data/registry/bar-page-title.json +2 -2
  101. package/dist/mcp-data/registry/bar-title.json +2 -2
  102. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  103. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  104. package/dist/mcp-data/registry/button-filled.json +2 -2
  105. package/dist/mcp-data/registry/button-inverted.json +2 -2
  106. package/dist/mcp-data/registry/button-unfilled.json +2 -2
  107. package/dist/mcp-data/registry/calendar.json +2 -2
  108. package/dist/mcp-data/registry/card-action-center.json +2 -2
  109. package/dist/mcp-data/registry/card-chart.json +2 -2
  110. package/dist/mcp-data/registry/card-navigation.json +2 -2
  111. package/dist/mcp-data/registry/card-overview.json +2 -2
  112. package/dist/mcp-data/registry/card-setting.json +2 -2
  113. package/dist/mcp-data/registry/card-settings-scope.json +2 -2
  114. package/dist/mcp-data/registry/chart-legend.json +2 -2
  115. package/dist/mcp-data/registry/chart.json +2 -2
  116. package/dist/mcp-data/registry/checkbox-group.json +2 -2
  117. package/dist/mcp-data/registry/checkbox.json +2 -2
  118. package/dist/mcp-data/registry/chip.json +2 -2
  119. package/dist/mcp-data/registry/code-block.json +2 -2
  120. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  121. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  122. package/dist/mcp-data/registry/conversation-list.json +2 -2
  123. package/dist/mcp-data/registry/data-customize.json +2 -2
  124. package/dist/mcp-data/registry/data-filter.json +2 -2
  125. package/dist/mcp-data/registry/data-group.json +2 -2
  126. package/dist/mcp-data/registry/data-preferences.json +2 -2
  127. package/dist/mcp-data/registry/data-saved-views.json +2 -2
  128. package/dist/mcp-data/registry/data-search.json +2 -2
  129. package/dist/mcp-data/registry/data-sort.json +2 -2
  130. package/dist/mcp-data/registry/data-toolbar.json +2 -2
  131. package/dist/mcp-data/registry/divider.json +2 -2
  132. package/dist/mcp-data/registry/empty-state.json +2 -2
  133. package/dist/mcp-data/registry/field.json +2 -2
  134. package/dist/mcp-data/registry/filter-menu.json +2 -2
  135. package/dist/mcp-data/registry/icon.json +2 -2
  136. package/dist/mcp-data/registry/inline-banner-settings.json +2 -2
  137. package/dist/mcp-data/registry/input-date.json +3 -3
  138. package/dist/mcp-data/registry/input-time.json +3 -3
  139. package/dist/mcp-data/registry/input.json +2 -2
  140. package/dist/mcp-data/registry/loader.json +2 -2
  141. package/dist/mcp-data/registry/map-cluster-marker.json +2 -2
  142. package/dist/mcp-data/registry/map-entity-marker.json +2 -2
  143. package/dist/mcp-data/registry/map-marker.json +2 -2
  144. package/dist/mcp-data/registry/markdown.json +2 -2
  145. package/dist/mcp-data/registry/menu.json +2 -2
  146. package/dist/mcp-data/registry/message-actions.json +2 -2
  147. package/dist/mcp-data/registry/message-bubble.json +2 -2
  148. package/dist/mcp-data/registry/message-composer.json +2 -2
  149. package/dist/mcp-data/registry/message-scroller.json +2 -2
  150. package/dist/mcp-data/registry/message.json +2 -2
  151. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  152. package/dist/mcp-data/registry/mobile-header.json +2 -2
  153. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  154. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  155. package/dist/mcp-data/registry/modal.json +2 -2
  156. package/dist/mcp-data/registry/navigation-tab-group.json +2 -2
  157. package/dist/mcp-data/registry/pagination.json +2 -2
  158. package/dist/mcp-data/registry/panel-nav.json +2 -2
  159. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  160. package/dist/mcp-data/registry/panel-tool-header.json +2 -2
  161. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  162. package/dist/mcp-data/registry/panel-tools.json +2 -2
  163. package/dist/mcp-data/registry/paper-texture.json +2 -2
  164. package/dist/mcp-data/registry/radio-tile.json +2 -2
  165. package/dist/mcp-data/registry/radio.json +2 -2
  166. package/dist/mcp-data/registry/registry.json +2 -2
  167. package/dist/mcp-data/registry/score.json +2 -2
  168. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  169. package/dist/mcp-data/registry/select-toggle.json +2 -2
  170. package/dist/mcp-data/registry/select.json +2 -2
  171. package/dist/mcp-data/registry/setting-row-checkbox.json +2 -2
  172. package/dist/mcp-data/registry/setting-row-radio.json +2 -2
  173. package/dist/mcp-data/registry/setting-row-toggle.json +2 -2
  174. package/dist/mcp-data/registry/shell-app.json +2 -2
  175. package/dist/mcp-data/registry/shell-page.json +2 -2
  176. package/dist/mcp-data/registry/shell-tools.json +2 -2
  177. package/dist/mcp-data/registry/skeleton.json +2 -2
  178. package/dist/mcp-data/registry/slider.json +2 -2
  179. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  180. package/dist/mcp-data/registry/switch.json +2 -2
  181. package/dist/mcp-data/registry/tab-group.json +2 -2
  182. package/dist/mcp-data/registry/table.json +14 -4
  183. package/dist/mcp-data/registry/tag.json +2 -2
  184. package/dist/mcp-data/registry/text.json +2 -2
  185. package/dist/mcp-data/registry/textarea.json +2 -2
  186. package/dist/mcp-data/registry/time-picker.json +2 -2
  187. package/dist/mcp-data/registry/toast.json +2 -2
  188. package/dist/mcp-data/registry/tooltip-chart.json +2 -2
  189. package/dist/mcp-data/registry/tooltip.json +2 -2
  190. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  191. package/dist/types/components/InputDate/InputDate.d.ts +5 -6
  192. package/dist/types/components/InputTime/InputTime.d.ts +5 -6
  193. package/dist/types/components/Table/Table.d.ts +5 -48
  194. package/dist/types/components/Table/table-caption-controller.d.ts +54 -0
  195. package/dist/types/components/Table/table-cell-editor.d.ts +1 -1
  196. package/dist/types/components/Table/table-editing-controller.d.ts +37 -0
  197. package/dist/types/utils/picker-popup-controller.d.ts +24 -0
  198. package/dist/types/utils/select-controller.d.ts +1 -0
  199. package/package.json +6 -6
  200. package/dist/components/p-B5rN3slq.js +0 -2
  201. package/dist/components/p-BT6xQogY.js +0 -2
  202. package/dist/components/p-BT6xQogY.js.map +0 -1
  203. package/dist/components/p-BqIRExej.js +0 -2
  204. package/dist/components/p-CPNA8raE.js +0 -2
  205. package/dist/components/p-CPNA8raE.js.map +0 -1
  206. package/dist/components/p-Djkk338n.js +0 -2
  207. package/dist/components/p-Djkk338n.js.map +0 -1
  208. package/dist/types/utils/cartesian-chart-layout.d.ts +0 -13
  209. package/dist/types/utils/chart-viewport-controller.d.ts +0 -21
  210. /package/dist/components/{p-B9Q7fXxW.js.map → p-4qKHg502.js.map} +0 -0
  211. /package/dist/components/{p-DixX2_Bd.js.map → p-529k8euH.js.map} +0 -0
  212. /package/dist/components/{p-CEB8RFih.js.map → p-BI6L3JoU.js.map} +0 -0
  213. /package/dist/components/{p-DKG26pp5.js.map → p-BrJebF5t.js.map} +0 -0
  214. /package/dist/components/{p-y2Sdv9M3.js.map → p-BvlkO__o.js.map} +0 -0
  215. /package/dist/components/{p-DvMCOJwc.js.map → p-C31AjGbg.js.map} +0 -0
  216. /package/dist/components/{p-DwFnt0W0.js.map → p-C4kVTIBc.js.map} +0 -0
  217. /package/dist/components/{p-BNnw_O4e.js.map → p-C6VWVB87.js.map} +0 -0
  218. /package/dist/components/{p-CaNMVLhm.js.map → p-CC4X8rpT.js.map} +0 -0
  219. /package/dist/components/{p-S5QCVAdH.js.map → p-CJ-igzsZ.js.map} +0 -0
  220. /package/dist/components/{p-D-cZ6cRI.js.map → p-CTstnsLe.js.map} +0 -0
  221. /package/dist/components/{p-Ba-dSshd.js.map → p-CXF8wj9I.js.map} +0 -0
  222. /package/dist/components/{p-OFJpWJcN.js.map → p-Cqg9T781.js.map} +0 -0
  223. /package/dist/components/{p-BkajUPiA.js.map → p-DHmHllUM.js.map} +0 -0
  224. /package/dist/components/{p-DfwvHxYi.js.map → p-DXEInGEq.js.map} +0 -0
  225. /package/dist/components/{p-DGDF4NMV.js.map → p-DcVK0W4X.js.map} +0 -0
  226. /package/dist/components/{p-Cxk1A7Sx.js.map → p-Ds58qo_J.js.map} +0 -0
  227. /package/dist/components/{p-CMrHRjjH.js.map → p-DwcAROOo.js.map} +0 -0
  228. /package/dist/components/{p-CW-7vLUB.js.map → p-DxVokKm8.js.map} +0 -0
  229. /package/dist/components/{p-CqW2eyiF.js.map → p-E0RqkUNq.js.map} +0 -0
  230. /package/dist/components/{p-DfzXyVoM.js.map → p-YE1r-XSR.js.map} +0 -0
  231. /package/dist/components/{p-CeXf9-X3.js.map → p-mSCnWLhL.js.map} +0 -0
  232. /package/dist/components/{p-C8D853vs.js.map → p-vrRbdZAI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":["TRUNCATION_EPSILON_PX","isElementTruncated","element","target","querySelector","scrollWidth","clientWidth","scrollHeight","clientHeight","TABLE_COLUMN_WIDTH_TOKENS","xs","sm","md","lg","xl","TABLE_IMAGE_COLUMN_WIDTH_VARIABLES","isTableCellText","value","isTableCellPrimaryText","kind","isTableCellTag","isTableCellTags","isTableCellIcon","isTableCellIconText","isTableCellScoreText","isTableCellImage","isTableCellAction","isTableCellEmpty","isTableCellBlank","tableCellPrimary","label","items","map","item","join","primary","alt","ariaLabel","tableRowSelectionLabel","row","columns","explicit","selectionLabel","trim","column","cells","id","String","nextDataSortState","current","fieldId","direction","toggleTableGroupCollapsed","collapsedGroupIds","groupId","next","Set","has","delete","add","nextTableGroupsCollapsed","groupIds","length","collapsed","allCollapsed","every","tableCollapseAllHost","undefined","index","columnId","mode","clampTableColumnSize","size","Number","isFinite","minimum","minSize","maximum","maxSize","Math","max","POSITIVE_INFINITY","min","tableColumnSize","width","imageTracks","tableElasticSpacerIndex","some","sticky","tableExplicitMinWidth","widths","filter","tableRows","rows","groups","grouped","flatMap","group","canSelectRow","selectable","disabled","deriveTableSelectionState","selectedRowIds","selected","Array","isArray","selectableRowIds","selectedLoadedCount","reduce","count","allSelected","indeterminate","toggleTableRowSelection","toggleAllLoadedTableRows","loadedRows","state","toggleTableGroupSelection","groupRows","resolvedTableGroupCount","total","totalCount","TABLE_GROUP_ACCESSORY_LIMIT","tableGroupAccessories","resolved","accessories","text","help","push","TABLE_GROUP_HERO_SCORE_PRESENTATION","variant","tableGroupHero","hero","isSafetyScoreLevel","level","tracks","isLoading","TABLE_GROUP_INTENTS","isTableGroupIntent","includes","tableGroupIntentClass","intent","tableGroupLabelColor","formatTableResultSummary","displayed","locale","normalizedTotal","trunc","normalizedDisplayed","formatter","numberFormatter","replace","format","formatTableTotalSummary","isOwnedTableFooterSlot","node","host","parentElement","insideTableFooter","ancestor","hasAttribute","classList","contains","hasOwnedTableFooterSlot","slotName","querySelectorAll","tableModelIssues","issues","columnIds","accessibleLabel","accessoryCount","rowIds","createTableRenderModel","input","selectionMode","allGroupsCollapsed","showCollapseAll","explicitMinWidth","elasticSpacerIndex","columnTracks","splice","gridTracks","tableStyle","hasData","selection","loadedCount","showTotalOnly","groupCountPresentation","totalLabel","countLabel","visibleCountText","intentClass","labelColor","totalColumns","collapseAllHost","actionMenuSeq","nextTableActionMenuElementId","isTableCellActionMenu","isRenderableTableActionMenu","tableActionMenuSections","sections","flush","entry","actionId","isInactive","isDestructive","tableActionTriggerId","menuId","rowId","sanitizeId","tableDataModeSwitcherSequence","nextTableDataModeSwitcherElementId","tableDataModeMenuItems","dataMode","labels","infinite","isSelected","pagination","virtual","tableDataModeFromMenuItem","TABLE_TRUNCATE_ATTR","isValidTruncateTrack","track","closest","resolveTableTruncateTrack","Element","Node","fromAncestor","link","nested","tableTruncateLabel","textContent","TABLE_CELL_TEXT_RUN_LIMIT","trackText","resolveTableCellImageTracks","tableCellImageVariant","resolveTableCellTagsTracks","floor","tableCellTrackStackBlockSize","normalizeTableCellTextTrack","runs","run","color","resolveTableCellTextOverflow","source","wrap","maxLines","wraps","lineClamp","tableCellTextOverflowProps","lineTruncation","resolveTextPresentation","options","secondary","tertiary","allowTertiary","secondaryColor","tertiaryColor","href","fontFeature","singleLine","primaryText","overflow","resolveTableCellPresentation","cellType","icon","iconColor","iconLabel","score","scoreLevel","scoreLabel","scoreLoading","inline","slice","TABLE_NO_HIGHLIGHT_MATCHER","match","escapeRegExp","createTableHighlightMatcher","terms","normalizedTerms","from","Map","term","Boolean","toLocaleLowerCase","values","sort","left","right","expression","RegExp","segments","cursor","lastIndex","matchAll","renderTableRow","pins","spans","headerId","responsiveCards","cellAttributes","renderEditor","renderEditTrigger","grid","model","visibleColumns","emptyCellLabel","actionMenuElementId","actionMenu","actionMenuSurface","highlightMatcher","highlightFieldIds","surfaceOpenRowId","ariaRowIndex","variableVirtualSize","intrinsicBlockSize","rowKey","renderSelectionControl","renderStickyEdge","onRowActivate","onRowKeyDown","onRowSelection","onCellAction","onActionMenuToggle","surfaceOpen","interactive","rowSelectable","rowInteractive","beforeSpacer","afterSpacer","cardActions","firstDataColumn","find","renderColumn","span","get","lastPin","firstPin","layout","style","edge","renderTableCell","afterCoveredColumn","indexOf","cardActionIndex","cardActionDivider","attributes","editor","editTrigger","h","key","class","tabIndex","onClick","event","onKeyDown","pin","role","align","decoration","cellPresentation","cell","tagCell","tagsCell","iconCell","iconTextCell","scoreTextCell","imageCell","actionCell","actionMenuCell","textCell","primaryTextCell","singleTextCell","emptyCell","blankCell","tagVariant","tagsVariant","textVariant","imageVariant","iconTextVariant","scoreTextVariant","colSpan","rowSpan","headers","gridColumn","columnStart","verticalAlign","highlight","borders","as","renderTableCellValue","type","name","flag","renderTextCopy","src","loading","menu","triggerId","expanded","isInset","insetDepth","hasBorder","hasMenu","controls","onDsClick","stopPropagation","detail","tag","contrast","rounded","renderHighlightedText","tableCellFieldMatcher","resolveSafeUrl","truncateAttr","rel","renderTextTrack","defaultColor","wholeColor","highlightMatcherForRun","runIndex","trackClass","colorFor","renderRun","className","copy","side","wrapLabel","matcher","segment","fieldIndex","sortKey","assignTableVirtualRowPoolKeys","nodes","desiredIds","freeSlots","slot","slotsByRowId","keys","shift","nextSlot","set","TableBodyRenderer","constructor","this","virtualLookupCache","virtualRowPoolStates","resetVirtualState","clear","render","plan","renderVirtualBodies","renderRow","groupModel","isCollapsed","stickySourceHidden","documentStickyHeader","activeStickyGroupId","loadingMore","stickyHeader","scope","renderGroupContent","renderGroupLoadRow","renderVirtualSpacer","renderVirtualRow","rowsById","variableSize","virtualRowPoolKeys","renderVirtualGroup","groupsById","rowKeys","headerIndex","headerRowCount","child","lookup","activeGroupScopes","tablePinnedColumns","result","pinned","ordered","reverse","sizes","entries","tableHeaderBands","spacer","lanes","unshift","bands","previous","last","lastColumnId","start","firstColumnId","tableSpanModel","hasRowSpans","rowIndex","columnIndex","contiguous","ids","indices","end","invalid","windowed","ri","ci","tableGridModel","firstEditable","tableEditable","rowIndices","columnIndices","tableNextEditable","address","backwards","dr","dc","tableRangeBounds","range","r1","anchor","r2","focus","c1","c2","firstRow","lastRow","firstColumn","lastColumn","tableEditValue","required","minLength","maxLength","option","parseLooseCalendarDate","parseLooseClockTime","isClockTimeStepAligned","step","abs","round","tablePasteChanges","records","split","line","record","changes","textValue","targetRow","targetColumn","renderTableCellEditor","change","common","hasInteractionFill","onDsChange","searchable","hasFocusRing","hourFormat","resize","showStepper","renderTableSkeletonBody","skeletonRows","_","controlSize","renderSkeletonCell","skeleton","lines","iconText","scoreText","image","action","blank","renderSkeletonCellContent","iconSize","iconOnly","primaryWidth","secondaryWidth","tertiaryWidth","renderTableLoadContent","error","retryLabel","onRetry","loadingLabel","hasMore","manualFallback","loadMoreLabel","loadMoreAriaLabel","onLoadMore","endOfResultsLabel","TABLE_CARD_VIEWPORT_BREAKPOINT","isTableCardViewport","inlineSize","resolveTableLayoutMetrics","horizontalOverflow","scrollInlineSize","viewportInlineSize","visibleInlineSize","scrollInlineOffset","scrollable","scrollBlockSize","viewportBlockSize","inlineOffset","maxInlineOffset","collapseBlockOffset","collapseHeadBlockStart","collapseFrameBlockStart","TableLayoutController","connected","connectedViewport","connectedContentTable","resizeObserver","frame","maxBlockOffset","lastMode","schedule","requestAnimationFrame","sync","handleScroll","viewport","clampInlineOffset","clampVerticalOverscroll","clampBlockOffset","scrollLeft","floatingCollapseAll","handleWheel","deltaX","deltaY","atStart","atEnd","preventDefault","scrollTop","verticalEdgeWheel","connect","refresh","disconnect","cancelAnimationFrame","removeEventListener","forceGeometry","contentTable","elements","elementsChanged","addEventListener","passive","ResizeObserver","observe","modeChanged","clamped","measureCollapse","collapseAllOverlay","interactiveHead","metrics","getBoundingClientRect","top","pinnedCells","pinnedSize","crowded","getAttribute","setAttribute","setProperty","stickyHeaderTable","overflowChanged","property","getPropertyValue","TableLoadController","intersectionSupported","IntersectionObserver","intersectionObserver","observedSentinel","requestPending","requestedRowCount","previousLoadedRowCount","initialize","loadedRowCount","disconnectObserver","lazyLoading","loadMoreMode","loadMoreError","sentinel","threshold","loadMoreThreshold","isIntersecting","request","root","containedScroll","rootMargin","structureChanged","resetRequest","dataChanged","nextCount","added","announce","rowsLoadedLabel","identityChanged","configurationChanged","loadingChanged","loadingMoreLabel","errorChanged","hasMoreChanged","hadMore","reason","loadIdentity","groupIdentity","formatGroupLabel","template","TableGroupLoadController","snapshots","pending","createSnapshots","enabled","dataset","sentinels","nextSnapshots","snapshot","identity","TABLE_VIRTUAL_ROW_TRACK_SIZE","TABLE_VIRTUAL_LATER_TRACK_INCREMENT","tableVirtualRowTrackSize","TABLE_VIRTUAL_MIN_OVERSCAN_ROWS","TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING","TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY","TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL","tableCellTrackCount","presentation","variantTracks","estimateTableRowBlockSize","tableVirtualRowMetrics","estimatedSize","flattenTableVirtualItems","tableVirtualOverscanPx","viewportSize","buildTableVirtualPrefixSums","prefix","findTableVirtualIndexAtOffset","offset","low","high","mid","tableVirtualItemSizes","measures","sameTableVirtualPlan","totalSize","itemCount","mountedIndexes","sameVirtualNodes","a","b","createTableVirtualIndex","groupHeaderIndexes","headerIndexByGroup","groupEndByHeader","rowIndexById","itemIndexById","activeHeaderIndex","hasVariableSize","itemIndex","resolveTableVirtualPlanFromIndex","empty","mountedIds","overscan","trailingOverscan","before","scrollDirection","after","scrollOffset","rangeStart","rangeEnd","mounted","pinHeader","mountedIndex","nextHeader","firstTableVirtualIndexAfter","pinnedRowIds","mountedSorted","buildGroupedVirtualNodes","buildFlatVirtualNodes","resolveTableVirtualPlan","indexes","middle","spacerSize","trailingSize","selectedHeaders","header","groupEnd","leadingSize","groupNodes","mountedMembers","memberCursor","memberIndex","MEASURE_EPSILON_PX","measuredItemSize","blockSize","parseFloat","getComputedStyle","marginBlockEnd","TableVirtualController","measurementObserver","measurementTargets","viewportWidth","measuredIds","indexedItems","indexDirty","scrollAtEnd","pendingReset","raf","handleViewportResize","candidate","contentRect","height","sizeChanged","invalidateMeasures","nextOffset","callback","setTimeout","caf","handle","clearTimeout","cancelFrame","unbindViewport","emit","resetToTop","sizeFor","currentPlan","currentViewportSize","scrollRowIntoView","contentOffset","stickyInset","ensureIndex","groupHeaderIndex","groupInset","leadingInset","itemStart","itemEnd","currentOffset","visibleStart","visibleEnd","maxOffset","collectMeasurements","painted","syncMeasurementTargets","measurements","forEach","applyMeasurements","currentIndex","prefixBefore","anchorIndex","anchorOffset","changed","prefixAfter","nextAnchor","delta","borderBoxSize","unobserve","windowChanged","itemIds","resolveTableFitPageSize","headerBlockSize","itemBlockSize","availableBlockSize","DIRECTIONAL_TAGS","DIRECTIONAL_ROLES","paginationShortcutBlockedByPath","path","tagName","isContentEditable","isDocumentRootNode","nodeType","composedContains","descendant","seen","composedParent","shouldHandleContainingPagePaginationShortcut","origin","eventPath","table","ShadowRoot","assignedSlot","parentNode","getRootNode","resolveTableViewportFitMetrics","insetBlockStart","insetBlockEnd","scrollportBlockEnd","scrollportBlockStart","scrollportBlockSize","settledBlockStart","reservedBlockSize","currentBlockStart","hostBlockStart","currentBlockSize","settled","TableViewportFitController","connectedHost","connectedSurface","scrollRoot","ancestorMutationObserver","connectionFrame","surface","hostRect","scrollportRect","HTMLElement","window","innerHeight","insets","resolveCssLengthPx","blockStart","blockEnd","fitChanged","disconnectRuntime","clearGeometry","nextScrollRoot","findScrollRoot","rootChanged","observeAncestorInsets","insetsChanged","scrollOuterBy","scrollingElement","document","scrollY","documentElement","scrollTo","behavior","MutationObserver","observer","removeProperty","overflowY","focusRingCss","interactionFillCss","tableCss","TABLE_FOOTER_SLOT_LEADING","TABLE_FOOTER_SLOT_COPY","TABLE_FOOTER_SLOT_TRAILING","TABLE_NON_VIRTUAL_WINDOW_THRESHOLD","Table","__stencil_proxyCustomElement","registerHost","responsiveLayout","chromeLayout","cellSpans","interactionMode","cellRange","customizeOptions","grouping","highlightTerms","captionVisibility","alternateView","columnCustomizer","captionControlsBorderless","hideColumnCustomizerTrigger","hiddenFieldIds","fieldOrder","pinnedFieldIds","resultSummaryLabel","resultTotalSummaryLabel","fitViewport","viewportInsetBlockStart","viewportInsetBlockEnd","chromeLoading","emptyHeading","emptyBody","errorHeading","errorBody","dataModeSwitcher","dataModeSwitcherLabel","dataModeMenuLabel","infiniteModeLabel","paginationModeLabel","virtualModeLabel","groupLoadMoreLabel","groupLoadMoreAriaLabel","groupRetryLabel","groupLoadingMoreLabel","groupEndOfResultsLabel","groupRowsLoadedLabel","overflowStart","overflowEnd","announcement","viewportFitSettled","headerPresent","headerUsesToolbar","captionTrailingPresent","footerSlotPresence","actionMenuInitialFocusVisible","truncateTooltipLabel","captionCompact","narrowViewport","columnCustomizerOpen","columnCustomizerSurfaceOpen","columnCustomizerInitialFocusVisible","dataModeSwitcherOpen","dataModeSwitcherSurfaceOpen","dataModeSwitcherInitialFocusVisible","virtualWindow","activeCell","editingCell","editDraft","columnCustomizerElementId","nextTableColumnCustomizerElementId","dataModeSwitcherElementId","truncateAnchor","truncateTooltipBound","focusedRowId","virtualRenderFocus","renderedAlternateView","virtualItems","visibleColumnsCache","renderModelCache","highlightMatcherCache","virtualItemsCache","rootEl","viewportEl","frameEl","interactiveHeadEl","collapseAllOverlayEl","stickyHeaderTableEl","tableEl","sentinelEl","incrementalWindowActive","groupSentinelEls","previousModelWarning","modelWarningQueued","hasLoaded","renderedModel","stickyGroupConnected","headerSlotObserver","footerSlotObserver","fitResizeObserver","fitObservedViewport","fitObservedTable","fitMeasurementPending","cardViewportQuery","bodyRenderer","layoutController","viewportFitController","loadController","currentLoadedRowCount","message","dsLoadMore","groupLoadController","dsGroupLoadMore","virtualController","rowWindowingEnabled","virtualPinnedRowIds","estimateVirtualViewportSize","el","handleCardViewportChange","matches","syncHeaderSlotPresence","syncFooterSlotPresence","presence","updateStickyGroup","bottom","activeGroupId","activeGroupTop","body","sourceRect","bodyRect","frameRect","syncFitPageSize","fitToPage","fitToPageInactive","fitPageSize","pageSizeMode","pageSize","pageIndex","dsPaginationChange","totalItems","pageSizeOptions","fitPageSizeLabel","fitPageSizeTriggerLabel","itemLabel","pageSizeLabel","caption","showFirstLastButtons","previousPageIndex","previousPageSize","previousPageSizeMode","onTruncatePointerOver","pointerType","presentOrDismissTruncateTrack","onTruncatePointerOut","relatedTarget","dismissTruncateTooltip","onTruncateFocusIn","onTruncateFocusOut","onVirtualFocusIn","gridEnabled","editingEnabled","gridModel","gridModelCache","gridAddress","selectCell","extend","isEditableAddress","dsCellRangeChange","focusCell","nextAnimationFrame","findRenderedRow","CSS","escape","setFocus","beginCellEdit","initial","async","control","componentOnReady","isConnected","select","handleGridKeyDown","altKey","metaKey","ctrlKey","isComposing","shiftKey","handleGridClipboard","clipboardData","getData","dsCellsChange","bounds","setData","renderCellEditor","commit","onFocusout","wrapper","currentTarget","activeElement","defaultPrevented","checkValidity","validity","stepMismatch","reportValidity","queueMicrotask","renderCellEditTrigger","pressScale","gridCellAttributes","editable","editing","active","structure","createRenderModel","cached","structureCache","merges","encodeURIComponent","columnBandId","findIndex","lane","band","componentWillLoad","connectCardViewportQuery","hasIncrementalState","componentDidLoad","syncStickyGroupConnection","connectHeaderSlotObserver","connectFooterSlotObserver","connectFitObserver","connectCaptionCompactObserver","connectTruncateTooltip","scheduleInitialModelIssueWarning","componentWillRender","componentDidRender","retainedFocus","ownerDocument","preventScroll","dsAlternateViewRendered","headerSize","tHead","revealed","revealRenderedRow","connectedCallback","disconnectedCallback","disconnectStickyGroup","disconnectFitObserver","disconnectCaptionCompactObserver","disconnectTruncateTooltip","disconnectCardViewportQuery","closeColumnCustomizer","initialModelWarningFrame","matchMedia","query","narrow","innerWidth","childList","subtree","attributeFilter","connectStickyGroup","capture","handleStructureChange","scheduleModelIssueWarning","handleDataChange","syncActionMenu","handleTotalCountChange","handleCaptionChange","handleLoadIdentityChange","handleVirtualIndexReset","handleLazyConfigurationChange","handleDataModeChange","handlePaginationChange","fitIdentity","handleLoadingMoreChange","handleLoadMoreErrorChange","handleHasMoreChange","handleColumnCustomizerAvailability","showsColumnCustomizer","handleDataModeSwitcherAvailability","showsDataModeSwitcher","closeDataModeSwitcher","handleChromeLoadingChange","resolveTableVisibleColumns","showsCaptionTrailing","fixedHeight","resolvedHeight","boundedComposition","resolvedMaxHeight","captionCompactDisconnect","observeTableCaptionCompact","compact","handleWindowPaginationKeyDown","handlePaginationKeyDown","fromWindow","composedPath","originNode","Text","resolvePaginationState","totalPages","currentLoadedRows","virtualCounts","hasVirtualViewportBounds","virtualViewportMissing","measured","chrome","hasResultFooter","toLowerCase","scrollIntoView","block","viewportRect","rowRect","groupRow","position","Promise","resolve","syncVirtualItems","shouldWindowRows","maxHeight","warnModelIssues","groupingColumn","sortColumn","stickyStart","stickyEnd","console","warn","emitSort","sortable","dsSortChange","sortButtonLabel","emitRowSelection","dsSelectionChange","changedRowId","emitAllSelection","emitGroupSelection","rowEventOwnsActivation","groupRowEventOwnsCollapse","handleGroupRowClick","emitGroupCollapse","emitRowActivation","dsRowActivate","closeActionMenu","handleActionMenuSelect","open","dsCellAction","trigger","toggleActionMenu","renderOverflowActionMenu","anchorId","menuLabel","initialFocusVisible","onDsClose","onDsAfterClose","onDsSelect","truncateTooltipEl","presentFrom","dismiss","renderTruncateTooltip","ref","describedBy","delay","handleRowKeydown","checked","onActivate","shadow","renderCollapseAllButton","activeFill","emitAllGroupsCollapse","renderFloatingCollapseAll","renderColumnHeader","presentational","headerLane","groupedColumn","previousColumn","activeMemberSegment","activeMemberSort","activeSort","memberAriaSort","segmentActive","segmentInteractive","emphasis","dataLabel","separator","labelControl","sortControl","isActive","collapseHost","actionCollapseHost","blankActionCollapseHost","collapseControl","spanning","gridRow","renderColgroup","renderHeader","multirow","selectionHeader","renderLane","renderTableRowView","dsGroupCollapseChange","renderGroupAccessory","groupSelection","heroTracks","heroPresentation","formatGroupLoadLabel","renderStickyGroup","renderDataBodies","renderModel","renderSkeletonBody","renderStateBody","heading","renderLazyBody","renderDocumentStickyHeader","resultSummary","displayedCount","renderResultFooter","summary","hasLeading","hasCopy","hasTrailing","onSlotchange","renderCaptionBar","renderCaptionTrailing","renderColumnCustomizerTrigger","orientation","renderDataModeSwitcherTrigger","toggleDataModeSwitcher","renderDataModeSwitcherMenu","handleDataModeSwitcherSelect","fromKeyboard","openDataModeSwitcher","dsDataModeChange","labelEmphasis","haspopup","toggleColumnCustomizer","renderColumnCustomizerMenu","tableColumnCustomizerSections","dsCustomizeOptionChange","handleColumnCustomizerSelect","onDsItemToggle","handleColumnCustomizerAction","onDsReorder","handleColumnCustomizerReorder","openColumnCustomizer","emitColumnsConfigChange","dsFieldsConfigChange","resolveTableFieldsConfiguration","order","reorderable","reorderTableColumnPartition","toggleTableColumnPinned","toggleTableColumnHidden","regionLabel","scrollLabel","initialLoading","initialError","hasGroupedStructure","windowRows","virtualPlan","groupLoadingMore","viewportStyle","hostStyle","Host","onCopy","onPaste","onFocusin"],"sources":["src/wc/utils/is-element-truncated.ts","src/wc/components/Table/table-model.ts","src/wc/components/Table/table-render-model.ts","src/wc/components/Table/table-action-menu.ts","src/wc/components/Table/table-data-mode-switcher.ts","src/wc/components/Table/table-truncate.ts","src/wc/components/Table/table-cell-model.ts","src/wc/components/Table/table-highlight.ts","src/wc/components/Table/table-row-view.tsx","src/wc/components/Table/table-body-renderer.tsx","src/wc/components/Table/table-structure.ts","src/wc/components/Table/table-grid-model.ts","src/wc/components/Table/table-cell-editor.tsx","src/wc/components/Table/table-skeleton-view.tsx","src/wc/components/Table/table-load-view.tsx","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-virtual-model.ts","src/wc/components/Table/table-virtual-controller.ts","src/wc/components/Table/table-pagination-fit.ts","src/wc/components/Table/table-pagination-shortcut.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":["/** Subpixel rounding can make overflow look equal at 0–1px; ignore that noise. */\nconst TRUNCATION_EPSILON_PX = 1;\n\n/**\n * Whether a laid-out element is visually truncated.\n * Prefers `ds-text`'s inner semantic node when present so host flex layout\n * does not hide horizontal or line-clamp overflow.\n */\nexport function isElementTruncated(element: HTMLElement): boolean {\n const target = element.querySelector<HTMLElement>('.ds-text__element') ?? element;\n return (\n target.scrollWidth - target.clientWidth > TRUNCATION_EPSILON_PX ||\n target.scrollHeight - target.clientHeight > TRUNCATION_EPSILON_PX\n );\n}\n","import { numberFormatter } from '../../utils/intl-formatters';\nimport type {\n TableCellBlank,\n TableCellAction,\n TableCellEmpty,\n TableCellIcon,\n TableCellIconText,\n TableCellScoreText,\n TableCellImage,\n TableCellPrimaryText,\n TableCellText,\n TableCellTag,\n TableCellTags,\n TableCellValue,\n TableColumn,\n DataGroup,\n TableGroupAccessory,\n TableGroupHero,\n TableRow,\n DataSortState,\n} from './table-types';\nimport { isSafetyScoreLevel } from '../Score/score-model';\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\nconst TABLE_IMAGE_COLUMN_WIDTH_VARIABLES = {\n 1: '--_table-image-column-inline-size',\n 2: '--_table-image-column-inline-size-multi',\n 3: '--_table-image-column-inline-size-triple',\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 (\n typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'primary-text'\n );\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 isTableCellTags(value: TableCellValue): value is TableCellTags {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'tags';\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 (\n typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'icon-text'\n );\n}\n\nexport function isTableCellScoreText(value: TableCellValue): value is TableCellScoreText {\n return (\n typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'score-text'\n );\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 (isTableCellTags(value)) return value.items.map(item => item.label).join(', ');\n if (isTableCellIcon(value)) return null;\n if (isTableCellIconText(value)) return value.primary;\n if (isTableCellScoreText(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 nextDataSortState(\n current: DataSortState | null | undefined,\n fieldId: string\n): DataSortState {\n if (current?.fieldId !== fieldId) return { fieldId, direction: 'asc' };\n if (current.direction === 'asc') return { fieldId, direction: 'desc' };\n return { fieldId, direction: 'asc' };\n}\n\nexport function toggleTableGroupCollapsed(collapsedGroupIds: string[], groupId: string): 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 = { columnId: string; mode: 'action' } | { mode: 'floating' };\n\nexport function tableCollapseAllHost(columns: TableColumn[]): 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 =\n Number.isFinite(column.minSize) && (column.minSize ?? 0) > 0 ? column.minSize! : 0;\n const maximum =\n 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 if (column.imageTracks) {\n return `var(${TABLE_IMAGE_COLUMN_WIDTH_VARIABLES[column.imageTracks]})`;\n }\n return column.kind === 'action' ? 'var(--dimension-size-500)' : undefined;\n}\n\n/**\n * Fully sized tables add one internal lane that absorbs spare inline space and\n * collapses to zero at the explicit overflow width. Keep trailing action and\n * sticky-end lanes after it so those controls remain at the visible edge.\n */\nexport function tableElasticSpacerIndex(columns: TableColumn[]): number | undefined {\n if (columns.length === 0 || columns.some(column => !tableColumnSize(column))) return undefined;\n let index = columns.length;\n while (index > 0) {\n const column = columns[index - 1]!;\n if (column.kind !== 'action' && column.sticky !== 'end') break;\n index -= 1;\n }\n return index;\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: DataGroup[], 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[] | ReadonlySet<string>\n): TableSelectionState {\n const selected = Array.isArray(selectedRowIds)\n ? new Set(selectedRowIds)\n : (selectedRowIds as ReadonlySet<string>);\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, selected);\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: DataGroup): number {\n const total = Number.isFinite(group.totalCount) ? Math.max(0, group.totalCount!) : 0;\n return Math.max(total, group.rows.length);\n}\n\n/** Accessory items shown on a group header's second track. */\nexport const TABLE_GROUP_ACCESSORY_LIMIT = 4;\n\n/** Trim, drop empty copy, and cap accessories at the second-track limit. */\nexport function tableGroupAccessories(group: DataGroup): TableGroupAccessory[] {\n const resolved: TableGroupAccessory[] = [];\n for (const item of group.accessories ?? []) {\n const text = item?.text?.trim() ?? '';\n if (!text) continue;\n const help = item.help?.trim();\n resolved.push(help ? { text, help } : { text });\n if (resolved.length === TABLE_GROUP_ACCESSORY_LIMIT) break;\n }\n return resolved;\n}\n\n/** Score recipes for a leading group-header hero spanning one or two tracks. */\nexport const TABLE_GROUP_HERO_SCORE_PRESENTATION = {\n 1: { size: 'sm', variant: 'default' },\n 2: { size: 'lg', variant: 'default' },\n} as const;\n\n/** Resolve a supported group-header hero, or undefined when none is supplied. */\nexport function tableGroupHero(group: DataGroup): TableGroupHero | undefined {\n const hero = group.hero;\n if (!hero || hero.kind !== 'score') return undefined;\n const label = hero.label?.trim();\n return {\n kind: 'score',\n value: hero.value,\n ...(isSafetyScoreLevel(hero.level) ? { level: hero.level } : {}),\n ...(hero.tracks === 2 ? { tracks: 2 as const } : {}),\n ...(label ? { label } : {}),\n ...(hero.isLoading ? { isLoading: true } : {}),\n };\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(value: unknown): value is (typeof TABLE_GROUP_INTENTS)[number] {\n return typeof value === 'string' && (TABLE_GROUP_INTENTS as readonly string[]).includes(value);\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 normalizedTotal = Math.max(0, Math.trunc(total as number));\n const normalizedDisplayed = Math.min(\n normalizedTotal,\n Math.max(0, Math.trunc(displayed as number))\n );\n const formatter = numberFormatter(locale);\n return label\n .replace('{displayed}', formatter.format(normalizedDisplayed))\n .replace('{total}', formatter.format(normalizedTotal));\n}\n\n/** Formats the virtual-mode total-only result footer. */\nexport function formatTableTotalSummary(\n total: number | null | undefined,\n label = '{total} items',\n locale?: string\n): string | null {\n if (!Number.isFinite(total)) return null;\n const normalizedTotal = Math.max(0, Math.trunc(total as number));\n return label.replace('{total}', numberFormatter(locale).format(normalizedTotal));\n}\n\n/**\n * True when a footer slot belongs to the table itself: a light-DOM child of the\n * host, or a top-level node Stencil relocated into this table's footer. A\n * slotted ancestor marks a nested component boundary, so dialog action slots\n * inside footer-leading/footer-trailing content cannot replace the table copy.\n */\nexport function isOwnedTableFooterSlot(node: Element, host: Element): boolean {\n if (node.parentElement === host) return true;\n let insideTableFooter = false;\n for (\n let ancestor = node.parentElement;\n ancestor && ancestor !== host;\n ancestor = ancestor.parentElement\n ) {\n if (ancestor.hasAttribute('slot')) return false;\n if (ancestor.classList.contains('ds-table__footer')) insideTableFooter = true;\n }\n return insideTableFooter;\n}\n\nexport function hasOwnedTableFooterSlot(host: Element, slotName: string): boolean {\n return [...host.querySelectorAll(`[slot=\"${slotName}\"]`)].some(node =>\n isOwnedTableFooterSlot(node, host)\n );\n}\n\nexport function tableModelIssues(\n columns: TableColumn[],\n rows: TableRow[],\n groups: DataGroup[],\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.label.trim() && !column.accessibleLabel?.trim()) {\n issues.push(\n `Column ${column.id || '(missing id)'} requires a visible label or accessibleLabel.`\n );\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 const accessoryCount = (group.accessories ?? []).filter(\n item => typeof item?.text === 'string' && item.text.trim()\n ).length;\n if (accessoryCount > TABLE_GROUP_ACCESSORY_LIMIT) {\n issues.push(`Group ${group.id} has more than ${TABLE_GROUP_ACCESSORY_LIMIT} accessories.`);\n }\n if (group.hero != null && group.hero.kind !== 'score') {\n issues.push(`Group ${group.id} has an unsupported hero.`);\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 deriveTableSelectionState,\n isTableGroupIntent,\n resolvedTableGroupCount,\n tableCollapseAllHost,\n tableColumnSize,\n tableElasticSpacerIndex,\n tableExplicitMinWidth,\n tableGroupAccessories,\n tableGroupHero,\n tableGroupIntentClass,\n tableGroupLabelColor,\n tableRows,\n type TableCollapseAllHost,\n type TableSelectionState,\n} from './table-model';\nimport type {\n TableColumn,\n DataGroup,\n TableGroupAccessory,\n TableGroupHero,\n TableGroupIntent,\n TableRow,\n TableSelectionMode,\n} from './table-types';\n\nexport type TableGroupCountPresentation = 'loaded-progress' | 'total';\n\nexport interface TableGroupRenderModel {\n group: DataGroup;\n count: number;\n loadedCount: number;\n visibleCountText: string;\n countLabel: string;\n intent: TableGroupIntent | undefined;\n intentClass: string | undefined;\n labelColor: ReturnType<typeof tableGroupLabelColor>;\n collapsed: boolean;\n accessories: TableGroupAccessory[];\n hero: TableGroupHero | undefined;\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 elasticSpacerIndex: number | undefined;\n tableStyle: Record<string, string> | undefined;\n}\n\nexport interface TableRenderModelInput {\n columns: TableColumn[];\n rows: TableRow[];\n groups: DataGroup[];\n grouped: boolean;\n selectionMode: TableSelectionMode;\n selectedRowIds: string[];\n collapsedGroupIds: string[];\n groupCountPresentation?: TableGroupCountPresentation;\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 =\n input.grouped &&\n 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 elasticSpacerIndex = tableElasticSpacerIndex(input.columns);\n const columnTracks = input.columns.map(column => tableColumnSize(column) ?? 'minmax(0, 1fr)');\n if (elasticSpacerIndex != null) columnTracks.splice(elasticSpacerIndex, 0, 'minmax(0, 1fr)');\n const gridTracks = [\n ...(selectable ? ['var(--_table-selection-column-inline-size)'] : []),\n ...columnTracks,\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, selectedRowIds),\n collapsedGroupIds,\n groups: input.groups.map(group => {\n const loadedCount = group.rows.length;\n const collapsed = collapsedGroupIds.has(group.id);\n const count = resolvedTableGroupCount(group);\n const showTotalOnly =\n input.groupCountPresentation === 'total' || (collapsed && loadedCount === 0);\n const totalLabel = group.countLabel ?? `${count} ${count === 1 ? 'item' : 'items'}`;\n const accessories = tableGroupAccessories(group);\n const hero = tableGroupHero(group);\n const intent = hero || !isTableGroupIntent(group.intent) ? undefined : group.intent;\n return {\n group,\n count,\n loadedCount,\n visibleCountText: showTotalOnly ? String(count) : `${loadedCount} of ${count}`,\n countLabel: showTotalOnly ? totalLabel : `${loadedCount} of ${totalLabel} loaded`,\n intent,\n intentClass: tableGroupIntentClass(intent),\n labelColor: tableGroupLabelColor(intent),\n collapsed,\n accessories,\n hero,\n selection: selectable ? deriveTableSelectionState(group.rows, selectedRowIds) : null,\n };\n }),\n totalColumns:\n input.columns.length + (selectable ? 1 : 0) + (elasticSpacerIndex == null ? 0 : 1),\n allGroupsCollapsed,\n showCollapseAll,\n collapseAllHost: showCollapseAll ? tableCollapseAllHost(input.columns) : undefined,\n elasticSpacerIndex,\n tableStyle,\n };\n}\n","import type { MenuItemData, MenuItemsSection } from '../Menu/menu-types';\nimport type { TableCellAction, TableCellActionMenuEntry } from './table-types';\n\nlet actionMenuSeq = 0;\n\nexport function nextTableActionMenuElementId(): string {\n actionMenuSeq += 1;\n return `ds-table-action-menu-${actionMenuSeq}`;\n}\n\nexport function isTableCellActionMenu(\n value: TableCellAction\n): value is TableCellAction & { items: TableCellActionMenuEntry[]; ariaLabel: string } {\n return Array.isArray(value.items);\n}\n\nexport function isRenderableTableActionMenu(\n value: TableCellAction\n): value is TableCellAction & { items: TableCellActionMenuEntry[]; ariaLabel: string } {\n return isTableCellActionMenu(value) && tableActionMenuSections(value.items).length > 0;\n}\n\n/** Split divider entries into Menu sections. Empty runs (leading/repeated dividers) are dropped. */\nexport function tableActionMenuSections(items: TableCellActionMenuEntry[]): MenuItemsSection[] {\n const sections: MenuItemsSection[] = [];\n let current: MenuItemData[] = [];\n const flush = () => {\n if (!current.length) return;\n sections.push({ items: current });\n current = [];\n };\n\n for (const entry of items) {\n if ('kind' in entry) {\n flush();\n continue;\n }\n current.push({\n value: entry.actionId,\n label: entry.label,\n ...(entry.isInactive ? { isInactive: true } : {}),\n ...(entry.isDestructive ? { isDestructive: true } : {}),\n });\n }\n flush();\n return sections;\n}\n\nexport function tableActionTriggerId(menuId: string, rowId: string, fieldId: string): string {\n return `${menuId}-${sanitizeId(rowId)}-${sanitizeId(fieldId)}`;\n}\n\nfunction sanitizeId(value: string): string {\n return value.replace(/[^A-Za-z0-9_-]+/g, '-');\n}\n","import type { MenuItemData } from '../Menu/menu-types';\nimport type { TableDataMode } from './table-types';\n\nlet tableDataModeSwitcherSequence = 0;\n\nexport function nextTableDataModeSwitcherElementId(): string {\n tableDataModeSwitcherSequence += 1;\n return `ds-table-data-mode-${tableDataModeSwitcherSequence}`;\n}\n\n/** Menu of supported data-mode choices. */\nexport function tableDataModeMenuItems(\n dataMode: TableDataMode,\n labels: { infinite: string; pagination: string; virtual: string }\n): MenuItemData[] {\n return [\n {\n label: labels.infinite,\n value: 'infinite',\n isSelected: dataMode === 'infinite',\n },\n {\n label: labels.pagination,\n value: 'pagination',\n isSelected: dataMode === 'pagination',\n },\n {\n label: labels.virtual,\n value: 'virtual',\n isSelected: dataMode === 'virtual',\n },\n ];\n}\n\nexport function tableDataModeFromMenuItem(item: MenuItemData): TableDataMode | null {\n return item.value === 'infinite' || item.value === 'pagination' || item.value === 'virtual'\n ? item.value\n : null;\n}\n","/** Marks text tracks that may present the table-owned truncation tooltip. */\nexport const TABLE_TRUNCATE_ATTR = 'data-table-truncate';\n\nfunction isValidTruncateTrack(track: HTMLElement): boolean {\n return !track.closest('.ds-table__row--disabled, thead, .ds-table__header-row');\n}\n\n/** Resolve the overflowing text track under a pointer or focus target. */\nexport function resolveTableTruncateTrack(target: EventTarget | null): HTMLElement | null {\n const element =\n target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n if (!element) return null;\n\n const fromAncestor = element.closest<HTMLElement>(`[${TABLE_TRUNCATE_ATTR}]`);\n if (fromAncestor && isValidTruncateTrack(fromAncestor)) return fromAncestor;\n\n const link = element.closest('a.ds-table__cell-link');\n const nested = link?.querySelector<HTMLElement>(`[${TABLE_TRUNCATE_ATTR}]`);\n if (nested && isValidTruncateTrack(nested)) return nested;\n return null;\n}\n\nexport function tableTruncateLabel(track: HTMLElement): string {\n return (track.textContent ?? '').replace(/\\s+/g, ' ').trim();\n}\n","import {\n isTableCellAction,\n isTableCellBlank,\n isTableCellEmpty,\n isTableCellIcon,\n isTableCellIconText,\n isTableCellScoreText,\n isTableCellImage,\n isTableCellPrimaryText,\n isTableCellTag,\n isTableCellTags,\n isTableCellText,\n} from './table-model';\nimport type {\n TableCellAction,\n TableCellBlank,\n TableCellEmpty,\n TableCellIcon,\n TableCellImage,\n TableCellImageTracks,\n TableCellTag,\n TableCellTags,\n TableCellTagVariant,\n TableCellTextRun,\n TableCellTextTrack,\n TableCellValue,\n TableCellLinkTarget,\n TableCellLineClamp,\n TableCellMaxLines,\n TableColumn,\n} from './table-types';\nimport type { IconColor } from '../Icon/Icon';\nimport type { SafetyScoreLevel } from '../Score/score-types';\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 lineClamp: TableCellLineClamp;\n }\n | {\n kind: 'score-text';\n cellType: 'score-text';\n score: string | number;\n scoreLevel?: SafetyScoreLevel;\n scoreLabel: string;\n scoreLoading: boolean;\n value: ResolvedTableCellText;\n variant: 'single' | 'multi' | 'triple';\n wraps: boolean;\n lineClamp: TableCellLineClamp;\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: 'tags';\n cellType: 'tags';\n value: TableCellTags;\n tracks: number;\n variant: `${number}-track` | 'inline';\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 lineClamp: TableCellLineClamp;\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(tracks: TableCellImageTracks): 'single' | 'multi' | 'triple' {\n return tracks === 3 ? 'triple' : tracks === 2 ? 'multi' : 'single';\n}\n\n/** Normalize the declared line count used by wrapping multiple-Tag cells. */\nexport function resolveTableCellTagsTracks(tracks: number): number {\n return Number.isFinite(tracks) && tracks > 0 ? Math.floor(tracks) : 1;\n}\n\n/** Token-backed content height for any named number of body-row tracks. */\nexport function tableCellTrackStackBlockSize(tracks: number): string {\n const count = resolveTableCellTagsTracks(tracks);\n return `calc(${count} * var(--_table-cell-track-min-block-size))`;\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 const run: TableCellTextRun = { text };\n if (typeof item === 'object' && item !== null) {\n if ('color' in item && item.color) run.color = item.color;\n if ('help' in item && typeof item.help === 'string' && item.help.trim()) {\n run.help = item.help.trim();\n }\n }\n runs.push(run);\n }\n return runs.length ? runs : undefined;\n}\n\n/** Map wrap / maxLines onto wrap-to-track geometry and a line clamp. */\nexport function resolveTableCellTextOverflow(\n source: { wrap?: boolean; maxLines?: TableCellMaxLines },\n column: TableColumn\n): { wraps: boolean; lineClamp: TableCellLineClamp } {\n const wrap = source.wrap ?? column.wrap ?? false;\n const maxLines = source.maxLines ?? (source.wrap === true ? undefined : column.maxLines);\n if (maxLines != null) {\n return { wraps: maxLines > 1, lineClamp: maxLines };\n }\n if (wrap) return { wraps: true, lineClamp: 'none' };\n return { wraps: false, lineClamp: 1 };\n}\n\n/** ds-text overflow props for a resolved clamp. */\nexport function tableCellTextOverflowProps(lineClamp: TableCellLineClamp): {\n lineTruncation: TableCellLineClamp;\n wrap: 'wrap' | 'nowrap';\n} {\n if (lineClamp === 'none') return { lineTruncation: 'none', wrap: 'wrap' };\n if (lineClamp === 1) return { lineTruncation: 1, wrap: 'nowrap' };\n return { lineTruncation: lineClamp, wrap: 'wrap' };\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 maxLines?: TableCellMaxLines;\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 lineClamp: TableCellLineClamp;\n} {\n const secondary = normalizeTableCellTextTrack(source.secondary);\n const tertiary = options.allowTertiary ? normalizeTableCellTextTrack(source.tertiary) : 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 const overflow = resolveTableCellTextOverflow(source, column);\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: overflow.wraps,\n lineClamp: overflow.lineClamp,\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 lineClamp: text.lineClamp,\n };\n }\n if (isTableCellScoreText(value)) {\n const text = resolveTextPresentation(value, column, {\n primaryText: false,\n allowTertiary: true,\n });\n return {\n kind: 'score-text',\n cellType: 'score-text',\n score: value.score,\n ...(value.scoreLevel ? { scoreLevel: value.scoreLevel } : {}),\n scoreLabel: value.scoreLabel?.trim() || 'Safety score',\n scoreLoading: value.scoreLoading === true,\n value: text.value,\n variant: text.variant === 'primary-pair' ? 'single' : text.variant,\n wraps: text.wraps,\n lineClamp: text.lineClamp,\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 if (isTableCellTags(value)) {\n const inline = value.variant === 'inline';\n const tracks = inline ? (value.text?.trim() ? 2 : 1) : resolveTableCellTagsTracks(value.tracks);\n return {\n kind: 'tags',\n cellType: 'tags',\n value: inline ? { ...value, items: value.items.slice(0, 3) as typeof value.items } : value,\n tracks,\n variant: inline ? 'inline' : `${tracks}-track`,\n };\n }\n\n const primaryText = isTableCellPrimaryText(value);\n const source =\n 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(isTableCellText(value) ? value : source, column, {\n primaryText,\n 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 lineClamp: text.lineClamp,\n };\n}\n","export interface TableHighlightSegment {\n text: string;\n match: boolean;\n}\n\nexport type TableHighlightMatcher = (value: string | number) => TableHighlightSegment[];\n\nexport const TABLE_NO_HIGHLIGHT_MATCHER: TableHighlightMatcher = value => [\n { text: String(value), match: false },\n];\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * Creates one literal, case-insensitive matcher for table-owned text tracks.\n * Longer terms win when supplied terms overlap.\n */\nexport function createTableHighlightMatcher(terms: string[]): TableHighlightMatcher {\n const normalizedTerms = Array.from(\n new Map(\n terms\n .map(term => term.trim())\n .filter(Boolean)\n .map(term => [term.toLocaleLowerCase(), term])\n ).values()\n ).sort((left, right) => right.length - left.length);\n\n if (!normalizedTerms.length) {\n return TABLE_NO_HIGHLIGHT_MATCHER;\n }\n\n const expression = new RegExp(normalizedTerms.map(escapeRegExp).join('|'), 'giu');\n\n return value => {\n const text = String(value);\n const segments: TableHighlightSegment[] = [];\n let cursor = 0;\n\n expression.lastIndex = 0;\n for (const match of text.matchAll(expression)) {\n const index = match.index;\n if (index > cursor) segments.push({ text: text.slice(cursor, index), match: false });\n segments.push({ text: match[0], match: true });\n cursor = index + match[0].length;\n }\n\n if (!segments.length) return [{ text, match: false }];\n if (cursor < text.length) segments.push({ text: text.slice(cursor), match: false });\n return segments;\n };\n}\n","import { h } from '@stencil/core';\nimport {\n resolveTableCellPresentation,\n tableCellTrackStackBlockSize,\n tableCellTextOverflowProps,\n type TableCellPresentation,\n} from './table-cell-model';\nimport {\n isRenderableTableActionMenu,\n isTableCellActionMenu,\n tableActionTriggerId,\n} from './table-action-menu';\nimport { tableRowSelectionLabel } from './table-model';\nimport type { TableRenderModel } from './table-render-model';\nimport { TABLE_NO_HIGHLIGHT_MATCHER, type TableHighlightMatcher } from './table-highlight';\nimport type { TableCellActionDetail, TableCellTextRun, TableColumn, TableRow } from './table-types';\nimport { resolveSafeUrl } from '../../utils/safe-url';\nimport type { TableColumnLayout, TableSpanCell } from './table-structure';\n\nexport interface TableRowViewOptions {\n pins?: Map<string, TableColumnLayout>;\n spans?: Map<string, TableSpanCell>;\n headerId?: (id: string) => string;\n responsiveCards?: boolean;\n cellAttributes?: (row: TableRow, column: TableColumn) => Record<string, unknown>;\n renderEditor?: (row: TableRow, column: TableColumn) => unknown;\n renderEditTrigger?: (row: TableRow, column: TableColumn) => unknown;\n grid?: boolean;\n row: TableRow;\n model: TableRenderModel;\n visibleColumns: TableColumn[];\n emptyCellLabel: string;\n actionMenuElementId: string;\n actionMenu: { rowId: string; columnId: string } | null;\n actionMenuSurface?: { rowId: string; columnId: string } | null;\n highlightMatcher: TableHighlightMatcher;\n highlightFieldIds: string[];\n surfaceOpenRowId?: string;\n ariaRowIndex?: number;\n variableVirtualSize?: boolean;\n intrinsicBlockSize?: number;\n rowKey?: string;\n renderSelectionControl: (\n label: string,\n checked: boolean,\n indeterminate: boolean,\n disabled: boolean,\n onActivate: () => void\n ) => unknown;\n renderStickyEdge: (sticky: TableColumn['sticky'], shadow?: boolean) => unknown;\n onRowActivate: (row: TableRow, event: Event) => void;\n onRowKeyDown: (row: TableRow, event: KeyboardEvent) => void;\n onRowSelection: (row: TableRow) => void;\n onCellAction: (detail: TableCellActionDetail) => void;\n onActionMenuToggle: (row: TableRow, column: TableColumn, event: MouseEvent) => void;\n}\n\n/** Render one semantic body row and the complete declarative table-cell vocabulary. */\nexport function renderTableRow({\n pins,\n spans,\n headerId,\n responsiveCards,\n cellAttributes,\n renderEditor,\n renderEditTrigger,\n grid,\n row,\n model,\n visibleColumns,\n emptyCellLabel,\n actionMenuElementId,\n actionMenu,\n actionMenuSurface,\n highlightMatcher,\n highlightFieldIds,\n surfaceOpenRowId,\n ariaRowIndex,\n variableVirtualSize = false,\n intrinsicBlockSize,\n rowKey = row.id,\n renderSelectionControl,\n renderStickyEdge,\n onRowActivate,\n onRowKeyDown,\n onRowSelection,\n onCellAction,\n onActionMenuToggle,\n}: TableRowViewOptions) {\n const selected = model.selectedRowIds.has(row.id);\n const surfaceOpen = row.id === surfaceOpenRowId && !!row.interactive && !row.disabled;\n const rowSelectable = row.selectable !== false && !row.disabled;\n const rowInteractive =\n !grid &&\n !row.disabled &&\n (model.selectable && model.selectedRowIds.size > 0 ? rowSelectable : !!row.interactive);\n const beforeSpacer =\n model.elasticSpacerIndex == null\n ? visibleColumns\n : visibleColumns.slice(0, model.elasticSpacerIndex);\n const afterSpacer =\n model.elasticSpacerIndex == null ? [] : visibleColumns.slice(model.elasticSpacerIndex);\n const cardActions = responsiveCards\n ? visibleColumns.filter(column => column.kind === 'action')\n : [];\n const firstDataColumn = visibleColumns.find(column => column.kind !== 'action');\n const renderColumn = (column: TableColumn) => {\n const span = spans?.get(column.id);\n if (span === 'covered') return null;\n const lastPin = pins?.get(span?.columnIds[span.columnIds.length - 1] ?? column.id);\n const firstPin = pins?.get(column.id);\n const layout = firstPin\n ? {\n style: column.sticky === 'end' ? (lastPin?.style ?? firstPin.style) : firstPin.style,\n edge: column.sticky === 'end' ? firstPin.edge : lastPin?.edge,\n }\n : undefined;\n return renderTableCell({\n layout,\n afterCoveredColumn:\n !!spans && spans.get(visibleColumns[visibleColumns.indexOf(column) - 1]?.id) === 'covered',\n span: spans?.get(column.id),\n headerId,\n responsiveCards,\n cardActionIndex: cardActions.indexOf(column),\n cardActionDivider: model.selectable && column === cardActions[0],\n firstDataColumn: column === firstDataColumn,\n attributes: cellAttributes?.(row, column),\n editor: renderEditor?.(row, column),\n editTrigger: renderEditTrigger?.(row, column),\n row,\n column,\n selected,\n surfaceOpen,\n emptyCellLabel,\n actionMenuElementId,\n actionMenu,\n actionMenuSurface,\n highlightMatcher,\n highlightFieldIds,\n renderStickyEdge,\n onCellAction,\n onActionMenuToggle,\n });\n };\n\n return (\n <tr\n key={rowKey}\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': rowInteractive,\n 'ds-focus-ring': rowInteractive,\n }}\n data-row-id={row.id}\n data-responsive-card={responsiveCards ? 'true' : undefined}\n data-virtual-id={ariaRowIndex != null ? `row:${row.id}` : undefined}\n data-virtual-pool-key={ariaRowIndex != null ? rowKey : undefined}\n data-virtual-measure={ariaRowIndex != null && variableVirtualSize ? 'true' : undefined}\n data-selected={selected ? 'true' : undefined}\n data-surface-open={surfaceOpen ? 'true' : undefined}\n style={{\n ...(intrinsicBlockSize != null\n ? { '--_table-row-intrinsic-block-size': `${intrinsicBlockSize}px` }\n : {}),\n ...(responsiveCards\n ? {\n '--_table-card-action-count': String(cardActions.length),\n '--_table-card-control-count': String(cardActions.length + Number(model.selectable)),\n }\n : {}),\n }}\n aria-rowindex={ariaRowIndex}\n aria-disabled={row.disabled ? 'true' : undefined}\n tabIndex={rowInteractive ? 0 : undefined}\n onClick={event => onRowActivate(row, event)}\n onKeyDown={event => onRowKeyDown(row, event)}\n >\n {model.selectable && (\n <td\n 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 'ds-interaction-fill--surface-open': surfaceOpen,\n }}\n >\n {renderSelectionControl(\n `${selected ? 'Deselect' : 'Select'} ${tableRowSelectionLabel(row, visibleColumns)}`,\n selected,\n false,\n !rowSelectable,\n () => onRowSelection(row)\n )}\n {renderStickyEdge(\n 'start',\n !pins || ![...pins.values()].some(pin => pin.edge === 'start')\n )}\n </td>\n )}\n {beforeSpacer.map(renderColumn)}\n {model.elasticSpacerIndex != null && (\n <td\n class={{\n 'ds-table__cell': true,\n 'ds-table__elastic-spacer-cell': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n 'ds-interaction-fill--surface-open': surfaceOpen,\n }}\n aria-hidden=\"true\"\n role=\"presentation\"\n data-elastic-spacer=\"true\"\n />\n )}\n {afterSpacer.map(renderColumn)}\n </tr>\n );\n}\n\ninterface TableCellViewOptions {\n cardActionIndex?: number;\n cardActionDivider?: boolean;\n firstDataColumn?: boolean;\n afterCoveredColumn?: boolean;\n layout?: TableColumnLayout;\n span?: TableSpanCell;\n headerId?: (id: string) => string;\n responsiveCards?: boolean;\n attributes?: Record<string, unknown>;\n editor?: unknown;\n editTrigger?: unknown;\n row: TableRow;\n column: TableColumn;\n selected: boolean;\n surfaceOpen: boolean;\n emptyCellLabel: string;\n actionMenuElementId: string;\n actionMenu: { rowId: string; columnId: string } | null;\n actionMenuSurface?: { rowId: string; columnId: string } | null;\n highlightMatcher: TableHighlightMatcher;\n highlightFieldIds: string[];\n renderStickyEdge: (sticky: TableColumn['sticky'], shadow?: boolean) => unknown;\n onCellAction: (detail: TableCellActionDetail) => void;\n onActionMenuToggle: (row: TableRow, column: TableColumn, event: MouseEvent) => void;\n}\n\nfunction renderTableCell(options: TableCellViewOptions) {\n const { row, column, selected, surfaceOpen, renderStickyEdge } = options;\n const align = column.align ?? 'start';\n const decoration = row.cellPresentation?.[column.id];\n const span = options.span === 'covered' ? undefined : options.span;\n const cell = resolveTableCellPresentation(row.cells[column.id], column);\n const tagCell = cell.kind === 'tag';\n const tagsCell = cell.kind === 'tags';\n const iconCell = cell.kind === 'icon';\n const iconTextCell = cell.kind === 'icon-text';\n const scoreTextCell = cell.kind === 'score-text';\n const imageCell = cell.kind === 'image';\n const actionCell = cell.kind === 'action';\n const actionMenuCell = actionCell && isRenderableTableActionMenu(cell.value);\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 tagsVariant = tagsCell ? cell.variant : undefined;\n const textVariant = textCell ? cell.variant : undefined;\n const imageVariant = imageCell ? cell.variant : undefined;\n const iconTextVariant = iconTextCell ? cell.variant : undefined;\n const scoreTextVariant = scoreTextCell ? cell.variant : undefined;\n const wraps = (textCell || iconTextCell || scoreTextCell) && cell.wraps;\n\n return (\n <td\n {...options.attributes}\n colSpan={span?.colSpan}\n rowSpan={span?.rowSpan}\n headers={\n options.headerId\n ? (span?.columnIds ?? [column.id]).map(options.headerId).join(' ')\n : undefined\n }\n style={{\n ...options.layout?.style,\n ...(options.cardActionIndex != null && options.cardActionIndex >= 0\n ? { '--_table-card-action-index': String(options.cardActionIndex) }\n : {}),\n ...(span ? { gridColumn: `${span.columnStart} / span ${span.colSpan}` } : {}),\n }}\n data-vertical-align={decoration?.verticalAlign}\n data-cell-highlight={decoration?.highlight?.intent}\n data-cell-borders={decoration?.borders?.join(' ')}\n key={`${row.id}:${column.id}`}\n class={{\n 'ds-table__cell': true,\n 'ds-table__cell--card-action': column.kind === 'action',\n 'ds-table__cell--card-first': !!options.firstDataColumn,\n 'ds-table__cell--after-covered': !!options.afterCoveredColumn,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--tag': tagCell,\n [`ds-table__cell--tag-${tagVariant}`]: tagCell,\n 'ds-table__cell--tags': tagsCell,\n [`ds-table__cell--tags-${tagsVariant}`]: tagsCell,\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--icon-text-wrap': iconTextCell && wraps,\n 'ds-table__cell--score-text': scoreTextCell,\n [`ds-table__cell--score-text-${scoreTextVariant}`]: scoreTextCell,\n 'ds-table__cell--score-text-wrap': scoreTextCell && wraps,\n 'ds-table__cell--image': imageCell,\n [`ds-table__cell--image-${imageVariant}`]: imageCell,\n 'ds-table__cell--action': actionCell,\n 'ds-table__cell--action-menu': actionMenuCell,\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--text-wrap': textCell && wraps,\n 'ds-table__cell--empty': emptyCell,\n 'ds-table__cell--blank': blankCell,\n 'ds-table__cell--sticky-start': !!options.layout && column.sticky === 'start',\n 'ds-table__cell--sticky-end': !!options.layout && column.sticky === 'end',\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n 'ds-interaction-fill--surface-open': surfaceOpen,\n }}\n data-column-id={column.id}\n data-cell-type={cell.cellType}\n data-cell-variant={\n tagVariant ??\n tagsVariant ??\n textVariant ??\n imageVariant ??\n iconTextVariant ??\n scoreTextVariant\n }\n data-cell-tracks={tagsCell ? cell.tracks : undefined}\n >\n {decoration?.highlight && <span class=\"ds-table__cell-highlight\" aria-hidden=\"true\" />}\n {options.responsiveCards && column.kind !== 'action' && !options.firstDataColumn && (\n <span class=\"ds-table__card-field-divider\" aria-hidden=\"true\" />\n )}\n {options.responsiveCards && options.cardActionDivider && (\n <span class=\"ds-table__card-action-divider\" aria-hidden=\"true\" />\n )}\n {options.responsiveCards && column.kind !== 'action' && (\n <ds-text\n class=\"ds-table__card-label ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n {column.label || column.accessibleLabel}\n </ds-text>\n )}\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {options.editor ?? renderTableCellValue(cell, options)}\n {!options.editor &&\n options.attributes?.role === 'gridcell' &&\n column.editor?.type === 'select' && (\n <ds-icon\n class=\"ds-table__select-indicator\"\n name=\"ChevronDown\"\n size=\"md\"\n color=\"secondary\"\n />\n )}\n {decoration?.flag && (\n <span class=\"ds-table__cell-flag\">\n <ds-icon\n name={decoration.flag.icon ?? 'Flag'}\n size=\"md\"\n color=\"secondary\"\n label={decoration.flag.label}\n />\n </span>\n )}\n {decoration?.highlight && (\n <span class=\"ds-visually-hidden\">{decoration.highlight.label}</span>\n )}\n </span>\n {options.editTrigger}\n {renderStickyEdge(options.layout ? column.sticky : undefined, !!options.layout?.edge)}\n </td>\n );\n}\n\nfunction renderTableCellValue(cell: TableCellPresentation, options: TableCellViewOptions) {\n const {\n row,\n column,\n emptyCellLabel,\n actionMenuElementId,\n actionMenu,\n actionMenuSurface,\n onCellAction,\n onActionMenuToggle,\n } = options;\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\">{emptyCellLabel}</span>\n </ds-text>\n );\n }\n\n if (cell.kind === 'icon') {\n const value = cell.value;\n return (\n <ds-icon name={value.icon} size=\"md\" color={value.color ?? 'secondary'} label={value.label} />\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 {renderTextCopy(cell, options)}\n </span>\n );\n }\n\n if (cell.kind === 'score-text') {\n return (\n <span class=\"ds-table__cell-score-text\">\n {renderTextCopy(cell, options)}\n <span class=\"ds-table__cell-score-text-score\">\n <ds-score\n size=\"sm\"\n value={cell.score}\n level={cell.scoreLevel}\n label={cell.scoreLabel}\n isLoading={cell.scoreLoading}\n />\n </span>\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\n class=\"ds-table__cell-image-content\"\n src={value.src}\n alt={value.alt}\n loading=\"lazy\"\n />\n ) : (\n <span class=\"ds-table__cell-image-placeholder\" role=\"img\" aria-label={value.alt} />\n )}\n </span>\n );\n }\n\n if (cell.kind === 'action') {\n const value = cell.value;\n const menu = isRenderableTableActionMenu(value);\n const triggerId = tableActionTriggerId(actionMenuElementId, row.id, column.id);\n const expanded = menu && actionMenu?.rowId === row.id && actionMenu?.columnId === column.id;\n return (\n <ds-button-unfilled\n id={menu ? triggerId : undefined}\n variant={menu ? 'icon' : (value.variant ?? 'label')}\n size=\"md\"\n isInset={true}\n insetDepth=\"double\"\n label={value.label ?? ''}\n icon={value.icon ?? (menu ? 'Ellipses' : '')}\n aria-label={value.ariaLabel ?? null}\n hasBorder={value.hasBorder ?? false}\n isInactive={value.isInactive ?? false}\n isLoading={value.isLoading ?? false}\n hasMenu={menu}\n expanded={menu ? expanded : undefined}\n surfaceOpen={\n menu && actionMenuSurface?.rowId === row.id && actionMenuSurface?.columnId === column.id\n }\n controls={menu ? actionMenuElementId : undefined}\n onDsClick={event => {\n event.stopPropagation();\n if (menu) {\n onActionMenuToggle(row, column, event.detail);\n return;\n }\n if (isTableCellActionMenu(value)) return;\n onCellAction({ actionId: value.actionId, rowId: row.id, columnId: column.id });\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 if (variant === 'tag-only') return tag;\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 data-table-truncate=\"\"\n >\n {renderHighlightedText(\n value.text,\n tableCellFieldMatcher(options, variant === 'tag-with-text' ? 1 : 0)\n )}\n </ds-text>\n {variant === 'text-with-tag' && <span class=\"ds-table__cell-tag-control-track\">{tag}</span>}\n </span>\n );\n }\n\n if (cell.kind === 'tags') {\n if (cell.value.variant === 'inline') {\n return (\n <span class=\"ds-table__cell-tag-stack ds-table__cell-tag-stack--tag-with-text ds-table__cell-inline-tags-stack\">\n <span class=\"ds-table__cell-inline-tags\">\n {cell.value.items.map((item, index) => [\n index > 0 && (\n <ds-text\n class=\"ds-table__cell-tag-separator\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"quaternary\"\n aria-hidden=\"true\"\n >\n /\n </ds-text>\n ),\n <ds-tag\n key={`${item.label}-${index}`}\n label={item.label}\n intent={item.intent ?? 'neutral'}\n contrast={item.contrast ?? 'faint'}\n size=\"md\"\n icon={item.icon ?? ''}\n rounded={item.rounded ?? false}\n isInset\n insetDepth=\"double\"\n />,\n ])}\n </span>\n {cell.tracks === 2 && (\n <ds-text\n class=\"ds-table__cell-tag-text ds-table__cell-track\"\n as=\"span\"\n variant=\"text-body-small\"\n color=\"secondary\"\n lineTruncation={1}\n data-table-truncate=\"\"\n >\n {renderHighlightedText(cell.value.text, tableCellFieldMatcher(options, 1))}\n </ds-text>\n )}\n </span>\n );\n }\n return (\n <span\n class=\"ds-table__cell-tags\"\n style={{ '--_table-cell-tags-min-block-size': tableCellTrackStackBlockSize(cell.tracks) }}\n >\n {cell.value.items.map((item, index) => (\n <ds-tag\n key={`${item.label}-${index}`}\n label={item.label}\n intent={item.intent ?? 'neutral'}\n contrast={item.contrast ?? 'faint'}\n size=\"sm\"\n icon={item.icon ?? ''}\n rounded={item.rounded ?? false}\n isInset\n insetDepth=\"single\"\n />\n ))}\n </span>\n );\n }\n\n if (cell.kind !== 'text') return null;\n return renderTextCopy(cell, options);\n}\n\nfunction renderTextCopy(\n cell: Extract<TableCellPresentation, { kind: 'text' | 'icon-text' | 'score-text' }>,\n options: TableCellViewOptions\n) {\n const text = cell.value;\n const overflow = tableCellTextOverflowProps(cell.lineClamp);\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={overflow.lineTruncation}\n wrap={overflow.wrap}\n fontFeature={text.fontFeature ?? 'normal'}\n data-table-truncate={truncateAttr(cell.lineClamp)}\n >\n {renderHighlightedText(text.primary, tableCellFieldMatcher(options, 0))}\n </ds-text>\n );\n\n return (\n <span class={{ 'ds-table__cell-copy': true, 'ds-table__cell-copy--wrap': cell.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 ) : (\n primary\n )}\n {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 lineClamp: cell.lineClamp,\n highlightMatcherForRun: runIndex => tableCellFieldMatcher(options, 1 + runIndex),\n })}\n {renderTextTrack(text.tertiary, {\n track: 'tertiary',\n variant: 'text-body-small',\n defaultColor: 'secondary',\n wholeColor: text.tertiaryColor,\n lineClamp: cell.lineClamp,\n highlightMatcherForRun: runIndex =>\n tableCellFieldMatcher(options, 1 + (text.secondary?.length ?? 0) + runIndex),\n })}\n </span>\n );\n}\n\nfunction 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 lineClamp: Extract<\n TableCellPresentation,\n { kind: 'text' | 'icon-text' | 'score-text' }\n >['lineClamp'];\n highlightMatcherForRun: (runIndex: number) => TableHighlightMatcher;\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 overflow = tableCellTextOverflowProps(options.lineClamp);\n const colorFor = (run: TableCellTextRun) =>\n run.color ?? options.wholeColor ?? options.defaultColor;\n const renderRun = (run: TableCellTextRun, index: number, className: string) => {\n const copy = (\n <ds-text\n class={className}\n as=\"span\"\n variant={options.variant}\n color={colorFor(run)}\n decoration={run.help ? 'dotted-underline' : undefined}\n lineTruncation={overflow.lineTruncation}\n wrap={overflow.wrap}\n data-table-truncate={truncateAttr(options.lineClamp)}\n >\n {renderHighlightedText(run.text, options.highlightMatcherForRun(index))}\n </ds-text>\n );\n return run.help ? (\n <ds-tooltip\n key={`${options.track}-run-${index}`}\n label={run.help}\n side=\"bottom\"\n align=\"start\"\n size=\"sm\"\n wrapLabel={true}\n >\n {copy}\n </ds-tooltip>\n ) : (\n copy\n );\n };\n if (runs.length === 1) {\n const run = runs[0];\n if (!run.help) return renderRun(run, 0, trackClass);\n return <span class={trackClass}>{renderRun(run, 0, 'ds-table__cell-run')}</span>;\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 renderRun(run, index, 'ds-table__cell-run'),\n ])}\n </span>\n );\n}\n\nfunction renderHighlightedText(value: string | number | undefined, matcher: TableHighlightMatcher) {\n if (value === undefined) return null;\n return matcher(value).map((segment, index) =>\n segment.match ? (\n <mark class=\"ds-table__match\" key={`match-${index}`}>\n {segment.text}\n </mark>\n ) : (\n <span key={`text-${index}`}>{segment.text}</span>\n )\n );\n}\n\nfunction tableCellFieldMatcher(\n options: TableCellViewOptions,\n fieldIndex: number\n): TableHighlightMatcher {\n const selected = options.highlightFieldIds;\n if (selected.length === 0 || selected.includes(options.column.id)) {\n return options.highlightMatcher;\n }\n const fieldId = options.column.segments?.[fieldIndex]?.sortKey;\n return fieldId && selected.includes(fieldId)\n ? options.highlightMatcher\n : TABLE_NO_HIGHLIGHT_MATCHER;\n}\n\nfunction truncateAttr(\n lineClamp: Extract<\n TableCellPresentation,\n { kind: 'text' | 'icon-text' | 'score-text' }\n >['lineClamp']\n) {\n return lineClamp === 'none' ? undefined : '';\n}\n","import { h } from '@stencil/core';\nimport type { TableGroupRenderModel, TableRenderModel } from './table-render-model';\nimport type { DataGroup, TableRow } from './table-types';\nimport type { TableVirtualNode, TableVirtualPlan } from './table-virtual-model';\n\nexport interface TableVirtualRowPoolState {\n slotsByRowId: Map<string, number>;\n nextSlot: number;\n}\n\nexport interface TableBodyRenderOptions {\n headerRowCount?: number;\n model: TableRenderModel;\n plan: TableVirtualPlan | null;\n rows: TableRow[];\n stickyHeader: boolean;\n documentStickyHeader: boolean;\n activeStickyGroupId: string | null;\n renderRow: (\n row: TableRow,\n model: TableRenderModel,\n ariaRowIndex?: number,\n variableVirtualSize?: boolean,\n rowKey?: string\n ) => unknown;\n renderGroupContent: (group: TableGroupRenderModel) => unknown;\n renderGroupLoadRow: (group: DataGroup, totalColumns: number) => unknown;\n}\n\n/**\n * Assign stable, bounded DOM keys to the rows currently occupying one virtual scope.\n * Departed rows release their slots so long scrolls recycle DOM instead of growing it.\n */\nexport function assignTableVirtualRowPoolKeys(\n nodes: readonly TableVirtualNode[],\n state: TableVirtualRowPoolState\n): Map<number, string> {\n const rows = nodes.filter(\n (node): node is Extract<TableVirtualNode, { kind: 'row' }> => node.kind === 'row'\n );\n const desiredIds = new Set(rows.map(node => node.item.rowId ?? node.item.id));\n const freeSlots: number[] = [];\n for (const [rowId, slot] of state.slotsByRowId) {\n if (desiredIds.has(rowId)) continue;\n state.slotsByRowId.delete(rowId);\n freeSlots.push(slot);\n }\n freeSlots.sort((left, right) => left - right);\n\n const keys = new Map<number, string>();\n for (const node of rows) {\n const rowId = node.item.rowId ?? node.item.id;\n let slot = state.slotsByRowId.get(rowId);\n if (slot == null) {\n slot = freeSlots.shift() ?? state.nextSlot++;\n state.slotsByRowId.set(rowId, slot);\n }\n keys.set(node.index, `virtual-row-slot-${slot}`);\n }\n return keys;\n}\n\n/** Owns grouped and virtual tbody composition while Table remains the behavior orchestrator. */\nexport class TableBodyRenderer {\n private virtualLookupCache: {\n rows: TableRow[];\n groups: TableGroupRenderModel[];\n rowsById: Map<string, TableRow>;\n groupsById: Map<string, TableGroupRenderModel>;\n } | null = null;\n\n private readonly virtualRowPoolStates = new Map<string, TableVirtualRowPoolState>();\n\n resetVirtualState(): void {\n this.virtualLookupCache = null;\n this.virtualRowPoolStates.clear();\n }\n\n render(options: TableBodyRenderOptions) {\n if (options.plan) return this.renderVirtualBodies(options);\n\n const { model } = options;\n if (!model.grouped) {\n return (\n <tbody class=\"ds-table__body\">\n {options.rows.map(row => options.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 =\n options.documentStickyHeader && options.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':\n options.stickyHeader && !options.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 {options.renderGroupContent(groupModel)}\n </th>\n </tr>\n {!isCollapsed && group.rows.map(row => options.renderRow(row, model))}\n {!isCollapsed && options.renderGroupLoadRow(group, model.totalColumns)}\n </tbody>\n );\n });\n }\n\n private renderVirtualSpacer(\n node: Extract<TableVirtualNode, { kind: 'spacer' }>,\n totalColumns: number\n ) {\n if (node.size <= 0) return null;\n return (\n <tr class=\"ds-table__virtual-spacer-row\" key={node.key} aria-hidden=\"true\">\n <td\n class=\"ds-table__virtual-spacer-cell\"\n colSpan={totalColumns}\n style={\n { '--_table-virtual-spacer-block-size': `${node.size}px` } as Record<string, string>\n }\n />\n </tr>\n );\n }\n\n private renderVirtualRow(\n node: Extract<TableVirtualNode, { kind: 'row' }>,\n options: TableBodyRenderOptions,\n rowsById: Map<string, TableRow>,\n rowKey: string\n ) {\n const row = node.item.rowId ? rowsById.get(node.item.rowId) : undefined;\n if (!row) return null;\n return options.renderRow(row, options.model, node.index + 2, node.item.variableSize, rowKey);\n }\n\n private virtualRowPoolKeys(nodes: readonly TableVirtualNode[], scope: string) {\n const state = this.virtualRowPoolStates.get(scope) ?? {\n slotsByRowId: new Map<string, number>(),\n nextSlot: 0,\n };\n this.virtualRowPoolStates.set(scope, state);\n return assignTableVirtualRowPoolKeys(nodes, state);\n }\n\n private renderVirtualGroup(\n node: Extract<TableVirtualNode, { kind: 'group' }>,\n options: TableBodyRenderOptions,\n rowsById: Map<string, TableRow>,\n groupsById: Map<string, TableGroupRenderModel>\n ) {\n const groupModel = groupsById.get(node.groupId);\n if (!groupModel) return null;\n const { group, collapsed: isCollapsed, intent, intentClass } = groupModel;\n const rowKeys = this.virtualRowPoolKeys(node.nodes, `group:${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 key={group.id}\n >\n <tr\n role=\"row\"\n data-virtual-id={`group:${group.id}`}\n aria-rowindex={node.headerIndex + 1 + (options.headerRowCount ?? 1)}\n class={{\n 'ds-table__group-row': true,\n 'ds-table__group-row--native-sticky':\n options.stickyHeader && !options.documentStickyHeader,\n }}\n >\n <th\n class={{\n 'ds-table__group-cell': true,\n [intentClass ?? '']: !!intentClass,\n }}\n role=\"rowheader\"\n scope=\"rowgroup\"\n colSpan={options.model.totalColumns}\n >\n {options.renderGroupContent(groupModel)}\n </th>\n </tr>\n {node.nodes.map(child =>\n child.kind === 'spacer'\n ? this.renderVirtualSpacer(child, options.model.totalColumns)\n : this.renderVirtualRow(\n child,\n options,\n rowsById,\n rowKeys.get(child.index) ?? `virtual-row-${child.index}`\n )\n )}\n </tbody>\n );\n }\n\n private renderVirtualBodies(options: TableBodyRenderOptions) {\n const { model, plan } = options;\n if (!plan) return null;\n let lookup = this.virtualLookupCache;\n if (!lookup || lookup.rows !== model.loadedRows || lookup.groups !== model.groups) {\n lookup = {\n rows: model.loadedRows,\n groups: model.groups,\n rowsById: new Map(model.loadedRows.map(row => [row.id, row])),\n groupsById: new Map(model.groups.map(groupModel => [groupModel.group.id, groupModel])),\n };\n this.virtualLookupCache = lookup;\n }\n const { rowsById, groupsById } = lookup;\n if (!model.grouped) {\n for (const scope of this.virtualRowPoolStates.keys()) {\n if (scope !== 'flat') this.virtualRowPoolStates.delete(scope);\n }\n const rowKeys = this.virtualRowPoolKeys(plan.nodes, 'flat');\n return (\n <tbody class=\"ds-table__body\">\n {plan.nodes.map(node =>\n node.kind === 'spacer'\n ? this.renderVirtualSpacer(node, model.totalColumns)\n : node.kind === 'row'\n ? this.renderVirtualRow(\n node,\n options,\n rowsById,\n rowKeys.get(node.index) ?? `virtual-row-${node.index}`\n )\n : null\n )}\n </tbody>\n );\n }\n\n const activeGroupScopes = new Set(\n plan.nodes\n .filter(\n (node): node is Extract<TableVirtualNode, { kind: 'group' }> => node.kind === 'group'\n )\n .map(node => `group:${node.groupId}`)\n );\n for (const scope of this.virtualRowPoolStates.keys()) {\n if (!activeGroupScopes.has(scope)) this.virtualRowPoolStates.delete(scope);\n }\n return plan.nodes.map(node => {\n if (node.kind === 'spacer') {\n return (\n <tbody class=\"ds-table__body ds-table__virtual-pad\" aria-hidden=\"true\" key={node.key}>\n {this.renderVirtualSpacer(node, model.totalColumns)}\n </tbody>\n );\n }\n if (node.kind === 'group') {\n return this.renderVirtualGroup(node, options, rowsById, groupsById);\n }\n return null;\n });\n }\n}\n","import { tableColumnSize } from './table-model';\nimport type { TableCellSpan, TableColumn, TableRow } from './table-types';\n\nexport interface TableColumnLayout {\n style: Record<string, string>;\n edge?: 'start' | 'end';\n}\n\n/** Column-only work. Never measure cells or scan rows while scrolling. */\nexport function tablePinnedColumns(columns: TableColumn[], selectable: boolean) {\n const result = new Map<string, TableColumnLayout>();\n for (const edge of ['start', 'end'] as const) {\n const pinned = columns.filter(column => column.sticky === edge && tableColumnSize(column));\n const ordered = edge === 'start' ? pinned : [...pinned].reverse();\n const sizes =\n edge === 'start' && selectable ? ['var(--_table-selection-column-inline-size)'] : [];\n for (const [index, column] of ordered.entries()) {\n result.set(column.id, {\n style: { '--_table-pin-offset': sizes.length ? `calc(${sizes.join(' + ')})` : '0px' },\n edge: index === ordered.length - 1 ? edge : undefined,\n });\n sizes.push(tableColumnSize(column)!);\n }\n }\n return result;\n}\n\nexport interface TableHeaderBand {\n key: string;\n label?: string;\n start: number;\n span: number;\n firstColumnId?: string;\n lastColumnId?: string;\n sticky?: 'start' | 'end';\n}\n\n/** Split at visibility, reorder, selection, spacer and pin boundaries. Never span an unrelated column. */\nexport function tableHeaderBands(\n columns: TableColumn[],\n selectable: boolean,\n spacer?: number\n): TableHeaderBand[] {\n if (!columns.some(column => column.group)) return [];\n const lanes: Array<TableColumn | undefined> = [...columns];\n if (spacer != null) lanes.splice(spacer, 0, undefined);\n if (selectable) lanes.unshift(undefined);\n const bands: TableHeaderBand[] = [];\n let previous: TableColumn | undefined;\n for (const [index, column] of lanes.entries()) {\n const group = column?.group;\n const last = bands[bands.length - 1];\n if (group && previous?.group?.id === group.id && previous.sticky === column?.sticky && last) {\n last.span++;\n last.lastColumnId = column?.id;\n } else {\n bands.push({\n key: `band-${index}`,\n label: group?.label,\n start: index + 1,\n span: 1,\n firstColumnId: column?.id,\n lastColumnId: column?.id,\n sticky: column?.sticky,\n });\n }\n previous = column;\n }\n return bands;\n}\n\nexport type TableSpanCell =\n | { rowSpan: number; colSpan: number; columnStart: number; columnIds: string[] }\n | 'covered';\nexport interface TableSpanModel {\n cells: Map<string, Map<string, TableSpanCell>>;\n issues: string[];\n hasRowSpans: boolean;\n}\n\n/** Validate the complete rectangle before covering any cells. Invalid spans leave all data visible. */\nexport function tableSpanModel(\n spans: TableCellSpan[],\n rows: TableRow[],\n columns: TableColumn[],\n options: {\n windowed: boolean;\n grouped: boolean;\n grid: boolean;\n selectable: boolean;\n spacer?: number;\n }\n): TableSpanModel {\n const result: TableSpanModel = { cells: new Map(), issues: [], hasRowSpans: false };\n if (!spans.length) return result;\n const rowIndex = new Map(rows.map((row, index) => [row.id, index]));\n const columnIndex = new Map(columns.map((column, index) => [column.id, index]));\n const contiguous = (ids: string[], indices: Map<string, number>) =>\n ids.length > 0 &&\n ids.every((id, index) => indices.get(id) === (indices.get(ids[0]) ?? -100000) + index);\n for (const [index, span] of spans.entries()) {\n if (\n !span ||\n !Array.isArray(span.rowIds) ||\n !Array.isArray(span.columnIds) ||\n !span.rowIds.every(id => typeof id === 'string') ||\n !span.columnIds.every(id => typeof id === 'string')\n ) {\n result.issues.push(\n `Merge ${index + 1} ignored: rowIds and columnIds must be identity arrays.`\n );\n continue;\n }\n const start = columnIndex.get(span.columnIds[0]) ?? -1;\n const end = start + span.columnIds.length;\n const sticky = columns[start]?.sticky;\n const invalid =\n options.grouped ||\n options.grid ||\n span.rowIds.length * span.columnIds.length > 10000 ||\n (options.windowed && span.rowIds.length > 1) ||\n !contiguous(span.rowIds, rowIndex) ||\n !contiguous(span.columnIds, columnIndex) ||\n (options.spacer != null && start < options.spacer && end > options.spacer) ||\n span.columnIds.some(id => columns[columnIndex.get(id)!]?.sticky !== sticky) ||\n (!!sticky && span.columnIds.some(id => !tableColumnSize(columns[columnIndex.get(id)!]))) ||\n span.rowIds.some(rowId => span.columnIds.some(id => result.cells.get(rowId)?.has(id)));\n if (invalid) {\n result.issues.push(\n `Merge ${index + 1} ignored: requires a non-overlapping contiguous rectangle, no pin/spacer crossing, no grouping/grid, and no virtual row span.`\n );\n continue;\n }\n result.hasRowSpans ||= span.rowIds.length > 1;\n for (const [ri, rowId] of span.rowIds.entries()) {\n const cells = result.cells.get(rowId) ?? new Map<string, TableSpanCell>();\n for (const [ci, id] of span.columnIds.entries()) {\n cells.set(\n id,\n ri === 0 && ci === 0\n ? {\n rowSpan: span.rowIds.length,\n colSpan: span.columnIds.length,\n columnStart:\n start +\n 1 +\n Number(options.selectable) +\n Number(options.spacer != null && start >= options.spacer),\n columnIds: span.columnIds,\n }\n : 'covered'\n );\n }\n result.cells.set(rowId, cells);\n }\n }\n return result;\n}\n","import type {\n TableCellAddress,\n TableCellRange,\n TableCellsChangeDetail,\n TableColumn,\n TableRow,\n} from './table-types';\nimport { parseLooseCalendarDate } from '../../utils/date-filter-value';\nimport { parseLooseClockTime, isClockTimeStepAligned } from '../../utils/clock-time';\n\n/** Snapshot-local index; arrow navigation and visible-cell range checks are constant time. */\nexport function tableGridModel(rows: TableRow[], columns: TableColumn[]) {\n let firstEditable: TableCellAddress | null = null;\n for (const row of rows) {\n const column = columns.find(column => tableEditable(row, column));\n if (column) {\n firstEditable = { rowId: row.id, columnId: column.id };\n break;\n }\n }\n return {\n firstEditable,\n rows,\n columns,\n rowIndices: new Map(rows.map((row, index) => [row.id, index])),\n columnIndices: new Map(columns.map((column, index) => [column.id, index])),\n };\n}\nexport type TableGridModel = ReturnType<typeof tableGridModel>;\n\n/** Scan only on navigation, not render/scroll; read-only cells are never focus stops. */\nexport function tableNextEditable(\n model: TableGridModel,\n address: TableCellAddress,\n key: string,\n backwards = false\n): TableCellAddress | null {\n let ri = model.rowIndices.get(address.rowId),\n ci = model.columnIndices.get(address.columnId);\n if (ri == null || ci == null) return null;\n let dr = 0,\n dc = 0;\n if (key === 'ArrowDown') dr = 1;\n else if (key === 'ArrowUp') dr = -1;\n else if (key === 'ArrowRight') dc = 1;\n else if (key === 'ArrowLeft') dc = -1;\n else if (key === 'Home') {\n ci = -1;\n dc = 1;\n } else if (key === 'End') {\n ci = model.columns.length;\n dc = -1;\n } else if (key === 'Tab') dc = backwards ? -1 : 1;\n else return null;\n while (true) {\n ri += dr;\n ci += dc;\n if (key === 'Tab') {\n if (ci < 0) {\n ri--;\n ci = model.columns.length - 1;\n } else if (ci >= model.columns.length) {\n ri++;\n ci = 0;\n }\n }\n const row = model.rows[ri],\n column = model.columns[ci];\n if (!row || !column) return null;\n if (tableEditable(row, column)) return { rowId: row.id, columnId: column.id };\n }\n}\n\nexport function tableRangeBounds(model: TableGridModel, range: TableCellRange | null) {\n if (!range) return null;\n const r1 = model.rowIndices.get(range.anchor.rowId),\n r2 = model.rowIndices.get(range.focus.rowId);\n const c1 = model.columnIndices.get(range.anchor.columnId),\n c2 = model.columnIndices.get(range.focus.columnId);\n if (r1 == null || r2 == null || c1 == null || c2 == null) return null;\n return {\n firstRow: Math.min(r1, r2),\n lastRow: Math.max(r1, r2),\n firstColumn: Math.min(c1, c2),\n lastColumn: Math.max(c1, c2),\n };\n}\n\nexport function tableEditable(row: TableRow, column: TableColumn): boolean {\n const value = row.cells[column.id];\n return (\n !!column.editor &&\n column.kind !== 'action' &&\n !row.disabled &&\n (value == null || typeof value === 'string' || typeof value === 'number')\n );\n}\n\nexport function tableEditValue(\n text: string,\n column: TableColumn\n): string | number | null | undefined {\n const editor = column.editor;\n if (!editor || (editor.required && !text.trim())) return undefined;\n if (editor.type === 'text' || editor.type === 'textarea')\n return (editor.minLength == null || !text || text.length >= editor.minLength) &&\n (editor.maxLength == null || text.length <= editor.maxLength)\n ? text\n : undefined;\n if (editor.type === 'select')\n return !text || editor.options.some(option => option.value === text && !option.isInactive)\n ? text\n : undefined;\n if (editor.type === 'date' || editor.type === 'time') {\n if (!text.trim()) return '';\n const value = editor.type === 'date' ? parseLooseCalendarDate(text) : parseLooseClockTime(text);\n return value &&\n (!editor.min || value >= editor.min) &&\n (!editor.max || value <= editor.max) &&\n (editor.type !== 'time' || isClockTimeStepAligned(value, editor.step ?? 60, editor.min))\n ? value\n : undefined;\n }\n if (editor.type !== 'number') return undefined;\n if (!text.trim()) return null;\n const value = Number(text);\n return Number.isFinite(value) &&\n (editor.min == null || value >= editor.min) &&\n (editor.max == null || value <= editor.max) &&\n (editor.step == null ||\n editor.step <= 0 ||\n Math.abs(\n (value - (editor.min ?? 0)) / editor.step -\n Math.round((value - (editor.min ?? 0)) / editor.step)\n ) < 1e-8)\n ? value\n : undefined;\n}\n\n/** Plain TSV only, bounded and atomic: never partially apply invalid or read-only rectangles. */\nexport function tablePasteChanges(\n model: TableGridModel,\n address: TableCellAddress,\n text: string\n): TableCellsChangeDetail['changes'] | null {\n if (text.length > 1_000_000) return null;\n const row = model.rowIndices.get(address.rowId),\n column = model.columnIndices.get(address.columnId);\n if (row == null || column == null) return null;\n const records = text\n .replace(/\\r\\n?/g, '\\n')\n .replace(/\\n$/, '')\n .split('\\n')\n .map(line => line.split('\\t'));\n const width = records[0].length;\n if (records.length * width > 10000 || records.some(record => record.length !== width))\n return null;\n const changes: TableCellsChangeDetail['changes'] = [];\n for (const [ri, record] of records.entries()) {\n for (const [ci, textValue] of record.entries()) {\n const targetRow = model.rows[row + ri],\n targetColumn = model.columns[column + ci];\n if (!targetRow || !targetColumn || !tableEditable(targetRow, targetColumn)) return null;\n const value = tableEditValue(textValue, targetColumn);\n if (value === undefined) return null;\n changes.push({ rowId: targetRow.id, columnId: targetColumn.id, value });\n }\n }\n return changes;\n}\n","import { h } from '@stencil/core';\nimport type { TableCellEditor } from './table-types';\n\n/** Shared controls own field behavior; Table owns the draft, cell chrome and commit boundary. */\nexport function renderTableCellEditor(\n editor: TableCellEditor,\n value: string,\n ariaLabel: string,\n anchor: HTMLElement | undefined,\n change: (value: string) => void\n) {\n const common = {\n value,\n ariaLabel,\n required: editor.required,\n size: 'md' as const,\n width: 'fill' as const,\n hasBorder: false,\n hasInteractionFill: false,\n onDsChange: (event: CustomEvent<string | string[]>) => {\n event.stopPropagation();\n if (typeof event.detail === 'string') change(event.detail);\n },\n };\n switch (editor.type) {\n case 'select':\n return (\n <ds-select\n {...common}\n options={editor.options}\n searchable={editor.searchable}\n anchor={anchor}\n hasFocusRing={false}\n />\n );\n case 'date':\n return <ds-input-date {...common} min={editor.min} max={editor.max} />;\n case 'time':\n return (\n <ds-input-time\n {...common}\n min={editor.min}\n max={editor.max}\n step={editor.step ?? 60}\n hourFormat={editor.hourFormat ?? '24'}\n />\n );\n case 'textarea':\n return (\n <ds-textarea\n {...common}\n rows={1}\n resize=\"none\"\n minLength={editor.minLength}\n maxLength={editor.maxLength}\n />\n );\n case 'number':\n return (\n <ds-input\n {...common}\n type=\"number\"\n min={editor.min}\n max={editor.max}\n step={editor.step}\n showStepper={editor.showStepper ?? true}\n />\n );\n default:\n return (\n <ds-input\n {...common}\n type=\"text\"\n minLength={editor.minLength}\n maxLength={editor.maxLength}\n />\n );\n }\n}\n","import { h } from '@stencil/core';\nimport { resolveTableCellImageTracks, tableCellImageVariant } from './table-cell-model';\nimport type { TableRenderModel } from './table-render-model';\nimport type { TableCellSkeleton, TableColumn } from './table-types';\nimport type { TableColumnLayout } from './table-structure';\n\ninterface TableSkeletonViewOptions {\n pins?: Map<string, TableColumnLayout>;\n model: TableRenderModel;\n visibleColumns: TableColumn[];\n skeletonRows: number;\n renderStickyEdge: (sticky: TableColumn['sticky'], shadow?: boolean) => unknown;\n}\n\n/** Render the loading body from the same cell recipes used by loaded rows. */\nexport function renderTableSkeletonBody(options: TableSkeletonViewOptions) {\n const { model, visibleColumns, renderStickyEdge } = options;\n const count = Math.min(20, Math.max(1, Math.round(options.skeletonRows) || 1));\n const beforeSpacer =\n model.elasticSpacerIndex == null\n ? visibleColumns\n : visibleColumns.slice(0, model.elasticSpacerIndex);\n const afterSpacer =\n model.elasticSpacerIndex == null ? [] : visibleColumns.slice(model.elasticSpacerIndex);\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 {renderStickyEdge(\n 'start',\n !options.pins || ![...options.pins.values()].some(pin => pin.edge === 'start')\n )}\n </td>\n )}\n {beforeSpacer.map(column =>\n renderSkeletonCell(column, index, renderStickyEdge, options.pins?.get(column.id))\n )}\n {model.elasticSpacerIndex != null && (\n <td\n class=\"ds-table__cell ds-table__elastic-spacer-cell ds-table__skeleton-cell ds-interaction-fill ds-interaction-fill--grouped\"\n aria-hidden=\"true\"\n role=\"presentation\"\n data-elastic-spacer=\"true\"\n />\n )}\n {afterSpacer.map(column =>\n renderSkeletonCell(column, index, renderStickyEdge, options.pins?.get(column.id))\n )}\n </tr>\n ))}\n </tbody>\n );\n}\n\nfunction renderSkeletonCell(\n column: TableColumn,\n rowIndex: number,\n renderStickyEdge: TableSkeletonViewOptions['renderStickyEdge'],\n layout?: TableColumnLayout\n) {\n const skeleton =\n column.skeleton ??\n ((column.kind === 'action'\n ? { kind: 'action', variant: 'icon' }\n : { kind: 'text', lines: 1 }) satisfies TableCellSkeleton);\n const align = column.align ?? 'start';\n const text = skeleton.kind === 'text';\n const iconText = skeleton.kind === 'icon-text';\n const scoreText = skeleton.kind === 'score-text';\n const lines = text || iconText || scoreText ? (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\n ? 'triple'\n : lines === 2\n ? 'multi'\n : 'single'\n : undefined;\n const scoreTextVariant = scoreText\n ? lines === 3\n ? 'triple'\n : lines === 2\n ? 'multi'\n : 'single'\n : undefined;\n const action = skeleton.kind === 'action';\n const blank = skeleton.kind === 'blank';\n\n return (\n <td\n style={layout?.style}\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--score-text': scoreText,\n [`ds-table__cell--score-text-${scoreTextVariant}`]: scoreText,\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 ?? scoreTextVariant}\n key={`skeleton-${rowIndex}:${column.id}`}\n >\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {renderSkeletonCellContent(skeleton)}\n </span>\n {renderStickyEdge(layout ? column.sticky : undefined, !!layout?.edge)}\n </td>\n );\n}\n\nfunction 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 <ds-skeleton variant=\"control\" controlSize=\"sm\" width={skeleton.width ?? '64%'} />;\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 ? 'var(--dimension-size-300)' : '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 if (skeleton.kind === 'score-text') {\n return (\n <span class=\"ds-table__cell-score-text\">\n {copy}\n <span class=\"ds-table__cell-score-text-score\">\n <ds-score size=\"sm\" isLoading={true} label=\"Safety score\" />\n </span>\n </span>\n );\n }\n return copy;\n}\n","import { h } from '@stencil/core';\n\ninterface TableLoadContentOptions {\n error?: string;\n loading: boolean;\n hasMore: boolean;\n manualFallback: boolean;\n retryLabel: string;\n loadingLabel: string;\n loadMoreLabel: string;\n loadMoreAriaLabel?: string;\n endOfResultsLabel?: string;\n onRetry: () => void;\n onLoadMore: () => void;\n}\n\n/** Shared visible state machine for top-level and per-group incremental loading bands. */\nexport function renderTableLoadContent(options: TableLoadContentOptions) {\n if (options.error) {\n return (\n <span class=\"ds-table__load-content ds-table__load-content--error\">\n <span class=\"ds-table__load-copy\">\n <ds-icon name=\"ExclamationTriangle\" size=\"md\" color=\"secondary\" aria-hidden=\"true\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {options.error}\n </ds-text>\n </span>\n <ds-button-unfilled label={options.retryLabel} size=\"md\" onDsClick={options.onRetry} />\n </span>\n );\n }\n\n if (options.loading) {\n return (\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 {options.loadingLabel}\n </ds-text>\n </span>\n );\n }\n\n if (options.hasMore && options.manualFallback) {\n return (\n <span class=\"ds-table__load-content\">\n <ds-button-unfilled\n label={options.loadMoreLabel}\n aria-label={options.loadMoreAriaLabel}\n size=\"md\"\n onDsClick={options.onLoadMore}\n />\n </span>\n );\n }\n\n if (options.hasMore) return <span class=\"ds-table__auto-sentinel\" aria-hidden=\"true\" />;\n if (!options.endOfResultsLabel) return null;\n return (\n <ds-text class=\"ds-table__load-content\" as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {options.endOfResultsLabel}\n </ds-text>\n );\n}\n","export interface TableLayoutElements {\n viewport: HTMLElement | null;\n contentTable: HTMLTableElement | 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 const TABLE_CARD_VIEWPORT_BREAKPOINT = 768;\n\nexport function isTableCardViewport(inlineSize: number): boolean {\n return inlineSize < TABLE_CARD_VIEWPORT_BREAKPOINT;\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:\n 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:\n input.collapseHeadBlockStart == null || 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 connectedContentTable: HTMLTableElement | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private frame: number | null = null;\n private overflow: TableOverflowState | null = null;\n private inlineOffset = 0;\n private maxInlineOffset = 0;\n private maxBlockOffset = 0;\n private lastMode: TableLayoutMode | 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.connectedContentTable = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n /** Reconcile newly rendered refs, observers, and pending geometry. */\n refresh(forceGeometry = true): void {\n if (!this.connected) return;\n const { viewport, contentTable } = this.options.elements();\n const elementsChanged =\n viewport !== this.connectedViewport || contentTable !== this.connectedContentTable;\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 this.connectedContentTable = contentTable;\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 if (contentTable) this.resizeObserver.observe(contentTable);\n }\n }\n const mode = this.options.mode();\n const modeChanged =\n !this.lastMode ||\n mode.documentStickyHeader !== this.lastMode.documentStickyHeader ||\n mode.floatingCollapseAll !== this.lastMode.floatingCollapseAll ||\n mode.clampVerticalOverscroll !== this.lastMode.clampVerticalOverscroll;\n this.lastMode = mode;\n // New refs and explicit refreshes resolve before paint. A recycled virtual\n // window keeps the same scroll geometry, so ResizeObserver owns later size\n // changes without forcing layout after every row patch.\n if (forceGeometry || elementsChanged || modeChanged) 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 const viewport = this.connectedViewport;\n if (!viewport) return;\n const mode = this.options.mode();\n this.clampInlineOffset();\n if (mode.clampVerticalOverscroll) this.clampBlockOffset();\n if (\n viewport.scrollLeft !== this.inlineOffset ||\n (mode.floatingCollapseAll && !mode.documentStickyHeader)\n ) {\n this.schedule();\n }\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 atStart = viewport.scrollLeft <= 0 && event.deltaX < 0;\n const atEnd = viewport.scrollLeft >= this.maxInlineOffset && 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 atStart = viewport.scrollTop <= 0 && event.deltaY < 0;\n const atEnd = viewport.scrollTop >= this.maxBlockOffset && 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 clamped = Math.min(this.maxInlineOffset, 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 clamped = Math.min(this.maxBlockOffset, 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 =\n mode.floatingCollapseAll &&\n !mode.documentStickyHeader &&\n elements.collapseAllOverlay &&\n elements.frame &&\n 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 this.inlineOffset = metrics.inlineOffset;\n this.maxInlineOffset = metrics.maxInlineOffset;\n this.maxBlockOffset = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n // Header-only geometry; independent of the loaded/recycled row count.\n const pinnedCells = elements.interactiveHead?.querySelectorAll?.<HTMLElement>(\n '.ds-table__header-cell:not(.ds-table__super-header-cell).ds-table__cell--sticky-start, .ds-table__header-cell:not(.ds-table__super-header-cell).ds-table__cell--sticky-end'\n );\n const pinnedSize = [...(pinnedCells ?? [])].reduce(\n (size, cell) => size + cell.getBoundingClientRect().width,\n 0\n );\n const crowded = pinnedSize > 0 && pinnedSize >= metrics.visibleInlineSize;\n if (elements.frame?.getAttribute('data-pins-crowded') !== String(crowded))\n elements.frame?.setAttribute('data-pins-crowded', String(crowded));\n this.setProperty(viewport, '--ds-table-visible-inline-size', `${metrics.visibleInlineSize}px`);\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 { TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason } 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 )\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 DataGroup,\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: DataGroup[];\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: DataGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: DataGroup, count?: number): string {\n return template\n .split('{group}')\n .join(group.label)\n .split('{count}')\n .join(String(count ?? group.rows.length))\n .split('{loaded}')\n .join(String(group.rows.length))\n .split('{total}')\n .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 )\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: DataGroup): 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","import { resolveTableCellPresentation } from './table-cell-model';\nimport { tableGroupAccessories } from './table-model';\nimport type { TableColumn, DataGroup, TableRow } from './table-types';\n\n/**\n * Token-aligned body-row track contracts: 40 / 64 / 88, plus wrapping-secondary\n * 112. Every track is 24px with no stack gap. Estimates only; measured heights\n * replace these after paint.\n */\nexport const TABLE_VIRTUAL_ROW_TRACK_SIZE = {\n 1: 40,\n 2: 64,\n 3: 88,\n 4: 112,\n} as const;\n\nconst TABLE_VIRTUAL_LATER_TRACK_INCREMENT =\n TABLE_VIRTUAL_ROW_TRACK_SIZE[2] - TABLE_VIRTUAL_ROW_TRACK_SIZE[1];\n\n/** Estimated row height for any positive named track count. */\nexport function tableVirtualRowTrackSize(tracks: number): number {\n const count = Number.isFinite(tracks) && tracks > 0 ? Math.floor(tracks) : 1;\n return TABLE_VIRTUAL_ROW_TRACK_SIZE[1] + (count - 1) * TABLE_VIRTUAL_LATER_TRACK_INCREMENT;\n}\n\nexport const TABLE_VIRTUAL_GROUP_HEADER_SIZE = TABLE_VIRTUAL_ROW_TRACK_SIZE[1];\nexport const TABLE_VIRTUAL_MIN_OVERSCAN_ROWS = 8;\n\nexport const TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING = 'Bounded height required';\nexport const TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY =\n 'Virtual mode requires height, maxHeight, or fitViewport.';\n\nexport const TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL = '{total} items';\n\nexport type TableVirtualItemKind = 'group' | 'row';\n\nexport interface TableVirtualItem {\n kind: TableVirtualItemKind;\n id: string;\n groupId?: string;\n rowId?: string;\n estimatedSize: number;\n variableSize: boolean;\n}\n\nexport type TableVirtualNode =\n | { kind: 'spacer'; size: number; key: string }\n | { kind: 'row'; index: number; item: TableVirtualItem }\n | {\n kind: 'group';\n groupId: string;\n headerIndex: number;\n nodes: Array<Extract<TableVirtualNode, { kind: 'spacer' | 'row' }>>;\n };\n\nexport interface TableVirtualPlan {\n totalSize: number;\n itemCount: number;\n start: number;\n end: number;\n nodes: TableVirtualNode[];\n mountedIds: ReadonlySet<string>;\n mountedIndexes: ReadonlySet<number>;\n}\n\nexport interface FlattenTableVirtualItemsInput {\n grouped: boolean;\n rows: TableRow[];\n groups: DataGroup[];\n collapsedGroupIds: ReadonlySet<string> | readonly string[];\n columns: TableColumn[];\n}\n\nexport interface ResolveTableVirtualPlanInput {\n items: readonly TableVirtualItem[];\n sizes: readonly number[];\n scrollOffset: number;\n viewportSize: number;\n pinnedRowIds?: ReadonlySet<string>;\n}\n\nexport interface TableVirtualIndex {\n items: readonly TableVirtualItem[];\n sizes: readonly number[];\n prefix: readonly number[];\n itemCount: number;\n totalSize: number;\n hasVariableSize: boolean;\n grouped: boolean;\n groupHeaderIndexes: readonly number[];\n headerIndexByGroup: ReadonlyMap<string, number>;\n groupEndByHeader: ReadonlyMap<number, number>;\n rowIndexById: ReadonlyMap<string, number>;\n itemIndexById: ReadonlyMap<string, number>;\n}\n\nexport interface ResolveTableVirtualIndexedPlanInput {\n scrollOffset: number;\n viewportSize: number;\n scrollDirection?: 'backward' | 'forward' | 'none';\n pinnedRowIds?: ReadonlySet<string>;\n}\n\n/** Map a cell recipe onto the named track stack used for first-paint estimates. */\nexport function estimateTableCellTrackCount(\n value: TableRow['cells'][string],\n column: TableColumn\n): number {\n return tableCellTrackCount(resolveTableCellPresentation(value, column));\n}\n\nfunction tableCellTrackCount(\n presentation: ReturnType<typeof resolveTableCellPresentation>\n): number {\n if (presentation.kind === 'image') {\n return presentation.variant === 'triple' ? 3 : presentation.variant === 'multi' ? 2 : 1;\n }\n if (presentation.kind === 'tag') {\n return presentation.variant === 'text-with-tag' ? 2 : 1;\n }\n if (presentation.kind === 'tags') return presentation.tracks;\n if (\n presentation.kind !== 'text' &&\n presentation.kind !== 'icon-text' &&\n presentation.kind !== 'score-text'\n )\n return 1;\n\n const variantTracks =\n presentation.variant === 'triple'\n ? 3\n : presentation.variant === 'multi' || presentation.variant === 'primary-pair'\n ? 2\n : 1;\n if (!presentation.wraps) return variantTracks;\n if (presentation.lineClamp === 'none') {\n return presentation.kind === 'text' && !presentation.singleLine ? 4 : 3;\n }\n if (presentation.lineClamp === 3 && variantTracks >= 2) return 4;\n return Math.max(variantTracks, presentation.lineClamp);\n}\n\n/** Tallest named track stack across the row's visible cells. */\nexport function estimateTableRowBlockSize(row: TableRow, columns: readonly TableColumn[]): number {\n return tableVirtualRowMetrics(row, columns).estimatedSize;\n}\n\nfunction tableVirtualRowMetrics(\n row: TableRow,\n columns: readonly TableColumn[]\n): Pick<TableVirtualItem, 'estimatedSize' | 'variableSize'> {\n let tracks = 1;\n let variableSize = false;\n for (const column of columns) {\n const value = row.cells[column.id];\n const presentation = resolveTableCellPresentation(value, column);\n if (\n (presentation.kind === 'text' ||\n presentation.kind === 'icon-text' ||\n presentation.kind === 'score-text') &&\n presentation.wraps &&\n presentation.lineClamp === 'none'\n ) {\n variableSize = true;\n }\n if (presentation.kind === 'tags') variableSize = true;\n const count = tableCellTrackCount(presentation);\n if (count > tracks) tracks = count;\n }\n return { estimatedSize: tableVirtualRowTrackSize(tracks), variableSize };\n}\n\nexport function flattenTableVirtualItems(input: FlattenTableVirtualItemsInput): TableVirtualItem[] {\n const collapsed =\n input.collapsedGroupIds instanceof Set\n ? input.collapsedGroupIds\n : new Set(input.collapsedGroupIds);\n if (!input.grouped) {\n return input.rows.map(row => {\n const metrics = tableVirtualRowMetrics(row, input.columns);\n return {\n kind: 'row' as const,\n id: `row:${row.id}`,\n rowId: row.id,\n ...metrics,\n };\n });\n }\n\n const items: TableVirtualItem[] = [];\n for (const group of input.groups) {\n items.push({\n kind: 'group',\n id: `group:${group.id}`,\n groupId: group.id,\n estimatedSize: tableVirtualRowTrackSize(tableGroupAccessories(group).length > 0 ? 2 : 1),\n variableSize: false,\n });\n if (collapsed.has(group.id)) continue;\n for (const row of group.rows) {\n const metrics = tableVirtualRowMetrics(row, input.columns);\n items.push({\n kind: 'row',\n id: `row:${row.id}`,\n rowId: row.id,\n groupId: group.id,\n ...metrics,\n });\n }\n }\n return items;\n}\n\nexport function tableVirtualOverscanPx(viewportSize: number): number {\n const min = TABLE_VIRTUAL_MIN_OVERSCAN_ROWS * TABLE_VIRTUAL_ROW_TRACK_SIZE[1];\n return Math.max(0, viewportSize / 2, min);\n}\n\nexport function buildTableVirtualPrefixSums(sizes: readonly number[]): number[] {\n const prefix = new Array<number>(sizes.length + 1);\n prefix[0] = 0;\n for (let index = 0; index < sizes.length; index += 1) {\n prefix[index + 1] = prefix[index] + Math.max(0, sizes[index] ?? 0);\n }\n return prefix;\n}\n\n/** Largest item index whose start offset is <= `offset`. */\nexport function findTableVirtualIndexAtOffset(prefix: readonly number[], offset: number): number {\n const lastIndex = prefix.length - 2;\n if (lastIndex < 0) return 0;\n const target = Math.max(0, offset);\n let low = 0;\n let high = lastIndex;\n while (low < high) {\n const mid = (low + high + 1) >> 1;\n if ((prefix[mid] ?? 0) <= target) low = mid;\n else high = mid - 1;\n }\n return low;\n}\n\nexport function tableVirtualItemSizes(\n items: readonly TableVirtualItem[],\n measures: ReadonlyMap<string, number>\n): number[] {\n return items.map(item => measures.get(item.id) ?? item.estimatedSize);\n}\n\nexport function sameTableVirtualPlan(\n left: TableVirtualPlan | null | undefined,\n right: TableVirtualPlan | null | undefined\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n if (\n left.start !== right.start ||\n left.end !== right.end ||\n left.totalSize !== right.totalSize ||\n left.itemCount !== right.itemCount ||\n left.mountedIndexes.size !== right.mountedIndexes.size\n ) {\n return false;\n }\n for (const index of left.mountedIndexes) {\n if (!right.mountedIndexes.has(index)) return false;\n }\n return sameVirtualNodes(left.nodes, right.nodes);\n}\n\nfunction sameVirtualNodes(\n left: readonly TableVirtualNode[],\n right: readonly TableVirtualNode[]\n): boolean {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1) {\n const a = left[index];\n const b = right[index];\n if (!a || !b || a.kind !== b.kind) return false;\n if (a.kind === 'spacer' && b.kind === 'spacer') {\n if (a.size !== b.size || a.key !== b.key) return false;\n continue;\n }\n if (a.kind === 'row' && b.kind === 'row') {\n if (a.index !== b.index || a.item.id !== b.item.id) return false;\n continue;\n }\n if (a.kind === 'group' && b.kind === 'group') {\n if (a.groupId !== b.groupId || a.headerIndex !== b.headerIndex) return false;\n if (!sameVirtualNodes(a.nodes, b.nodes)) return false;\n }\n }\n return true;\n}\n\n/** Precompute dataset-wide lookup state. Rebuild only when items or their sizes change. */\nexport function createTableVirtualIndex(\n items: readonly TableVirtualItem[],\n sizes: readonly number[]\n): TableVirtualIndex {\n const prefix = buildTableVirtualPrefixSums(sizes);\n const itemCount = items.length;\n const groupHeaderIndexes: number[] = [];\n const headerIndexByGroup = new Map<string, number>();\n const groupEndByHeader = new Map<number, number>();\n const rowIndexById = new Map<string, number>();\n const itemIndexById = new Map<string, number>();\n let activeHeaderIndex: number | null = null;\n let hasVariableSize = false;\n\n for (let itemIndex = 0; itemIndex < itemCount; itemIndex += 1) {\n const item = items[itemIndex];\n if (item) {\n itemIndexById.set(item.id, itemIndex);\n hasVariableSize ||= item.variableSize;\n }\n if (item?.kind === 'group' && item.groupId) {\n if (activeHeaderIndex != null) groupEndByHeader.set(activeHeaderIndex, itemIndex);\n activeHeaderIndex = itemIndex;\n groupHeaderIndexes.push(itemIndex);\n headerIndexByGroup.set(item.groupId, itemIndex);\n } else if (item?.kind === 'row' && item.rowId) {\n rowIndexById.set(item.rowId, itemIndex);\n }\n }\n if (activeHeaderIndex != null) groupEndByHeader.set(activeHeaderIndex, itemCount);\n\n return {\n items,\n sizes,\n prefix,\n itemCount,\n totalSize: prefix[itemCount] ?? 0,\n hasVariableSize,\n grouped: groupHeaderIndexes.length > 0,\n groupHeaderIndexes,\n headerIndexByGroup,\n groupEndByHeader,\n rowIndexById,\n itemIndexById,\n };\n}\n\n/** Resolve the mounted slice from cached dataset-wide lookup state. */\nexport function resolveTableVirtualPlanFromIndex(\n index: TableVirtualIndex,\n input: ResolveTableVirtualIndexedPlanInput\n): TableVirtualPlan {\n const { items, prefix, itemCount, totalSize } = index;\n const empty: TableVirtualPlan = {\n totalSize,\n itemCount,\n start: 0,\n end: 0,\n nodes: totalSize > 0 ? [{ kind: 'spacer', size: totalSize, key: 'pad-empty' }] : [],\n mountedIds: new Set(),\n mountedIndexes: new Set(),\n };\n if (itemCount === 0) return empty;\n\n const viewportSize = Math.max(0, input.viewportSize);\n const overscan = tableVirtualOverscanPx(viewportSize);\n const trailingOverscan = (TABLE_VIRTUAL_MIN_OVERSCAN_ROWS * TABLE_VIRTUAL_ROW_TRACK_SIZE[1]) / 4;\n const before = input.scrollDirection === 'forward' ? trailingOverscan : overscan;\n const after = input.scrollDirection === 'backward' ? trailingOverscan : overscan;\n const scrollOffset = Math.max(0, Math.min(input.scrollOffset, Math.max(0, totalSize)));\n const rangeStart = Math.max(0, scrollOffset - before);\n const rangeEnd = scrollOffset + viewportSize + after;\n const start = findTableVirtualIndexAtOffset(prefix, rangeStart);\n let end = start;\n while (end < itemCount && (prefix[end] ?? 0) < rangeEnd) end += 1;\n if (end === start) end = Math.min(itemCount, start + 1);\n\n const mounted = new Set<number>();\n for (let itemIndex = start; itemIndex < end; itemIndex += 1) mounted.add(itemIndex);\n\n const pinHeader = (groupId: string | undefined) => {\n if (!groupId) return;\n const headerIndex = index.headerIndexByGroup.get(groupId);\n if (headerIndex != null) mounted.add(headerIndex);\n };\n for (const mountedIndex of [...mounted]) pinHeader(items[mountedIndex]?.groupId);\n\n const nextHeader = firstTableVirtualIndexAfter(index.groupHeaderIndexes, end - 1);\n if (nextHeader != null) mounted.add(nextHeader);\n\n if (input.pinnedRowIds) {\n for (const rowId of input.pinnedRowIds) {\n const rowIndex = index.rowIndexById.get(rowId);\n if (rowIndex == null) continue;\n mounted.add(rowIndex);\n pinHeader(items[rowIndex]?.groupId);\n }\n }\n\n const mountedSorted = [...mounted].sort((left, right) => left - right);\n const nodes = index.grouped\n ? buildGroupedVirtualNodes(index, mounted, mountedSorted)\n : buildFlatVirtualNodes(index, mountedSorted);\n const mountedIds = new Set<string>();\n for (const mountedIndex of mounted) {\n const id = items[mountedIndex]?.id;\n if (id) mountedIds.add(id);\n }\n\n return {\n totalSize,\n itemCount,\n start: mountedSorted[0] ?? start,\n end: mountedSorted.length > 0 ? mountedSorted[mountedSorted.length - 1]! + 1 : end,\n nodes,\n mountedIds,\n mountedIndexes: mounted,\n };\n}\n\n/** Resolve a one-off plan. Controllers retain and reuse a prepared index. */\nexport function resolveTableVirtualPlan(input: ResolveTableVirtualPlanInput): TableVirtualPlan {\n return resolveTableVirtualPlanFromIndex(createTableVirtualIndex(input.items, input.sizes), input);\n}\n\nfunction firstTableVirtualIndexAfter(\n indexes: readonly number[],\n target: number\n): number | undefined {\n let low = 0;\n let high = indexes.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if ((indexes[middle] ?? 0) <= target) low = middle + 1;\n else high = middle;\n }\n return indexes[low];\n}\n\nfunction buildFlatVirtualNodes(\n index: TableVirtualIndex,\n mounted: readonly number[]\n): TableVirtualNode[] {\n const { items, prefix, itemCount } = index;\n const nodes: TableVirtualNode[] = [];\n let cursor = 0;\n for (const mountedIndex of mounted) {\n const item = items[mountedIndex];\n if (!item) continue;\n const spacerSize = (prefix[mountedIndex] ?? 0) - (prefix[cursor] ?? 0);\n if (spacerSize > 0) {\n nodes.push({ kind: 'spacer', size: spacerSize, key: `pad-${cursor}-${mountedIndex}` });\n }\n nodes.push({ kind: 'row', index: mountedIndex, item });\n cursor = mountedIndex + 1;\n }\n const trailingSize = (prefix[itemCount] ?? 0) - (prefix[cursor] ?? 0);\n if (trailingSize > 0) {\n nodes.push({ kind: 'spacer', size: trailingSize, key: `pad-${cursor}-${itemCount}` });\n }\n return nodes;\n}\n\nfunction buildGroupedVirtualNodes(\n index: TableVirtualIndex,\n mounted: ReadonlySet<number>,\n mountedSorted: readonly number[]\n): TableVirtualNode[] {\n const { items, prefix, itemCount } = index;\n const nodes: TableVirtualNode[] = [];\n const selectedHeaders = new Set<number>();\n for (const mountedIndex of mountedSorted) {\n const item = items[mountedIndex];\n const headerIndex =\n item?.kind === 'group'\n ? mountedIndex\n : item?.groupId\n ? index.headerIndexByGroup.get(item.groupId)\n : undefined;\n if (headerIndex != null) selectedHeaders.add(headerIndex);\n }\n\n let cursor = 0;\n for (const headerIndex of [...selectedHeaders].sort((left, right) => left - right)) {\n const header = items[headerIndex];\n if (header?.kind !== 'group' || !header.groupId) continue;\n const groupId = header.groupId;\n const groupEnd = index.groupEndByHeader.get(headerIndex) ?? headerIndex + 1;\n const leadingSize = (prefix[headerIndex] ?? 0) - (prefix[cursor] ?? 0);\n if (leadingSize > 0) {\n nodes.push({ kind: 'spacer', size: leadingSize, key: `pad-${cursor}-${headerIndex}` });\n }\n\n const groupNodes: Array<Extract<TableVirtualNode, { kind: 'spacer' | 'row' }>> = [];\n const mountedMembers = mountedSorted.filter(\n mountedIndex => mountedIndex > headerIndex && mountedIndex < groupEnd\n );\n let memberCursor = headerIndex + 1;\n for (const memberIndex of mountedMembers) {\n const item = items[memberIndex];\n const spacerSize = (prefix[memberIndex] ?? 0) - (prefix[memberCursor] ?? 0);\n if (spacerSize > 0) {\n groupNodes.push({\n kind: 'spacer',\n size: spacerSize,\n key: `group-${groupId}-pad-${memberCursor}-${memberIndex}`,\n });\n }\n if (item?.kind === 'row' && mounted.has(memberIndex)) {\n groupNodes.push({ kind: 'row', index: memberIndex, item });\n }\n memberCursor = memberIndex + 1;\n }\n const trailingSize = (prefix[groupEnd] ?? 0) - (prefix[memberCursor] ?? 0);\n if (trailingSize > 0) {\n groupNodes.push({\n kind: 'spacer',\n size: trailingSize,\n key: `group-${groupId}-pad-${memberCursor}-${groupEnd}`,\n });\n }\n\n nodes.push({ kind: 'group', groupId, headerIndex, nodes: groupNodes });\n cursor = groupEnd;\n }\n\n const trailingSize = (prefix[itemCount] ?? 0) - (prefix[cursor] ?? 0);\n if (trailingSize > 0) {\n nodes.push({ kind: 'spacer', size: trailingSize, key: `pad-${cursor}-${itemCount}` });\n }\n return nodes;\n}\n","import {\n createTableVirtualIndex,\n findTableVirtualIndexAtOffset,\n resolveTableVirtualPlanFromIndex,\n sameTableVirtualPlan,\n tableVirtualItemSizes,\n type TableVirtualItem,\n type TableVirtualIndex,\n type TableVirtualPlan,\n} from './table-virtual-model';\n\nexport interface TableVirtualControllerState {\n enabled: boolean;\n items: readonly TableVirtualItem[];\n pinnedRowIds: ReadonlySet<string>;\n viewport: HTMLElement | null;\n viewportSize: number;\n}\n\nexport interface TableVirtualControllerOptions {\n state: () => TableVirtualControllerState;\n windowChanged: (plan: TableVirtualPlan | null) => void;\n requestAnimationFrame?: (callback: FrameRequestCallback) => number;\n cancelAnimationFrame?: (handle: number) => void;\n}\n\nconst MEASURE_EPSILON_PX = 0.5;\n\n/** Include the card gap in the recycled item's advance, not just its border box.\n * Reads are limited to mounted variable-size cards, never the complete dataset. */\nfunction measuredItemSize(element: HTMLElement, blockSize: number): number {\n return (\n blockSize +\n (element.getAttribute('data-responsive-card') === 'true'\n ? parseFloat(getComputedStyle(element).marginBlockEnd) || 0\n : 0)\n );\n}\n\n/** Binds viewport scroll/resize to a recycled row window. Scroll offset stays off render state. */\nexport class TableVirtualController {\n private connected = false;\n private connectedViewport: HTMLElement | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private measurementObserver: ResizeObserver | null = null;\n private measurementTargets = new Set<HTMLElement>();\n private viewportWidth = 0;\n private viewportSize = 0;\n private frame: number | null = null;\n private measures = new Map<string, number>();\n private measuredIds = new Set<string>();\n private plan: TableVirtualPlan | null = null;\n private index: TableVirtualIndex | null = null;\n private indexedItems: readonly TableVirtualItem[] | null = null;\n private indexDirty = true;\n private scrollOffset = 0;\n private scrollAtEnd = false;\n private scrollDirection: 'backward' | 'forward' | 'none' = 'none';\n private pendingReset = false;\n private readonly raf: (callback: FrameRequestCallback) => number;\n private readonly caf: (handle: number) => void;\n\n constructor(private readonly options: TableVirtualControllerOptions) {\n this.raf =\n options.requestAnimationFrame ??\n (typeof requestAnimationFrame === 'function'\n ? callback => requestAnimationFrame(callback)\n : callback => setTimeout(callback, 16) as unknown as number);\n this.caf =\n options.cancelAnimationFrame ??\n (typeof cancelAnimationFrame === 'function'\n ? handle => cancelAnimationFrame(handle)\n : handle => clearTimeout(handle));\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.cancelFrame();\n this.unbindViewport();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const { viewport, enabled } = this.options.state();\n if (!enabled || !viewport) {\n this.unbindViewport();\n this.emit(null);\n return;\n }\n if (viewport !== this.connectedViewport) {\n this.unbindViewport();\n this.connectedViewport = viewport;\n this.viewportWidth = viewport.clientWidth;\n this.viewportSize = viewport.clientHeight;\n this.scrollOffset = viewport.scrollTop;\n viewport.addEventListener('scroll', this.handleScroll, { passive: true });\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.handleViewportResize);\n this.resizeObserver.observe(viewport);\n }\n }\n this.sync();\n }\n\n schedule = (): void => {\n if (!this.connected || this.frame !== null) return;\n this.frame = this.raf(() => {\n this.frame = null;\n this.sync();\n });\n };\n\n /** Drop cached heights after column, density, or wrap geometry changes. */\n invalidateMeasures(): void {\n this.measures.clear();\n this.measuredIds.clear();\n this.indexDirty = true;\n this.schedule();\n }\n\n /** Rebuild from a new index and pin the viewport to the start. */\n resetToTop(): void {\n this.scrollAtEnd = false;\n this.pendingReset = true;\n this.measures.clear();\n this.measuredIds.clear();\n this.indexDirty = true;\n this.scrollOffset = 0;\n this.scrollDirection = 'none';\n const viewport = this.connectedViewport ?? this.options.state().viewport;\n if (viewport) viewport.scrollTop = 0;\n this.schedule();\n }\n\n sizeFor(item: TableVirtualItem): number {\n if (!item.variableSize) return item.estimatedSize;\n return this.measures.get(item.id) ?? item.estimatedSize;\n }\n\n currentPlan(): TableVirtualPlan | null {\n return this.plan;\n }\n\n currentViewportSize(): number {\n return this.viewportSize;\n }\n\n /** Reveal a supplied row without requiring its recycled DOM node to exist first. */\n scrollRowIntoView(rowId: string, contentOffset = 0, stickyInset = 0): boolean {\n const state = this.options.state();\n const viewport = this.connectedViewport ?? state.viewport;\n if (!state.enabled || !viewport) return false;\n\n const index = this.ensureIndex(state.items);\n const rowIndex = index.rowIndexById.get(rowId);\n if (rowIndex == null) return false;\n\n const item = state.items[rowIndex];\n const groupHeaderIndex = item?.groupId ? index.headerIndexByGroup.get(item.groupId) : undefined;\n const groupInset = groupHeaderIndex == null ? 0 : (index.sizes[groupHeaderIndex] ?? 0);\n const leadingInset = Math.max(0, stickyInset) + groupInset;\n const itemStart = Math.max(0, contentOffset) + (index.prefix[rowIndex] ?? 0);\n const itemEnd = Math.max(0, contentOffset) + (index.prefix[rowIndex + 1] ?? itemStart);\n const viewportSize = this.viewportSize || state.viewportSize || viewport.clientHeight || 0;\n const currentOffset = viewport.scrollTop;\n const visibleStart = currentOffset + leadingInset;\n const visibleEnd = currentOffset + viewportSize;\n let nextOffset: number;\n\n if (itemStart < visibleStart) nextOffset = itemStart - leadingInset;\n else if (itemEnd > visibleEnd) nextOffset = itemEnd - viewportSize;\n else return true;\n\n const maxOffset = Math.max(0, Math.max(0, contentOffset) + index.totalSize - viewportSize);\n nextOffset = Math.max(0, Math.min(nextOffset, maxOffset));\n this.scrollDirection =\n nextOffset > currentOffset ? 'forward' : nextOffset < currentOffset ? 'backward' : 'none';\n viewport.scrollTop = nextOffset;\n this.scrollOffset = viewport.scrollTop;\n this.sync();\n return true;\n }\n\n /** Measure painted rows and correct scroll when estimates were wrong. */\n collectMeasurements(root: ParentNode | null): void {\n if (!root || !this.connected || !this.options.state().enabled) return;\n const painted = root.querySelectorAll<HTMLElement>('[data-virtual-measure=\"true\"]');\n this.syncMeasurementTargets(painted);\n if (painted.length === 0) return;\n\n const state = this.options.state();\n const measurements: Array<{ id: string; height: number }> = [];\n painted.forEach(element => {\n const id = element.getAttribute('data-virtual-id');\n if (!id || this.measuredIds.has(id)) return;\n measurements.push({\n id,\n height: measuredItemSize(element, element.getBoundingClientRect().height),\n });\n });\n this.applyMeasurements(state.items, measurements);\n }\n\n private applyMeasurements(\n items: readonly TableVirtualItem[],\n measurements: readonly { id: string; height: number }[]\n ): void {\n if (measurements.length === 0) return;\n const currentIndex = this.ensureIndex(items);\n const prefixBefore = currentIndex.prefix;\n const viewport = this.connectedViewport;\n const scrollTop = viewport?.scrollTop ?? this.scrollOffset;\n const anchorIndex = findTableVirtualIndexAtOffset(prefixBefore, scrollTop);\n const anchorOffset = prefixBefore[anchorIndex] ?? 0;\n let changed = false;\n for (const { id, height } of measurements) {\n if (!Number.isFinite(height) || height <= 0) continue;\n const itemIndex = currentIndex.itemIndexById.get(id);\n const item = itemIndex == null ? undefined : items[itemIndex];\n if (!item?.variableSize) continue;\n this.measuredIds.add(id);\n const previous = this.measures.get(id);\n if (Math.abs(item.estimatedSize - height) < MEASURE_EPSILON_PX) {\n if (previous != null) {\n this.measures.delete(id);\n changed = true;\n }\n continue;\n }\n if (previous != null && Math.abs(previous - height) < MEASURE_EPSILON_PX) continue;\n this.measures.set(id, height);\n changed = true;\n }\n if (!changed) return;\n this.indexDirty = true;\n const prefixAfter = this.ensureIndex(items).prefix;\n const nextAnchor = prefixAfter[anchorIndex] ?? 0;\n const delta = nextAnchor - anchorOffset;\n if (viewport && this.scrollAtEnd) {\n // Newly measured cards can grow below the current anchor. A user who\n // reached the end should stay there, not stop before the final records.\n viewport.scrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n this.scrollOffset = viewport.scrollTop;\n } else if (viewport && Math.abs(delta) >= MEASURE_EPSILON_PX) {\n viewport.scrollTop = Math.max(0, viewport.scrollTop + delta);\n this.scrollOffset = viewport.scrollTop;\n }\n this.sync();\n }\n\n private syncMeasurementTargets(elements: NodeListOf<HTMLElement>): void {\n if (typeof ResizeObserver === 'undefined') return;\n if (!this.measurementObserver) {\n this.measurementObserver = new ResizeObserver(entries => {\n const state = this.options.state();\n const measurements = entries.map(entry => ({\n id: (entry.target as HTMLElement).getAttribute('data-virtual-id') ?? '',\n height: measuredItemSize(\n entry.target as HTMLElement,\n entry.borderBoxSize[0]?.blockSize ?? entry.contentRect.height\n ),\n }));\n this.applyMeasurements(state.items, measurements);\n });\n }\n const next = new Set(elements);\n for (const element of this.measurementTargets) {\n if (!next.has(element)) this.measurementObserver.unobserve(element);\n }\n for (const element of next) {\n if (!this.measurementTargets.has(element)) this.measurementObserver.observe(element);\n }\n this.measurementTargets = next;\n }\n\n private readonly handleViewportResize = (entries: ResizeObserverEntry[]): void => {\n const entry = entries.find(candidate => candidate.target === this.connectedViewport);\n const width = entry?.contentRect.width ?? this.connectedViewport?.clientWidth ?? 0;\n const size = entry?.contentRect.height ?? this.connectedViewport?.clientHeight ?? 0;\n const sizeChanged = size !== this.viewportSize;\n this.viewportSize = size;\n if (width !== this.viewportWidth) {\n this.viewportWidth = width;\n const items = this.options.state().items;\n const hasVariableSize =\n this.indexedItems === items && this.index\n ? this.index.hasVariableSize\n : items.some(item => item.variableSize);\n if (hasVariableSize) this.invalidateMeasures();\n else if (sizeChanged) this.schedule();\n return;\n }\n if (sizeChanged) this.schedule();\n };\n\n private readonly handleScroll = (): void => {\n const viewport = this.connectedViewport;\n if (viewport) {\n const nextOffset = viewport.scrollTop;\n this.scrollAtEnd =\n !!this.index?.hasVariableSize &&\n nextOffset > 0 &&\n nextOffset + viewport.clientHeight >= viewport.scrollHeight - 1;\n this.scrollDirection =\n nextOffset > this.scrollOffset\n ? 'forward'\n : nextOffset < this.scrollOffset\n ? 'backward'\n : this.scrollDirection;\n this.scrollOffset = nextOffset;\n }\n this.schedule();\n };\n\n private sync(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (!state.enabled) {\n this.emit(null);\n return;\n }\n\n if (this.pendingReset) {\n this.scrollOffset = 0;\n if (state.viewport) state.viewport.scrollTop = 0;\n this.pendingReset = false;\n }\n const index = this.ensureIndex(state.items);\n const plan = resolveTableVirtualPlanFromIndex(index, {\n scrollOffset: this.scrollOffset,\n viewportSize: this.viewportSize || state.viewportSize,\n scrollDirection: this.scrollDirection,\n pinnedRowIds: state.pinnedRowIds,\n });\n this.emit(plan);\n }\n\n private emit(plan: TableVirtualPlan | null): void {\n if (sameTableVirtualPlan(this.plan, plan)) return;\n this.plan = plan;\n this.options.windowChanged(plan);\n }\n\n private ensureIndex(items: readonly TableVirtualItem[]): TableVirtualIndex {\n if (!this.indexDirty && this.index && this.indexedItems === items) return this.index;\n // Appending/replacing application data must not opt into following new rows.\n if (this.indexedItems !== items) this.scrollAtEnd = false;\n if (this.indexedItems !== items && (this.measures.size > 0 || this.measuredIds.size > 0)) {\n const itemIds = new Set(items.map(item => item.id));\n for (const id of this.measures.keys()) {\n if (!itemIds.has(id)) this.measures.delete(id);\n }\n for (const id of this.measuredIds) {\n if (!itemIds.has(id)) this.measuredIds.delete(id);\n }\n }\n this.indexedItems = items;\n this.index = createTableVirtualIndex(items, tableVirtualItemSizes(items, this.measures));\n this.indexDirty = false;\n return this.index;\n }\n\n private unbindViewport(): void {\n this.scrollAtEnd = false;\n this.connectedViewport?.removeEventListener('scroll', this.handleScroll);\n this.connectedViewport = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.measurementObserver?.disconnect();\n this.measurementObserver = null;\n this.measurementTargets.clear();\n this.viewportWidth = 0;\n this.viewportSize = 0;\n }\n\n private cancelFrame(): void {\n if (this.frame === null) return;\n this.caf(this.frame);\n this.frame = 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","const DIRECTIONAL_TAGS = new Set([\n 'DS-SELECT',\n 'DS-MENU',\n 'DS-FILTER-MENU',\n 'INPUT',\n 'SELECT',\n 'TEXTAREA',\n]);\n\nconst DIRECTIONAL_ROLES = new Set(['slider', 'combobox', 'listbox']);\n\ninterface ShortcutPathNode {\n tagName?: string;\n nodeType?: number;\n isContentEditable?: boolean;\n assignedSlot?: unknown;\n parentNode?: unknown;\n getRootNode?: () => unknown;\n getAttribute?: (name: string) => string | null;\n}\n\n/** True when Left/Right should stay with an editable or choice control. */\nexport function paginationShortcutBlockedByPath(path: readonly unknown[]): boolean {\n return path.some(node => {\n if (!node || typeof node !== 'object') return false;\n const element = node as ShortcutPathNode;\n if (element.tagName && DIRECTIONAL_TAGS.has(element.tagName)) return true;\n if (element.isContentEditable) return true;\n const role = element.getAttribute?.('role');\n return role != null && DIRECTIONAL_ROLES.has(role);\n });\n}\n\nexport function isDocumentRootNode(node: unknown): boolean {\n if (!node || typeof node !== 'object') return false;\n const element = node as ShortcutPathNode;\n if (element.nodeType === 9) return true;\n return element.tagName === 'BODY' || element.tagName === 'HTML';\n}\n\n/** True when `ancestor` contains `descendant` in the composed tree, including slots. */\nexport function composedContains(ancestor: unknown, descendant: unknown): boolean {\n if (!ancestor || !descendant || ancestor === descendant) return false;\n const seen = new Set<unknown>();\n let current: unknown = descendant;\n while (current && !seen.has(current)) {\n seen.add(current);\n if (current === ancestor) return true;\n current = composedParent(current);\n }\n return false;\n}\n\n/**\n * Window-level pagination arrows apply when focus is inside the table or on a\n * containing page scroller (for example ShellApp's routed-content region).\n * Document body stays with the host app so it can forward a single event.\n */\nexport function shouldHandleContainingPagePaginationShortcut(input: {\n origin: unknown;\n table: unknown;\n eventPath: readonly unknown[];\n}): boolean {\n if (isDocumentRootNode(input.origin)) return false;\n if (input.eventPath.includes(input.table) || composedContains(input.table, input.origin)) {\n return true;\n }\n return composedContains(input.origin, input.table);\n}\n\nfunction composedParent(node: unknown): unknown {\n if (!node || typeof node !== 'object') return null;\n if (typeof ShadowRoot !== 'undefined' && node instanceof ShadowRoot) {\n return node.host;\n }\n const element = node as ShortcutPathNode;\n if (element.assignedSlot) return element.assignedSlot;\n if (element.parentNode) return element.parentNode;\n const root = element.getRootNode?.();\n if (root && typeof root === 'object' && 'host' in root) {\n return (root as { host?: unknown }).host ?? null;\n }\n return null;\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 connectedHost: HTMLElement | null = null;\n private connectedSurface: HTMLElement | null = null;\n private scrollRoot: HTMLElement | Window | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private ancestorMutationObserver: MutationObserver | null = null;\n private connectionFrame: number | null = null;\n private metrics: TableViewportFitMetrics | null = null;\n private insetBlockStart: string | number | null = null;\n private insetBlockEnd: string | number | null = null;\n\n constructor(private readonly options: TableViewportFitControllerOptions) {}\n\n connect(): void {\n this.connected = true;\n this.refresh();\n // WebKit can finish attaching an upgraded custom element after its first\n // layout read. Verify the owning scrollport on the next animation frame.\n if (this.connectionFrame === null && typeof requestAnimationFrame !== 'undefined') {\n this.connectionFrame = requestAnimationFrame(() => {\n this.connectionFrame = null;\n this.refresh();\n });\n }\n }\n\n disconnect(): void {\n this.connected = false;\n if (this.connectionFrame !== null) cancelAnimationFrame(this.connectionFrame);\n this.connectionFrame = null;\n this.disconnectRuntime();\n this.clearGeometry();\n }\n\n refresh(forceGeometry = true): void {\n if (!this.connected) return;\n if (!this.options.enabled()) {\n this.disconnectRuntime();\n this.clearGeometry();\n return;\n }\n\n const { host, surface } = this.options.elements();\n if (!host) return;\n const elementsChanged = host !== this.connectedHost || surface !== this.connectedSurface;\n // A web component can be reconnected under a different scroll owner while\n // retaining the same host and rendered surface nodes.\n const nextScrollRoot =\n elementsChanged || forceGeometry || !this.scrollRoot\n ? this.findScrollRoot(host)\n : this.scrollRoot;\n const rootChanged = nextScrollRoot !== this.scrollRoot;\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.connectedHost = host;\n this.connectedSurface = surface;\n if (elementsChanged || rootChanged || forceGeometry) this.observeAncestorInsets(host);\n const insets = this.options.insets();\n const insetsChanged =\n insets.blockStart !== this.insetBlockStart || insets.blockEnd !== this.insetBlockEnd;\n this.insetBlockStart = insets.blockStart;\n this.insetBlockEnd = insets.blockEnd;\n if (forceGeometry || elementsChanged || rootChanged || insetsChanged) 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) - 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.connectedHost = null;\n this.connectedSurface = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.ancestorMutationObserver?.disconnect();\n this.ancestorMutationObserver = null;\n this.insetBlockStart = null;\n this.insetBlockEnd = null;\n }\n\n private observeAncestorInsets(host: HTMLElement): void {\n this.ancestorMutationObserver?.disconnect();\n this.ancestorMutationObserver = null;\n if (typeof MutationObserver === 'undefined') return;\n\n // A page shell can replace its inset class after the table first measures.\n // Its inherited CSS variable then changes without resizing the scrollport,\n // so ResizeObserver alone cannot update the reserved table height.\n const observer = new MutationObserver(this.sync);\n let ancestor = this.composedParent(host);\n while (ancestor) {\n observer.observe(ancestor, { attributes: true });\n if (ancestor === document.documentElement) break;\n ancestor = this.composedParent(ancestor);\n }\n this.ancestorMutationObserver = observer;\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) return;\n\n const hostRect = host.getBoundingClientRect();\n const scrollportRect =\n 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 if (surface) {\n this.setProperty(\n surface,\n '--_table-viewport-fit-current-block-size',\n `${next.currentBlockSize}px`\n );\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|chrome|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-chrome),\n.ds-interaction-fill--on-chrome {\n --ds-interaction-hover: var(--color-chrome-interaction-hover);\n --ds-interaction-pressed: var(--color-chrome-interaction-pressed);\n --ds-interaction-active: var(--color-chrome-interaction-active);\n --ds-focus-ring-color: var(--color-chrome-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/* The associated surface stays visible after activation. Selection and ARIA\n * remain owned by the component; only the pressed overlay is retained here. */\n:host(.ds-interaction-fill.ds-interaction-fill--surface-open:not(:disabled))::after,\n.ds-interaction-fill.ds-interaction-fill--surface-open:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\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: var(--ds-interaction-border-width) solid var(--ds-forced-color-control-boundary);\n outline-offset: calc(-1 * var(--ds-interaction-border-width));\n }\n\n :host(\n .ds-interaction-fill--surface-open:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )\n )::after,\n .ds-interaction-fill--surface-open:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )::after {\n outline: var(--dimension-stroke-width-025) dashed var(--ds-forced-color-control-boundary);\n outline-offset: calc(-1 * var(--dimension-stroke-width-025));\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(\n .ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )\n )::after,\n .ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )::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/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/forced-colors.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/* Keep size containment away from the recycled scrollport (WebKit). */\n.ds-table__caption-bar {\n container-type: inline-size;\n container-name: ds-table;\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::slotted([slot='header']) {\n inline-size: 100%;\n min-inline-size: 0;\n}\n\n::slotted([slot='caption-trailing']) {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n}\n\n::slotted([slot='alternate-view']) {\n display: block;\n inline-size: 100%;\n block-size: 100%;\n min-block-size: 0;\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__card-label {\n display: none;\n padding-inline: var(--_table-cell-track-padding-inline);\n}\n\n.ds-table--responsive-cards .ds-table__frame[data-narrow='true'] ds-text.ds-table__card-label {\n display: block;\n}\n\nds-text.ds-table__cell-track {\n display: flex;\n}\n\n.ds-table__cell--text-wrap ds-text.ds-table__cell-track--text,\n.ds-table__cell--icon-text-wrap ds-text.ds-table__cell-track--text,\n.ds-table__cell--score-text-wrap ds-text.ds-table__cell-track--text {\n display: block;\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\n/*\n * The public :where() wrap recipe has zero specificity, so ds-text's\n * variant line-height would win inside the component. Reassert on wrapping\n * cell layout classes so extra primary and secondary lines occupy later tracks.\n */\n.ds-table__cell--text-wrap.ds-table__cell--text-single .ds-table__cell-primary,\n.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-primary,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-single .ds-table__cell-primary,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-primary,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-single .ds-table__cell-primary,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-primary {\n line-height: var(--_table-wrap-primary-line-height);\n padding-block: var(--_table-wrap-primary-padding-block);\n}\n\n.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-copy,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-copy,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-copy {\n gap: 0;\n}\n\n.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-secondary,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-secondary,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-secondary {\n line-height: var(--_table-wrap-secondary-line-height);\n padding-block: var(--_table-wrap-secondary-padding-block);\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--text-multi ds-text.ds-table__cell-secondary,\n.ds-table__cell--text-triple ds-text.ds-table__cell-secondary,\n.ds-table__cell--text-triple ds-text.ds-table__cell-tertiary,\n.ds-table__cell--icon-text-multi ds-text.ds-table__cell-secondary,\n.ds-table__cell--icon-text-triple ds-text.ds-table__cell-secondary,\n.ds-table__cell--icon-text-triple ds-text.ds-table__cell-tertiary,\n.ds-table__cell--score-text-multi ds-text.ds-table__cell-secondary,\n.ds-table__cell--score-text-triple ds-text.ds-table__cell-secondary,\n.ds-table__cell--score-text-triple ds-text.ds-table__cell-tertiary,\n.ds-table__cell--primary-text ds-text.ds-table__cell-secondary {\n min-block-size: var(--_table-cell-track-min-block-size);\n}\n\nds-text.ds-table__cell-run,\nds-text.ds-table__cell-run-separator {\n display: flex;\n}\n\nds-text.ds-table__group-label,\nds-text.ds-table__group-count,\nds-text.ds-table__group-accessory,\nds-text.ds-table__group-accessory-separator {\n display: flex;\n align-items: center;\n}\n\nds-text.ds-table__group-count {\n min-block-size: var(--_table-cell-track-min-block-size);\n padding-inline-end: var(--dimension-space-050);\n}\n\n.ds-table__cell-tag-stack--tag-with-text ds-text.ds-table__cell-tag-text,\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 min-block-size: var(--_table-cell-track-min-block-size);\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\n.ds-table__caption-customizer {\n position: relative;\n display: flex;\n align-items: center;\n min-inline-size: 0;\n}\n\n.ds-table__caption-mode-switcher {\n display: flex;\n align-items: center;\n}\n\n.ds-table__caption-customizer--loading > ds-tooltip ds-button-unfilled {\n visibility: hidden;\n}\n\n.ds-table__caption-customizer > ds-skeleton {\n position: absolute;\n inset: 0;\n}\n\n.ds-table__caption-bar:has([slot='header-after']) {\n flex-direction: column;\n align-items: stretch;\n block-size: auto;\n padding: 0;\n gap: 0;\n}\n\n.ds-table__caption-bar:has([slot='header-after']) .ds-table__caption-content {\n flex: 0 0 auto;\n min-block-size: var(--dimension-size-600);\n padding: var(--dimension-space-100);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n deriveTableSelectionState,\n formatTableResultSummary,\n formatTableTotalSummary,\n hasOwnedTableFooterSlot,\n isTableCellAction,\n nextDataSortState,\n tableColumnSize,\n tableModelIssues,\n TABLE_GROUP_HERO_SCORE_PRESENTATION,\n tableRows,\n toggleAllLoadedTableRows,\n toggleTableGroupCollapsed,\n toggleTableGroupSelection,\n nextTableGroupsCollapsed,\n toggleTableRowSelection,\n} from './table-model';\nimport { createTableRenderModel, type TableRenderModel } from './table-render-model';\nimport {\n isRenderableTableActionMenu,\n nextTableActionMenuElementId,\n tableActionMenuSections,\n tableActionTriggerId,\n} from './table-action-menu';\nimport {\n nextTableColumnCustomizerElementId,\n reorderTableColumnPartition,\n resolveTableFieldsConfiguration,\n resolveTableVisibleColumns,\n tableColumnCustomizerSections,\n toggleTableColumnHidden,\n toggleTableColumnPinned,\n} from './table-column-customizer';\nimport {\n nextTableDataModeSwitcherElementId,\n tableDataModeFromMenuItem,\n tableDataModeMenuItems,\n} from './table-data-mode-switcher';\nimport { resolveTableTruncateTrack, tableTruncateLabel } from './table-truncate';\nimport { renderTableRow as renderTableRowView } from './table-row-view';\nimport { TableBodyRenderer } from './table-body-renderer';\nimport { tableHeaderBands, tablePinnedColumns, tableSpanModel } from './table-structure';\nimport {\n tableGridModel,\n tableRangeBounds,\n tableEditable,\n tableEditValue,\n tablePasteChanges,\n tableNextEditable,\n} from './table-grid-model';\nimport { renderTableCellEditor } from './table-cell-editor';\nimport type {\n TableCellSpan,\n TableCellRange,\n TableCellAddress,\n TableCellsChangeDetail,\n} from './table-types';\nimport { renderTableSkeletonBody } from './table-skeleton-view';\nimport { renderTableLoadContent } from './table-load-view';\nimport {\n isTableCardViewport,\n TABLE_CARD_VIEWPORT_BREAKPOINT,\n TableLayoutController,\n} from './table-layout-controller';\nimport { TableLoadController } from './table-load-controller';\nimport { TableGroupLoadController } from './table-group-load-controller';\nimport {\n estimateTableRowBlockSize,\n flattenTableVirtualItems,\n resolveTableVirtualPlan,\n TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL,\n TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY,\n TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING,\n type TableVirtualItem,\n type TableVirtualPlan,\n} from './table-virtual-model';\nimport { TableVirtualController } from './table-virtual-controller';\nimport type { PaginationChangeDetail } from '../Pagination/pagination-types';\nimport type { MenuItemData, MenuItemToggleDetail, MenuReorderDetail } from '../Menu/menu-types';\nimport { resolvePaginationState } from '../Pagination/pagination-model';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport { isElementTruncated } from '../../utils/is-element-truncated';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\nimport { resolveTableFitPageSize } from './table-pagination-fit';\nimport { createTableHighlightMatcher, type TableHighlightMatcher } from './table-highlight';\nimport {\n paginationShortcutBlockedByPath,\n shouldHandleContainingPagePaginationShortcut,\n} from './table-pagination-shortcut';\nimport {\n TableViewportFitController,\n type TableViewportFitMetrics,\n} from './table-viewport-fit-controller';\nimport type {\n TableCaptionVisibility,\n TableChromeLayout,\n TableCellActionDetail,\n TableColumn,\n DataFieldsConfigChangeDetail,\n TableDataMode,\n TableDataModeChangeDetail,\n DataGroup,\n TableGroupCollapseChangeDetail,\n TableGroupLoadMoreDetail,\n DataGroupingState,\n TableLoadMoreDetail,\n TableLoadMoreMode,\n TablePaginationState,\n TableRow,\n TableRowActivateDetail,\n TableSelectionChangeDetail,\n TableSelectionMode,\n DataSortChangeDetail,\n DataSortState,\n} from './table-types';\n\nconst TABLE_FOOTER_SLOT_LEADING = 1;\nconst TABLE_FOOTER_SLOT_COPY = 2;\nconst TABLE_FOOTER_SLOT_TRAILING = 4;\nconst TABLE_NON_VIRTUAL_WINDOW_THRESHOLD = 50;\n\n@Component({\n tag: 'ds-table',\n styleUrls: ['../../utils/focus-ring.css', '../../utils/interaction-fill.css', 'Table.css'],\n scoped: true,\n})\nexport class Table {\n @Element() el!: HTMLElement;\n /** Stable column definitions. Assign through JavaScript. */\n @Prop() columns: TableColumn[] = [];\n /** Opt-in native card presentation below the 768px browser viewport breakpoint. */\n @Prop() responsiveLayout: 'scroll' | 'cards' = 'scroll';\n /** Keep all table chrome contained, or let the caption and footer span edge to edge around an inset data frame. */\n @Prop() chromeLayout: TableChromeLayout = 'contained';\n /** Explicit report merges; invalid combinations leave the original cells visible. */\n @Prop() cellSpans: TableCellSpan[] = [];\n /** Table is read-only; edit uses per-cell pencil buttons; grid adds cell selection and keyboard navigation. Grouped tables remain read-only. */\n @Prop() interactionMode: 'table' | 'edit' | 'grid' = 'table';\n /** Controlled rectangular cell selection, independent of row checkbox selection. */\n @Prop() cellRange: TableCellRange | null = null;\n @Event() dsCellRangeChange!: EventEmitter<TableCellRange>;\n @Event() dsCellsChange!: EventEmitter<TableCellsChangeDetail>;\n /** Additional toggle options in the column customizer. */\n @Prop() customizeOptions: MenuItemData[] = [];\n @Event() dsCustomizeOptionChange!: EventEmitter<string>;\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: DataGroup[] = [];\n /** Controlled grouping column. Applications supply groups in their final fixed order. */\n @Prop() grouping: DataGroupingState | null = null;\n /** Controlled member-row sort state. */\n @Prop() sort: DataSortState | null = null;\n /** Controlled collapsed group identities. Groups not listed remain expanded. */\n @Prop() collapsedGroupIds: string[] = [];\n /** Literal terms to highlight in table-owned text cells. Applications still own filtering. */\n @Prop() highlightTerms: string[] = [];\n /** Optional DataSearch field identities that restrict which data-point tracks are highlighted. */\n @Prop() highlightFieldIds: 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 /** Replace only the data frame with application-owned content; caption and footer remain shared. */\n @Prop() alternateView: boolean = false;\n /** Fires after a table/alternate-view switch has patched the frame and footer. */\n @Event() dsAlternateViewRendered!: EventEmitter<{ alternateView: boolean }>;\n /**\n * Opt in to the table-owned column customizer. The `columns` prop remains the\n * catalog; hidden and ordered columns are controlled separately. The trigger\n * opens the shared Menu of live show/hide switch rows.\n */\n @Prop() columnCustomizer: boolean = false;\n /** Hide only the built-in Customize trigger when an external preferences surface owns it. */\n /** Remove borders from table-owned caption controls. */\n @Prop() captionControlsBorderless: boolean = false;\n @Prop() hideColumnCustomizerTrigger: boolean = false;\n /** Controlled hidden data-column identities. Action ids are ignored. */\n @Prop() hiddenFieldIds: string[] = [];\n /** Controlled data-column identities in display order. Omitted ids append in catalog order. */\n @Prop() fieldOrder: string[] = [];\n /** Controlled user-pinned data-column identities. Hidden columns retain their pin state. */\n @Prop() pinnedFieldIds: string[] = [];\n /**\n * Optional result summary footer. When both `displayedCount` and `totalCount`\n * are finite numbers, infinite mode shows “Displaying {displayed} of {total}”.\n * Virtual mode ignores `displayedCount` and derives its total from the\n * complete supplied rows; a mismatched `totalCount` emits a warning.\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 /** Supports the {total} placeholder. Used when dataMode is virtual. */\n @Prop() resultTotalSummaryLabel: string = TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL;\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 /**\n * Identity of the interactive row whose associated surface is visible.\n * Holds its pressed wash independently of checkbox selection. Keep the ID\n * through exit motion and clear it after close; the application owns toggling\n * and switching the surface. Off-window identities survive virtualization.\n */\n @Prop() surfaceOpenRowId: string | undefined;\n\n /** Initial loading state. Existing rows stay visible; incremental loading uses loadingMore. */\n @Prop() loading: boolean = false;\n /** Replace opted-in table-owned caption controls with same-size visual skeletons. */\n @Prop() chromeLoading: 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. Virtual mode recycles row DOM only. */\n @Prop() dataMode: TableDataMode = 'infinite';\n /** Opt in to the table-owned control for choosing between supported data modes. */\n @Prop() dataModeSwitcher: boolean = false;\n @Prop() dataModeSwitcherLabel: string = 'Change table variation';\n @Prop() dataModeMenuLabel: string = 'Table variation';\n @Prop() infiniteModeLabel: string = 'Infinite scroll';\n @Prop() paginationModeLabel: string = 'Pagination + Infinite groups';\n @Prop() virtualModeLabel: string = 'Virtual scroll';\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 =\n '{count} more rows loaded in {group}. {loaded} of {total} rows loaded.';\n\n @Event() dsSortChange!: EventEmitter<DataSortChangeDetail>;\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 @Event() dsFieldsConfigChange!: EventEmitter<DataFieldsConfigChangeDetail>;\n @Event() dsDataModeChange!: EventEmitter<TableDataModeChangeDetail>;\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 headerUsesToolbar = false;\n @State() private captionTrailingPresent = false;\n @State() private footerSlotPresence = 0;\n @State() private fitPageSize: number | undefined;\n @State() private actionMenu: { rowId: string; columnId: string } | null = null;\n @State() private actionMenuInitialFocusVisible = false;\n @State() private actionMenuSurface: { rowId: string; columnId: string } | null = null;\n @State() private truncateTooltipLabel = '';\n @State() private captionCompact = false;\n @State() private narrowViewport = false;\n @State() private columnCustomizerOpen = false;\n @State() private columnCustomizerSurfaceOpen = false;\n @State() private columnCustomizerInitialFocusVisible = false;\n @State() private dataModeSwitcherOpen = false;\n @State() private dataModeSwitcherSurfaceOpen = false;\n @State() private dataModeSwitcherInitialFocusVisible = false;\n @State() private virtualWindow: TableVirtualPlan | null = null;\n @State() private activeCell: TableCellAddress | null = null;\n @State() private editingCell: TableCellAddress | null = null;\n private editDraft = '';\n private gridModelCache?: ReturnType<typeof tableGridModel>;\n private get gridEnabled(): boolean {\n return this.interactionMode === 'grid' && !this.grouped;\n }\n private get editingEnabled(): boolean {\n return this.interactionMode !== 'table' && !this.grouped;\n }\n private get gridModel() {\n if (\n !this.gridModelCache ||\n this.gridModelCache.rows !== this.rows ||\n this.gridModelCache.columns !== this.visibleColumns\n ) {\n this.gridModelCache = tableGridModel(this.rows, this.visibleColumns);\n }\n return this.gridModelCache;\n }\n private gridAddress(event: Event): TableCellAddress | null {\n if (\n !this.gridEnabled ||\n !(event.target instanceof HTMLElement) ||\n !event.target.matches('td[role=\"gridcell\"][data-cell-editable=\"true\"]')\n )\n return null;\n const rowId = event.target.closest<HTMLElement>('[data-row-id]')?.dataset.rowId;\n const columnId = event.target.dataset.columnId;\n return rowId && columnId ? { rowId, columnId } : null;\n }\n private selectCell(address: TableCellAddress, extend = false): void {\n if (!this.isEditableAddress(address)) return;\n this.activeCell = address;\n this.dsCellRangeChange.emit({\n anchor: extend ? (this.cellRange?.anchor ?? address) : address,\n focus: address,\n });\n }\n private async focusCell(address: TableCellAddress): Promise<void> {\n if (!this.isEditableAddress(address)) return;\n this.activeCell = address;\n this.focusedRowId = address.rowId;\n await this.scrollRowIntoView(address.rowId);\n await this.nextAnimationFrame();\n const cell = this.findRenderedRow(address.rowId)?.querySelector<HTMLElement>(\n `[data-column-id=\"${CSS.escape(address.columnId)}\"]`\n );\n if (this.gridEnabled) cell?.focus();\n else\n await cell\n ?.querySelector<HTMLDsButtonUnfilledElement>('.ds-table__edit-trigger ds-button-unfilled')\n ?.setFocus();\n }\n private isEditableAddress(address: TableCellAddress): boolean {\n const model = this.gridModel;\n const row = model.rows[model.rowIndices.get(address.rowId) ?? -1];\n const column = model.columns[model.columnIndices.get(address.columnId) ?? -1];\n return this.editingEnabled && !this.loading && !!row && !!column && tableEditable(row, column);\n }\n private beginCellEdit(address: TableCellAddress, initial?: string): void {\n const model = this.gridModel;\n const row = model.rows[model.rowIndices.get(address.rowId) ?? -1];\n const column = model.columns[model.columnIndices.get(address.columnId) ?? -1];\n if (!this.editingEnabled || this.loading || !row || !column || !tableEditable(row, column))\n return;\n this.activeCell = address;\n this.focusedRowId = address.rowId;\n this.editDraft = initial ?? String(row.cells[column.id] ?? '');\n this.editingCell = address;\n requestAnimationFrame(async () => {\n const control = this.el.querySelector<HTMLDsInputElement>('.ds-table__cell-editor > *');\n await control?.componentOnReady?.();\n if (this.editingCell !== address || !control?.isConnected) return;\n await control.setFocus();\n const input = control.querySelector<HTMLInputElement | HTMLTextAreaElement>('input,textarea');\n if (initial == null && input?.type !== 'number') input?.select();\n });\n }\n private handleGridKeyDown(event: KeyboardEvent): void {\n const address = this.gridAddress(event);\n if (!address || event.altKey || event.metaKey || event.ctrlKey || event.isComposing) return;\n if (event.key === 'Enter' || event.key === 'F2' || event.key.length === 1) {\n event.preventDefault();\n this.beginCellEdit(address, event.key.length === 1 ? event.key : undefined);\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft', 'Home', 'End'].includes(event.key))\n return;\n event.preventDefault();\n const next = tableNextEditable(this.gridModel, address, event.key);\n if (!next) return;\n this.selectCell(next, event.shiftKey);\n void this.focusCell(next);\n }\n private handleGridClipboard(event: ClipboardEvent): void {\n const address = this.gridAddress(event);\n if (!address || !event.clipboardData) return;\n if (event.type === 'paste') {\n event.preventDefault();\n if (this.loading) return;\n const changes = tablePasteChanges(\n this.gridModel,\n address,\n event.clipboardData.getData('text/plain')\n );\n if (!changes) {\n this.announcement =\n 'Paste rejected. Use a rectangular set of valid values in editable cells.';\n return;\n }\n this.dsCellsChange.emit({ changes, reason: 'paste' });\n this.announcement = `${changes.length} cell changes proposed.`;\n } else {\n const model = this.gridModel;\n const bounds = tableRangeBounds(model, this.cellRange ?? { anchor: address, focus: address });\n if (\n !bounds ||\n (bounds.lastRow - bounds.firstRow + 1) * (bounds.lastColumn - bounds.firstColumn + 1) >\n 10000\n )\n return;\n const text = model.rows\n .slice(bounds.firstRow, bounds.lastRow + 1)\n .map(row =>\n model.columns\n .slice(bounds.firstColumn, bounds.lastColumn + 1)\n .map(column => {\n if (!tableEditable(row, column)) return '';\n const value = row.cells[column.id];\n return typeof value === 'object' ? '' : String(value ?? '').replace(/[\\t\\r\\n]/g, ' ');\n })\n .join('\\t')\n )\n .join('\\n');\n event.preventDefault();\n event.clipboardData.setData('text/plain', text);\n }\n }\n private renderCellEditor(row: TableRow, column: TableColumn) {\n if (\n this.editingCell?.rowId !== row.id ||\n this.editingCell.columnId !== column.id ||\n !tableEditable(row, column) ||\n this.loading\n )\n return null;\n const address = this.editingCell;\n const editor = column.editor!;\n const cell = this.findRenderedRow(row.id)?.querySelector<HTMLElement>(\n `[data-column-id=\"${CSS.escape(column.id)}\"]`\n );\n const commit = (text: string, next = address) => {\n if (this.editingCell !== address || !this.isEditableAddress(address)) return false;\n const value = tableEditValue(text, column);\n if (value === undefined) {\n this.announcement = `Enter a valid value for ${column.label}.`;\n return false;\n }\n this.editingCell = null;\n this.dsCellsChange.emit({ changes: [{ ...address, value }], reason: 'edit' });\n void this.focusCell(next);\n return true;\n };\n return (\n <div\n class=\"ds-table__cell-editor\"\n key={`${row.id}:${column.id}`}\n onClick={event => event.stopPropagation()}\n onFocusout={event => {\n const wrapper = event.currentTarget as HTMLElement;\n requestAnimationFrame(() => {\n const root = wrapper.getRootNode() as Document | ShadowRoot;\n if (this.editingCell === address && !wrapper.contains(root.activeElement))\n this.editingCell = null;\n });\n }}\n onKeyDown={event => {\n event.stopPropagation();\n if (event.isComposing || event.defaultPrevented) return;\n const wrapper = event.currentTarget as HTMLElement;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.editingCell = null;\n void this.focusCell(address);\n return;\n }\n if (event.key !== 'Enter' && event.key !== 'Tab') return;\n // Picker keyboard interactions belong to the picker, including its internal Tab stops.\n if ((event.target as HTMLElement).closest('[popover]')) return;\n if (\n event.key === 'Enter' &&\n editor.type === 'textarea' &&\n !event.ctrlKey &&\n !event.metaKey\n )\n return;\n event.preventDefault();\n const input =\n editor.type === 'select'\n ? null\n : wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>('input,textarea');\n // Unconstrained numeric columns retain decimal support; explicit steps use the\n // shared control's native step validity as well as the paste validator.\n if (\n input &&\n !input.checkValidity() &&\n !(editor.type === 'number' && editor.step == null && input.validity.stepMismatch)\n ) {\n input.reportValidity();\n return;\n }\n const next =\n event.key === 'Tab'\n ? (tableNextEditable(this.gridModel, address, 'Tab', event.shiftKey) ?? address)\n : address;\n commit(input?.value ?? this.editDraft, next);\n }}\n >\n {renderTableCellEditor(\n editor,\n this.editDraft,\n `Edit ${column.label} for ${row.selectionLabel ?? row.id}`,\n cell ?? undefined,\n value => {\n this.editDraft = value;\n // A single-select choice is a complete edit; let its selection handler finish first.\n if (editor.type === 'select') queueMicrotask(() => commit(value));\n }\n )}\n </div>\n );\n }\n\n private renderCellEditTrigger(row: TableRow, column: TableColumn) {\n if (\n this.interactionMode !== 'edit' ||\n !tableEditable(row, column) ||\n this.loading ||\n (this.editingCell?.rowId === row.id && this.editingCell.columnId === column.id)\n )\n return null;\n return (\n <span class=\"ds-table__edit-trigger\">\n <ds-button-unfilled\n variant=\"icon\"\n icon=\"Pencil\"\n size=\"sm\"\n aria-label={`Edit ${column.label} for ${row.selectionLabel ?? row.id}`}\n pressScale={false}\n onDsClick={event => {\n event.stopPropagation();\n this.beginCellEdit({ rowId: row.id, columnId: column.id });\n }}\n />\n </span>\n );\n }\n\n private gridCellAttributes(row: TableRow, column: TableColumn): Record<string, unknown> {\n const model = this.gridModel;\n const bounds = tableRangeBounds(model, this.cellRange);\n const ri = model.rowIndices.get(row.id)!,\n ci = model.columnIndices.get(column.id)!;\n const editable = tableEditable(row, column) && !this.loading;\n const editing =\n editable && this.editingCell?.rowId === row.id && this.editingCell.columnId === column.id;\n const active =\n this.activeCell && this.isEditableAddress(this.activeCell)\n ? this.activeCell\n : model.firstEditable;\n if (!this.gridEnabled)\n return {\n 'data-cell-editable': String(editable),\n 'data-cell-editing': String(editing),\n 'aria-disabled': editable ? undefined : 'true',\n };\n return {\n role: 'gridcell',\n tabIndex: editable\n ? active?.rowId === row.id && active.columnId === column.id\n ? 0\n : -1\n : undefined,\n 'data-cell-editable': String(editable),\n 'data-cell-editing': String(editing),\n 'aria-readonly': String(!editable),\n 'aria-disabled': editable ? undefined : 'true',\n 'aria-selected': String(\n editable &&\n !!bounds &&\n ri >= bounds.firstRow &&\n ri <= bounds.lastRow &&\n ci >= bounds.firstColumn &&\n ci <= bounds.lastColumn\n ),\n onClick: (event: MouseEvent) => {\n if (\n event.target !== event.currentTarget &&\n (event.target as HTMLElement).closest(\n 'button,a,input,textarea,ds-button-unfilled,.ds-table__cell-editor'\n )\n )\n return;\n event.stopPropagation();\n if (!editable) return;\n this.selectCell({ rowId: row.id, columnId: column.id }, event.shiftKey);\n (event.currentTarget as HTMLElement).focus();\n if (!event.shiftKey) this.beginCellEdit({ rowId: row.id, columnId: column.id });\n },\n };\n }\n\n private readonly actionMenuElementId = nextTableActionMenuElementId();\n private structureCache?: {\n columns: TableColumn[];\n rows: TableRow[];\n spans: TableCellSpan[];\n selectable: boolean;\n grouped: boolean;\n windowed: boolean;\n grid: boolean;\n pins: ReturnType<typeof tablePinnedColumns>;\n bands: ReturnType<typeof tableHeaderBands>;\n merges: ReturnType<typeof tableSpanModel>;\n };\n\n private get structure() {\n const columns = this.visibleColumns;\n const model = this.createRenderModel();\n const cached = this.structureCache;\n const windowed = this.rowWindowingEnabled;\n const grid = this.interactionMode !== 'table';\n if (\n cached &&\n cached.columns === columns &&\n cached.rows === this.rows &&\n cached.spans === this.cellSpans &&\n cached.selectable === model.selectable &&\n cached.grouped === model.grouped &&\n cached.windowed === windowed &&\n cached.grid === grid\n )\n return cached;\n return (this.structureCache = {\n columns,\n rows: this.rows,\n spans: this.cellSpans,\n selectable: model.selectable,\n grouped: model.grouped,\n windowed,\n grid,\n pins: tablePinnedColumns(columns, model.selectable),\n bands: tableHeaderBands(columns, model.selectable, model.elasticSpacerIndex),\n merges: tableSpanModel(this.cellSpans, this.rows, columns, {\n windowed,\n grouped: model.grouped,\n grid,\n selectable: model.selectable,\n spacer: model.elasticSpacerIndex,\n }),\n });\n }\n\n private headerId(columnId: string): string {\n return `${this.actionMenuElementId}-header-${encodeURIComponent(columnId)}`;\n }\n\n private columnBandId(columnId: string): string | undefined {\n const model = this.createRenderModel();\n const index = this.visibleColumns.findIndex(column => column.id === columnId);\n const lane =\n index +\n 1 +\n Number(model.selectable) +\n Number(model.elasticSpacerIndex != null && index >= model.elasticSpacerIndex);\n const band = this.structure.bands.find(\n band => band.label && lane >= band.start && lane < band.start + band.span\n );\n return band ? `${this.actionMenuElementId}-${band.key}` : undefined;\n }\n private readonly columnCustomizerElementId = nextTableColumnCustomizerElementId();\n private readonly dataModeSwitcherElementId = nextTableDataModeSwitcherElementId();\n private truncateTooltipEl?: HTMLDsTooltipElement;\n private truncateAnchor: HTMLElement | null = null;\n private truncateTooltipBound = false;\n private focusedRowId: string | null = null;\n private virtualRenderFocus: HTMLElement | null = null;\n private renderedAlternateView: boolean | null = null;\n private virtualItems: TableVirtualItem[] = [];\n private visibleColumnsCache: {\n columns: TableColumn[];\n columnCustomizer: boolean;\n hiddenFieldIds: string[];\n fieldOrder: string[];\n pinnedFieldIds: string[];\n value: TableColumn[];\n } | null = null;\n private renderModelCache: {\n columns: TableColumn[];\n rows: TableRow[];\n groups: DataGroup[];\n grouped: boolean;\n selectionMode: TableSelectionMode;\n selectedRowIds: string[];\n collapsedGroupIds: string[];\n virtualCounts: boolean;\n value: TableRenderModel;\n } | null = null;\n private highlightMatcherCache: {\n terms: string[];\n value: TableHighlightMatcher;\n } | null = null;\n private virtualItemsCache: {\n columns: TableColumn[];\n rows: TableRow[];\n groups: DataGroup[];\n grouped: boolean;\n collapsedGroupIds: string[];\n } | null = null;\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 modelWarningQueued = false;\n private initialModelWarningFrame: number | undefined;\n private hasLoaded = false;\n private renderedModel: TableRenderModel | null = null;\n private stickyGroupConnected = false;\n private headerSlotObserver: MutationObserver | null = null;\n private footerSlotObserver: MutationObserver | null = null;\n private captionCompactDisconnect: (() => void) | undefined;\n private fitResizeObserver: ResizeObserver | null = null;\n private fitObservedViewport: HTMLElement | null = null;\n private fitObservedTable: HTMLTableElement | null = null;\n private fitMeasurementPending = false;\n private cardViewportQuery: MediaQueryList | null = null;\n private readonly bodyRenderer = new TableBodyRenderer();\n private readonly layoutController = new TableLayoutController({\n elements: () => ({\n viewport: this.viewportEl,\n contentTable: this.tableEl,\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 && this.dataMode !== 'virtual',\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 virtualController = new TableVirtualController({\n state: () => ({\n enabled: this.rowWindowingEnabled,\n items: this.virtualItems,\n pinnedRowIds: this.virtualPinnedRowIds(),\n viewport: this.viewportEl,\n viewportSize: this.estimateVirtualViewportSize(),\n }),\n windowChanged: plan => {\n this.virtualWindow = plan;\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.connectCardViewportQuery();\n // Reserve the final viewport-fit height before the first paint. The fitted\n // surface is connected after render, but the host can already resolve its\n // owning scrollport and prevent an initial auto-height frame.\n this.viewportFitController.connect();\n this.incrementalWindowActive = this.hasIncrementalState;\n this.syncHeaderSlotPresence();\n this.syncFooterSlotPresence();\n this.loadController.initialize();\n this.groupLoadController.initialize();\n }\n\n componentDidLoad(): void {\n this.hasLoaded = true;\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.virtualController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFooterSlotObserver();\n this.connectFitObserver();\n this.connectCaptionCompactObserver();\n this.syncFitPageSize();\n this.connectTruncateTooltip();\n this.scheduleInitialModelIssueWarning();\n }\n\n componentWillRender(): void {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n const active = root.activeElement;\n this.virtualRenderFocus =\n this.rowWindowingEnabled &&\n active instanceof HTMLElement &&\n this.tableEl?.contains(active) &&\n active.closest('[data-row-id]')\n ? active\n : null;\n }\n\n componentDidRender(): void {\n // Moving a retained pooled row can clear native focus in Firefox. Restore\n // only the same connected node, without scrolling or stealing external focus.\n const retainedFocus = this.virtualRenderFocus;\n this.virtualRenderFocus = null;\n if (retainedFocus?.isConnected) {\n const root = retainedFocus.getRootNode() as Document | ShadowRoot;\n if (!root.activeElement || root.activeElement === this.el.ownerDocument.body) {\n // Resolve the moved rows' scroll geometry before restoring native focus.\n // WebKit otherwise may reveal the caret using the pre-patch layout even\n // with preventScroll. Preserve both axes within the resulting bounds.\n const viewport = this.viewportEl;\n const top = viewport?.scrollTop ?? 0;\n const left = viewport?.scrollLeft ?? 0;\n retainedFocus.focus({ preventScroll: true });\n if (viewport) {\n if (viewport.scrollTop !== top) viewport.scrollTop = top;\n if (viewport.scrollLeft !== left) viewport.scrollLeft = left;\n }\n }\n }\n this.layoutController.refresh(false);\n this.loadController.refresh();\n this.groupLoadController.refresh();\n this.virtualController.refresh();\n this.virtualController.collectMeasurements(this.tableEl);\n if (\n this.rowWindowingEnabled &&\n this.truncateAnchor &&\n this.tableEl &&\n !this.tableEl.contains(this.truncateAnchor)\n ) {\n this.dismissTruncateTooltip();\n }\n this.viewportFitController.refresh(false);\n this.syncStickyGroupConnection();\n this.connectFitObserver();\n this.connectCaptionCompactObserver();\n this.syncFitPageSize();\n if (this.stickyGroupConnected) this.updateStickyGroup();\n if (this.renderedAlternateView !== this.alternateView) {\n this.renderedAlternateView = this.alternateView;\n this.dsAlternateViewRendered.emit({ alternateView: this.alternateView });\n }\n }\n\n /**\n * Scroll the nearest vertical owner only enough to reveal a supplied row.\n * Resolves false when the row is absent from the supplied, expanded table model.\n * This method never moves focus.\n */\n @Method()\n async scrollRowIntoView(rowId: string): Promise<boolean> {\n if (!rowId) return false;\n\n if (this.rowWindowingEnabled) {\n const headerSize = this.tableEl?.tHead?.getBoundingClientRect().height ?? 0;\n const revealed = this.virtualController.scrollRowIntoView(\n rowId,\n headerSize,\n this.stickyHeader ? headerSize : 0\n );\n if (!revealed) return false;\n await this.nextAnimationFrame();\n }\n\n const row = this.findRenderedRow(rowId);\n if (!row) return false;\n this.revealRenderedRow(row);\n return true;\n }\n\n connectedCallback(): void {\n if (!this.hasLoaded) return;\n this.connectCardViewportQuery();\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.virtualController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFooterSlotObserver();\n this.connectFitObserver();\n this.connectCaptionCompactObserver();\n this.connectTruncateTooltip();\n }\n\n disconnectedCallback(): void {\n this.editingCell = null;\n this.layoutController.disconnect();\n this.loadController.disconnect();\n this.groupLoadController.disconnect();\n this.virtualController.disconnect();\n this.viewportFitController.disconnect();\n this.disconnectStickyGroup();\n this.headerSlotObserver?.disconnect();\n this.headerSlotObserver = null;\n this.footerSlotObserver?.disconnect();\n this.footerSlotObserver = null;\n this.disconnectFitObserver();\n this.disconnectCaptionCompactObserver();\n this.disconnectTruncateTooltip();\n this.disconnectCardViewportQuery();\n this.closeColumnCustomizer();\n if (this.initialModelWarningFrame !== undefined) {\n cancelAnimationFrame(this.initialModelWarningFrame);\n this.initialModelWarningFrame = undefined;\n }\n }\n\n private readonly handleCardViewportChange = (event: MediaQueryListEvent): void => {\n if (this.narrowViewport !== event.matches) this.narrowViewport = event.matches;\n };\n\n private connectCardViewportQuery(): void {\n if (\n this.cardViewportQuery ||\n typeof window === 'undefined' ||\n typeof window.matchMedia !== 'function'\n )\n return;\n const query = window.matchMedia(`(max-width: ${TABLE_CARD_VIEWPORT_BREAKPOINT - 1}px)`);\n this.cardViewportQuery = query;\n const narrow = isTableCardViewport(window.innerWidth);\n if (this.narrowViewport !== narrow) this.narrowViewport = narrow;\n query.addEventListener('change', this.handleCardViewportChange);\n }\n\n private disconnectCardViewportQuery(): void {\n this.cardViewportQuery?.removeEventListener('change', this.handleCardViewportChange);\n this.cardViewportQuery = null;\n }\n\n private syncHeaderSlotPresence = () => {\n const header = this.el.querySelector<HTMLElement>('[slot=\"header\"]');\n this.headerPresent = !!header;\n this.headerUsesToolbar = header?.tagName === 'DS-DATA-TOOLBAR';\n this.captionTrailingPresent = !!this.el.querySelector('[slot=\"caption-trailing\"]');\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 syncFooterSlotPresence = () => {\n let presence = 0;\n if (hasOwnedTableFooterSlot(this.el, 'footer-leading')) presence |= TABLE_FOOTER_SLOT_LEADING;\n if (hasOwnedTableFooterSlot(this.el, 'footer')) presence |= TABLE_FOOTER_SLOT_COPY;\n if (hasOwnedTableFooterSlot(this.el, 'footer-trailing')) presence |= TABLE_FOOTER_SLOT_TRAILING;\n if (presence !== this.footerSlotPresence) this.footerSlotPresence = presence;\n };\n\n private connectFooterSlotObserver(): void {\n if (this.footerSlotObserver || typeof MutationObserver === 'undefined') return;\n this.footerSlotObserver = new MutationObserver(this.syncFooterSlotPresence);\n this.footerSlotObserver.observe(this.el, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n this.syncFooterSlotPresence();\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 @Watch('hiddenFieldIds')\n @Watch('fieldOrder')\n @Watch('pinnedFieldIds')\n @Watch('columnCustomizer')\n @Watch('cellSpans')\n @Watch('interactionMode')\n @Watch('responsiveLayout')\n handleStructureChange(): void {\n this.virtualItemsCache = null;\n this.scheduleModelIssueWarning();\n this.loadController.structureChanged();\n this.groupLoadController.structureChanged();\n this.virtualController.invalidateMeasures();\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.scheduleModelIssueWarning();\n this.syncActionMenu();\n this.virtualController.invalidateMeasures();\n }\n\n @Watch('totalCount')\n handleTotalCountChange(): void {\n this.scheduleModelIssueWarning();\n }\n\n @Watch('caption')\n handleCaptionChange(): void {\n this.scheduleModelIssueWarning();\n }\n\n @Watch('loadIdentity')\n handleLoadIdentityChange(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.loadController.identityChanged();\n this.virtualController.resetToTop();\n }\n\n @Watch('sort')\n @Watch('grouping')\n handleVirtualIndexReset(): void {\n this.virtualController.resetToTop();\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.scheduleModelIssueWarning();\n this.handleLazyConfigurationChange();\n this.virtualController.resetToTop();\n }\n\n @Watch('pagination')\n handlePaginationChange(\n pagination: TablePaginationState | null,\n previous: TablePaginationState | null\n ): void {\n if (pagination?.pageSizeMode === 'fit' && pagination.fitIdentity !== previous?.fitIdentity) {\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 @Watch('columnCustomizer')\n @Watch('captionVisibility')\n handleColumnCustomizerAvailability(): void {\n if (!this.showsColumnCustomizer) {\n this.closeColumnCustomizer();\n this.columnCustomizerSurfaceOpen = false;\n }\n }\n\n @Watch('dataModeSwitcher')\n @Watch('captionVisibility')\n handleDataModeSwitcherAvailability(): void {\n if (!this.showsDataModeSwitcher) {\n this.closeDataModeSwitcher();\n this.dataModeSwitcherSurfaceOpen = false;\n }\n }\n\n @Watch('chromeLoading')\n handleChromeLoadingChange(loading: boolean): void {\n if (!loading) return;\n this.closeColumnCustomizer();\n this.closeDataModeSwitcher();\n this.columnCustomizerSurfaceOpen = false;\n this.dataModeSwitcherSurfaceOpen = false;\n }\n\n private get grouped(): boolean {\n return this.grouping !== null;\n }\n\n private get hasIncrementalState(): boolean {\n return (\n this.dataMode === 'infinite' &&\n (this.hasMore || this.loadingMore || !!this.loadMoreError?.trim())\n );\n }\n\n private get selectable(): boolean {\n return this.selectionMode === 'multiple';\n }\n\n private get visibleColumns(): TableColumn[] {\n const cached = this.visibleColumnsCache;\n if (\n cached &&\n cached.columns === this.columns &&\n cached.columnCustomizer === this.columnCustomizer &&\n cached.hiddenFieldIds === this.hiddenFieldIds &&\n cached.fieldOrder === this.fieldOrder &&\n cached.pinnedFieldIds === this.pinnedFieldIds\n ) {\n return cached.value;\n }\n const value = resolveTableVisibleColumns(this.columns, {\n columnCustomizer: this.columnCustomizer,\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: this.fieldOrder,\n pinnedFieldIds: this.pinnedFieldIds,\n });\n this.visibleColumnsCache = {\n columns: this.columns,\n columnCustomizer: this.columnCustomizer,\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: this.fieldOrder,\n pinnedFieldIds: this.pinnedFieldIds,\n value,\n };\n return value;\n }\n\n private get showsColumnCustomizer(): boolean {\n return this.columnCustomizer && this.captionVisibility === 'visible';\n }\n\n private get showsDataModeSwitcher(): boolean {\n return this.dataModeSwitcher && this.captionVisibility === 'visible';\n }\n\n private get showsCaptionTrailing(): boolean {\n return (\n this.showsDataModeSwitcher ||\n (this.showsColumnCustomizer && !this.hideColumnCustomizerTrigger) ||\n this.captionTrailingPresent\n );\n }\n\n private get documentStickyHeader(): boolean {\n return this.stickyHeader && !this.containedScroll && this.responsiveLayout !== 'cards';\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 connectCaptionCompactObserver(): void {\n if (this.captionCompactDisconnect) return;\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n private readonly syncFitPageSize = (): void => {\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (\n !pagination?.fitToPage ||\n pagination.fitToPageInactive ||\n !this.containedScroll ||\n !this.viewportEl ||\n !this.tableEl\n ) {\n if (this.fitPageSize !== undefined) this.fitPageSize = undefined;\n this.fitMeasurementPending = false;\n return;\n }\n const header = this.tableEl.querySelector<HTMLElement>('.ds-table__head');\n const item = this.tableEl.querySelector<HTMLElement>(\n this.grouped ? '.ds-table__group-row' : '.ds-table__body .ds-table__row'\n );\n const itemBlockSize =\n item?.getBoundingClientRect().height ||\n 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 fitToPageInactive: false,\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 showFirstLastButtons: pagination.showFirstLastButtons ?? false,\n previousPageIndex: pagination.pageIndex,\n previousPageSize: pagination.pageSize,\n previousPageSizeMode: 'fit',\n reason: 'fit',\n });\n };\n\n @Listen('keydown', { target: 'window' })\n handleWindowPaginationKeyDown(event: KeyboardEvent): void {\n this.handlePaginationKeyDown(event, true);\n }\n\n private handlePaginationKeyDown(event: KeyboardEvent, fromWindow = false): 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 if (paginationShortcutBlockedByPath(event.composedPath())) return;\n\n if (fromWindow) {\n const origin = event.composedPath()[0];\n const originNode = origin instanceof Text ? origin.parentNode : origin;\n if (\n !shouldHandleContainingPagePaginationShortcut({\n origin: originNode,\n table: this.el,\n eventPath: event.composedPath(),\n })\n ) {\n return;\n }\n }\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 fitToPageInactive: pagination.fitToPageInactive ?? 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 showFirstLastButtons: pagination.showFirstLastButtons ?? false,\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 const columns = this.visibleColumns;\n const grouped = this.grouped;\n const virtualCounts = this.dataMode === 'virtual';\n const cached = this.renderModelCache;\n if (\n cached &&\n cached.columns === columns &&\n cached.rows === this.rows &&\n cached.groups === this.groups &&\n cached.grouped === grouped &&\n cached.selectionMode === this.selectionMode &&\n cached.selectedRowIds === this.selectedRowIds &&\n cached.collapsedGroupIds === this.collapsedGroupIds &&\n cached.virtualCounts === virtualCounts\n ) {\n return cached.value;\n }\n const value = createTableRenderModel({\n columns,\n rows: this.rows,\n groups: this.groups,\n grouped,\n selectionMode: this.selectionMode,\n selectedRowIds: this.selectedRowIds,\n collapsedGroupIds: this.collapsedGroupIds,\n groupCountPresentation: virtualCounts ? 'total' : 'loaded-progress',\n });\n this.renderModelCache = {\n columns,\n rows: this.rows,\n groups: this.groups,\n grouped,\n selectionMode: this.selectionMode,\n selectedRowIds: this.selectedRowIds,\n collapsedGroupIds: this.collapsedGroupIds,\n virtualCounts,\n value,\n };\n return value;\n }\n\n private get highlightMatcher(): TableHighlightMatcher {\n if (this.highlightMatcherCache?.terms === this.highlightTerms) {\n return this.highlightMatcherCache.value;\n }\n const value = createTableHighlightMatcher(this.highlightTerms);\n this.highlightMatcherCache = { terms: this.highlightTerms, value };\n return value;\n }\n\n private get rowWindowingEnabled(): boolean {\n if (!this.hasVirtualViewportBounds) return false;\n if (this.dataMode === 'virtual') return true;\n return !this.grouped && this.currentLoadedRowCount() > TABLE_NON_VIRTUAL_WINDOW_THRESHOLD;\n }\n\n private get virtualViewportMissing(): boolean {\n return this.dataMode === 'virtual' && !this.hasVirtualViewportBounds;\n }\n\n private get hasVirtualViewportBounds(): boolean {\n return this.containedScroll && this.estimateVirtualViewportSize() > 0;\n }\n\n private estimateVirtualViewportSize(): number {\n const measured =\n this.virtualController.currentViewportSize() || this.viewportEl?.clientHeight || 0;\n const chrome =\n (this.captionVisibility === 'visible' ? 48 : 0) + (this.hasResultFooter ? 48 : 0);\n if (this.fixedHeight && this.resolvedHeight) {\n if (measured > 0) return measured;\n return Math.max(\n 0,\n resolveCssLengthPx(this.resolvedHeight, 0, this.rootEl ?? this.el) - chrome\n );\n }\n if (this.fitViewport) return Math.max(0, measured);\n if (this.resolvedMaxHeight) {\n if (this.resolvedMaxHeight.trim().toLowerCase() === 'none') return 0;\n return resolveCssLengthPx(this.resolvedMaxHeight, 0, this.rootEl ?? this.el);\n }\n return 0;\n }\n\n private virtualPinnedRowIds(): Set<string> {\n const pinned = new Set<string>();\n if (this.focusedRowId) pinned.add(this.focusedRowId);\n if (this.actionMenu?.rowId) pinned.add(this.actionMenu.rowId);\n return pinned;\n }\n\n private findRenderedRow(rowId: string): HTMLElement | null {\n return (\n [...this.el.querySelectorAll<HTMLElement>('[data-row-id]')].find(\n candidate => candidate.dataset.rowId === rowId\n ) ?? null\n );\n }\n\n private revealRenderedRow(row: HTMLElement): void {\n if (!this.containedScroll || !this.viewportEl) {\n row.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n return;\n }\n\n const viewportRect = this.viewportEl.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n let visibleStart = viewportRect.top;\n if (this.stickyHeader) {\n visibleStart = Math.max(\n visibleStart,\n this.tableEl?.tHead?.getBoundingClientRect().bottom ?? visibleStart\n );\n }\n const groupRow = row.closest('tbody')?.querySelector<HTMLElement>('.ds-table__group-row');\n if (groupRow && getComputedStyle(groupRow).position === 'sticky') {\n visibleStart = Math.max(visibleStart, groupRow.getBoundingClientRect().bottom);\n }\n\n if (rowRect.top < visibleStart) {\n this.viewportEl.scrollTop += rowRect.top - visibleStart;\n } else if (rowRect.bottom > viewportRect.bottom) {\n this.viewportEl.scrollTop += rowRect.bottom - viewportRect.bottom;\n }\n }\n\n private nextAnimationFrame(): Promise<void> {\n return new Promise(resolve => requestAnimationFrame(() => resolve()));\n }\n\n private syncVirtualItems(model: TableRenderModel): void {\n if (!this.rowWindowingEnabled) {\n this.virtualItems = [];\n this.virtualItemsCache = null;\n this.bodyRenderer.resetVirtualState();\n return;\n }\n const columns = this.visibleColumns;\n const cached = this.virtualItemsCache;\n if (\n cached &&\n cached.columns === columns &&\n cached.rows === this.rows &&\n cached.groups === this.groups &&\n cached.grouped === model.grouped &&\n cached.collapsedGroupIds === this.collapsedGroupIds\n ) {\n return;\n }\n this.virtualItems = flattenTableVirtualItems({\n grouped: model.grouped,\n rows: this.rows,\n groups: this.groups,\n collapsedGroupIds: this.collapsedGroupIds,\n columns,\n });\n if (this.responsiveLayout === 'cards') {\n this.virtualItems = this.virtualItems.map(item => ({ ...item, variableSize: true }));\n }\n this.virtualItemsCache = {\n columns,\n rows: this.rows,\n groups: this.groups,\n grouped: model.grouped,\n collapsedGroupIds: this.collapsedGroupIds,\n };\n }\n\n private shouldWindowRows(model: TableRenderModel): boolean {\n return (\n this.rowWindowingEnabled && (model.hasData || (model.grouped && model.groups.length > 0))\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 const visibleColumns = this.visibleColumns;\n if (!this.caption?.trim()) issues.unshift('A non-empty caption is required.');\n if (this.grouping) {\n const groupingColumn = this.columns.find(column => column.id === this.grouping!.fieldId);\n if (!groupingColumn) {\n issues.push(`Grouping references unknown column id: ${this.grouping.fieldId}`);\n } else if (!visibleColumns.some(column => column.id === groupingColumn.id)) {\n issues.push(`Grouping references hidden column id: ${this.grouping.fieldId}`);\n }\n }\n if (this.sort) {\n const sortColumn = this.columns.find(\n column =>\n column.id === this.sort!.fieldId ||\n column.segments?.some(segment => segment.sortKey === this.sort!.fieldId)\n );\n if (!sortColumn) {\n issues.push(`Sorting references unknown column id: ${this.sort.fieldId}`);\n } else if (!visibleColumns.some(column => column.id === sortColumn.id)) {\n issues.push(`Sorting references hidden column id: ${this.sort.fieldId}`);\n }\n }\n if (\n this.dataMode === 'virtual' &&\n Number.isFinite(this.totalCount) &&\n Math.max(0, Math.trunc(this.totalCount!)) !== this.currentLoadedRowCount()\n ) {\n issues.push('Virtual mode requires totalCount to match the complete supplied row count.');\n }\n const stickyStart = visibleColumns.filter(column => column.sticky === 'start');\n const stickyEnd = visibleColumns.filter(column => column.sticky === 'end');\n issues.push(...this.structure.merges.issues);\n if (this.interactionMode === 'grid' && this.grouped)\n issues.push('Grid interaction requires ungrouped rows.');\n for (const column of [...stickyStart, ...stickyEnd]) {\n if (!tableColumnSize(column))\n issues.push(`Sticky column ${column.id} requires an explicit size.`);\n }\n const message = issues.join(' ');\n if (!message) {\n this.previousModelWarning = '';\n return;\n }\n if (message === this.previousModelWarning) return;\n this.previousModelWarning = message;\n console.warn(`[ds-table] ${message}`);\n }\n\n private scheduleModelIssueWarning(): void {\n if (this.modelWarningQueued) return;\n this.modelWarningQueued = true;\n queueMicrotask(() => {\n this.modelWarningQueued = false;\n this.warnModelIssues();\n });\n }\n\n private scheduleInitialModelIssueWarning(): void {\n if (this.initialModelWarningFrame !== undefined) {\n cancelAnimationFrame(this.initialModelWarningFrame);\n }\n this.initialModelWarningFrame = requestAnimationFrame(() => {\n this.initialModelWarningFrame = undefined;\n this.warnModelIssues();\n });\n }\n\n private emitSort(column: TableColumn, sortKey = column.id): void {\n if (!column.sortable) return;\n this.dsSortChange.emit({ sort: nextDataSortState(this.sort, sortKey) });\n }\n\n private sortButtonLabel(column: TableColumn, sortKey = column.id, label = column.label): string {\n if (this.sort?.fieldId !== 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: DataGroup): 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\"], [popover], ds-button-unfilled, ds-menu'\n );\n });\n }\n\n private groupRowEventOwnsCollapse(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 'input, select, textarea, [role=\"checkbox\"], .ds-table__selection-control, .ds-table__group-selection, ds-tooltip'\n );\n });\n }\n\n private handleGroupRowClick(group: DataGroup, event: Event): void {\n if (!this.groupRowEventOwnsCollapse(event)) return;\n this.emitGroupCollapse(group);\n }\n\n private emitRowActivation(row: TableRow, event: Event): void {\n if (this.gridEnabled || row.disabled || !this.rowEventOwnsActivation(event)) return;\n if (this.selectionMode === 'multiple' && this.selectedRowIds.length > 0) {\n if (row.selectable !== false) this.emitRowSelection(row);\n return;\n }\n if (row.interactive) this.dsRowActivate.emit({ rowId: row.id });\n }\n\n private syncActionMenu(): void {\n if (!this.actionMenu) return;\n const row = tableRows(this.rows, this.groups, this.grouped).find(\n candidate => candidate.id === this.actionMenu?.rowId\n );\n const value = row && !row.disabled ? row.cells[this.actionMenu.columnId] : undefined;\n if (!isTableCellAction(value) || !isRenderableTableActionMenu(value)) {\n this.actionMenu = null;\n }\n }\n\n private closeActionMenu(): void {\n this.actionMenu = null;\n }\n\n private handleActionMenuSelect(item: MenuItemData): void {\n const open = this.actionMenu;\n const actionId = item.value;\n if (!open || !actionId || item.isInactive) return;\n this.dsCellAction.emit({\n actionId,\n rowId: open.rowId,\n columnId: open.columnId,\n });\n const triggerId = tableActionTriggerId(this.actionMenuElementId, open.rowId, open.columnId);\n this.closeActionMenu();\n requestAnimationFrame(() => {\n const trigger = this.el.querySelector<HTMLElement & { setFocus?: () => void }>(\n `#${CSS.escape(triggerId)}`\n );\n trigger?.setFocus?.();\n });\n }\n\n private toggleActionMenu(row: TableRow, column: TableColumn, event: MouseEvent): void {\n if (row.disabled) return;\n const open = this.actionMenu?.rowId === row.id && this.actionMenu?.columnId === column.id;\n this.actionMenuInitialFocusVisible = event.detail === 0;\n this.actionMenu = open ? null : { rowId: row.id, columnId: column.id };\n if (this.actionMenu) this.actionMenuSurface = this.actionMenu;\n }\n\n private renderOverflowActionMenu() {\n const open = this.actionMenu ?? this.actionMenuSurface;\n const row = open\n ? tableRows(this.rows, this.groups, this.grouped).find(\n candidate => candidate.id === open.rowId\n )\n : undefined;\n const value = row && open ? row.cells[open.columnId] : undefined;\n const menu = isTableCellAction(value) && isRenderableTableActionMenu(value) ? value : undefined;\n const sections = menu ? tableActionMenuSections(menu.items) : [];\n const triggerId = open\n ? tableActionTriggerId(this.actionMenuElementId, open.rowId, open.columnId)\n : undefined;\n\n return (\n <ds-menu\n id={this.actionMenuElementId}\n open={Boolean(this.actionMenu && sections.length)}\n anchorId={triggerId}\n align=\"end\"\n side=\"bottom\"\n menuLabel={menu?.ariaLabel ?? 'More actions'}\n initialFocusVisible={this.actionMenuInitialFocusVisible}\n sections={sections}\n onDsClose={() => this.closeActionMenu()}\n onDsAfterClose={() => {\n if (!this.actionMenu) this.actionMenuSurface = null;\n }}\n onDsSelect={event => this.handleActionMenuSelect(event.detail)}\n />\n );\n }\n\n private connectTruncateTooltip(): void {\n if (this.truncateTooltipBound) return;\n this.el.addEventListener('pointerover', this.onTruncatePointerOver);\n this.el.addEventListener('pointerout', this.onTruncatePointerOut);\n this.el.addEventListener('focusin', this.onTruncateFocusIn);\n this.el.addEventListener('focusout', this.onTruncateFocusOut);\n this.truncateTooltipBound = true;\n }\n\n private disconnectTruncateTooltip(): void {\n if (!this.truncateTooltipBound) return;\n this.el.removeEventListener('pointerover', this.onTruncatePointerOver);\n this.el.removeEventListener('pointerout', this.onTruncatePointerOut);\n this.el.removeEventListener('focusin', this.onTruncateFocusIn);\n this.el.removeEventListener('focusout', this.onTruncateFocusOut);\n this.truncateTooltipBound = false;\n this.dismissTruncateTooltip();\n }\n\n private onTruncatePointerOver = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n const track = resolveTableTruncateTrack(event.target);\n if (!track) return;\n this.presentOrDismissTruncateTrack(track);\n };\n\n private onTruncatePointerOut = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n if (resolveTableTruncateTrack(event.relatedTarget)) return;\n const next = event.relatedTarget;\n const cell = this.truncateAnchor?.closest('.ds-table__cell');\n if (cell && next instanceof Node && cell.contains(next)) return;\n this.dismissTruncateTooltip();\n };\n\n private onTruncateFocusIn = (event: FocusEvent) => {\n const track = resolveTableTruncateTrack(event.target);\n if (!track) {\n this.dismissTruncateTooltip();\n return;\n }\n this.presentOrDismissTruncateTrack(track);\n };\n\n private onTruncateFocusOut = (event: FocusEvent) => {\n if (resolveTableTruncateTrack(event.relatedTarget)) return;\n this.dismissTruncateTooltip();\n };\n\n private presentOrDismissTruncateTrack(track: HTMLElement): void {\n if (!isElementTruncated(track)) {\n this.dismissTruncateTooltip();\n return;\n }\n const label = tableTruncateLabel(track);\n if (!label) {\n this.dismissTruncateTooltip();\n return;\n }\n this.truncateAnchor = track;\n this.truncateTooltipLabel = label;\n void this.truncateTooltipEl?.presentFrom(track, label);\n }\n\n private dismissTruncateTooltip(): void {\n this.truncateAnchor = null;\n if (!this.truncateTooltipLabel && !this.truncateTooltipEl) return;\n this.truncateTooltipLabel = '';\n void this.truncateTooltipEl?.dismiss();\n }\n\n private renderTruncateTooltip() {\n return (\n <ds-tooltip\n ref={element => {\n this.truncateTooltipEl = element;\n }}\n label={this.truncateTooltipLabel}\n describedBy={false}\n wrapLabel={true}\n size=\"sm\"\n delay={0}\n side=\"top\"\n />\n );\n }\n\n private handleRowKeydown(row: TableRow, event: KeyboardEvent): void {\n if (event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' '))\n return;\n event.preventDefault();\n this.emitRowActivation(row, event);\n }\n\n private onVirtualFocusIn = (event: FocusEvent): void => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n const row = target.closest('[data-row-id]');\n const id = row?.getAttribute('data-row-id') ?? null;\n if (id === this.focusedRowId) return;\n this.focusedRowId = id;\n if (this.rowWindowingEnabled) this.virtualController.schedule();\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'], shadow = true) {\n if (!sticky) return null;\n return (\n <span\n class={{\n 'ds-table__sticky-edge': true,\n [`ds-table__sticky-edge--${sticky}`]: true,\n 'ds-table__sticky-edge--internal': !shadow,\n }}\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 headerLane?: { start: number; spanning: boolean }\n ) {\n const groupedColumn = this.grouping?.fieldId === column.id;\n const previousColumn = headerLane\n ? this.visibleColumns[this.visibleColumns.indexOf(column) - 1]\n : undefined;\n const segments = column.segments?.length\n ? column.segments\n : [{ label: column.label, sortKey: column.id }];\n const activeMemberSegment = segments.find(segment => segment.sortKey === this.sort?.fieldId);\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'\n ? 'ascending'\n : 'descending'\n : undefined;\n\n const help = column.help?.trim();\n const labels = (\n <span\n class=\"ds-table__header-labels\"\n tabIndex={interactive && help && !column.sortable ? 0 : undefined}\n data-header-help={help ? '' : undefined}\n >\n {segments.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 decoration={help ? 'dotted-underline' : undefined}\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(\n column,\n segment.sortKey,\n segment.dataLabel?.trim() || segment.label\n )}\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 < segments.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 labelControl =\n interactive && help ? (\n <ds-tooltip label={help} side=\"top\" size=\"sm\" wrapLabel={true}>\n {labels}\n </ds-tooltip>\n ) : (\n labels\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.label\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 =\n collapseHost?.mode === 'action' && collapseHost.columnId === column.id;\n const blankActionCollapseHost =\n actionCollapseHost && !column.label.trim() && !column.segments?.length;\n const collapseControl =\n interactive && actionCollapseHost ? (\n <span class=\"ds-table__collapse-slot\">{this.renderCollapseAllButton()}</span>\n ) : null;\n\n return (\n <th\n key={column.id}\n id={presentational ? undefined : this.headerId(column.id)}\n headers={presentational ? undefined : this.columnBandId(column.id)}\n rowSpan={headerLane?.spanning ? 2 : undefined}\n style={{\n ...this.structure.pins.get(column.id)?.style,\n ...(headerLane\n ? {\n gridColumn: String(headerLane.start),\n gridRow: headerLane.spanning ? '1 / span 2' : '2',\n }\n : {}),\n }}\n class={{\n 'ds-table__header-cell': true,\n 'ds-table__header-cell--rowspan': !!headerLane?.spanning,\n 'ds-table__header-cell--after-rowspan':\n !!headerLane &&\n !headerLane.spanning &&\n !!previousColumn &&\n !previousColumn.group &&\n !this.structure.pins.has(previousColumn.id),\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--sticky-start':\n column.sticky === 'start' && this.structure.pins.has(column.id),\n 'ds-table__cell--sticky-end':\n column.sticky === 'end' && this.structure.pins.has(column.id),\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.label.trim() && column.accessibleLabel?.trim() && (\n <span class=\"ds-visually-hidden\">{column.accessibleLabel}</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(\n this.structure.pins.has(column.id) ? column.sticky : undefined,\n !!this.structure.pins.get(column.id)?.edge\n )}\n </th>\n );\n }\n\n private renderColgroup(model: TableRenderModel) {\n const beforeSpacer =\n model.elasticSpacerIndex == null\n ? this.visibleColumns\n : this.visibleColumns.slice(0, model.elasticSpacerIndex);\n const afterSpacer =\n model.elasticSpacerIndex == null ? [] : this.visibleColumns.slice(model.elasticSpacerIndex);\n const renderColumn = (column: TableColumn) => {\n const width = tableColumnSize(column);\n return (\n <col\n key={column.id}\n class={{ 'ds-table__action-column': column.kind === 'action' }}\n style={width ? { width } : undefined}\n />\n );\n };\n return (\n <colgroup>\n {model.selectable && <col class=\"ds-table__selection-column\" />}\n {beforeSpacer.map(renderColumn)}\n {model.elasticSpacerIndex != null && <col class=\"ds-table__elastic-spacer-column\" />}\n {afterSpacer.map(renderColumn)}\n </colgroup>\n );\n }\n\n private renderHeader(\n model: TableRenderModel,\n interactive = true,\n presentational = false,\n ariaRowIndex?: number\n ) {\n const selection = model.selection;\n const bands = this.structure.bands;\n const multirow = bands.length > 0;\n const controls =\n interactive &&\n !(\n this.responsiveLayout === 'cards' &&\n this.narrowViewport &&\n this.interactionMode !== 'grid' &&\n !this.cellSpans.length\n );\n const selectionHeader = model.selectable && (\n <th\n class={{\n 'ds-table__header-cell': true,\n 'ds-table__selection-cell': true,\n 'ds-table__cell--sticky-start': true,\n 'ds-table__header-cell--rowspan': multirow,\n }}\n rowSpan={multirow ? 2 : undefined}\n style={multirow ? { gridColumn: '1', gridRow: '1 / span 2' } : undefined}\n scope={presentational ? undefined : 'col'}\n >\n {controls ? (\n 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 ) : (\n <span class=\"ds-visually-hidden\">Select rows</span>\n )}\n {this.renderStickyEdge(\n 'start',\n ![...this.structure.pins.values()].some(pin => pin.edge === 'start')\n )}\n </th>\n );\n const lanes: (TableColumn | undefined)[] = [...this.visibleColumns];\n if (model.elasticSpacerIndex != null) lanes.splice(model.elasticSpacerIndex, 0, undefined);\n const renderLane = (column: TableColumn | undefined, index: number) => {\n const start = index + 1 + Number(model.selectable);\n if (column)\n return this.renderColumnHeader(\n column,\n model,\n controls,\n presentational,\n multirow ? { start, spanning: !column.group } : undefined\n );\n return (\n <th\n class=\"ds-table__header-cell ds-table__elastic-spacer-cell\"\n rowSpan={multirow ? 2 : undefined}\n style={multirow ? { gridColumn: String(start), gridRow: '1 / span 2' } : undefined}\n aria-hidden=\"true\"\n role=\"presentation\"\n data-elastic-spacer=\"true\"\n />\n );\n };\n return (\n <thead\n class={{\n 'ds-table__head': true,\n 'ds-table__head--multirow': multirow,\n 'ds-table__head--semantic-copy': !interactive,\n }}\n ref={element => {\n if (interactive) this.interactiveHeadEl = element ?? null;\n }}\n >\n {multirow && (\n <tr class=\"ds-table__header-row ds-table__super-header-row\" aria-rowindex={ariaRowIndex}>\n {selectionHeader}\n {bands.map(band =>\n !band.label ? (\n lanes.map((column, index) => {\n const start = index + 1 + Number(model.selectable);\n return start >= band.start && start < band.start + band.span\n ? renderLane(column, index)\n : null;\n })\n ) : (\n <th\n key={band.key}\n id={presentational ? undefined : `${this.actionMenuElementId}-${band.key}`}\n class={{\n 'ds-table__header-cell': true,\n 'ds-table__super-header-cell': true,\n 'ds-table__cell--sticky-start': band.sticky === 'start',\n 'ds-table__cell--sticky-end': band.sticky === 'end',\n }}\n scope={presentational || !band.label ? undefined : 'colgroup'}\n colSpan={band.span}\n style={{\n gridColumn: `${band.start} / span ${band.span}`,\n gridRow: '1',\n ...this.structure.pins.get(\n (band.sticky === 'end' ? band.lastColumnId : band.firstColumnId) ?? ''\n )?.style,\n }}\n aria-hidden={!band.label ? 'true' : undefined}\n >\n <span class=\"ds-table__header-content\">\n <span class=\"ds-table__header-labels\">\n <span class=\"ds-table__header-segment\">\n {/* eslint-disable-next-line compomo/prefer-direct-ds-text -- Match the normal header's structural label canvas and inner text inset. */}\n <span class=\"ds-table__header-label ds-table__header-static\">\n <ds-text\n class=\"ds-table__header-label-box ds-control-label-box\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n lineTruncation={1}\n >\n {band.label}\n </ds-text>\n </span>\n </span>\n </span>\n </span>\n {this.renderStickyEdge(\n band.sticky,\n !!this.structure.pins.get(\n (band.sticky === 'end' ? band.firstColumnId : band.lastColumnId) ?? ''\n )?.edge\n )}\n </th>\n )\n )}\n </tr>\n )}\n <tr\n class=\"ds-table__header-row\"\n aria-rowindex={\n ariaRowIndex == null\n ? undefined\n : ariaRowIndex + Number(this.structure.bands.length > 0)\n }\n >\n {!multirow && selectionHeader}\n {lanes.map((column, index) => (!multirow || column?.group) && renderLane(column, index))}\n </tr>\n </thead>\n );\n }\n\n private renderRow(\n row: TableRow,\n model: TableRenderModel,\n ariaRowIndex?: number,\n variableVirtualSize = false,\n rowKey = row.id\n ) {\n return renderTableRowView({\n grid: this.gridEnabled,\n cellAttributes: this.editingEnabled\n ? (targetRow, column) => this.gridCellAttributes(targetRow, column)\n : undefined,\n renderEditor: this.editingEnabled\n ? (targetRow, column) => this.renderCellEditor(targetRow, column)\n : undefined,\n renderEditTrigger: this.editingEnabled\n ? (targetRow, column) => this.renderCellEditTrigger(targetRow, column)\n : undefined,\n pins: this.structure.pins,\n spans: this.structure.merges.cells.get(row.id),\n headerId: id => this.headerId(id),\n responsiveCards: this.responsiveLayout === 'cards',\n row,\n model,\n visibleColumns: this.visibleColumns,\n emptyCellLabel: this.emptyCellLabel,\n actionMenuElementId: this.actionMenuElementId,\n actionMenu: this.actionMenu,\n actionMenuSurface: this.actionMenuSurface,\n surfaceOpenRowId: this.surfaceOpenRowId,\n highlightMatcher: this.highlightMatcher,\n highlightFieldIds: this.highlightFieldIds,\n ariaRowIndex:\n ariaRowIndex == null ? undefined : ariaRowIndex + Number(this.structure.bands.length > 0),\n variableVirtualSize,\n intrinsicBlockSize:\n this.dataMode !== 'virtual'\n ? estimateTableRowBlockSize(row, this.visibleColumns)\n : undefined,\n rowKey,\n renderSelectionControl: (label, checked, indeterminate, disabled, onActivate) =>\n this.renderSelectionControl(label, checked, indeterminate, disabled, onActivate),\n renderStickyEdge: (sticky, shadow) => this.renderStickyEdge(sticky, shadow),\n onRowActivate: (targetRow, event) => this.emitRowActivation(targetRow, event),\n onRowKeyDown: (targetRow, event) => this.handleRowKeydown(targetRow, event),\n onRowSelection: targetRow => this.emitRowSelection(targetRow),\n onCellAction: detail => this.dsCellAction.emit(detail),\n onActionMenuToggle: (targetRow, column, event) =>\n this.toggleActionMenu(targetRow, column, event),\n });\n }\n\n private emitGroupCollapse(group: DataGroup) {\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 renderGroupAccessory(\n item: TableRenderModel['groups'][number]['accessories'][number],\n index: number\n ) {\n const text = (\n <ds-text\n key={`acc-${index}`}\n class=\"ds-table__group-accessory\"\n as=\"span\"\n variant=\"text-body-small\"\n color=\"secondary\"\n decoration={item.help ? 'dotted-underline' : undefined}\n lineTruncation={1}\n >\n {item.text}\n </ds-text>\n );\n if (!item.help) return text;\n return (\n <ds-tooltip\n key={`acc-${index}`}\n label={item.help}\n side=\"bottom\"\n align=\"start\"\n size=\"sm\"\n wrapLabel={true}\n >\n <span class=\"ds-table__group-accessory-tip\" tabIndex={0}>\n {text}\n </span>\n </ds-tooltip>\n );\n }\n\n private renderGroupContent(groupModel: TableRenderModel['groups'][number]) {\n const {\n group,\n countLabel,\n collapsed: isCollapsed,\n labelColor,\n selection: groupSelection,\n accessories,\n hero,\n } = groupModel;\n const heroTracks = hero?.kind === 'score' && hero.tracks === 2 ? 2 : 1;\n const heroPresentation = TABLE_GROUP_HERO_SCORE_PRESENTATION[heroTracks];\n return (\n <span\n class={{\n 'ds-table__group-content': true,\n 'ds-table__group-content--multi': accessories.length > 0 || heroTracks === 2,\n 'ds-table__group-content--hero': Boolean(hero),\n 'ds-table__group-content--hero-two-track': Boolean(hero) && heroTracks === 2,\n }}\n onClick={event => this.handleGroupRowClick(group, event)}\n >\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 {hero?.kind === 'score' && (\n <span class=\"ds-table__group-hero\">\n <ds-score\n size={heroPresentation.size}\n variant={heroPresentation.variant}\n value={hero.value}\n level={hero.level}\n label={hero.label ?? 'Safety score'}\n isLoading={hero.isLoading === true}\n />\n </span>\n )}\n <span class=\"ds-table__group-copy\">\n <span class=\"ds-table__group-primary\">\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 <span class=\"ds-visually-hidden\">{countLabel}</span>\n </span>\n {accessories.length > 0 && (\n <span class=\"ds-table__group-accessories\">\n {accessories.flatMap((item, index) => [\n ...(index > 0\n ? [\n <ds-text\n key={`sep-${index}`}\n class=\"ds-table__group-accessory-separator\"\n as=\"span\"\n variant=\"text-body-small\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>,\n ]\n : []),\n this.renderGroupAccessory(item, index),\n ])}\n </span>\n )}\n </span>\n <span class=\"ds-table__group-trailing\">\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 {groupModel.visibleCountText}\n </ds-text>\n <span class=\"ds-table__group-action\">\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 ? `Expand ${group.label} group` : `Collapse ${group.label} group`\n }\n hasBorder={false}\n pressScale={false}\n />\n </span>\n </span>\n </span>\n );\n }\n\n private formatGroupLoadLabel(template: string, group: DataGroup): string {\n return template.split('{group}').join(group.label);\n }\n\n private renderGroupLoadRow(group: DataGroup, totalColumns: number) {\n const error = group.loadMoreError?.trim();\n if (!error && !group.loadingMore && !group.hasMore) return null;\n const manualFallback =\n this.loadMoreMode === 'manual' || !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 {renderTableLoadContent({\n error,\n loading: !!group.loadingMore,\n hasMore: !!group.hasMore,\n manualFallback,\n retryLabel: this.formatGroupLoadLabel(this.groupRetryLabel, group),\n loadingLabel: this.formatGroupLoadLabel(this.groupLoadingMoreLabel, group),\n loadMoreLabel: this.groupLoadMoreLabel,\n loadMoreAriaLabel: this.formatGroupLoadLabel(this.groupLoadMoreAriaLabel, group),\n onRetry: () => this.groupLoadController.request(group.id, 'retry'),\n onLoadMore: () => this.groupLoadController.request(group.id, 'manual'),\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, plan: TableVirtualPlan | null) {\n return this.bodyRenderer.render({\n headerRowCount: 1 + Number(this.structure.bands.length > 0),\n model,\n plan,\n rows: this.rows,\n stickyHeader: this.stickyHeader,\n documentStickyHeader: this.documentStickyHeader,\n activeStickyGroupId: this.activeStickyGroupId,\n renderRow: (row, renderModel, ariaRowIndex, variableVirtualSize, rowKey) =>\n this.renderRow(row, renderModel, ariaRowIndex, variableVirtualSize, rowKey),\n renderGroupContent: groupModel => this.renderGroupContent(groupModel),\n renderGroupLoadRow: (group, totalColumns) => this.renderGroupLoadRow(group, totalColumns),\n });\n }\n\n private renderSkeletonBody(model: TableRenderModel) {\n return renderTableSkeletonBody({\n pins: this.structure.pins,\n model,\n visibleColumns: this.visibleColumns,\n skeletonRows: this.skeletonRows,\n renderStickyEdge: (sticky, shadow) => this.renderStickyEdge(sticky, shadow),\n });\n }\n\n private renderStateBody(kind: 'empty' | 'error' | 'virtual-viewport', totalColumns: number) {\n const error = kind !== 'empty';\n const heading =\n kind === 'virtual-viewport'\n ? TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING\n : error\n ? this.errorHeading\n : this.emptyHeading;\n const body =\n kind === 'virtual-viewport'\n ? TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY\n : error\n ? this.errorBody\n : this.emptyBody;\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 ? 'ExclamationTriangle' : 'Inbox'}\n heading={heading}\n body={body}\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 )\n return null;\n const error = this.loadMoreError?.trim();\n const manualFallback =\n this.loadMoreMode === 'manual' || !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 {renderTableLoadContent({\n error,\n loading: this.loadingMore,\n hasMore: this.hasMore,\n manualFallback,\n retryLabel: this.retryLabel,\n loadingLabel: this.loadingMoreLabel,\n loadMoreLabel: this.loadMoreLabel,\n endOfResultsLabel: this.endOfResultsLabel,\n onRetry: () => this.loadController.request('retry'),\n onLoadMore: () => this.loadController.request('manual'),\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 class=\"ds-table__document-sticky-header\">\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 if (this.dataMode === 'virtual') {\n return formatTableTotalSummary(this.currentLoadedRowCount(), this.resultTotalSummaryLabel);\n }\n return formatTableResultSummary(this.displayedCount, this.totalCount, this.resultSummaryLabel);\n }\n\n private get hasResultFooter(): boolean {\n return (\n (this.dataMode === 'pagination' && !!this.pagination) ||\n !!this.resultSummary ||\n this.footerSlotPresence !== 0\n );\n }\n\n private renderResultFooter() {\n const summary = this.resultSummary;\n const hasLeading = (this.footerSlotPresence & TABLE_FOOTER_SLOT_LEADING) !== 0;\n const hasCopy = (this.footerSlotPresence & TABLE_FOOTER_SLOT_COPY) !== 0;\n const hasTrailing = (this.footerSlotPresence & TABLE_FOOTER_SLOT_TRAILING) !== 0;\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\" onSlotchange={this.syncFooterSlotPresence} />\n </div>\n )}\n {hasCopy ? (\n <slot name=\"footer\" onSlotchange={this.syncFooterSlotPresence} />\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 lineTruncation={1}\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 {...{ fitToPageInactive: pagination.fitToPageInactive ?? 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 showFirstLastButtons={pagination.showFirstLastButtons ?? false}\n loading={this.loading}\n onDsChange={(event: CustomEvent<PaginationChangeDetail>) =>\n this.dsPaginationChange.emit(event.detail)\n }\n />\n )}\n <slot name=\"footer-trailing\" onSlotchange={this.syncFooterSlotPresence} />\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\n class={{\n 'ds-table__caption-content': true,\n 'ds-table__caption-content--trailing': this.showsCaptionTrailing,\n }}\n >\n <div\n class={{\n 'ds-table__caption-leading': true,\n 'ds-table__caption-leading--toolbar': this.headerUsesToolbar,\n }}\n >\n <slot name=\"header\" onSlotchange={this.syncHeaderSlotPresence} />\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 {this.renderCaptionTrailing()}\n </div>\n <slot name=\"header-after\" />\n </div>\n );\n }\n\n private renderCaptionTrailing() {\n if (!this.showsCaptionTrailing) return null;\n return (\n <div class=\"ds-table__caption-trailing\">\n {this.renderColumnCustomizerTrigger()}\n {this.showsColumnCustomizer &&\n !this.hideColumnCustomizerTrigger &&\n this.showsDataModeSwitcher ? (\n <ds-divider orientation=\"vertical\" length=\"var(--dimension-size-400)\" />\n ) : null}\n {this.renderDataModeSwitcherTrigger()}\n <slot name=\"caption-trailing\" />\n </div>\n );\n }\n\n private renderDataModeSwitcherTrigger() {\n if (!this.showsDataModeSwitcher) return null;\n if (this.chromeLoading) {\n return <ds-skeleton variant=\"control\" controlSize=\"md\" width=\"var(--dimension-size-400)\" />;\n }\n return (\n <span class=\"ds-table__caption-mode-switcher\">\n <ds-tooltip label={this.dataModeSwitcherLabel} side=\"top\" size=\"sm\">\n <ds-button-unfilled\n hasBorder={!this.captionControlsBorderless}\n id={`${this.dataModeSwitcherElementId}-trigger`}\n variant=\"icon\"\n size=\"md\"\n icon=\"Ellipses\"\n aria-label={this.dataModeSwitcherLabel}\n hasMenu={true}\n expanded={this.dataModeSwitcherOpen}\n surfaceOpen={this.dataModeSwitcherSurfaceOpen}\n controls={this.dataModeSwitcherElementId}\n activeFill={false}\n pressScale={false}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n this.toggleDataModeSwitcher(event.detail.detail === 0);\n }}\n />\n </ds-tooltip>\n </span>\n );\n }\n\n private renderDataModeSwitcherMenu() {\n if (!this.showsDataModeSwitcher || this.chromeLoading) return null;\n return (\n <ds-menu\n id={this.dataModeSwitcherElementId}\n open={this.dataModeSwitcherOpen}\n anchorId={`${this.dataModeSwitcherElementId}-trigger`}\n align=\"end\"\n side=\"bottom\"\n menuLabel={this.dataModeMenuLabel}\n initialFocusVisible={this.dataModeSwitcherInitialFocusVisible}\n items={tableDataModeMenuItems(this.dataMode, {\n infinite: this.infiniteModeLabel,\n pagination: this.paginationModeLabel,\n virtual: this.virtualModeLabel,\n })}\n onDsClose={() => this.closeDataModeSwitcher()}\n onDsAfterClose={() => {\n if (!this.dataModeSwitcherOpen) this.dataModeSwitcherSurfaceOpen = false;\n }}\n onDsSelect={event => this.handleDataModeSwitcherSelect(event.detail)}\n />\n );\n }\n\n private toggleDataModeSwitcher(fromKeyboard = false): void {\n if (this.dataModeSwitcherOpen) this.closeDataModeSwitcher();\n else this.openDataModeSwitcher(fromKeyboard);\n }\n\n private openDataModeSwitcher(fromKeyboard = false): void {\n if (!this.showsDataModeSwitcher || this.dataModeSwitcherOpen) return;\n this.closeColumnCustomizer();\n this.dataModeSwitcherInitialFocusVisible = fromKeyboard;\n this.dataModeSwitcherOpen = true;\n this.dataModeSwitcherSurfaceOpen = true;\n }\n\n private closeDataModeSwitcher(): void {\n this.dataModeSwitcherOpen = false;\n }\n\n private handleDataModeSwitcherSelect(item: MenuItemData): void {\n const dataMode = tableDataModeFromMenuItem(item);\n if (!dataMode) return;\n this.closeDataModeSwitcher();\n if (dataMode !== this.dataMode) this.dsDataModeChange.emit({ dataMode });\n requestAnimationFrame(() => {\n this.el\n .querySelector<\n HTMLElement & { setFocus?: () => void }\n >(`#${CSS.escape(`${this.dataModeSwitcherElementId}-trigger`)}`)\n ?.setFocus?.();\n });\n }\n\n private renderColumnCustomizerTrigger() {\n if (this.hideColumnCustomizerTrigger) return null;\n if (!this.showsColumnCustomizer) return null;\n return (\n <div\n class={{\n 'ds-table__caption-customizer': true,\n 'ds-table__caption-customizer--loading': this.chromeLoading,\n }}\n aria-hidden={this.chromeLoading ? 'true' : undefined}\n >\n <ds-tooltip label={this.captionCompact ? 'Customize' : ''} side=\"top\" size=\"sm\">\n <ds-button-unfilled\n hasBorder={!this.captionControlsBorderless}\n id={`${this.columnCustomizerElementId}-trigger`}\n variant={this.captionCompact ? 'icon' : 'icon-label'}\n size=\"md\"\n icon=\"Preferences\"\n label=\"Customize\"\n labelEmphasis={false}\n pressScale={false}\n aria-label=\"Customize table\"\n haspopup=\"menu\"\n expanded={this.columnCustomizerOpen}\n surfaceOpen={this.columnCustomizerSurfaceOpen}\n controls={this.columnCustomizerElementId}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n if (this.chromeLoading) return;\n this.toggleColumnCustomizer(event.detail.detail === 0);\n }}\n />\n </ds-tooltip>\n {this.chromeLoading ? (\n <ds-skeleton variant=\"control\" controlSize=\"md\" width=\"100%\" />\n ) : null}\n </div>\n );\n }\n\n private renderColumnCustomizerMenu() {\n if (!this.showsColumnCustomizer || this.chromeLoading) return null;\n return (\n <ds-menu\n id={this.columnCustomizerElementId}\n open={this.columnCustomizerOpen}\n anchorId={`${this.columnCustomizerElementId}-trigger`}\n align=\"end\"\n side=\"bottom\"\n menuLabel=\"Customize table\"\n initialFocusVisible={this.columnCustomizerInitialFocusVisible}\n sections={[\n ...tableColumnCustomizerSections(\n this.columns,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.pinnedFieldIds\n ),\n ...(this.customizeOptions.length\n ? [{ header: 'Options', items: this.customizeOptions }]\n : []),\n ]}\n onDsClose={() => this.closeColumnCustomizer()}\n onDsAfterClose={() => {\n if (!this.columnCustomizerOpen) this.columnCustomizerSurfaceOpen = false;\n }}\n onDsSelect={event => {\n if (this.customizeOptions.some(option => option.value === event.detail.value)) {\n this.dsCustomizeOptionChange.emit(event.detail.value!);\n } else this.handleColumnCustomizerSelect(event.detail);\n }}\n onDsItemToggle={(event: CustomEvent<MenuItemToggleDetail>) =>\n this.handleColumnCustomizerAction(event.detail)\n }\n onDsReorder={event => this.handleColumnCustomizerReorder(event.detail)}\n />\n );\n }\n\n private toggleColumnCustomizer(fromKeyboard = false): void {\n if (this.columnCustomizerOpen) this.closeColumnCustomizer();\n else this.openColumnCustomizer(fromKeyboard);\n }\n\n private openColumnCustomizer(fromKeyboard = false): void {\n if (!this.showsColumnCustomizer || this.columnCustomizerOpen) return;\n this.closeDataModeSwitcher();\n this.columnCustomizerInitialFocusVisible = fromKeyboard;\n this.columnCustomizerOpen = true;\n this.columnCustomizerSurfaceOpen = true;\n }\n\n private closeColumnCustomizer(): void {\n this.columnCustomizerOpen = false;\n }\n\n private emitColumnsConfigChange(\n hiddenFieldIds: string[],\n fieldOrder: string[],\n pinnedFieldIds: string[] = this.pinnedFieldIds\n ): void {\n this.dsFieldsConfigChange.emit(\n resolveTableFieldsConfiguration(this.columns, hiddenFieldIds, fieldOrder, pinnedFieldIds)\n );\n }\n\n private handleColumnCustomizerReorder(detail: MenuReorderDetail): void {\n const order = detail.items\n .filter(item => item.reorderable)\n .map(item => item.value)\n .filter((id): id is string => !!id);\n this.dsFieldsConfigChange.emit(\n reorderTableColumnPartition(\n this.columns,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.pinnedFieldIds,\n order\n )\n );\n }\n\n private handleColumnCustomizerAction(detail: MenuItemToggleDetail): void {\n if (detail.action?.id === 'visibility') {\n this.handleColumnCustomizerSelect(detail.item);\n return;\n }\n if (detail.action?.id !== 'pin') return;\n const fieldId = detail.item.value;\n if (!fieldId) return;\n this.dsFieldsConfigChange.emit(\n toggleTableColumnPinned(\n this.columns,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.pinnedFieldIds,\n fieldId\n )\n );\n }\n\n private handleColumnCustomizerSelect(item: MenuItemData): void {\n const fieldId = item.value;\n if (!fieldId || item.isInactive) return;\n this.emitColumnsConfigChange(\n toggleTableColumnHidden(this.columns, this.hiddenFieldIds, fieldId),\n this.fieldOrder\n );\n }\n\n render() {\n this.groupSentinelEls.clear();\n const model = this.createRenderModel();\n this.syncVirtualItems(model);\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 windowRows = this.shouldWindowRows(model);\n const virtualViewportMissing =\n this.virtualViewportMissing && !initialLoading && (model.hasData || hasGroupedStructure);\n const virtualPlan = windowRows\n ? (this.virtualWindow ??\n resolveTableVirtualPlan({\n items: this.virtualItems,\n sizes: this.virtualItems.map(item => this.virtualController.sizeFor(item)),\n scrollOffset: this.viewportEl?.scrollTop ?? 0,\n viewportSize: this.estimateVirtualViewportSize(),\n pinnedRowIds: this.virtualPinnedRowIds(),\n }))\n : null;\n const groupLoadingMore = hasGroupedStructure && this.groups.some(group => group.loadingMore);\n const viewportStyle =\n !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) => {\n this.handleGridKeyDown(event);\n this.handlePaginationKeyDown(event);\n }}\n onCopy={(event: ClipboardEvent) => this.handleGridClipboard(event)}\n onPaste={(event: ClipboardEvent) => this.handleGridClipboard(event)}\n onFocusin={this.onVirtualFocusIn}\n >\n <div\n 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--chrome-edge-to-edge': this.chromeLayout === 'edge-to-edge',\n 'ds-table--super-headers': this.structure.bands.length > 0,\n 'ds-table--responsive-cards':\n this.responsiveLayout === 'cards' &&\n this.interactionMode !== 'grid' &&\n this.cellSpans.length === 0,\n 'ds-table--cards-active':\n this.narrowViewport &&\n this.responsiveLayout === 'cards' &&\n this.interactionMode !== 'grid' &&\n this.cellSpans.length === 0,\n 'ds-table--footer-visible': this.hasResultFooter,\n 'ds-table--state-fill':\n !initialLoading &&\n (initialError || virtualViewportMissing || !(model.hasData || hasGroupedStructure)),\n }}\n ref={element => {\n this.rootEl = element ?? null;\n }}\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 data-narrow={String(this.narrowViewport)}\n ref={element => {\n this.frameEl = element ?? null;\n }}\n >\n {this.alternateView ? <slot name=\"alternate-view\" /> : null}\n {!this.alternateView && this.renderDocumentStickyHeader(model)}\n {!this.alternateView && this.renderStickyGroup(model)}\n {!this.alternateView &&\n !this.documentStickyHeader &&\n this.renderFloatingCollapseAll(model)}\n {!this.alternateView && (\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--deferred-rows':\n this.dataMode !== 'virtual' && !this.structure.merges.hasRowSpans,\n 'ds-table__table--windowed': windowRows,\n 'ds-table__table--virtual': this.dataMode === 'virtual' && windowRows,\n 'ds-table__table--native-group-sticky':\n (model.grouped && this.stickyHeader && !this.documentStickyHeader) ||\n windowRows,\n }}\n style={model.tableStyle}\n role={this.gridEnabled ? 'grid' : 'table'}\n aria-multiselectable={this.gridEnabled ? 'true' : undefined}\n aria-rowcount={\n windowRows\n ? 1 + Number(this.structure.bands.length > 0) + this.virtualItems.length\n : undefined\n }\n aria-busy={\n initialLoading ||\n (this.dataMode === 'infinite' && (this.loadingMore || groupLoadingMore))\n ? 'true'\n : undefined\n }\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(\n model,\n !this.documentStickyHeader,\n false,\n windowRows ? 1 : undefined\n )}\n {initialLoading\n ? this.renderSkeletonBody(model)\n : initialError\n ? this.renderStateBody('error', model.totalColumns)\n : virtualViewportMissing\n ? this.renderStateBody('virtual-viewport', model.totalColumns)\n : model.hasData || hasGroupedStructure\n ? this.renderDataBodies(model, virtualPlan)\n : this.renderStateBody('empty', model.totalColumns)}\n {!initialLoading &&\n !initialError &&\n this.dataMode !== 'virtual' &&\n this.renderLazyBody(model)}\n </table>\n </div>\n )}\n </div>\n {this.renderResultFooter()}\n {this.renderOverflowActionMenu()}\n {this.renderDataModeSwitcherMenu()}\n {this.renderColumnCustomizerMenu()}\n {this.renderTruncateTooltip()}\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":[]}
1
+ {"version":3,"names":["TRUNCATION_EPSILON_PX","isElementTruncated","element","target","querySelector","scrollWidth","clientWidth","scrollHeight","clientHeight","TABLE_COLUMN_WIDTH_TOKENS","xs","sm","md","lg","xl","TABLE_IMAGE_COLUMN_WIDTH_VARIABLES","isTableCellText","value","isTableCellPrimaryText","kind","isTableCellTag","isTableCellTags","isTableCellIcon","isTableCellIconText","isTableCellScoreText","isTableCellImage","isTableCellAction","isTableCellEmpty","isTableCellBlank","tableCellPrimary","label","items","map","item","join","primary","alt","ariaLabel","tableRowSelectionLabel","row","columns","explicit","selectionLabel","trim","column","cells","id","String","nextDataSortState","current","fieldId","direction","toggleTableGroupCollapsed","collapsedGroupIds","groupId","next","Set","has","delete","add","nextTableGroupsCollapsed","groupIds","length","collapsed","allCollapsed","every","tableCollapseAllHost","undefined","index","columnId","mode","clampTableColumnSize","size","Number","isFinite","minimum","minSize","maximum","maxSize","Math","max","POSITIVE_INFINITY","min","tableColumnSize","width","imageTracks","tableElasticSpacerIndex","some","sticky","tableExplicitMinWidth","widths","filter","tableRows","rows","groups","grouped","flatMap","group","canSelectRow","selectable","disabled","deriveTableSelectionState","selectedRowIds","selected","Array","isArray","selectableRowIds","selectedLoadedCount","reduce","count","allSelected","indeterminate","toggleTableRowSelection","toggleAllLoadedTableRows","loadedRows","state","toggleTableGroupSelection","groupRows","resolvedTableGroupCount","total","totalCount","TABLE_GROUP_ACCESSORY_LIMIT","tableGroupAccessories","resolved","accessories","text","help","push","TABLE_GROUP_HERO_SCORE_PRESENTATION","variant","tableGroupHero","hero","isSafetyScoreLevel","level","tracks","isLoading","TABLE_GROUP_INTENTS","isTableGroupIntent","includes","tableGroupIntentClass","intent","tableGroupLabelColor","formatTableResultSummary","displayed","locale","normalizedTotal","trunc","normalizedDisplayed","formatter","numberFormatter","replace","format","formatTableTotalSummary","isOwnedTableFooterSlot","node","host","parentElement","insideTableFooter","ancestor","hasAttribute","classList","contains","hasOwnedTableFooterSlot","slotName","querySelectorAll","tableModelIssues","issues","columnIds","accessibleLabel","accessoryCount","rowIds","createTableRenderModel","input","selectionMode","allGroupsCollapsed","showCollapseAll","explicitMinWidth","elasticSpacerIndex","columnTracks","splice","gridTracks","tableStyle","hasData","selection","loadedCount","showTotalOnly","groupCountPresentation","totalLabel","countLabel","visibleCountText","intentClass","labelColor","totalColumns","collapseAllHost","actionMenuSeq","nextTableActionMenuElementId","isTableCellActionMenu","isRenderableTableActionMenu","tableActionMenuSections","sections","flush","entry","actionId","isInactive","isDestructive","tableActionTriggerId","menuId","rowId","sanitizeId","tableDataModeSwitcherSequence","nextTableDataModeSwitcherElementId","tableDataModeMenuItems","dataMode","labels","infinite","isSelected","pagination","virtual","tableDataModeFromMenuItem","createTableCaptionState","columnCustomizerOpen","columnCustomizerSurfaceOpen","columnCustomizerInitialFocusVisible","dataModeSwitcherOpen","dataModeSwitcherSurfaceOpen","dataModeSwitcherInitialFocusVisible","createTableCaptionController","options","columnCustomizerElementId","nextTableColumnCustomizerElementId","dataModeSwitcherElementId","tasks","ConnectionTasks","isConnected","menus","disconnect","cancel","change","reconcile","showsColumnCustomizer","chromeLoading","showsDataModeSwitcher","renderMenus","renderDataModeSwitcherMenu","renderColumnCustomizerMenu","columnCustomizer","captionVisibility","dataModeSwitcher","showsCaptionTrailing","hideColumnCustomizerTrigger","captionTrailingPresent","renderBar","h","class","headerUsesToolbar","name","onSlotchange","headerSlotChange","headerPresent","as","emphasis","color","caption","renderCaptionTrailing","renderColumnCustomizerTrigger","orientation","renderDataModeSwitcherTrigger","controlSize","dataModeSwitcherLabel","side","hasBorder","captionControlsBorderless","icon","hasMenu","expanded","surfaceOpen","controls","activeFill","pressScale","onDsClick","event","toggleDataModeSwitcher","detail","open","anchorId","align","menuLabel","dataModeMenuLabel","initialFocusVisible","infiniteModeLabel","paginationModeLabel","virtualModeLabel","onDsClose","closeDataModeSwitcher","onDsAfterClose","onDsSelect","handleDataModeSwitcherSelect","fromKeyboard","openDataModeSwitcher","dataModeChange","frame","CSS","escape","setFocus","captionCompact","labelEmphasis","haspopup","toggleColumnCustomizer","tableColumnCustomizerSections","hiddenFieldIds","fieldOrder","pinnedFieldIds","customizeOptions","header","closeColumnCustomizer","option","customizeOptionChange","handleColumnCustomizerSelect","onDsItemToggle","handleColumnCustomizerAction","onDsReorder","handleColumnCustomizerReorder","openColumnCustomizer","emitColumnsConfigChange","fieldsChange","resolveTableFieldsConfiguration","order","reorderable","reorderTableColumnPartition","action","toggleTableColumnPinned","toggleTableColumnHidden","tableGridModel","firstEditable","find","tableEditable","rowIndices","Map","columnIndices","tableNextEditable","model","address","key","backwards","ri","get","ci","dr","dc","tableRangeBounds","range","r1","anchor","r2","focus","c1","c2","firstRow","lastRow","firstColumn","lastColumn","editor","tableEditValue","required","type","minLength","maxLength","parseLooseCalendarDate","parseLooseClockTime","isClockTimeStepAligned","step","abs","round","tablePasteChanges","records","split","line","record","changes","entries","textValue","targetRow","targetColumn","renderTableCellEditor","common","hasInteractionFill","onDsChange","stopPropagation","searchable","hasFocusRing","hourFormat","resize","showStepper","createTableEditingController","editDraft","gridModelCache","interaction","editingCell","gridEnabled","enabled","gridModel","gridAddress","HTMLElement","matches","closest","dataset","selectCell","extend","isEditableAddress","activeCell","rangeChange","cellRange","async","focusCell","focusRow","focusAfterReveal","guard","cell","findRow","revealRow","loading","beginCellEdit","initial","control","then","select","componentOnReady","handleKeyDown","altKey","metaKey","ctrlKey","isComposing","preventDefault","shiftKey","handleClipboard","clipboardData","getData","announce","cellsChange","reason","bounds","slice","setData","renderEditor","commit","onClick","onFocusout","wrapper","currentTarget","root","getRootNode","activeElement","onKeyDown","defaultPrevented","checkValidity","validity","stepMismatch","reportValidity","microtask","renderEditTrigger","cellAttributes","editable","editing","active","role","tabIndex","TABLE_TRUNCATE_ATTR","isValidTruncateTrack","track","resolveTableTruncateTrack","Element","Node","fromAncestor","link","nested","tableTruncateLabel","textContent","TABLE_CELL_TEXT_RUN_LIMIT","trackText","resolveTableCellImageTracks","tableCellImageVariant","resolveTableCellTagsTracks","floor","tableCellTrackStackBlockSize","normalizeTableCellTextTrack","runs","run","resolveTableCellTextOverflow","source","wrap","maxLines","wraps","lineClamp","tableCellTextOverflowProps","lineTruncation","resolveTextPresentation","secondary","tertiary","allowTertiary","secondaryColor","tertiaryColor","href","fontFeature","singleLine","primaryText","overflow","resolveTableCellPresentation","cellType","iconColor","iconLabel","score","scoreLevel","scoreLabel","scoreLoading","inline","TABLE_NO_HIGHLIGHT_MATCHER","match","escapeRegExp","createTableHighlightMatcher","terms","normalizedTerms","from","term","Boolean","toLocaleLowerCase","values","sort","left","right","expression","RegExp","segments","cursor","lastIndex","matchAll","renderTableRow","pins","spans","headerId","responsiveCards","grid","visibleColumns","emptyCellLabel","actionMenuElementId","actionMenu","actionMenuSurface","highlightMatcher","highlightFieldIds","surfaceOpenRowId","ariaRowIndex","variableVirtualSize","intrinsicBlockSize","rowKey","renderSelectionControl","renderStickyEdge","onRowActivate","onRowKeyDown","onRowSelection","onCellAction","onActionMenuToggle","interactive","rowSelectable","rowInteractive","beforeSpacer","afterSpacer","cardActions","firstDataColumn","renderColumn","span","lastPin","firstPin","layout","style","edge","renderTableCell","afterCoveredColumn","indexOf","cardActionIndex","cardActionDivider","attributes","editTrigger","pin","decoration","cellPresentation","tagCell","tagsCell","iconCell","iconTextCell","scoreTextCell","imageCell","actionCell","actionMenuCell","textCell","primaryTextCell","singleTextCell","emptyCell","blankCell","tagVariant","tagsVariant","textVariant","imageVariant","iconTextVariant","scoreTextVariant","colSpan","rowSpan","headers","gridColumn","columnStart","verticalAlign","highlight","borders","renderTableCellValue","flag","renderTextCopy","src","menu","triggerId","isInset","insetDepth","tag","contrast","rounded","renderHighlightedText","tableCellFieldMatcher","resolveSafeUrl","truncateAttr","rel","renderTextTrack","defaultColor","wholeColor","highlightMatcherForRun","runIndex","trackClass","colorFor","renderRun","className","copy","wrapLabel","matcher","segment","fieldIndex","sortKey","assignTableVirtualRowPoolKeys","nodes","desiredIds","freeSlots","slot","slotsByRowId","keys","shift","nextSlot","set","TableBodyRenderer","constructor","this","virtualLookupCache","virtualRowPoolStates","resetVirtualState","clear","render","plan","renderVirtualBodies","renderRow","groupModel","isCollapsed","stickySourceHidden","documentStickyHeader","activeStickyGroupId","loadingMore","stickyHeader","scope","renderGroupContent","renderGroupLoadRow","renderVirtualSpacer","renderVirtualRow","rowsById","variableSize","virtualRowPoolKeys","renderVirtualGroup","groupsById","rowKeys","headerIndex","headerRowCount","child","lookup","activeGroupScopes","tablePinnedColumns","result","pinned","ordered","reverse","sizes","tableHeaderBands","spacer","lanes","unshift","bands","previous","last","lastColumnId","start","firstColumnId","tableSpanModel","hasRowSpans","rowIndex","columnIndex","contiguous","ids","indices","end","invalid","windowed","renderTableSkeletonBody","skeletonRows","_","renderSkeletonCell","skeleton","lines","iconText","scoreText","image","blank","renderSkeletonCellContent","iconSize","iconOnly","primaryWidth","secondaryWidth","tertiaryWidth","renderTableLoadContent","error","retryLabel","onRetry","loadingLabel","hasMore","manualFallback","loadMoreLabel","loadMoreAriaLabel","onLoadMore","endOfResultsLabel","TABLE_CARD_VIEWPORT_BREAKPOINT","isTableCardViewport","inlineSize","resolveTableLayoutMetrics","horizontalOverflow","scrollInlineSize","viewportInlineSize","visibleInlineSize","scrollInlineOffset","scrollable","scrollBlockSize","viewportBlockSize","inlineOffset","maxInlineOffset","collapseBlockOffset","collapseHeadBlockStart","collapseFrameBlockStart","TableLayoutController","connected","connectedViewport","connectedContentTable","resizeObserver","maxBlockOffset","lastMode","schedule","requestAnimationFrame","sync","handleScroll","viewport","clampInlineOffset","clampVerticalOverscroll","clampBlockOffset","scrollLeft","floatingCollapseAll","handleWheel","deltaX","deltaY","atStart","atEnd","scrollTop","verticalEdgeWheel","connect","refresh","cancelAnimationFrame","removeEventListener","forceGeometry","contentTable","elements","elementsChanged","addEventListener","passive","ResizeObserver","observe","modeChanged","clamped","measureCollapse","collapseAllOverlay","interactiveHead","metrics","getBoundingClientRect","top","pinnedCells","pinnedSize","crowded","getAttribute","setAttribute","setProperty","stickyHeaderTable","overflowChanged","property","getPropertyValue","TableLoadController","intersectionSupported","IntersectionObserver","intersectionObserver","observedSentinel","requestPending","requestedRowCount","previousLoadedRowCount","initialize","loadedRowCount","disconnectObserver","lazyLoading","loadMoreMode","loadMoreError","sentinel","threshold","loadMoreThreshold","isIntersecting","request","containedScroll","rootMargin","structureChanged","resetRequest","dataChanged","nextCount","added","rowsLoadedLabel","identityChanged","configurationChanged","loadingChanged","loadingMoreLabel","errorChanged","hasMoreChanged","hadMore","loadIdentity","groupIdentity","formatGroupLabel","template","TableGroupLoadController","snapshots","pending","createSnapshots","sentinels","nextSnapshots","snapshot","identity","TABLE_VIRTUAL_ROW_TRACK_SIZE","TABLE_VIRTUAL_LATER_TRACK_INCREMENT","tableVirtualRowTrackSize","TABLE_VIRTUAL_MIN_OVERSCAN_ROWS","TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING","TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY","TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL","tableCellTrackCount","presentation","variantTracks","estimateTableRowBlockSize","tableVirtualRowMetrics","estimatedSize","flattenTableVirtualItems","tableVirtualOverscanPx","viewportSize","buildTableVirtualPrefixSums","prefix","findTableVirtualIndexAtOffset","offset","low","high","mid","tableVirtualItemSizes","measures","sameTableVirtualPlan","totalSize","itemCount","mountedIndexes","sameVirtualNodes","a","b","createTableVirtualIndex","groupHeaderIndexes","headerIndexByGroup","groupEndByHeader","rowIndexById","itemIndexById","activeHeaderIndex","hasVariableSize","itemIndex","resolveTableVirtualPlanFromIndex","empty","mountedIds","overscan","trailingOverscan","before","scrollDirection","after","scrollOffset","rangeStart","rangeEnd","mounted","pinHeader","mountedIndex","nextHeader","firstTableVirtualIndexAfter","pinnedRowIds","mountedSorted","buildGroupedVirtualNodes","buildFlatVirtualNodes","resolveTableVirtualPlan","indexes","middle","spacerSize","trailingSize","selectedHeaders","groupEnd","leadingSize","groupNodes","mountedMembers","memberCursor","memberIndex","MEASURE_EPSILON_PX","measuredItemSize","blockSize","parseFloat","getComputedStyle","marginBlockEnd","TableVirtualController","measurementObserver","measurementTargets","viewportWidth","measuredIds","indexedItems","indexDirty","scrollAtEnd","pendingReset","raf","handleViewportResize","candidate","contentRect","height","sizeChanged","invalidateMeasures","nextOffset","callback","setTimeout","caf","handle","clearTimeout","cancelFrame","unbindViewport","emit","resetToTop","sizeFor","currentPlan","currentViewportSize","scrollRowIntoView","contentOffset","stickyInset","ensureIndex","groupHeaderIndex","groupInset","leadingInset","itemStart","itemEnd","currentOffset","visibleStart","visibleEnd","maxOffset","collectMeasurements","painted","syncMeasurementTargets","measurements","forEach","applyMeasurements","currentIndex","prefixBefore","anchorIndex","anchorOffset","changed","prefixAfter","nextAnchor","delta","borderBoxSize","unobserve","windowChanged","itemIds","resolveTableFitPageSize","headerBlockSize","itemBlockSize","availableBlockSize","DIRECTIONAL_TAGS","DIRECTIONAL_ROLES","paginationShortcutBlockedByPath","path","tagName","isContentEditable","isDocumentRootNode","nodeType","composedContains","descendant","seen","composedParent","shouldHandleContainingPagePaginationShortcut","origin","eventPath","table","ShadowRoot","assignedSlot","parentNode","resolveTableViewportFitMetrics","insetBlockStart","insetBlockEnd","scrollportBlockEnd","scrollportBlockStart","scrollportBlockSize","settledBlockStart","reservedBlockSize","currentBlockStart","hostBlockStart","currentBlockSize","settled","TableViewportFitController","connectedHost","connectedSurface","scrollRoot","ancestorMutationObserver","connectionFrame","surface","hostRect","scrollportRect","window","innerHeight","insets","resolveCssLengthPx","blockStart","blockEnd","fitChanged","disconnectRuntime","clearGeometry","nextScrollRoot","findScrollRoot","rootChanged","observeAncestorInsets","insetsChanged","scrollOuterBy","scrollingElement","document","scrollY","documentElement","scrollTo","behavior","MutationObserver","observer","removeProperty","overflowY","focusRingCss","interactionFillCss","tableCss","TABLE_FOOTER_SLOT_LEADING","TABLE_FOOTER_SLOT_COPY","TABLE_FOOTER_SLOT_TRAILING","TABLE_NON_VIRTUAL_WINDOW_THRESHOLD","Table","__stencil_proxyCustomElement","registerHost","responsiveLayout","chromeLayout","cellSpans","interactionMode","grouping","highlightTerms","alternateView","resultSummaryLabel","resultTotalSummaryLabel","fitViewport","viewportInsetBlockStart","viewportInsetBlockEnd","emptyHeading","emptyBody","errorHeading","errorBody","groupLoadMoreLabel","groupLoadMoreAriaLabel","groupRetryLabel","groupLoadingMoreLabel","groupEndOfResultsLabel","groupRowsLoadedLabel","overflowStart","overflowEnd","announcement","viewportFitSettled","footerSlotPresence","actionMenuInitialFocusVisible","truncateTooltipLabel","narrowViewport","captionMenus","virtualWindow","cellInteraction","truncateAnchor","truncateTooltipBound","focusedRowId","virtualRenderFocus","renderedAlternateView","virtualItems","visibleColumnsCache","renderModelCache","highlightMatcherCache","virtualItemsCache","rootEl","viewportEl","frameEl","interactiveHeadEl","collapseAllOverlayEl","stickyHeaderTableEl","tableEl","sentinelEl","incrementalWindowActive","groupSentinelEls","previousModelWarning","modelWarningQueued","hasLoaded","renderedModel","stickyGroupConnected","headerSlotObserver","footerSlotObserver","fitResizeObserver","fitObservedViewport","fitObservedTable","fitMeasurementPending","cardViewportQuery","editingController","el","patch","dsCellRangeChange","dsCellsChange","message","findRenderedRow","captionController","syncHeaderSlotPresence","dsFieldsConfigChange","dsDataModeChange","dsCustomizeOptionChange","bodyRenderer","layoutController","viewportFitController","loadController","currentLoadedRowCount","dsLoadMore","groupLoadController","dsGroupLoadMore","virtualController","rowWindowingEnabled","virtualPinnedRowIds","estimateVirtualViewportSize","handleCardViewportChange","syncFooterSlotPresence","presence","updateStickyGroup","bottom","activeGroupId","activeGroupTop","body","sourceRect","bodyRect","frameRect","syncFitPageSize","fitToPage","fitToPageInactive","fitPageSize","pageSizeMode","pageSize","pageIndex","dsPaginationChange","totalItems","pageSizeOptions","fitPageSizeLabel","fitPageSizeTriggerLabel","itemLabel","pageSizeLabel","showFirstLastButtons","previousPageIndex","previousPageSize","previousPageSizeMode","onTruncatePointerOver","pointerType","presentOrDismissTruncateTrack","onTruncatePointerOut","relatedTarget","dismissTruncateTooltip","onTruncateFocusIn","onTruncateFocusOut","onVirtualFocusIn","structure","createRenderModel","cached","structureCache","merges","encodeURIComponent","columnBandId","findIndex","lane","band","componentWillLoad","connectCardViewportQuery","hasIncrementalState","componentDidLoad","syncStickyGroupConnection","connectHeaderSlotObserver","connectFooterSlotObserver","connectFitObserver","connectCaptionCompactObserver","connectTruncateTooltip","scheduleInitialModelIssueWarning","componentWillRender","componentDidRender","retainedFocus","ownerDocument","preventScroll","dsAlternateViewRendered","headerSize","tHead","revealed","nextAnimationFrame","revealRenderedRow","connectedCallback","disconnectedCallback","disconnectStickyGroup","disconnectFitObserver","disconnectCaptionCompactObserver","disconnectTruncateTooltip","disconnectCardViewportQuery","initialModelWarningFrame","matchMedia","query","narrow","innerWidth","childList","subtree","attributeFilter","connectStickyGroup","capture","handleStructureChange","scheduleModelIssueWarning","handleDataChange","syncActionMenu","handleTotalCountChange","handleCaptionChange","handleLoadIdentityChange","handleVirtualIndexReset","handleLazyConfigurationChange","handleDataModeChange","handlePaginationChange","fitIdentity","handleLoadingMoreChange","handleLoadMoreErrorChange","handleHasMoreChange","handleCaptionAvailability","resolveTableVisibleColumns","fixedHeight","resolvedHeight","boundedComposition","resolvedMaxHeight","captionCompactDisconnect","observeTableCaptionCompact","compact","handleWindowPaginationKeyDown","handlePaginationKeyDown","fromWindow","composedPath","originNode","Text","resolvePaginationState","totalPages","currentLoadedRows","virtualCounts","hasVirtualViewportBounds","virtualViewportMissing","measured","chrome","hasResultFooter","toLowerCase","scrollIntoView","block","viewportRect","rowRect","groupRow","position","Promise","resolve","syncVirtualItems","shouldWindowRows","maxHeight","warnModelIssues","groupingColumn","sortColumn","stickyStart","stickyEnd","console","warn","queueMicrotask","emitSort","sortable","dsSortChange","sortButtonLabel","emitRowSelection","dsSelectionChange","changedRowId","emitAllSelection","emitGroupSelection","rowEventOwnsActivation","groupRowEventOwnsCollapse","handleGroupRowClick","emitGroupCollapse","emitRowActivation","dsRowActivate","closeActionMenu","handleActionMenuSelect","dsCellAction","trigger","toggleActionMenu","renderOverflowActionMenu","truncateTooltipEl","presentFrom","dismiss","renderTruncateTooltip","ref","describedBy","delay","handleRowKeydown","checked","onActivate","shadow","renderCollapseAllButton","emitAllGroupsCollapse","renderFloatingCollapseAll","renderColumnHeader","presentational","headerLane","groupedColumn","previousColumn","activeMemberSegment","activeMemberSort","activeSort","memberAriaSort","segmentActive","segmentInteractive","dataLabel","separator","labelControl","sortControl","isActive","collapseHost","actionCollapseHost","blankActionCollapseHost","collapseControl","spanning","gridRow","renderColgroup","renderHeader","multirow","selectionHeader","renderLane","renderTableRowView","dsGroupCollapseChange","renderGroupAccessory","groupSelection","heroTracks","heroPresentation","formatGroupLoadLabel","renderStickyGroup","renderDataBodies","renderModel","renderSkeletonBody","renderStateBody","heading","renderLazyBody","renderDocumentStickyHeader","resultSummary","displayedCount","renderResultFooter","summary","hasLeading","hasCopy","hasTrailing","regionLabel","scrollLabel","initialLoading","initialError","hasGroupedStructure","windowRows","virtualPlan","groupLoadingMore","viewportStyle","hostStyle","Host","onCopy","onPaste","onFocusin"],"sources":["src/wc/utils/is-element-truncated.ts","src/wc/components/Table/table-model.ts","src/wc/components/Table/table-render-model.ts","src/wc/components/Table/table-action-menu.ts","src/wc/components/Table/table-data-mode-switcher.ts","src/wc/components/Table/table-caption-controller.tsx","src/wc/components/Table/table-grid-model.ts","src/wc/components/Table/table-cell-editor.tsx","src/wc/components/Table/table-editing-controller.tsx","src/wc/components/Table/table-truncate.ts","src/wc/components/Table/table-cell-model.ts","src/wc/components/Table/table-highlight.ts","src/wc/components/Table/table-row-view.tsx","src/wc/components/Table/table-body-renderer.tsx","src/wc/components/Table/table-structure.ts","src/wc/components/Table/table-skeleton-view.tsx","src/wc/components/Table/table-load-view.tsx","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-virtual-model.ts","src/wc/components/Table/table-virtual-controller.ts","src/wc/components/Table/table-pagination-fit.ts","src/wc/components/Table/table-pagination-shortcut.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":["/** Subpixel rounding can make overflow look equal at 0–1px; ignore that noise. */\nconst TRUNCATION_EPSILON_PX = 1;\n\n/**\n * Whether a laid-out element is visually truncated.\n * Prefers `ds-text`'s inner semantic node when present so host flex layout\n * does not hide horizontal or line-clamp overflow.\n */\nexport function isElementTruncated(element: HTMLElement): boolean {\n const target = element.querySelector<HTMLElement>('.ds-text__element') ?? element;\n return (\n target.scrollWidth - target.clientWidth > TRUNCATION_EPSILON_PX ||\n target.scrollHeight - target.clientHeight > TRUNCATION_EPSILON_PX\n );\n}\n","import { numberFormatter } from '../../utils/intl-formatters';\nimport type {\n TableCellBlank,\n TableCellAction,\n TableCellEmpty,\n TableCellIcon,\n TableCellIconText,\n TableCellScoreText,\n TableCellImage,\n TableCellPrimaryText,\n TableCellText,\n TableCellTag,\n TableCellTags,\n TableCellValue,\n TableColumn,\n DataGroup,\n TableGroupAccessory,\n TableGroupHero,\n TableRow,\n DataSortState,\n} from './table-types';\nimport { isSafetyScoreLevel } from '../Score/score-model';\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\nconst TABLE_IMAGE_COLUMN_WIDTH_VARIABLES = {\n 1: '--_table-image-column-inline-size',\n 2: '--_table-image-column-inline-size-multi',\n 3: '--_table-image-column-inline-size-triple',\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 (\n typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'primary-text'\n );\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 isTableCellTags(value: TableCellValue): value is TableCellTags {\n return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'tags';\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 (\n typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'icon-text'\n );\n}\n\nexport function isTableCellScoreText(value: TableCellValue): value is TableCellScoreText {\n return (\n typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'score-text'\n );\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 (isTableCellTags(value)) return value.items.map(item => item.label).join(', ');\n if (isTableCellIcon(value)) return null;\n if (isTableCellIconText(value)) return value.primary;\n if (isTableCellScoreText(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 nextDataSortState(\n current: DataSortState | null | undefined,\n fieldId: string\n): DataSortState {\n if (current?.fieldId !== fieldId) return { fieldId, direction: 'asc' };\n if (current.direction === 'asc') return { fieldId, direction: 'desc' };\n return { fieldId, direction: 'asc' };\n}\n\nexport function toggleTableGroupCollapsed(collapsedGroupIds: string[], groupId: string): 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 = { columnId: string; mode: 'action' } | { mode: 'floating' };\n\nexport function tableCollapseAllHost(columns: TableColumn[]): 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 =\n Number.isFinite(column.minSize) && (column.minSize ?? 0) > 0 ? column.minSize! : 0;\n const maximum =\n 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 if (column.imageTracks) {\n return `var(${TABLE_IMAGE_COLUMN_WIDTH_VARIABLES[column.imageTracks]})`;\n }\n return column.kind === 'action' ? 'var(--dimension-size-500)' : undefined;\n}\n\n/**\n * Fully sized tables add one internal lane that absorbs spare inline space and\n * collapses to zero at the explicit overflow width. Keep trailing action and\n * sticky-end lanes after it so those controls remain at the visible edge.\n */\nexport function tableElasticSpacerIndex(columns: TableColumn[]): number | undefined {\n if (columns.length === 0 || columns.some(column => !tableColumnSize(column))) return undefined;\n let index = columns.length;\n while (index > 0) {\n const column = columns[index - 1]!;\n if (column.kind !== 'action' && column.sticky !== 'end') break;\n index -= 1;\n }\n return index;\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: DataGroup[], 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[] | ReadonlySet<string>\n): TableSelectionState {\n const selected = Array.isArray(selectedRowIds)\n ? new Set(selectedRowIds)\n : (selectedRowIds as ReadonlySet<string>);\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, selected);\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: DataGroup): number {\n const total = Number.isFinite(group.totalCount) ? Math.max(0, group.totalCount!) : 0;\n return Math.max(total, group.rows.length);\n}\n\n/** Accessory items shown on a group header's second track. */\nexport const TABLE_GROUP_ACCESSORY_LIMIT = 4;\n\n/** Trim, drop empty copy, and cap accessories at the second-track limit. */\nexport function tableGroupAccessories(group: DataGroup): TableGroupAccessory[] {\n const resolved: TableGroupAccessory[] = [];\n for (const item of group.accessories ?? []) {\n const text = item?.text?.trim() ?? '';\n if (!text) continue;\n const help = item.help?.trim();\n resolved.push(help ? { text, help } : { text });\n if (resolved.length === TABLE_GROUP_ACCESSORY_LIMIT) break;\n }\n return resolved;\n}\n\n/** Score recipes for a leading group-header hero spanning one or two tracks. */\nexport const TABLE_GROUP_HERO_SCORE_PRESENTATION = {\n 1: { size: 'sm', variant: 'default' },\n 2: { size: 'lg', variant: 'default' },\n} as const;\n\n/** Resolve a supported group-header hero, or undefined when none is supplied. */\nexport function tableGroupHero(group: DataGroup): TableGroupHero | undefined {\n const hero = group.hero;\n if (!hero || hero.kind !== 'score') return undefined;\n const label = hero.label?.trim();\n return {\n kind: 'score',\n value: hero.value,\n ...(isSafetyScoreLevel(hero.level) ? { level: hero.level } : {}),\n ...(hero.tracks === 2 ? { tracks: 2 as const } : {}),\n ...(label ? { label } : {}),\n ...(hero.isLoading ? { isLoading: true } : {}),\n };\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(value: unknown): value is (typeof TABLE_GROUP_INTENTS)[number] {\n return typeof value === 'string' && (TABLE_GROUP_INTENTS as readonly string[]).includes(value);\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 normalizedTotal = Math.max(0, Math.trunc(total as number));\n const normalizedDisplayed = Math.min(\n normalizedTotal,\n Math.max(0, Math.trunc(displayed as number))\n );\n const formatter = numberFormatter(locale);\n return label\n .replace('{displayed}', formatter.format(normalizedDisplayed))\n .replace('{total}', formatter.format(normalizedTotal));\n}\n\n/** Formats the virtual-mode total-only result footer. */\nexport function formatTableTotalSummary(\n total: number | null | undefined,\n label = '{total} items',\n locale?: string\n): string | null {\n if (!Number.isFinite(total)) return null;\n const normalizedTotal = Math.max(0, Math.trunc(total as number));\n return label.replace('{total}', numberFormatter(locale).format(normalizedTotal));\n}\n\n/**\n * True when a footer slot belongs to the table itself: a light-DOM child of the\n * host, or a top-level node Stencil relocated into this table's footer. A\n * slotted ancestor marks a nested component boundary, so dialog action slots\n * inside footer-leading/footer-trailing content cannot replace the table copy.\n */\nexport function isOwnedTableFooterSlot(node: Element, host: Element): boolean {\n if (node.parentElement === host) return true;\n let insideTableFooter = false;\n for (\n let ancestor = node.parentElement;\n ancestor && ancestor !== host;\n ancestor = ancestor.parentElement\n ) {\n if (ancestor.hasAttribute('slot')) return false;\n if (ancestor.classList.contains('ds-table__footer')) insideTableFooter = true;\n }\n return insideTableFooter;\n}\n\nexport function hasOwnedTableFooterSlot(host: Element, slotName: string): boolean {\n return [...host.querySelectorAll(`[slot=\"${slotName}\"]`)].some(node =>\n isOwnedTableFooterSlot(node, host)\n );\n}\n\nexport function tableModelIssues(\n columns: TableColumn[],\n rows: TableRow[],\n groups: DataGroup[],\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.label.trim() && !column.accessibleLabel?.trim()) {\n issues.push(\n `Column ${column.id || '(missing id)'} requires a visible label or accessibleLabel.`\n );\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 const accessoryCount = (group.accessories ?? []).filter(\n item => typeof item?.text === 'string' && item.text.trim()\n ).length;\n if (accessoryCount > TABLE_GROUP_ACCESSORY_LIMIT) {\n issues.push(`Group ${group.id} has more than ${TABLE_GROUP_ACCESSORY_LIMIT} accessories.`);\n }\n if (group.hero != null && group.hero.kind !== 'score') {\n issues.push(`Group ${group.id} has an unsupported hero.`);\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 deriveTableSelectionState,\n isTableGroupIntent,\n resolvedTableGroupCount,\n tableCollapseAllHost,\n tableColumnSize,\n tableElasticSpacerIndex,\n tableExplicitMinWidth,\n tableGroupAccessories,\n tableGroupHero,\n tableGroupIntentClass,\n tableGroupLabelColor,\n tableRows,\n type TableCollapseAllHost,\n type TableSelectionState,\n} from './table-model';\nimport type {\n TableColumn,\n DataGroup,\n TableGroupAccessory,\n TableGroupHero,\n TableGroupIntent,\n TableRow,\n TableSelectionMode,\n} from './table-types';\n\nexport type TableGroupCountPresentation = 'loaded-progress' | 'total';\n\nexport interface TableGroupRenderModel {\n group: DataGroup;\n count: number;\n loadedCount: number;\n visibleCountText: string;\n countLabel: string;\n intent: TableGroupIntent | undefined;\n intentClass: string | undefined;\n labelColor: ReturnType<typeof tableGroupLabelColor>;\n collapsed: boolean;\n accessories: TableGroupAccessory[];\n hero: TableGroupHero | undefined;\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 elasticSpacerIndex: number | undefined;\n tableStyle: Record<string, string> | undefined;\n}\n\nexport interface TableRenderModelInput {\n columns: TableColumn[];\n rows: TableRow[];\n groups: DataGroup[];\n grouped: boolean;\n selectionMode: TableSelectionMode;\n selectedRowIds: string[];\n collapsedGroupIds: string[];\n groupCountPresentation?: TableGroupCountPresentation;\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 =\n input.grouped &&\n 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 elasticSpacerIndex = tableElasticSpacerIndex(input.columns);\n const columnTracks = input.columns.map(column => tableColumnSize(column) ?? 'minmax(0, 1fr)');\n if (elasticSpacerIndex != null) columnTracks.splice(elasticSpacerIndex, 0, 'minmax(0, 1fr)');\n const gridTracks = [\n ...(selectable ? ['var(--_table-selection-column-inline-size)'] : []),\n ...columnTracks,\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, selectedRowIds),\n collapsedGroupIds,\n groups: input.groups.map(group => {\n const loadedCount = group.rows.length;\n const collapsed = collapsedGroupIds.has(group.id);\n const count = resolvedTableGroupCount(group);\n const showTotalOnly =\n input.groupCountPresentation === 'total' || (collapsed && loadedCount === 0);\n const totalLabel = group.countLabel ?? `${count} ${count === 1 ? 'item' : 'items'}`;\n const accessories = tableGroupAccessories(group);\n const hero = tableGroupHero(group);\n const intent = hero || !isTableGroupIntent(group.intent) ? undefined : group.intent;\n return {\n group,\n count,\n loadedCount,\n visibleCountText: showTotalOnly ? String(count) : `${loadedCount} of ${count}`,\n countLabel: showTotalOnly ? totalLabel : `${loadedCount} of ${totalLabel} loaded`,\n intent,\n intentClass: tableGroupIntentClass(intent),\n labelColor: tableGroupLabelColor(intent),\n collapsed,\n accessories,\n hero,\n selection: selectable ? deriveTableSelectionState(group.rows, selectedRowIds) : null,\n };\n }),\n totalColumns:\n input.columns.length + (selectable ? 1 : 0) + (elasticSpacerIndex == null ? 0 : 1),\n allGroupsCollapsed,\n showCollapseAll,\n collapseAllHost: showCollapseAll ? tableCollapseAllHost(input.columns) : undefined,\n elasticSpacerIndex,\n tableStyle,\n };\n}\n","import type { MenuItemData, MenuItemsSection } from '../Menu/menu-types';\nimport type { TableCellAction, TableCellActionMenuEntry } from './table-types';\n\nlet actionMenuSeq = 0;\n\nexport function nextTableActionMenuElementId(): string {\n actionMenuSeq += 1;\n return `ds-table-action-menu-${actionMenuSeq}`;\n}\n\nexport function isTableCellActionMenu(\n value: TableCellAction\n): value is TableCellAction & { items: TableCellActionMenuEntry[]; ariaLabel: string } {\n return Array.isArray(value.items);\n}\n\nexport function isRenderableTableActionMenu(\n value: TableCellAction\n): value is TableCellAction & { items: TableCellActionMenuEntry[]; ariaLabel: string } {\n return isTableCellActionMenu(value) && tableActionMenuSections(value.items).length > 0;\n}\n\n/** Split divider entries into Menu sections. Empty runs (leading/repeated dividers) are dropped. */\nexport function tableActionMenuSections(items: TableCellActionMenuEntry[]): MenuItemsSection[] {\n const sections: MenuItemsSection[] = [];\n let current: MenuItemData[] = [];\n const flush = () => {\n if (!current.length) return;\n sections.push({ items: current });\n current = [];\n };\n\n for (const entry of items) {\n if ('kind' in entry) {\n flush();\n continue;\n }\n current.push({\n value: entry.actionId,\n label: entry.label,\n ...(entry.isInactive ? { isInactive: true } : {}),\n ...(entry.isDestructive ? { isDestructive: true } : {}),\n });\n }\n flush();\n return sections;\n}\n\nexport function tableActionTriggerId(menuId: string, rowId: string, fieldId: string): string {\n return `${menuId}-${sanitizeId(rowId)}-${sanitizeId(fieldId)}`;\n}\n\nfunction sanitizeId(value: string): string {\n return value.replace(/[^A-Za-z0-9_-]+/g, '-');\n}\n","import type { MenuItemData } from '../Menu/menu-types';\nimport type { TableDataMode } from './table-types';\n\nlet tableDataModeSwitcherSequence = 0;\n\nexport function nextTableDataModeSwitcherElementId(): string {\n tableDataModeSwitcherSequence += 1;\n return `ds-table-data-mode-${tableDataModeSwitcherSequence}`;\n}\n\n/** Menu of supported data-mode choices. */\nexport function tableDataModeMenuItems(\n dataMode: TableDataMode,\n labels: { infinite: string; pagination: string; virtual: string }\n): MenuItemData[] {\n return [\n {\n label: labels.infinite,\n value: 'infinite',\n isSelected: dataMode === 'infinite',\n },\n {\n label: labels.pagination,\n value: 'pagination',\n isSelected: dataMode === 'pagination',\n },\n {\n label: labels.virtual,\n value: 'virtual',\n isSelected: dataMode === 'virtual',\n },\n ];\n}\n\nexport function tableDataModeFromMenuItem(item: MenuItemData): TableDataMode | null {\n return item.value === 'infinite' || item.value === 'pagination' || item.value === 'virtual'\n ? item.value\n : null;\n}\n","import { h } from '@stencil/core';\nimport { ConnectionTasks } from '../../utils/connection-tasks';\nimport {\n nextTableColumnCustomizerElementId,\n reorderTableColumnPartition,\n resolveTableFieldsConfiguration,\n tableColumnCustomizerSections,\n toggleTableColumnHidden,\n toggleTableColumnPinned,\n} from './table-column-customizer';\nimport {\n nextTableDataModeSwitcherElementId,\n tableDataModeFromMenuItem,\n tableDataModeMenuItems,\n} from './table-data-mode-switcher';\nimport type { MenuItemData, MenuItemToggleDetail, MenuReorderDetail } from '../Menu/menu-types';\nimport type {\n DataFieldsConfigChangeDetail,\n TableCaptionVisibility,\n TableColumn,\n TableDataMode,\n TableDataModeChangeDetail,\n} from './table-types';\n\nexport interface TableCaptionState {\n columnCustomizerOpen: boolean;\n columnCustomizerSurfaceOpen: boolean;\n columnCustomizerInitialFocusVisible: boolean;\n dataModeSwitcherOpen: boolean;\n dataModeSwitcherSurfaceOpen: boolean;\n dataModeSwitcherInitialFocusVisible: boolean;\n}\n\nexport function createTableCaptionState(): TableCaptionState {\n return {\n columnCustomizerOpen: false,\n columnCustomizerSurfaceOpen: false,\n columnCustomizerInitialFocusVisible: false,\n dataModeSwitcherOpen: false,\n dataModeSwitcherSurfaceOpen: false,\n dataModeSwitcherInitialFocusVisible: false,\n };\n}\n\ninterface TableCaptionContext {\n caption: string;\n captionVisibility: TableCaptionVisibility;\n headerPresent: boolean;\n headerUsesToolbar: boolean;\n captionTrailingPresent: boolean;\n captionCompact: boolean;\n columnCustomizer: boolean;\n hideColumnCustomizerTrigger: boolean;\n captionControlsBorderless: boolean;\n chromeLoading: boolean;\n columns: TableColumn[];\n hiddenFieldIds: string[];\n fieldOrder: string[];\n pinnedFieldIds: string[];\n customizeOptions: MenuItemData[];\n dataModeSwitcher: boolean;\n dataModeSwitcherLabel: string;\n dataModeMenuLabel: string;\n dataMode: TableDataMode;\n infiniteModeLabel: string;\n paginationModeLabel: string;\n virtualModeLabel: string;\n}\n\ninterface TableCaptionControllerOptions {\n host: () => HTMLElement;\n state: () => TableCaptionContext;\n menus: () => TableCaptionState;\n change: (patch: Partial<TableCaptionState>) => void;\n headerSlotChange: () => void;\n fieldsChange: (detail: DataFieldsConfigChangeDetail) => void;\n dataModeChange: (detail: TableDataModeChangeDetail) => void;\n customizeOptionChange: (value: string) => void;\n}\n\n/** Owns caption composition and menu interaction, using controlled field and mode inputs. */\n// Keep JSX in functions so Stencil includes these component dependencies in its metadata.\nexport function createTableCaptionController(options: TableCaptionControllerOptions) {\n const columnCustomizerElementId = nextTableColumnCustomizerElementId();\n const dataModeSwitcherElementId = nextTableDataModeSwitcherElementId();\n const tasks = new ConnectionTasks(() => options.host().isConnected);\n\n function state() {\n return options.state();\n }\n\n function menus() {\n return options.menus();\n }\n\n function disconnect(): void {\n tasks.cancel();\n options.change(createTableCaptionState());\n }\n\n function reconcile(): void {\n if (!showsColumnCustomizer() || state().chromeLoading) {\n options.change({ columnCustomizerOpen: false, columnCustomizerSurfaceOpen: false });\n }\n if (!showsDataModeSwitcher() || state().chromeLoading) {\n options.change({ dataModeSwitcherOpen: false, dataModeSwitcherSurfaceOpen: false });\n }\n }\n\n function renderMenus() {\n return [renderDataModeSwitcherMenu(), renderColumnCustomizerMenu()];\n }\n\n function showsColumnCustomizer(): boolean {\n return state().columnCustomizer && state().captionVisibility === 'visible';\n }\n\n function showsDataModeSwitcher(): boolean {\n return state().dataModeSwitcher && state().captionVisibility === 'visible';\n }\n\n function showsCaptionTrailing(): boolean {\n return (\n showsDataModeSwitcher() ||\n (showsColumnCustomizer() && !state().hideColumnCustomizerTrigger) ||\n state().captionTrailingPresent\n );\n }\n\n function renderBar() {\n if (state().captionVisibility !== 'visible') return null;\n return (\n <div class=\"ds-table__caption-bar ds-table__bar ds-control--md\">\n <div\n class={{\n 'ds-table__caption-content': true,\n 'ds-table__caption-content--trailing': showsCaptionTrailing(),\n }}\n >\n <div\n class={{\n 'ds-table__caption-leading': true,\n 'ds-table__caption-leading--toolbar': state().headerUsesToolbar,\n }}\n >\n <slot name=\"header\" onSlotchange={options.headerSlotChange} />\n {!state().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 {state().caption}\n </ds-text>\n ) : null}\n </div>\n {renderCaptionTrailing()}\n </div>\n <slot name=\"header-after\" />\n </div>\n );\n }\n\n function renderCaptionTrailing() {\n if (!showsCaptionTrailing()) return null;\n return (\n <div class=\"ds-table__caption-trailing\">\n {renderColumnCustomizerTrigger()}\n {showsColumnCustomizer() &&\n !state().hideColumnCustomizerTrigger &&\n showsDataModeSwitcher() ? (\n <ds-divider orientation=\"vertical\" length=\"var(--dimension-size-400)\" />\n ) : null}\n {renderDataModeSwitcherTrigger()}\n <slot name=\"caption-trailing\" />\n </div>\n );\n }\n\n function renderDataModeSwitcherTrigger() {\n if (!showsDataModeSwitcher()) return null;\n if (state().chromeLoading) {\n return <ds-skeleton variant=\"control\" controlSize=\"md\" width=\"var(--dimension-size-400)\" />;\n }\n return (\n <span class=\"ds-table__caption-mode-switcher\">\n <ds-tooltip label={state().dataModeSwitcherLabel} side=\"top\" size=\"sm\">\n <ds-button-unfilled\n hasBorder={!state().captionControlsBorderless}\n id={`${dataModeSwitcherElementId}-trigger`}\n variant=\"icon\"\n size=\"md\"\n icon=\"Ellipses\"\n aria-label={state().dataModeSwitcherLabel}\n hasMenu={true}\n expanded={menus().dataModeSwitcherOpen}\n surfaceOpen={menus().dataModeSwitcherSurfaceOpen}\n controls={dataModeSwitcherElementId}\n activeFill={false}\n pressScale={false}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n toggleDataModeSwitcher(event.detail.detail === 0);\n }}\n />\n </ds-tooltip>\n </span>\n );\n }\n\n function renderDataModeSwitcherMenu() {\n if (!showsDataModeSwitcher() || state().chromeLoading) return null;\n return (\n <ds-menu\n id={dataModeSwitcherElementId}\n open={menus().dataModeSwitcherOpen}\n anchorId={`${dataModeSwitcherElementId}-trigger`}\n align=\"end\"\n side=\"bottom\"\n menuLabel={state().dataModeMenuLabel}\n initialFocusVisible={menus().dataModeSwitcherInitialFocusVisible}\n items={tableDataModeMenuItems(state().dataMode, {\n infinite: state().infiniteModeLabel,\n pagination: state().paginationModeLabel,\n virtual: state().virtualModeLabel,\n })}\n onDsClose={() => closeDataModeSwitcher()}\n onDsAfterClose={() => {\n if (!menus().dataModeSwitcherOpen) options.change({ dataModeSwitcherSurfaceOpen: false });\n }}\n onDsSelect={event => handleDataModeSwitcherSelect(event.detail)}\n />\n );\n }\n\n function toggleDataModeSwitcher(fromKeyboard = false): void {\n if (menus().dataModeSwitcherOpen) closeDataModeSwitcher();\n else openDataModeSwitcher(fromKeyboard);\n }\n\n function openDataModeSwitcher(fromKeyboard = false): void {\n if (!showsDataModeSwitcher() || state().chromeLoading || menus().dataModeSwitcherOpen) return;\n options.change({\n columnCustomizerOpen: false,\n dataModeSwitcherInitialFocusVisible: fromKeyboard,\n dataModeSwitcherOpen: true,\n dataModeSwitcherSurfaceOpen: true,\n });\n }\n\n function closeDataModeSwitcher(): void {\n options.change({ dataModeSwitcherOpen: false });\n }\n\n function handleDataModeSwitcherSelect(item: MenuItemData): void {\n const dataMode = tableDataModeFromMenuItem(item);\n if (!dataMode) return;\n closeDataModeSwitcher();\n if (dataMode !== state().dataMode) options.dataModeChange({ dataMode });\n tasks.frame(() => {\n options\n .host()\n .querySelector<HTMLElement & { setFocus?: () => void }>(\n `#${CSS.escape(`${dataModeSwitcherElementId}-trigger`)}`\n )\n ?.setFocus?.();\n });\n }\n\n function renderColumnCustomizerTrigger() {\n if (state().hideColumnCustomizerTrigger) return null;\n if (!showsColumnCustomizer()) return null;\n return (\n <div\n class={{\n 'ds-table__caption-customizer': true,\n 'ds-table__caption-customizer--loading': state().chromeLoading,\n }}\n aria-hidden={state().chromeLoading ? 'true' : undefined}\n >\n <ds-tooltip label={state().captionCompact ? 'Customize' : ''} side=\"top\" size=\"sm\">\n <ds-button-unfilled\n hasBorder={!state().captionControlsBorderless}\n id={`${columnCustomizerElementId}-trigger`}\n variant={state().captionCompact ? 'icon' : 'icon-label'}\n size=\"md\"\n icon=\"Preferences\"\n label=\"Customize\"\n labelEmphasis={false}\n pressScale={false}\n aria-label=\"Customize table\"\n haspopup=\"menu\"\n expanded={menus().columnCustomizerOpen}\n surfaceOpen={menus().columnCustomizerSurfaceOpen}\n controls={columnCustomizerElementId}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n if (state().chromeLoading) return;\n toggleColumnCustomizer(event.detail.detail === 0);\n }}\n />\n </ds-tooltip>\n {state().chromeLoading ? (\n <ds-skeleton variant=\"control\" controlSize=\"md\" width=\"100%\" />\n ) : null}\n </div>\n );\n }\n\n function renderColumnCustomizerMenu() {\n if (!showsColumnCustomizer() || state().chromeLoading) return null;\n return (\n <ds-menu\n id={columnCustomizerElementId}\n open={menus().columnCustomizerOpen}\n anchorId={`${columnCustomizerElementId}-trigger`}\n align=\"end\"\n side=\"bottom\"\n menuLabel=\"Customize table\"\n initialFocusVisible={menus().columnCustomizerInitialFocusVisible}\n sections={[\n ...tableColumnCustomizerSections(\n state().columns,\n state().hiddenFieldIds,\n state().fieldOrder,\n state().pinnedFieldIds\n ),\n ...(state().customizeOptions.length\n ? [{ header: 'Options', items: state().customizeOptions }]\n : []),\n ]}\n onDsClose={() => closeColumnCustomizer()}\n onDsAfterClose={() => {\n if (!menus().columnCustomizerOpen) options.change({ columnCustomizerSurfaceOpen: false });\n }}\n onDsSelect={event => {\n if (state().customizeOptions.some(option => option.value === event.detail.value)) {\n options.customizeOptionChange(event.detail.value!);\n } else handleColumnCustomizerSelect(event.detail);\n }}\n onDsItemToggle={(event: CustomEvent<MenuItemToggleDetail>) =>\n handleColumnCustomizerAction(event.detail)\n }\n onDsReorder={event => handleColumnCustomizerReorder(event.detail)}\n />\n );\n }\n\n function toggleColumnCustomizer(fromKeyboard = false): void {\n if (menus().columnCustomizerOpen) closeColumnCustomizer();\n else openColumnCustomizer(fromKeyboard);\n }\n\n function openColumnCustomizer(fromKeyboard = false): void {\n if (!showsColumnCustomizer() || state().chromeLoading || menus().columnCustomizerOpen) return;\n options.change({\n dataModeSwitcherOpen: false,\n columnCustomizerInitialFocusVisible: fromKeyboard,\n columnCustomizerOpen: true,\n columnCustomizerSurfaceOpen: true,\n });\n }\n\n function closeColumnCustomizer(): void {\n options.change({ columnCustomizerOpen: false });\n }\n\n function emitColumnsConfigChange(\n hiddenFieldIds: string[],\n fieldOrder: string[],\n pinnedFieldIds: string[] = state().pinnedFieldIds\n ): void {\n options.fieldsChange(\n resolveTableFieldsConfiguration(state().columns, hiddenFieldIds, fieldOrder, pinnedFieldIds)\n );\n }\n\n function handleColumnCustomizerReorder(detail: MenuReorderDetail): void {\n const order = detail.items\n .filter(item => item.reorderable)\n .map(item => item.value)\n .filter((id): id is string => !!id);\n options.fieldsChange(\n reorderTableColumnPartition(\n state().columns,\n state().hiddenFieldIds,\n state().fieldOrder,\n state().pinnedFieldIds,\n order\n )\n );\n }\n\n function handleColumnCustomizerAction(detail: MenuItemToggleDetail): void {\n if (detail.action?.id === 'visibility') {\n handleColumnCustomizerSelect(detail.item);\n return;\n }\n if (detail.action?.id !== 'pin') return;\n const fieldId = detail.item.value;\n if (!fieldId) return;\n options.fieldsChange(\n toggleTableColumnPinned(\n state().columns,\n state().hiddenFieldIds,\n state().fieldOrder,\n state().pinnedFieldIds,\n fieldId\n )\n );\n }\n\n function handleColumnCustomizerSelect(item: MenuItemData): void {\n const fieldId = item.value;\n if (!fieldId || item.isInactive) return;\n emitColumnsConfigChange(\n toggleTableColumnHidden(state().columns, state().hiddenFieldIds, fieldId),\n state().fieldOrder\n );\n }\n return { disconnect, reconcile, renderMenus, renderBar };\n}\n","import type {\n TableCellAddress,\n TableCellRange,\n TableCellsChangeDetail,\n TableColumn,\n TableRow,\n} from './table-types';\nimport { parseLooseCalendarDate } from '../../utils/date-filter-value';\nimport { parseLooseClockTime, isClockTimeStepAligned } from '../../utils/clock-time';\n\n/** Snapshot-local index; arrow navigation and visible-cell range checks are constant time. */\nexport function tableGridModel(rows: TableRow[], columns: TableColumn[]) {\n let firstEditable: TableCellAddress | null = null;\n for (const row of rows) {\n const column = columns.find(column => tableEditable(row, column));\n if (column) {\n firstEditable = { rowId: row.id, columnId: column.id };\n break;\n }\n }\n return {\n firstEditable,\n rows,\n columns,\n rowIndices: new Map(rows.map((row, index) => [row.id, index])),\n columnIndices: new Map(columns.map((column, index) => [column.id, index])),\n };\n}\nexport type TableGridModel = ReturnType<typeof tableGridModel>;\n\n/** Scan only on navigation, not render/scroll; read-only cells are never focus stops. */\nexport function tableNextEditable(\n model: TableGridModel,\n address: TableCellAddress,\n key: string,\n backwards = false\n): TableCellAddress | null {\n let ri = model.rowIndices.get(address.rowId),\n ci = model.columnIndices.get(address.columnId);\n if (ri == null || ci == null) return null;\n let dr = 0,\n dc = 0;\n if (key === 'ArrowDown') dr = 1;\n else if (key === 'ArrowUp') dr = -1;\n else if (key === 'ArrowRight') dc = 1;\n else if (key === 'ArrowLeft') dc = -1;\n else if (key === 'Home') {\n ci = -1;\n dc = 1;\n } else if (key === 'End') {\n ci = model.columns.length;\n dc = -1;\n } else if (key === 'Tab') dc = backwards ? -1 : 1;\n else return null;\n while (true) {\n ri += dr;\n ci += dc;\n if (key === 'Tab') {\n if (ci < 0) {\n ri--;\n ci = model.columns.length - 1;\n } else if (ci >= model.columns.length) {\n ri++;\n ci = 0;\n }\n }\n const row = model.rows[ri],\n column = model.columns[ci];\n if (!row || !column) return null;\n if (tableEditable(row, column)) return { rowId: row.id, columnId: column.id };\n }\n}\n\nexport function tableRangeBounds(model: TableGridModel, range: TableCellRange | null) {\n if (!range) return null;\n const r1 = model.rowIndices.get(range.anchor.rowId),\n r2 = model.rowIndices.get(range.focus.rowId);\n const c1 = model.columnIndices.get(range.anchor.columnId),\n c2 = model.columnIndices.get(range.focus.columnId);\n if (r1 == null || r2 == null || c1 == null || c2 == null) return null;\n return {\n firstRow: Math.min(r1, r2),\n lastRow: Math.max(r1, r2),\n firstColumn: Math.min(c1, c2),\n lastColumn: Math.max(c1, c2),\n };\n}\n\nexport function tableEditable(row: TableRow, column: TableColumn): boolean {\n const value = row.cells[column.id];\n return (\n !!column.editor &&\n column.kind !== 'action' &&\n !row.disabled &&\n (value == null || typeof value === 'string' || typeof value === 'number')\n );\n}\n\nexport function tableEditValue(\n text: string,\n column: TableColumn\n): string | number | null | undefined {\n const editor = column.editor;\n if (!editor || (editor.required && !text.trim())) return undefined;\n if (editor.type === 'text' || editor.type === 'textarea')\n return (editor.minLength == null || !text || text.length >= editor.minLength) &&\n (editor.maxLength == null || text.length <= editor.maxLength)\n ? text\n : undefined;\n if (editor.type === 'select')\n return !text || editor.options.some(option => option.value === text && !option.isInactive)\n ? text\n : undefined;\n if (editor.type === 'date' || editor.type === 'time') {\n if (!text.trim()) return '';\n const value = editor.type === 'date' ? parseLooseCalendarDate(text) : parseLooseClockTime(text);\n return value &&\n (!editor.min || value >= editor.min) &&\n (!editor.max || value <= editor.max) &&\n (editor.type !== 'time' || isClockTimeStepAligned(value, editor.step ?? 60, editor.min))\n ? value\n : undefined;\n }\n if (editor.type !== 'number') return undefined;\n if (!text.trim()) return null;\n const value = Number(text);\n return Number.isFinite(value) &&\n (editor.min == null || value >= editor.min) &&\n (editor.max == null || value <= editor.max) &&\n (editor.step == null ||\n editor.step <= 0 ||\n Math.abs(\n (value - (editor.min ?? 0)) / editor.step -\n Math.round((value - (editor.min ?? 0)) / editor.step)\n ) < 1e-8)\n ? value\n : undefined;\n}\n\n/** Plain TSV only, bounded and atomic: never partially apply invalid or read-only rectangles. */\nexport function tablePasteChanges(\n model: TableGridModel,\n address: TableCellAddress,\n text: string\n): TableCellsChangeDetail['changes'] | null {\n if (text.length > 1_000_000) return null;\n const row = model.rowIndices.get(address.rowId),\n column = model.columnIndices.get(address.columnId);\n if (row == null || column == null) return null;\n const records = text\n .replace(/\\r\\n?/g, '\\n')\n .replace(/\\n$/, '')\n .split('\\n')\n .map(line => line.split('\\t'));\n const width = records[0].length;\n if (records.length * width > 10000 || records.some(record => record.length !== width))\n return null;\n const changes: TableCellsChangeDetail['changes'] = [];\n for (const [ri, record] of records.entries()) {\n for (const [ci, textValue] of record.entries()) {\n const targetRow = model.rows[row + ri],\n targetColumn = model.columns[column + ci];\n if (!targetRow || !targetColumn || !tableEditable(targetRow, targetColumn)) return null;\n const value = tableEditValue(textValue, targetColumn);\n if (value === undefined) return null;\n changes.push({ rowId: targetRow.id, columnId: targetColumn.id, value });\n }\n }\n return changes;\n}\n","import { h } from '@stencil/core';\nimport type { TableCellEditor } from './table-types';\n\n/** Shared controls own field behavior; the editing controller owns drafts and commits. */\nexport function renderTableCellEditor(\n editor: TableCellEditor,\n value: string,\n ariaLabel: string,\n anchor: HTMLElement | undefined,\n change: (value: string) => void\n) {\n const common = {\n value,\n ariaLabel,\n required: editor.required,\n size: 'md' as const,\n width: 'fill' as const,\n hasBorder: false,\n hasInteractionFill: false,\n onDsChange: (event: CustomEvent<string | string[]>) => {\n event.stopPropagation();\n if (typeof event.detail === 'string') change(event.detail);\n },\n };\n switch (editor.type) {\n case 'select':\n return (\n <ds-select\n {...common}\n options={editor.options}\n searchable={editor.searchable}\n anchor={anchor}\n hasFocusRing={false}\n />\n );\n case 'date':\n return <ds-input-date {...common} min={editor.min} max={editor.max} />;\n case 'time':\n return (\n <ds-input-time\n {...common}\n min={editor.min}\n max={editor.max}\n step={editor.step ?? 60}\n hourFormat={editor.hourFormat ?? '24'}\n />\n );\n case 'textarea':\n return (\n <ds-textarea\n {...common}\n rows={1}\n resize=\"none\"\n minLength={editor.minLength}\n maxLength={editor.maxLength}\n />\n );\n case 'number':\n return (\n <ds-input\n {...common}\n type=\"number\"\n min={editor.min}\n max={editor.max}\n step={editor.step}\n showStepper={editor.showStepper ?? true}\n />\n );\n default:\n return (\n <ds-input\n {...common}\n type=\"text\"\n minLength={editor.minLength}\n maxLength={editor.maxLength}\n />\n );\n }\n}\n","import { h } from '@stencil/core';\nimport { ConnectionTasks } from '../../utils/connection-tasks';\nimport {\n tableGridModel,\n tableRangeBounds,\n tableEditable,\n tableEditValue,\n tablePasteChanges,\n tableNextEditable,\n} from './table-grid-model';\nimport { renderTableCellEditor } from './table-cell-editor';\nimport type {\n TableCellAddress,\n TableCellRange,\n TableCellsChangeDetail,\n TableColumn,\n TableRow,\n} from './table-types';\n\nexport interface TableEditingState {\n activeCell: TableCellAddress | null;\n editingCell: TableCellAddress | null;\n}\n\ninterface TableEditingContext {\n rows: TableRow[];\n columns: TableColumn[];\n mode: 'table' | 'edit' | 'grid';\n loading: boolean;\n cellRange: TableCellRange | null;\n}\n\ninterface TableEditingControllerOptions {\n host: () => HTMLElement;\n state: () => TableEditingContext;\n interaction: () => TableEditingState;\n change: (patch: Partial<TableEditingState>) => void;\n rangeChange: (range: TableCellRange) => void;\n cellsChange: (detail: TableCellsChangeDetail) => void;\n announce: (message: string) => void;\n focusRow: (rowId: string) => void;\n revealRow: (rowId: string) => Promise<boolean>;\n findRow: (rowId: string) => HTMLElement | null;\n}\n\n/** Owns cell drafts, grid interaction and deferred focus; controlled data stays with Table. */\n// Keep JSX in functions so Stencil includes these component dependencies in its metadata.\nexport function createTableEditingController(options: TableEditingControllerOptions) {\n const tasks = new ConnectionTasks(() => options.host().isConnected);\n let editDraft = '';\n let gridModelCache: ReturnType<typeof tableGridModel> | undefined;\n\n function state() {\n return options.state();\n }\n\n function interaction() {\n return options.interaction();\n }\n\n function disconnect(): void {\n tasks.cancel();\n editDraft = '';\n options.change({ editingCell: null });\n }\n\n function gridEnabled(): boolean {\n return state().mode === 'grid';\n }\n function enabled(): boolean {\n return state().mode !== 'table';\n }\n function gridModel() {\n const { rows, columns } = state();\n if (!gridModelCache || gridModelCache.rows !== rows || gridModelCache.columns !== columns) {\n gridModelCache = tableGridModel(rows, columns);\n }\n return gridModelCache;\n }\n function gridAddress(event: Event): TableCellAddress | null {\n if (\n !gridEnabled() ||\n !(event.target instanceof HTMLElement) ||\n !event.target.matches('td[role=\"gridcell\"][data-cell-editable=\"true\"]')\n )\n return null;\n const rowId = event.target.closest<HTMLElement>('[data-row-id]')?.dataset.rowId;\n const columnId = event.target.dataset.columnId;\n return rowId && columnId ? { rowId, columnId } : null;\n }\n function selectCell(address: TableCellAddress, extend = false): void {\n if (!isEditableAddress(address)) return;\n options.change({ activeCell: address });\n options.rangeChange({\n anchor: extend ? (state().cellRange?.anchor ?? address) : address,\n focus: address,\n });\n }\n async function focusCell(address: TableCellAddress): Promise<void> {\n if (!isEditableAddress(address)) return;\n options.change({ activeCell: address });\n options.focusRow(address.rowId);\n const focusAfterReveal = tasks.guard(() => {\n tasks.frame(() => {\n if (\n interaction().activeCell !== address ||\n interaction().editingCell ||\n !isEditableAddress(address)\n )\n return;\n const cell = options\n .findRow(address.rowId)\n ?.querySelector<HTMLElement>(`[data-column-id=\"${CSS.escape(address.columnId)}\"]`);\n if (gridEnabled()) cell?.focus();\n else\n void cell\n ?.querySelector<HTMLDsButtonUnfilledElement>(\n '.ds-table__edit-trigger ds-button-unfilled'\n )\n ?.setFocus();\n });\n });\n await options.revealRow(address.rowId);\n focusAfterReveal();\n }\n function isEditableAddress(address: TableCellAddress): boolean {\n const model = gridModel();\n const row = model.rows[model.rowIndices.get(address.rowId) ?? -1];\n const column = model.columns[model.columnIndices.get(address.columnId) ?? -1];\n return enabled() && !state().loading && !!row && !!column && tableEditable(row, column);\n }\n function beginCellEdit(address: TableCellAddress, initial?: string): void {\n const model = gridModel();\n const row = model.rows[model.rowIndices.get(address.rowId) ?? -1];\n const column = model.columns[model.columnIndices.get(address.columnId) ?? -1];\n if (!enabled() || state().loading || !row || !column || !tableEditable(row, column)) return;\n editDraft = initial ?? String(row.cells[column.id] ?? '');\n options.change({ activeCell: address, editingCell: address });\n options.focusRow(address.rowId);\n tasks.frame(async () => {\n const control = options\n .host()\n .querySelector<HTMLDsInputElement>('.ds-table__cell-editor > *');\n const focus = tasks.guard(() => {\n if (interaction().editingCell !== address || !control?.isConnected) return;\n void control.setFocus().then(\n tasks.guard(() => {\n if (interaction().editingCell !== address || !control.isConnected) return;\n const input = control.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n 'input,textarea'\n );\n if (initial == null && input?.type !== 'number') input?.select();\n })\n );\n });\n await control?.componentOnReady?.();\n focus();\n });\n }\n function handleKeyDown(event: KeyboardEvent): void {\n const address = gridAddress(event);\n if (!address || event.altKey || event.metaKey || event.ctrlKey || event.isComposing) return;\n if (event.key === 'Enter' || event.key === 'F2' || event.key.length === 1) {\n event.preventDefault();\n beginCellEdit(address, event.key.length === 1 ? event.key : undefined);\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft', 'Home', 'End'].includes(event.key))\n return;\n event.preventDefault();\n const next = tableNextEditable(gridModel(), address, event.key);\n if (!next) return;\n selectCell(next, event.shiftKey);\n void focusCell(next);\n }\n function handleClipboard(event: ClipboardEvent): void {\n const address = gridAddress(event);\n if (!address || !event.clipboardData) return;\n if (event.type === 'paste') {\n event.preventDefault();\n if (state().loading) return;\n const changes = tablePasteChanges(\n gridModel(),\n address,\n event.clipboardData.getData('text/plain')\n );\n if (!changes) {\n options.announce(\n 'Paste rejected. Use a rectangular set of valid values in editable cells.'\n );\n return;\n }\n options.cellsChange({ changes, reason: 'paste' });\n options.announce(`${changes.length} cell changes proposed.`);\n } else {\n const model = gridModel();\n const bounds = tableRangeBounds(\n model,\n state().cellRange ?? { anchor: address, focus: address }\n );\n if (\n !bounds ||\n (bounds.lastRow - bounds.firstRow + 1) * (bounds.lastColumn - bounds.firstColumn + 1) >\n 10000\n )\n return;\n const text = model.rows\n .slice(bounds.firstRow, bounds.lastRow + 1)\n .map(row =>\n model.columns\n .slice(bounds.firstColumn, bounds.lastColumn + 1)\n .map(column => {\n if (!tableEditable(row, column)) return '';\n const value = row.cells[column.id];\n return typeof value === 'object' ? '' : String(value ?? '').replace(/[\\t\\r\\n]/g, ' ');\n })\n .join('\\t')\n )\n .join('\\n');\n event.preventDefault();\n event.clipboardData.setData('text/plain', text);\n }\n }\n function renderEditor(row: TableRow, column: TableColumn) {\n const { editingCell } = interaction();\n if (\n editingCell?.rowId !== row.id ||\n editingCell.columnId !== column.id ||\n !tableEditable(row, column) ||\n state().loading\n )\n return null;\n const address = editingCell;\n const editor = column.editor!;\n const cell = options\n .findRow(row.id)\n ?.querySelector<HTMLElement>(`[data-column-id=\"${CSS.escape(column.id)}\"]`);\n const commit = (text: string, next = address) => {\n if (interaction().editingCell !== address || !isEditableAddress(address)) return false;\n const value = tableEditValue(text, column);\n if (value === undefined) {\n options.announce(`Enter a valid value for ${column.label}.`);\n return false;\n }\n options.change({ editingCell: null });\n options.cellsChange({ changes: [{ ...address, value }], reason: 'edit' });\n void focusCell(next);\n return true;\n };\n return (\n <div\n class=\"ds-table__cell-editor\"\n key={`${row.id}:${column.id}`}\n onClick={event => event.stopPropagation()}\n onFocusout={event => {\n const wrapper = event.currentTarget as HTMLElement;\n tasks.frame(() => {\n const root = wrapper.getRootNode() as Document | ShadowRoot;\n if (interaction().editingCell === address && !wrapper.contains(root.activeElement))\n options.change({ editingCell: null });\n });\n }}\n onKeyDown={event => {\n event.stopPropagation();\n if (event.isComposing || event.defaultPrevented) return;\n const wrapper = event.currentTarget as HTMLElement;\n if (event.key === 'Escape') {\n event.preventDefault();\n options.change({ editingCell: null });\n void focusCell(address);\n return;\n }\n if (event.key !== 'Enter' && event.key !== 'Tab') return;\n // Picker keyboard interactions belong to the picker, including its internal Tab stops.\n if ((event.target as HTMLElement).closest('[popover]')) return;\n if (\n event.key === 'Enter' &&\n editor.type === 'textarea' &&\n !event.ctrlKey &&\n !event.metaKey\n )\n return;\n event.preventDefault();\n const input =\n editor.type === 'select'\n ? null\n : wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>('input,textarea');\n // Unconstrained numeric columns retain decimal support; explicit steps use the\n // shared control's native step validity as well as the paste validator.\n if (\n input &&\n !input.checkValidity() &&\n !(editor.type === 'number' && editor.step == null && input.validity.stepMismatch)\n ) {\n input.reportValidity();\n return;\n }\n const next =\n event.key === 'Tab'\n ? (tableNextEditable(gridModel(), address, 'Tab', event.shiftKey) ?? address)\n : address;\n commit(input?.value ?? editDraft, next);\n }}\n >\n {renderTableCellEditor(\n editor,\n editDraft,\n `Edit ${column.label} for ${row.selectionLabel ?? row.id}`,\n cell ?? undefined,\n value => {\n editDraft = value;\n // A single-select choice is a complete edit; let its selection handler finish first.\n if (editor.type === 'select') tasks.microtask(() => commit(value));\n }\n )}\n </div>\n );\n }\n\n function renderEditTrigger(row: TableRow, column: TableColumn) {\n const { mode, loading } = state();\n const { editingCell } = interaction();\n if (\n mode !== 'edit' ||\n !tableEditable(row, column) ||\n loading ||\n (editingCell?.rowId === row.id && editingCell.columnId === column.id)\n )\n return null;\n return (\n <span class=\"ds-table__edit-trigger\">\n <ds-button-unfilled\n variant=\"icon\"\n icon=\"Pencil\"\n size=\"sm\"\n aria-label={`Edit ${column.label} for ${row.selectionLabel ?? row.id}`}\n pressScale={false}\n onDsClick={event => {\n event.stopPropagation();\n beginCellEdit({ rowId: row.id, columnId: column.id });\n }}\n />\n </span>\n );\n }\n\n function cellAttributes(row: TableRow, column: TableColumn): Record<string, unknown> {\n const { mode, loading, cellRange } = state();\n const { activeCell, editingCell } = interaction();\n const model = gridModel();\n const bounds = tableRangeBounds(model, cellRange);\n const ri = model.rowIndices.get(row.id)!,\n ci = model.columnIndices.get(column.id)!;\n const editable = tableEditable(row, column) && !loading;\n const editing = editable && editingCell?.rowId === row.id && editingCell.columnId === column.id;\n const active = activeCell && isEditableAddress(activeCell) ? activeCell : model.firstEditable;\n if (mode !== 'grid')\n return {\n 'data-cell-editable': String(editable),\n 'data-cell-editing': String(editing),\n 'aria-disabled': editable ? undefined : 'true',\n };\n return {\n role: 'gridcell',\n tabIndex: editable\n ? active?.rowId === row.id && active.columnId === column.id\n ? 0\n : -1\n : undefined,\n 'data-cell-editable': String(editable),\n 'data-cell-editing': String(editing),\n 'aria-readonly': String(!editable),\n 'aria-disabled': editable ? undefined : 'true',\n 'aria-selected': String(\n editable &&\n !!bounds &&\n ri >= bounds.firstRow &&\n ri <= bounds.lastRow &&\n ci >= bounds.firstColumn &&\n ci <= bounds.lastColumn\n ),\n onClick: (event: MouseEvent) => {\n if (\n event.target !== event.currentTarget &&\n (event.target as HTMLElement).closest(\n 'button,a,input,textarea,ds-button-unfilled,.ds-table__cell-editor'\n )\n )\n return;\n event.stopPropagation();\n if (!editable) return;\n selectCell({ rowId: row.id, columnId: column.id }, event.shiftKey);\n (event.currentTarget as HTMLElement).focus();\n if (!event.shiftKey) beginCellEdit({ rowId: row.id, columnId: column.id });\n },\n };\n }\n return {\n get gridEnabled() {\n return gridEnabled();\n },\n get enabled() {\n return enabled();\n },\n disconnect,\n handleKeyDown,\n handleClipboard,\n renderEditor,\n renderEditTrigger,\n cellAttributes,\n };\n}\n","/** Marks text tracks that may present the table-owned truncation tooltip. */\nexport const TABLE_TRUNCATE_ATTR = 'data-table-truncate';\n\nfunction isValidTruncateTrack(track: HTMLElement): boolean {\n return !track.closest('.ds-table__row--disabled, thead, .ds-table__header-row');\n}\n\n/** Resolve the overflowing text track under a pointer or focus target. */\nexport function resolveTableTruncateTrack(target: EventTarget | null): HTMLElement | null {\n const element =\n target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n if (!element) return null;\n\n const fromAncestor = element.closest<HTMLElement>(`[${TABLE_TRUNCATE_ATTR}]`);\n if (fromAncestor && isValidTruncateTrack(fromAncestor)) return fromAncestor;\n\n const link = element.closest('a.ds-table__cell-link');\n const nested = link?.querySelector<HTMLElement>(`[${TABLE_TRUNCATE_ATTR}]`);\n if (nested && isValidTruncateTrack(nested)) return nested;\n return null;\n}\n\nexport function tableTruncateLabel(track: HTMLElement): string {\n return (track.textContent ?? '').replace(/\\s+/g, ' ').trim();\n}\n","import {\n isTableCellAction,\n isTableCellBlank,\n isTableCellEmpty,\n isTableCellIcon,\n isTableCellIconText,\n isTableCellScoreText,\n isTableCellImage,\n isTableCellPrimaryText,\n isTableCellTag,\n isTableCellTags,\n isTableCellText,\n} from './table-model';\nimport type {\n TableCellAction,\n TableCellBlank,\n TableCellEmpty,\n TableCellIcon,\n TableCellImage,\n TableCellImageTracks,\n TableCellTag,\n TableCellTags,\n TableCellTagVariant,\n TableCellTextRun,\n TableCellTextTrack,\n TableCellValue,\n TableCellLinkTarget,\n TableCellLineClamp,\n TableCellMaxLines,\n TableColumn,\n} from './table-types';\nimport type { IconColor } from '../Icon/Icon';\nimport type { SafetyScoreLevel } from '../Score/score-types';\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 lineClamp: TableCellLineClamp;\n }\n | {\n kind: 'score-text';\n cellType: 'score-text';\n score: string | number;\n scoreLevel?: SafetyScoreLevel;\n scoreLabel: string;\n scoreLoading: boolean;\n value: ResolvedTableCellText;\n variant: 'single' | 'multi' | 'triple';\n wraps: boolean;\n lineClamp: TableCellLineClamp;\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: 'tags';\n cellType: 'tags';\n value: TableCellTags;\n tracks: number;\n variant: `${number}-track` | 'inline';\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 lineClamp: TableCellLineClamp;\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(tracks: TableCellImageTracks): 'single' | 'multi' | 'triple' {\n return tracks === 3 ? 'triple' : tracks === 2 ? 'multi' : 'single';\n}\n\n/** Normalize the declared line count used by wrapping multiple-Tag cells. */\nexport function resolveTableCellTagsTracks(tracks: number): number {\n return Number.isFinite(tracks) && tracks > 0 ? Math.floor(tracks) : 1;\n}\n\n/** Token-backed content height for any named number of body-row tracks. */\nexport function tableCellTrackStackBlockSize(tracks: number): string {\n const count = resolveTableCellTagsTracks(tracks);\n return `calc(${count} * var(--_table-cell-track-min-block-size))`;\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 const run: TableCellTextRun = { text };\n if (typeof item === 'object' && item !== null) {\n if ('color' in item && item.color) run.color = item.color;\n if ('help' in item && typeof item.help === 'string' && item.help.trim()) {\n run.help = item.help.trim();\n }\n }\n runs.push(run);\n }\n return runs.length ? runs : undefined;\n}\n\n/** Map wrap / maxLines onto wrap-to-track geometry and a line clamp. */\nexport function resolveTableCellTextOverflow(\n source: { wrap?: boolean; maxLines?: TableCellMaxLines },\n column: TableColumn\n): { wraps: boolean; lineClamp: TableCellLineClamp } {\n const wrap = source.wrap ?? column.wrap ?? false;\n const maxLines = source.maxLines ?? (source.wrap === true ? undefined : column.maxLines);\n if (maxLines != null) {\n return { wraps: maxLines > 1, lineClamp: maxLines };\n }\n if (wrap) return { wraps: true, lineClamp: 'none' };\n return { wraps: false, lineClamp: 1 };\n}\n\n/** ds-text overflow props for a resolved clamp. */\nexport function tableCellTextOverflowProps(lineClamp: TableCellLineClamp): {\n lineTruncation: TableCellLineClamp;\n wrap: 'wrap' | 'nowrap';\n} {\n if (lineClamp === 'none') return { lineTruncation: 'none', wrap: 'wrap' };\n if (lineClamp === 1) return { lineTruncation: 1, wrap: 'nowrap' };\n return { lineTruncation: lineClamp, wrap: 'wrap' };\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 maxLines?: TableCellMaxLines;\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 lineClamp: TableCellLineClamp;\n} {\n const secondary = normalizeTableCellTextTrack(source.secondary);\n const tertiary = options.allowTertiary ? normalizeTableCellTextTrack(source.tertiary) : 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 const overflow = resolveTableCellTextOverflow(source, column);\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: overflow.wraps,\n lineClamp: overflow.lineClamp,\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 lineClamp: text.lineClamp,\n };\n }\n if (isTableCellScoreText(value)) {\n const text = resolveTextPresentation(value, column, {\n primaryText: false,\n allowTertiary: true,\n });\n return {\n kind: 'score-text',\n cellType: 'score-text',\n score: value.score,\n ...(value.scoreLevel ? { scoreLevel: value.scoreLevel } : {}),\n scoreLabel: value.scoreLabel?.trim() || 'Safety score',\n scoreLoading: value.scoreLoading === true,\n value: text.value,\n variant: text.variant === 'primary-pair' ? 'single' : text.variant,\n wraps: text.wraps,\n lineClamp: text.lineClamp,\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 if (isTableCellTags(value)) {\n const inline = value.variant === 'inline';\n const tracks = inline ? (value.text?.trim() ? 2 : 1) : resolveTableCellTagsTracks(value.tracks);\n return {\n kind: 'tags',\n cellType: 'tags',\n value: inline ? { ...value, items: value.items.slice(0, 3) as typeof value.items } : value,\n tracks,\n variant: inline ? 'inline' : `${tracks}-track`,\n };\n }\n\n const primaryText = isTableCellPrimaryText(value);\n const source =\n 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(isTableCellText(value) ? value : source, column, {\n primaryText,\n 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 lineClamp: text.lineClamp,\n };\n}\n","export interface TableHighlightSegment {\n text: string;\n match: boolean;\n}\n\nexport type TableHighlightMatcher = (value: string | number) => TableHighlightSegment[];\n\nexport const TABLE_NO_HIGHLIGHT_MATCHER: TableHighlightMatcher = value => [\n { text: String(value), match: false },\n];\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * Creates one literal, case-insensitive matcher for table-owned text tracks.\n * Longer terms win when supplied terms overlap.\n */\nexport function createTableHighlightMatcher(terms: string[]): TableHighlightMatcher {\n const normalizedTerms = Array.from(\n new Map(\n terms\n .map(term => term.trim())\n .filter(Boolean)\n .map(term => [term.toLocaleLowerCase(), term])\n ).values()\n ).sort((left, right) => right.length - left.length);\n\n if (!normalizedTerms.length) {\n return TABLE_NO_HIGHLIGHT_MATCHER;\n }\n\n const expression = new RegExp(normalizedTerms.map(escapeRegExp).join('|'), 'giu');\n\n return value => {\n const text = String(value);\n const segments: TableHighlightSegment[] = [];\n let cursor = 0;\n\n expression.lastIndex = 0;\n for (const match of text.matchAll(expression)) {\n const index = match.index;\n if (index > cursor) segments.push({ text: text.slice(cursor, index), match: false });\n segments.push({ text: match[0], match: true });\n cursor = index + match[0].length;\n }\n\n if (!segments.length) return [{ text, match: false }];\n if (cursor < text.length) segments.push({ text: text.slice(cursor), match: false });\n return segments;\n };\n}\n","import { h } from '@stencil/core';\nimport {\n resolveTableCellPresentation,\n tableCellTrackStackBlockSize,\n tableCellTextOverflowProps,\n type TableCellPresentation,\n} from './table-cell-model';\nimport {\n isRenderableTableActionMenu,\n isTableCellActionMenu,\n tableActionTriggerId,\n} from './table-action-menu';\nimport { tableRowSelectionLabel } from './table-model';\nimport type { TableRenderModel } from './table-render-model';\nimport { TABLE_NO_HIGHLIGHT_MATCHER, type TableHighlightMatcher } from './table-highlight';\nimport type { TableCellActionDetail, TableCellTextRun, TableColumn, TableRow } from './table-types';\nimport { resolveSafeUrl } from '../../utils/safe-url';\nimport type { TableColumnLayout, TableSpanCell } from './table-structure';\n\nexport interface TableRowViewOptions {\n pins?: Map<string, TableColumnLayout>;\n spans?: Map<string, TableSpanCell>;\n headerId?: (id: string) => string;\n responsiveCards?: boolean;\n cellAttributes?: (row: TableRow, column: TableColumn) => Record<string, unknown>;\n renderEditor?: (row: TableRow, column: TableColumn) => unknown;\n renderEditTrigger?: (row: TableRow, column: TableColumn) => unknown;\n grid?: boolean;\n row: TableRow;\n model: TableRenderModel;\n visibleColumns: TableColumn[];\n emptyCellLabel: string;\n actionMenuElementId: string;\n actionMenu: { rowId: string; columnId: string } | null;\n actionMenuSurface?: { rowId: string; columnId: string } | null;\n highlightMatcher: TableHighlightMatcher;\n highlightFieldIds: string[];\n surfaceOpenRowId?: string;\n ariaRowIndex?: number;\n variableVirtualSize?: boolean;\n intrinsicBlockSize?: number;\n rowKey?: string;\n renderSelectionControl: (\n label: string,\n checked: boolean,\n indeterminate: boolean,\n disabled: boolean,\n onActivate: () => void\n ) => unknown;\n renderStickyEdge: (sticky: TableColumn['sticky'], shadow?: boolean) => unknown;\n onRowActivate: (row: TableRow, event: Event) => void;\n onRowKeyDown: (row: TableRow, event: KeyboardEvent) => void;\n onRowSelection: (row: TableRow) => void;\n onCellAction: (detail: TableCellActionDetail) => void;\n onActionMenuToggle: (row: TableRow, column: TableColumn, event: MouseEvent) => void;\n}\n\n/** Render one semantic body row and the complete declarative table-cell vocabulary. */\nexport function renderTableRow({\n pins,\n spans,\n headerId,\n responsiveCards,\n cellAttributes,\n renderEditor,\n renderEditTrigger,\n grid,\n row,\n model,\n visibleColumns,\n emptyCellLabel,\n actionMenuElementId,\n actionMenu,\n actionMenuSurface,\n highlightMatcher,\n highlightFieldIds,\n surfaceOpenRowId,\n ariaRowIndex,\n variableVirtualSize = false,\n intrinsicBlockSize,\n rowKey = row.id,\n renderSelectionControl,\n renderStickyEdge,\n onRowActivate,\n onRowKeyDown,\n onRowSelection,\n onCellAction,\n onActionMenuToggle,\n}: TableRowViewOptions) {\n const selected = model.selectedRowIds.has(row.id);\n const surfaceOpen = row.id === surfaceOpenRowId && !!row.interactive && !row.disabled;\n const rowSelectable = row.selectable !== false && !row.disabled;\n const rowInteractive =\n !grid &&\n !row.disabled &&\n (model.selectable && model.selectedRowIds.size > 0 ? rowSelectable : !!row.interactive);\n const beforeSpacer =\n model.elasticSpacerIndex == null\n ? visibleColumns\n : visibleColumns.slice(0, model.elasticSpacerIndex);\n const afterSpacer =\n model.elasticSpacerIndex == null ? [] : visibleColumns.slice(model.elasticSpacerIndex);\n const cardActions = responsiveCards\n ? visibleColumns.filter(column => column.kind === 'action')\n : [];\n const firstDataColumn = visibleColumns.find(column => column.kind !== 'action');\n const renderColumn = (column: TableColumn) => {\n const span = spans?.get(column.id);\n if (span === 'covered') return null;\n const lastPin = pins?.get(span?.columnIds[span.columnIds.length - 1] ?? column.id);\n const firstPin = pins?.get(column.id);\n const layout = firstPin\n ? {\n style: column.sticky === 'end' ? (lastPin?.style ?? firstPin.style) : firstPin.style,\n edge: column.sticky === 'end' ? firstPin.edge : lastPin?.edge,\n }\n : undefined;\n return renderTableCell({\n layout,\n afterCoveredColumn:\n !!spans && spans.get(visibleColumns[visibleColumns.indexOf(column) - 1]?.id) === 'covered',\n span: spans?.get(column.id),\n headerId,\n responsiveCards,\n cardActionIndex: cardActions.indexOf(column),\n cardActionDivider: model.selectable && column === cardActions[0],\n firstDataColumn: column === firstDataColumn,\n attributes: cellAttributes?.(row, column),\n editor: renderEditor?.(row, column),\n editTrigger: renderEditTrigger?.(row, column),\n row,\n column,\n selected,\n surfaceOpen,\n emptyCellLabel,\n actionMenuElementId,\n actionMenu,\n actionMenuSurface,\n highlightMatcher,\n highlightFieldIds,\n renderStickyEdge,\n onCellAction,\n onActionMenuToggle,\n });\n };\n\n return (\n <tr\n key={rowKey}\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': rowInteractive,\n 'ds-focus-ring': rowInteractive,\n }}\n data-row-id={row.id}\n data-responsive-card={responsiveCards ? 'true' : undefined}\n data-virtual-id={ariaRowIndex != null ? `row:${row.id}` : undefined}\n data-virtual-pool-key={ariaRowIndex != null ? rowKey : undefined}\n data-virtual-measure={ariaRowIndex != null && variableVirtualSize ? 'true' : undefined}\n data-selected={selected ? 'true' : undefined}\n data-surface-open={surfaceOpen ? 'true' : undefined}\n style={{\n ...(intrinsicBlockSize != null\n ? { '--_table-row-intrinsic-block-size': `${intrinsicBlockSize}px` }\n : {}),\n ...(responsiveCards\n ? {\n '--_table-card-action-count': String(cardActions.length),\n '--_table-card-control-count': String(cardActions.length + Number(model.selectable)),\n }\n : {}),\n }}\n aria-rowindex={ariaRowIndex}\n aria-disabled={row.disabled ? 'true' : undefined}\n tabIndex={rowInteractive ? 0 : undefined}\n onClick={event => onRowActivate(row, event)}\n onKeyDown={event => onRowKeyDown(row, event)}\n >\n {model.selectable && (\n <td\n 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 'ds-interaction-fill--surface-open': surfaceOpen,\n }}\n >\n {renderSelectionControl(\n `${selected ? 'Deselect' : 'Select'} ${tableRowSelectionLabel(row, visibleColumns)}`,\n selected,\n false,\n !rowSelectable,\n () => onRowSelection(row)\n )}\n {renderStickyEdge(\n 'start',\n !pins || ![...pins.values()].some(pin => pin.edge === 'start')\n )}\n </td>\n )}\n {beforeSpacer.map(renderColumn)}\n {model.elasticSpacerIndex != null && (\n <td\n class={{\n 'ds-table__cell': true,\n 'ds-table__elastic-spacer-cell': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n 'ds-interaction-fill--surface-open': surfaceOpen,\n }}\n aria-hidden=\"true\"\n role=\"presentation\"\n data-elastic-spacer=\"true\"\n />\n )}\n {afterSpacer.map(renderColumn)}\n </tr>\n );\n}\n\ninterface TableCellViewOptions {\n cardActionIndex?: number;\n cardActionDivider?: boolean;\n firstDataColumn?: boolean;\n afterCoveredColumn?: boolean;\n layout?: TableColumnLayout;\n span?: TableSpanCell;\n headerId?: (id: string) => string;\n responsiveCards?: boolean;\n attributes?: Record<string, unknown>;\n editor?: unknown;\n editTrigger?: unknown;\n row: TableRow;\n column: TableColumn;\n selected: boolean;\n surfaceOpen: boolean;\n emptyCellLabel: string;\n actionMenuElementId: string;\n actionMenu: { rowId: string; columnId: string } | null;\n actionMenuSurface?: { rowId: string; columnId: string } | null;\n highlightMatcher: TableHighlightMatcher;\n highlightFieldIds: string[];\n renderStickyEdge: (sticky: TableColumn['sticky'], shadow?: boolean) => unknown;\n onCellAction: (detail: TableCellActionDetail) => void;\n onActionMenuToggle: (row: TableRow, column: TableColumn, event: MouseEvent) => void;\n}\n\nfunction renderTableCell(options: TableCellViewOptions) {\n const { row, column, selected, surfaceOpen, renderStickyEdge } = options;\n const align = column.align ?? 'start';\n const decoration = row.cellPresentation?.[column.id];\n const span = options.span === 'covered' ? undefined : options.span;\n const cell = resolveTableCellPresentation(row.cells[column.id], column);\n const tagCell = cell.kind === 'tag';\n const tagsCell = cell.kind === 'tags';\n const iconCell = cell.kind === 'icon';\n const iconTextCell = cell.kind === 'icon-text';\n const scoreTextCell = cell.kind === 'score-text';\n const imageCell = cell.kind === 'image';\n const actionCell = cell.kind === 'action';\n const actionMenuCell = actionCell && isRenderableTableActionMenu(cell.value);\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 tagsVariant = tagsCell ? cell.variant : undefined;\n const textVariant = textCell ? cell.variant : undefined;\n const imageVariant = imageCell ? cell.variant : undefined;\n const iconTextVariant = iconTextCell ? cell.variant : undefined;\n const scoreTextVariant = scoreTextCell ? cell.variant : undefined;\n const wraps = (textCell || iconTextCell || scoreTextCell) && cell.wraps;\n\n return (\n <td\n {...options.attributes}\n colSpan={span?.colSpan}\n rowSpan={span?.rowSpan}\n headers={\n options.headerId\n ? (span?.columnIds ?? [column.id]).map(options.headerId).join(' ')\n : undefined\n }\n style={{\n ...options.layout?.style,\n ...(options.cardActionIndex != null && options.cardActionIndex >= 0\n ? { '--_table-card-action-index': String(options.cardActionIndex) }\n : {}),\n ...(span ? { gridColumn: `${span.columnStart} / span ${span.colSpan}` } : {}),\n }}\n data-vertical-align={decoration?.verticalAlign}\n data-cell-highlight={decoration?.highlight?.intent}\n data-cell-borders={decoration?.borders?.join(' ')}\n key={`${row.id}:${column.id}`}\n class={{\n 'ds-table__cell': true,\n 'ds-table__cell--card-action': column.kind === 'action',\n 'ds-table__cell--card-first': !!options.firstDataColumn,\n 'ds-table__cell--after-covered': !!options.afterCoveredColumn,\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--tag': tagCell,\n [`ds-table__cell--tag-${tagVariant}`]: tagCell,\n 'ds-table__cell--tags': tagsCell,\n [`ds-table__cell--tags-${tagsVariant}`]: tagsCell,\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--icon-text-wrap': iconTextCell && wraps,\n 'ds-table__cell--score-text': scoreTextCell,\n [`ds-table__cell--score-text-${scoreTextVariant}`]: scoreTextCell,\n 'ds-table__cell--score-text-wrap': scoreTextCell && wraps,\n 'ds-table__cell--image': imageCell,\n [`ds-table__cell--image-${imageVariant}`]: imageCell,\n 'ds-table__cell--action': actionCell,\n 'ds-table__cell--action-menu': actionMenuCell,\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--text-wrap': textCell && wraps,\n 'ds-table__cell--empty': emptyCell,\n 'ds-table__cell--blank': blankCell,\n 'ds-table__cell--sticky-start': !!options.layout && column.sticky === 'start',\n 'ds-table__cell--sticky-end': !!options.layout && column.sticky === 'end',\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--grouped': true,\n 'ds-interaction-fill--selected': selected,\n 'ds-interaction-fill--surface-open': surfaceOpen,\n }}\n data-column-id={column.id}\n data-cell-type={cell.cellType}\n data-cell-variant={\n tagVariant ??\n tagsVariant ??\n textVariant ??\n imageVariant ??\n iconTextVariant ??\n scoreTextVariant\n }\n data-cell-tracks={tagsCell ? cell.tracks : undefined}\n >\n {decoration?.highlight && <span class=\"ds-table__cell-highlight\" aria-hidden=\"true\" />}\n {options.responsiveCards && column.kind !== 'action' && !options.firstDataColumn && (\n <span class=\"ds-table__card-field-divider\" aria-hidden=\"true\" />\n )}\n {options.responsiveCards && options.cardActionDivider && (\n <span class=\"ds-table__card-action-divider\" aria-hidden=\"true\" />\n )}\n {options.responsiveCards && column.kind !== 'action' && (\n <ds-text\n class=\"ds-table__card-label ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n {column.label || column.accessibleLabel}\n </ds-text>\n )}\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {options.editor ?? renderTableCellValue(cell, options)}\n {!options.editor &&\n options.attributes?.role === 'gridcell' &&\n column.editor?.type === 'select' && (\n <ds-icon\n class=\"ds-table__select-indicator\"\n name=\"ChevronDown\"\n size=\"md\"\n color=\"secondary\"\n />\n )}\n {decoration?.flag && (\n <span class=\"ds-table__cell-flag\">\n <ds-icon\n name={decoration.flag.icon ?? 'Flag'}\n size=\"md\"\n color=\"secondary\"\n label={decoration.flag.label}\n />\n </span>\n )}\n {decoration?.highlight && (\n <span class=\"ds-visually-hidden\">{decoration.highlight.label}</span>\n )}\n </span>\n {options.editTrigger}\n {renderStickyEdge(options.layout ? column.sticky : undefined, !!options.layout?.edge)}\n </td>\n );\n}\n\nfunction renderTableCellValue(cell: TableCellPresentation, options: TableCellViewOptions) {\n const {\n row,\n column,\n emptyCellLabel,\n actionMenuElementId,\n actionMenu,\n actionMenuSurface,\n onCellAction,\n onActionMenuToggle,\n } = options;\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\">{emptyCellLabel}</span>\n </ds-text>\n );\n }\n\n if (cell.kind === 'icon') {\n const value = cell.value;\n return (\n <ds-icon name={value.icon} size=\"md\" color={value.color ?? 'secondary'} label={value.label} />\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 {renderTextCopy(cell, options)}\n </span>\n );\n }\n\n if (cell.kind === 'score-text') {\n return (\n <span class=\"ds-table__cell-score-text\">\n {renderTextCopy(cell, options)}\n <span class=\"ds-table__cell-score-text-score\">\n <ds-score\n size=\"sm\"\n value={cell.score}\n level={cell.scoreLevel}\n label={cell.scoreLabel}\n isLoading={cell.scoreLoading}\n />\n </span>\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\n class=\"ds-table__cell-image-content\"\n src={value.src}\n alt={value.alt}\n loading=\"lazy\"\n />\n ) : (\n <span class=\"ds-table__cell-image-placeholder\" role=\"img\" aria-label={value.alt} />\n )}\n </span>\n );\n }\n\n if (cell.kind === 'action') {\n const value = cell.value;\n const menu = isRenderableTableActionMenu(value);\n const triggerId = tableActionTriggerId(actionMenuElementId, row.id, column.id);\n const expanded = menu && actionMenu?.rowId === row.id && actionMenu?.columnId === column.id;\n return (\n <ds-button-unfilled\n id={menu ? triggerId : undefined}\n variant={menu ? 'icon' : (value.variant ?? 'label')}\n size=\"md\"\n isInset={true}\n insetDepth=\"double\"\n label={value.label ?? ''}\n icon={value.icon ?? (menu ? 'Ellipses' : '')}\n aria-label={value.ariaLabel ?? null}\n hasBorder={value.hasBorder ?? false}\n isInactive={value.isInactive ?? false}\n isLoading={value.isLoading ?? false}\n hasMenu={menu}\n expanded={menu ? expanded : undefined}\n surfaceOpen={\n menu && actionMenuSurface?.rowId === row.id && actionMenuSurface?.columnId === column.id\n }\n controls={menu ? actionMenuElementId : undefined}\n onDsClick={event => {\n event.stopPropagation();\n if (menu) {\n onActionMenuToggle(row, column, event.detail);\n return;\n }\n if (isTableCellActionMenu(value)) return;\n onCellAction({ actionId: value.actionId, rowId: row.id, columnId: column.id });\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 if (variant === 'tag-only') return tag;\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 data-table-truncate=\"\"\n >\n {renderHighlightedText(\n value.text,\n tableCellFieldMatcher(options, variant === 'tag-with-text' ? 1 : 0)\n )}\n </ds-text>\n {variant === 'text-with-tag' && <span class=\"ds-table__cell-tag-control-track\">{tag}</span>}\n </span>\n );\n }\n\n if (cell.kind === 'tags') {\n if (cell.value.variant === 'inline') {\n return (\n <span class=\"ds-table__cell-tag-stack ds-table__cell-tag-stack--tag-with-text ds-table__cell-inline-tags-stack\">\n <span class=\"ds-table__cell-inline-tags\">\n {cell.value.items.map((item, index) => [\n index > 0 && (\n <ds-text\n class=\"ds-table__cell-tag-separator\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"quaternary\"\n aria-hidden=\"true\"\n >\n /\n </ds-text>\n ),\n <ds-tag\n key={`${item.label}-${index}`}\n label={item.label}\n intent={item.intent ?? 'neutral'}\n contrast={item.contrast ?? 'faint'}\n size=\"md\"\n icon={item.icon ?? ''}\n rounded={item.rounded ?? false}\n isInset\n insetDepth=\"double\"\n />,\n ])}\n </span>\n {cell.tracks === 2 && (\n <ds-text\n class=\"ds-table__cell-tag-text ds-table__cell-track\"\n as=\"span\"\n variant=\"text-body-small\"\n color=\"secondary\"\n lineTruncation={1}\n data-table-truncate=\"\"\n >\n {renderHighlightedText(cell.value.text, tableCellFieldMatcher(options, 1))}\n </ds-text>\n )}\n </span>\n );\n }\n return (\n <span\n class=\"ds-table__cell-tags\"\n style={{ '--_table-cell-tags-min-block-size': tableCellTrackStackBlockSize(cell.tracks) }}\n >\n {cell.value.items.map((item, index) => (\n <ds-tag\n key={`${item.label}-${index}`}\n label={item.label}\n intent={item.intent ?? 'neutral'}\n contrast={item.contrast ?? 'faint'}\n size=\"sm\"\n icon={item.icon ?? ''}\n rounded={item.rounded ?? false}\n isInset\n insetDepth=\"single\"\n />\n ))}\n </span>\n );\n }\n\n if (cell.kind !== 'text') return null;\n return renderTextCopy(cell, options);\n}\n\nfunction renderTextCopy(\n cell: Extract<TableCellPresentation, { kind: 'text' | 'icon-text' | 'score-text' }>,\n options: TableCellViewOptions\n) {\n const text = cell.value;\n const overflow = tableCellTextOverflowProps(cell.lineClamp);\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={overflow.lineTruncation}\n wrap={overflow.wrap}\n fontFeature={text.fontFeature ?? 'normal'}\n data-table-truncate={truncateAttr(cell.lineClamp)}\n >\n {renderHighlightedText(text.primary, tableCellFieldMatcher(options, 0))}\n </ds-text>\n );\n\n return (\n <span class={{ 'ds-table__cell-copy': true, 'ds-table__cell-copy--wrap': cell.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 ) : (\n primary\n )}\n {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 lineClamp: cell.lineClamp,\n highlightMatcherForRun: runIndex => tableCellFieldMatcher(options, 1 + runIndex),\n })}\n {renderTextTrack(text.tertiary, {\n track: 'tertiary',\n variant: 'text-body-small',\n defaultColor: 'secondary',\n wholeColor: text.tertiaryColor,\n lineClamp: cell.lineClamp,\n highlightMatcherForRun: runIndex =>\n tableCellFieldMatcher(options, 1 + (text.secondary?.length ?? 0) + runIndex),\n })}\n </span>\n );\n}\n\nfunction 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 lineClamp: Extract<\n TableCellPresentation,\n { kind: 'text' | 'icon-text' | 'score-text' }\n >['lineClamp'];\n highlightMatcherForRun: (runIndex: number) => TableHighlightMatcher;\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 overflow = tableCellTextOverflowProps(options.lineClamp);\n const colorFor = (run: TableCellTextRun) =>\n run.color ?? options.wholeColor ?? options.defaultColor;\n const renderRun = (run: TableCellTextRun, index: number, className: string) => {\n const copy = (\n <ds-text\n class={className}\n as=\"span\"\n variant={options.variant}\n color={colorFor(run)}\n decoration={run.help ? 'dotted-underline' : undefined}\n lineTruncation={overflow.lineTruncation}\n wrap={overflow.wrap}\n data-table-truncate={truncateAttr(options.lineClamp)}\n >\n {renderHighlightedText(run.text, options.highlightMatcherForRun(index))}\n </ds-text>\n );\n return run.help ? (\n <ds-tooltip\n key={`${options.track}-run-${index}`}\n label={run.help}\n side=\"bottom\"\n align=\"start\"\n size=\"sm\"\n wrapLabel={true}\n >\n {copy}\n </ds-tooltip>\n ) : (\n copy\n );\n };\n if (runs.length === 1) {\n const run = runs[0];\n if (!run.help) return renderRun(run, 0, trackClass);\n return <span class={trackClass}>{renderRun(run, 0, 'ds-table__cell-run')}</span>;\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 renderRun(run, index, 'ds-table__cell-run'),\n ])}\n </span>\n );\n}\n\nfunction renderHighlightedText(value: string | number | undefined, matcher: TableHighlightMatcher) {\n if (value === undefined) return null;\n return matcher(value).map((segment, index) =>\n segment.match ? (\n <mark class=\"ds-table__match\" key={`match-${index}`}>\n {segment.text}\n </mark>\n ) : (\n <span key={`text-${index}`}>{segment.text}</span>\n )\n );\n}\n\nfunction tableCellFieldMatcher(\n options: TableCellViewOptions,\n fieldIndex: number\n): TableHighlightMatcher {\n const selected = options.highlightFieldIds;\n if (selected.length === 0 || selected.includes(options.column.id)) {\n return options.highlightMatcher;\n }\n const fieldId = options.column.segments?.[fieldIndex]?.sortKey;\n return fieldId && selected.includes(fieldId)\n ? options.highlightMatcher\n : TABLE_NO_HIGHLIGHT_MATCHER;\n}\n\nfunction truncateAttr(\n lineClamp: Extract<\n TableCellPresentation,\n { kind: 'text' | 'icon-text' | 'score-text' }\n >['lineClamp']\n) {\n return lineClamp === 'none' ? undefined : '';\n}\n","import { h } from '@stencil/core';\nimport type { TableGroupRenderModel, TableRenderModel } from './table-render-model';\nimport type { DataGroup, TableRow } from './table-types';\nimport type { TableVirtualNode, TableVirtualPlan } from './table-virtual-model';\n\nexport interface TableVirtualRowPoolState {\n slotsByRowId: Map<string, number>;\n nextSlot: number;\n}\n\nexport interface TableBodyRenderOptions {\n headerRowCount?: number;\n model: TableRenderModel;\n plan: TableVirtualPlan | null;\n rows: TableRow[];\n stickyHeader: boolean;\n documentStickyHeader: boolean;\n activeStickyGroupId: string | null;\n renderRow: (\n row: TableRow,\n model: TableRenderModel,\n ariaRowIndex?: number,\n variableVirtualSize?: boolean,\n rowKey?: string\n ) => unknown;\n renderGroupContent: (group: TableGroupRenderModel) => unknown;\n renderGroupLoadRow: (group: DataGroup, totalColumns: number) => unknown;\n}\n\n/**\n * Assign stable, bounded DOM keys to the rows currently occupying one virtual scope.\n * Departed rows release their slots so long scrolls recycle DOM instead of growing it.\n */\nexport function assignTableVirtualRowPoolKeys(\n nodes: readonly TableVirtualNode[],\n state: TableVirtualRowPoolState\n): Map<number, string> {\n const rows = nodes.filter(\n (node): node is Extract<TableVirtualNode, { kind: 'row' }> => node.kind === 'row'\n );\n const desiredIds = new Set(rows.map(node => node.item.rowId ?? node.item.id));\n const freeSlots: number[] = [];\n for (const [rowId, slot] of state.slotsByRowId) {\n if (desiredIds.has(rowId)) continue;\n state.slotsByRowId.delete(rowId);\n freeSlots.push(slot);\n }\n freeSlots.sort((left, right) => left - right);\n\n const keys = new Map<number, string>();\n for (const node of rows) {\n const rowId = node.item.rowId ?? node.item.id;\n let slot = state.slotsByRowId.get(rowId);\n if (slot == null) {\n slot = freeSlots.shift() ?? state.nextSlot++;\n state.slotsByRowId.set(rowId, slot);\n }\n keys.set(node.index, `virtual-row-slot-${slot}`);\n }\n return keys;\n}\n\n/** Owns grouped and virtual tbody composition while Table remains the behavior orchestrator. */\nexport class TableBodyRenderer {\n private virtualLookupCache: {\n rows: TableRow[];\n groups: TableGroupRenderModel[];\n rowsById: Map<string, TableRow>;\n groupsById: Map<string, TableGroupRenderModel>;\n } | null = null;\n\n private readonly virtualRowPoolStates = new Map<string, TableVirtualRowPoolState>();\n\n resetVirtualState(): void {\n this.virtualLookupCache = null;\n this.virtualRowPoolStates.clear();\n }\n\n render(options: TableBodyRenderOptions) {\n if (options.plan) return this.renderVirtualBodies(options);\n\n const { model } = options;\n if (!model.grouped) {\n return (\n <tbody class=\"ds-table__body\">\n {options.rows.map(row => options.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 =\n options.documentStickyHeader && options.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':\n options.stickyHeader && !options.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 {options.renderGroupContent(groupModel)}\n </th>\n </tr>\n {!isCollapsed && group.rows.map(row => options.renderRow(row, model))}\n {!isCollapsed && options.renderGroupLoadRow(group, model.totalColumns)}\n </tbody>\n );\n });\n }\n\n private renderVirtualSpacer(\n node: Extract<TableVirtualNode, { kind: 'spacer' }>,\n totalColumns: number\n ) {\n if (node.size <= 0) return null;\n return (\n <tr class=\"ds-table__virtual-spacer-row\" key={node.key} aria-hidden=\"true\">\n <td\n class=\"ds-table__virtual-spacer-cell\"\n colSpan={totalColumns}\n style={\n { '--_table-virtual-spacer-block-size': `${node.size}px` } as Record<string, string>\n }\n />\n </tr>\n );\n }\n\n private renderVirtualRow(\n node: Extract<TableVirtualNode, { kind: 'row' }>,\n options: TableBodyRenderOptions,\n rowsById: Map<string, TableRow>,\n rowKey: string\n ) {\n const row = node.item.rowId ? rowsById.get(node.item.rowId) : undefined;\n if (!row) return null;\n return options.renderRow(row, options.model, node.index + 2, node.item.variableSize, rowKey);\n }\n\n private virtualRowPoolKeys(nodes: readonly TableVirtualNode[], scope: string) {\n const state = this.virtualRowPoolStates.get(scope) ?? {\n slotsByRowId: new Map<string, number>(),\n nextSlot: 0,\n };\n this.virtualRowPoolStates.set(scope, state);\n return assignTableVirtualRowPoolKeys(nodes, state);\n }\n\n private renderVirtualGroup(\n node: Extract<TableVirtualNode, { kind: 'group' }>,\n options: TableBodyRenderOptions,\n rowsById: Map<string, TableRow>,\n groupsById: Map<string, TableGroupRenderModel>\n ) {\n const groupModel = groupsById.get(node.groupId);\n if (!groupModel) return null;\n const { group, collapsed: isCollapsed, intent, intentClass } = groupModel;\n const rowKeys = this.virtualRowPoolKeys(node.nodes, `group:${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 key={group.id}\n >\n <tr\n role=\"row\"\n data-virtual-id={`group:${group.id}`}\n aria-rowindex={node.headerIndex + 1 + (options.headerRowCount ?? 1)}\n class={{\n 'ds-table__group-row': true,\n 'ds-table__group-row--native-sticky':\n options.stickyHeader && !options.documentStickyHeader,\n }}\n >\n <th\n class={{\n 'ds-table__group-cell': true,\n [intentClass ?? '']: !!intentClass,\n }}\n role=\"rowheader\"\n scope=\"rowgroup\"\n colSpan={options.model.totalColumns}\n >\n {options.renderGroupContent(groupModel)}\n </th>\n </tr>\n {node.nodes.map(child =>\n child.kind === 'spacer'\n ? this.renderVirtualSpacer(child, options.model.totalColumns)\n : this.renderVirtualRow(\n child,\n options,\n rowsById,\n rowKeys.get(child.index) ?? `virtual-row-${child.index}`\n )\n )}\n </tbody>\n );\n }\n\n private renderVirtualBodies(options: TableBodyRenderOptions) {\n const { model, plan } = options;\n if (!plan) return null;\n let lookup = this.virtualLookupCache;\n if (!lookup || lookup.rows !== model.loadedRows || lookup.groups !== model.groups) {\n lookup = {\n rows: model.loadedRows,\n groups: model.groups,\n rowsById: new Map(model.loadedRows.map(row => [row.id, row])),\n groupsById: new Map(model.groups.map(groupModel => [groupModel.group.id, groupModel])),\n };\n this.virtualLookupCache = lookup;\n }\n const { rowsById, groupsById } = lookup;\n if (!model.grouped) {\n for (const scope of this.virtualRowPoolStates.keys()) {\n if (scope !== 'flat') this.virtualRowPoolStates.delete(scope);\n }\n const rowKeys = this.virtualRowPoolKeys(plan.nodes, 'flat');\n return (\n <tbody class=\"ds-table__body\">\n {plan.nodes.map(node =>\n node.kind === 'spacer'\n ? this.renderVirtualSpacer(node, model.totalColumns)\n : node.kind === 'row'\n ? this.renderVirtualRow(\n node,\n options,\n rowsById,\n rowKeys.get(node.index) ?? `virtual-row-${node.index}`\n )\n : null\n )}\n </tbody>\n );\n }\n\n const activeGroupScopes = new Set(\n plan.nodes\n .filter(\n (node): node is Extract<TableVirtualNode, { kind: 'group' }> => node.kind === 'group'\n )\n .map(node => `group:${node.groupId}`)\n );\n for (const scope of this.virtualRowPoolStates.keys()) {\n if (!activeGroupScopes.has(scope)) this.virtualRowPoolStates.delete(scope);\n }\n return plan.nodes.map(node => {\n if (node.kind === 'spacer') {\n return (\n <tbody class=\"ds-table__body ds-table__virtual-pad\" aria-hidden=\"true\" key={node.key}>\n {this.renderVirtualSpacer(node, model.totalColumns)}\n </tbody>\n );\n }\n if (node.kind === 'group') {\n return this.renderVirtualGroup(node, options, rowsById, groupsById);\n }\n return null;\n });\n }\n}\n","import { tableColumnSize } from './table-model';\nimport type { TableCellSpan, TableColumn, TableRow } from './table-types';\n\nexport interface TableColumnLayout {\n style: Record<string, string>;\n edge?: 'start' | 'end';\n}\n\n/** Column-only work. Never measure cells or scan rows while scrolling. */\nexport function tablePinnedColumns(columns: TableColumn[], selectable: boolean) {\n const result = new Map<string, TableColumnLayout>();\n for (const edge of ['start', 'end'] as const) {\n const pinned = columns.filter(column => column.sticky === edge && tableColumnSize(column));\n const ordered = edge === 'start' ? pinned : [...pinned].reverse();\n const sizes =\n edge === 'start' && selectable ? ['var(--_table-selection-column-inline-size)'] : [];\n for (const [index, column] of ordered.entries()) {\n result.set(column.id, {\n style: { '--_table-pin-offset': sizes.length ? `calc(${sizes.join(' + ')})` : '0px' },\n edge: index === ordered.length - 1 ? edge : undefined,\n });\n sizes.push(tableColumnSize(column)!);\n }\n }\n return result;\n}\n\nexport interface TableHeaderBand {\n key: string;\n label?: string;\n start: number;\n span: number;\n firstColumnId?: string;\n lastColumnId?: string;\n sticky?: 'start' | 'end';\n}\n\n/** Split at visibility, reorder, selection, spacer and pin boundaries. Never span an unrelated column. */\nexport function tableHeaderBands(\n columns: TableColumn[],\n selectable: boolean,\n spacer?: number\n): TableHeaderBand[] {\n if (!columns.some(column => column.group)) return [];\n const lanes: Array<TableColumn | undefined> = [...columns];\n if (spacer != null) lanes.splice(spacer, 0, undefined);\n if (selectable) lanes.unshift(undefined);\n const bands: TableHeaderBand[] = [];\n let previous: TableColumn | undefined;\n for (const [index, column] of lanes.entries()) {\n const group = column?.group;\n const last = bands[bands.length - 1];\n if (group && previous?.group?.id === group.id && previous.sticky === column?.sticky && last) {\n last.span++;\n last.lastColumnId = column?.id;\n } else {\n bands.push({\n key: `band-${index}`,\n label: group?.label,\n start: index + 1,\n span: 1,\n firstColumnId: column?.id,\n lastColumnId: column?.id,\n sticky: column?.sticky,\n });\n }\n previous = column;\n }\n return bands;\n}\n\nexport type TableSpanCell =\n | { rowSpan: number; colSpan: number; columnStart: number; columnIds: string[] }\n | 'covered';\nexport interface TableSpanModel {\n cells: Map<string, Map<string, TableSpanCell>>;\n issues: string[];\n hasRowSpans: boolean;\n}\n\n/** Validate the complete rectangle before covering any cells. Invalid spans leave all data visible. */\nexport function tableSpanModel(\n spans: TableCellSpan[],\n rows: TableRow[],\n columns: TableColumn[],\n options: {\n windowed: boolean;\n grouped: boolean;\n grid: boolean;\n selectable: boolean;\n spacer?: number;\n }\n): TableSpanModel {\n const result: TableSpanModel = { cells: new Map(), issues: [], hasRowSpans: false };\n if (!spans.length) return result;\n const rowIndex = new Map(rows.map((row, index) => [row.id, index]));\n const columnIndex = new Map(columns.map((column, index) => [column.id, index]));\n const contiguous = (ids: string[], indices: Map<string, number>) =>\n ids.length > 0 &&\n ids.every((id, index) => indices.get(id) === (indices.get(ids[0]) ?? -100000) + index);\n for (const [index, span] of spans.entries()) {\n if (\n !span ||\n !Array.isArray(span.rowIds) ||\n !Array.isArray(span.columnIds) ||\n !span.rowIds.every(id => typeof id === 'string') ||\n !span.columnIds.every(id => typeof id === 'string')\n ) {\n result.issues.push(\n `Merge ${index + 1} ignored: rowIds and columnIds must be identity arrays.`\n );\n continue;\n }\n const start = columnIndex.get(span.columnIds[0]) ?? -1;\n const end = start + span.columnIds.length;\n const sticky = columns[start]?.sticky;\n const invalid =\n options.grouped ||\n options.grid ||\n span.rowIds.length * span.columnIds.length > 10000 ||\n (options.windowed && span.rowIds.length > 1) ||\n !contiguous(span.rowIds, rowIndex) ||\n !contiguous(span.columnIds, columnIndex) ||\n (options.spacer != null && start < options.spacer && end > options.spacer) ||\n span.columnIds.some(id => columns[columnIndex.get(id)!]?.sticky !== sticky) ||\n (!!sticky && span.columnIds.some(id => !tableColumnSize(columns[columnIndex.get(id)!]))) ||\n span.rowIds.some(rowId => span.columnIds.some(id => result.cells.get(rowId)?.has(id)));\n if (invalid) {\n result.issues.push(\n `Merge ${index + 1} ignored: requires a non-overlapping contiguous rectangle, no pin/spacer crossing, no grouping/grid, and no virtual row span.`\n );\n continue;\n }\n result.hasRowSpans ||= span.rowIds.length > 1;\n for (const [ri, rowId] of span.rowIds.entries()) {\n const cells = result.cells.get(rowId) ?? new Map<string, TableSpanCell>();\n for (const [ci, id] of span.columnIds.entries()) {\n cells.set(\n id,\n ri === 0 && ci === 0\n ? {\n rowSpan: span.rowIds.length,\n colSpan: span.columnIds.length,\n columnStart:\n start +\n 1 +\n Number(options.selectable) +\n Number(options.spacer != null && start >= options.spacer),\n columnIds: span.columnIds,\n }\n : 'covered'\n );\n }\n result.cells.set(rowId, cells);\n }\n }\n return result;\n}\n","import { h } from '@stencil/core';\nimport { resolveTableCellImageTracks, tableCellImageVariant } from './table-cell-model';\nimport type { TableRenderModel } from './table-render-model';\nimport type { TableCellSkeleton, TableColumn } from './table-types';\nimport type { TableColumnLayout } from './table-structure';\n\ninterface TableSkeletonViewOptions {\n pins?: Map<string, TableColumnLayout>;\n model: TableRenderModel;\n visibleColumns: TableColumn[];\n skeletonRows: number;\n renderStickyEdge: (sticky: TableColumn['sticky'], shadow?: boolean) => unknown;\n}\n\n/** Render the loading body from the same cell recipes used by loaded rows. */\nexport function renderTableSkeletonBody(options: TableSkeletonViewOptions) {\n const { model, visibleColumns, renderStickyEdge } = options;\n const count = Math.min(20, Math.max(1, Math.round(options.skeletonRows) || 1));\n const beforeSpacer =\n model.elasticSpacerIndex == null\n ? visibleColumns\n : visibleColumns.slice(0, model.elasticSpacerIndex);\n const afterSpacer =\n model.elasticSpacerIndex == null ? [] : visibleColumns.slice(model.elasticSpacerIndex);\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 {renderStickyEdge(\n 'start',\n !options.pins || ![...options.pins.values()].some(pin => pin.edge === 'start')\n )}\n </td>\n )}\n {beforeSpacer.map(column =>\n renderSkeletonCell(column, index, renderStickyEdge, options.pins?.get(column.id))\n )}\n {model.elasticSpacerIndex != null && (\n <td\n class=\"ds-table__cell ds-table__elastic-spacer-cell ds-table__skeleton-cell ds-interaction-fill ds-interaction-fill--grouped\"\n aria-hidden=\"true\"\n role=\"presentation\"\n data-elastic-spacer=\"true\"\n />\n )}\n {afterSpacer.map(column =>\n renderSkeletonCell(column, index, renderStickyEdge, options.pins?.get(column.id))\n )}\n </tr>\n ))}\n </tbody>\n );\n}\n\nfunction renderSkeletonCell(\n column: TableColumn,\n rowIndex: number,\n renderStickyEdge: TableSkeletonViewOptions['renderStickyEdge'],\n layout?: TableColumnLayout\n) {\n const skeleton =\n column.skeleton ??\n ((column.kind === 'action'\n ? { kind: 'action', variant: 'icon' }\n : { kind: 'text', lines: 1 }) satisfies TableCellSkeleton);\n const align = column.align ?? 'start';\n const text = skeleton.kind === 'text';\n const iconText = skeleton.kind === 'icon-text';\n const scoreText = skeleton.kind === 'score-text';\n const lines = text || iconText || scoreText ? (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\n ? 'triple'\n : lines === 2\n ? 'multi'\n : 'single'\n : undefined;\n const scoreTextVariant = scoreText\n ? lines === 3\n ? 'triple'\n : lines === 2\n ? 'multi'\n : 'single'\n : undefined;\n const action = skeleton.kind === 'action';\n const blank = skeleton.kind === 'blank';\n\n return (\n <td\n style={layout?.style}\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--score-text': scoreText,\n [`ds-table__cell--score-text-${scoreTextVariant}`]: scoreText,\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 ?? scoreTextVariant}\n key={`skeleton-${rowIndex}:${column.id}`}\n >\n <span class=\"ds-table__cell-content ds-interaction-fill__content\">\n {renderSkeletonCellContent(skeleton)}\n </span>\n {renderStickyEdge(layout ? column.sticky : undefined, !!layout?.edge)}\n </td>\n );\n}\n\nfunction 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 <ds-skeleton variant=\"control\" controlSize=\"sm\" width={skeleton.width ?? '64%'} />;\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 ? 'var(--dimension-size-300)' : '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 if (skeleton.kind === 'score-text') {\n return (\n <span class=\"ds-table__cell-score-text\">\n {copy}\n <span class=\"ds-table__cell-score-text-score\">\n <ds-score size=\"sm\" isLoading={true} label=\"Safety score\" />\n </span>\n </span>\n );\n }\n return copy;\n}\n","import { h } from '@stencil/core';\n\ninterface TableLoadContentOptions {\n error?: string;\n loading: boolean;\n hasMore: boolean;\n manualFallback: boolean;\n retryLabel: string;\n loadingLabel: string;\n loadMoreLabel: string;\n loadMoreAriaLabel?: string;\n endOfResultsLabel?: string;\n onRetry: () => void;\n onLoadMore: () => void;\n}\n\n/** Shared visible state machine for top-level and per-group incremental loading bands. */\nexport function renderTableLoadContent(options: TableLoadContentOptions) {\n if (options.error) {\n return (\n <span class=\"ds-table__load-content ds-table__load-content--error\">\n <span class=\"ds-table__load-copy\">\n <ds-icon name=\"ExclamationTriangle\" size=\"md\" color=\"secondary\" aria-hidden=\"true\" />\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {options.error}\n </ds-text>\n </span>\n <ds-button-unfilled label={options.retryLabel} size=\"md\" onDsClick={options.onRetry} />\n </span>\n );\n }\n\n if (options.loading) {\n return (\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 {options.loadingLabel}\n </ds-text>\n </span>\n );\n }\n\n if (options.hasMore && options.manualFallback) {\n return (\n <span class=\"ds-table__load-content\">\n <ds-button-unfilled\n label={options.loadMoreLabel}\n aria-label={options.loadMoreAriaLabel}\n size=\"md\"\n onDsClick={options.onLoadMore}\n />\n </span>\n );\n }\n\n if (options.hasMore) return <span class=\"ds-table__auto-sentinel\" aria-hidden=\"true\" />;\n if (!options.endOfResultsLabel) return null;\n return (\n <ds-text class=\"ds-table__load-content\" as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n {options.endOfResultsLabel}\n </ds-text>\n );\n}\n","export interface TableLayoutElements {\n viewport: HTMLElement | null;\n contentTable: HTMLTableElement | 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 const TABLE_CARD_VIEWPORT_BREAKPOINT = 768;\n\nexport function isTableCardViewport(inlineSize: number): boolean {\n return inlineSize < TABLE_CARD_VIEWPORT_BREAKPOINT;\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:\n 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:\n input.collapseHeadBlockStart == null || 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 connectedContentTable: HTMLTableElement | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private frame: number | null = null;\n private overflow: TableOverflowState | null = null;\n private inlineOffset = 0;\n private maxInlineOffset = 0;\n private maxBlockOffset = 0;\n private lastMode: TableLayoutMode | 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.connectedContentTable = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n /** Reconcile newly rendered refs, observers, and pending geometry. */\n refresh(forceGeometry = true): void {\n if (!this.connected) return;\n const { viewport, contentTable } = this.options.elements();\n const elementsChanged =\n viewport !== this.connectedViewport || contentTable !== this.connectedContentTable;\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 this.connectedContentTable = contentTable;\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 if (contentTable) this.resizeObserver.observe(contentTable);\n }\n }\n const mode = this.options.mode();\n const modeChanged =\n !this.lastMode ||\n mode.documentStickyHeader !== this.lastMode.documentStickyHeader ||\n mode.floatingCollapseAll !== this.lastMode.floatingCollapseAll ||\n mode.clampVerticalOverscroll !== this.lastMode.clampVerticalOverscroll;\n this.lastMode = mode;\n // New refs and explicit refreshes resolve before paint. A recycled virtual\n // window keeps the same scroll geometry, so ResizeObserver owns later size\n // changes without forcing layout after every row patch.\n if (forceGeometry || elementsChanged || modeChanged) 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 const viewport = this.connectedViewport;\n if (!viewport) return;\n const mode = this.options.mode();\n this.clampInlineOffset();\n if (mode.clampVerticalOverscroll) this.clampBlockOffset();\n if (\n viewport.scrollLeft !== this.inlineOffset ||\n (mode.floatingCollapseAll && !mode.documentStickyHeader)\n ) {\n this.schedule();\n }\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 atStart = viewport.scrollLeft <= 0 && event.deltaX < 0;\n const atEnd = viewport.scrollLeft >= this.maxInlineOffset && 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 atStart = viewport.scrollTop <= 0 && event.deltaY < 0;\n const atEnd = viewport.scrollTop >= this.maxBlockOffset && 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 clamped = Math.min(this.maxInlineOffset, 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 clamped = Math.min(this.maxBlockOffset, 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 =\n mode.floatingCollapseAll &&\n !mode.documentStickyHeader &&\n elements.collapseAllOverlay &&\n elements.frame &&\n 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 this.inlineOffset = metrics.inlineOffset;\n this.maxInlineOffset = metrics.maxInlineOffset;\n this.maxBlockOffset = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n // Header-only geometry; independent of the loaded/recycled row count.\n const pinnedCells = elements.interactiveHead?.querySelectorAll?.<HTMLElement>(\n '.ds-table__header-cell:not(.ds-table__super-header-cell).ds-table__cell--sticky-start, .ds-table__header-cell:not(.ds-table__super-header-cell).ds-table__cell--sticky-end'\n );\n const pinnedSize = [...(pinnedCells ?? [])].reduce(\n (size, cell) => size + cell.getBoundingClientRect().width,\n 0\n );\n const crowded = pinnedSize > 0 && pinnedSize >= metrics.visibleInlineSize;\n if (elements.frame?.getAttribute('data-pins-crowded') !== String(crowded))\n elements.frame?.setAttribute('data-pins-crowded', String(crowded));\n this.setProperty(viewport, '--ds-table-visible-inline-size', `${metrics.visibleInlineSize}px`);\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 { TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason } 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 )\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 DataGroup,\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: DataGroup[];\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: DataGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: DataGroup, count?: number): string {\n return template\n .split('{group}')\n .join(group.label)\n .split('{count}')\n .join(String(count ?? group.rows.length))\n .split('{loaded}')\n .join(String(group.rows.length))\n .split('{total}')\n .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 )\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: DataGroup): 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","import { resolveTableCellPresentation } from './table-cell-model';\nimport { tableGroupAccessories } from './table-model';\nimport type { TableColumn, DataGroup, TableRow } from './table-types';\n\n/**\n * Token-aligned body-row track contracts: 40 / 64 / 88, plus wrapping-secondary\n * 112. Every track is 24px with no stack gap. Estimates only; measured heights\n * replace these after paint.\n */\nexport const TABLE_VIRTUAL_ROW_TRACK_SIZE = {\n 1: 40,\n 2: 64,\n 3: 88,\n 4: 112,\n} as const;\n\nconst TABLE_VIRTUAL_LATER_TRACK_INCREMENT =\n TABLE_VIRTUAL_ROW_TRACK_SIZE[2] - TABLE_VIRTUAL_ROW_TRACK_SIZE[1];\n\n/** Estimated row height for any positive named track count. */\nexport function tableVirtualRowTrackSize(tracks: number): number {\n const count = Number.isFinite(tracks) && tracks > 0 ? Math.floor(tracks) : 1;\n return TABLE_VIRTUAL_ROW_TRACK_SIZE[1] + (count - 1) * TABLE_VIRTUAL_LATER_TRACK_INCREMENT;\n}\n\nexport const TABLE_VIRTUAL_GROUP_HEADER_SIZE = TABLE_VIRTUAL_ROW_TRACK_SIZE[1];\nexport const TABLE_VIRTUAL_MIN_OVERSCAN_ROWS = 8;\n\nexport const TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING = 'Bounded height required';\nexport const TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY =\n 'Virtual mode requires height, maxHeight, or fitViewport.';\n\nexport const TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL = '{total} items';\n\nexport type TableVirtualItemKind = 'group' | 'row';\n\nexport interface TableVirtualItem {\n kind: TableVirtualItemKind;\n id: string;\n groupId?: string;\n rowId?: string;\n estimatedSize: number;\n variableSize: boolean;\n}\n\nexport type TableVirtualNode =\n | { kind: 'spacer'; size: number; key: string }\n | { kind: 'row'; index: number; item: TableVirtualItem }\n | {\n kind: 'group';\n groupId: string;\n headerIndex: number;\n nodes: Array<Extract<TableVirtualNode, { kind: 'spacer' | 'row' }>>;\n };\n\nexport interface TableVirtualPlan {\n totalSize: number;\n itemCount: number;\n start: number;\n end: number;\n nodes: TableVirtualNode[];\n mountedIds: ReadonlySet<string>;\n mountedIndexes: ReadonlySet<number>;\n}\n\nexport interface FlattenTableVirtualItemsInput {\n grouped: boolean;\n rows: TableRow[];\n groups: DataGroup[];\n collapsedGroupIds: ReadonlySet<string> | readonly string[];\n columns: TableColumn[];\n}\n\nexport interface ResolveTableVirtualPlanInput {\n items: readonly TableVirtualItem[];\n sizes: readonly number[];\n scrollOffset: number;\n viewportSize: number;\n pinnedRowIds?: ReadonlySet<string>;\n}\n\nexport interface TableVirtualIndex {\n items: readonly TableVirtualItem[];\n sizes: readonly number[];\n prefix: readonly number[];\n itemCount: number;\n totalSize: number;\n hasVariableSize: boolean;\n grouped: boolean;\n groupHeaderIndexes: readonly number[];\n headerIndexByGroup: ReadonlyMap<string, number>;\n groupEndByHeader: ReadonlyMap<number, number>;\n rowIndexById: ReadonlyMap<string, number>;\n itemIndexById: ReadonlyMap<string, number>;\n}\n\nexport interface ResolveTableVirtualIndexedPlanInput {\n scrollOffset: number;\n viewportSize: number;\n scrollDirection?: 'backward' | 'forward' | 'none';\n pinnedRowIds?: ReadonlySet<string>;\n}\n\n/** Map a cell recipe onto the named track stack used for first-paint estimates. */\nexport function estimateTableCellTrackCount(\n value: TableRow['cells'][string],\n column: TableColumn\n): number {\n return tableCellTrackCount(resolveTableCellPresentation(value, column));\n}\n\nfunction tableCellTrackCount(\n presentation: ReturnType<typeof resolveTableCellPresentation>\n): number {\n if (presentation.kind === 'image') {\n return presentation.variant === 'triple' ? 3 : presentation.variant === 'multi' ? 2 : 1;\n }\n if (presentation.kind === 'tag') {\n return presentation.variant === 'text-with-tag' ? 2 : 1;\n }\n if (presentation.kind === 'tags') return presentation.tracks;\n if (\n presentation.kind !== 'text' &&\n presentation.kind !== 'icon-text' &&\n presentation.kind !== 'score-text'\n )\n return 1;\n\n const variantTracks =\n presentation.variant === 'triple'\n ? 3\n : presentation.variant === 'multi' || presentation.variant === 'primary-pair'\n ? 2\n : 1;\n if (!presentation.wraps) return variantTracks;\n if (presentation.lineClamp === 'none') {\n return presentation.kind === 'text' && !presentation.singleLine ? 4 : 3;\n }\n if (presentation.lineClamp === 3 && variantTracks >= 2) return 4;\n return Math.max(variantTracks, presentation.lineClamp);\n}\n\n/** Tallest named track stack across the row's visible cells. */\nexport function estimateTableRowBlockSize(row: TableRow, columns: readonly TableColumn[]): number {\n return tableVirtualRowMetrics(row, columns).estimatedSize;\n}\n\nfunction tableVirtualRowMetrics(\n row: TableRow,\n columns: readonly TableColumn[]\n): Pick<TableVirtualItem, 'estimatedSize' | 'variableSize'> {\n let tracks = 1;\n let variableSize = false;\n for (const column of columns) {\n const value = row.cells[column.id];\n const presentation = resolveTableCellPresentation(value, column);\n if (\n (presentation.kind === 'text' ||\n presentation.kind === 'icon-text' ||\n presentation.kind === 'score-text') &&\n presentation.wraps &&\n presentation.lineClamp === 'none'\n ) {\n variableSize = true;\n }\n if (presentation.kind === 'tags') variableSize = true;\n const count = tableCellTrackCount(presentation);\n if (count > tracks) tracks = count;\n }\n return { estimatedSize: tableVirtualRowTrackSize(tracks), variableSize };\n}\n\nexport function flattenTableVirtualItems(input: FlattenTableVirtualItemsInput): TableVirtualItem[] {\n const collapsed =\n input.collapsedGroupIds instanceof Set\n ? input.collapsedGroupIds\n : new Set(input.collapsedGroupIds);\n if (!input.grouped) {\n return input.rows.map(row => {\n const metrics = tableVirtualRowMetrics(row, input.columns);\n return {\n kind: 'row' as const,\n id: `row:${row.id}`,\n rowId: row.id,\n ...metrics,\n };\n });\n }\n\n const items: TableVirtualItem[] = [];\n for (const group of input.groups) {\n items.push({\n kind: 'group',\n id: `group:${group.id}`,\n groupId: group.id,\n estimatedSize: tableVirtualRowTrackSize(tableGroupAccessories(group).length > 0 ? 2 : 1),\n variableSize: false,\n });\n if (collapsed.has(group.id)) continue;\n for (const row of group.rows) {\n const metrics = tableVirtualRowMetrics(row, input.columns);\n items.push({\n kind: 'row',\n id: `row:${row.id}`,\n rowId: row.id,\n groupId: group.id,\n ...metrics,\n });\n }\n }\n return items;\n}\n\nexport function tableVirtualOverscanPx(viewportSize: number): number {\n const min = TABLE_VIRTUAL_MIN_OVERSCAN_ROWS * TABLE_VIRTUAL_ROW_TRACK_SIZE[1];\n return Math.max(0, viewportSize / 2, min);\n}\n\nexport function buildTableVirtualPrefixSums(sizes: readonly number[]): number[] {\n const prefix = new Array<number>(sizes.length + 1);\n prefix[0] = 0;\n for (let index = 0; index < sizes.length; index += 1) {\n prefix[index + 1] = prefix[index] + Math.max(0, sizes[index] ?? 0);\n }\n return prefix;\n}\n\n/** Largest item index whose start offset is <= `offset`. */\nexport function findTableVirtualIndexAtOffset(prefix: readonly number[], offset: number): number {\n const lastIndex = prefix.length - 2;\n if (lastIndex < 0) return 0;\n const target = Math.max(0, offset);\n let low = 0;\n let high = lastIndex;\n while (low < high) {\n const mid = (low + high + 1) >> 1;\n if ((prefix[mid] ?? 0) <= target) low = mid;\n else high = mid - 1;\n }\n return low;\n}\n\nexport function tableVirtualItemSizes(\n items: readonly TableVirtualItem[],\n measures: ReadonlyMap<string, number>\n): number[] {\n return items.map(item => measures.get(item.id) ?? item.estimatedSize);\n}\n\nexport function sameTableVirtualPlan(\n left: TableVirtualPlan | null | undefined,\n right: TableVirtualPlan | null | undefined\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n if (\n left.start !== right.start ||\n left.end !== right.end ||\n left.totalSize !== right.totalSize ||\n left.itemCount !== right.itemCount ||\n left.mountedIndexes.size !== right.mountedIndexes.size\n ) {\n return false;\n }\n for (const index of left.mountedIndexes) {\n if (!right.mountedIndexes.has(index)) return false;\n }\n return sameVirtualNodes(left.nodes, right.nodes);\n}\n\nfunction sameVirtualNodes(\n left: readonly TableVirtualNode[],\n right: readonly TableVirtualNode[]\n): boolean {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1) {\n const a = left[index];\n const b = right[index];\n if (!a || !b || a.kind !== b.kind) return false;\n if (a.kind === 'spacer' && b.kind === 'spacer') {\n if (a.size !== b.size || a.key !== b.key) return false;\n continue;\n }\n if (a.kind === 'row' && b.kind === 'row') {\n if (a.index !== b.index || a.item.id !== b.item.id) return false;\n continue;\n }\n if (a.kind === 'group' && b.kind === 'group') {\n if (a.groupId !== b.groupId || a.headerIndex !== b.headerIndex) return false;\n if (!sameVirtualNodes(a.nodes, b.nodes)) return false;\n }\n }\n return true;\n}\n\n/** Precompute dataset-wide lookup state. Rebuild only when items or their sizes change. */\nexport function createTableVirtualIndex(\n items: readonly TableVirtualItem[],\n sizes: readonly number[]\n): TableVirtualIndex {\n const prefix = buildTableVirtualPrefixSums(sizes);\n const itemCount = items.length;\n const groupHeaderIndexes: number[] = [];\n const headerIndexByGroup = new Map<string, number>();\n const groupEndByHeader = new Map<number, number>();\n const rowIndexById = new Map<string, number>();\n const itemIndexById = new Map<string, number>();\n let activeHeaderIndex: number | null = null;\n let hasVariableSize = false;\n\n for (let itemIndex = 0; itemIndex < itemCount; itemIndex += 1) {\n const item = items[itemIndex];\n if (item) {\n itemIndexById.set(item.id, itemIndex);\n hasVariableSize ||= item.variableSize;\n }\n if (item?.kind === 'group' && item.groupId) {\n if (activeHeaderIndex != null) groupEndByHeader.set(activeHeaderIndex, itemIndex);\n activeHeaderIndex = itemIndex;\n groupHeaderIndexes.push(itemIndex);\n headerIndexByGroup.set(item.groupId, itemIndex);\n } else if (item?.kind === 'row' && item.rowId) {\n rowIndexById.set(item.rowId, itemIndex);\n }\n }\n if (activeHeaderIndex != null) groupEndByHeader.set(activeHeaderIndex, itemCount);\n\n return {\n items,\n sizes,\n prefix,\n itemCount,\n totalSize: prefix[itemCount] ?? 0,\n hasVariableSize,\n grouped: groupHeaderIndexes.length > 0,\n groupHeaderIndexes,\n headerIndexByGroup,\n groupEndByHeader,\n rowIndexById,\n itemIndexById,\n };\n}\n\n/** Resolve the mounted slice from cached dataset-wide lookup state. */\nexport function resolveTableVirtualPlanFromIndex(\n index: TableVirtualIndex,\n input: ResolveTableVirtualIndexedPlanInput\n): TableVirtualPlan {\n const { items, prefix, itemCount, totalSize } = index;\n const empty: TableVirtualPlan = {\n totalSize,\n itemCount,\n start: 0,\n end: 0,\n nodes: totalSize > 0 ? [{ kind: 'spacer', size: totalSize, key: 'pad-empty' }] : [],\n mountedIds: new Set(),\n mountedIndexes: new Set(),\n };\n if (itemCount === 0) return empty;\n\n const viewportSize = Math.max(0, input.viewportSize);\n const overscan = tableVirtualOverscanPx(viewportSize);\n const trailingOverscan = (TABLE_VIRTUAL_MIN_OVERSCAN_ROWS * TABLE_VIRTUAL_ROW_TRACK_SIZE[1]) / 4;\n const before = input.scrollDirection === 'forward' ? trailingOverscan : overscan;\n const after = input.scrollDirection === 'backward' ? trailingOverscan : overscan;\n const scrollOffset = Math.max(0, Math.min(input.scrollOffset, Math.max(0, totalSize)));\n const rangeStart = Math.max(0, scrollOffset - before);\n const rangeEnd = scrollOffset + viewportSize + after;\n const start = findTableVirtualIndexAtOffset(prefix, rangeStart);\n let end = start;\n while (end < itemCount && (prefix[end] ?? 0) < rangeEnd) end += 1;\n if (end === start) end = Math.min(itemCount, start + 1);\n\n const mounted = new Set<number>();\n for (let itemIndex = start; itemIndex < end; itemIndex += 1) mounted.add(itemIndex);\n\n const pinHeader = (groupId: string | undefined) => {\n if (!groupId) return;\n const headerIndex = index.headerIndexByGroup.get(groupId);\n if (headerIndex != null) mounted.add(headerIndex);\n };\n for (const mountedIndex of [...mounted]) pinHeader(items[mountedIndex]?.groupId);\n\n const nextHeader = firstTableVirtualIndexAfter(index.groupHeaderIndexes, end - 1);\n if (nextHeader != null) mounted.add(nextHeader);\n\n if (input.pinnedRowIds) {\n for (const rowId of input.pinnedRowIds) {\n const rowIndex = index.rowIndexById.get(rowId);\n if (rowIndex == null) continue;\n mounted.add(rowIndex);\n pinHeader(items[rowIndex]?.groupId);\n }\n }\n\n const mountedSorted = [...mounted].sort((left, right) => left - right);\n const nodes = index.grouped\n ? buildGroupedVirtualNodes(index, mounted, mountedSorted)\n : buildFlatVirtualNodes(index, mountedSorted);\n const mountedIds = new Set<string>();\n for (const mountedIndex of mounted) {\n const id = items[mountedIndex]?.id;\n if (id) mountedIds.add(id);\n }\n\n return {\n totalSize,\n itemCount,\n start: mountedSorted[0] ?? start,\n end: mountedSorted.length > 0 ? mountedSorted[mountedSorted.length - 1]! + 1 : end,\n nodes,\n mountedIds,\n mountedIndexes: mounted,\n };\n}\n\n/** Resolve a one-off plan. Controllers retain and reuse a prepared index. */\nexport function resolveTableVirtualPlan(input: ResolveTableVirtualPlanInput): TableVirtualPlan {\n return resolveTableVirtualPlanFromIndex(createTableVirtualIndex(input.items, input.sizes), input);\n}\n\nfunction firstTableVirtualIndexAfter(\n indexes: readonly number[],\n target: number\n): number | undefined {\n let low = 0;\n let high = indexes.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if ((indexes[middle] ?? 0) <= target) low = middle + 1;\n else high = middle;\n }\n return indexes[low];\n}\n\nfunction buildFlatVirtualNodes(\n index: TableVirtualIndex,\n mounted: readonly number[]\n): TableVirtualNode[] {\n const { items, prefix, itemCount } = index;\n const nodes: TableVirtualNode[] = [];\n let cursor = 0;\n for (const mountedIndex of mounted) {\n const item = items[mountedIndex];\n if (!item) continue;\n const spacerSize = (prefix[mountedIndex] ?? 0) - (prefix[cursor] ?? 0);\n if (spacerSize > 0) {\n nodes.push({ kind: 'spacer', size: spacerSize, key: `pad-${cursor}-${mountedIndex}` });\n }\n nodes.push({ kind: 'row', index: mountedIndex, item });\n cursor = mountedIndex + 1;\n }\n const trailingSize = (prefix[itemCount] ?? 0) - (prefix[cursor] ?? 0);\n if (trailingSize > 0) {\n nodes.push({ kind: 'spacer', size: trailingSize, key: `pad-${cursor}-${itemCount}` });\n }\n return nodes;\n}\n\nfunction buildGroupedVirtualNodes(\n index: TableVirtualIndex,\n mounted: ReadonlySet<number>,\n mountedSorted: readonly number[]\n): TableVirtualNode[] {\n const { items, prefix, itemCount } = index;\n const nodes: TableVirtualNode[] = [];\n const selectedHeaders = new Set<number>();\n for (const mountedIndex of mountedSorted) {\n const item = items[mountedIndex];\n const headerIndex =\n item?.kind === 'group'\n ? mountedIndex\n : item?.groupId\n ? index.headerIndexByGroup.get(item.groupId)\n : undefined;\n if (headerIndex != null) selectedHeaders.add(headerIndex);\n }\n\n let cursor = 0;\n for (const headerIndex of [...selectedHeaders].sort((left, right) => left - right)) {\n const header = items[headerIndex];\n if (header?.kind !== 'group' || !header.groupId) continue;\n const groupId = header.groupId;\n const groupEnd = index.groupEndByHeader.get(headerIndex) ?? headerIndex + 1;\n const leadingSize = (prefix[headerIndex] ?? 0) - (prefix[cursor] ?? 0);\n if (leadingSize > 0) {\n nodes.push({ kind: 'spacer', size: leadingSize, key: `pad-${cursor}-${headerIndex}` });\n }\n\n const groupNodes: Array<Extract<TableVirtualNode, { kind: 'spacer' | 'row' }>> = [];\n const mountedMembers = mountedSorted.filter(\n mountedIndex => mountedIndex > headerIndex && mountedIndex < groupEnd\n );\n let memberCursor = headerIndex + 1;\n for (const memberIndex of mountedMembers) {\n const item = items[memberIndex];\n const spacerSize = (prefix[memberIndex] ?? 0) - (prefix[memberCursor] ?? 0);\n if (spacerSize > 0) {\n groupNodes.push({\n kind: 'spacer',\n size: spacerSize,\n key: `group-${groupId}-pad-${memberCursor}-${memberIndex}`,\n });\n }\n if (item?.kind === 'row' && mounted.has(memberIndex)) {\n groupNodes.push({ kind: 'row', index: memberIndex, item });\n }\n memberCursor = memberIndex + 1;\n }\n const trailingSize = (prefix[groupEnd] ?? 0) - (prefix[memberCursor] ?? 0);\n if (trailingSize > 0) {\n groupNodes.push({\n kind: 'spacer',\n size: trailingSize,\n key: `group-${groupId}-pad-${memberCursor}-${groupEnd}`,\n });\n }\n\n nodes.push({ kind: 'group', groupId, headerIndex, nodes: groupNodes });\n cursor = groupEnd;\n }\n\n const trailingSize = (prefix[itemCount] ?? 0) - (prefix[cursor] ?? 0);\n if (trailingSize > 0) {\n nodes.push({ kind: 'spacer', size: trailingSize, key: `pad-${cursor}-${itemCount}` });\n }\n return nodes;\n}\n","import {\n createTableVirtualIndex,\n findTableVirtualIndexAtOffset,\n resolveTableVirtualPlanFromIndex,\n sameTableVirtualPlan,\n tableVirtualItemSizes,\n type TableVirtualItem,\n type TableVirtualIndex,\n type TableVirtualPlan,\n} from './table-virtual-model';\n\nexport interface TableVirtualControllerState {\n enabled: boolean;\n items: readonly TableVirtualItem[];\n pinnedRowIds: ReadonlySet<string>;\n viewport: HTMLElement | null;\n viewportSize: number;\n}\n\nexport interface TableVirtualControllerOptions {\n state: () => TableVirtualControllerState;\n windowChanged: (plan: TableVirtualPlan | null) => void;\n requestAnimationFrame?: (callback: FrameRequestCallback) => number;\n cancelAnimationFrame?: (handle: number) => void;\n}\n\nconst MEASURE_EPSILON_PX = 0.5;\n\n/** Include the card gap in the recycled item's advance, not just its border box.\n * Reads are limited to mounted variable-size cards, never the complete dataset. */\nfunction measuredItemSize(element: HTMLElement, blockSize: number): number {\n return (\n blockSize +\n (element.getAttribute('data-responsive-card') === 'true'\n ? parseFloat(getComputedStyle(element).marginBlockEnd) || 0\n : 0)\n );\n}\n\n/** Binds viewport scroll/resize to a recycled row window. Scroll offset stays off render state. */\nexport class TableVirtualController {\n private connected = false;\n private connectedViewport: HTMLElement | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private measurementObserver: ResizeObserver | null = null;\n private measurementTargets = new Set<HTMLElement>();\n private viewportWidth = 0;\n private viewportSize = 0;\n private frame: number | null = null;\n private measures = new Map<string, number>();\n private measuredIds = new Set<string>();\n private plan: TableVirtualPlan | null = null;\n private index: TableVirtualIndex | null = null;\n private indexedItems: readonly TableVirtualItem[] | null = null;\n private indexDirty = true;\n private scrollOffset = 0;\n private scrollAtEnd = false;\n private scrollDirection: 'backward' | 'forward' | 'none' = 'none';\n private pendingReset = false;\n private readonly raf: (callback: FrameRequestCallback) => number;\n private readonly caf: (handle: number) => void;\n\n constructor(private readonly options: TableVirtualControllerOptions) {\n this.raf =\n options.requestAnimationFrame ??\n (typeof requestAnimationFrame === 'function'\n ? callback => requestAnimationFrame(callback)\n : callback => setTimeout(callback, 16) as unknown as number);\n this.caf =\n options.cancelAnimationFrame ??\n (typeof cancelAnimationFrame === 'function'\n ? handle => cancelAnimationFrame(handle)\n : handle => clearTimeout(handle));\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.cancelFrame();\n this.unbindViewport();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const { viewport, enabled } = this.options.state();\n if (!enabled || !viewport) {\n this.unbindViewport();\n this.emit(null);\n return;\n }\n if (viewport !== this.connectedViewport) {\n this.unbindViewport();\n this.connectedViewport = viewport;\n this.viewportWidth = viewport.clientWidth;\n this.viewportSize = viewport.clientHeight;\n this.scrollOffset = viewport.scrollTop;\n viewport.addEventListener('scroll', this.handleScroll, { passive: true });\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.handleViewportResize);\n this.resizeObserver.observe(viewport);\n }\n }\n this.sync();\n }\n\n schedule = (): void => {\n if (!this.connected || this.frame !== null) return;\n this.frame = this.raf(() => {\n this.frame = null;\n this.sync();\n });\n };\n\n /** Drop cached heights after column, density, or wrap geometry changes. */\n invalidateMeasures(): void {\n this.measures.clear();\n this.measuredIds.clear();\n this.indexDirty = true;\n this.schedule();\n }\n\n /** Rebuild from a new index and pin the viewport to the start. */\n resetToTop(): void {\n this.scrollAtEnd = false;\n this.pendingReset = true;\n this.measures.clear();\n this.measuredIds.clear();\n this.indexDirty = true;\n this.scrollOffset = 0;\n this.scrollDirection = 'none';\n const viewport = this.connectedViewport ?? this.options.state().viewport;\n if (viewport) viewport.scrollTop = 0;\n this.schedule();\n }\n\n sizeFor(item: TableVirtualItem): number {\n if (!item.variableSize) return item.estimatedSize;\n return this.measures.get(item.id) ?? item.estimatedSize;\n }\n\n currentPlan(): TableVirtualPlan | null {\n return this.plan;\n }\n\n currentViewportSize(): number {\n return this.viewportSize;\n }\n\n /** Reveal a supplied row without requiring its recycled DOM node to exist first. */\n scrollRowIntoView(rowId: string, contentOffset = 0, stickyInset = 0): boolean {\n const state = this.options.state();\n const viewport = this.connectedViewport ?? state.viewport;\n if (!state.enabled || !viewport) return false;\n\n const index = this.ensureIndex(state.items);\n const rowIndex = index.rowIndexById.get(rowId);\n if (rowIndex == null) return false;\n\n const item = state.items[rowIndex];\n const groupHeaderIndex = item?.groupId ? index.headerIndexByGroup.get(item.groupId) : undefined;\n const groupInset = groupHeaderIndex == null ? 0 : (index.sizes[groupHeaderIndex] ?? 0);\n const leadingInset = Math.max(0, stickyInset) + groupInset;\n const itemStart = Math.max(0, contentOffset) + (index.prefix[rowIndex] ?? 0);\n const itemEnd = Math.max(0, contentOffset) + (index.prefix[rowIndex + 1] ?? itemStart);\n const viewportSize = this.viewportSize || state.viewportSize || viewport.clientHeight || 0;\n const currentOffset = viewport.scrollTop;\n const visibleStart = currentOffset + leadingInset;\n const visibleEnd = currentOffset + viewportSize;\n let nextOffset: number;\n\n if (itemStart < visibleStart) nextOffset = itemStart - leadingInset;\n else if (itemEnd > visibleEnd) nextOffset = itemEnd - viewportSize;\n else return true;\n\n const maxOffset = Math.max(0, Math.max(0, contentOffset) + index.totalSize - viewportSize);\n nextOffset = Math.max(0, Math.min(nextOffset, maxOffset));\n this.scrollDirection =\n nextOffset > currentOffset ? 'forward' : nextOffset < currentOffset ? 'backward' : 'none';\n viewport.scrollTop = nextOffset;\n this.scrollOffset = viewport.scrollTop;\n this.sync();\n return true;\n }\n\n /** Measure painted rows and correct scroll when estimates were wrong. */\n collectMeasurements(root: ParentNode | null): void {\n if (!root || !this.connected || !this.options.state().enabled) return;\n const painted = root.querySelectorAll<HTMLElement>('[data-virtual-measure=\"true\"]');\n this.syncMeasurementTargets(painted);\n if (painted.length === 0) return;\n\n const state = this.options.state();\n const measurements: Array<{ id: string; height: number }> = [];\n painted.forEach(element => {\n const id = element.getAttribute('data-virtual-id');\n if (!id || this.measuredIds.has(id)) return;\n measurements.push({\n id,\n height: measuredItemSize(element, element.getBoundingClientRect().height),\n });\n });\n this.applyMeasurements(state.items, measurements);\n }\n\n private applyMeasurements(\n items: readonly TableVirtualItem[],\n measurements: readonly { id: string; height: number }[]\n ): void {\n if (measurements.length === 0) return;\n const currentIndex = this.ensureIndex(items);\n const prefixBefore = currentIndex.prefix;\n const viewport = this.connectedViewport;\n const scrollTop = viewport?.scrollTop ?? this.scrollOffset;\n const anchorIndex = findTableVirtualIndexAtOffset(prefixBefore, scrollTop);\n const anchorOffset = prefixBefore[anchorIndex] ?? 0;\n let changed = false;\n for (const { id, height } of measurements) {\n if (!Number.isFinite(height) || height <= 0) continue;\n const itemIndex = currentIndex.itemIndexById.get(id);\n const item = itemIndex == null ? undefined : items[itemIndex];\n if (!item?.variableSize) continue;\n this.measuredIds.add(id);\n const previous = this.measures.get(id);\n if (Math.abs(item.estimatedSize - height) < MEASURE_EPSILON_PX) {\n if (previous != null) {\n this.measures.delete(id);\n changed = true;\n }\n continue;\n }\n if (previous != null && Math.abs(previous - height) < MEASURE_EPSILON_PX) continue;\n this.measures.set(id, height);\n changed = true;\n }\n if (!changed) return;\n this.indexDirty = true;\n const prefixAfter = this.ensureIndex(items).prefix;\n const nextAnchor = prefixAfter[anchorIndex] ?? 0;\n const delta = nextAnchor - anchorOffset;\n if (viewport && this.scrollAtEnd) {\n // Newly measured cards can grow below the current anchor. A user who\n // reached the end should stay there, not stop before the final records.\n viewport.scrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight);\n this.scrollOffset = viewport.scrollTop;\n } else if (viewport && Math.abs(delta) >= MEASURE_EPSILON_PX) {\n viewport.scrollTop = Math.max(0, viewport.scrollTop + delta);\n this.scrollOffset = viewport.scrollTop;\n }\n this.sync();\n }\n\n private syncMeasurementTargets(elements: NodeListOf<HTMLElement>): void {\n if (typeof ResizeObserver === 'undefined') return;\n if (!this.measurementObserver) {\n this.measurementObserver = new ResizeObserver(entries => {\n const state = this.options.state();\n const measurements = entries.map(entry => ({\n id: (entry.target as HTMLElement).getAttribute('data-virtual-id') ?? '',\n height: measuredItemSize(\n entry.target as HTMLElement,\n entry.borderBoxSize[0]?.blockSize ?? entry.contentRect.height\n ),\n }));\n this.applyMeasurements(state.items, measurements);\n });\n }\n const next = new Set(elements);\n for (const element of this.measurementTargets) {\n if (!next.has(element)) this.measurementObserver.unobserve(element);\n }\n for (const element of next) {\n if (!this.measurementTargets.has(element)) this.measurementObserver.observe(element);\n }\n this.measurementTargets = next;\n }\n\n private readonly handleViewportResize = (entries: ResizeObserverEntry[]): void => {\n const entry = entries.find(candidate => candidate.target === this.connectedViewport);\n const width = entry?.contentRect.width ?? this.connectedViewport?.clientWidth ?? 0;\n const size = entry?.contentRect.height ?? this.connectedViewport?.clientHeight ?? 0;\n const sizeChanged = size !== this.viewportSize;\n this.viewportSize = size;\n if (width !== this.viewportWidth) {\n this.viewportWidth = width;\n const items = this.options.state().items;\n const hasVariableSize =\n this.indexedItems === items && this.index\n ? this.index.hasVariableSize\n : items.some(item => item.variableSize);\n if (hasVariableSize) this.invalidateMeasures();\n else if (sizeChanged) this.schedule();\n return;\n }\n if (sizeChanged) this.schedule();\n };\n\n private readonly handleScroll = (): void => {\n const viewport = this.connectedViewport;\n if (viewport) {\n const nextOffset = viewport.scrollTop;\n this.scrollAtEnd =\n !!this.index?.hasVariableSize &&\n nextOffset > 0 &&\n nextOffset + viewport.clientHeight >= viewport.scrollHeight - 1;\n this.scrollDirection =\n nextOffset > this.scrollOffset\n ? 'forward'\n : nextOffset < this.scrollOffset\n ? 'backward'\n : this.scrollDirection;\n this.scrollOffset = nextOffset;\n }\n this.schedule();\n };\n\n private sync(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (!state.enabled) {\n this.emit(null);\n return;\n }\n\n if (this.pendingReset) {\n this.scrollOffset = 0;\n if (state.viewport) state.viewport.scrollTop = 0;\n this.pendingReset = false;\n }\n const index = this.ensureIndex(state.items);\n const plan = resolveTableVirtualPlanFromIndex(index, {\n scrollOffset: this.scrollOffset,\n viewportSize: this.viewportSize || state.viewportSize,\n scrollDirection: this.scrollDirection,\n pinnedRowIds: state.pinnedRowIds,\n });\n this.emit(plan);\n }\n\n private emit(plan: TableVirtualPlan | null): void {\n if (sameTableVirtualPlan(this.plan, plan)) return;\n this.plan = plan;\n this.options.windowChanged(plan);\n }\n\n private ensureIndex(items: readonly TableVirtualItem[]): TableVirtualIndex {\n if (!this.indexDirty && this.index && this.indexedItems === items) return this.index;\n // Appending/replacing application data must not opt into following new rows.\n if (this.indexedItems !== items) this.scrollAtEnd = false;\n if (this.indexedItems !== items && (this.measures.size > 0 || this.measuredIds.size > 0)) {\n const itemIds = new Set(items.map(item => item.id));\n for (const id of this.measures.keys()) {\n if (!itemIds.has(id)) this.measures.delete(id);\n }\n for (const id of this.measuredIds) {\n if (!itemIds.has(id)) this.measuredIds.delete(id);\n }\n }\n this.indexedItems = items;\n this.index = createTableVirtualIndex(items, tableVirtualItemSizes(items, this.measures));\n this.indexDirty = false;\n return this.index;\n }\n\n private unbindViewport(): void {\n this.scrollAtEnd = false;\n this.connectedViewport?.removeEventListener('scroll', this.handleScroll);\n this.connectedViewport = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.measurementObserver?.disconnect();\n this.measurementObserver = null;\n this.measurementTargets.clear();\n this.viewportWidth = 0;\n this.viewportSize = 0;\n }\n\n private cancelFrame(): void {\n if (this.frame === null) return;\n this.caf(this.frame);\n this.frame = 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","const DIRECTIONAL_TAGS = new Set([\n 'DS-SELECT',\n 'DS-MENU',\n 'DS-FILTER-MENU',\n 'INPUT',\n 'SELECT',\n 'TEXTAREA',\n]);\n\nconst DIRECTIONAL_ROLES = new Set(['slider', 'combobox', 'listbox']);\n\ninterface ShortcutPathNode {\n tagName?: string;\n nodeType?: number;\n isContentEditable?: boolean;\n assignedSlot?: unknown;\n parentNode?: unknown;\n getRootNode?: () => unknown;\n getAttribute?: (name: string) => string | null;\n}\n\n/** True when Left/Right should stay with an editable or choice control. */\nexport function paginationShortcutBlockedByPath(path: readonly unknown[]): boolean {\n return path.some(node => {\n if (!node || typeof node !== 'object') return false;\n const element = node as ShortcutPathNode;\n if (element.tagName && DIRECTIONAL_TAGS.has(element.tagName)) return true;\n if (element.isContentEditable) return true;\n const role = element.getAttribute?.('role');\n return role != null && DIRECTIONAL_ROLES.has(role);\n });\n}\n\nexport function isDocumentRootNode(node: unknown): boolean {\n if (!node || typeof node !== 'object') return false;\n const element = node as ShortcutPathNode;\n if (element.nodeType === 9) return true;\n return element.tagName === 'BODY' || element.tagName === 'HTML';\n}\n\n/** True when `ancestor` contains `descendant` in the composed tree, including slots. */\nexport function composedContains(ancestor: unknown, descendant: unknown): boolean {\n if (!ancestor || !descendant || ancestor === descendant) return false;\n const seen = new Set<unknown>();\n let current: unknown = descendant;\n while (current && !seen.has(current)) {\n seen.add(current);\n if (current === ancestor) return true;\n current = composedParent(current);\n }\n return false;\n}\n\n/**\n * Window-level pagination arrows apply when focus is inside the table or on a\n * containing page scroller (for example ShellApp's routed-content region).\n * Document body stays with the host app so it can forward a single event.\n */\nexport function shouldHandleContainingPagePaginationShortcut(input: {\n origin: unknown;\n table: unknown;\n eventPath: readonly unknown[];\n}): boolean {\n if (isDocumentRootNode(input.origin)) return false;\n if (input.eventPath.includes(input.table) || composedContains(input.table, input.origin)) {\n return true;\n }\n return composedContains(input.origin, input.table);\n}\n\nfunction composedParent(node: unknown): unknown {\n if (!node || typeof node !== 'object') return null;\n if (typeof ShadowRoot !== 'undefined' && node instanceof ShadowRoot) {\n return node.host;\n }\n const element = node as ShortcutPathNode;\n if (element.assignedSlot) return element.assignedSlot;\n if (element.parentNode) return element.parentNode;\n const root = element.getRootNode?.();\n if (root && typeof root === 'object' && 'host' in root) {\n return (root as { host?: unknown }).host ?? null;\n }\n return null;\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 connectedHost: HTMLElement | null = null;\n private connectedSurface: HTMLElement | null = null;\n private scrollRoot: HTMLElement | Window | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private ancestorMutationObserver: MutationObserver | null = null;\n private connectionFrame: number | null = null;\n private metrics: TableViewportFitMetrics | null = null;\n private insetBlockStart: string | number | null = null;\n private insetBlockEnd: string | number | null = null;\n\n constructor(private readonly options: TableViewportFitControllerOptions) {}\n\n connect(): void {\n this.connected = true;\n this.refresh();\n // WebKit can finish attaching an upgraded custom element after its first\n // layout read. Verify the owning scrollport on the next animation frame.\n if (this.connectionFrame === null && typeof requestAnimationFrame !== 'undefined') {\n this.connectionFrame = requestAnimationFrame(() => {\n this.connectionFrame = null;\n this.refresh();\n });\n }\n }\n\n disconnect(): void {\n this.connected = false;\n if (this.connectionFrame !== null) cancelAnimationFrame(this.connectionFrame);\n this.connectionFrame = null;\n this.disconnectRuntime();\n this.clearGeometry();\n }\n\n refresh(forceGeometry = true): void {\n if (!this.connected) return;\n if (!this.options.enabled()) {\n this.disconnectRuntime();\n this.clearGeometry();\n return;\n }\n\n const { host, surface } = this.options.elements();\n if (!host) return;\n const elementsChanged = host !== this.connectedHost || surface !== this.connectedSurface;\n // A web component can be reconnected under a different scroll owner while\n // retaining the same host and rendered surface nodes.\n const nextScrollRoot =\n elementsChanged || forceGeometry || !this.scrollRoot\n ? this.findScrollRoot(host)\n : this.scrollRoot;\n const rootChanged = nextScrollRoot !== this.scrollRoot;\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.connectedHost = host;\n this.connectedSurface = surface;\n if (elementsChanged || rootChanged || forceGeometry) this.observeAncestorInsets(host);\n const insets = this.options.insets();\n const insetsChanged =\n insets.blockStart !== this.insetBlockStart || insets.blockEnd !== this.insetBlockEnd;\n this.insetBlockStart = insets.blockStart;\n this.insetBlockEnd = insets.blockEnd;\n if (forceGeometry || elementsChanged || rootChanged || insetsChanged) 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) - 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.connectedHost = null;\n this.connectedSurface = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.ancestorMutationObserver?.disconnect();\n this.ancestorMutationObserver = null;\n this.insetBlockStart = null;\n this.insetBlockEnd = null;\n }\n\n private observeAncestorInsets(host: HTMLElement): void {\n this.ancestorMutationObserver?.disconnect();\n this.ancestorMutationObserver = null;\n if (typeof MutationObserver === 'undefined') return;\n\n // A page shell can replace its inset class after the table first measures.\n // Its inherited CSS variable then changes without resizing the scrollport,\n // so ResizeObserver alone cannot update the reserved table height.\n const observer = new MutationObserver(this.sync);\n let ancestor = this.composedParent(host);\n while (ancestor) {\n observer.observe(ancestor, { attributes: true });\n if (ancestor === document.documentElement) break;\n ancestor = this.composedParent(ancestor);\n }\n this.ancestorMutationObserver = observer;\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) return;\n\n const hostRect = host.getBoundingClientRect();\n const scrollportRect =\n 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 if (surface) {\n this.setProperty(\n surface,\n '--_table-viewport-fit-current-block-size',\n `${next.currentBlockSize}px`\n );\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|chrome|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-chrome),\n.ds-interaction-fill--on-chrome {\n --ds-interaction-hover: var(--color-chrome-interaction-hover);\n --ds-interaction-pressed: var(--color-chrome-interaction-pressed);\n --ds-interaction-active: var(--color-chrome-interaction-active);\n --ds-focus-ring-color: var(--color-chrome-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/* The associated surface stays visible after activation. Selection and ARIA\n * remain owned by the component; only the pressed overlay is retained here. */\n:host(.ds-interaction-fill.ds-interaction-fill--surface-open:not(:disabled))::after,\n.ds-interaction-fill.ds-interaction-fill--surface-open:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\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: var(--ds-interaction-border-width) solid var(--ds-forced-color-control-boundary);\n outline-offset: calc(-1 * var(--ds-interaction-border-width));\n }\n\n :host(\n .ds-interaction-fill--surface-open:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )\n )::after,\n .ds-interaction-fill--surface-open:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )::after {\n outline: var(--dimension-stroke-width-025) dashed var(--ds-forced-color-control-boundary);\n outline-offset: calc(-1 * var(--dimension-stroke-width-025));\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(\n .ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )\n )::after,\n .ds-interaction-fill:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(\n .ds-focus-ring--visible\n )::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/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/forced-colors.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/* Keep size containment away from the recycled scrollport (WebKit). */\n.ds-table__caption-bar {\n container-type: inline-size;\n container-name: ds-table;\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::slotted([slot='header']) {\n inline-size: 100%;\n min-inline-size: 0;\n}\n\n::slotted([slot='caption-trailing']) {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n}\n\n::slotted([slot='alternate-view']) {\n display: block;\n inline-size: 100%;\n block-size: 100%;\n min-block-size: 0;\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__card-label {\n display: none;\n padding-inline: var(--_table-cell-track-padding-inline);\n}\n\n.ds-table--responsive-cards .ds-table__frame[data-narrow='true'] ds-text.ds-table__card-label {\n display: block;\n}\n\nds-text.ds-table__cell-track {\n display: flex;\n}\n\n.ds-table__cell--text-wrap ds-text.ds-table__cell-track--text,\n.ds-table__cell--icon-text-wrap ds-text.ds-table__cell-track--text,\n.ds-table__cell--score-text-wrap ds-text.ds-table__cell-track--text {\n display: block;\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\n/*\n * The public :where() wrap recipe has zero specificity, so ds-text's\n * variant line-height would win inside the component. Reassert on wrapping\n * cell layout classes so extra primary and secondary lines occupy later tracks.\n */\n.ds-table__cell--text-wrap.ds-table__cell--text-single .ds-table__cell-primary,\n.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-primary,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-single .ds-table__cell-primary,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-primary,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-single .ds-table__cell-primary,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-primary {\n line-height: var(--_table-wrap-primary-line-height);\n padding-block: var(--_table-wrap-primary-padding-block);\n}\n\n.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-copy,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-copy,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-copy {\n gap: 0;\n}\n\n.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-secondary,\n.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-secondary,\n.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-secondary {\n line-height: var(--_table-wrap-secondary-line-height);\n padding-block: var(--_table-wrap-secondary-padding-block);\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--text-multi ds-text.ds-table__cell-secondary,\n.ds-table__cell--text-triple ds-text.ds-table__cell-secondary,\n.ds-table__cell--text-triple ds-text.ds-table__cell-tertiary,\n.ds-table__cell--icon-text-multi ds-text.ds-table__cell-secondary,\n.ds-table__cell--icon-text-triple ds-text.ds-table__cell-secondary,\n.ds-table__cell--icon-text-triple ds-text.ds-table__cell-tertiary,\n.ds-table__cell--score-text-multi ds-text.ds-table__cell-secondary,\n.ds-table__cell--score-text-triple ds-text.ds-table__cell-secondary,\n.ds-table__cell--score-text-triple ds-text.ds-table__cell-tertiary,\n.ds-table__cell--primary-text ds-text.ds-table__cell-secondary {\n min-block-size: var(--_table-cell-track-min-block-size);\n}\n\nds-text.ds-table__cell-run,\nds-text.ds-table__cell-run-separator {\n display: flex;\n}\n\nds-text.ds-table__group-label,\nds-text.ds-table__group-count,\nds-text.ds-table__group-accessory,\nds-text.ds-table__group-accessory-separator {\n display: flex;\n align-items: center;\n}\n\nds-text.ds-table__group-count {\n min-block-size: var(--_table-cell-track-min-block-size);\n padding-inline-end: var(--dimension-space-050);\n}\n\n.ds-table__cell-tag-stack--tag-with-text ds-text.ds-table__cell-tag-text,\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 min-block-size: var(--_table-cell-track-min-block-size);\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\n.ds-table__caption-customizer {\n position: relative;\n display: flex;\n align-items: center;\n min-inline-size: 0;\n}\n\n.ds-table__caption-mode-switcher {\n display: flex;\n align-items: center;\n}\n\n.ds-table__caption-customizer--loading > ds-tooltip ds-button-unfilled {\n visibility: hidden;\n}\n\n.ds-table__caption-customizer > ds-skeleton {\n position: absolute;\n inset: 0;\n}\n\n.ds-table__caption-bar:has([slot='header-after']) {\n flex-direction: column;\n align-items: stretch;\n block-size: auto;\n padding: 0;\n gap: 0;\n}\n\n.ds-table__caption-bar:has([slot='header-after']) .ds-table__caption-content {\n flex: 0 0 auto;\n min-block-size: var(--dimension-size-600);\n padding: var(--dimension-space-100);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n deriveTableSelectionState,\n formatTableResultSummary,\n formatTableTotalSummary,\n hasOwnedTableFooterSlot,\n isTableCellAction,\n nextDataSortState,\n tableColumnSize,\n tableModelIssues,\n TABLE_GROUP_HERO_SCORE_PRESENTATION,\n tableRows,\n toggleAllLoadedTableRows,\n toggleTableGroupCollapsed,\n toggleTableGroupSelection,\n nextTableGroupsCollapsed,\n toggleTableRowSelection,\n} from './table-model';\nimport { createTableRenderModel, type TableRenderModel } from './table-render-model';\nimport {\n isRenderableTableActionMenu,\n nextTableActionMenuElementId,\n tableActionMenuSections,\n tableActionTriggerId,\n} from './table-action-menu';\nimport { resolveTableVisibleColumns } from './table-column-customizer';\nimport { createTableCaptionController, createTableCaptionState } from './table-caption-controller';\nimport { createTableEditingController, type TableEditingState } from './table-editing-controller';\nimport { resolveTableTruncateTrack, tableTruncateLabel } from './table-truncate';\nimport { renderTableRow as renderTableRowView } from './table-row-view';\nimport { TableBodyRenderer } from './table-body-renderer';\nimport { tableHeaderBands, tablePinnedColumns, tableSpanModel } from './table-structure';\nimport type { TableCellSpan, TableCellRange, TableCellsChangeDetail } from './table-types';\nimport { renderTableSkeletonBody } from './table-skeleton-view';\nimport { renderTableLoadContent } from './table-load-view';\nimport {\n isTableCardViewport,\n TABLE_CARD_VIEWPORT_BREAKPOINT,\n TableLayoutController,\n} from './table-layout-controller';\nimport { TableLoadController } from './table-load-controller';\nimport { TableGroupLoadController } from './table-group-load-controller';\nimport {\n estimateTableRowBlockSize,\n flattenTableVirtualItems,\n resolveTableVirtualPlan,\n TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL,\n TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY,\n TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING,\n type TableVirtualItem,\n type TableVirtualPlan,\n} from './table-virtual-model';\nimport { TableVirtualController } from './table-virtual-controller';\nimport type { PaginationChangeDetail } from '../Pagination/pagination-types';\nimport type { MenuItemData } from '../Menu/menu-types';\nimport { resolvePaginationState } from '../Pagination/pagination-model';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport { isElementTruncated } from '../../utils/is-element-truncated';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\nimport { resolveTableFitPageSize } from './table-pagination-fit';\nimport { createTableHighlightMatcher, type TableHighlightMatcher } from './table-highlight';\nimport {\n paginationShortcutBlockedByPath,\n shouldHandleContainingPagePaginationShortcut,\n} from './table-pagination-shortcut';\nimport {\n TableViewportFitController,\n type TableViewportFitMetrics,\n} from './table-viewport-fit-controller';\nimport type {\n TableCaptionVisibility,\n TableChromeLayout,\n TableCellActionDetail,\n TableColumn,\n DataFieldsConfigChangeDetail,\n TableDataMode,\n TableDataModeChangeDetail,\n DataGroup,\n TableGroupCollapseChangeDetail,\n TableGroupLoadMoreDetail,\n DataGroupingState,\n TableLoadMoreDetail,\n TableLoadMoreMode,\n TablePaginationState,\n TableRow,\n TableRowActivateDetail,\n TableSelectionChangeDetail,\n TableSelectionMode,\n DataSortChangeDetail,\n DataSortState,\n} from './table-types';\n\nconst TABLE_FOOTER_SLOT_LEADING = 1;\nconst TABLE_FOOTER_SLOT_COPY = 2;\nconst TABLE_FOOTER_SLOT_TRAILING = 4;\nconst TABLE_NON_VIRTUAL_WINDOW_THRESHOLD = 50;\n\n@Component({\n tag: 'ds-table',\n styleUrls: ['../../utils/focus-ring.css', '../../utils/interaction-fill.css', 'Table.css'],\n scoped: true,\n})\nexport class Table {\n @Element() el!: HTMLElement;\n /** Stable column definitions. Assign through JavaScript. */\n @Prop() columns: TableColumn[] = [];\n /** Opt-in native card presentation below the 768px browser viewport breakpoint. */\n @Prop() responsiveLayout: 'scroll' | 'cards' = 'scroll';\n /** Keep all table chrome contained, or let the caption and footer span edge to edge around an inset data frame. */\n @Prop() chromeLayout: TableChromeLayout = 'contained';\n /** Explicit report merges; invalid combinations leave the original cells visible. */\n @Prop() cellSpans: TableCellSpan[] = [];\n /** Table is read-only; edit uses per-cell pencil buttons; grid adds cell selection and keyboard navigation. Grouped tables remain read-only. */\n @Prop() interactionMode: 'table' | 'edit' | 'grid' = 'table';\n /** Controlled rectangular cell selection, independent of row checkbox selection. */\n @Prop() cellRange: TableCellRange | null = null;\n @Event() dsCellRangeChange!: EventEmitter<TableCellRange>;\n @Event() dsCellsChange!: EventEmitter<TableCellsChangeDetail>;\n /** Additional toggle options in the column customizer. */\n @Prop() customizeOptions: MenuItemData[] = [];\n @Event() dsCustomizeOptionChange!: EventEmitter<string>;\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: DataGroup[] = [];\n /** Controlled grouping column. Applications supply groups in their final fixed order. */\n @Prop() grouping: DataGroupingState | null = null;\n /** Controlled member-row sort state. */\n @Prop() sort: DataSortState | null = null;\n /** Controlled collapsed group identities. Groups not listed remain expanded. */\n @Prop() collapsedGroupIds: string[] = [];\n /** Literal terms to highlight in table-owned text cells. Applications still own filtering. */\n @Prop() highlightTerms: string[] = [];\n /** Optional DataSearch field identities that restrict which data-point tracks are highlighted. */\n @Prop() highlightFieldIds: 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 /** Replace only the data frame with application-owned content; caption and footer remain shared. */\n @Prop() alternateView: boolean = false;\n /** Fires after a table/alternate-view switch has patched the frame and footer. */\n @Event() dsAlternateViewRendered!: EventEmitter<{ alternateView: boolean }>;\n /**\n * Opt in to the table-owned column customizer. The `columns` prop remains the\n * catalog; hidden and ordered columns are controlled separately. The trigger\n * opens the shared Menu of live show/hide switch rows.\n */\n @Prop() columnCustomizer: boolean = false;\n /** Hide only the built-in Customize trigger when an external preferences surface owns it. */\n /** Remove borders from table-owned caption controls. */\n @Prop() captionControlsBorderless: boolean = false;\n @Prop() hideColumnCustomizerTrigger: boolean = false;\n /** Controlled hidden data-column identities. Action ids are ignored. */\n @Prop() hiddenFieldIds: string[] = [];\n /** Controlled data-column identities in display order. Omitted ids append in catalog order. */\n @Prop() fieldOrder: string[] = [];\n /** Controlled user-pinned data-column identities. Hidden columns retain their pin state. */\n @Prop() pinnedFieldIds: string[] = [];\n /**\n * Optional result summary footer. When both `displayedCount` and `totalCount`\n * are finite numbers, infinite mode shows “Displaying {displayed} of {total}”.\n * Virtual mode ignores `displayedCount` and derives its total from the\n * complete supplied rows; a mismatched `totalCount` emits a warning.\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 /** Supports the {total} placeholder. Used when dataMode is virtual. */\n @Prop() resultTotalSummaryLabel: string = TABLE_VIRTUAL_TOTAL_SUMMARY_LABEL;\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 /**\n * Identity of the interactive row whose associated surface is visible.\n * Holds its pressed wash independently of checkbox selection. Keep the ID\n * through exit motion and clear it after close; the application owns toggling\n * and switching the surface. Off-window identities survive virtualization.\n */\n @Prop() surfaceOpenRowId: string | undefined;\n\n /** Initial loading state. Existing rows stay visible; incremental loading uses loadingMore. */\n @Prop() loading: boolean = false;\n /** Replace opted-in table-owned caption controls with same-size visual skeletons. */\n @Prop() chromeLoading: 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. Virtual mode recycles row DOM only. */\n @Prop() dataMode: TableDataMode = 'infinite';\n /** Opt in to the table-owned control for choosing between supported data modes. */\n @Prop() dataModeSwitcher: boolean = false;\n @Prop() dataModeSwitcherLabel: string = 'Change table variation';\n @Prop() dataModeMenuLabel: string = 'Table variation';\n @Prop() infiniteModeLabel: string = 'Infinite scroll';\n @Prop() paginationModeLabel: string = 'Pagination + Infinite groups';\n @Prop() virtualModeLabel: string = 'Virtual scroll';\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 =\n '{count} more rows loaded in {group}. {loaded} of {total} rows loaded.';\n\n @Event() dsSortChange!: EventEmitter<DataSortChangeDetail>;\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 @Event() dsFieldsConfigChange!: EventEmitter<DataFieldsConfigChangeDetail>;\n @Event() dsDataModeChange!: EventEmitter<TableDataModeChangeDetail>;\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 headerUsesToolbar = false;\n @State() private captionTrailingPresent = false;\n @State() private footerSlotPresence = 0;\n @State() private fitPageSize: number | undefined;\n @State() private actionMenu: { rowId: string; columnId: string } | null = null;\n @State() private actionMenuInitialFocusVisible = false;\n @State() private actionMenuSurface: { rowId: string; columnId: string } | null = null;\n @State() private truncateTooltipLabel = '';\n @State() private captionCompact = false;\n @State() private narrowViewport = false;\n @State() private captionMenus = createTableCaptionState();\n @State() private virtualWindow: TableVirtualPlan | null = null;\n @State() private cellInteraction: TableEditingState = { activeCell: null, editingCell: null };\n\n private readonly actionMenuElementId = nextTableActionMenuElementId();\n private structureCache?: {\n columns: TableColumn[];\n rows: TableRow[];\n spans: TableCellSpan[];\n selectable: boolean;\n grouped: boolean;\n windowed: boolean;\n grid: boolean;\n pins: ReturnType<typeof tablePinnedColumns>;\n bands: ReturnType<typeof tableHeaderBands>;\n merges: ReturnType<typeof tableSpanModel>;\n };\n\n private get structure() {\n const columns = this.visibleColumns;\n const model = this.createRenderModel();\n const cached = this.structureCache;\n const windowed = this.rowWindowingEnabled;\n const grid = this.interactionMode !== 'table';\n if (\n cached &&\n cached.columns === columns &&\n cached.rows === this.rows &&\n cached.spans === this.cellSpans &&\n cached.selectable === model.selectable &&\n cached.grouped === model.grouped &&\n cached.windowed === windowed &&\n cached.grid === grid\n )\n return cached;\n return (this.structureCache = {\n columns,\n rows: this.rows,\n spans: this.cellSpans,\n selectable: model.selectable,\n grouped: model.grouped,\n windowed,\n grid,\n pins: tablePinnedColumns(columns, model.selectable),\n bands: tableHeaderBands(columns, model.selectable, model.elasticSpacerIndex),\n merges: tableSpanModel(this.cellSpans, this.rows, columns, {\n windowed,\n grouped: model.grouped,\n grid,\n selectable: model.selectable,\n spacer: model.elasticSpacerIndex,\n }),\n });\n }\n\n private headerId(columnId: string): string {\n return `${this.actionMenuElementId}-header-${encodeURIComponent(columnId)}`;\n }\n\n private columnBandId(columnId: string): string | undefined {\n const model = this.createRenderModel();\n const index = this.visibleColumns.findIndex(column => column.id === columnId);\n const lane =\n index +\n 1 +\n Number(model.selectable) +\n Number(model.elasticSpacerIndex != null && index >= model.elasticSpacerIndex);\n const band = this.structure.bands.find(\n band => band.label && lane >= band.start && lane < band.start + band.span\n );\n return band ? `${this.actionMenuElementId}-${band.key}` : undefined;\n }\n private truncateTooltipEl?: HTMLDsTooltipElement;\n private truncateAnchor: HTMLElement | null = null;\n private truncateTooltipBound = false;\n private focusedRowId: string | null = null;\n private virtualRenderFocus: HTMLElement | null = null;\n private renderedAlternateView: boolean | null = null;\n private virtualItems: TableVirtualItem[] = [];\n private visibleColumnsCache: {\n columns: TableColumn[];\n columnCustomizer: boolean;\n hiddenFieldIds: string[];\n fieldOrder: string[];\n pinnedFieldIds: string[];\n value: TableColumn[];\n } | null = null;\n private renderModelCache: {\n columns: TableColumn[];\n rows: TableRow[];\n groups: DataGroup[];\n grouped: boolean;\n selectionMode: TableSelectionMode;\n selectedRowIds: string[];\n collapsedGroupIds: string[];\n virtualCounts: boolean;\n value: TableRenderModel;\n } | null = null;\n private highlightMatcherCache: {\n terms: string[];\n value: TableHighlightMatcher;\n } | null = null;\n private virtualItemsCache: {\n columns: TableColumn[];\n rows: TableRow[];\n groups: DataGroup[];\n grouped: boolean;\n collapsedGroupIds: string[];\n } | null = null;\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 modelWarningQueued = false;\n private initialModelWarningFrame: number | undefined;\n private hasLoaded = false;\n private renderedModel: TableRenderModel | null = null;\n private stickyGroupConnected = false;\n private headerSlotObserver: MutationObserver | null = null;\n private footerSlotObserver: MutationObserver | null = null;\n private captionCompactDisconnect: (() => void) | undefined;\n private fitResizeObserver: ResizeObserver | null = null;\n private fitObservedViewport: HTMLElement | null = null;\n private fitObservedTable: HTMLTableElement | null = null;\n private fitMeasurementPending = false;\n private cardViewportQuery: MediaQueryList | null = null;\n private readonly editingController = createTableEditingController({\n host: () => this.el,\n state: () => ({\n rows: this.rows,\n columns: this.visibleColumns,\n mode: this.grouped ? 'table' : this.interactionMode,\n loading: this.loading,\n cellRange: this.cellRange,\n }),\n interaction: () => this.cellInteraction,\n change: patch => {\n this.cellInteraction = { ...this.cellInteraction, ...patch };\n },\n rangeChange: range => {\n this.dsCellRangeChange.emit(range);\n },\n cellsChange: detail => {\n this.dsCellsChange.emit(detail);\n },\n announce: message => {\n this.announcement = message;\n },\n focusRow: rowId => {\n this.focusedRowId = rowId;\n },\n revealRow: rowId => this.scrollRowIntoView(rowId),\n findRow: rowId => this.findRenderedRow(rowId),\n });\n private readonly captionController = createTableCaptionController({\n host: () => this.el,\n state: () => ({\n caption: this.caption,\n captionVisibility: this.captionVisibility,\n headerPresent: this.headerPresent,\n headerUsesToolbar: this.headerUsesToolbar,\n captionTrailingPresent: this.captionTrailingPresent,\n captionCompact: this.captionCompact,\n columnCustomizer: this.columnCustomizer,\n hideColumnCustomizerTrigger: this.hideColumnCustomizerTrigger,\n captionControlsBorderless: this.captionControlsBorderless,\n chromeLoading: this.chromeLoading,\n columns: this.columns,\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: this.fieldOrder,\n pinnedFieldIds: this.pinnedFieldIds,\n customizeOptions: this.customizeOptions,\n dataModeSwitcher: this.dataModeSwitcher,\n dataModeSwitcherLabel: this.dataModeSwitcherLabel,\n dataModeMenuLabel: this.dataModeMenuLabel,\n dataMode: this.dataMode,\n infiniteModeLabel: this.infiniteModeLabel,\n paginationModeLabel: this.paginationModeLabel,\n virtualModeLabel: this.virtualModeLabel,\n }),\n menus: () => this.captionMenus,\n change: patch => {\n this.captionMenus = { ...this.captionMenus, ...patch };\n },\n headerSlotChange: () => this.syncHeaderSlotPresence(),\n fieldsChange: detail => {\n this.dsFieldsConfigChange.emit(detail);\n },\n dataModeChange: detail => {\n this.dsDataModeChange.emit(detail);\n },\n customizeOptionChange: value => {\n this.dsCustomizeOptionChange.emit(value);\n },\n });\n private readonly bodyRenderer = new TableBodyRenderer();\n private readonly layoutController = new TableLayoutController({\n elements: () => ({\n viewport: this.viewportEl,\n contentTable: this.tableEl,\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 && this.dataMode !== 'virtual',\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 virtualController = new TableVirtualController({\n state: () => ({\n enabled: this.rowWindowingEnabled,\n items: this.virtualItems,\n pinnedRowIds: this.virtualPinnedRowIds(),\n viewport: this.viewportEl,\n viewportSize: this.estimateVirtualViewportSize(),\n }),\n windowChanged: plan => {\n this.virtualWindow = plan;\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.connectCardViewportQuery();\n // Reserve the final viewport-fit height before the first paint. The fitted\n // surface is connected after render, but the host can already resolve its\n // owning scrollport and prevent an initial auto-height frame.\n this.viewportFitController.connect();\n this.incrementalWindowActive = this.hasIncrementalState;\n this.syncHeaderSlotPresence();\n this.syncFooterSlotPresence();\n this.loadController.initialize();\n this.groupLoadController.initialize();\n }\n\n componentDidLoad(): void {\n this.hasLoaded = true;\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.virtualController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFooterSlotObserver();\n this.connectFitObserver();\n this.connectCaptionCompactObserver();\n this.syncFitPageSize();\n this.connectTruncateTooltip();\n this.scheduleInitialModelIssueWarning();\n }\n\n componentWillRender(): void {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n const active = root.activeElement;\n this.virtualRenderFocus =\n this.rowWindowingEnabled &&\n active instanceof HTMLElement &&\n this.tableEl?.contains(active) &&\n active.closest('[data-row-id]')\n ? active\n : null;\n }\n\n componentDidRender(): void {\n // Moving a retained pooled row can clear native focus in Firefox. Restore\n // only the same connected node, without scrolling or stealing external focus.\n const retainedFocus = this.virtualRenderFocus;\n this.virtualRenderFocus = null;\n if (retainedFocus?.isConnected) {\n const root = retainedFocus.getRootNode() as Document | ShadowRoot;\n if (!root.activeElement || root.activeElement === this.el.ownerDocument.body) {\n // Resolve the moved rows' scroll geometry before restoring native focus.\n // WebKit otherwise may reveal the caret using the pre-patch layout even\n // with preventScroll. Preserve both axes within the resulting bounds.\n const viewport = this.viewportEl;\n const top = viewport?.scrollTop ?? 0;\n const left = viewport?.scrollLeft ?? 0;\n retainedFocus.focus({ preventScroll: true });\n if (viewport) {\n if (viewport.scrollTop !== top) viewport.scrollTop = top;\n if (viewport.scrollLeft !== left) viewport.scrollLeft = left;\n }\n }\n }\n this.layoutController.refresh(false);\n this.loadController.refresh();\n this.groupLoadController.refresh();\n this.virtualController.refresh();\n this.virtualController.collectMeasurements(this.tableEl);\n if (\n this.rowWindowingEnabled &&\n this.truncateAnchor &&\n this.tableEl &&\n !this.tableEl.contains(this.truncateAnchor)\n ) {\n this.dismissTruncateTooltip();\n }\n this.viewportFitController.refresh(false);\n this.syncStickyGroupConnection();\n this.connectFitObserver();\n this.connectCaptionCompactObserver();\n this.syncFitPageSize();\n if (this.stickyGroupConnected) this.updateStickyGroup();\n if (this.renderedAlternateView !== this.alternateView) {\n this.renderedAlternateView = this.alternateView;\n this.dsAlternateViewRendered.emit({ alternateView: this.alternateView });\n }\n }\n\n /**\n * Scroll the nearest vertical owner only enough to reveal a supplied row.\n * Resolves false when the row is absent from the supplied, expanded table model.\n * This method never moves focus.\n */\n @Method()\n async scrollRowIntoView(rowId: string): Promise<boolean> {\n if (!rowId) return false;\n\n if (this.rowWindowingEnabled) {\n const headerSize = this.tableEl?.tHead?.getBoundingClientRect().height ?? 0;\n const revealed = this.virtualController.scrollRowIntoView(\n rowId,\n headerSize,\n this.stickyHeader ? headerSize : 0\n );\n if (!revealed) return false;\n await this.nextAnimationFrame();\n }\n\n const row = this.findRenderedRow(rowId);\n if (!row) return false;\n this.revealRenderedRow(row);\n return true;\n }\n\n connectedCallback(): void {\n if (!this.hasLoaded) return;\n this.connectCardViewportQuery();\n this.layoutController.connect();\n this.loadController.connect();\n this.groupLoadController.connect();\n this.virtualController.connect();\n this.viewportFitController.connect();\n this.syncStickyGroupConnection();\n this.connectHeaderSlotObserver();\n this.connectFooterSlotObserver();\n this.connectFitObserver();\n this.connectCaptionCompactObserver();\n this.connectTruncateTooltip();\n }\n\n disconnectedCallback(): void {\n this.editingController.disconnect();\n this.captionController.disconnect();\n this.layoutController.disconnect();\n this.loadController.disconnect();\n this.groupLoadController.disconnect();\n this.virtualController.disconnect();\n this.viewportFitController.disconnect();\n this.disconnectStickyGroup();\n this.headerSlotObserver?.disconnect();\n this.headerSlotObserver = null;\n this.footerSlotObserver?.disconnect();\n this.footerSlotObserver = null;\n this.disconnectFitObserver();\n this.disconnectCaptionCompactObserver();\n this.disconnectTruncateTooltip();\n this.disconnectCardViewportQuery();\n if (this.initialModelWarningFrame !== undefined) {\n cancelAnimationFrame(this.initialModelWarningFrame);\n this.initialModelWarningFrame = undefined;\n }\n }\n\n private readonly handleCardViewportChange = (event: MediaQueryListEvent): void => {\n if (this.narrowViewport !== event.matches) this.narrowViewport = event.matches;\n };\n\n private connectCardViewportQuery(): void {\n if (\n this.cardViewportQuery ||\n typeof window === 'undefined' ||\n typeof window.matchMedia !== 'function'\n )\n return;\n const query = window.matchMedia(`(max-width: ${TABLE_CARD_VIEWPORT_BREAKPOINT - 1}px)`);\n this.cardViewportQuery = query;\n const narrow = isTableCardViewport(window.innerWidth);\n if (this.narrowViewport !== narrow) this.narrowViewport = narrow;\n query.addEventListener('change', this.handleCardViewportChange);\n }\n\n private disconnectCardViewportQuery(): void {\n this.cardViewportQuery?.removeEventListener('change', this.handleCardViewportChange);\n this.cardViewportQuery = null;\n }\n\n private syncHeaderSlotPresence = () => {\n const header = this.el.querySelector<HTMLElement>('[slot=\"header\"]');\n this.headerPresent = !!header;\n this.headerUsesToolbar = header?.tagName === 'DS-DATA-TOOLBAR';\n this.captionTrailingPresent = !!this.el.querySelector('[slot=\"caption-trailing\"]');\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 syncFooterSlotPresence = () => {\n let presence = 0;\n if (hasOwnedTableFooterSlot(this.el, 'footer-leading')) presence |= TABLE_FOOTER_SLOT_LEADING;\n if (hasOwnedTableFooterSlot(this.el, 'footer')) presence |= TABLE_FOOTER_SLOT_COPY;\n if (hasOwnedTableFooterSlot(this.el, 'footer-trailing')) presence |= TABLE_FOOTER_SLOT_TRAILING;\n if (presence !== this.footerSlotPresence) this.footerSlotPresence = presence;\n };\n\n private connectFooterSlotObserver(): void {\n if (this.footerSlotObserver || typeof MutationObserver === 'undefined') return;\n this.footerSlotObserver = new MutationObserver(this.syncFooterSlotPresence);\n this.footerSlotObserver.observe(this.el, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n this.syncFooterSlotPresence();\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 @Watch('hiddenFieldIds')\n @Watch('fieldOrder')\n @Watch('pinnedFieldIds')\n @Watch('columnCustomizer')\n @Watch('cellSpans')\n @Watch('interactionMode')\n @Watch('responsiveLayout')\n handleStructureChange(): void {\n this.virtualItemsCache = null;\n this.scheduleModelIssueWarning();\n this.loadController.structureChanged();\n this.groupLoadController.structureChanged();\n this.virtualController.invalidateMeasures();\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.scheduleModelIssueWarning();\n this.syncActionMenu();\n this.virtualController.invalidateMeasures();\n }\n\n @Watch('totalCount')\n handleTotalCountChange(): void {\n this.scheduleModelIssueWarning();\n }\n\n @Watch('caption')\n handleCaptionChange(): void {\n this.scheduleModelIssueWarning();\n }\n\n @Watch('loadIdentity')\n handleLoadIdentityChange(): void {\n this.incrementalWindowActive = this.hasIncrementalState;\n this.loadController.identityChanged();\n this.virtualController.resetToTop();\n }\n\n @Watch('sort')\n @Watch('grouping')\n handleVirtualIndexReset(): void {\n this.virtualController.resetToTop();\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.scheduleModelIssueWarning();\n this.handleLazyConfigurationChange();\n this.virtualController.resetToTop();\n }\n\n @Watch('pagination')\n handlePaginationChange(\n pagination: TablePaginationState | null,\n previous: TablePaginationState | null\n ): void {\n if (pagination?.pageSizeMode === 'fit' && pagination.fitIdentity !== previous?.fitIdentity) {\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 @Watch('columnCustomizer')\n @Watch('captionVisibility')\n @Watch('dataModeSwitcher')\n @Watch('chromeLoading')\n handleCaptionAvailability(): void {\n this.captionController.reconcile();\n }\n\n private get grouped(): boolean {\n return this.grouping !== null;\n }\n\n private get hasIncrementalState(): boolean {\n return (\n this.dataMode === 'infinite' &&\n (this.hasMore || this.loadingMore || !!this.loadMoreError?.trim())\n );\n }\n\n private get selectable(): boolean {\n return this.selectionMode === 'multiple';\n }\n\n private get visibleColumns(): TableColumn[] {\n const cached = this.visibleColumnsCache;\n if (\n cached &&\n cached.columns === this.columns &&\n cached.columnCustomizer === this.columnCustomizer &&\n cached.hiddenFieldIds === this.hiddenFieldIds &&\n cached.fieldOrder === this.fieldOrder &&\n cached.pinnedFieldIds === this.pinnedFieldIds\n ) {\n return cached.value;\n }\n const value = resolveTableVisibleColumns(this.columns, {\n columnCustomizer: this.columnCustomizer,\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: this.fieldOrder,\n pinnedFieldIds: this.pinnedFieldIds,\n });\n this.visibleColumnsCache = {\n columns: this.columns,\n columnCustomizer: this.columnCustomizer,\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: this.fieldOrder,\n pinnedFieldIds: this.pinnedFieldIds,\n value,\n };\n return value;\n }\n\n private get documentStickyHeader(): boolean {\n return this.stickyHeader && !this.containedScroll && this.responsiveLayout !== 'cards';\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 connectCaptionCompactObserver(): void {\n if (this.captionCompactDisconnect) return;\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n private readonly syncFitPageSize = (): void => {\n const pagination = this.dataMode === 'pagination' ? this.pagination : null;\n if (\n !pagination?.fitToPage ||\n pagination.fitToPageInactive ||\n !this.containedScroll ||\n !this.viewportEl ||\n !this.tableEl\n ) {\n if (this.fitPageSize !== undefined) this.fitPageSize = undefined;\n this.fitMeasurementPending = false;\n return;\n }\n const header = this.tableEl.querySelector<HTMLElement>('.ds-table__head');\n const item = this.tableEl.querySelector<HTMLElement>(\n this.grouped ? '.ds-table__group-row' : '.ds-table__body .ds-table__row'\n );\n const itemBlockSize =\n item?.getBoundingClientRect().height ||\n 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 fitToPageInactive: false,\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 showFirstLastButtons: pagination.showFirstLastButtons ?? false,\n previousPageIndex: pagination.pageIndex,\n previousPageSize: pagination.pageSize,\n previousPageSizeMode: 'fit',\n reason: 'fit',\n });\n };\n\n @Listen('keydown', { target: 'window' })\n handleWindowPaginationKeyDown(event: KeyboardEvent): void {\n this.handlePaginationKeyDown(event, true);\n }\n\n private handlePaginationKeyDown(event: KeyboardEvent, fromWindow = false): 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 if (paginationShortcutBlockedByPath(event.composedPath())) return;\n\n if (fromWindow) {\n const origin = event.composedPath()[0];\n const originNode = origin instanceof Text ? origin.parentNode : origin;\n if (\n !shouldHandleContainingPagePaginationShortcut({\n origin: originNode,\n table: this.el,\n eventPath: event.composedPath(),\n })\n ) {\n return;\n }\n }\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 fitToPageInactive: pagination.fitToPageInactive ?? 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 showFirstLastButtons: pagination.showFirstLastButtons ?? false,\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 const columns = this.visibleColumns;\n const grouped = this.grouped;\n const virtualCounts = this.dataMode === 'virtual';\n const cached = this.renderModelCache;\n if (\n cached &&\n cached.columns === columns &&\n cached.rows === this.rows &&\n cached.groups === this.groups &&\n cached.grouped === grouped &&\n cached.selectionMode === this.selectionMode &&\n cached.selectedRowIds === this.selectedRowIds &&\n cached.collapsedGroupIds === this.collapsedGroupIds &&\n cached.virtualCounts === virtualCounts\n ) {\n return cached.value;\n }\n const value = createTableRenderModel({\n columns,\n rows: this.rows,\n groups: this.groups,\n grouped,\n selectionMode: this.selectionMode,\n selectedRowIds: this.selectedRowIds,\n collapsedGroupIds: this.collapsedGroupIds,\n groupCountPresentation: virtualCounts ? 'total' : 'loaded-progress',\n });\n this.renderModelCache = {\n columns,\n rows: this.rows,\n groups: this.groups,\n grouped,\n selectionMode: this.selectionMode,\n selectedRowIds: this.selectedRowIds,\n collapsedGroupIds: this.collapsedGroupIds,\n virtualCounts,\n value,\n };\n return value;\n }\n\n private get highlightMatcher(): TableHighlightMatcher {\n if (this.highlightMatcherCache?.terms === this.highlightTerms) {\n return this.highlightMatcherCache.value;\n }\n const value = createTableHighlightMatcher(this.highlightTerms);\n this.highlightMatcherCache = { terms: this.highlightTerms, value };\n return value;\n }\n\n private get rowWindowingEnabled(): boolean {\n if (!this.hasVirtualViewportBounds) return false;\n if (this.dataMode === 'virtual') return true;\n return !this.grouped && this.currentLoadedRowCount() > TABLE_NON_VIRTUAL_WINDOW_THRESHOLD;\n }\n\n private get virtualViewportMissing(): boolean {\n return this.dataMode === 'virtual' && !this.hasVirtualViewportBounds;\n }\n\n private get hasVirtualViewportBounds(): boolean {\n return this.containedScroll && this.estimateVirtualViewportSize() > 0;\n }\n\n private estimateVirtualViewportSize(): number {\n const measured =\n this.virtualController.currentViewportSize() || this.viewportEl?.clientHeight || 0;\n const chrome =\n (this.captionVisibility === 'visible' ? 48 : 0) + (this.hasResultFooter ? 48 : 0);\n if (this.fixedHeight && this.resolvedHeight) {\n if (measured > 0) return measured;\n return Math.max(\n 0,\n resolveCssLengthPx(this.resolvedHeight, 0, this.rootEl ?? this.el) - chrome\n );\n }\n if (this.fitViewport) return Math.max(0, measured);\n if (this.resolvedMaxHeight) {\n if (this.resolvedMaxHeight.trim().toLowerCase() === 'none') return 0;\n return resolveCssLengthPx(this.resolvedMaxHeight, 0, this.rootEl ?? this.el);\n }\n return 0;\n }\n\n private virtualPinnedRowIds(): Set<string> {\n const pinned = new Set<string>();\n if (this.focusedRowId) pinned.add(this.focusedRowId);\n if (this.actionMenu?.rowId) pinned.add(this.actionMenu.rowId);\n return pinned;\n }\n\n private findRenderedRow(rowId: string): HTMLElement | null {\n return (\n [...this.el.querySelectorAll<HTMLElement>('[data-row-id]')].find(\n candidate => candidate.dataset.rowId === rowId\n ) ?? null\n );\n }\n\n private revealRenderedRow(row: HTMLElement): void {\n if (!this.containedScroll || !this.viewportEl) {\n row.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n return;\n }\n\n const viewportRect = this.viewportEl.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n let visibleStart = viewportRect.top;\n if (this.stickyHeader) {\n visibleStart = Math.max(\n visibleStart,\n this.tableEl?.tHead?.getBoundingClientRect().bottom ?? visibleStart\n );\n }\n const groupRow = row.closest('tbody')?.querySelector<HTMLElement>('.ds-table__group-row');\n if (groupRow && getComputedStyle(groupRow).position === 'sticky') {\n visibleStart = Math.max(visibleStart, groupRow.getBoundingClientRect().bottom);\n }\n\n if (rowRect.top < visibleStart) {\n this.viewportEl.scrollTop += rowRect.top - visibleStart;\n } else if (rowRect.bottom > viewportRect.bottom) {\n this.viewportEl.scrollTop += rowRect.bottom - viewportRect.bottom;\n }\n }\n\n private nextAnimationFrame(): Promise<void> {\n return new Promise(resolve => requestAnimationFrame(() => resolve()));\n }\n\n private syncVirtualItems(model: TableRenderModel): void {\n if (!this.rowWindowingEnabled) {\n this.virtualItems = [];\n this.virtualItemsCache = null;\n this.bodyRenderer.resetVirtualState();\n return;\n }\n const columns = this.visibleColumns;\n const cached = this.virtualItemsCache;\n if (\n cached &&\n cached.columns === columns &&\n cached.rows === this.rows &&\n cached.groups === this.groups &&\n cached.grouped === model.grouped &&\n cached.collapsedGroupIds === this.collapsedGroupIds\n ) {\n return;\n }\n this.virtualItems = flattenTableVirtualItems({\n grouped: model.grouped,\n rows: this.rows,\n groups: this.groups,\n collapsedGroupIds: this.collapsedGroupIds,\n columns,\n });\n if (this.responsiveLayout === 'cards') {\n this.virtualItems = this.virtualItems.map(item => ({ ...item, variableSize: true }));\n }\n this.virtualItemsCache = {\n columns,\n rows: this.rows,\n groups: this.groups,\n grouped: model.grouped,\n collapsedGroupIds: this.collapsedGroupIds,\n };\n }\n\n private shouldWindowRows(model: TableRenderModel): boolean {\n return (\n this.rowWindowingEnabled && (model.hasData || (model.grouped && model.groups.length > 0))\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 const visibleColumns = this.visibleColumns;\n if (!this.caption?.trim()) issues.unshift('A non-empty caption is required.');\n if (this.grouping) {\n const groupingColumn = this.columns.find(column => column.id === this.grouping!.fieldId);\n if (!groupingColumn) {\n issues.push(`Grouping references unknown column id: ${this.grouping.fieldId}`);\n } else if (!visibleColumns.some(column => column.id === groupingColumn.id)) {\n issues.push(`Grouping references hidden column id: ${this.grouping.fieldId}`);\n }\n }\n if (this.sort) {\n const sortColumn = this.columns.find(\n column =>\n column.id === this.sort!.fieldId ||\n column.segments?.some(segment => segment.sortKey === this.sort!.fieldId)\n );\n if (!sortColumn) {\n issues.push(`Sorting references unknown column id: ${this.sort.fieldId}`);\n } else if (!visibleColumns.some(column => column.id === sortColumn.id)) {\n issues.push(`Sorting references hidden column id: ${this.sort.fieldId}`);\n }\n }\n if (\n this.dataMode === 'virtual' &&\n Number.isFinite(this.totalCount) &&\n Math.max(0, Math.trunc(this.totalCount!)) !== this.currentLoadedRowCount()\n ) {\n issues.push('Virtual mode requires totalCount to match the complete supplied row count.');\n }\n const stickyStart = visibleColumns.filter(column => column.sticky === 'start');\n const stickyEnd = visibleColumns.filter(column => column.sticky === 'end');\n issues.push(...this.structure.merges.issues);\n if (this.interactionMode === 'grid' && this.grouped)\n issues.push('Grid interaction requires ungrouped rows.');\n for (const column of [...stickyStart, ...stickyEnd]) {\n if (!tableColumnSize(column))\n issues.push(`Sticky column ${column.id} requires an explicit size.`);\n }\n const message = issues.join(' ');\n if (!message) {\n this.previousModelWarning = '';\n return;\n }\n if (message === this.previousModelWarning) return;\n this.previousModelWarning = message;\n console.warn(`[ds-table] ${message}`);\n }\n\n private scheduleModelIssueWarning(): void {\n if (this.modelWarningQueued) return;\n this.modelWarningQueued = true;\n queueMicrotask(() => {\n this.modelWarningQueued = false;\n this.warnModelIssues();\n });\n }\n\n private scheduleInitialModelIssueWarning(): void {\n if (this.initialModelWarningFrame !== undefined) {\n cancelAnimationFrame(this.initialModelWarningFrame);\n }\n this.initialModelWarningFrame = requestAnimationFrame(() => {\n this.initialModelWarningFrame = undefined;\n this.warnModelIssues();\n });\n }\n\n private emitSort(column: TableColumn, sortKey = column.id): void {\n if (!column.sortable) return;\n this.dsSortChange.emit({ sort: nextDataSortState(this.sort, sortKey) });\n }\n\n private sortButtonLabel(column: TableColumn, sortKey = column.id, label = column.label): string {\n if (this.sort?.fieldId !== 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: DataGroup): 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\"], [popover], ds-button-unfilled, ds-menu'\n );\n });\n }\n\n private groupRowEventOwnsCollapse(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 'input, select, textarea, [role=\"checkbox\"], .ds-table__selection-control, .ds-table__group-selection, ds-tooltip'\n );\n });\n }\n\n private handleGroupRowClick(group: DataGroup, event: Event): void {\n if (!this.groupRowEventOwnsCollapse(event)) return;\n this.emitGroupCollapse(group);\n }\n\n private emitRowActivation(row: TableRow, event: Event): void {\n if (this.editingController.gridEnabled || row.disabled || !this.rowEventOwnsActivation(event))\n return;\n if (this.selectionMode === 'multiple' && this.selectedRowIds.length > 0) {\n if (row.selectable !== false) this.emitRowSelection(row);\n return;\n }\n if (row.interactive) this.dsRowActivate.emit({ rowId: row.id });\n }\n\n private syncActionMenu(): void {\n if (!this.actionMenu) return;\n const row = tableRows(this.rows, this.groups, this.grouped).find(\n candidate => candidate.id === this.actionMenu?.rowId\n );\n const value = row && !row.disabled ? row.cells[this.actionMenu.columnId] : undefined;\n if (!isTableCellAction(value) || !isRenderableTableActionMenu(value)) {\n this.actionMenu = null;\n }\n }\n\n private closeActionMenu(): void {\n this.actionMenu = null;\n }\n\n private handleActionMenuSelect(item: MenuItemData): void {\n const open = this.actionMenu;\n const actionId = item.value;\n if (!open || !actionId || item.isInactive) return;\n this.dsCellAction.emit({\n actionId,\n rowId: open.rowId,\n columnId: open.columnId,\n });\n const triggerId = tableActionTriggerId(this.actionMenuElementId, open.rowId, open.columnId);\n this.closeActionMenu();\n requestAnimationFrame(() => {\n const trigger = this.el.querySelector<HTMLElement & { setFocus?: () => void }>(\n `#${CSS.escape(triggerId)}`\n );\n trigger?.setFocus?.();\n });\n }\n\n private toggleActionMenu(row: TableRow, column: TableColumn, event: MouseEvent): void {\n if (row.disabled) return;\n const open = this.actionMenu?.rowId === row.id && this.actionMenu?.columnId === column.id;\n this.actionMenuInitialFocusVisible = event.detail === 0;\n this.actionMenu = open ? null : { rowId: row.id, columnId: column.id };\n if (this.actionMenu) this.actionMenuSurface = this.actionMenu;\n }\n\n private renderOverflowActionMenu() {\n const open = this.actionMenu ?? this.actionMenuSurface;\n const row = open\n ? tableRows(this.rows, this.groups, this.grouped).find(\n candidate => candidate.id === open.rowId\n )\n : undefined;\n const value = row && open ? row.cells[open.columnId] : undefined;\n const menu = isTableCellAction(value) && isRenderableTableActionMenu(value) ? value : undefined;\n const sections = menu ? tableActionMenuSections(menu.items) : [];\n const triggerId = open\n ? tableActionTriggerId(this.actionMenuElementId, open.rowId, open.columnId)\n : undefined;\n\n return (\n <ds-menu\n id={this.actionMenuElementId}\n open={Boolean(this.actionMenu && sections.length)}\n anchorId={triggerId}\n align=\"end\"\n side=\"bottom\"\n menuLabel={menu?.ariaLabel ?? 'More actions'}\n initialFocusVisible={this.actionMenuInitialFocusVisible}\n sections={sections}\n onDsClose={() => this.closeActionMenu()}\n onDsAfterClose={() => {\n if (!this.actionMenu) this.actionMenuSurface = null;\n }}\n onDsSelect={event => this.handleActionMenuSelect(event.detail)}\n />\n );\n }\n\n private connectTruncateTooltip(): void {\n if (this.truncateTooltipBound) return;\n this.el.addEventListener('pointerover', this.onTruncatePointerOver);\n this.el.addEventListener('pointerout', this.onTruncatePointerOut);\n this.el.addEventListener('focusin', this.onTruncateFocusIn);\n this.el.addEventListener('focusout', this.onTruncateFocusOut);\n this.truncateTooltipBound = true;\n }\n\n private disconnectTruncateTooltip(): void {\n if (!this.truncateTooltipBound) return;\n this.el.removeEventListener('pointerover', this.onTruncatePointerOver);\n this.el.removeEventListener('pointerout', this.onTruncatePointerOut);\n this.el.removeEventListener('focusin', this.onTruncateFocusIn);\n this.el.removeEventListener('focusout', this.onTruncateFocusOut);\n this.truncateTooltipBound = false;\n this.dismissTruncateTooltip();\n }\n\n private onTruncatePointerOver = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n const track = resolveTableTruncateTrack(event.target);\n if (!track) return;\n this.presentOrDismissTruncateTrack(track);\n };\n\n private onTruncatePointerOut = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n if (resolveTableTruncateTrack(event.relatedTarget)) return;\n const next = event.relatedTarget;\n const cell = this.truncateAnchor?.closest('.ds-table__cell');\n if (cell && next instanceof Node && cell.contains(next)) return;\n this.dismissTruncateTooltip();\n };\n\n private onTruncateFocusIn = (event: FocusEvent) => {\n const track = resolveTableTruncateTrack(event.target);\n if (!track) {\n this.dismissTruncateTooltip();\n return;\n }\n this.presentOrDismissTruncateTrack(track);\n };\n\n private onTruncateFocusOut = (event: FocusEvent) => {\n if (resolveTableTruncateTrack(event.relatedTarget)) return;\n this.dismissTruncateTooltip();\n };\n\n private presentOrDismissTruncateTrack(track: HTMLElement): void {\n if (!isElementTruncated(track)) {\n this.dismissTruncateTooltip();\n return;\n }\n const label = tableTruncateLabel(track);\n if (!label) {\n this.dismissTruncateTooltip();\n return;\n }\n this.truncateAnchor = track;\n this.truncateTooltipLabel = label;\n void this.truncateTooltipEl?.presentFrom(track, label);\n }\n\n private dismissTruncateTooltip(): void {\n this.truncateAnchor = null;\n if (!this.truncateTooltipLabel && !this.truncateTooltipEl) return;\n this.truncateTooltipLabel = '';\n void this.truncateTooltipEl?.dismiss();\n }\n\n private renderTruncateTooltip() {\n return (\n <ds-tooltip\n ref={element => {\n this.truncateTooltipEl = element;\n }}\n label={this.truncateTooltipLabel}\n describedBy={false}\n wrapLabel={true}\n size=\"sm\"\n delay={0}\n side=\"top\"\n />\n );\n }\n\n private handleRowKeydown(row: TableRow, event: KeyboardEvent): void {\n if (event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' '))\n return;\n event.preventDefault();\n this.emitRowActivation(row, event);\n }\n\n private onVirtualFocusIn = (event: FocusEvent): void => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n const row = target.closest('[data-row-id]');\n const id = row?.getAttribute('data-row-id') ?? null;\n if (id === this.focusedRowId) return;\n this.focusedRowId = id;\n if (this.rowWindowingEnabled) this.virtualController.schedule();\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'], shadow = true) {\n if (!sticky) return null;\n return (\n <span\n class={{\n 'ds-table__sticky-edge': true,\n [`ds-table__sticky-edge--${sticky}`]: true,\n 'ds-table__sticky-edge--internal': !shadow,\n }}\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 headerLane?: { start: number; spanning: boolean }\n ) {\n const groupedColumn = this.grouping?.fieldId === column.id;\n const previousColumn = headerLane\n ? this.visibleColumns[this.visibleColumns.indexOf(column) - 1]\n : undefined;\n const segments = column.segments?.length\n ? column.segments\n : [{ label: column.label, sortKey: column.id }];\n const activeMemberSegment = segments.find(segment => segment.sortKey === this.sort?.fieldId);\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'\n ? 'ascending'\n : 'descending'\n : undefined;\n\n const help = column.help?.trim();\n const labels = (\n <span\n class=\"ds-table__header-labels\"\n tabIndex={interactive && help && !column.sortable ? 0 : undefined}\n data-header-help={help ? '' : undefined}\n >\n {segments.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 decoration={help ? 'dotted-underline' : undefined}\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(\n column,\n segment.sortKey,\n segment.dataLabel?.trim() || segment.label\n )}\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 < segments.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 labelControl =\n interactive && help ? (\n <ds-tooltip label={help} side=\"top\" size=\"sm\" wrapLabel={true}>\n {labels}\n </ds-tooltip>\n ) : (\n labels\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.label\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 =\n collapseHost?.mode === 'action' && collapseHost.columnId === column.id;\n const blankActionCollapseHost =\n actionCollapseHost && !column.label.trim() && !column.segments?.length;\n const collapseControl =\n interactive && actionCollapseHost ? (\n <span class=\"ds-table__collapse-slot\">{this.renderCollapseAllButton()}</span>\n ) : null;\n\n return (\n <th\n key={column.id}\n id={presentational ? undefined : this.headerId(column.id)}\n headers={presentational ? undefined : this.columnBandId(column.id)}\n rowSpan={headerLane?.spanning ? 2 : undefined}\n style={{\n ...this.structure.pins.get(column.id)?.style,\n ...(headerLane\n ? {\n gridColumn: String(headerLane.start),\n gridRow: headerLane.spanning ? '1 / span 2' : '2',\n }\n : {}),\n }}\n class={{\n 'ds-table__header-cell': true,\n 'ds-table__header-cell--rowspan': !!headerLane?.spanning,\n 'ds-table__header-cell--after-rowspan':\n !!headerLane &&\n !headerLane.spanning &&\n !!previousColumn &&\n !previousColumn.group &&\n !this.structure.pins.has(previousColumn.id),\n [`ds-table__cell--align-${align}`]: true,\n 'ds-table__cell--sticky-start':\n column.sticky === 'start' && this.structure.pins.has(column.id),\n 'ds-table__cell--sticky-end':\n column.sticky === 'end' && this.structure.pins.has(column.id),\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.label.trim() && column.accessibleLabel?.trim() && (\n <span class=\"ds-visually-hidden\">{column.accessibleLabel}</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(\n this.structure.pins.has(column.id) ? column.sticky : undefined,\n !!this.structure.pins.get(column.id)?.edge\n )}\n </th>\n );\n }\n\n private renderColgroup(model: TableRenderModel) {\n const beforeSpacer =\n model.elasticSpacerIndex == null\n ? this.visibleColumns\n : this.visibleColumns.slice(0, model.elasticSpacerIndex);\n const afterSpacer =\n model.elasticSpacerIndex == null ? [] : this.visibleColumns.slice(model.elasticSpacerIndex);\n const renderColumn = (column: TableColumn) => {\n const width = tableColumnSize(column);\n return (\n <col\n key={column.id}\n class={{ 'ds-table__action-column': column.kind === 'action' }}\n style={width ? { width } : undefined}\n />\n );\n };\n return (\n <colgroup>\n {model.selectable && <col class=\"ds-table__selection-column\" />}\n {beforeSpacer.map(renderColumn)}\n {model.elasticSpacerIndex != null && <col class=\"ds-table__elastic-spacer-column\" />}\n {afterSpacer.map(renderColumn)}\n </colgroup>\n );\n }\n\n private renderHeader(\n model: TableRenderModel,\n interactive = true,\n presentational = false,\n ariaRowIndex?: number\n ) {\n const selection = model.selection;\n const bands = this.structure.bands;\n const multirow = bands.length > 0;\n const controls =\n interactive &&\n !(\n this.responsiveLayout === 'cards' &&\n this.narrowViewport &&\n this.interactionMode !== 'grid' &&\n !this.cellSpans.length\n );\n const selectionHeader = model.selectable && (\n <th\n class={{\n 'ds-table__header-cell': true,\n 'ds-table__selection-cell': true,\n 'ds-table__cell--sticky-start': true,\n 'ds-table__header-cell--rowspan': multirow,\n }}\n rowSpan={multirow ? 2 : undefined}\n style={multirow ? { gridColumn: '1', gridRow: '1 / span 2' } : undefined}\n scope={presentational ? undefined : 'col'}\n >\n {controls ? (\n 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 ) : (\n <span class=\"ds-visually-hidden\">Select rows</span>\n )}\n {this.renderStickyEdge(\n 'start',\n ![...this.structure.pins.values()].some(pin => pin.edge === 'start')\n )}\n </th>\n );\n const lanes: (TableColumn | undefined)[] = [...this.visibleColumns];\n if (model.elasticSpacerIndex != null) lanes.splice(model.elasticSpacerIndex, 0, undefined);\n const renderLane = (column: TableColumn | undefined, index: number) => {\n const start = index + 1 + Number(model.selectable);\n if (column)\n return this.renderColumnHeader(\n column,\n model,\n controls,\n presentational,\n multirow ? { start, spanning: !column.group } : undefined\n );\n return (\n <th\n class=\"ds-table__header-cell ds-table__elastic-spacer-cell\"\n rowSpan={multirow ? 2 : undefined}\n style={multirow ? { gridColumn: String(start), gridRow: '1 / span 2' } : undefined}\n aria-hidden=\"true\"\n role=\"presentation\"\n data-elastic-spacer=\"true\"\n />\n );\n };\n return (\n <thead\n class={{\n 'ds-table__head': true,\n 'ds-table__head--multirow': multirow,\n 'ds-table__head--semantic-copy': !interactive,\n }}\n ref={element => {\n if (interactive) this.interactiveHeadEl = element ?? null;\n }}\n >\n {multirow && (\n <tr class=\"ds-table__header-row ds-table__super-header-row\" aria-rowindex={ariaRowIndex}>\n {selectionHeader}\n {bands.map(band =>\n !band.label ? (\n lanes.map((column, index) => {\n const start = index + 1 + Number(model.selectable);\n return start >= band.start && start < band.start + band.span\n ? renderLane(column, index)\n : null;\n })\n ) : (\n <th\n key={band.key}\n id={presentational ? undefined : `${this.actionMenuElementId}-${band.key}`}\n class={{\n 'ds-table__header-cell': true,\n 'ds-table__super-header-cell': true,\n 'ds-table__cell--sticky-start': band.sticky === 'start',\n 'ds-table__cell--sticky-end': band.sticky === 'end',\n }}\n scope={presentational || !band.label ? undefined : 'colgroup'}\n colSpan={band.span}\n style={{\n gridColumn: `${band.start} / span ${band.span}`,\n gridRow: '1',\n ...this.structure.pins.get(\n (band.sticky === 'end' ? band.lastColumnId : band.firstColumnId) ?? ''\n )?.style,\n }}\n aria-hidden={!band.label ? 'true' : undefined}\n >\n <span class=\"ds-table__header-content\">\n <span class=\"ds-table__header-labels\">\n <span class=\"ds-table__header-segment\">\n {/* eslint-disable-next-line compomo/prefer-direct-ds-text -- Match the normal header's structural label canvas and inner text inset. */}\n <span class=\"ds-table__header-label ds-table__header-static\">\n <ds-text\n class=\"ds-table__header-label-box ds-control-label-box\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n lineTruncation={1}\n >\n {band.label}\n </ds-text>\n </span>\n </span>\n </span>\n </span>\n {this.renderStickyEdge(\n band.sticky,\n !!this.structure.pins.get(\n (band.sticky === 'end' ? band.firstColumnId : band.lastColumnId) ?? ''\n )?.edge\n )}\n </th>\n )\n )}\n </tr>\n )}\n <tr\n class=\"ds-table__header-row\"\n aria-rowindex={\n ariaRowIndex == null\n ? undefined\n : ariaRowIndex + Number(this.structure.bands.length > 0)\n }\n >\n {!multirow && selectionHeader}\n {lanes.map((column, index) => (!multirow || column?.group) && renderLane(column, index))}\n </tr>\n </thead>\n );\n }\n\n private renderRow(\n row: TableRow,\n model: TableRenderModel,\n ariaRowIndex?: number,\n variableVirtualSize = false,\n rowKey = row.id\n ) {\n return renderTableRowView({\n grid: this.editingController.gridEnabled,\n cellAttributes: this.editingController.enabled\n ? (targetRow, column) => this.editingController.cellAttributes(targetRow, column)\n : undefined,\n renderEditor: this.editingController.enabled\n ? (targetRow, column) => this.editingController.renderEditor(targetRow, column)\n : undefined,\n renderEditTrigger: this.editingController.enabled\n ? (targetRow, column) => this.editingController.renderEditTrigger(targetRow, column)\n : undefined,\n pins: this.structure.pins,\n spans: this.structure.merges.cells.get(row.id),\n headerId: id => this.headerId(id),\n responsiveCards: this.responsiveLayout === 'cards',\n row,\n model,\n visibleColumns: this.visibleColumns,\n emptyCellLabel: this.emptyCellLabel,\n actionMenuElementId: this.actionMenuElementId,\n actionMenu: this.actionMenu,\n actionMenuSurface: this.actionMenuSurface,\n surfaceOpenRowId: this.surfaceOpenRowId,\n highlightMatcher: this.highlightMatcher,\n highlightFieldIds: this.highlightFieldIds,\n ariaRowIndex:\n ariaRowIndex == null ? undefined : ariaRowIndex + Number(this.structure.bands.length > 0),\n variableVirtualSize,\n intrinsicBlockSize:\n this.dataMode !== 'virtual'\n ? estimateTableRowBlockSize(row, this.visibleColumns)\n : undefined,\n rowKey,\n renderSelectionControl: (label, checked, indeterminate, disabled, onActivate) =>\n this.renderSelectionControl(label, checked, indeterminate, disabled, onActivate),\n renderStickyEdge: (sticky, shadow) => this.renderStickyEdge(sticky, shadow),\n onRowActivate: (targetRow, event) => this.emitRowActivation(targetRow, event),\n onRowKeyDown: (targetRow, event) => this.handleRowKeydown(targetRow, event),\n onRowSelection: targetRow => this.emitRowSelection(targetRow),\n onCellAction: detail => this.dsCellAction.emit(detail),\n onActionMenuToggle: (targetRow, column, event) =>\n this.toggleActionMenu(targetRow, column, event),\n });\n }\n\n private emitGroupCollapse(group: DataGroup) {\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 renderGroupAccessory(\n item: TableRenderModel['groups'][number]['accessories'][number],\n index: number\n ) {\n const text = (\n <ds-text\n key={`acc-${index}`}\n class=\"ds-table__group-accessory\"\n as=\"span\"\n variant=\"text-body-small\"\n color=\"secondary\"\n decoration={item.help ? 'dotted-underline' : undefined}\n lineTruncation={1}\n >\n {item.text}\n </ds-text>\n );\n if (!item.help) return text;\n return (\n <ds-tooltip\n key={`acc-${index}`}\n label={item.help}\n side=\"bottom\"\n align=\"start\"\n size=\"sm\"\n wrapLabel={true}\n >\n <span class=\"ds-table__group-accessory-tip\" tabIndex={0}>\n {text}\n </span>\n </ds-tooltip>\n );\n }\n\n private renderGroupContent(groupModel: TableRenderModel['groups'][number]) {\n const {\n group,\n countLabel,\n collapsed: isCollapsed,\n labelColor,\n selection: groupSelection,\n accessories,\n hero,\n } = groupModel;\n const heroTracks = hero?.kind === 'score' && hero.tracks === 2 ? 2 : 1;\n const heroPresentation = TABLE_GROUP_HERO_SCORE_PRESENTATION[heroTracks];\n return (\n <span\n class={{\n 'ds-table__group-content': true,\n 'ds-table__group-content--multi': accessories.length > 0 || heroTracks === 2,\n 'ds-table__group-content--hero': Boolean(hero),\n 'ds-table__group-content--hero-two-track': Boolean(hero) && heroTracks === 2,\n }}\n onClick={event => this.handleGroupRowClick(group, event)}\n >\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 {hero?.kind === 'score' && (\n <span class=\"ds-table__group-hero\">\n <ds-score\n size={heroPresentation.size}\n variant={heroPresentation.variant}\n value={hero.value}\n level={hero.level}\n label={hero.label ?? 'Safety score'}\n isLoading={hero.isLoading === true}\n />\n </span>\n )}\n <span class=\"ds-table__group-copy\">\n <span class=\"ds-table__group-primary\">\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 <span class=\"ds-visually-hidden\">{countLabel}</span>\n </span>\n {accessories.length > 0 && (\n <span class=\"ds-table__group-accessories\">\n {accessories.flatMap((item, index) => [\n ...(index > 0\n ? [\n <ds-text\n key={`sep-${index}`}\n class=\"ds-table__group-accessory-separator\"\n as=\"span\"\n variant=\"text-body-small\"\n color=\"secondary\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>,\n ]\n : []),\n this.renderGroupAccessory(item, index),\n ])}\n </span>\n )}\n </span>\n <span class=\"ds-table__group-trailing\">\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 {groupModel.visibleCountText}\n </ds-text>\n <span class=\"ds-table__group-action\">\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 ? `Expand ${group.label} group` : `Collapse ${group.label} group`\n }\n hasBorder={false}\n pressScale={false}\n />\n </span>\n </span>\n </span>\n );\n }\n\n private formatGroupLoadLabel(template: string, group: DataGroup): string {\n return template.split('{group}').join(group.label);\n }\n\n private renderGroupLoadRow(group: DataGroup, totalColumns: number) {\n const error = group.loadMoreError?.trim();\n if (!error && !group.loadingMore && !group.hasMore) return null;\n const manualFallback =\n this.loadMoreMode === 'manual' || !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 {renderTableLoadContent({\n error,\n loading: !!group.loadingMore,\n hasMore: !!group.hasMore,\n manualFallback,\n retryLabel: this.formatGroupLoadLabel(this.groupRetryLabel, group),\n loadingLabel: this.formatGroupLoadLabel(this.groupLoadingMoreLabel, group),\n loadMoreLabel: this.groupLoadMoreLabel,\n loadMoreAriaLabel: this.formatGroupLoadLabel(this.groupLoadMoreAriaLabel, group),\n onRetry: () => this.groupLoadController.request(group.id, 'retry'),\n onLoadMore: () => this.groupLoadController.request(group.id, 'manual'),\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, plan: TableVirtualPlan | null) {\n return this.bodyRenderer.render({\n headerRowCount: 1 + Number(this.structure.bands.length > 0),\n model,\n plan,\n rows: this.rows,\n stickyHeader: this.stickyHeader,\n documentStickyHeader: this.documentStickyHeader,\n activeStickyGroupId: this.activeStickyGroupId,\n renderRow: (row, renderModel, ariaRowIndex, variableVirtualSize, rowKey) =>\n this.renderRow(row, renderModel, ariaRowIndex, variableVirtualSize, rowKey),\n renderGroupContent: groupModel => this.renderGroupContent(groupModel),\n renderGroupLoadRow: (group, totalColumns) => this.renderGroupLoadRow(group, totalColumns),\n });\n }\n\n private renderSkeletonBody(model: TableRenderModel) {\n return renderTableSkeletonBody({\n pins: this.structure.pins,\n model,\n visibleColumns: this.visibleColumns,\n skeletonRows: this.skeletonRows,\n renderStickyEdge: (sticky, shadow) => this.renderStickyEdge(sticky, shadow),\n });\n }\n\n private renderStateBody(kind: 'empty' | 'error' | 'virtual-viewport', totalColumns: number) {\n const error = kind !== 'empty';\n const heading =\n kind === 'virtual-viewport'\n ? TABLE_VIRTUAL_VIEWPORT_REQUIRED_HEADING\n : error\n ? this.errorHeading\n : this.emptyHeading;\n const body =\n kind === 'virtual-viewport'\n ? TABLE_VIRTUAL_VIEWPORT_REQUIRED_BODY\n : error\n ? this.errorBody\n : this.emptyBody;\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 ? 'ExclamationTriangle' : 'Inbox'}\n heading={heading}\n body={body}\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 )\n return null;\n const error = this.loadMoreError?.trim();\n const manualFallback =\n this.loadMoreMode === 'manual' || !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 {renderTableLoadContent({\n error,\n loading: this.loadingMore,\n hasMore: this.hasMore,\n manualFallback,\n retryLabel: this.retryLabel,\n loadingLabel: this.loadingMoreLabel,\n loadMoreLabel: this.loadMoreLabel,\n endOfResultsLabel: this.endOfResultsLabel,\n onRetry: () => this.loadController.request('retry'),\n onLoadMore: () => this.loadController.request('manual'),\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 class=\"ds-table__document-sticky-header\">\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 if (this.dataMode === 'virtual') {\n return formatTableTotalSummary(this.currentLoadedRowCount(), this.resultTotalSummaryLabel);\n }\n return formatTableResultSummary(this.displayedCount, this.totalCount, this.resultSummaryLabel);\n }\n\n private get hasResultFooter(): boolean {\n return (\n (this.dataMode === 'pagination' && !!this.pagination) ||\n !!this.resultSummary ||\n this.footerSlotPresence !== 0\n );\n }\n\n private renderResultFooter() {\n const summary = this.resultSummary;\n const hasLeading = (this.footerSlotPresence & TABLE_FOOTER_SLOT_LEADING) !== 0;\n const hasCopy = (this.footerSlotPresence & TABLE_FOOTER_SLOT_COPY) !== 0;\n const hasTrailing = (this.footerSlotPresence & TABLE_FOOTER_SLOT_TRAILING) !== 0;\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\" onSlotchange={this.syncFooterSlotPresence} />\n </div>\n )}\n {hasCopy ? (\n <slot name=\"footer\" onSlotchange={this.syncFooterSlotPresence} />\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 lineTruncation={1}\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 {...{ fitToPageInactive: pagination.fitToPageInactive ?? 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 showFirstLastButtons={pagination.showFirstLastButtons ?? false}\n loading={this.loading}\n onDsChange={(event: CustomEvent<PaginationChangeDetail>) =>\n this.dsPaginationChange.emit(event.detail)\n }\n />\n )}\n <slot name=\"footer-trailing\" onSlotchange={this.syncFooterSlotPresence} />\n </div>\n )}\n </div>\n );\n }\n\n render() {\n this.groupSentinelEls.clear();\n const model = this.createRenderModel();\n this.syncVirtualItems(model);\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 windowRows = this.shouldWindowRows(model);\n const virtualViewportMissing =\n this.virtualViewportMissing && !initialLoading && (model.hasData || hasGroupedStructure);\n const virtualPlan = windowRows\n ? (this.virtualWindow ??\n resolveTableVirtualPlan({\n items: this.virtualItems,\n sizes: this.virtualItems.map(item => this.virtualController.sizeFor(item)),\n scrollOffset: this.viewportEl?.scrollTop ?? 0,\n viewportSize: this.estimateVirtualViewportSize(),\n pinnedRowIds: this.virtualPinnedRowIds(),\n }))\n : null;\n const groupLoadingMore = hasGroupedStructure && this.groups.some(group => group.loadingMore);\n const viewportStyle =\n !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) => {\n this.editingController.handleKeyDown(event);\n this.handlePaginationKeyDown(event);\n }}\n onCopy={(event: ClipboardEvent) => this.editingController.handleClipboard(event)}\n onPaste={(event: ClipboardEvent) => this.editingController.handleClipboard(event)}\n onFocusin={this.onVirtualFocusIn}\n >\n <div\n 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--chrome-edge-to-edge': this.chromeLayout === 'edge-to-edge',\n 'ds-table--super-headers': this.structure.bands.length > 0,\n 'ds-table--responsive-cards':\n this.responsiveLayout === 'cards' &&\n this.interactionMode !== 'grid' &&\n this.cellSpans.length === 0,\n 'ds-table--cards-active':\n this.narrowViewport &&\n this.responsiveLayout === 'cards' &&\n this.interactionMode !== 'grid' &&\n this.cellSpans.length === 0,\n 'ds-table--footer-visible': this.hasResultFooter,\n 'ds-table--state-fill':\n !initialLoading &&\n (initialError || virtualViewportMissing || !(model.hasData || hasGroupedStructure)),\n }}\n ref={element => {\n this.rootEl = element ?? null;\n }}\n >\n {this.captionController.renderBar()}\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 data-narrow={String(this.narrowViewport)}\n ref={element => {\n this.frameEl = element ?? null;\n }}\n >\n {this.alternateView ? <slot name=\"alternate-view\" /> : null}\n {!this.alternateView && this.renderDocumentStickyHeader(model)}\n {!this.alternateView && this.renderStickyGroup(model)}\n {!this.alternateView &&\n !this.documentStickyHeader &&\n this.renderFloatingCollapseAll(model)}\n {!this.alternateView && (\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--deferred-rows':\n this.dataMode !== 'virtual' && !this.structure.merges.hasRowSpans,\n 'ds-table__table--windowed': windowRows,\n 'ds-table__table--virtual': this.dataMode === 'virtual' && windowRows,\n 'ds-table__table--native-group-sticky':\n (model.grouped && this.stickyHeader && !this.documentStickyHeader) ||\n windowRows,\n }}\n style={model.tableStyle}\n role={this.editingController.gridEnabled ? 'grid' : 'table'}\n aria-multiselectable={this.editingController.gridEnabled ? 'true' : undefined}\n aria-rowcount={\n windowRows\n ? 1 + Number(this.structure.bands.length > 0) + this.virtualItems.length\n : undefined\n }\n aria-busy={\n initialLoading ||\n (this.dataMode === 'infinite' && (this.loadingMore || groupLoadingMore))\n ? 'true'\n : undefined\n }\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(\n model,\n !this.documentStickyHeader,\n false,\n windowRows ? 1 : undefined\n )}\n {initialLoading\n ? this.renderSkeletonBody(model)\n : initialError\n ? this.renderStateBody('error', model.totalColumns)\n : virtualViewportMissing\n ? this.renderStateBody('virtual-viewport', model.totalColumns)\n : model.hasData || hasGroupedStructure\n ? this.renderDataBodies(model, virtualPlan)\n : this.renderStateBody('empty', model.totalColumns)}\n {!initialLoading &&\n !initialError &&\n this.dataMode !== 'virtual' &&\n this.renderLazyBody(model)}\n </table>\n </div>\n )}\n </div>\n {this.renderResultFooter()}\n {this.renderOverflowActionMenu()}\n {this.captionController.renderMenus()}\n {this.renderTruncateTooltip()}\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":[]}