@awc-ui/core 1.0.0-beta.2 → 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js +8 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js.map +1 -0
- package/dist/cjs/engine.wasm-9JtXME10.js +12 -0
- package/dist/cjs/engine.wasm-9JtXME10.js.map +1 -0
- package/dist/cjs/{index-DlQ_5_Mv.js → index-Bm07YAg9.js} +4 -15
- package/dist/cjs/index-Bm07YAg9.js.map +1 -0
- package/dist/cjs/lazy-loading-indicator-CoC-_DMs.js +69 -0
- package/dist/cjs/lazy-loading-indicator-CoC-_DMs.js.map +1 -0
- package/dist/cjs/loader.cjs.js +4 -3
- package/dist/cjs/loader.cjs.js.map +1 -1
- package/dist/cjs/md-accordion-item.cjs.entry.js +4 -4
- package/dist/cjs/md-accordion.cjs.entry.js +1 -1
- package/dist/cjs/md-app-bar.cjs.entry.js +2 -2
- package/dist/cjs/md-area-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-autocomplete.cjs.entry.js +6 -5
- package/dist/cjs/md-autocomplete.cjs.entry.js.map +1 -1
- package/dist/cjs/md-avatar_2.cjs.entry.js +4 -4
- package/dist/cjs/md-badge.cjs.entry.js +3 -3
- package/dist/cjs/md-bar-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-bottom-sheet.cjs.entry.js +5 -5
- package/dist/cjs/md-breadcrumb-item.cjs.entry.js +1 -1
- package/dist/cjs/md-breadcrumbs.cjs.entry.js +3 -3
- package/dist/cjs/md-button-group.cjs.entry.js +3 -3
- package/dist/cjs/{md-button_7.cjs.entry.js → md-button_6.cjs.entry.js} +14 -39
- package/dist/cjs/md-button_6.cjs.entry.js.map +1 -0
- package/dist/cjs/md-checkbox.cjs.entry.js +3 -3
- package/dist/cjs/md-chip.cjs.entry.js +3 -3
- package/dist/cjs/md-color-picker.cjs.entry.js +1 -1
- package/dist/cjs/md-date-picker.cjs.entry.js +2 -2
- package/dist/cjs/md-dialog.cjs.entry.js +3 -3
- package/dist/cjs/md-divider.cjs.entry.js +3 -3
- package/dist/cjs/md-fab-menu-item.cjs.entry.js +3 -3
- package/dist/cjs/md-fab-menu.cjs.entry.js +3 -3
- package/dist/cjs/md-fab.cjs.entry.js +3 -3
- package/dist/cjs/md-line-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-list-item.cjs.entry.js +4 -4
- package/dist/cjs/md-list.cjs.entry.js +4 -4
- package/dist/cjs/md-loading-indicator-CmzdcYLR.js +33 -0
- package/dist/cjs/md-loading-indicator-CmzdcYLR.js.map +1 -0
- package/dist/cjs/md-loading-indicator.cjs.entry.js +11 -0
- package/dist/cjs/md-loading-indicator.cjs.entry.js.map +1 -0
- package/dist/cjs/md-menu-item-group.cjs.entry.js +1 -1
- package/dist/cjs/md-menu_2.cjs.entry.js +6 -6
- package/dist/cjs/md-meter.cjs.entry.js +1 -1
- package/dist/cjs/md-multi-select.cjs.entry.js +7 -6
- package/dist/cjs/md-multi-select.cjs.entry.js.map +1 -1
- package/dist/cjs/md-navigation-bar.cjs.entry.js +2 -2
- package/dist/cjs/md-navigation-rail-tab.cjs.entry.js +1 -1
- package/dist/cjs/md-navigation-rail.cjs.entry.js +1 -1
- package/dist/cjs/md-navigation-tab.cjs.entry.js +3 -3
- package/dist/cjs/md-number-field.cjs.entry.js +3 -3
- package/dist/cjs/md-organization-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-otp-field.cjs.entry.js +4 -4
- package/dist/cjs/md-pie-chart.cjs.entry.js +1 -1
- package/dist/cjs/md-progress-indicator.cjs.entry.js +1 -1
- package/dist/cjs/md-rating.cjs.entry.js +1 -1
- package/dist/cjs/md-search.cjs.entry.js +8 -7
- package/dist/cjs/md-search.cjs.entry.js.map +1 -1
- package/dist/cjs/md-segmented-button-set.cjs.entry.js +1 -1
- package/dist/cjs/md-segmented-button.cjs.entry.js +1 -1
- package/dist/cjs/md-select-option.cjs.entry.js +2 -2
- package/dist/cjs/md-select.cjs.entry.js +7 -6
- package/dist/cjs/md-select.cjs.entry.js.map +1 -1
- package/dist/cjs/md-side-sheet.cjs.entry.js +1 -1
- package/dist/cjs/md-skeleton.cjs.entry.js +1 -1
- package/dist/cjs/md-slider.cjs.entry.js +3 -3
- package/dist/cjs/md-sparkline.cjs.entry.js +3 -3
- package/dist/cjs/md-split-button.cjs.entry.js +1 -1
- package/dist/cjs/md-status-dot.cjs.entry.js +2 -2
- package/dist/cjs/md-step.cjs.entry.js +1 -1
- package/dist/cjs/md-stepper.cjs.entry.js +1 -1
- package/dist/cjs/md-sub-menu-item.cjs.entry.js +1 -1
- package/dist/cjs/md-switch.cjs.entry.js +1 -1
- package/dist/cjs/md-tab-panel.cjs.entry.js +1 -1
- package/dist/cjs/md-tab-panels.cjs.entry.js +1 -1
- package/dist/cjs/md-tab.cjs.entry.js +1 -1
- package/dist/cjs/md-table-body.cjs.entry.js +1 -1
- package/dist/cjs/md-table-cell.cjs.entry.js +1 -1
- package/dist/cjs/md-table-container.cjs.entry.js +1 -1
- package/dist/cjs/md-table-expand-toggle.cjs.entry.js +1 -1
- package/dist/cjs/md-table-foot.cjs.entry.js +1 -1
- package/dist/cjs/md-table-head.cjs.entry.js +1 -1
- package/dist/cjs/md-table-pagination.cjs.entry.js +1 -1
- package/dist/cjs/md-table-row.cjs.entry.js +1 -1
- package/dist/cjs/md-table-sort-label.cjs.entry.js +1 -1
- package/dist/cjs/md-table-toolbar.cjs.entry.js +1 -1
- package/dist/cjs/md-table.cjs.entry.js +4 -4
- package/dist/cjs/md-tabs.cjs.entry.js +1 -1
- package/dist/cjs/md-text-field.cjs.entry.js +8 -8
- package/dist/cjs/md-time-picker.cjs.entry.js +2 -2
- package/dist/cjs/md-toolbar.cjs.entry.js +1 -1
- package/dist/cjs/md-transfer-list.cjs.entry.js +2 -2
- package/dist/cjs/md3.cjs.js +4 -3
- package/dist/cjs/md3.cjs.js.map +1 -1
- package/dist/cjs/{virtual-select-controller-CqriaZgm.js → virtual-select-controller-C5cSoKfB.js} +10 -9
- package/dist/cjs/virtual-select-controller-C5cSoKfB.js.map +1 -0
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/md-accordion-item/md-accordion-item.js +3 -3
- package/dist/collection/components/md-app-bar/md-app-bar.js +1 -1
- package/dist/collection/components/md-area-chart/md-area-chart.js +2 -2
- package/dist/collection/components/md-autocomplete/md-autocomplete.js +4 -3
- package/dist/collection/components/md-autocomplete/md-autocomplete.js.map +1 -1
- package/dist/collection/components/md-avatar/md-avatar.js +2 -2
- package/dist/collection/components/md-badge/md-badge.js +2 -2
- package/dist/collection/components/md-bar-chart/md-bar-chart.js +2 -2
- package/dist/collection/components/md-bottom-sheet/md-bottom-sheet.js +4 -4
- package/dist/collection/components/md-breadcrumbs/md-breadcrumbs.js +2 -2
- package/dist/collection/components/md-button/md-button.js +4 -3
- package/dist/collection/components/md-button/md-button.js.map +1 -1
- package/dist/collection/components/md-button-group/md-button-group.js +2 -2
- package/dist/collection/components/md-card/md-card.js +2 -2
- package/dist/collection/components/md-checkbox/md-checkbox.js +2 -2
- package/dist/collection/components/md-chip/md-chip.js +2 -2
- package/dist/collection/components/md-date-picker/md-date-picker.js +1 -1
- package/dist/collection/components/md-dialog/md-dialog.js +2 -2
- package/dist/collection/components/md-divider/md-divider.js +2 -2
- package/dist/collection/components/md-fab/md-fab.js +2 -2
- package/dist/collection/components/md-fab-menu/md-fab-menu.js +2 -2
- package/dist/collection/components/md-fab-menu-item/md-fab-menu-item.js +2 -2
- package/dist/collection/components/md-icon-button/md-icon-button.js +4 -4
- package/dist/collection/components/md-line-chart/md-line-chart.js +2 -2
- package/dist/collection/components/md-list/md-list.js +3 -3
- package/dist/collection/components/md-list-item/md-list-item.js +3 -3
- package/dist/collection/components/md-loading-indicator/md-loading-indicator.js +2 -2
- package/dist/collection/components/md-menu/md-menu.js +3 -3
- package/dist/collection/components/md-menu-item/md-menu-item.js +2 -2
- package/dist/collection/components/md-multi-select/md-multi-select.js +5 -4
- package/dist/collection/components/md-multi-select/md-multi-select.js.map +1 -1
- package/dist/collection/components/md-navigation-bar/md-navigation-bar.js +1 -1
- package/dist/collection/components/md-navigation-tab/md-navigation-tab.js +2 -2
- package/dist/collection/components/md-number-field/md-number-field.js +2 -2
- package/dist/collection/components/md-organization-chart/md-organization-chart.js +2 -2
- package/dist/collection/components/md-otp-field/md-otp-field.js +3 -3
- package/dist/collection/components/md-ripple/md-ripple.js +1 -1
- package/dist/collection/components/md-search/md-search.js +7 -6
- package/dist/collection/components/md-search/md-search.js.map +1 -1
- package/dist/collection/components/md-select/md-select.js +5 -4
- package/dist/collection/components/md-select/md-select.js.map +1 -1
- package/dist/collection/components/md-select-option/md-select-option.js +1 -1
- package/dist/collection/components/md-slider/md-slider.js +2 -2
- package/dist/collection/components/md-sparkline/md-sparkline.js +2 -2
- package/dist/collection/components/md-status-dot/md-status-dot.js +1 -1
- package/dist/collection/components/md-table/md-table.js +3 -3
- package/dist/collection/components/md-text-field/md-text-field.js +7 -7
- package/dist/collection/components/md-time-picker/md-time-picker.js +1 -1
- package/dist/collection/components/md-tooltip/md-tooltip.js +1 -1
- package/dist/collection/components/md-transfer-list/md-transfer-list.js +1 -1
- package/dist/collection/utils/lazy-loading-indicator.js +62 -0
- package/dist/collection/utils/lazy-loading-indicator.js.map +1 -0
- package/dist/collection/wasm/engine-abi.js +8 -2
- package/dist/collection/wasm/engine-abi.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/md-accordion-item.js +1 -1
- package/dist/components/md-accordion.js +1 -1
- package/dist/components/md-app-bar.js +1 -1
- package/dist/components/md-area-chart.js +1 -1
- package/dist/components/md-autocomplete.js +1 -1
- package/dist/components/md-autocomplete.js.map +1 -1
- package/dist/components/md-avatar.js +1 -1
- package/dist/components/md-badge.js +1 -1
- package/dist/components/md-bar-chart.js +1 -1
- package/dist/components/md-bottom-sheet.js +1 -1
- package/dist/components/md-breadcrumb-item.js +1 -1
- package/dist/components/md-breadcrumbs.js +1 -1
- package/dist/components/md-button-group.js +1 -1
- package/dist/components/md-button.js +1 -1
- package/dist/components/md-card.js +1 -1
- package/dist/components/md-checkbox.js +1 -1
- package/dist/components/md-chip.js +1 -1
- package/dist/components/md-color-picker.js +1 -1
- package/dist/components/md-date-picker.js +1 -1
- package/dist/components/md-date-picker.js.map +1 -1
- package/dist/components/md-dialog.js +1 -1
- package/dist/components/md-dialog.js.map +1 -1
- package/dist/components/md-divider.js +1 -1
- package/dist/components/md-divider.js.map +1 -1
- package/dist/components/md-fab-menu-item.js +1 -1
- package/dist/components/md-fab-menu.js +1 -1
- package/dist/components/md-fab.js +1 -1
- package/dist/components/md-icon-button.js +1 -1
- package/dist/components/md-line-chart.js +1 -1
- package/dist/components/md-line-chart.js.map +1 -1
- package/dist/components/md-list-item.js +1 -1
- package/dist/components/md-list.js +1 -1
- package/dist/components/md-loading-indicator.js +1 -1
- package/dist/components/md-menu-item-group.js +1 -1
- package/dist/components/md-menu-item.js +1 -1
- package/dist/components/md-menu.js +1 -1
- package/dist/components/md-meter.js +1 -1
- package/dist/components/md-multi-select.js +1 -1
- package/dist/components/md-multi-select.js.map +1 -1
- package/dist/components/md-navigation-bar.js +1 -1
- package/dist/components/md-navigation-rail-tab.js +1 -1
- package/dist/components/md-navigation-rail.js +1 -1
- package/dist/components/md-navigation-tab.js +1 -1
- package/dist/components/md-number-field.js +1 -1
- package/dist/components/md-organization-chart.js +1 -1
- package/dist/components/md-otp-field.js +1 -1
- package/dist/components/md-pie-chart.js +1 -1
- package/dist/components/md-progress-indicator.js +1 -1
- package/dist/components/md-radio.js +1 -1
- package/dist/components/md-rating.js +1 -1
- package/dist/components/md-ripple.js +1 -1
- package/dist/components/md-search.js +1 -1
- package/dist/components/md-search.js.map +1 -1
- package/dist/components/md-segmented-button-set.js +1 -1
- package/dist/components/md-segmented-button.js +1 -1
- package/dist/components/md-select-option.js +1 -1
- package/dist/components/md-select.js +1 -1
- package/dist/components/md-side-sheet.js +1 -1
- package/dist/components/md-skeleton.js +1 -1
- package/dist/components/md-slider.js +1 -1
- package/dist/components/md-snackbar.js +1 -1
- package/dist/components/md-snackbar.js.map +1 -1
- package/dist/components/md-sparkline.js +1 -1
- package/dist/components/md-split-button.js +1 -1
- package/dist/components/md-status-dot.js +1 -1
- package/dist/components/md-step.js +1 -1
- package/dist/components/md-step.js.map +1 -1
- package/dist/components/md-stepper.js +1 -1
- package/dist/components/md-stepper.js.map +1 -1
- package/dist/components/md-sub-menu-item.js +1 -1
- package/dist/components/md-switch.js +1 -1
- package/dist/components/md-tab-panel.js +1 -1
- package/dist/components/md-tab-panels.js +1 -1
- package/dist/components/md-tab.js +1 -1
- package/dist/components/md-table-body.js +1 -1
- package/dist/components/md-table-cell.js +1 -1
- package/dist/components/md-table-container.js +1 -1
- package/dist/components/md-table-expand-toggle.js +1 -1
- package/dist/components/md-table-foot.js +1 -1
- package/dist/components/md-table-head.js +1 -1
- package/dist/components/md-table-pagination.js +1 -1
- package/dist/components/md-table-pagination.js.map +1 -1
- package/dist/components/md-table-row.js +1 -1
- package/dist/components/md-table-sort-label.js +1 -1
- package/dist/components/md-table-toolbar.js +1 -1
- package/dist/components/md-table.js +1 -1
- package/dist/components/md-tabs.js +1 -1
- package/dist/components/md-text-field.js +1 -1
- package/dist/components/md-time-picker.js +1 -1
- package/dist/components/md-time-picker.js.map +1 -1
- package/dist/components/md-toolbar.js +1 -1
- package/dist/components/md-tooltip.js +1 -1
- package/dist/components/md-transfer-list.js +1 -1
- package/dist/components/p-1RSrsLOs.js +2 -0
- package/dist/components/p-1RSrsLOs.js.map +1 -0
- package/dist/components/p-2HV152w7.js +2 -0
- package/dist/components/p-2HV152w7.js.map +1 -0
- package/dist/components/p-6ZDAcEKN.js +2 -0
- package/dist/components/p-6ZDAcEKN.js.map +1 -0
- package/dist/components/p-B2fYoYe9.js +2 -0
- package/dist/components/p-B2fYoYe9.js.map +1 -0
- package/dist/components/p-BR6gfOQH.js +2 -0
- package/dist/components/p-BR6gfOQH.js.map +1 -0
- package/dist/components/p-Bz-JaJcA.js +2 -0
- package/dist/components/p-Bz-JaJcA.js.map +1 -0
- package/dist/components/p-C77M30dm.js +2 -0
- package/dist/components/p-C77M30dm.js.map +1 -0
- package/dist/components/p-CNgkGl_1.js +2 -0
- package/dist/components/p-CNgkGl_1.js.map +1 -0
- package/dist/components/p-CfBPnYW7.js +2 -0
- package/dist/components/p-CfBPnYW7.js.map +1 -0
- package/dist/components/p-D5Ht729E.js +2 -0
- package/dist/components/p-D5Ht729E.js.map +1 -0
- package/dist/components/p-DPqGg8C1.js +2 -0
- package/dist/components/p-DPqGg8C1.js.map +1 -0
- package/dist/components/p-De3E5Q8v.js +2 -0
- package/dist/components/p-De3E5Q8v.js.map +1 -0
- package/dist/components/p-Dm_7DA1f.js +2 -0
- package/dist/components/p-Dm_7DA1f.js.map +1 -0
- package/dist/components/p-Dz3R-2Wn.js +2 -0
- package/dist/components/p-Dz3R-2Wn.js.map +1 -0
- package/dist/components/p-Zjf9uhOr.js +2 -0
- package/dist/components/p-Zjf9uhOr.js.map +1 -0
- package/dist/components/p-ssLobpGS.js +2 -0
- package/dist/components/p-ssLobpGS.js.map +1 -0
- package/dist/components/p-tSoecrcz.js +2 -0
- package/dist/components/p-tSoecrcz.js.map +1 -0
- package/dist/components/p-zMR3UIR_.js +2 -0
- package/dist/components/p-zMR3UIR_.js.map +1 -0
- package/dist/components-csr/index.js +2 -0
- package/dist/components-csr/index.js.map +1 -0
- package/dist/components-csr/md-accordion-item.js +2 -0
- package/dist/components-csr/md-accordion-item.js.map +1 -0
- package/dist/components-csr/md-accordion.js +2 -0
- package/dist/components-csr/md-accordion.js.map +1 -0
- package/dist/components-csr/md-app-bar.js +2 -0
- package/dist/components-csr/md-app-bar.js.map +1 -0
- package/dist/components-csr/md-area-chart.js +2 -0
- package/dist/components-csr/md-area-chart.js.map +1 -0
- package/dist/components-csr/md-autocomplete.js +2 -0
- package/dist/components-csr/md-autocomplete.js.map +1 -0
- package/dist/components-csr/md-avatar.js +2 -0
- package/dist/components-csr/md-avatar.js.map +1 -0
- package/dist/components-csr/md-badge.js +2 -0
- package/dist/components-csr/md-badge.js.map +1 -0
- package/dist/components-csr/md-bar-chart.js +2 -0
- package/dist/components-csr/md-bar-chart.js.map +1 -0
- package/dist/components-csr/md-bottom-sheet.js +2 -0
- package/dist/components-csr/md-bottom-sheet.js.map +1 -0
- package/dist/components-csr/md-breadcrumb-item.js +2 -0
- package/dist/components-csr/md-breadcrumb-item.js.map +1 -0
- package/dist/components-csr/md-breadcrumbs.js +2 -0
- package/dist/components-csr/md-breadcrumbs.js.map +1 -0
- package/dist/components-csr/md-button-group.js +2 -0
- package/dist/components-csr/md-button-group.js.map +1 -0
- package/dist/components-csr/md-button.js +2 -0
- package/dist/components-csr/md-button.js.map +1 -0
- package/dist/components-csr/md-card.js +2 -0
- package/dist/components-csr/md-card.js.map +1 -0
- package/dist/components-csr/md-checkbox.js +2 -0
- package/dist/components-csr/md-checkbox.js.map +1 -0
- package/dist/components-csr/md-chip.js +2 -0
- package/dist/components-csr/md-chip.js.map +1 -0
- package/dist/components-csr/md-color-picker.js +2 -0
- package/dist/components-csr/md-color-picker.js.map +1 -0
- package/dist/components-csr/md-date-picker.js +2 -0
- package/dist/components-csr/md-date-picker.js.map +1 -0
- package/dist/components-csr/md-dialog.js +2 -0
- package/dist/components-csr/md-dialog.js.map +1 -0
- package/dist/components-csr/md-divider.js +2 -0
- package/dist/components-csr/md-divider.js.map +1 -0
- package/dist/components-csr/md-fab-menu-item.js +2 -0
- package/dist/components-csr/md-fab-menu-item.js.map +1 -0
- package/dist/components-csr/md-fab-menu.js +2 -0
- package/dist/components-csr/md-fab-menu.js.map +1 -0
- package/dist/components-csr/md-fab.js +2 -0
- package/dist/components-csr/md-fab.js.map +1 -0
- package/dist/components-csr/md-icon-button.js +2 -0
- package/dist/components-csr/md-icon-button.js.map +1 -0
- package/dist/components-csr/md-line-chart.js +2 -0
- package/dist/components-csr/md-line-chart.js.map +1 -0
- package/dist/components-csr/md-list-item.js +2 -0
- package/dist/components-csr/md-list-item.js.map +1 -0
- package/dist/components-csr/md-list.js +2 -0
- package/dist/components-csr/md-list.js.map +1 -0
- package/dist/components-csr/md-loading-indicator.js +2 -0
- package/dist/components-csr/md-loading-indicator.js.map +1 -0
- package/dist/components-csr/md-menu-item-group.js +2 -0
- package/dist/components-csr/md-menu-item-group.js.map +1 -0
- package/dist/components-csr/md-menu-item.js +2 -0
- package/dist/components-csr/md-menu-item.js.map +1 -0
- package/dist/components-csr/md-menu.js +2 -0
- package/dist/components-csr/md-menu.js.map +1 -0
- package/dist/components-csr/md-meter.js +2 -0
- package/dist/components-csr/md-meter.js.map +1 -0
- package/dist/components-csr/md-multi-select.js +2 -0
- package/dist/components-csr/md-multi-select.js.map +1 -0
- package/dist/components-csr/md-navigation-bar.js +2 -0
- package/dist/components-csr/md-navigation-bar.js.map +1 -0
- package/dist/components-csr/md-navigation-rail-tab.js +2 -0
- package/dist/components-csr/md-navigation-rail-tab.js.map +1 -0
- package/dist/components-csr/md-navigation-rail.js +2 -0
- package/dist/components-csr/md-navigation-rail.js.map +1 -0
- package/dist/components-csr/md-navigation-tab.js +2 -0
- package/dist/components-csr/md-navigation-tab.js.map +1 -0
- package/dist/components-csr/md-number-field.js +2 -0
- package/dist/components-csr/md-number-field.js.map +1 -0
- package/dist/components-csr/md-organization-chart.js +2 -0
- package/dist/components-csr/md-organization-chart.js.map +1 -0
- package/dist/components-csr/md-otp-field.js +2 -0
- package/dist/components-csr/md-otp-field.js.map +1 -0
- package/dist/components-csr/md-pie-chart.js +2 -0
- package/dist/components-csr/md-pie-chart.js.map +1 -0
- package/dist/components-csr/md-progress-indicator.js +2 -0
- package/dist/components-csr/md-progress-indicator.js.map +1 -0
- package/dist/components-csr/md-radio.js +2 -0
- package/dist/components-csr/md-radio.js.map +1 -0
- package/dist/components-csr/md-rating.js +2 -0
- package/dist/components-csr/md-rating.js.map +1 -0
- package/dist/components-csr/md-ripple.js +2 -0
- package/dist/components-csr/md-ripple.js.map +1 -0
- package/dist/components-csr/md-search.js +2 -0
- package/dist/components-csr/md-search.js.map +1 -0
- package/dist/components-csr/md-segmented-button-set.js +2 -0
- package/dist/components-csr/md-segmented-button-set.js.map +1 -0
- package/dist/components-csr/md-segmented-button.js +2 -0
- package/dist/components-csr/md-segmented-button.js.map +1 -0
- package/dist/components-csr/md-select-option.js +2 -0
- package/dist/components-csr/md-select-option.js.map +1 -0
- package/dist/components-csr/md-select.js +2 -0
- package/dist/components-csr/md-select.js.map +1 -0
- package/dist/components-csr/md-side-sheet.js +2 -0
- package/dist/components-csr/md-side-sheet.js.map +1 -0
- package/dist/components-csr/md-skeleton.js +2 -0
- package/dist/components-csr/md-skeleton.js.map +1 -0
- package/dist/components-csr/md-slider.js +2 -0
- package/dist/components-csr/md-slider.js.map +1 -0
- package/dist/components-csr/md-snackbar.js +2 -0
- package/dist/components-csr/md-snackbar.js.map +1 -0
- package/dist/components-csr/md-sparkline.js +2 -0
- package/dist/components-csr/md-sparkline.js.map +1 -0
- package/dist/components-csr/md-split-button.js +2 -0
- package/dist/components-csr/md-split-button.js.map +1 -0
- package/dist/components-csr/md-status-dot.js +2 -0
- package/dist/components-csr/md-status-dot.js.map +1 -0
- package/dist/components-csr/md-step.js +2 -0
- package/dist/components-csr/md-step.js.map +1 -0
- package/dist/components-csr/md-stepper.js +2 -0
- package/dist/components-csr/md-stepper.js.map +1 -0
- package/dist/components-csr/md-sub-menu-item.js +2 -0
- package/dist/components-csr/md-sub-menu-item.js.map +1 -0
- package/dist/components-csr/md-switch.js +2 -0
- package/dist/components-csr/md-switch.js.map +1 -0
- package/dist/components-csr/md-tab-panel.js +2 -0
- package/dist/components-csr/md-tab-panel.js.map +1 -0
- package/dist/components-csr/md-tab-panels.js +2 -0
- package/dist/components-csr/md-tab-panels.js.map +1 -0
- package/dist/components-csr/md-tab.js +2 -0
- package/dist/components-csr/md-tab.js.map +1 -0
- package/dist/components-csr/md-table-body.js +2 -0
- package/dist/components-csr/md-table-body.js.map +1 -0
- package/dist/components-csr/md-table-cell.js +2 -0
- package/dist/components-csr/md-table-cell.js.map +1 -0
- package/dist/components-csr/md-table-container.js +2 -0
- package/dist/components-csr/md-table-container.js.map +1 -0
- package/dist/components-csr/md-table-expand-toggle.js +2 -0
- package/dist/components-csr/md-table-expand-toggle.js.map +1 -0
- package/dist/components-csr/md-table-foot.js +2 -0
- package/dist/components-csr/md-table-foot.js.map +1 -0
- package/dist/components-csr/md-table-head.js +2 -0
- package/dist/components-csr/md-table-head.js.map +1 -0
- package/dist/components-csr/md-table-pagination.js +2 -0
- package/dist/components-csr/md-table-pagination.js.map +1 -0
- package/dist/components-csr/md-table-row.js +2 -0
- package/dist/components-csr/md-table-row.js.map +1 -0
- package/dist/components-csr/md-table-sort-label.js +2 -0
- package/dist/components-csr/md-table-sort-label.js.map +1 -0
- package/dist/components-csr/md-table-toolbar.js +2 -0
- package/dist/components-csr/md-table-toolbar.js.map +1 -0
- package/dist/components-csr/md-table.js +2 -0
- package/dist/components-csr/md-table.js.map +1 -0
- package/dist/components-csr/md-tabs.js +2 -0
- package/dist/components-csr/md-tabs.js.map +1 -0
- package/dist/components-csr/md-text-field.js +2 -0
- package/dist/components-csr/md-text-field.js.map +1 -0
- package/dist/components-csr/md-time-picker.js +2 -0
- package/dist/components-csr/md-time-picker.js.map +1 -0
- package/dist/components-csr/md-toolbar.js +2 -0
- package/dist/components-csr/md-toolbar.js.map +1 -0
- package/dist/components-csr/md-tooltip.js +2 -0
- package/dist/components-csr/md-tooltip.js.map +1 -0
- package/dist/components-csr/md-transfer-list.js +2 -0
- package/dist/components-csr/md-transfer-list.js.map +1 -0
- package/dist/components-csr/p-6WgHjhDg.js +2 -0
- package/dist/components-csr/p-6WgHjhDg.js.map +1 -0
- package/dist/{components/p-uTEkf0sE.js → components-csr/p-BEmwDSzw.js} +2 -2
- package/dist/{components/p-C8EP4S21.js → components-csr/p-BQKzjYcY.js} +2 -2
- package/dist/{components/p-BwXpiUsu.js → components-csr/p-BWMwewtY.js} +2 -2
- package/dist/{components/p-DXXUoRSH.js → components-csr/p-BZakoRau.js} +2 -2
- package/dist/components-csr/p-BZakoRau.js.map +1 -0
- package/dist/{md3/p-BjYKc1Ge.js → components-csr/p-BdEoSBtL.js} +2 -2
- package/dist/components-csr/p-BdEoSBtL.js.map +1 -0
- package/dist/{components/p-B0Opn6dK.js → components-csr/p-Bkt_X-6v.js} +2 -2
- package/dist/components-csr/p-Bx6--dQF.js.map +1 -0
- package/dist/components-csr/p-Bz-JaJcA.js +2 -0
- package/dist/components-csr/p-Bz-JaJcA.js.map +1 -0
- package/dist/{components/p-stybaFzj.js → components-csr/p-C3vB0Hd9.js} +2 -2
- package/dist/{components/p-B3MWYEEJ.js → components-csr/p-CF7mq5T7.js} +2 -2
- package/dist/{components/p-7fN_yCXW.js → components-csr/p-CVMM-tdC.js} +2 -2
- package/dist/components-csr/p-C_ogF68H.js.map +1 -0
- package/dist/components-csr/p-Cch_V1vi.js +2 -0
- package/dist/components-csr/p-Cch_V1vi.js.map +1 -0
- package/dist/components-csr/p-CfBPnYW7.js +2 -0
- package/dist/components-csr/p-CfBPnYW7.js.map +1 -0
- package/dist/components-csr/p-CxhZdOPw.js +2 -0
- package/dist/components-csr/p-CxhZdOPw.js.map +1 -0
- package/dist/{components/p-Ch2-tttM.js → components-csr/p-DMQ-6aj8.js} +2 -2
- package/dist/components-csr/p-DWxN44zD.js +2 -0
- package/dist/components-csr/p-DWxN44zD.js.map +1 -0
- package/dist/components-csr/p-DYBUr7K_.js +2 -0
- package/dist/components-csr/p-DYBUr7K_.js.map +1 -0
- package/dist/{components/p-e2HRV63Y.js → components-csr/p-DfcpeJAu.js} +2 -2
- package/dist/{components/p-Dp-w93ot.js → components-csr/p-DjKPc5EU.js} +2 -2
- package/dist/components-csr/p-DvOKnoqK.js.map +1 -0
- package/dist/components-csr/p-DzPKu-Ma.js.map +1 -0
- package/dist/{components/p-UdGDg2oJ.js → components-csr/p-If0JHsYV.js} +2 -2
- package/dist/components-csr/p-If0JHsYV.js.map +1 -0
- package/dist/components-csr/p-RLxbNqRv.js.map +1 -0
- package/dist/{components/p-6wZSqm_2.js → components-csr/p-R_guULjT.js} +2 -2
- package/dist/components-csr/p-bSpXNc5J.js +2 -0
- package/dist/components-csr/p-bSpXNc5J.js.map +1 -0
- package/dist/{components/p-Ddiw2Kjw.js → components-csr/p-uSMrgqAy.js} +2 -2
- package/dist/components-csr/package.json +3 -0
- package/dist/esm/{a11y-C6CRqodW.js → a11y-BckJ95d7.js} +3 -3
- package/dist/esm/{a11y-C6CRqodW.js.map → a11y-BckJ95d7.js.map} +1 -1
- package/dist/esm/app-globals-DQuL1Twl.js +6 -0
- package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
- package/dist/esm/{bar-chart-ZZrajEkM.js → bar-chart-BuTyuCbt.js} +4 -4
- package/dist/esm/{bar-chart-ZZrajEkM.js.map → bar-chart-BuTyuCbt.js.map} +1 -1
- package/dist/esm/{chart-32olae06.js → chart-ByIhkqsG.js} +4 -4
- package/dist/esm/{chart-32olae06.js.map → chart-ByIhkqsG.js.map} +1 -1
- package/dist/esm/engine.wasm-CfBPnYW7.js +10 -0
- package/dist/esm/engine.wasm-CfBPnYW7.js.map +1 -0
- package/dist/esm/{hit-test-DHldf5Lm.js → hit-test-c_hI-yCX.js} +3 -3
- package/dist/esm/{hit-test-DHldf5Lm.js.map → hit-test-c_hI-yCX.js.map} +1 -1
- package/dist/esm/{index-DTaX19_O.js → index-WmvQpZnM.js} +5 -15
- package/dist/esm/index-WmvQpZnM.js.map +1 -0
- package/dist/esm/lazy-loading-indicator-BWFcjJiK.js +67 -0
- package/dist/esm/lazy-loading-indicator-BWFcjJiK.js.map +1 -0
- package/dist/esm/loader.js +4 -3
- package/dist/esm/loader.js.map +1 -1
- package/dist/esm/md-accordion-item.entry.js +4 -4
- package/dist/esm/md-accordion.entry.js +1 -1
- package/dist/esm/md-app-bar.entry.js +2 -2
- package/dist/esm/md-area-chart.entry.js +7 -7
- package/dist/esm/md-autocomplete.entry.js +6 -5
- package/dist/esm/md-autocomplete.entry.js.map +1 -1
- package/dist/esm/md-avatar_2.entry.js +4 -4
- package/dist/esm/md-badge.entry.js +3 -3
- package/dist/esm/md-bar-chart.entry.js +7 -7
- package/dist/esm/md-bottom-sheet.entry.js +5 -5
- package/dist/esm/md-breadcrumb-item.entry.js +2 -2
- package/dist/esm/md-breadcrumbs.entry.js +3 -3
- package/dist/esm/md-button-group.entry.js +3 -3
- package/dist/esm/{md-button_7.entry.js → md-button_6.entry.js} +16 -40
- package/dist/esm/md-button_6.entry.js.map +1 -0
- package/dist/esm/md-checkbox.entry.js +3 -3
- package/dist/esm/md-chip.entry.js +3 -3
- package/dist/esm/md-color-picker.entry.js +1 -1
- package/dist/esm/md-date-picker.entry.js +2 -2
- package/dist/esm/md-dialog.entry.js +3 -3
- package/dist/esm/md-divider.entry.js +3 -3
- package/dist/esm/md-fab-menu-item.entry.js +3 -3
- package/dist/esm/md-fab-menu.entry.js +3 -3
- package/dist/esm/md-fab.entry.js +3 -3
- package/dist/esm/md-line-chart.entry.js +7 -7
- package/dist/esm/md-list-item.entry.js +5 -5
- package/dist/esm/md-list.entry.js +4 -4
- package/dist/esm/md-loading-indicator-Bf-Pt29l.js +31 -0
- package/dist/esm/md-loading-indicator-Bf-Pt29l.js.map +1 -0
- package/dist/esm/md-loading-indicator.entry.js +5 -0
- package/dist/esm/md-loading-indicator.entry.js.map +1 -0
- package/dist/esm/md-menu-item-group.entry.js +1 -1
- package/dist/esm/md-menu_2.entry.js +6 -6
- package/dist/esm/md-meter.entry.js +1 -1
- package/dist/esm/md-multi-select.entry.js +7 -6
- package/dist/esm/md-multi-select.entry.js.map +1 -1
- package/dist/esm/md-navigation-bar.entry.js +2 -2
- package/dist/esm/md-navigation-rail-tab.entry.js +2 -2
- package/dist/esm/md-navigation-rail.entry.js +1 -1
- package/dist/esm/md-navigation-tab.entry.js +4 -4
- package/dist/esm/md-number-field.entry.js +3 -3
- package/dist/esm/md-organization-chart.entry.js +3 -3
- package/dist/esm/md-otp-field.entry.js +4 -4
- package/dist/esm/md-pie-chart.entry.js +3 -3
- package/dist/esm/md-progress-indicator.entry.js +1 -1
- package/dist/esm/md-rating.entry.js +1 -1
- package/dist/esm/md-search.entry.js +8 -7
- package/dist/esm/md-search.entry.js.map +1 -1
- package/dist/esm/md-segmented-button-set.entry.js +1 -1
- package/dist/esm/md-segmented-button.entry.js +1 -1
- package/dist/esm/md-select-option.entry.js +2 -2
- package/dist/esm/md-select.entry.js +7 -6
- package/dist/esm/md-select.entry.js.map +1 -1
- package/dist/esm/md-side-sheet.entry.js +1 -1
- package/dist/esm/md-skeleton.entry.js +1 -1
- package/dist/esm/md-slider.entry.js +3 -3
- package/dist/esm/md-sparkline.entry.js +7 -7
- package/dist/esm/md-split-button.entry.js +1 -1
- package/dist/esm/md-status-dot.entry.js +2 -2
- package/dist/esm/md-step.entry.js +1 -1
- package/dist/esm/md-stepper.entry.js +1 -1
- package/dist/esm/md-sub-menu-item.entry.js +1 -1
- package/dist/esm/md-switch.entry.js +1 -1
- package/dist/esm/md-tab-panel.entry.js +1 -1
- package/dist/esm/md-tab-panels.entry.js +1 -1
- package/dist/esm/md-tab.entry.js +1 -1
- package/dist/esm/md-table-body.entry.js +1 -1
- package/dist/esm/md-table-cell.entry.js +1 -1
- package/dist/esm/md-table-container.entry.js +1 -1
- package/dist/esm/md-table-expand-toggle.entry.js +1 -1
- package/dist/esm/md-table-foot.entry.js +1 -1
- package/dist/esm/md-table-head.entry.js +1 -1
- package/dist/esm/md-table-pagination.entry.js +1 -1
- package/dist/esm/md-table-row.entry.js +1 -1
- package/dist/esm/md-table-sort-label.entry.js +1 -1
- package/dist/esm/md-table-toolbar.entry.js +1 -1
- package/dist/esm/md-table.entry.js +4 -4
- package/dist/esm/md-tabs.entry.js +1 -1
- package/dist/esm/md-text-field.entry.js +8 -8
- package/dist/esm/md-time-picker.entry.js +2 -2
- package/dist/esm/md-toolbar.entry.js +1 -1
- package/dist/esm/md-transfer-list.entry.js +2 -2
- package/dist/esm/md3.js +4 -3
- package/dist/esm/md3.js.map +1 -1
- package/dist/esm/{rtl-DvOKnoqK.js → rtl-CVFH1DkU.js} +3 -3
- package/dist/esm/{rtl-DvOKnoqK.js.map → rtl-CVFH1DkU.js.map} +1 -1
- package/dist/esm/{url-BjYKc1Ge.js → url-BdEoSBtL.js} +3 -3
- package/dist/esm/{url-BjYKc1Ge.js.map → url-BdEoSBtL.js.map} +1 -1
- package/dist/esm/{virtual-select-controller-BEWIC0pC.js → virtual-select-controller-CR60w6DO.js} +10 -9
- package/dist/esm/virtual-select-controller-CR60w6DO.js.map +1 -0
- package/dist/md3/md3.css +1 -1
- package/dist/md3/md3.esm.js +1 -1
- package/dist/md3/md3.esm.js.map +1 -1
- package/dist/md3/p-08f1c469.entry.js +2 -0
- package/dist/md3/{p-4d82132d.entry.js.map → p-08f1c469.entry.js.map} +1 -1
- package/dist/md3/{p-9ddbf247.entry.js → p-108f89d7.entry.js} +2 -2
- package/dist/md3/p-1112bffc.entry.js +2 -0
- package/dist/md3/{p-cf07e761.entry.js.map → p-1112bffc.entry.js.map} +1 -1
- package/dist/md3/{p-c6a12344.entry.js → p-114c270b.entry.js} +2 -2
- package/dist/md3/p-1835fe36.entry.js +2 -0
- package/dist/md3/{p-a3308c40.entry.js.map → p-1835fe36.entry.js.map} +1 -1
- package/dist/md3/{p-396089fd.entry.js → p-1edb5a0d.entry.js} +2 -2
- package/dist/md3/p-2ba2db3b.entry.js +2 -0
- package/dist/md3/{p-6b2871a0.entry.js.map → p-2ba2db3b.entry.js.map} +1 -1
- package/dist/md3/p-3508d0e0.entry.js +2 -0
- package/dist/md3/{p-f31ab454.entry.js.map → p-3508d0e0.entry.js.map} +1 -1
- package/dist/md3/{p-b34d385b.entry.js → p-35b05b45.entry.js} +2 -2
- package/dist/md3/{p-c2dd8c8c.entry.js → p-38e9a583.entry.js} +2 -2
- package/dist/md3/{p-be02624e.entry.js → p-3c0469aa.entry.js} +2 -2
- package/dist/md3/p-3f64a27d.entry.js +2 -0
- package/dist/md3/{p-fb61868c.entry.js.map → p-3f64a27d.entry.js.map} +1 -1
- package/dist/md3/{p-63b8c8d1.entry.js → p-408ee4be.entry.js} +2 -2
- package/dist/md3/{p-edb34a6d.entry.js → p-43c708ad.entry.js} +2 -2
- package/dist/md3/{p-3015c7e3.entry.js → p-4770b534.entry.js} +2 -2
- package/dist/md3/{p-c861d774.entry.js → p-4b7cf934.entry.js} +2 -2
- package/dist/md3/{p-2e09a7b7.entry.js → p-4f26bd60.entry.js} +2 -2
- package/dist/md3/{p-7b463fbe.entry.js → p-4f2e82cb.entry.js} +2 -2
- package/dist/md3/{p-be412e3f.entry.js → p-501bf161.entry.js} +2 -2
- package/dist/md3/{p-c063c823.entry.js → p-56c7c570.entry.js} +2 -2
- package/dist/md3/{p-2e9503d7.entry.js → p-56ca0c3c.entry.js} +2 -2
- package/dist/md3/{p-ac8762e5.entry.js → p-5b63149a.entry.js} +2 -2
- package/dist/md3/{p-c5af701b.entry.js → p-5f668b0a.entry.js} +2 -2
- package/dist/md3/p-6237ddac.entry.js +2 -0
- package/dist/md3/{p-e7dc5a32.entry.js.map → p-6237ddac.entry.js.map} +1 -1
- package/dist/md3/{p-8eb0b6a4.entry.js → p-6d65fc6a.entry.js} +2 -2
- package/dist/md3/{p-e3124e1e.entry.js → p-707b6d7c.entry.js} +2 -2
- package/dist/md3/{p-a5fee424.entry.js → p-71f1660b.entry.js} +2 -2
- package/dist/md3/{p-1a8ec5bc.entry.js → p-7501170f.entry.js} +2 -2
- package/dist/md3/p-7c8842bf.entry.js +2 -0
- package/dist/md3/{p-ba2ebde1.entry.js.map → p-7c8842bf.entry.js.map} +1 -1
- package/dist/md3/{p-4e3d6e40.entry.js → p-7d1686a7.entry.js} +2 -2
- package/dist/md3/p-7e7f0e45.entry.js +2 -0
- package/dist/md3/p-7e7f0e45.entry.js.map +1 -0
- package/dist/md3/p-80379565.entry.js +2 -0
- package/dist/md3/{p-6c44cf13.entry.js.map → p-80379565.entry.js.map} +1 -1
- package/dist/md3/p-830724e4.entry.js +2 -0
- package/dist/md3/p-830724e4.entry.js.map +1 -0
- package/dist/md3/{p-4dda4cb0.entry.js → p-845ca9cc.entry.js} +2 -2
- package/dist/md3/{p-77a01bcc.entry.js → p-87f88d62.entry.js} +2 -2
- package/dist/md3/{p-5b74694e.entry.js → p-89d47130.entry.js} +2 -2
- package/dist/md3/p-8a6fed13.entry.js +2 -0
- package/dist/md3/{p-a803da99.entry.js.map → p-8a6fed13.entry.js.map} +1 -1
- package/dist/md3/p-8a7e0297.entry.js +2 -0
- package/dist/md3/p-8a7e0297.entry.js.map +1 -0
- package/dist/md3/{p-b0431a5c.entry.js → p-8bdcda53.entry.js} +2 -2
- package/dist/md3/{p-c10a33c2.entry.js → p-8e7df348.entry.js} +2 -2
- package/dist/md3/p-9003a7d4.entry.js +2 -0
- package/dist/md3/p-9003a7d4.entry.js.map +1 -0
- package/dist/md3/{p-05ae91b6.entry.js → p-90ccf4c3.entry.js} +2 -2
- package/dist/md3/p-BdEoSBtL.js +2 -0
- package/dist/md3/{p-BjYKc1Ge.js.map → p-BdEoSBtL.js.map} +1 -1
- package/dist/md3/p-Bz-JaJcA.js +2 -0
- package/dist/md3/p-Bz-JaJcA.js.map +1 -0
- package/dist/md3/p-CGqeEMjY.js +2 -0
- package/dist/md3/{p-DzPKu-Ma.js.map → p-CGqeEMjY.js.map} +1 -1
- package/dist/md3/p-CVFH1DkU.js +2 -0
- package/dist/md3/{p-DvOKnoqK.js.map → p-CVFH1DkU.js.map} +1 -1
- package/dist/md3/p-Cch92tDM.js +2 -0
- package/dist/md3/{p-RLxbNqRv.js.map → p-Cch92tDM.js.map} +1 -1
- package/dist/md3/p-CfBPnYW7.js +2 -0
- package/dist/md3/p-CfBPnYW7.js.map +1 -0
- package/dist/md3/p-D17cVKxS.js +2 -0
- package/dist/md3/p-D17cVKxS.js.map +1 -0
- package/dist/md3/p-DGtztV3K.js +2 -0
- package/dist/md3/{p-Bx6--dQF.js.map → p-DGtztV3K.js.map} +1 -1
- package/dist/md3/p-DQuL1Twl.js +2 -0
- package/dist/md3/p-DQuL1Twl.js.map +1 -0
- package/dist/md3/p-DnKDoE8K.js +2 -0
- package/dist/md3/p-DnKDoE8K.js.map +1 -0
- package/dist/md3/p-WmvQpZnM.js +3 -0
- package/dist/md3/p-WmvQpZnM.js.map +1 -0
- package/dist/md3/p-a3623653.entry.js +2 -0
- package/dist/md3/{p-19ee9c33.entry.js.map → p-a3623653.entry.js.map} +1 -1
- package/dist/md3/{p-da4e27d4.entry.js → p-a4d4cfed.entry.js} +2 -2
- package/dist/md3/{p-5394254f.entry.js → p-a976498b.entry.js} +2 -2
- package/dist/md3/{p-6038b907.entry.js → p-ab568d1c.entry.js} +2 -2
- package/dist/md3/{p-bf7842f8.entry.js → p-adf8a415.entry.js} +2 -2
- package/dist/md3/p-ae30e899.entry.js +2 -0
- package/dist/md3/p-ae30e899.entry.js.map +1 -0
- package/dist/md3/{p-45280bf4.entry.js → p-b2d88292.entry.js} +2 -2
- package/dist/md3/{p-796f79f8.entry.js → p-b3b5247b.entry.js} +2 -2
- package/dist/md3/{p-5b799707.entry.js → p-b4266f6b.entry.js} +2 -2
- package/dist/md3/p-b54bbf88.entry.js +2 -0
- package/dist/md3/p-b54bbf88.entry.js.map +1 -0
- package/dist/md3/{p-c00f7514.entry.js → p-ba011453.entry.js} +2 -2
- package/dist/md3/{p-6ba63c73.entry.js → p-bc24f0c9.entry.js} +2 -2
- package/dist/md3/{p-0c2e824d.entry.js → p-c20fbb9e.entry.js} +2 -2
- package/dist/md3/{p-fc0b325d.entry.js → p-c2944c87.entry.js} +2 -2
- package/dist/md3/{p-4e45b2ff.entry.js → p-c58c68d0.entry.js} +2 -2
- package/dist/md3/p-cc6e8afd.entry.js +2 -0
- package/dist/md3/{p-72457a85.entry.js.map → p-cc6e8afd.entry.js.map} +1 -1
- package/dist/md3/{p-0f764a1e.entry.js → p-d2e39c6e.entry.js} +2 -2
- package/dist/md3/{p-50555bb7.entry.js → p-d8885f53.entry.js} +2 -2
- package/dist/md3/{p-c1ca6f6c.entry.js → p-db6fb4e1.entry.js} +2 -2
- package/dist/md3/{p-81843ff7.entry.js → p-dcba2857.entry.js} +2 -2
- package/dist/md3/{p-65195996.entry.js → p-e357e8ac.entry.js} +2 -2
- package/dist/md3/{p-39cb7c24.entry.js → p-e5c6795e.entry.js} +2 -2
- package/dist/md3/p-e871663b.entry.js +2 -0
- package/dist/md3/{p-aaec2698.entry.js.map → p-e871663b.entry.js.map} +1 -1
- package/dist/md3/p-f1b69181.entry.js +2 -0
- package/dist/md3/{p-a986fd24.entry.js.map → p-f1b69181.entry.js.map} +1 -1
- package/dist/md3/p-f297d786.entry.js +2 -0
- package/dist/md3/{p-3cce1de3.entry.js.map → p-f297d786.entry.js.map} +1 -1
- package/dist/md3/{p-e6d7f0ff.entry.js → p-f403ad20.entry.js} +2 -2
- package/dist/md3/p-f5399b73.entry.js +2 -0
- package/dist/md3/{p-04e97f5d.entry.js.map → p-f5399b73.entry.js.map} +1 -1
- package/dist/md3/{p-708a9313.entry.js → p-f5fd9a0b.entry.js} +2 -2
- package/dist/md3/{p-aa0e7d4d.entry.js → p-f71af38f.entry.js} +2 -2
- package/dist/md3/{p-757e3aaf.entry.js → p-fac6da4c.entry.js} +2 -2
- package/dist/md3/{p-134b670a.entry.js → p-fc864f96.entry.js} +2 -2
- package/dist/md3/{p-32bdd439.entry.js → p-fd686966.entry.js} +2 -2
- package/dist/md3/p-nhfFYWzy.js +2 -0
- package/dist/md3/{p-C_ogF68H.js.map → p-nhfFYWzy.js.map} +1 -1
- package/dist/types/utils/lazy-loading-indicator.d.ts +7 -0
- package/dist/types/wasm/engine-abi.d.ts +14 -0
- package/hydrate/index.js +191 -113
- package/hydrate/index.mjs +191 -113
- package/package.json +30 -5
- package/dist/cjs/index-DlQ_5_Mv.js.map +0 -1
- package/dist/cjs/md-button_7.cjs.entry.js.map +0 -1
- package/dist/cjs/virtual-select-controller-CqriaZgm.js.map +0 -1
- package/dist/components/p-BEWIC0pC.js +0 -2
- package/dist/components/p-BEWIC0pC.js.map +0 -1
- package/dist/components/p-DXXUoRSH.js.map +0 -1
- package/dist/components/p-MWBNn6Lj.js +0 -2
- package/dist/components/p-MWBNn6Lj.js.map +0 -1
- package/dist/components/p-UdGDg2oJ.js.map +0 -1
- package/dist/esm/index-DTaX19_O.js.map +0 -1
- package/dist/esm/md-button_7.entry.js.map +0 -1
- package/dist/esm/virtual-select-controller-BEWIC0pC.js.map +0 -1
- package/dist/md3/p-04e97f5d.entry.js +0 -2
- package/dist/md3/p-19ee9c33.entry.js +0 -2
- package/dist/md3/p-21772851.entry.js +0 -2
- package/dist/md3/p-21772851.entry.js.map +0 -1
- package/dist/md3/p-3cce1de3.entry.js +0 -2
- package/dist/md3/p-47af9819.entry.js +0 -2
- package/dist/md3/p-47af9819.entry.js.map +0 -1
- package/dist/md3/p-4d82132d.entry.js +0 -2
- package/dist/md3/p-6b2871a0.entry.js +0 -2
- package/dist/md3/p-6c44cf13.entry.js +0 -2
- package/dist/md3/p-72457a85.entry.js +0 -2
- package/dist/md3/p-BEWIC0pC.js +0 -2
- package/dist/md3/p-BEWIC0pC.js.map +0 -1
- package/dist/md3/p-DTaX19_O.js +0 -3
- package/dist/md3/p-DTaX19_O.js.map +0 -1
- package/dist/md3/p-a3308c40.entry.js +0 -2
- package/dist/md3/p-a7ffb779.entry.js +0 -2
- package/dist/md3/p-a7ffb779.entry.js.map +0 -1
- package/dist/md3/p-a803da99.entry.js +0 -2
- package/dist/md3/p-a986fd24.entry.js +0 -2
- package/dist/md3/p-aaec2698.entry.js +0 -2
- package/dist/md3/p-ac35ac5f.entry.js +0 -2
- package/dist/md3/p-ac35ac5f.entry.js.map +0 -1
- package/dist/md3/p-b4631a55.entry.js +0 -2
- package/dist/md3/p-b4631a55.entry.js.map +0 -1
- package/dist/md3/p-ba2ebde1.entry.js +0 -2
- package/dist/md3/p-cf07e761.entry.js +0 -2
- package/dist/md3/p-e7dc5a32.entry.js +0 -2
- package/dist/md3/p-f31ab454.entry.js +0 -2
- package/dist/md3/p-fb61868c.entry.js +0 -2
- /package/dist/{components/p-uTEkf0sE.js.map → components-csr/p-BEmwDSzw.js.map} +0 -0
- /package/dist/{components/p-C8EP4S21.js.map → components-csr/p-BQKzjYcY.js.map} +0 -0
- /package/dist/{components/p-BwXpiUsu.js.map → components-csr/p-BWMwewtY.js.map} +0 -0
- /package/dist/{components/p-B0Opn6dK.js.map → components-csr/p-Bkt_X-6v.js.map} +0 -0
- /package/dist/{md3 → components-csr}/p-Bx6--dQF.js +0 -0
- /package/dist/{components/p-stybaFzj.js.map → components-csr/p-C3vB0Hd9.js.map} +0 -0
- /package/dist/{components/p-B3MWYEEJ.js.map → components-csr/p-CF7mq5T7.js.map} +0 -0
- /package/dist/{components/p-7fN_yCXW.js.map → components-csr/p-CVMM-tdC.js.map} +0 -0
- /package/dist/{md3 → components-csr}/p-C_ogF68H.js +0 -0
- /package/dist/{components/p-Ch2-tttM.js.map → components-csr/p-DMQ-6aj8.js.map} +0 -0
- /package/dist/{components/p-e2HRV63Y.js.map → components-csr/p-DfcpeJAu.js.map} +0 -0
- /package/dist/{components/p-Dp-w93ot.js.map → components-csr/p-DjKPc5EU.js.map} +0 -0
- /package/dist/{md3 → components-csr}/p-DvOKnoqK.js +0 -0
- /package/dist/{md3 → components-csr}/p-DzPKu-Ma.js +0 -0
- /package/dist/{md3 → components-csr}/p-RLxbNqRv.js +0 -0
- /package/dist/{components/p-6wZSqm_2.js.map → components-csr/p-R_guULjT.js.map} +0 -0
- /package/dist/{components/p-Ddiw2Kjw.js.map → components-csr/p-uSMrgqAy.js.map} +0 -0
- /package/dist/md3/{p-9ddbf247.entry.js.map → p-108f89d7.entry.js.map} +0 -0
- /package/dist/md3/{p-c6a12344.entry.js.map → p-114c270b.entry.js.map} +0 -0
- /package/dist/md3/{p-396089fd.entry.js.map → p-1edb5a0d.entry.js.map} +0 -0
- /package/dist/md3/{p-b34d385b.entry.js.map → p-35b05b45.entry.js.map} +0 -0
- /package/dist/md3/{p-c2dd8c8c.entry.js.map → p-38e9a583.entry.js.map} +0 -0
- /package/dist/md3/{p-be02624e.entry.js.map → p-3c0469aa.entry.js.map} +0 -0
- /package/dist/md3/{p-63b8c8d1.entry.js.map → p-408ee4be.entry.js.map} +0 -0
- /package/dist/md3/{p-edb34a6d.entry.js.map → p-43c708ad.entry.js.map} +0 -0
- /package/dist/md3/{p-3015c7e3.entry.js.map → p-4770b534.entry.js.map} +0 -0
- /package/dist/md3/{p-c861d774.entry.js.map → p-4b7cf934.entry.js.map} +0 -0
- /package/dist/md3/{p-2e09a7b7.entry.js.map → p-4f26bd60.entry.js.map} +0 -0
- /package/dist/md3/{p-7b463fbe.entry.js.map → p-4f2e82cb.entry.js.map} +0 -0
- /package/dist/md3/{p-be412e3f.entry.js.map → p-501bf161.entry.js.map} +0 -0
- /package/dist/md3/{p-c063c823.entry.js.map → p-56c7c570.entry.js.map} +0 -0
- /package/dist/md3/{p-2e9503d7.entry.js.map → p-56ca0c3c.entry.js.map} +0 -0
- /package/dist/md3/{p-ac8762e5.entry.js.map → p-5b63149a.entry.js.map} +0 -0
- /package/dist/md3/{p-c5af701b.entry.js.map → p-5f668b0a.entry.js.map} +0 -0
- /package/dist/md3/{p-8eb0b6a4.entry.js.map → p-6d65fc6a.entry.js.map} +0 -0
- /package/dist/md3/{p-e3124e1e.entry.js.map → p-707b6d7c.entry.js.map} +0 -0
- /package/dist/md3/{p-a5fee424.entry.js.map → p-71f1660b.entry.js.map} +0 -0
- /package/dist/md3/{p-1a8ec5bc.entry.js.map → p-7501170f.entry.js.map} +0 -0
- /package/dist/md3/{p-4e3d6e40.entry.js.map → p-7d1686a7.entry.js.map} +0 -0
- /package/dist/md3/{p-4dda4cb0.entry.js.map → p-845ca9cc.entry.js.map} +0 -0
- /package/dist/md3/{p-77a01bcc.entry.js.map → p-87f88d62.entry.js.map} +0 -0
- /package/dist/md3/{p-5b74694e.entry.js.map → p-89d47130.entry.js.map} +0 -0
- /package/dist/md3/{p-b0431a5c.entry.js.map → p-8bdcda53.entry.js.map} +0 -0
- /package/dist/md3/{p-c10a33c2.entry.js.map → p-8e7df348.entry.js.map} +0 -0
- /package/dist/md3/{p-05ae91b6.entry.js.map → p-90ccf4c3.entry.js.map} +0 -0
- /package/dist/md3/{p-da4e27d4.entry.js.map → p-a4d4cfed.entry.js.map} +0 -0
- /package/dist/md3/{p-5394254f.entry.js.map → p-a976498b.entry.js.map} +0 -0
- /package/dist/md3/{p-6038b907.entry.js.map → p-ab568d1c.entry.js.map} +0 -0
- /package/dist/md3/{p-bf7842f8.entry.js.map → p-adf8a415.entry.js.map} +0 -0
- /package/dist/md3/{p-45280bf4.entry.js.map → p-b2d88292.entry.js.map} +0 -0
- /package/dist/md3/{p-796f79f8.entry.js.map → p-b3b5247b.entry.js.map} +0 -0
- /package/dist/md3/{p-5b799707.entry.js.map → p-b4266f6b.entry.js.map} +0 -0
- /package/dist/md3/{p-c00f7514.entry.js.map → p-ba011453.entry.js.map} +0 -0
- /package/dist/md3/{p-6ba63c73.entry.js.map → p-bc24f0c9.entry.js.map} +0 -0
- /package/dist/md3/{p-0c2e824d.entry.js.map → p-c20fbb9e.entry.js.map} +0 -0
- /package/dist/md3/{p-fc0b325d.entry.js.map → p-c2944c87.entry.js.map} +0 -0
- /package/dist/md3/{p-4e45b2ff.entry.js.map → p-c58c68d0.entry.js.map} +0 -0
- /package/dist/md3/{p-0f764a1e.entry.js.map → p-d2e39c6e.entry.js.map} +0 -0
- /package/dist/md3/{p-50555bb7.entry.js.map → p-d8885f53.entry.js.map} +0 -0
- /package/dist/md3/{p-c1ca6f6c.entry.js.map → p-db6fb4e1.entry.js.map} +0 -0
- /package/dist/md3/{p-81843ff7.entry.js.map → p-dcba2857.entry.js.map} +0 -0
- /package/dist/md3/{p-65195996.entry.js.map → p-e357e8ac.entry.js.map} +0 -0
- /package/dist/md3/{p-39cb7c24.entry.js.map → p-e5c6795e.entry.js.map} +0 -0
- /package/dist/md3/{p-e6d7f0ff.entry.js.map → p-f403ad20.entry.js.map} +0 -0
- /package/dist/md3/{p-708a9313.entry.js.map → p-f5fd9a0b.entry.js.map} +0 -0
- /package/dist/md3/{p-aa0e7d4d.entry.js.map → p-f71af38f.entry.js.map} +0 -0
- /package/dist/md3/{p-757e3aaf.entry.js.map → p-fac6da4c.entry.js.map} +0 -0
- /package/dist/md3/{p-134b670a.entry.js.map → p-fc864f96.entry.js.map} +0 -0
- /package/dist/md3/{p-32bdd439.entry.js.map → p-fd686966.entry.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["mdTableCss","MdTable","constructor","hostRef","this","density","columnTemplate","columns","minWidth","stickyHeader","frozenHeader","keepHeight","scrollbar","pinMode","pinIcon","stickyFooter","striped","noDividers","hoverable","motion","selection","sortBy","sortOrder","loading","loadingMode","loadingRows","empty","label","caption","summary","rowOffset","rowCount","selectionCache","count","total","values","all","indeterminate","bulkSelecting","hDragging","hDragStartX","hDragStartScroll","vDragging","vDragStartY","vDragStartScroll","updateHScroll","sc","bodyScrollEl","track","hTrackEl","thumb","hThumbEl","overflow","scrollWidth","clientWidth","style","display","trackW","thumbW","Math","max","maxThumbLeft","progress","min","abs","scrollLeft","left","isRtl","inlineSize","transform","onHThumbPointerDown","e","clientX","target","setPointerCapture","pointerId","preventDefault","onHThumbPointerMove","offsetWidth","perPx","onHThumbPointerUp","releasePointerCapture","updateVScroll","vTrackEl","vThumbEl","scrollHeight","clientHeight","insetBlockStart","offsetTop","blockSize","trackH","thumbH","maxThumbTop","top","scrollTop","onVThumbPointerDown","clientY","onVThumbPointerMove","offsetHeight","onVThumbPointerUp","srAnnouncement","hasExpandableRow","onBodyScroll","headScrollEl","scrollEmitQueued","requestAnimationFrame","mdScroll","emit","onBodyKeyDown","step","dx","key","ctrlKey","metaKey","Infinity","lo","hi","onBodyWheel","deltaX","deltaY","shiftKey","next","pinnedColumns","Map","hiddenColumns","Set","pinBaseTracks","handleSlotChange","syncRows","syncSortLabels","recomputeSelection","onPinIconChange","onPinModeChange","syncStickyOffsets","rows","Array","from","el","querySelectorAll","length","clear","forEach","row","children","c","removeProperty","gridEl","bodyGridEl","shadowRoot","querySelector","tracks","getComputedStyle","gridTemplateColumns","split","map","t","parseFloat","filter","n","Number","isNaN","cells","tagName","hasAttribute","startCum","cell","i","getAttribute","setProperty","endCum","direction","componentDidLoad","setupFrozenHeader","scheduleHeaderFloors","h","getBoundingClientRect","height","minBlockSize","round","componentDidRender","syncFrozenColumns","disconnectedCallback","frozenObserver","disconnect","undefined","onSelectionModeChange","trimmed","sel","getSelectableRows","r","selected","slice","onEmptyChange","onStickyHeaderChange","attach","tries","ResizeObserver","observe","headGridEl","hasVisibleRow","some","headTracks","onLayoutChange","onSortStateChange","getSelection","selectAll","disabled","deselectAll","toggleSelectAll","setSort","column","order","play","armMotion","mdSortChange","splitTracks","template","out","depth","cur","ch","trim","test","push","directChildren","parent","match","isTag","tag","toLowerCase","ensurePinBase","silent","warn","msg","console","includes","setAttribute","String","headRow","headCells","s","set","pinColumn","side","get","delete","applyPinLayout","effective","mdPinChange","setColumnVisibility","visible","size","has","add","mdColumnVisibilityChange","hidden","sort","a","b","_","start","end","mid","k","appendChild","removeAttribute","visibleOrder","join","syncHeaderContentFloors","seq","tpl","base","kids","right","span","cs","pad","paddingInlineStart","paddingInlineEnd","pin","ceil","attempt","probe","ready","width","animateNextChange","handleMotionArm","stopPropagation","body","captureFlip","enter","stagger","staggerCap","spring","handleSortRequest","col","detail","first","defaultOrder","second","handleSlottedCheckboxChange","checked","queueMicrotask","closest","selectable","handleRowgroupSlotChange","handleRowSelectionChange","value","syncSelectionUI","mdSelectionChange","host","staleHead","cb","headCb","headEl","rg","lastIndex","hasExpandable","container","hasBottomBar","suppressLastDivider","footExists","lastBodyIdx","nHead","bodyIndex","headIndex","footIndex","inHead","inFoot","group","v","cast","own","labels","l","active","ariaSort","columnCount","m","parseInt","Boolean","firstRow","renderSkeletonRows","cols","class","part","__","renderEmpty","name","render","tableAria","role","Host","ref","onSlotchange","tabindex","onScroll","onWheel","onKeyDown","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","variant"],"sources":["src/components/md-table/md-table.css?tag=md-table&encapsulation=shadow","src/components/md-table/md-table.tsx"],"sourcesContent":["/* ==========================================================\n md-table — MD3 Expressive table (composable primitive)\n\n Layout: the shadow `.md-table__grid` owns the column tracks; every\n slotted `md-table-row` is a REAL grid item spanning all tracks that\n lays its cells on the shared tracks via `grid-template-columns:\n subgrid`. Rows being real boxes is what makes row hover, stripes,\n dividers, sticky rows and focus rings work.\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-table-row-height-compact 36px (dense)\n --md-table-row-height-standard 52px\n --md-table-row-height-comfortable 60px\n --md-table-header-height 56px\n --md-table-cell-padding-inline per-density default\n --md-table-divider-color between rows\n --md-table-stripe-color every-other-row overlay color\n --md-table-head-bg background for thead rows\n --md-table-head-color text color for thead\n --md-table-foot-bg background for tfoot rows\n --md-table-row-hover-color row hover state-layer color\n --md-table-row-selected-bg selected row background\n --md-table-row-selected-color selected row text\n --md-table-columns-template grid-template-columns override\n\n CSS PARTS:\n caption The optional caption above the head\n grid The grid container holding all rows\n loading The loading overlay (when `loading`)\n empty The empty-state region (when `empty`)\n ========================================================== */\n\n:host {\n /* Motion: effects springs for color/opacity (house pairing rule). */\n --_fx-fast: var(--md-sys-motion-spring-effects-fast-duration, 150ms)\n var(--md-sys-motion-spring-effects-fast-easing, cubic-bezier(0.31, 0.94, 0.34, 1));\n --_fx-default: var(--md-sys-motion-spring-effects-default-duration, 200ms)\n var(--md-sys-motion-spring-effects-default-easing, cubic-bezier(0.34, 0.8, 0.34, 1));\n\n /* Density → row heights. Compact is a genuinely dense 36px data row (tighten\n further via --md-table-row-height-compact); the header is 56px regardless\n of body density (data-table idiom). */\n --_row-h-compact: var(--md-table-row-height-compact, max(28px, calc(36px + var(--md-sys-density-scale, 0) * 4px)));\n /* Standard (default) rows follow a global `data-density` ancestor (0…-4,\n 4px/rung); density-scale is 0 by default so 52px is unchanged. The explicit\n `density=\"compact|comfortable\"` prop overrides via the blocks below. */\n --_row-h-standard: var(--md-table-row-height-standard, calc(52px + var(--md-sys-density-scale, 0) * 4px));\n --_row-h-comfortable: var(--md-table-row-height-comfortable, max(40px, calc(60px + var(--md-sys-density-scale, 0) * 4px)));\n --_row-h: var(--_row-h-standard);\n --_head-h: var(--md-table-header-height, max(40px, calc(56px + var(--md-sys-density-scale, 0) * 4px)));\n /* Standard cell padding rides the spacing tokens (16/8 at density 0), so it\n tightens with global density; compact/comfortable pin their own below. */\n --_cell-pad-inline: var(--md-table-cell-padding-inline, var(--md-sys-spacing-inset-lg, 16px));\n --_cell-pad-block: var(--md-table-cell-padding-block, var(--md-sys-spacing-inset-sm, 8px));\n\n --_divider-color: var(--md-table-divider-color, var(--md-sys-color-outline-variant, #CAC4D0));\n --_divider: var(--_divider-color);\n --_stripe-color: var(\n --md-table-stripe-color,\n color-mix(\n in srgb,\n var(--md-sys-color-on-surface, #1C1B1F) calc(var(--md-sys-state-hover-state-layer-opacity, 0.08) * 50%),\n transparent\n )\n );\n --_head-bg: var(--md-table-head-bg, var(--md-sys-color-surface-container, #F3EDF7));\n --_head-color: var(--md-table-head-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_foot-bg: var(--md-table-foot-bg, var(--md-sys-color-surface-container-low, #F7F2FA));\n\n /* Row hover state layer — derived from the M3 state opacity token; zeroed\n when `hoverable` is off (rows consume the var unconditionally). */\n --_hover-layer: color-mix(\n in srgb,\n var(--md-table-row-hover-color, var(--md-sys-color-on-surface, #1C1B1F))\n calc(var(--md-sys-state-hover-state-layer-opacity, 0.08) * 100%),\n transparent\n );\n --_row-selected-bg: var(--md-table-row-selected-bg, var(--md-sys-color-secondary-container, #E8DEF8));\n --_row-selected-color: var(\n --md-table-row-selected-color,\n var(--md-sys-color-on-secondary-container, #1E192B)\n );\n\n display: block;\n inline-size: 100%;\n position: relative;\n isolation: isolate;\n color: var(--md-sys-color-on-surface, #1C1B1F);\n font-family: var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif);\n font-size: max(12px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n letter-spacing: var(--md-sys-typescale-body-medium-letter-spacing, 0.25px);\n}\n\n:host(.md-table--density-compact) {\n --_row-h: var(--_row-h-compact);\n --_cell-pad-inline: var(--md-table-cell-padding-inline, 12px);\n --_cell-pad-block: var(--md-table-cell-padding-block, 4px);\n /* Shrink slotted checkboxes to the compact row height so their 48px touch\n target doesn't force the row taller (inherits to the light-DOM cells). */\n --md-checkbox-touch-target-size: 32px;\n}\n:host(.md-table--density-comfortable) {\n --_row-h: var(--_row-h-comfortable);\n --_cell-pad-inline: var(--md-table-cell-padding-inline, 20px);\n}\n\n:host(.md-table--no-dividers) {\n --_divider: transparent;\n}\n:host(:not(.md-table--hoverable)) {\n --_hover-layer: transparent;\n}\n\n.md-table__caption {\n padding: 12px var(--_cell-pad-inline);\n font-family: var(--md-sys-typescale-title-small-font-family, Roboto, sans-serif);\n font-size: var(--md-sys-typescale-title-small-font-size, 14px);\n font-weight: var(--md-sys-typescale-title-small-font-weight, 500);\n line-height: var(--md-sys-typescale-title-small-line-height, 20px);\n color: var(--md-sys-color-on-surface-variant, #49454F);\n}\n\n/* The single grid every row subgrids into. Template resolution:\n explicit prop (inline --_columns-template) → public override var →\n derived-from-first-row count (inline --_derived-template). */\n.md-table__grid {\n display: grid;\n grid-template-columns: var(\n --_columns-template,\n var(--md-table-columns-template, var(--_derived-template, none))\n );\n align-items: stretch;\n /* Never squish OR wrap columns to fit: keep at least `min-width` if set,\n otherwise the grid's natural (unwrapped) max-content width. When the\n container is narrower the grid overflows and the scroll wrapper shows a\n horizontal scrollbar (spreadsheet-style) instead of collapsing. */\n min-inline-size: var(--_min-width, var(--md-table-min-width, max-content));\n}\n\n/* ── Frozen header (sticky-header): header grid pinned above a vertically\n scrolling body grid, so the scrollbar spans only the body. ───────────── */\n.md-table__frozen {\n display: flex;\n flex-direction: column;\n min-block-size: 0;\n inline-size: 100%;\n /* Containing block for the custom overlay scrollbars. */\n position: relative;\n}\n.md-table__head-scroll {\n flex: 0 0 auto;\n inline-size: 100%;\n /* Clipped; horizontal position is mirrored from the body (see onBodyScroll). */\n overflow: hidden;\n /* Paint the header band on the WRAPPER: the header grid is synced to the\n body's tracks, which stop a scrollbar-gutter short of the full width —\n without this the last ~10px of the header showed the container surface\n through. The inset hairline continues the header divider across that\n gutter zone (it coincides with the row's own divider elsewhere). */\n background-color: var(--_head-bg, var(--md-sys-color-surface-container, #F3EDF7));\n box-shadow: inset 0 -1px var(--_divider, transparent);\n}\n.md-table__body-scroll {\n flex: 1 1 auto;\n inline-size: 100%;\n min-block-size: 0;\n max-block-size: var(--md-table-body-max-h, none);\n /* Vertical scrolls natively; horizontal is fully owned by the custom bar\n (.md-table__hscroll) — overflow-x:hidden kills the native horizontal bar\n (so it never doubles with the custom one) while programmatic scrollLeft +\n the wheel handler still scroll it. */\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n/* Default `scrollbar=\"overlay\"`: the native vertical bar is fully hidden —\n the custom overlay bar (.md-table__vscroll) floats over the rows' right\n edge instead, so NO gutter is reserved: row backgrounds and dividers run\n the full width and a bar can never take space or shift content. */\n:host(:not([scrollbar='gutter'])) .md-table__body-scroll {\n scrollbar-width: none;\n}\n.md-table__body-scroll:focus-visible {\n /* Inset ring: an outer outline would be clipped by the container's\n overflow/border-radius. */\n outline: 2px solid var(--md-sys-color-secondary, #625B71);\n outline-offset: -2px;\n}\n/* Scoped to OVERLAY mode only — an unscoped display:none here once killed\n the gutter mode's native bar (its width rule won, but nothing re-declared\n display). */\n:host(:not([scrollbar='gutter'])) .md-table__body-scroll::-webkit-scrollbar {\n display: none;\n}\n/* `scrollbar=\"gutter\"`: classic inset bar in a reserved strip INSIDE the\n table — rows stop short of the edge and the native bar crosses the row\n borders. NB: no `scrollbar-width` here — modern Chrome ignores the styled\n ::-webkit-scrollbar when it's set (see project memory). */\n:host([scrollbar='gutter']) .md-table__body-scroll {\n scrollbar-gutter: stable;\n}\n:host([scrollbar='gutter']) .md-table__body-scroll::-webkit-scrollbar {\n width: 10px;\n}\n:host([scrollbar='gutter']) .md-table__body-scroll::-webkit-scrollbar-thumb {\n /* >= 3:1 non-text contrast (surface-container-highest measured ~1.25:1). */\n background: var(--md-sys-color-outline, #79747E);\n border-radius: 999px;\n border: 2px solid transparent;\n background-clip: content-box;\n}\n:host([scrollbar='gutter']) .md-table__body-scroll::-webkit-scrollbar-thumb:hover {\n background: var(--md-sys-color-on-surface-variant, #49454F);\n background-clip: content-box;\n}\n:host([scrollbar='gutter']) .md-table__vscroll {\n display: none !important;\n}\n\n/* ── Custom horizontal scrollbar (frozen mode) ─────────────── */\n/* Custom vertical OVERLAY scrollbar (frozen mode): floats over the rows near\n the body's right edge. Always visible while the body overflows — unlike the\n auto-hiding macOS overlay bar — and takes NO layout space. */\n.md-table__vscroll {\n position: absolute;\n inset-inline-end: 3px;\n inline-size: 8px;\n display: none;\n z-index: 3;\n pointer-events: none;\n}\n.md-table__vscroll-thumb {\n position: absolute;\n inset-inline: 0;\n border-radius: 999px;\n /* WCAG 1.4.11 non-text contrast: 50% alpha of on-surface computes >=3.2:1\n over every light surface in the family (45% measured 2.81-2.86:1 — just\n UNDER the 3:1 line; the minimum passing alpha is 48%). */\n background: color-mix(in srgb, var(--md-sys-color-on-surface, #1C1B1F) 50%, transparent);\n pointer-events: auto;\n touch-action: none;\n}\n.md-table__vscroll-thumb:hover,\n.md-table__vscroll-thumb:active {\n background: color-mix(in srgb, var(--md-sys-color-on-surface, #1C1B1F) 60%, transparent);\n}\n\n.md-table__hscroll {\n display: none; /* JS shows it (block) only when the body overflows */\n position: relative;\n flex: 0 0 auto;\n block-size: 10px;\n margin-inline: 8px;\n margin-block: 2px;\n}\n.md-table__hscroll-thumb {\n position: absolute;\n inset-block: 1px;\n inline-size: 40px;\n min-inline-size: 24px;\n background: var(--md-sys-color-outline, #79747E); /* >= 3:1 (was outline-variant ~1.6:1) */\n border-radius: 999px;\n cursor: grab;\n touch-action: none;\n transition: background-color var(--_fx-fast, 150ms ease);\n}\n.md-table__hscroll-thumb:hover {\n background: var(--md-sys-color-outline, #79747E);\n}\n.md-table__hscroll-thumb:active {\n cursor: grabbing;\n background: var(--md-sys-color-on-surface-variant, #49454F);\n}\n/* The header grid's tracks are set to the body's resolved pixel widths by JS;\n its width still fills the row so the leftover (scrollbar gutter) sits at the\n end, keeping the columns aligned with the body. */\n.md-table__grid--head {\n min-inline-size: max(100%, var(--_min-width, var(--md-table-min-width, 0px)));\n inline-size: max-content;\n}\n.md-table__grid--body {\n min-inline-size: max(100%, var(--_min-width, var(--md-table-min-width, 0px)));\n}\n\n/* ── Loading: shared shimmer bar ──────────────────────────── */\n.md-table__bar {\n block-size: 16px;\n border-radius: var(--md-sys-shape-corner-full, 9999px);\n background: linear-gradient(\n 90deg,\n var(--md-sys-color-surface-container-high, #ECE6F0) 25%,\n var(--md-sys-color-surface-container, #F3EDF7) 37%,\n var(--md-sys-color-surface-container-high, #ECE6F0) 63%\n );\n background-size: 400% 100%;\n animation: md-table-shimmer 1.4s ease infinite;\n}\n\n@keyframes md-table-shimmer {\n 0% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0 50%;\n }\n}\n\n/* ── Loading: SKELETON mode ───────────────────────────────────\n Body (and footer) are hidden and replaced by shimmer rows; the header stays.\n md-table-head/body/foot are the slot assignees, so display:none on them hides\n their whole subtree. */\n:host(.md-table--loading-skeleton) ::slotted(md-table-body),\n:host(.md-table--loading-skeleton) ::slotted(md-table-foot) {\n display: none;\n}\n\n.md-table__skeleton-row {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: subgrid;\n align-items: center;\n min-block-size: var(--_row-h);\n border-block-end: 1px solid var(--_divider);\n}\n.md-table__skeleton-row:last-child {\n border-block-end: none;\n}\n/* One bar per column, inset by the cell padding — fills the row. */\n.md-table__skeleton-row .md-table__bar {\n margin-inline: var(--_cell-pad-inline);\n}\n\n/* ── Loading: OVERLAY mode ────────────────────────────────────\n An indeterminate progress line just under the header + a scrim that dims and\n blocks the body. Header/footer are untouched (the scrim starts below the\n header). */\n.md-table__loading {\n position: absolute;\n inset: 0;\n z-index: 3;\n pointer-events: none;\n}\n\n.md-table__scrim {\n position: absolute;\n inset-block-start: var(--_head-h);\n inset-block-end: 0;\n inset-inline: 0;\n background: color-mix(in srgb, var(--md-sys-color-surface, #FEF7FF) 55%, transparent);\n /* Block interaction with the (loading) body. */\n pointer-events: auto;\n}\n\n/* The library's own linear indeterminate indicator, pinned under the header. */\n.md-table__progress {\n position: absolute;\n inset-block-start: var(--_head-h);\n inset-inline: 0;\n}\n.md-table__progress md-progress-indicator {\n display: block;\n inline-size: 100%;\n}\n\n/* ── Empty state ──────────────────────────────────────────── */\n.md-table__empty {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n /* Fallback height when there's no bounded container to fill (a plain,\n auto-height table). Override with --md-table-empty-min-height. */\n min-block-size: var(--md-table-empty-min-height, 160px);\n padding: 32px var(--_cell-pad-inline);\n text-align: center;\n color: var(--md-sys-color-on-surface-variant, #49454F);\n}\n\n/* When the table is empty, fill the scroll viewport as a flex column so the\n empty region takes exactly the height left below the header — its content\n centers on both axes with NO extra height / scrollbar. box-sizing:border-box\n above keeps the padding inside that flexed height. */\n:host(.md-table--empty) {\n display: flex;\n flex-direction: column;\n min-block-size: 100%;\n}\n:host(.md-table--empty) .md-table__grid {\n flex: 0 0 auto;\n}\n:host(.md-table--empty) .md-table__empty {\n flex: 1 1 auto;\n}\n\n/* Frozen mode: the empty message lives inside the body scroll area — fill it so\n the content centers below the header. */\n.md-table__body-scroll {\n display: flex;\n flex-direction: column;\n}\n.md-table__body-scroll .md-table__empty {\n flex: 1 1 auto;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .md-table__bar {\n animation: none;\n }\n}\n\n@media (forced-colors: active) {\n /* WHCM strips background colors — without this the custom thumbs vanish\n while the native bars stay suppressed (no scrollbar at all). */\n .md-table__vscroll-thumb,\n .md-table__hscroll-thumb {\n background: ButtonText;\n border: 1px solid ButtonText;\n forced-color-adjust: none;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --_divider: CanvasText;\n }\n}\n\n/* Visually hidden, AT-audible (empty-state announcements). */\n.md-table__sr-status {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n/* ==========================================================\n DENSITY (numeric rungs — local override)\n `density` here accepts two vocabularies: the semantic sizes\n (compact/standard/comfortable, handled by the .md-table--density-* classes\n above) and the library-wide numeric scale. A numeric rung maps onto the same\n --md-sys-density-scale signal a global `data-density` ancestor sets, so a\n local value overrides the inherited one and every scale-driven value in this\n file (row height, header height, type) follows.\n\n The semantic sizes are scale-aware too — their row heights are calcs, not\n literals — so `density=\"compact\"` nested in a `data-density=\"-2\"` region\n condenses further instead of pinning 36px.\n ========================================================== */\n:host([density='-1']) { --md-sys-density-scale: -1; }\n:host([density='-2']) { --md-sys-density-scale: -2; }\n:host([density='-3']) { --md-sys-density-scale: -3; }\n:host([density='-4']) { --md-sys-density-scale: -4; }\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Element,\n Event,\n EventEmitter,\n Listen,\n Method,\n Watch,\n} from '@stencil/core';\nimport { captureFlip } from '../../utils/flip';\n\nexport type MdTableSortOrder = 'asc' | 'desc' | 'none';\n\nexport interface MdTableSortState {\n /** Column id of the active sort, or empty for \"no sort\". */\n column: string;\n /** Sort direction. */\n order: MdTableSortOrder;\n}\n\nexport interface MdTableSelectionState {\n /** Number of selected rows. */\n count: number;\n /** Total number of selectable rows (rendered). */\n total: number;\n /** Selected row \"value\" or id (or row index) for each selected row. */\n values: string[];\n /** Whether all visible rows are selected. */\n all: boolean;\n /** Whether some (but not all) rows are selected. */\n indeterminate: boolean;\n}\n\ninterface SelectableRow extends HTMLElement {\n selected: boolean;\n disabled: boolean;\n value: string;\n selectable: boolean;\n}\n\n/**\n * Material Design 3 — Table\n *\n * The core composable table primitive for hand-authored tables.\n *\n * Layout architecture: the shadow `.md-table__grid` owns the column tracks\n * (`grid-template-columns`), and every slotted `md-table-row` is a REAL grid\n * item spanning all tracks that lays its cells on the shared tracks via\n * `grid-template-columns: subgrid`. Rows being real boxes is what makes row\n * hover, stripes, dividers, sticky headers and focus rings actually work —\n * and a wrong cell count skews one row, never the whole table.\n *\n * Coordination is push-based (the house pattern): the table stamps context\n * onto its rows (`rowgroup`, stripe parity, stickiness) and pushes sort state\n * into `md-table-sort-label`s — no MutationObservers, no `:host-context()`.\n *\n * High-level features:\n * - Density: `compact` | `standard` | `comfortable`\n * - Sticky header / footer (pair with `md-table-container` for the scroll box)\n * - Sticky first / last column via cell `sticky=\"start\" | \"end\"`\n * - Sortable columns via `<md-table-sort-label>` (3-state asc → desc → none)\n * - Selection coordination — emits `mdSelectionChange`; `selectAll()` /\n * `deselectAll()` / `toggleSelectAll()` for the select-all checkbox\n * - Horizontal scroll when the content is wider than the container\n * - Loading + empty-state slots, striped rows, configurable dividers\n */\n@Component({\n tag: 'md-table',\n styleUrl: 'md-table.css',\n shadow: true,\n})\nexport class MdTable {\n @Element() el!: HTMLElement;\n\n /**\n * Layout density. Accepts BOTH vocabularies:\n *\n * - the semantic sizes `'compact' | 'standard' | 'comfortable'` (row heights\n * 36 / 52 / 60px), which is this component's original API, and\n * - a numeric rung `0 | -1 | -2 | -3 | -4`, the scale every other component in\n * the library uses.\n *\n * A numeric value drives `--md-sys-density-scale` on the host (see the DENSITY\n * block in the CSS) exactly as a global `data-density` ancestor would, and\n * takes the `standard` row-height base. The two are not exclusive: the\n * semantic sizes are themselves scale-aware, so `density=\"compact\"` inside a\n * `data-density=\"-2\"` region condenses further.\n */\n @Prop({ reflect: true }) density:\n | 'compact'\n | 'standard'\n | 'comfortable'\n | 0\n | -1\n | -2\n | -3\n | -4 = 'standard';\n\n /**\n * CSS `grid-template-columns` value (e.g. `\"auto 1fr 120px\"`).\n * Takes precedence over the `columns` prop. Use this for fine control,\n * including using `minmax()`, `fr` units and `auto`.\n */\n @Prop({ attribute: 'column-template' }) columnTemplate: string = '';\n\n /**\n * Number of columns when no `column-template` is provided. The grid uses\n * `repeat(<columns>, minmax(0, 1fr))`. When neither is set, the column\n * count is derived from the first row's cells.\n */\n @Prop() columns: number = 0;\n\n /**\n * Minimum table width (e.g. `\"640px\"`). When the container is narrower, the\n * grid keeps this width and the container shows a horizontal scrollbar\n * instead of squishing the columns. Also settable via\n * `--md-table-min-width`.\n */\n @Prop({ attribute: 'min-width' }) minWidth: string = '';\n\n /** Stick the head row(s) to the top of the scroll container. */\n @Prop({ reflect: true, attribute: 'sticky-header' }) stickyHeader: boolean = false;\n\n /**\n * Frozen-header architecture: the header is rendered OUTSIDE the vertical\n * scroll area, so the scrollbar spans only the body and runs UNDER the head\n * Pair with `md-table-container[max-height]` to cap\n * the body — max-height controls the SIZE, this prop controls the\n * ARCHITECTURE. Without it, a max-height container scrolls the whole table\n * (use `sticky-header` there for the classic in-flow pinned header).\n */\n @Prop({ reflect: true, attribute: 'frozen-header' }) frozenHeader: boolean = false;\n\n /**\n * Height ratchet (default ON): once the table has rendered, it never\n * shrinks below that initial height. Paging, filtering to fewer/zero rows,\n * or an async refetch that momentarily empties the body keep the table (and\n * therefore the page) geometrically stable — no content below jumps up, and\n * no scrollbar can flash from a transient collapse (async rebuilds have a\n * few frames where fresh rows haven't hydrated and measure 0). Set\n * `keep-height=\"false\"` for tables that intentionally resize (e.g. a\n * density-toggle demo).\n */\n @Prop({ reflect: true, attribute: 'keep-height' }) keepHeight: boolean = true;\n\n /**\n * Vertical scrollbar presentation (frozen mode):\n * - `overlay` (default) — a custom always-visible thumb FLOATS over the\n * rows' right edge; no gutter is reserved, so row backgrounds and\n * dividers run the full width and the bar never takes layout space.\n * - `gutter` — classic inset bar in a reserved gap: `scrollbar-gutter:\n * stable` keeps a fixed strip inside the table (rows stop short of the\n * edge) and the native bar renders in it, crossing the row borders.\n */\n @Prop({ reflect: true }) scrollbar: 'overlay' | 'gutter' = 'overlay';\n\n /**\n * How MULTIPLE pinned columns on the same side behave during horizontal\n * scroll:\n * - `stack` (default) — every pinned column sticks at the same edge, so\n * later ones slide OVER earlier ones while scrolling (a deck-of-cards\n * effect; only the top one stays fully visible).\n * - `static` — each pinned column gets a cumulative inset equal to the\n * widths of the pinned columns before it, so ALL of them stay visible\n * side-by-side (spreadsheet-style).\n */\n @Prop({ reflect: true, attribute: 'pin-mode' }) pinMode: 'stack' | 'static' = 'stack';\n\n /**\n * Table-wide custom pin-indicator icon (Material Symbols ligature, e.g.\n * \"anchor\"). Cast to every pinned header cell so consumers set it once;\n * a cell's own `pin-icon` attribute wins over the cast. Empty = built-in\n * push-pin SVG.\n */\n @Prop({ attribute: 'pin-icon' }) pinIcon: string = '';\n\n @Watch('pinIcon')\n onPinIconChange() {\n this.syncRows();\n }\n\n @Watch('pinMode')\n onPinModeChange() {\n this.syncStickyOffsets();\n }\n\n /**\n * Stamp cumulative sticky offsets on pinned cells (pin-mode=\"static\").\n * Widths come from the resolved grid tracks; in stack mode the vars are\n * cleared so cells fall back to inset 0.\n */\n private syncStickyOffsets() {\n const rows = Array.from(this.el.querySelectorAll('md-table-row')) as HTMLElement[];\n if (!rows.length) return;\n const clear = () =>\n rows.forEach((row) =>\n (Array.from(row.children) as HTMLElement[]).forEach((c) => c.style.removeProperty('--_sticky-offset')),\n );\n if (this.pinMode !== 'static') {\n clear();\n return;\n }\n const gridEl = this.frozenHeader ? this.bodyGridEl : (this.el.shadowRoot?.querySelector('.md-table__grid') as HTMLElement | null);\n if (!gridEl) return;\n const tracks = getComputedStyle(gridEl)\n .gridTemplateColumns.split(' ')\n .map((t) => parseFloat(t))\n .filter((n) => !Number.isNaN(n));\n if (!tracks.length) return;\n rows.forEach((row) => {\n const cells = (Array.from(row.children) as HTMLElement[]).filter(\n (c) => c.tagName === 'MD-TABLE-CELL' && !c.hasAttribute('data-md-col-hidden'),\n );\n let startCum = 0;\n cells.forEach((cell, i) => {\n if (cell.getAttribute('sticky') === 'start') {\n cell.style.setProperty('--_sticky-offset', `${startCum}px`);\n startCum += tracks[i] ?? 0;\n }\n });\n let endCum = 0;\n for (let i = cells.length - 1; i >= 0; i--) {\n if (cells[i].getAttribute('sticky') === 'end') {\n cells[i].style.setProperty('--_sticky-offset', `${endCum}px`);\n endCum += tracks[i] ?? 0;\n }\n }\n });\n }\n\n /** Stick the foot row(s) to the bottom of the scroll container. */\n @Prop({ reflect: true, attribute: 'sticky-footer' }) stickyFooter: boolean = false;\n\n /** Show alternating row colors. */\n @Prop({ reflect: true }) striped: boolean = false;\n\n /** Hide the dividers between rows. */\n @Prop({ reflect: true, attribute: 'no-dividers' }) noDividers: boolean = false;\n\n /** Hover surface on rows. */\n @Prop({ reflect: true }) hoverable: boolean = true;\n\n /**\n * Built-in expressive motion. With `expressive` (the default) the table\n * FLIP-animates its rows around sort and page changes: it snapshots the row\n * boxes when the triggering event fires (`mdSortRequest`, or a pagination\n * event heard by the surrounding `md-table-container`), lets the consumer's\n * synchronous handler mutate the rows, then glides survivors to their new\n * positions and fades + rises entrants. Async mutations settle as a clean\n * no-op. `prefers-reduced-motion` always wins; set `none` to opt out —\n * e.g. when driving your own `flipRows` wiring around the same events.\n */\n @Prop({ reflect: true }) motion: 'expressive' | 'none' = 'expressive';\n\n /**\n * Selection mode.\n * - `none` — no selection (default)\n * - `single` — radio-like: selecting a row DESELECTS every other row;\n * `selectAll()`/the select-all checkbox are inert (disabled)\n * - `multiple` — checkbox-like; select-all checkbox + selectAll() available\n */\n @Prop({ reflect: true }) selection: 'none' | 'single' | 'multiple' = 'none';\n\n /**\n * Currently active sort column id. Read by `<md-table-sort-label column=\"…\">`\n * to render its arrow. Empty = no sort.\n */\n @Prop({ mutable: true, reflect: true, attribute: 'sort-by' })\n sortBy: string = '';\n\n /** Currently active sort direction. */\n @Prop({ mutable: true, reflect: true, attribute: 'sort-order' })\n sortOrder: MdTableSortOrder = 'asc';\n\n /** Show the loading state. */\n @Prop({ reflect: true }) loading: boolean = false;\n\n /**\n * Loading presentation:\n * - `overlay` (default) — an indeterminate progress line under the header\n * plus a scrim that dims/disables the body while the header/footer stay put.\n * - `skeleton` — the body is replaced by shimmering skeleton rows; the\n * header and footer are untouched.\n */\n @Prop({ reflect: true, attribute: 'loading-mode' }) loadingMode: 'overlay' | 'skeleton' = 'overlay';\n\n /** Number of skeleton rows rendered in `loading-mode=\"skeleton\"`. */\n @Prop({ attribute: 'loading-rows' }) loadingRows: number = 4;\n\n /** Render the empty-state slot when true. */\n @Prop({ reflect: true }) empty: boolean = false;\n\n /**\n * Accessible name for the `role=\"table\"`. When omitted, the `caption` text\n * names the table (WAI: a caption identifies the table for screen-reader\n * users browsing in tables mode); the generic \"Data table\" is the last\n * resort. IDREFs cannot cross the shadow boundary, so the caption text is\n * mirrored into `aria-label` rather than referenced via `aria-labelledby`.\n */\n @Prop() label: string = '';\n\n /** Optional caption rendered above the table head. */\n @Prop() caption: string = '';\n\n /**\n * Long description of a COMPLEX table's structure (WAI caption & summary\n * pattern) — e.g. \"Columns are grouped under Profile and Employment\".\n * Exposed as `aria-description` on the table; invisible otherwise.\n */\n @Prop() summary: string = '';\n\n /**\n * Absolute 0-based index of the FIRST rendered body row within the full\n * dataset (WAI/ARIA pagination): with `row-count` set, each row gets an\n * `aria-rowindex` so AT reports \"row 42 of 5000\" instead of a position\n * within the rendered page. Update it on every page change.\n */\n @Prop({ attribute: 'row-offset' }) rowOffset: number = 0;\n\n /** Total row count for assistive tech when only a subset is rendered\n * (pagination / virtualization). 0 = use the rendered count. */\n @Prop({ attribute: 'row-count' }) rowCount: number = 0;\n\n /** Emitted when sort changes (after a `md-table-sort-label` is clicked). */\n @Event() mdSortChange: EventEmitter<MdTableSortState>;\n\n /** Emitted whenever the row selection state changes. */\n @Event() mdSelectionChange: EventEmitter<MdTableSelectionState>;\n\n /** Emits when a column is pinned/unpinned via `pinColumn`. */\n @Event() mdPinChange: EventEmitter<{ column: number; side: 'start' | 'end' | null }>;\n\n /** Emits when a column is hidden/shown via `setColumnVisibility`. */\n @Event() mdColumnVisibilityChange: EventEmitter<{ column: number; visible: boolean; hidden: number[] }>;\n\n /** rAF-throttled scroll position of the frozen body scroller. */\n @Event() mdScroll: EventEmitter<{ scrollLeft: number; scrollTop: number }>;\n\n private selectionCache: MdTableSelectionState = {\n count: 0,\n total: 0,\n values: [],\n all: false,\n indeterminate: false,\n };\n\n /** Guards against the O(n²) event storm during bulk selection changes. */\n private bulkSelecting = false;\n\n // Frozen-header refs + observer.\n private headScrollEl?: HTMLElement;\n private bodyScrollEl?: HTMLElement;\n private headGridEl?: HTMLElement;\n private bodyGridEl?: HTMLElement;\n private frozenObserver?: ResizeObserver;\n\n // Custom horizontal scrollbar (frozen mode) — native overlay scrollbars are\n // invisible at rest on macOS, so we draw our own always-visible, draggable\n // bar that works identically on every OS.\n private hTrackEl?: HTMLElement;\n private hThumbEl?: HTMLElement;\n private hDragging = false;\n private hDragStartX = 0;\n private hDragStartScroll = 0;\n\n // Custom vertical OVERLAY scrollbar (frozen mode): floats over the rows'\n // right edge instead of reserving a gutter, so row backgrounds and dividers\n // run the full width and no space-taking bar can ever shift the content.\n private vTrackEl?: HTMLElement;\n private vThumbEl?: HTMLElement;\n private vDragging = false;\n private vDragStartY = 0;\n private vDragStartScroll = 0;\n\n /** RTL flips the scrollLeft convention: 0 at the inline start (right edge)\n * running NEGATIVE toward the end. All custom-hscroll math normalizes\n * through |scrollLeft| plus this direction check. */\n private get isRtl(): boolean {\n return getComputedStyle(this.el).direction === 'rtl';\n }\n\n /** Size + position the custom horizontal scroll thumb from the body scroll. */\n private updateHScroll = () => {\n const sc = this.bodyScrollEl;\n const track = this.hTrackEl;\n const thumb = this.hThumbEl;\n if (!sc || !track || !thumb) return;\n const overflow = sc.scrollWidth - sc.clientWidth;\n if (overflow <= 1) {\n track.style.display = 'none';\n return;\n }\n track.style.display = 'block';\n const trackW = track.clientWidth;\n const thumbW = Math.max(24, (sc.clientWidth / sc.scrollWidth) * trackW);\n const maxThumbLeft = trackW - thumbW;\n // 0..1 progress from the inline START of the content, direction-agnostic.\n const progress = Math.min(1, Math.abs(sc.scrollLeft) / overflow);\n // In RTL the content start sits at the RIGHT, so the thumb starts at the\n // track's right end and travels left as the user scrolls toward the end.\n const left = (this.isRtl ? 1 - progress : progress) * maxThumbLeft;\n thumb.style.inlineSize = `${thumbW}px`;\n thumb.style.transform = `translateX(${left}px)`;\n };\n\n private onHThumbPointerDown = (e: PointerEvent) => {\n if (!this.bodyScrollEl) return;\n this.hDragging = true;\n this.hDragStartX = e.clientX;\n this.hDragStartScroll = this.bodyScrollEl.scrollLeft;\n (e.target as HTMLElement).setPointerCapture?.(e.pointerId);\n e.preventDefault();\n };\n private onHThumbPointerMove = (e: PointerEvent) => {\n if (!this.hDragging || !this.bodyScrollEl || !this.hTrackEl || !this.hThumbEl) return;\n const sc = this.bodyScrollEl;\n const maxThumbLeft = this.hTrackEl.clientWidth - this.hThumbEl.offsetWidth;\n const overflow = sc.scrollWidth - sc.clientWidth;\n const perPx = maxThumbLeft > 0 ? overflow / maxThumbLeft : 0;\n sc.scrollLeft = this.hDragStartScroll + (e.clientX - this.hDragStartX) * perPx;\n };\n private onHThumbPointerUp = (e: PointerEvent) => {\n this.hDragging = false;\n try {\n (e.target as HTMLElement).releasePointerCapture?.(e.pointerId);\n } catch {\n /* no capture to release */\n }\n };\n\n /** Size + position the vertical overlay thumb from the body scroll. */\n private updateVScroll = () => {\n const sc = this.bodyScrollEl;\n const track = this.vTrackEl;\n const thumb = this.vThumbEl;\n if (!sc || !track || !thumb) return;\n if (this.scrollbar === 'gutter') {\n track.style.display = 'none';\n return;\n }\n const overflow = sc.scrollHeight - sc.clientHeight;\n if (overflow <= 1) {\n track.style.display = 'none';\n return;\n }\n track.style.display = 'block';\n // Track spans exactly the body area inside the frozen wrapper.\n track.style.insetBlockStart = `${sc.offsetTop}px`;\n track.style.blockSize = `${sc.clientHeight}px`;\n const trackH = sc.clientHeight;\n const thumbH = Math.max(24, (sc.clientHeight / sc.scrollHeight) * trackH);\n const maxThumbTop = trackH - thumbH;\n const top = (sc.scrollTop / overflow) * maxThumbTop;\n thumb.style.blockSize = `${thumbH}px`;\n thumb.style.transform = `translateY(${top}px)`;\n };\n\n private onVThumbPointerDown = (e: PointerEvent) => {\n if (!this.bodyScrollEl) return;\n this.vDragging = true;\n this.vDragStartY = e.clientY;\n this.vDragStartScroll = this.bodyScrollEl.scrollTop;\n (e.target as HTMLElement).setPointerCapture?.(e.pointerId);\n e.preventDefault();\n };\n private onVThumbPointerMove = (e: PointerEvent) => {\n if (!this.vDragging || !this.bodyScrollEl || !this.vTrackEl || !this.vThumbEl) return;\n const sc = this.bodyScrollEl;\n const maxThumbTop = this.vTrackEl.clientHeight - this.vThumbEl.offsetHeight;\n const overflow = sc.scrollHeight - sc.clientHeight;\n const perPx = maxThumbTop > 0 ? overflow / maxThumbTop : 0;\n sc.scrollTop = this.vDragStartScroll + (e.clientY - this.vDragStartY) * perPx;\n };\n private onVThumbPointerUp = (e: PointerEvent) => {\n this.vDragging = false;\n try {\n (e.target as HTMLElement).releasePointerCapture?.(e.pointerId);\n } catch {\n /* no capture to release */\n }\n };\n\n componentDidLoad() {\n this.syncRows();\n this.syncSortLabels();\n this.recomputeSelection(false);\n this.setupFrozenHeader();\n // Frozen tables floor their header tracks to the header CONTENT (sort\n // arrows are wider than short body values — without this they cram into\n // the next column).\n requestAnimationFrame(() => this.scheduleHeaderFloors());\n // Height ratchet: after the first laid-out frame, floor the table at its\n // initial height so it never shrinks (see keepHeight). In frozen mode the\n // floor goes on the BODY SCROLL AREA, not the host: flooring the host\n // would leave the extra space BELOW the frozen flex column, stranding the\n // custom horizontal scrollbar mid-table — flooring the body keeps rows /\n // empty state absorbing the height and the bar pinned at the bottom.\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n if (!this.keepHeight) return;\n const target = this.frozenHeader && this.bodyScrollEl ? this.bodyScrollEl : this.el;\n const h = target.getBoundingClientRect().height;\n if (h > 1) target.style.minBlockSize = `${Math.round(h)}px`;\n }),\n );\n }\n\n componentDidRender() {\n // Keep the frozen header's tracks aligned after every render (data/columns\n // can change). Cheap: a single getComputedStyle read + string compare.\n this.syncFrozenColumns();\n this.updateHScroll();\n this.updateVScroll();\n this.syncStickyOffsets();\n }\n\n disconnectedCallback() {\n this.frozenObserver?.disconnect();\n this.frozenObserver = undefined;\n }\n\n @Watch('selection')\n onSelectionModeChange() {\n // Mode switches must re-run the selection machinery WITHOUT a re-mount:\n // the select-all checkbox keeps its element across renders, so single-mode's\n // disabled state stuck when switching back to multiple (dead checkbox),\n // and entering single never disabled it until some selection event fired.\n let trimmed = false;\n if (this.selection === 'single') {\n // Entering radio-like mode with several rows selected: keep the first.\n const sel = this.getSelectableRows().filter((r) => r.selected);\n if (sel.length > 1) {\n this.bulkSelecting = true;\n try {\n sel.slice(1).forEach((r) => (r.selected = false));\n } finally {\n this.bulkSelecting = false;\n }\n trimmed = true;\n }\n }\n this.syncRows(); // aria-selected stamping is mode-dependent\n // Sync checkbox enabled/checked states; emit only if the switch actually\n // changed the selection (the trim), so consumers hear about it.\n this.recomputeSelection(trimmed);\n }\n\n @Watch('empty')\n onEmptyChange() {\n // SRs don't announce a swapped-in empty state on their own.\n this.srAnnouncement = this.empty ? 'No data' : '';\n }\n\n @State() private srAnnouncement = '';\n\n /**\n * True when at least one slotted row is `expandable`. Such rows carry\n * `aria-expanded`, which is only a valid property on a ROW inside a\n * `treegrid` — on a plain `table` row it is a conditional-attribute\n * violation (axe `aria-conditional-attr`). So the structural element\n * promotes from `role=\"table\"` to `role=\"treegrid\"` whenever this is set;\n * treegrid is a superset of table for every other property we expose\n * (rowcount/rowindex, colspan, aria-sort, aria-selected). Recomputed in\n * `syncRows()` (runs on load + every slot change), so the role tracks rows\n * appearing / disappearing / toggling `expandable`.\n */\n @State() private hasExpandableRow = false;\n\n @Watch('frozenHeader')\n @Watch('stickyHeader')\n onStickyHeaderChange() {\n this.syncRows();\n // Refs are recreated on the next render; re-attach the observer then.\n // RETRY across frames: a single rAF can fire before Stencil commits the\n // re-render (the audit's plausible race) — poll until the body grid ref\n // exists or ~half a second passes.\n this.frozenObserver?.disconnect();\n this.frozenObserver = undefined;\n const attach = (tries = 0) => {\n if (!this.frozenHeader) return;\n if (this.bodyGridEl) {\n this.setupFrozenHeader();\n return;\n }\n if (tries < 30) requestAnimationFrame(() => attach(tries + 1));\n };\n requestAnimationFrame(() => attach());\n }\n\n /** Observe the body grid so the header tracks re-sync on any size change. */\n private setupFrozenHeader() {\n if (!this.frozenHeader || !this.bodyGridEl || typeof ResizeObserver === 'undefined') return;\n this.frozenObserver?.disconnect();\n this.frozenObserver = new ResizeObserver(() => {\n this.syncFrozenColumns();\n this.updateHScroll();\n // Row show/hide (pagination, filters) resizes the grid WITHOUT a table\n // re-render — the overlay thumb must follow here, not just on scroll.\n this.updateVScroll();\n this.syncStickyOffsets(); // track widths may have changed\n });\n this.frozenObserver.observe(this.bodyGridEl);\n this.syncFrozenColumns();\n this.updateHScroll();\n this.updateVScroll();\n }\n\n /** Copy the body grid's RESOLVED pixel tracks onto the header grid so columns\n * align exactly (and the header naturally reserves the body's scrollbar\n * gutter, since its tracks sum to less than its full width). */\n private syncFrozenColumns() {\n if (!this.frozenHeader || !this.bodyGridEl || !this.headGridEl) return;\n // When the body has no laid-out rows (all filtered out / a page transition\n // that momentarily hides everything), its `auto` and content-sized tracks\n // collapse to 0 — copying those onto the header would squash the columns.\n // RETAIN the last-applied tracks instead of clearing: transient all-hidden\n // states (display-toggle paging, animated swaps) must not flap the header\n // widths every transition. A table that STARTS empty simply has no inline\n // override yet, so the header keeps the template's real widths.\n const hasVisibleRow = Array.from(this.el.querySelectorAll('md-table-body md-table-row')).some(\n (r) => (r as HTMLElement).getBoundingClientRect().height > 0,\n );\n if (!hasVisibleRow) return;\n const tracks = getComputedStyle(this.bodyGridEl).gridTemplateColumns;\n if (tracks && tracks !== 'none') {\n // Append a filler track that absorbs the head wrapper's leftover width\n // (the body's scrollbar gutter): header rows span 1/-1, so their\n // background AND dividers stretch edge-to-edge instead of stopping a\n // gutter short. No cell ever places into it (cells auto-place into the\n // real tracks), and it collapses to 0 when the grid h-overflows.\n const headTracks = `${tracks} minmax(0, 1fr)`;\n if (this.headGridEl.style.gridTemplateColumns !== headTracks) {\n this.headGridEl.style.gridTemplateColumns = headTracks;\n }\n }\n }\n\n /** Mirror the body's horizontal scroll onto the (clipped) header + thumb. */\n private onBodyScroll = () => {\n if (this.headScrollEl && this.bodyScrollEl) {\n this.headScrollEl.scrollLeft = this.bodyScrollEl.scrollLeft;\n }\n this.updateHScroll();\n this.updateVScroll();\n // one mdScroll per frame, not per native scroll event\n if (!this.scrollEmitQueued && typeof requestAnimationFrame !== 'undefined') {\n this.scrollEmitQueued = true;\n requestAnimationFrame(() => {\n this.scrollEmitQueued = false;\n const sc = this.bodyScrollEl;\n if (sc) this.mdScroll.emit({ scrollLeft: sc.scrollLeft, scrollTop: sc.scrollTop });\n });\n }\n };\n\n /** overflow-x is hidden (no native horizontal bar), so translate horizontal\n * wheel / trackpad (and shift+wheel) into programmatic horizontal scroll. */\n /**\n * Keyboard horizontal scrolling (WCAG 2.1.1): overflow-x is hidden (the\n * custom bar owns the axis) and the custom thumbs are pointer-only, so\n * without this a keyboard user could never reach off-screen columns.\n * Vertical arrows/PageUp/Down stay native (overflow-y: auto).\n */\n private onBodyKeyDown = (e: KeyboardEvent) => {\n const sc = this.bodyScrollEl;\n if (!sc || e.target !== sc) return;\n const max = sc.scrollWidth - sc.clientWidth;\n if (max <= 0) return;\n const step = 48;\n let dx = 0;\n if (e.key === 'ArrowRight') dx = this.isRtl ? -step : step;\n else if (e.key === 'ArrowLeft') dx = this.isRtl ? step : -step;\n else if (e.key === 'Home' && (e.ctrlKey || e.metaKey)) dx = -Infinity;\n else if (e.key === 'End' && (e.ctrlKey || e.metaKey)) dx = Infinity;\n else return;\n e.preventDefault();\n // RTL scrollLeft runs [-max, 0]; LTR [0, max] — same clamp as onBodyWheel.\n const lo = this.isRtl ? -max : 0;\n const hi = this.isRtl ? 0 : max;\n sc.scrollLeft = Math.max(lo, Math.min(hi, dx === -Infinity ? lo : dx === Infinity ? hi : sc.scrollLeft + dx));\n };\n\n private onBodyWheel = (e: WheelEvent) => {\n const sc = this.bodyScrollEl;\n if (!sc || sc.scrollWidth <= sc.clientWidth + 1) return;\n const dx = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.shiftKey ? e.deltaY : 0;\n if (!dx) return;\n const max = sc.scrollWidth - sc.clientWidth;\n // Valid scrollLeft range flips with direction: [0, max] in LTR, [-max, 0]\n // in RTL (scrollLeft runs negative from the right-hand content start).\n const lo = this.isRtl ? -max : 0;\n const hi = this.isRtl ? 0 : max;\n const next = Math.max(lo, Math.min(hi, sc.scrollLeft + dx));\n if (next !== sc.scrollLeft) {\n sc.scrollLeft = next;\n e.preventDefault();\n }\n };\n\n @Watch('density')\n @Watch('striped')\n @Watch('stickyHeader')\n @Watch('stickyFooter')\n @Watch('columns')\n @Watch('columnTemplate')\n onLayoutChange() {\n this.syncRows();\n }\n\n @Watch('sortBy')\n @Watch('sortOrder')\n onSortStateChange() {\n this.syncSortLabels();\n }\n\n // ------------------------------------------------------------------\n // Public API\n // ------------------------------------------------------------------\n\n /** Returns the current selection state (synchronous snapshot). */\n @Method()\n async getSelection(): Promise<MdTableSelectionState> {\n this.recomputeSelection(false);\n return this.selectionCache;\n }\n\n /** Programmatically select all selectable body rows (no-op when selection=\"none\"). */\n @Method()\n async selectAll(): Promise<void> {\n // Select-all is a MULTIPLE-mode concept: in single (radio-like) mode a\n // bulk select would violate the one-row invariant — the select-all checkbox\n // previously behaved identically in both modes, making them\n // indistinguishable.\n if (this.selection !== 'multiple') return;\n this.bulkSelecting = true;\n try {\n this.getSelectableRows().forEach((r) => {\n if (!r.disabled) r.selected = true;\n });\n } finally {\n this.bulkSelecting = false;\n }\n this.recomputeSelection();\n }\n\n /** Programmatically deselect every row. */\n @Method()\n async deselectAll(): Promise<void> {\n this.bulkSelecting = true;\n try {\n this.getSelectableRows().forEach((r) => (r.selected = false));\n } finally {\n this.bulkSelecting = false;\n }\n this.recomputeSelection();\n }\n\n /** Toggle the \"all selected\" state (used by the select-all checkbox). */\n @Method()\n async toggleSelectAll(): Promise<void> {\n if (this.selectionCache.all) await this.deselectAll();\n else await this.selectAll();\n }\n\n /** Set the active sort column / order programmatically. */\n @Method()\n async setSort(column: string, order: MdTableSortOrder): Promise<void> {\n this.sortBy = column;\n this.sortOrder = order;\n const play = this.armMotion();\n this.mdSortChange.emit({ column, order });\n play?.();\n }\n\n // ------------------------------------------------------------------\n // Column pinning — core-owned cell reorder + sticky attrs + template\n // ------------------------------------------------------------------\n\n /** Pinned columns by ORIGINAL column index (their position before any\n * pinning). Initialized from markup `sticky` attributes on first use, so a\n * hard-coded sticky checkbox column keeps its place at the front. */\n private pinnedColumns = new Map<number, 'start' | 'end'>();\n private hiddenColumns = new Set<number>();\n private scrollEmitQueued = false;\n /** The ORIGINAL column tracks, parsed once — permutations and minmax floors\n * are always derived from these, never from the rewritten attribute. */\n private pinBaseTracks: string[] | null = null;\n\n /** Split a grid template into top-level tracks (minmax(a, b) stays one). */\n private static splitTracks(template: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let cur = '';\n for (const ch of template.trim()) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (/\\s/.test(ch) && depth === 0) {\n if (cur) {\n out.push(cur);\n cur = '';\n }\n } else {\n cur += ch;\n }\n }\n if (cur) out.push(cur);\n return out;\n }\n\n /** Stamp every cell with its original column index + parse the base tracks.\n * Returns false when the table can't support pinning — warning unless\n * `silent` (the mount-time header-floor pass probes speculatively; e.g. a\n * legit grouped-header table with colspans must not spam the console). */\n /**\n * Direct element children matching a tag / attribute predicate.\n *\n * Deliberately NOT `:scope >` — Stencil's mock-doc selector engine throws\n * outright on `:scope` (\"jQuery does not support the :scope selector\"), which\n * made pinColumn and setColumnVisibility unrunnable in a spec. Every other\n * component in this library already avoids it for the same reason (see\n * md-accordion, md-dialog, md-tooltip, md-breadcrumbs, utils/select-options).\n */\n private static directChildren(parent: Element, match: (el: HTMLElement) => boolean): HTMLElement[] {\n return (Array.from(parent.children) as HTMLElement[]).filter(match);\n }\n\n private static isTag(tag: string) {\n return (el: HTMLElement) => el.tagName.toLowerCase() === tag;\n }\n\n private ensurePinBase(silent = false): boolean {\n if (this.pinBaseTracks) return true;\n const warn = (msg: string) => {\n if (!silent) console.warn(`[md-table] ${msg}`);\n };\n if (!this.columnTemplate || this.columnTemplate.includes('repeat(')) {\n warn('pinColumn needs an explicit column-template without repeat().');\n return false;\n }\n const tracks = (this.constructor as typeof MdTable).splitTracks(this.columnTemplate);\n const rows = Array.from(this.el.querySelectorAll('md-table-row'));\n for (const row of rows) {\n const cells = MdTable.directChildren(row, MdTable.isTag('md-table-cell'));\n if (cells.some((c) => c.hasAttribute('colspan') && c.getAttribute('colspan') !== '1')) {\n warn('pinColumn does not support colspan cells.');\n return false;\n }\n if (cells.length !== tracks.length) {\n warn('pinColumn needs every row to have one cell per column.');\n return false;\n }\n cells.forEach((c, i) => c.setAttribute('data-md-col', String(i)));\n }\n // Seed pins from markup sticky attributes (head row = source of truth), so\n // e.g. a sticky checkbox column stays first among the pinned-start group.\n const headRow = this.el.querySelector('md-table-head md-table-row');\n const headCells = headRow\n ? MdTable.directChildren(headRow, MdTable.isTag('md-table-cell'))\n : [];\n headCells.forEach((c, i) => {\n const s = c.getAttribute('sticky');\n if (s === 'start' || s === 'end') this.pinnedColumns.set(i, s);\n });\n this.pinBaseTracks = tracks;\n return true;\n }\n\n /**\n * Pin a column to an edge (or unpin with `'none'`). `column` is the ORIGINAL\n * 0-based column index (its position before any pinning). The table owns the\n * whole mechanic: it physically re-sequences every row's cells (selection and\n * expansion state survive — the elements just move), maintains `sticky`\n * attributes, permutes the column template, and re-floors the header tracks\n * so pin icons / sort arrows never clip in frozen mode. The move itself is an\n * intentional SNAP (no FLIP) — the frozen header re-measures its tracks over\n * the next frames, and animating against that settling would jitter.\n * Resolves to the column's effective side after the call.\n */\n @Method()\n async pinColumn(column: number, side: 'start' | 'end' | 'none'): Promise<'start' | 'end' | null> {\n if (!this.ensurePinBase()) return null;\n if (side === 'none' || this.pinnedColumns.get(column) === side) {\n this.pinnedColumns.delete(column);\n } else {\n this.pinnedColumns.set(column, side);\n }\n this.applyPinLayout();\n const effective = this.pinnedColumns.get(column) ?? null;\n this.mdPinChange.emit({ column, side: effective });\n return effective;\n }\n\n /**\n * Hide or show a column. `column` is the ORIGINAL 0-based index (same\n * addressing as `pinColumn`). Hidden cells stay in the DOM (state\n * survives — they just stop displaying) and their track leaves the\n * template. The last visible column cannot be hidden. Resolves to the\n * column's effective visibility.\n */\n @Method()\n async setColumnVisibility(column: number, visible: boolean): Promise<boolean> {\n if (!this.ensurePinBase()) return true;\n if (column < 0 || column >= (this.pinBaseTracks?.length ?? 0)) return true;\n if (!visible && this.hiddenColumns.size >= (this.pinBaseTracks!.length - 1) && !this.hiddenColumns.has(column)) {\n console.warn('[md-table] setColumnVisibility: refusing to hide the last visible column.');\n return true;\n }\n if (visible) this.hiddenColumns.delete(column);\n else this.hiddenColumns.add(column);\n this.applyPinLayout();\n const effective = !this.hiddenColumns.has(column);\n this.mdColumnVisibilityChange.emit({\n column,\n visible: effective,\n hidden: Array.from(this.hiddenColumns).sort((a, b) => a - b),\n });\n return effective;\n }\n\n /** Re-sequence cells + sticky attrs + template for the current pin state. */\n private applyPinLayout() {\n const tracks = this.pinBaseTracks!;\n const all = tracks.map((_, i) => i);\n const start = all.filter((i) => this.pinnedColumns.get(i) === 'start');\n const end = all.filter((i) => this.pinnedColumns.get(i) === 'end');\n const mid = all.filter((i) => !this.pinnedColumns.has(i));\n const order = [...start, ...mid, ...end];\n\n this.el.querySelectorAll('md-table-row').forEach((row) => {\n order.forEach((k) => {\n const cell =\n MdTable.directChildren(row, (c) => c.getAttribute('data-md-col') === String(k))[0] ?? null;\n if (!cell) return;\n row.appendChild(cell); // appending in `order` re-sequences the cells\n const side = this.pinnedColumns.get(k);\n if (side) cell.setAttribute('sticky', side);\n else cell.removeAttribute('sticky');\n // hidden columns: cells stay in the DOM (state survives), just\n // undisplayed — their track leaves the template below\n if (this.hiddenColumns.has(k)) cell.setAttribute('data-md-col-hidden', '');\n else cell.removeAttribute('data-md-col-hidden');\n });\n });\n const visibleOrder = order.filter((k) => !this.hiddenColumns.has(k));\n this.el.setAttribute('column-template', visibleOrder.map((k) => tracks[k]).join(' '));\n this.syncHeaderContentFloors(visibleOrder);\n }\n\n /**\n * Content-driven header floors: in frozen mode each header track is forced\n * to its BODY cell's width, so header content that is wider than the body\n * values — a sort arrow, a pin icon — would spill into the next column.\n * Measure every header cell's light-DOM content span and floor its track\n * with minmax(need, base). The pin icon renders asynchronously in the cell's\n * shadow root, so pinned headers get a fixed allowance for it instead of\n * waiting on that render (16px icon + 4px gap).\n */\n private syncHeaderContentFloors(order?: number[]) {\n if (!this.frozenHeader || !this.pinBaseTracks) return;\n const tracks = this.pinBaseTracks;\n const seq = order ?? tracks.map((_, i) => i);\n requestAnimationFrame(() => {\n const headRow = this.el.querySelector('md-table-head md-table-row');\n if (!headRow) return;\n const tpl = seq.map((k) => {\n const base = tracks[k];\n const cell =\n MdTable.directChildren(headRow, (c) => c.getAttribute('data-md-col') === String(k))[0] ?? null;\n if (!cell || cell.getAttribute('padding') === 'checkbox') return base;\n const kids = Array.from(cell.children) as HTMLElement[];\n if (!kids.length) return base;\n const left = Math.min(...kids.map((el) => el.getBoundingClientRect().left));\n const right = Math.max(...kids.map((el) => el.getBoundingClientRect().right));\n const span = right - left;\n if (span <= 1) return base; // not laid out yet — no bogus floor\n const cs = getComputedStyle(cell);\n const pad = (parseFloat(cs.paddingInlineStart) || 0) + (parseFloat(cs.paddingInlineEnd) || 0);\n const pin =\n this.pinnedColumns.has(k) && !cell.hasAttribute('no-pin-indicator') ? 20 : 0;\n return `minmax(${Math.ceil(span + pad + pin)}px, ${base})`;\n });\n this.el.setAttribute('column-template', tpl.join(' '));\n });\n }\n\n /** Mount-time floors: a frozen table with sort labels needs its header\n * content floored even before any pinning (the always-reserved sort arrow\n * is wider than a short body value). Retries until the labels lay out. */\n private scheduleHeaderFloors(attempt = 0) {\n if (!this.frozenHeader || !this.columnTemplate) return;\n const probe = this.el.querySelector('md-table-head md-table-sort-label') as HTMLElement | null;\n if (!probe) return; // no sort labels — nothing wider than the body values\n const ready = probe.getBoundingClientRect().width > 1;\n if (!ready && attempt <= 30) {\n requestAnimationFrame(() => this.scheduleHeaderFloors(attempt + 1));\n return;\n }\n if (this.ensurePinBase(true)) this.syncHeaderContentFloors();\n }\n\n // ------------------------------------------------------------------\n // Built-in expressive motion (FLIP bracketing around sort / page events)\n // ------------------------------------------------------------------\n\n /**\n * Snapshot the current row boxes and FLIP-animate whatever the next\n * SYNCHRONOUS DOM mutation does to them. Call it right before you reorder /\n * show-hide rows outside the table's own events (custom filters, async\n * refetch completion, …); sort and pagination are bracketed automatically.\n */\n @Method()\n async animateNextChange(): Promise<void> {\n this.armMotion()?.();\n }\n\n /** Internal, synchronous arm signal — dispatched by md-table-container when\n * it hears a pagination event in the CAPTURE phase (a cross-shadow @Method\n * call would resolve on a microtask, after the consumer already mutated). */\n @Listen('mdMotionArm')\n handleMotionArm(e: CustomEvent) {\n e.stopPropagation();\n this.armMotion()?.();\n }\n\n /** Capture FIRST rects of the slotted body rows; returns the rAF-deferred\n * play(), or null when motion is off / there is nothing to animate. */\n private armMotion(): (() => void) | null {\n if (this.motion === 'none') return null;\n const body = this.el.querySelector('md-table-body') as HTMLElement | null;\n if (!body) return null;\n return captureFlip(body, { enter: true, stagger: 18, staggerCap: 6, spring: 'fast' });\n }\n\n // ------------------------------------------------------------------\n // Sort / selection event coordination\n // ------------------------------------------------------------------\n\n @Listen('mdSortRequest')\n handleSortRequest(e: CustomEvent<{ column: string; defaultOrder?: 'asc' | 'desc' }>) {\n e.stopPropagation();\n const col = e.detail.column;\n if (!col) return;\n\n // First activation starts at the label's default-order; subsequent clicks\n // cycle from there (desc-first columns cycle desc -> asc -> none).\n const first: MdTableSortOrder = e.detail.defaultOrder === 'desc' ? 'desc' : 'asc';\n let order: MdTableSortOrder = first;\n if (this.sortBy === col) {\n const second: MdTableSortOrder = first === 'asc' ? 'desc' : 'asc';\n order = this.sortOrder === first ? second : this.sortOrder === second ? 'none' : first;\n }\n this.sortBy = order === 'none' ? '' : col;\n this.sortOrder = order === 'none' ? 'asc' : order;\n // Bracket the consumer's reorder: capture rows now, emit (handlers run\n // synchronously during emit), then play — the rAF-deferred FLIP glides\n // survivors and fades in rows the new order revealed.\n const play = this.armMotion();\n this.mdSortChange.emit({ column: this.sortBy, order });\n play?.();\n }\n\n /**\n * AUTO-WIRED selection checkboxes: the table already keeps slotted\n * md-checkboxes in sync (syncSelectionUI) — it now also HANDLES them, so\n * plain markup works with zero consumer wiring. Deliberately DECLARATIVE\n * (set state to the checkbox's checked value, never toggle): consumers that\n * wired their own handlers apply the same end state, so double-handling is\n * idempotent instead of self-cancelling.\n */\n @Listen('mdChange')\n handleSlottedCheckboxChange(e: CustomEvent<{ checked?: boolean }>) {\n if (this.selection === 'none') return;\n const target = e.target as HTMLElement;\n if (target.tagName !== 'MD-CHECKBOX') return;\n const checked = !!e.detail?.checked;\n // DEFER one microtask. Consumer handlers run earlier in the dispatch\n // (target phase) but their table calls go through Stencil @Method\n // proxies, whose bodies also run on a microtask — queued BEFORE this one\n // (FIFO). Acting synchronously here inverted stateful consumer wiring:\n // auto-wire selected all during bubble, then the consumer's deferred\n // toggleSelectAll() read all=true and DESELECTED — the click net-reverted\n // (proven with an event trace). Deferred, the consumer's toggle executes\n // against the pre-click state and this declarative set converges last.\n queueMicrotask(() => {\n if (target.closest('md-table-head')) {\n if (this.selection !== 'multiple') return; // select-all box is inert in single mode\n if (checked) void this.selectAll();\n else void this.deselectAll();\n return;\n }\n const row = target.closest('md-table-row') as SelectableRow | null;\n if (row && row.closest('md-table-body') && !row.disabled && row.selectable !== false) {\n row.selected = checked;\n }\n });\n }\n\n /** Rowgroups relay their internal slot changes (row reorders/additions\n * never cross their shadow boundary as slotchange) — re-stamp context. */\n @Listen('mdRowgroupSlotChange')\n handleRowgroupSlotChange() {\n this.syncRows();\n // Covers checkbox columns appearing with a mode switch: the select-all box\n // must pick up its single-mode disabled state even though it was\n // inserted AFTER the selection watch ran.\n this.recomputeSelection(false);\n // Cell-count changes alter the resolved body tracks — the frozen header\n // held stale tracks (8 vs the body's 6 after Playground none->single)\n // until the next unrelated resize.\n this.syncFrozenColumns();\n this.updateHScroll();\n this.updateVScroll();\n }\n\n @Listen('mdRowSelectionChange')\n handleRowSelectionChange(e: CustomEvent<{ selected: boolean; value: string }>) {\n if (this.bulkSelecting) return; // one recompute at the end of the bulk op\n if (this.selection === 'single' && e.detail.selected) {\n // Enforce single-selection: deselect all OTHER rows\n const target = e.target as HTMLElement;\n this.bulkSelecting = true;\n try {\n this.getSelectableRows().forEach((r) => {\n if (r !== target) r.selected = false;\n });\n } finally {\n this.bulkSelecting = false;\n }\n }\n this.recomputeSelection();\n }\n\n // ------------------------------------------------------------------\n // Internal helpers\n // ------------------------------------------------------------------\n\n /** Body rows only — header/footer rows must never join selection math. */\n private getSelectableRows(): SelectableRow[] {\n return (Array.from(this.el.querySelectorAll('md-table-row')) as unknown as SelectableRow[]).filter(\n (r) => (r.closest('md-table-head') || r.closest('md-table-foot')) == null,\n );\n }\n\n private recomputeSelection(emit: boolean = true) {\n const rows = this.getSelectableRows();\n const selectable = rows.filter((r) => !r.disabled && r.selectable !== false);\n const selected = selectable.filter((r) => r.selected);\n const all = selectable.length > 0 && selected.length === selectable.length;\n const indeterminate = selected.length > 0 && !all;\n\n this.selectionCache = {\n count: selected.length,\n total: selectable.length,\n values: selected.map((r, i) => r.value || String(i)),\n all,\n indeterminate,\n };\n\n this.syncSelectionUI(rows, all, indeterminate);\n\n if (emit) this.mdSelectionChange.emit(this.selectionCache);\n }\n\n /**\n * Push the selection MODEL back into the slotted checkboxes (the missing half\n * of the two-way sync): each body row's checkbox mirrors `row.selected`, and\n * the header checkbox reflects all / indeterminate. Row `selected` is the\n * source of truth; a checkbox is just its view. `md-checkbox` only emits\n * `mdChange` on user interaction (not on programmatic `.checked`), and the\n * value-equality guards make this a no-op once in sync — so no event loops.\n */\n private syncSelectionUI(rows: SelectableRow[], all: boolean, indeterminate: boolean) {\n // Keep the ARIA selected state in lockstep with the visual one.\n if (this.selection !== 'none') {\n for (const r of rows) {\n const host = r as unknown as HTMLElement;\n if (host.closest('md-table-body') == null) continue;\n if (r.selectable === false || r.disabled) host.removeAttribute('aria-selected');\n else host.setAttribute('aria-selected', String(!!r.selected));\n }\n }\n\n if (this.selection === 'none') {\n // Clear any residue a previous mode left on the select-all checkbox.\n const staleHead = this.el.querySelector('md-table-head md-checkbox') as\n | (HTMLElement & { checked: boolean; disabled: boolean; indeterminate: boolean })\n | null;\n if (staleHead) {\n staleHead.disabled = false;\n staleHead.checked = false;\n staleHead.indeterminate = false;\n }\n return;\n }\n for (const r of rows) {\n const cb = (r as unknown as HTMLElement).querySelector('md-checkbox') as\n | (HTMLElement & { checked: boolean; disabled: boolean })\n | null;\n if (!cb) continue;\n if (cb.checked !== r.selected) cb.checked = r.selected;\n if (cb.disabled !== !!r.disabled) cb.disabled = !!r.disabled;\n }\n const headCb = this.el.querySelector('md-table-head md-checkbox') as\n | (HTMLElement & { checked: boolean; indeterminate: boolean; disabled: boolean })\n | null;\n if (headCb) {\n if (this.selection === 'single') {\n // No select-all in radio-like mode: the affordance is disabled and\n // cleared so single visibly differs from multiple.\n if (!headCb.disabled) headCb.disabled = true;\n if (headCb.checked) headCb.checked = false;\n if (headCb.indeterminate) headCb.indeterminate = false;\n } else {\n if (headCb.disabled) headCb.disabled = false;\n if (headCb.indeterminate !== indeterminate) headCb.indeterminate = indeterminate;\n if (headCb.checked !== all) headCb.checked = all;\n }\n }\n }\n\n /**\n * Stamp layout context onto slotted rows (the stepper-style push pattern):\n * rowgroup (head/body/foot), stripe parity, sticky flags. Rows/cells style\n * themselves from these attributes — no `:host-context()`, no observers.\n */\n private syncRows() {\n // Frozen header: project md-table-head into the dedicated header grid via\n // the `head` slot (only when sticky-header, else it stays in the main grid).\n const headEl = this.el.querySelector('md-table-head');\n if (headEl) {\n if (this.frozenHeader) headEl.setAttribute('slot', 'head');\n else if (headEl.getAttribute('slot') === 'head') headEl.removeAttribute('slot');\n }\n\n // Rowgroup role coordination for the frozen split. The body/foot render\n // inside `.md-table__body-scroll`, which is itself role=\"rowgroup\" (it must\n // be a valid child of role=\"table\" despite being a focusable scroll tab\n // stop). Their own rowgroup role would then nest inside that wrapper\n // rowgroup (axe aria-required-children: a rowgroup may only own rows), so\n // they drop to presentation and their rows promote to the wrapper. The head\n // sits in a presentational header wrapper, so it keeps its own rowgroup\n // role. Pushed as a reflected prop (not an imperative role override) so the\n // child decides its own role on render — no race with its first paint.\n (Array.from(this.el.querySelectorAll('md-table-body, md-table-foot')) as HTMLElement[]).forEach((rg) => {\n if (this.frozenHeader) rg.setAttribute('presentational', '');\n else rg.removeAttribute('presentational');\n });\n\n const rows = Array.from(this.el.querySelectorAll('md-table-row')) as HTMLElement[];\n const lastIndex = rows.length - 1;\n // A treegrid is the only table-family container whose rows may carry\n // aria-expanded (the disclosure state md-table-row stamps when expandable).\n // Recompute here so the structural role in render() promotes to treegrid\n // exactly when such a row exists, and drops back to table when none do.\n const hasExpandable = rows.some((r) => r.hasAttribute('expandable'));\n if (this.hasExpandableRow !== hasExpandable) this.hasExpandableRow = hasExpandable;\n // Suppress the final row's divider ONLY when that row actually sits at the\n // container's rounded bottom corner: i.e. the table is inside an\n // md-table-container AND nothing is slotted below it (a `slot=\"bottom\"`\n // pagination bar owns the corner instead, and needs the divider above it\n // kept). A bare md-table has no rounded corner, so its bottom border stays.\n const container = this.el.closest('md-table-container');\n const hasBottomBar =\n !!container &&\n MdTable.directChildren(container, (c) => c.getAttribute('slot') === 'bottom').length > 0;\n const suppressLastDivider = !!container && !hasBottomBar;\n // The foot row carries its own top divider (border-block-start); the last\n // body row before it must drop its bottom divider or the two double up.\n const footExists = rows.some((r) => r.closest('md-table-foot') != null);\n let lastBodyIdx = -1;\n rows.forEach((r, i) => {\n if (r.closest('md-table-head') == null && r.closest('md-table-foot') == null) lastBodyIdx = i;\n });\n const nHead = rows.filter((r) => r.closest('md-table-head') != null).length;\n let bodyIndex = 0;\n let headIndex = 0;\n let footIndex = 0;\n rows.forEach((row, i) => {\n const inHead = row.closest('md-table-head') != null;\n const inFoot = row.closest('md-table-foot') != null;\n const group = inHead ? 'head' : inFoot ? 'foot' : 'body';\n const set = (k: string, v: string | null) => {\n if (v === null) {\n if (row.hasAttribute(k)) row.removeAttribute(k);\n } else if (row.getAttribute(k) !== v) {\n row.setAttribute(k, v);\n }\n };\n set('rowgroup', group);\n set('data-stripe', group === 'body' && this.striped && bodyIndex % 2 === 1 ? 'true' : null);\n set('data-sticky', (inHead && this.stickyHeader) || (inFoot && this.stickyFooter) ? 'true' : null);\n // Stamp the final row only when it truly meets the container's rounded\n // bottom (see suppressLastDivider). `:host([data-last])` in\n // md-table-row.css drops just that row's divider; all others are kept.\n set('data-last', suppressLastDivider && i === lastIndex ? 'true' : null);\n // Drop the last body row's bottom divider when a footer follows (the foot\n // supplies the single body/foot divider via border-block-start).\n set('data-adjacent-foot', footExists && i === lastBodyIdx ? 'true' : null);\n // ARIA pagination positions: with row-count set only a subset is in the\n // DOM, so every row needs aria-rowindex (1-based, headers first, body\n // offset by row-offset). Foot rows have no well-defined absolute index.\n if (this.rowCount > 0) {\n if (inHead) set('aria-rowindex', String(headIndex + 1));\n else if (!inFoot) set('aria-rowindex', String(nHead + this.rowOffset + bodyIndex + 1));\n // Foot rows sit AFTER the full dataset in reading order.\n else set('aria-rowindex', String(nHead + this.rowCount + footIndex + 1));\n } else {\n set('aria-rowindex', null);\n }\n if (inFoot) footIndex++;\n // aria-selected belongs ONLY on selectable body rows of a\n // selection-enabled table (never head/foot, never selection=\"none\").\n if (group === 'body' && this.selection !== 'none') {\n const r = row as unknown as SelectableRow;\n set('aria-selected', r.selectable === false || r.disabled ? null : String(!!r.selected));\n } else {\n set('aria-selected', null);\n }\n if (group === 'body') bodyIndex++;\n if (inHead) headIndex++;\n // Cast the table-wide pin icon to pinned header cells (author-set\n // values win; our previous casts are tracked and replaceable).\n if (inHead) {\n (Array.from(row.children) as HTMLElement[]).forEach((cell) => {\n const side = cell.getAttribute('sticky');\n if (cell.tagName !== 'MD-TABLE-CELL' || (side !== 'start' && side !== 'end')) return;\n const cast = cell.getAttribute('data-pin-icon-cast');\n const own = cell.getAttribute('pin-icon');\n if (own !== null && own !== cast) return; // author override — hands off\n if (this.pinIcon) {\n if (own !== this.pinIcon) {\n cell.setAttribute('pin-icon', this.pinIcon);\n cell.setAttribute('data-pin-icon-cast', this.pinIcon);\n }\n } else if (cast !== null) {\n cell.removeAttribute('pin-icon');\n cell.removeAttribute('data-pin-icon-cast');\n }\n });\n }\n });\n }\n\n /** Push the active sort state into every slotted sort label. */\n private syncSortLabels() {\n const labels = Array.from(this.el.querySelectorAll('md-table-sort-label')) as Array<\n HTMLElement & { active: boolean; order: MdTableSortOrder }\n >;\n for (const l of labels) {\n const col = l.getAttribute('column') || '';\n const active = !!col && col === this.sortBy;\n if (l.active !== active) l.active = active;\n const order = active ? this.sortOrder : 'none';\n if (l.order !== order) l.order = order;\n // aria-sort lives on the columnheader CELL (it is ignored on the sort\n // label's role=\"button\"); sortable-but-inactive columns expose \"none\".\n const cell = l.closest('md-table-cell');\n if (cell) {\n const ariaSort = !active || order === 'none' ? 'none' : order === 'asc' ? 'ascending' : 'descending';\n if (cell.getAttribute('aria-sort') !== ariaSort) cell.setAttribute('aria-sort', ariaSort);\n }\n }\n }\n\n private handleSlotChange = () => {\n this.syncRows();\n this.syncSortLabels();\n this.recomputeSelection(false);\n };\n\n /** Best-effort column count for the skeleton loader. */\n private get columnCount(): number {\n if (this.columns > 0) return this.columns;\n if (this.columnTemplate) {\n const t = this.columnTemplate.trim();\n const m = t.match(/repeat\\(\\s*(\\d+)/);\n if (m) return parseInt(m[1], 10);\n return t.split(/\\s+/).filter(Boolean).length || 1;\n }\n const firstRow = this.el.querySelector('md-table-row');\n return firstRow ? firstRow.querySelectorAll('md-table-cell').length || 1 : 1;\n }\n\n /** Skeleton body rows: one shimmer bar PER COLUMN (fills the row, on the\n * shared subgrid tracks), varied widths for a natural look. */\n private renderSkeletonRows() {\n const cols = Math.max(1, this.columnCount);\n return Array.from({ length: Math.max(1, this.loadingRows) }).map((_, r) => (\n <div class=\"md-table__skeleton-row\" part=\"skeleton-row\" aria-hidden=\"true\" key={`sk-${r}`}>\n {Array.from({ length: cols }).map((__, c) => (\n <span class=\"md-table__bar\" key={`sk-${r}-${c}`} />\n ))}\n </div>\n ));\n }\n\n private renderEmpty() {\n return (\n <div class=\"md-table__empty\" part=\"empty\">\n <slot name=\"empty\">\n <span class=\"md-table__empty-text\">No data</span>\n </slot>\n </div>\n );\n }\n\n render() {\n // Template resolution: explicit prop → public CSS var (in stylesheet\n // fallback chain) → derived-from-first-row count.\n const style: { [k: string]: string } = {};\n if (this.columnTemplate) {\n style['--_columns-template'] = this.columnTemplate;\n } else if (this.columns > 0) {\n style['--_columns-template'] = `repeat(${this.columns}, minmax(0, 1fr))`;\n } else {\n const firstRow = this.el.querySelector('md-table-row');\n const count = firstRow ? firstRow.querySelectorAll('md-table-cell').length : 0;\n if (count > 0) style['--_derived-template'] = `repeat(${count}, minmax(0, 1fr))`;\n }\n if (this.minWidth) style['--_min-width'] = this.minWidth;\n // ARIA for the structural table element (see host comment). When any row\n // is expandable the container is a `treegrid` rather than a plain `table`\n // so those rows' `aria-expanded` is valid (aria-conditional-attr); every\n // other property below is shared by both roles.\n const tableAria = {\n role: this.hasExpandableRow ? 'treegrid' : 'table',\n 'aria-label': this.label || this.caption || 'Data table',\n 'aria-description': this.summary || null,\n 'aria-busy': this.loading ? 'true' : null,\n // Header + foot rows count toward the ARIA row total.\n 'aria-rowcount':\n this.rowCount > 0\n ? String(\n this.rowCount +\n this.el.querySelectorAll('md-table-head md-table-row, md-table-foot md-table-row').length,\n )\n : null,\n };\n\n return (\n <Host\n class={{\n 'md-table': true,\n [`md-table--density-${this.density}`]: typeof this.density === 'string',\n 'md-table--sticky-header': this.stickyHeader,\n 'md-table--sticky-footer': this.stickyFooter,\n 'md-table--striped': this.striped,\n 'md-table--no-dividers': this.noDividers,\n 'md-table--hoverable': this.hoverable,\n 'md-table--loading': this.loading,\n [`md-table--loading-${this.loadingMode}`]: this.loading,\n 'md-table--empty': this.empty,\n }}\n // The table / treegrid role lives on the inner STRUCTURAL wrapper, not\n // the host: the table content model admits only rowgroups/rows, and the\n // host also hosts the caption, live region, loading overlay and empty\n // state (axe aria-required-children).\n style={style}\n >\n {/* Persistent polite live region: announces the empty state appearing.\n NO role=\"status\" — an explicit status role is an invalid child of\n role=\"table\" (axe aria-required-children); a bare aria-live span\n announces identically without entering the table content model. */}\n <span class=\"md-table__sr-status\" aria-live=\"polite\">\n {this.srAnnouncement}\n </span>\n {/* Caption is VISUAL only: its text names the table via aria-label\n (IDREFs can't cross the shadow boundary, and axe rejects\n role=\"caption\" as a table child) — aria-hidden avoids the name\n being announced twice. */}\n {this.caption && (\n <div class=\"md-table__caption\" part=\"caption\" aria-hidden=\"true\">\n {this.caption}\n </div>\n )}\n\n {this.frozenHeader ? (\n // Frozen header: the header grid sits above a vertically-scrolling\n // body grid, so the scrollbar spans only the body. Both grids share\n // the column tracks (syncFrozenColumns copies the body's resolved\n // pixel tracks onto the header, which also reserves the body's\n // scrollbar gutter on the header). Horizontal scroll is mirrored.\n <div class=\"md-table__frozen\" {...tableAria}>\n <div\n class=\"md-table__head-scroll\"\n role=\"presentation\"\n ref={(el) => (this.headScrollEl = el as HTMLElement)}\n >\n <div\n class=\"md-table__grid md-table__grid--head\"\n part=\"header-grid\"\n ref={(el) => (this.headGridEl = el as HTMLElement)}\n >\n <slot name=\"head\" onSlotchange={this.handleSlotChange}></slot>\n </div>\n </div>\n <div\n class=\"md-table__body-scroll\"\n // Keyboard users must be able to scroll the capped body without\n // a pointer (WAI: scrollable region), hence the tab stop. A\n // focusable element may not sit as a bare child of role=\"table\"\n // (axe aria-required-children — only rowgroup/row are allowed),\n // so this wrapper IS the body's rowgroup: role=\"rowgroup\" is a\n // required child of table, so axe walks THROUGH it to the rows\n // even though it is a scroll tab stop. The slotted md-table-body/\n // md-table-foot inside drop to presentation (see syncRows) so\n // their rows promote here instead of nesting a second rowgroup.\n role=\"rowgroup\"\n tabindex=\"0\"\n ref={(el) => (this.bodyScrollEl = el as HTMLElement)}\n onScroll={this.onBodyScroll}\n onWheel={this.onBodyWheel}\n onKeyDown={this.onBodyKeyDown}\n >\n <div\n class=\"md-table__grid md-table__grid--body\"\n part=\"grid\"\n // Layout-only grid between the rowgroup wrapper and the rows.\n role=\"presentation\"\n ref={(el) => (this.bodyGridEl = el as HTMLElement)}\n >\n <slot onSlotchange={this.handleSlotChange}></slot>\n {this.loading && this.loadingMode === 'skeleton' && this.renderSkeletonRows()}\n </div>\n {/* Frozen mode: empty message lives inside the body scroll area so\n it sits directly under the header and fills the body. */}\n {this.empty && !this.loading && this.renderEmpty()}\n </div>\n {/* Custom, always-visible horizontal scrollbar (JS-toggled when the\n body overflows) — replaces the invisible native overlay bar. */}\n <div\n class=\"md-table__hscroll\"\n part=\"hscrollbar\"\n aria-hidden=\"true\"\n ref={(el) => (this.hTrackEl = el as HTMLElement)}\n >\n <div\n class=\"md-table__hscroll-thumb\"\n part=\"hscrollbar-thumb\"\n ref={(el) => (this.hThumbEl = el as HTMLElement)}\n onPointerDown={this.onHThumbPointerDown}\n onPointerMove={this.onHThumbPointerMove}\n onPointerUp={this.onHThumbPointerUp}\n onPointerCancel={this.onHThumbPointerUp}\n ></div>\n </div>\n {/* Custom vertical OVERLAY scrollbar — floats over the rows' right\n edge (no reserved gutter, rows stay full width). */}\n <div\n class=\"md-table__vscroll\"\n part=\"vscrollbar\"\n aria-hidden=\"true\"\n ref={(el) => (this.vTrackEl = el as HTMLElement)}\n >\n <div\n class=\"md-table__vscroll-thumb\"\n part=\"vscrollbar-thumb\"\n ref={(el) => (this.vThumbEl = el as HTMLElement)}\n onPointerDown={this.onVThumbPointerDown}\n onPointerMove={this.onVThumbPointerMove}\n onPointerUp={this.onVThumbPointerUp}\n onPointerCancel={this.onVThumbPointerUp}\n ></div>\n </div>\n </div>\n ) : (\n <div class=\"md-table__grid\" part=\"grid\" {...tableAria}>\n <slot onSlotchange={this.handleSlotChange}></slot>\n {this.loading && this.loadingMode === 'skeleton' && this.renderSkeletonRows()}\n </div>\n )}\n\n {this.loading && this.loadingMode === 'overlay' && (\n <div class=\"md-table__loading\" part=\"loading\" aria-hidden=\"true\">\n {/* `loader` is the library-wide name for \"swap the loading affordance\";\n `loading` is kept as the older alias. Nesting them means either\n works — the outer slot falls back to the inner one, which falls\n back to the default below — and `loader` wins if both are given. */}\n <slot name=\"loader\">\n <slot name=\"loading\">\n <div class=\"md-table__progress\" part=\"progress\">\n <md-progress-indicator variant=\"linear\" indeterminate aria-label=\"Loading\"></md-progress-indicator>\n </div>\n <div class=\"md-table__scrim\" />\n </slot>\n </slot>\n </div>\n )}\n\n {/* Non-frozen: empty message is a sibling that flex-fills below the grid. */}\n {this.empty && !this.loading && !this.frozenHeader && this.renderEmpty()}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["mdTableCss","MdTable","constructor","hostRef","this","density","columnTemplate","columns","minWidth","stickyHeader","frozenHeader","keepHeight","scrollbar","pinMode","pinIcon","stickyFooter","striped","noDividers","hoverable","motion","selection","sortBy","sortOrder","loading","loadingMode","loadingRows","empty","label","caption","summary","rowOffset","rowCount","selectionCache","count","total","values","all","indeterminate","bulkSelecting","hDragging","hDragStartX","hDragStartScroll","vDragging","vDragStartY","vDragStartScroll","updateHScroll","sc","bodyScrollEl","track","hTrackEl","thumb","hThumbEl","overflow","scrollWidth","clientWidth","style","display","trackW","thumbW","Math","max","maxThumbLeft","progress","min","abs","scrollLeft","left","isRtl","inlineSize","transform","onHThumbPointerDown","e","clientX","target","setPointerCapture","pointerId","preventDefault","onHThumbPointerMove","offsetWidth","perPx","onHThumbPointerUp","releasePointerCapture","updateVScroll","vTrackEl","vThumbEl","scrollHeight","clientHeight","insetBlockStart","offsetTop","blockSize","trackH","thumbH","maxThumbTop","top","scrollTop","onVThumbPointerDown","clientY","onVThumbPointerMove","offsetHeight","onVThumbPointerUp","srAnnouncement","hasExpandableRow","onBodyScroll","headScrollEl","scrollEmitQueued","requestAnimationFrame","mdScroll","emit","onBodyKeyDown","step","dx","key","ctrlKey","metaKey","Infinity","lo","hi","onBodyWheel","deltaX","deltaY","shiftKey","next","pinnedColumns","Map","hiddenColumns","Set","pinBaseTracks","handleSlotChange","syncRows","syncSortLabels","recomputeSelection","onPinIconChange","onPinModeChange","syncStickyOffsets","rows","Array","from","el","querySelectorAll","length","clear","forEach","row","children","c","removeProperty","gridEl","bodyGridEl","shadowRoot","querySelector","tracks","getComputedStyle","gridTemplateColumns","split","map","t","parseFloat","filter","n","Number","isNaN","cells","tagName","hasAttribute","startCum","cell","i","getAttribute","setProperty","endCum","direction","componentDidLoad","setupFrozenHeader","scheduleHeaderFloors","h","getBoundingClientRect","height","minBlockSize","round","componentDidRender","syncFrozenColumns","disconnectedCallback","frozenObserver","disconnect","undefined","onSelectionModeChange","trimmed","sel","getSelectableRows","r","selected","slice","onEmptyChange","onStickyHeaderChange","attach","tries","ResizeObserver","observe","headGridEl","hasVisibleRow","some","headTracks","onLayoutChange","onSortStateChange","getSelection","selectAll","disabled","deselectAll","toggleSelectAll","setSort","column","order","play","armMotion","mdSortChange","splitTracks","template","out","depth","cur","ch","trim","test","push","directChildren","parent","match","isTag","tag","toLowerCase","ensurePinBase","silent","warn","msg","console","includes","setAttribute","String","headRow","headCells","s","set","pinColumn","side","get","delete","applyPinLayout","effective","mdPinChange","setColumnVisibility","visible","size","has","add","mdColumnVisibilityChange","hidden","sort","a","b","_","start","end","mid","k","appendChild","removeAttribute","visibleOrder","join","syncHeaderContentFloors","seq","tpl","base","kids","right","span","cs","pad","paddingInlineStart","paddingInlineEnd","pin","ceil","attempt","probe","ready","width","animateNextChange","handleMotionArm","stopPropagation","body","captureFlip","enter","stagger","staggerCap","spring","handleSortRequest","col","detail","first","defaultOrder","second","handleSlottedCheckboxChange","checked","queueMicrotask","closest","selectable","handleRowgroupSlotChange","handleRowSelectionChange","value","syncSelectionUI","mdSelectionChange","host","staleHead","cb","headCb","headEl","rg","lastIndex","hasExpandable","container","hasBottomBar","suppressLastDivider","footExists","lastBodyIdx","nHead","bodyIndex","headIndex","footIndex","inHead","inFoot","group","v","cast","own","labels","l","active","ariaSort","columnCount","m","parseInt","Boolean","firstRow","renderSkeletonRows","cols","class","part","__","renderEmpty","name","render","tableAria","role","Host","ref","onSlotchange","tabindex","onScroll","onWheel","onKeyDown","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","variant"],"sources":["src/components/md-table/md-table.css?tag=md-table&encapsulation=shadow","src/components/md-table/md-table.tsx"],"sourcesContent":["/* ==========================================================\n md-table — MD3 Expressive table (composable primitive)\n\n Layout: the shadow `.md-table__grid` owns the column tracks; every\n slotted `md-table-row` is a REAL grid item spanning all tracks that\n lays its cells on the shared tracks via `grid-template-columns:\n subgrid`. Rows being real boxes is what makes row hover, stripes,\n dividers, sticky rows and focus rings work.\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-table-row-height-compact 36px (dense)\n --md-table-row-height-standard 52px\n --md-table-row-height-comfortable 60px\n --md-table-header-height 56px\n --md-table-cell-padding-inline per-density default\n --md-table-divider-color between rows\n --md-table-stripe-color every-other-row overlay color\n --md-table-head-bg background for thead rows\n --md-table-head-color text color for thead\n --md-table-foot-bg background for tfoot rows\n --md-table-row-hover-color row hover state-layer color\n --md-table-row-selected-bg selected row background\n --md-table-row-selected-color selected row text\n --md-table-columns-template grid-template-columns override\n\n CSS PARTS:\n caption The optional caption above the head\n grid The grid container holding all rows\n loading The loading overlay (when `loading`)\n empty The empty-state region (when `empty`)\n ========================================================== */\n\n:host {\n /* Motion: effects springs for color/opacity (house pairing rule). */\n --_fx-fast: var(--md-sys-motion-spring-effects-fast-duration, 150ms)\n var(--md-sys-motion-spring-effects-fast-easing, cubic-bezier(0.31, 0.94, 0.34, 1));\n --_fx-default: var(--md-sys-motion-spring-effects-default-duration, 200ms)\n var(--md-sys-motion-spring-effects-default-easing, cubic-bezier(0.34, 0.8, 0.34, 1));\n\n /* Density → row heights. Compact is a genuinely dense 36px data row (tighten\n further via --md-table-row-height-compact); the header is 56px regardless\n of body density (data-table idiom). */\n --_row-h-compact: var(--md-table-row-height-compact, max(28px, calc(36px + var(--md-sys-density-scale, 0) * 4px)));\n /* Standard (default) rows follow a global `data-density` ancestor (0…-4,\n 4px/rung); density-scale is 0 by default so 52px is unchanged. The explicit\n `density=\"compact|comfortable\"` prop overrides via the blocks below. */\n --_row-h-standard: var(--md-table-row-height-standard, calc(52px + var(--md-sys-density-scale, 0) * 4px));\n --_row-h-comfortable: var(--md-table-row-height-comfortable, max(40px, calc(60px + var(--md-sys-density-scale, 0) * 4px)));\n --_row-h: var(--_row-h-standard);\n --_head-h: var(--md-table-header-height, max(40px, calc(56px + var(--md-sys-density-scale, 0) * 4px)));\n /* Standard cell padding rides the spacing tokens (16/8 at density 0), so it\n tightens with global density; compact/comfortable pin their own below. */\n --_cell-pad-inline: var(--md-table-cell-padding-inline, var(--md-sys-spacing-inset-lg, 16px));\n --_cell-pad-block: var(--md-table-cell-padding-block, var(--md-sys-spacing-inset-sm, 8px));\n\n --_divider-color: var(--md-table-divider-color, var(--md-sys-color-outline-variant, #CAC4D0));\n --_divider: var(--_divider-color);\n --_stripe-color: var(\n --md-table-stripe-color,\n color-mix(\n in srgb,\n var(--md-sys-color-on-surface, #1C1B1F) calc(var(--md-sys-state-hover-state-layer-opacity, 0.08) * 50%),\n transparent\n )\n );\n --_head-bg: var(--md-table-head-bg, var(--md-sys-color-surface-container, #F3EDF7));\n --_head-color: var(--md-table-head-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_foot-bg: var(--md-table-foot-bg, var(--md-sys-color-surface-container-low, #F7F2FA));\n\n /* Row hover state layer — derived from the M3 state opacity token; zeroed\n when `hoverable` is off (rows consume the var unconditionally). */\n --_hover-layer: color-mix(\n in srgb,\n var(--md-table-row-hover-color, var(--md-sys-color-on-surface, #1C1B1F))\n calc(var(--md-sys-state-hover-state-layer-opacity, 0.08) * 100%),\n transparent\n );\n --_row-selected-bg: var(--md-table-row-selected-bg, var(--md-sys-color-secondary-container, #E8DEF8));\n --_row-selected-color: var(\n --md-table-row-selected-color,\n var(--md-sys-color-on-secondary-container, #1E192B)\n );\n\n display: block;\n inline-size: 100%;\n position: relative;\n isolation: isolate;\n color: var(--md-sys-color-on-surface, #1C1B1F);\n font-family: var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif);\n font-size: max(12px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n letter-spacing: var(--md-sys-typescale-body-medium-letter-spacing, 0.25px);\n}\n\n:host(.md-table--density-compact) {\n --_row-h: var(--_row-h-compact);\n --_cell-pad-inline: var(--md-table-cell-padding-inline, 12px);\n --_cell-pad-block: var(--md-table-cell-padding-block, 4px);\n /* Shrink slotted checkboxes to the compact row height so their 48px touch\n target doesn't force the row taller (inherits to the light-DOM cells). */\n --md-checkbox-touch-target-size: 32px;\n}\n:host(.md-table--density-comfortable) {\n --_row-h: var(--_row-h-comfortable);\n --_cell-pad-inline: var(--md-table-cell-padding-inline, 20px);\n}\n\n:host(.md-table--no-dividers) {\n --_divider: transparent;\n}\n:host(:not(.md-table--hoverable)) {\n --_hover-layer: transparent;\n}\n\n.md-table__caption {\n padding: 12px var(--_cell-pad-inline);\n font-family: var(--md-sys-typescale-title-small-font-family, Roboto, sans-serif);\n font-size: var(--md-sys-typescale-title-small-font-size, 14px);\n font-weight: var(--md-sys-typescale-title-small-font-weight, 500);\n line-height: var(--md-sys-typescale-title-small-line-height, 20px);\n color: var(--md-sys-color-on-surface-variant, #49454F);\n}\n\n/* The single grid every row subgrids into. Template resolution:\n explicit prop (inline --_columns-template) → public override var →\n derived-from-first-row count (inline --_derived-template). */\n.md-table__grid {\n display: grid;\n grid-template-columns: var(\n --_columns-template,\n var(--md-table-columns-template, var(--_derived-template, none))\n );\n align-items: stretch;\n /* Never squish OR wrap columns to fit: keep at least `min-width` if set,\n otherwise the grid's natural (unwrapped) max-content width. When the\n container is narrower the grid overflows and the scroll wrapper shows a\n horizontal scrollbar (spreadsheet-style) instead of collapsing. */\n min-inline-size: var(--_min-width, var(--md-table-min-width, max-content));\n}\n\n/* ── Frozen header (sticky-header): header grid pinned above a vertically\n scrolling body grid, so the scrollbar spans only the body. ───────────── */\n.md-table__frozen {\n display: flex;\n flex-direction: column;\n min-block-size: 0;\n inline-size: 100%;\n /* Containing block for the custom overlay scrollbars. */\n position: relative;\n}\n.md-table__head-scroll {\n flex: 0 0 auto;\n inline-size: 100%;\n /* Clipped; horizontal position is mirrored from the body (see onBodyScroll). */\n overflow: hidden;\n /* Paint the header band on the WRAPPER: the header grid is synced to the\n body's tracks, which stop a scrollbar-gutter short of the full width —\n without this the last ~10px of the header showed the container surface\n through. The inset hairline continues the header divider across that\n gutter zone (it coincides with the row's own divider elsewhere). */\n background-color: var(--_head-bg, var(--md-sys-color-surface-container, #F3EDF7));\n box-shadow: inset 0 -1px var(--_divider, transparent);\n}\n.md-table__body-scroll {\n flex: 1 1 auto;\n inline-size: 100%;\n min-block-size: 0;\n max-block-size: var(--md-table-body-max-h, none);\n /* Vertical scrolls natively; horizontal is fully owned by the custom bar\n (.md-table__hscroll) — overflow-x:hidden kills the native horizontal bar\n (so it never doubles with the custom one) while programmatic scrollLeft +\n the wheel handler still scroll it. */\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n/* Default `scrollbar=\"overlay\"`: the native vertical bar is fully hidden —\n the custom overlay bar (.md-table__vscroll) floats over the rows' right\n edge instead, so NO gutter is reserved: row backgrounds and dividers run\n the full width and a bar can never take space or shift content. */\n:host(:not([scrollbar='gutter'])) .md-table__body-scroll {\n scrollbar-width: none;\n}\n.md-table__body-scroll:focus-visible {\n /* Inset ring: an outer outline would be clipped by the container's\n overflow/border-radius. */\n outline: 2px solid var(--md-sys-color-secondary, #625B71);\n outline-offset: -2px;\n}\n/* Scoped to OVERLAY mode only — an unscoped display:none here once killed\n the gutter mode's native bar (its width rule won, but nothing re-declared\n display). */\n:host(:not([scrollbar='gutter'])) .md-table__body-scroll::-webkit-scrollbar {\n display: none;\n}\n/* `scrollbar=\"gutter\"`: classic inset bar in a reserved strip INSIDE the\n table — rows stop short of the edge and the native bar crosses the row\n borders. NB: no `scrollbar-width` here — modern Chrome ignores the styled\n ::-webkit-scrollbar when it's set (see project memory). */\n:host([scrollbar='gutter']) .md-table__body-scroll {\n scrollbar-gutter: stable;\n}\n:host([scrollbar='gutter']) .md-table__body-scroll::-webkit-scrollbar {\n width: 10px;\n}\n:host([scrollbar='gutter']) .md-table__body-scroll::-webkit-scrollbar-thumb {\n /* >= 3:1 non-text contrast (surface-container-highest measured ~1.25:1). */\n background: var(--md-sys-color-outline, #79747E);\n border-radius: 999px;\n border: 2px solid transparent;\n background-clip: content-box;\n}\n:host([scrollbar='gutter']) .md-table__body-scroll::-webkit-scrollbar-thumb:hover {\n background: var(--md-sys-color-on-surface-variant, #49454F);\n background-clip: content-box;\n}\n:host([scrollbar='gutter']) .md-table__vscroll {\n display: none !important;\n}\n\n/* ── Custom horizontal scrollbar (frozen mode) ─────────────── */\n/* Custom vertical OVERLAY scrollbar (frozen mode): floats over the rows near\n the body's right edge. Always visible while the body overflows — unlike the\n auto-hiding macOS overlay bar — and takes NO layout space. */\n.md-table__vscroll {\n position: absolute;\n inset-inline-end: 3px;\n inline-size: 8px;\n display: none;\n z-index: 3;\n pointer-events: none;\n}\n.md-table__vscroll-thumb {\n position: absolute;\n inset-inline: 0;\n border-radius: 999px;\n /* WCAG 1.4.11 non-text contrast: 50% alpha of on-surface computes >=3.2:1\n over every light surface in the family (45% measured 2.81-2.86:1 — just\n UNDER the 3:1 line; the minimum passing alpha is 48%). */\n background: color-mix(in srgb, var(--md-sys-color-on-surface, #1C1B1F) 50%, transparent);\n pointer-events: auto;\n touch-action: none;\n}\n.md-table__vscroll-thumb:hover,\n.md-table__vscroll-thumb:active {\n background: color-mix(in srgb, var(--md-sys-color-on-surface, #1C1B1F) 60%, transparent);\n}\n\n.md-table__hscroll {\n display: none; /* JS shows it (block) only when the body overflows */\n position: relative;\n flex: 0 0 auto;\n block-size: 10px;\n margin-inline: 8px;\n margin-block: 2px;\n}\n.md-table__hscroll-thumb {\n position: absolute;\n inset-block: 1px;\n inline-size: 40px;\n min-inline-size: 24px;\n background: var(--md-sys-color-outline, #79747E); /* >= 3:1 (was outline-variant ~1.6:1) */\n border-radius: 999px;\n cursor: grab;\n touch-action: none;\n transition: background-color var(--_fx-fast, 150ms ease);\n}\n.md-table__hscroll-thumb:hover {\n background: var(--md-sys-color-outline, #79747E);\n}\n.md-table__hscroll-thumb:active {\n cursor: grabbing;\n background: var(--md-sys-color-on-surface-variant, #49454F);\n}\n/* The header grid's tracks are set to the body's resolved pixel widths by JS;\n its width still fills the row so the leftover (scrollbar gutter) sits at the\n end, keeping the columns aligned with the body. */\n.md-table__grid--head {\n min-inline-size: max(100%, var(--_min-width, var(--md-table-min-width, 0px)));\n inline-size: max-content;\n}\n.md-table__grid--body {\n min-inline-size: max(100%, var(--_min-width, var(--md-table-min-width, 0px)));\n}\n\n/* ── Loading: shared shimmer bar ──────────────────────────── */\n.md-table__bar {\n block-size: 16px;\n border-radius: var(--md-sys-shape-corner-full, 9999px);\n background: linear-gradient(\n 90deg,\n var(--md-sys-color-surface-container-high, #ECE6F0) 25%,\n var(--md-sys-color-surface-container, #F3EDF7) 37%,\n var(--md-sys-color-surface-container-high, #ECE6F0) 63%\n );\n background-size: 400% 100%;\n animation: md-table-shimmer 1.4s ease infinite;\n}\n\n@keyframes md-table-shimmer {\n 0% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0 50%;\n }\n}\n\n/* ── Loading: SKELETON mode ───────────────────────────────────\n Body (and footer) are hidden and replaced by shimmer rows; the header stays.\n md-table-head/body/foot are the slot assignees, so display:none on them hides\n their whole subtree. */\n:host(.md-table--loading-skeleton) ::slotted(md-table-body),\n:host(.md-table--loading-skeleton) ::slotted(md-table-foot) {\n display: none;\n}\n\n.md-table__skeleton-row {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: subgrid;\n align-items: center;\n min-block-size: var(--_row-h);\n border-block-end: 1px solid var(--_divider);\n}\n.md-table__skeleton-row:last-child {\n border-block-end: none;\n}\n/* One bar per column, inset by the cell padding — fills the row. */\n.md-table__skeleton-row .md-table__bar {\n margin-inline: var(--_cell-pad-inline);\n}\n\n/* ── Loading: OVERLAY mode ────────────────────────────────────\n An indeterminate progress line just under the header + a scrim that dims and\n blocks the body. Header/footer are untouched (the scrim starts below the\n header). */\n.md-table__loading {\n position: absolute;\n inset: 0;\n z-index: 3;\n pointer-events: none;\n}\n\n.md-table__scrim {\n position: absolute;\n inset-block-start: var(--_head-h);\n inset-block-end: 0;\n inset-inline: 0;\n background: color-mix(in srgb, var(--md-sys-color-surface, #FEF7FF) 55%, transparent);\n /* Block interaction with the (loading) body. */\n pointer-events: auto;\n}\n\n/* The library's own linear indeterminate indicator, pinned under the header. */\n.md-table__progress {\n position: absolute;\n inset-block-start: var(--_head-h);\n inset-inline: 0;\n}\n.md-table__progress md-progress-indicator {\n display: block;\n inline-size: 100%;\n}\n\n/* ── Empty state ──────────────────────────────────────────── */\n.md-table__empty {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n /* Fallback height when there's no bounded container to fill (a plain,\n auto-height table). Override with --md-table-empty-min-height. */\n min-block-size: var(--md-table-empty-min-height, 160px);\n padding: 32px var(--_cell-pad-inline);\n text-align: center;\n color: var(--md-sys-color-on-surface-variant, #49454F);\n}\n\n/* When the table is empty, fill the scroll viewport as a flex column so the\n empty region takes exactly the height left below the header — its content\n centers on both axes with NO extra height / scrollbar. box-sizing:border-box\n above keeps the padding inside that flexed height. */\n:host(.md-table--empty) {\n display: flex;\n flex-direction: column;\n min-block-size: 100%;\n}\n:host(.md-table--empty) .md-table__grid {\n flex: 0 0 auto;\n}\n:host(.md-table--empty) .md-table__empty {\n flex: 1 1 auto;\n}\n\n/* Frozen mode: the empty message lives inside the body scroll area — fill it so\n the content centers below the header. */\n.md-table__body-scroll {\n display: flex;\n flex-direction: column;\n}\n.md-table__body-scroll .md-table__empty {\n flex: 1 1 auto;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .md-table__bar {\n animation: none;\n }\n}\n\n@media (forced-colors: active) {\n /* WHCM strips background colors — without this the custom thumbs vanish\n while the native bars stay suppressed (no scrollbar at all). */\n .md-table__vscroll-thumb,\n .md-table__hscroll-thumb {\n background: ButtonText;\n border: 1px solid ButtonText;\n forced-color-adjust: none;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --_divider: CanvasText;\n }\n}\n\n/* Visually hidden, AT-audible (empty-state announcements). */\n.md-table__sr-status {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n/* ==========================================================\n DENSITY (numeric rungs — local override)\n `density` here accepts two vocabularies: the semantic sizes\n (compact/standard/comfortable, handled by the .md-table--density-* classes\n above) and the library-wide numeric scale. A numeric rung maps onto the same\n --md-sys-density-scale signal a global `data-density` ancestor sets, so a\n local value overrides the inherited one and every scale-driven value in this\n file (row height, header height, type) follows.\n\n The semantic sizes are scale-aware too — their row heights are calcs, not\n literals — so `density=\"compact\"` nested in a `data-density=\"-2\"` region\n condenses further instead of pinning 36px.\n ========================================================== */\n:host([density='-1']) { --md-sys-density-scale: -1; }\n:host([density='-2']) { --md-sys-density-scale: -2; }\n:host([density='-3']) { --md-sys-density-scale: -3; }\n:host([density='-4']) { --md-sys-density-scale: -4; }\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Element,\n Event,\n EventEmitter,\n Listen,\n Method,\n Watch,\n} from '@stencil/core';\nimport { captureFlip } from '../../utils/flip';\n\nexport type MdTableSortOrder = 'asc' | 'desc' | 'none';\n\nexport interface MdTableSortState {\n /** Column id of the active sort, or empty for \"no sort\". */\n column: string;\n /** Sort direction. */\n order: MdTableSortOrder;\n}\n\nexport interface MdTableSelectionState {\n /** Number of selected rows. */\n count: number;\n /** Total number of selectable rows (rendered). */\n total: number;\n /** Selected row \"value\" or id (or row index) for each selected row. */\n values: string[];\n /** Whether all visible rows are selected. */\n all: boolean;\n /** Whether some (but not all) rows are selected. */\n indeterminate: boolean;\n}\n\ninterface SelectableRow extends HTMLElement {\n selected: boolean;\n disabled: boolean;\n value: string;\n selectable: boolean;\n}\n\n/**\n * Material Design 3 — Table\n *\n * The core composable table primitive for hand-authored tables.\n *\n * Layout architecture: the shadow `.md-table__grid` owns the column tracks\n * (`grid-template-columns`), and every slotted `md-table-row` is a REAL grid\n * item spanning all tracks that lays its cells on the shared tracks via\n * `grid-template-columns: subgrid`. Rows being real boxes is what makes row\n * hover, stripes, dividers, sticky headers and focus rings actually work —\n * and a wrong cell count skews one row, never the whole table.\n *\n * Coordination is push-based (the house pattern): the table stamps context\n * onto its rows (`rowgroup`, stripe parity, stickiness) and pushes sort state\n * into `md-table-sort-label`s — no MutationObservers, no `:host-context()`.\n *\n * High-level features:\n * - Density: `compact` | `standard` | `comfortable`\n * - Sticky header / footer (pair with `md-table-container` for the scroll box)\n * - Sticky first / last column via cell `sticky=\"start\" | \"end\"`\n * - Sortable columns via `<md-table-sort-label>` (3-state asc → desc → none)\n * - Selection coordination — emits `mdSelectionChange`; `selectAll()` /\n * `deselectAll()` / `toggleSelectAll()` for the select-all checkbox\n * - Horizontal scroll when the content is wider than the container\n * - Loading + empty-state slots, striped rows, configurable dividers\n */\n@Component({\n tag: 'md-table',\n styleUrl: 'md-table.css',\n shadow: true,\n})\nexport class MdTable {\n @Element() el!: HTMLElement;\n\n /**\n * Layout density. Accepts BOTH vocabularies:\n *\n * - the semantic sizes `'compact' | 'standard' | 'comfortable'` (row heights\n * 36 / 52 / 60px), which is this component's original API, and\n * - a numeric rung `0 | -1 | -2 | -3 | -4`, the scale every other component in\n * the library uses.\n *\n * A numeric value drives `--md-sys-density-scale` on the host (see the DENSITY\n * block in the CSS) exactly as a global `data-density` ancestor would, and\n * takes the `standard` row-height base. The two are not exclusive: the\n * semantic sizes are themselves scale-aware, so `density=\"compact\"` inside a\n * `data-density=\"-2\"` region condenses further.\n */\n @Prop({ reflect: true }) density:\n | 'compact'\n | 'standard'\n | 'comfortable'\n | 0\n | -1\n | -2\n | -3\n | -4 = 'standard';\n\n /**\n * CSS `grid-template-columns` value (e.g. `\"auto 1fr 120px\"`).\n * Takes precedence over the `columns` prop. Use this for fine control,\n * including using `minmax()`, `fr` units and `auto`.\n */\n @Prop({ attribute: 'column-template' }) columnTemplate: string = '';\n\n /**\n * Number of columns when no `column-template` is provided. The grid uses\n * `repeat(<columns>, minmax(0, 1fr))`. When neither is set, the column\n * count is derived from the first row's cells.\n */\n @Prop() columns: number = 0;\n\n /**\n * Minimum table width (e.g. `\"640px\"`). When the container is narrower, the\n * grid keeps this width and the container shows a horizontal scrollbar\n * instead of squishing the columns. Also settable via\n * `--md-table-min-width`.\n */\n @Prop({ attribute: 'min-width' }) minWidth: string = '';\n\n /** Stick the head row(s) to the top of the scroll container. */\n @Prop({ reflect: true, attribute: 'sticky-header' }) stickyHeader: boolean = false;\n\n /**\n * Frozen-header architecture: the header is rendered OUTSIDE the vertical\n * scroll area, so the scrollbar spans only the body and runs UNDER the head\n * Pair with `md-table-container[max-height]` to cap\n * the body — max-height controls the SIZE, this prop controls the\n * ARCHITECTURE. Without it, a max-height container scrolls the whole table\n * (use `sticky-header` there for the classic in-flow pinned header).\n */\n @Prop({ reflect: true, attribute: 'frozen-header' }) frozenHeader: boolean = false;\n\n /**\n * Height ratchet (default ON): once the table has rendered, it never\n * shrinks below that initial height. Paging, filtering to fewer/zero rows,\n * or an async refetch that momentarily empties the body keep the table (and\n * therefore the page) geometrically stable — no content below jumps up, and\n * no scrollbar can flash from a transient collapse (async rebuilds have a\n * few frames where fresh rows haven't hydrated and measure 0). Set\n * `keep-height=\"false\"` for tables that intentionally resize (e.g. a\n * density-toggle demo).\n */\n @Prop({ reflect: true, attribute: 'keep-height' }) keepHeight: boolean = true;\n\n /**\n * Vertical scrollbar presentation (frozen mode):\n * - `overlay` (default) — a custom always-visible thumb FLOATS over the\n * rows' right edge; no gutter is reserved, so row backgrounds and\n * dividers run the full width and the bar never takes layout space.\n * - `gutter` — classic inset bar in a reserved gap: `scrollbar-gutter:\n * stable` keeps a fixed strip inside the table (rows stop short of the\n * edge) and the native bar renders in it, crossing the row borders.\n */\n @Prop({ reflect: true }) scrollbar: 'overlay' | 'gutter' = 'overlay';\n\n /**\n * How MULTIPLE pinned columns on the same side behave during horizontal\n * scroll:\n * - `stack` (default) — every pinned column sticks at the same edge, so\n * later ones slide OVER earlier ones while scrolling (a deck-of-cards\n * effect; only the top one stays fully visible).\n * - `static` — each pinned column gets a cumulative inset equal to the\n * widths of the pinned columns before it, so ALL of them stay visible\n * side-by-side (spreadsheet-style).\n */\n @Prop({ reflect: true, attribute: 'pin-mode' }) pinMode: 'stack' | 'static' = 'stack';\n\n /**\n * Table-wide custom pin-indicator icon (Material Symbols ligature, e.g.\n * \"anchor\"). Cast to every pinned header cell so consumers set it once;\n * a cell's own `pin-icon` attribute wins over the cast. Empty = built-in\n * push-pin SVG.\n */\n @Prop({ attribute: 'pin-icon' }) pinIcon: string = '';\n\n @Watch('pinIcon')\n onPinIconChange() {\n this.syncRows();\n }\n\n @Watch('pinMode')\n onPinModeChange() {\n this.syncStickyOffsets();\n }\n\n /**\n * Stamp cumulative sticky offsets on pinned cells (pin-mode=\"static\").\n * Widths come from the resolved grid tracks; in stack mode the vars are\n * cleared so cells fall back to inset 0.\n */\n private syncStickyOffsets() {\n const rows = Array.from(this.el.querySelectorAll('md-table-row')) as HTMLElement[];\n if (!rows.length) return;\n const clear = () =>\n rows.forEach((row) =>\n (Array.from(row.children) as HTMLElement[]).forEach((c) => c.style.removeProperty('--_sticky-offset')),\n );\n if (this.pinMode !== 'static') {\n clear();\n return;\n }\n const gridEl = this.frozenHeader ? this.bodyGridEl : (this.el.shadowRoot?.querySelector('.md-table__grid') as HTMLElement | null);\n if (!gridEl) return;\n const tracks = getComputedStyle(gridEl)\n .gridTemplateColumns.split(' ')\n .map((t) => parseFloat(t))\n .filter((n) => !Number.isNaN(n));\n if (!tracks.length) return;\n rows.forEach((row) => {\n const cells = (Array.from(row.children) as HTMLElement[]).filter(\n (c) => c.tagName === 'MD-TABLE-CELL' && !c.hasAttribute('data-md-col-hidden'),\n );\n let startCum = 0;\n cells.forEach((cell, i) => {\n if (cell.getAttribute('sticky') === 'start') {\n cell.style.setProperty('--_sticky-offset', `${startCum}px`);\n startCum += tracks[i] ?? 0;\n }\n });\n let endCum = 0;\n for (let i = cells.length - 1; i >= 0; i--) {\n if (cells[i].getAttribute('sticky') === 'end') {\n cells[i].style.setProperty('--_sticky-offset', `${endCum}px`);\n endCum += tracks[i] ?? 0;\n }\n }\n });\n }\n\n /** Stick the foot row(s) to the bottom of the scroll container. */\n @Prop({ reflect: true, attribute: 'sticky-footer' }) stickyFooter: boolean = false;\n\n /** Show alternating row colors. */\n @Prop({ reflect: true }) striped: boolean = false;\n\n /** Hide the dividers between rows. */\n @Prop({ reflect: true, attribute: 'no-dividers' }) noDividers: boolean = false;\n\n /** Hover surface on rows. */\n @Prop({ reflect: true }) hoverable: boolean = true;\n\n /**\n * Built-in expressive motion. With `expressive` (the default) the table\n * FLIP-animates its rows around sort and page changes: it snapshots the row\n * boxes when the triggering event fires (`mdSortRequest`, or a pagination\n * event heard by the surrounding `md-table-container`), lets the consumer's\n * synchronous handler mutate the rows, then glides survivors to their new\n * positions and fades + rises entrants. Async mutations settle as a clean\n * no-op. `prefers-reduced-motion` always wins; set `none` to opt out —\n * e.g. when driving your own `flipRows` wiring around the same events.\n */\n @Prop({ reflect: true }) motion: 'expressive' | 'none' = 'expressive';\n\n /**\n * Selection mode.\n * - `none` — no selection (default)\n * - `single` — radio-like: selecting a row DESELECTS every other row;\n * `selectAll()`/the select-all checkbox are inert (disabled)\n * - `multiple` — checkbox-like; select-all checkbox + selectAll() available\n */\n @Prop({ reflect: true }) selection: 'none' | 'single' | 'multiple' = 'none';\n\n /**\n * Currently active sort column id. Read by `<md-table-sort-label column=\"…\">`\n * to render its arrow. Empty = no sort.\n */\n @Prop({ mutable: true, reflect: true, attribute: 'sort-by' })\n sortBy: string = '';\n\n /** Currently active sort direction. */\n @Prop({ mutable: true, reflect: true, attribute: 'sort-order' })\n sortOrder: MdTableSortOrder = 'asc';\n\n /** Show the loading state. */\n @Prop({ reflect: true }) loading: boolean = false;\n\n /**\n * Loading presentation:\n * - `overlay` (default) — an indeterminate progress line under the header\n * plus a scrim that dims/disables the body while the header/footer stay put.\n * - `skeleton` — the body is replaced by shimmering skeleton rows; the\n * header and footer are untouched.\n */\n @Prop({ reflect: true, attribute: 'loading-mode' }) loadingMode: 'overlay' | 'skeleton' = 'overlay';\n\n /** Number of skeleton rows rendered in `loading-mode=\"skeleton\"`. */\n @Prop({ attribute: 'loading-rows' }) loadingRows: number = 4;\n\n /** Render the empty-state slot when true. */\n @Prop({ reflect: true }) empty: boolean = false;\n\n /**\n * Accessible name for the `role=\"table\"`. When omitted, the `caption` text\n * names the table (WAI: a caption identifies the table for screen-reader\n * users browsing in tables mode); the generic \"Data table\" is the last\n * resort. IDREFs cannot cross the shadow boundary, so the caption text is\n * mirrored into `aria-label` rather than referenced via `aria-labelledby`.\n */\n @Prop() label: string = '';\n\n /** Optional caption rendered above the table head. */\n @Prop() caption: string = '';\n\n /**\n * Long description of a COMPLEX table's structure (WAI caption & summary\n * pattern) — e.g. \"Columns are grouped under Profile and Employment\".\n * Exposed as `aria-description` on the table; invisible otherwise.\n */\n @Prop() summary: string = '';\n\n /**\n * Absolute 0-based index of the FIRST rendered body row within the full\n * dataset (WAI/ARIA pagination): with `row-count` set, each row gets an\n * `aria-rowindex` so AT reports \"row 42 of 5000\" instead of a position\n * within the rendered page. Update it on every page change.\n */\n @Prop({ attribute: 'row-offset' }) rowOffset: number = 0;\n\n /** Total row count for assistive tech when only a subset is rendered\n * (pagination / virtualization). 0 = use the rendered count. */\n @Prop({ attribute: 'row-count' }) rowCount: number = 0;\n\n /** Emitted when sort changes (after a `md-table-sort-label` is clicked). */\n @Event() mdSortChange: EventEmitter<MdTableSortState>;\n\n /** Emitted whenever the row selection state changes. */\n @Event() mdSelectionChange: EventEmitter<MdTableSelectionState>;\n\n /** Emits when a column is pinned/unpinned via `pinColumn`. */\n @Event() mdPinChange: EventEmitter<{ column: number; side: 'start' | 'end' | null }>;\n\n /** Emits when a column is hidden/shown via `setColumnVisibility`. */\n @Event() mdColumnVisibilityChange: EventEmitter<{ column: number; visible: boolean; hidden: number[] }>;\n\n /** rAF-throttled scroll position of the frozen body scroller. */\n @Event() mdScroll: EventEmitter<{ scrollLeft: number; scrollTop: number }>;\n\n private selectionCache: MdTableSelectionState = {\n count: 0,\n total: 0,\n values: [],\n all: false,\n indeterminate: false,\n };\n\n /** Guards against the O(n²) event storm during bulk selection changes. */\n private bulkSelecting = false;\n\n // Frozen-header refs + observer.\n private headScrollEl?: HTMLElement;\n private bodyScrollEl?: HTMLElement;\n private headGridEl?: HTMLElement;\n private bodyGridEl?: HTMLElement;\n private frozenObserver?: ResizeObserver;\n\n // Custom horizontal scrollbar (frozen mode) — native overlay scrollbars are\n // invisible at rest on macOS, so we draw our own always-visible, draggable\n // bar that works identically on every OS.\n private hTrackEl?: HTMLElement;\n private hThumbEl?: HTMLElement;\n private hDragging = false;\n private hDragStartX = 0;\n private hDragStartScroll = 0;\n\n // Custom vertical OVERLAY scrollbar (frozen mode): floats over the rows'\n // right edge instead of reserving a gutter, so row backgrounds and dividers\n // run the full width and no space-taking bar can ever shift the content.\n private vTrackEl?: HTMLElement;\n private vThumbEl?: HTMLElement;\n private vDragging = false;\n private vDragStartY = 0;\n private vDragStartScroll = 0;\n\n /** RTL flips the scrollLeft convention: 0 at the inline start (right edge)\n * running NEGATIVE toward the end. All custom-hscroll math normalizes\n * through |scrollLeft| plus this direction check. */\n private get isRtl(): boolean {\n return getComputedStyle(this.el).direction === 'rtl';\n }\n\n /** Size + position the custom horizontal scroll thumb from the body scroll. */\n private updateHScroll = () => {\n const sc = this.bodyScrollEl;\n const track = this.hTrackEl;\n const thumb = this.hThumbEl;\n if (!sc || !track || !thumb) return;\n const overflow = sc.scrollWidth - sc.clientWidth;\n if (overflow <= 1) {\n track.style.display = 'none';\n return;\n }\n track.style.display = 'block';\n const trackW = track.clientWidth;\n const thumbW = Math.max(24, (sc.clientWidth / sc.scrollWidth) * trackW);\n const maxThumbLeft = trackW - thumbW;\n // 0..1 progress from the inline START of the content, direction-agnostic.\n const progress = Math.min(1, Math.abs(sc.scrollLeft) / overflow);\n // In RTL the content start sits at the RIGHT, so the thumb starts at the\n // track's right end and travels left as the user scrolls toward the end.\n const left = (this.isRtl ? 1 - progress : progress) * maxThumbLeft;\n thumb.style.inlineSize = `${thumbW}px`;\n thumb.style.transform = `translateX(${left}px)`;\n };\n\n private onHThumbPointerDown = (e: PointerEvent) => {\n if (!this.bodyScrollEl) return;\n this.hDragging = true;\n this.hDragStartX = e.clientX;\n this.hDragStartScroll = this.bodyScrollEl.scrollLeft;\n (e.target as HTMLElement).setPointerCapture?.(e.pointerId);\n e.preventDefault();\n };\n private onHThumbPointerMove = (e: PointerEvent) => {\n if (!this.hDragging || !this.bodyScrollEl || !this.hTrackEl || !this.hThumbEl) return;\n const sc = this.bodyScrollEl;\n const maxThumbLeft = this.hTrackEl.clientWidth - this.hThumbEl.offsetWidth;\n const overflow = sc.scrollWidth - sc.clientWidth;\n const perPx = maxThumbLeft > 0 ? overflow / maxThumbLeft : 0;\n sc.scrollLeft = this.hDragStartScroll + (e.clientX - this.hDragStartX) * perPx;\n };\n private onHThumbPointerUp = (e: PointerEvent) => {\n this.hDragging = false;\n try {\n (e.target as HTMLElement).releasePointerCapture?.(e.pointerId);\n } catch {\n /* no capture to release */\n }\n };\n\n /** Size + position the vertical overlay thumb from the body scroll. */\n private updateVScroll = () => {\n const sc = this.bodyScrollEl;\n const track = this.vTrackEl;\n const thumb = this.vThumbEl;\n if (!sc || !track || !thumb) return;\n if (this.scrollbar === 'gutter') {\n track.style.display = 'none';\n return;\n }\n const overflow = sc.scrollHeight - sc.clientHeight;\n if (overflow <= 1) {\n track.style.display = 'none';\n return;\n }\n track.style.display = 'block';\n // Track spans exactly the body area inside the frozen wrapper.\n track.style.insetBlockStart = `${sc.offsetTop}px`;\n track.style.blockSize = `${sc.clientHeight}px`;\n const trackH = sc.clientHeight;\n const thumbH = Math.max(24, (sc.clientHeight / sc.scrollHeight) * trackH);\n const maxThumbTop = trackH - thumbH;\n const top = (sc.scrollTop / overflow) * maxThumbTop;\n thumb.style.blockSize = `${thumbH}px`;\n thumb.style.transform = `translateY(${top}px)`;\n };\n\n private onVThumbPointerDown = (e: PointerEvent) => {\n if (!this.bodyScrollEl) return;\n this.vDragging = true;\n this.vDragStartY = e.clientY;\n this.vDragStartScroll = this.bodyScrollEl.scrollTop;\n (e.target as HTMLElement).setPointerCapture?.(e.pointerId);\n e.preventDefault();\n };\n private onVThumbPointerMove = (e: PointerEvent) => {\n if (!this.vDragging || !this.bodyScrollEl || !this.vTrackEl || !this.vThumbEl) return;\n const sc = this.bodyScrollEl;\n const maxThumbTop = this.vTrackEl.clientHeight - this.vThumbEl.offsetHeight;\n const overflow = sc.scrollHeight - sc.clientHeight;\n const perPx = maxThumbTop > 0 ? overflow / maxThumbTop : 0;\n sc.scrollTop = this.vDragStartScroll + (e.clientY - this.vDragStartY) * perPx;\n };\n private onVThumbPointerUp = (e: PointerEvent) => {\n this.vDragging = false;\n try {\n (e.target as HTMLElement).releasePointerCapture?.(e.pointerId);\n } catch {\n /* no capture to release */\n }\n };\n\n componentDidLoad() {\n this.syncRows();\n this.syncSortLabels();\n this.recomputeSelection(false);\n this.setupFrozenHeader();\n // Frozen tables floor their header tracks to the header CONTENT (sort\n // arrows are wider than short body values — without this they cram into\n // the next column).\n requestAnimationFrame(() => this.scheduleHeaderFloors());\n // Height ratchet: after the first laid-out frame, floor the table at its\n // initial height so it never shrinks (see keepHeight). In frozen mode the\n // floor goes on the BODY SCROLL AREA, not the host: flooring the host\n // would leave the extra space BELOW the frozen flex column, stranding the\n // custom horizontal scrollbar mid-table — flooring the body keeps rows /\n // empty state absorbing the height and the bar pinned at the bottom.\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n if (!this.keepHeight) return;\n const target = this.frozenHeader && this.bodyScrollEl ? this.bodyScrollEl : this.el;\n const h = target.getBoundingClientRect().height;\n if (h > 1) target.style.minBlockSize = `${Math.round(h)}px`;\n }),\n );\n }\n\n componentDidRender() {\n // Keep the frozen header's tracks aligned after every render (data/columns\n // can change). Cheap: a single getComputedStyle read + string compare.\n this.syncFrozenColumns();\n this.updateHScroll();\n this.updateVScroll();\n this.syncStickyOffsets();\n }\n\n disconnectedCallback() {\n this.frozenObserver?.disconnect();\n this.frozenObserver = undefined;\n }\n\n @Watch('selection')\n onSelectionModeChange() {\n // Mode switches must re-run the selection machinery WITHOUT a re-mount:\n // the select-all checkbox keeps its element across renders, so single-mode's\n // disabled state stuck when switching back to multiple (dead checkbox),\n // and entering single never disabled it until some selection event fired.\n let trimmed = false;\n if (this.selection === 'single') {\n // Entering radio-like mode with several rows selected: keep the first.\n const sel = this.getSelectableRows().filter((r) => r.selected);\n if (sel.length > 1) {\n this.bulkSelecting = true;\n try {\n sel.slice(1).forEach((r) => (r.selected = false));\n } finally {\n this.bulkSelecting = false;\n }\n trimmed = true;\n }\n }\n this.syncRows(); // aria-selected stamping is mode-dependent\n // Sync checkbox enabled/checked states; emit only if the switch actually\n // changed the selection (the trim), so consumers hear about it.\n this.recomputeSelection(trimmed);\n }\n\n @Watch('empty')\n onEmptyChange() {\n // SRs don't announce a swapped-in empty state on their own.\n this.srAnnouncement = this.empty ? 'No data' : '';\n }\n\n @State() private srAnnouncement = '';\n\n /**\n * True when at least one slotted row is `expandable`. Such rows carry\n * `aria-expanded`, which is only a valid property on a ROW inside a\n * `treegrid` — on a plain `table` row it is a conditional-attribute\n * violation (axe `aria-conditional-attr`). So the structural element\n * promotes from `role=\"table\"` to `role=\"treegrid\"` whenever this is set;\n * treegrid is a superset of table for every other property we expose\n * (rowcount/rowindex, colspan, aria-sort, aria-selected). Recomputed in\n * `syncRows()` (runs on load + every slot change), so the role tracks rows\n * appearing / disappearing / toggling `expandable`.\n */\n @State() private hasExpandableRow = false;\n\n @Watch('frozenHeader')\n @Watch('stickyHeader')\n onStickyHeaderChange() {\n this.syncRows();\n // Refs are recreated on the next render; re-attach the observer then.\n // RETRY across frames: a single rAF can fire before Stencil commits the\n // re-render (the audit's plausible race) — poll until the body grid ref\n // exists or ~half a second passes.\n this.frozenObserver?.disconnect();\n this.frozenObserver = undefined;\n const attach = (tries = 0) => {\n if (!this.frozenHeader) return;\n if (this.bodyGridEl) {\n this.setupFrozenHeader();\n return;\n }\n if (tries < 30) requestAnimationFrame(() => attach(tries + 1));\n };\n requestAnimationFrame(() => attach());\n }\n\n /** Observe the body grid so the header tracks re-sync on any size change. */\n private setupFrozenHeader() {\n if (!this.frozenHeader || !this.bodyGridEl || typeof ResizeObserver === 'undefined') return;\n this.frozenObserver?.disconnect();\n this.frozenObserver = new ResizeObserver(() => {\n this.syncFrozenColumns();\n this.updateHScroll();\n // Row show/hide (pagination, filters) resizes the grid WITHOUT a table\n // re-render — the overlay thumb must follow here, not just on scroll.\n this.updateVScroll();\n this.syncStickyOffsets(); // track widths may have changed\n });\n this.frozenObserver.observe(this.bodyGridEl);\n this.syncFrozenColumns();\n this.updateHScroll();\n this.updateVScroll();\n }\n\n /** Copy the body grid's RESOLVED pixel tracks onto the header grid so columns\n * align exactly (and the header naturally reserves the body's scrollbar\n * gutter, since its tracks sum to less than its full width). */\n private syncFrozenColumns() {\n if (!this.frozenHeader || !this.bodyGridEl || !this.headGridEl) return;\n // When the body has no laid-out rows (all filtered out / a page transition\n // that momentarily hides everything), its `auto` and content-sized tracks\n // collapse to 0 — copying those onto the header would squash the columns.\n // RETAIN the last-applied tracks instead of clearing: transient all-hidden\n // states (display-toggle paging, animated swaps) must not flap the header\n // widths every transition. A table that STARTS empty simply has no inline\n // override yet, so the header keeps the template's real widths.\n const hasVisibleRow = Array.from(this.el.querySelectorAll('md-table-body md-table-row')).some(\n (r) => (r as HTMLElement).getBoundingClientRect().height > 0,\n );\n if (!hasVisibleRow) return;\n const tracks = getComputedStyle(this.bodyGridEl).gridTemplateColumns;\n if (tracks && tracks !== 'none') {\n // Append a filler track that absorbs the head wrapper's leftover width\n // (the body's scrollbar gutter): header rows span 1/-1, so their\n // background AND dividers stretch edge-to-edge instead of stopping a\n // gutter short. No cell ever places into it (cells auto-place into the\n // real tracks), and it collapses to 0 when the grid h-overflows.\n const headTracks = `${tracks} minmax(0, 1fr)`;\n if (this.headGridEl.style.gridTemplateColumns !== headTracks) {\n this.headGridEl.style.gridTemplateColumns = headTracks;\n }\n }\n }\n\n /** Mirror the body's horizontal scroll onto the (clipped) header + thumb. */\n private onBodyScroll = () => {\n if (this.headScrollEl && this.bodyScrollEl) {\n this.headScrollEl.scrollLeft = this.bodyScrollEl.scrollLeft;\n }\n this.updateHScroll();\n this.updateVScroll();\n // one mdScroll per frame, not per native scroll event\n if (!this.scrollEmitQueued && typeof requestAnimationFrame !== 'undefined') {\n this.scrollEmitQueued = true;\n requestAnimationFrame(() => {\n this.scrollEmitQueued = false;\n const sc = this.bodyScrollEl;\n if (sc) this.mdScroll.emit({ scrollLeft: sc.scrollLeft, scrollTop: sc.scrollTop });\n });\n }\n };\n\n /** overflow-x is hidden (no native horizontal bar), so translate horizontal\n * wheel / trackpad (and shift+wheel) into programmatic horizontal scroll. */\n /**\n * Keyboard horizontal scrolling (WCAG 2.1.1): overflow-x is hidden (the\n * custom bar owns the axis) and the custom thumbs are pointer-only, so\n * without this a keyboard user could never reach off-screen columns.\n * Vertical arrows/PageUp/Down stay native (overflow-y: auto).\n */\n private onBodyKeyDown = (e: KeyboardEvent) => {\n const sc = this.bodyScrollEl;\n if (!sc || e.target !== sc) return;\n const max = sc.scrollWidth - sc.clientWidth;\n if (max <= 0) return;\n const step = 48;\n let dx = 0;\n if (e.key === 'ArrowRight') dx = this.isRtl ? -step : step;\n else if (e.key === 'ArrowLeft') dx = this.isRtl ? step : -step;\n else if (e.key === 'Home' && (e.ctrlKey || e.metaKey)) dx = -Infinity;\n else if (e.key === 'End' && (e.ctrlKey || e.metaKey)) dx = Infinity;\n else return;\n e.preventDefault();\n // RTL scrollLeft runs [-max, 0]; LTR [0, max] — same clamp as onBodyWheel.\n const lo = this.isRtl ? -max : 0;\n const hi = this.isRtl ? 0 : max;\n sc.scrollLeft = Math.max(lo, Math.min(hi, dx === -Infinity ? lo : dx === Infinity ? hi : sc.scrollLeft + dx));\n };\n\n private onBodyWheel = (e: WheelEvent) => {\n const sc = this.bodyScrollEl;\n if (!sc || sc.scrollWidth <= sc.clientWidth + 1) return;\n const dx = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.shiftKey ? e.deltaY : 0;\n if (!dx) return;\n const max = sc.scrollWidth - sc.clientWidth;\n // Valid scrollLeft range flips with direction: [0, max] in LTR, [-max, 0]\n // in RTL (scrollLeft runs negative from the right-hand content start).\n const lo = this.isRtl ? -max : 0;\n const hi = this.isRtl ? 0 : max;\n const next = Math.max(lo, Math.min(hi, sc.scrollLeft + dx));\n if (next !== sc.scrollLeft) {\n sc.scrollLeft = next;\n e.preventDefault();\n }\n };\n\n @Watch('density')\n @Watch('striped')\n @Watch('stickyHeader')\n @Watch('stickyFooter')\n @Watch('columns')\n @Watch('columnTemplate')\n onLayoutChange() {\n this.syncRows();\n }\n\n @Watch('sortBy')\n @Watch('sortOrder')\n onSortStateChange() {\n this.syncSortLabels();\n }\n\n // ------------------------------------------------------------------\n // Public API\n // ------------------------------------------------------------------\n\n /** Returns the current selection state (synchronous snapshot). */\n @Method()\n async getSelection(): Promise<MdTableSelectionState> {\n this.recomputeSelection(false);\n return this.selectionCache;\n }\n\n /** Programmatically select all selectable body rows (no-op when selection=\"none\"). */\n @Method()\n async selectAll(): Promise<void> {\n // Select-all is a MULTIPLE-mode concept: in single (radio-like) mode a\n // bulk select would violate the one-row invariant — the select-all checkbox\n // previously behaved identically in both modes, making them\n // indistinguishable.\n if (this.selection !== 'multiple') return;\n this.bulkSelecting = true;\n try {\n this.getSelectableRows().forEach((r) => {\n if (!r.disabled) r.selected = true;\n });\n } finally {\n this.bulkSelecting = false;\n }\n this.recomputeSelection();\n }\n\n /** Programmatically deselect every row. */\n @Method()\n async deselectAll(): Promise<void> {\n this.bulkSelecting = true;\n try {\n this.getSelectableRows().forEach((r) => (r.selected = false));\n } finally {\n this.bulkSelecting = false;\n }\n this.recomputeSelection();\n }\n\n /** Toggle the \"all selected\" state (used by the select-all checkbox). */\n @Method()\n async toggleSelectAll(): Promise<void> {\n if (this.selectionCache.all) await this.deselectAll();\n else await this.selectAll();\n }\n\n /** Set the active sort column / order programmatically. */\n @Method()\n async setSort(column: string, order: MdTableSortOrder): Promise<void> {\n this.sortBy = column;\n this.sortOrder = order;\n const play = this.armMotion();\n this.mdSortChange.emit({ column, order });\n play?.();\n }\n\n // ------------------------------------------------------------------\n // Column pinning — core-owned cell reorder + sticky attrs + template\n // ------------------------------------------------------------------\n\n /** Pinned columns by ORIGINAL column index (their position before any\n * pinning). Initialized from markup `sticky` attributes on first use, so a\n * hard-coded sticky checkbox column keeps its place at the front. */\n private pinnedColumns = new Map<number, 'start' | 'end'>();\n private hiddenColumns = new Set<number>();\n private scrollEmitQueued = false;\n /** The ORIGINAL column tracks, parsed once — permutations and minmax floors\n * are always derived from these, never from the rewritten attribute. */\n private pinBaseTracks: string[] | null = null;\n\n /** Split a grid template into top-level tracks (minmax(a, b) stays one). */\n private static splitTracks(template: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let cur = '';\n for (const ch of template.trim()) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (/\\s/.test(ch) && depth === 0) {\n if (cur) {\n out.push(cur);\n cur = '';\n }\n } else {\n cur += ch;\n }\n }\n if (cur) out.push(cur);\n return out;\n }\n\n /** Stamp every cell with its original column index + parse the base tracks.\n * Returns false when the table can't support pinning — warning unless\n * `silent` (the mount-time header-floor pass probes speculatively; e.g. a\n * legit grouped-header table with colspans must not spam the console). */\n /**\n * Direct element children matching a tag / attribute predicate.\n *\n * Deliberately NOT `:scope >` — Stencil's mock-doc selector engine throws\n * outright on `:scope` (\"jQuery does not support the :scope selector\"), which\n * made pinColumn and setColumnVisibility unrunnable in a spec. Every other\n * component in this library already avoids it for the same reason (see\n * md-accordion, md-dialog, md-tooltip, md-breadcrumbs, utils/select-options).\n */\n private static directChildren(parent: Element, match: (el: HTMLElement) => boolean): HTMLElement[] {\n return (Array.from(parent.children) as HTMLElement[]).filter(match);\n }\n\n private static isTag(tag: string) {\n return (el: HTMLElement) => el.tagName.toLowerCase() === tag;\n }\n\n private ensurePinBase(silent = false): boolean {\n if (this.pinBaseTracks) return true;\n const warn = (msg: string) => {\n if (!silent) console.warn(`[md-table] ${msg}`);\n };\n if (!this.columnTemplate || this.columnTemplate.includes('repeat(')) {\n warn('pinColumn needs an explicit column-template without repeat().');\n return false;\n }\n const tracks = (this.constructor as typeof MdTable).splitTracks(this.columnTemplate);\n const rows = Array.from(this.el.querySelectorAll('md-table-row'));\n for (const row of rows) {\n const cells = MdTable.directChildren(row, MdTable.isTag('md-table-cell'));\n if (cells.some((c) => c.hasAttribute('colspan') && c.getAttribute('colspan') !== '1')) {\n warn('pinColumn does not support colspan cells.');\n return false;\n }\n if (cells.length !== tracks.length) {\n warn('pinColumn needs every row to have one cell per column.');\n return false;\n }\n cells.forEach((c, i) => c.setAttribute('data-md-col', String(i)));\n }\n // Seed pins from markup sticky attributes (head row = source of truth), so\n // e.g. a sticky checkbox column stays first among the pinned-start group.\n const headRow = this.el.querySelector('md-table-head md-table-row');\n const headCells = headRow\n ? MdTable.directChildren(headRow, MdTable.isTag('md-table-cell'))\n : [];\n headCells.forEach((c, i) => {\n const s = c.getAttribute('sticky');\n if (s === 'start' || s === 'end') this.pinnedColumns.set(i, s);\n });\n this.pinBaseTracks = tracks;\n return true;\n }\n\n /**\n * Pin a column to an edge (or unpin with `'none'`). `column` is the ORIGINAL\n * 0-based column index (its position before any pinning). The table owns the\n * whole mechanic: it physically re-sequences every row's cells (selection and\n * expansion state survive — the elements just move), maintains `sticky`\n * attributes, permutes the column template, and re-floors the header tracks\n * so pin icons / sort arrows never clip in frozen mode. The move itself is an\n * intentional SNAP (no FLIP) — the frozen header re-measures its tracks over\n * the next frames, and animating against that settling would jitter.\n * Resolves to the column's effective side after the call.\n */\n @Method()\n async pinColumn(column: number, side: 'start' | 'end' | 'none'): Promise<'start' | 'end' | null> {\n if (!this.ensurePinBase()) return null;\n if (side === 'none' || this.pinnedColumns.get(column) === side) {\n this.pinnedColumns.delete(column);\n } else {\n this.pinnedColumns.set(column, side);\n }\n this.applyPinLayout();\n const effective = this.pinnedColumns.get(column) ?? null;\n this.mdPinChange.emit({ column, side: effective });\n return effective;\n }\n\n /**\n * Hide or show a column. `column` is the ORIGINAL 0-based index (same\n * addressing as `pinColumn`). Hidden cells stay in the DOM (state\n * survives — they just stop displaying) and their track leaves the\n * template. The last visible column cannot be hidden. Resolves to the\n * column's effective visibility.\n */\n @Method()\n async setColumnVisibility(column: number, visible: boolean): Promise<boolean> {\n if (!this.ensurePinBase()) return true;\n if (column < 0 || column >= (this.pinBaseTracks?.length ?? 0)) return true;\n if (!visible && this.hiddenColumns.size >= (this.pinBaseTracks!.length - 1) && !this.hiddenColumns.has(column)) {\n console.warn('[md-table] setColumnVisibility: refusing to hide the last visible column.');\n return true;\n }\n if (visible) this.hiddenColumns.delete(column);\n else this.hiddenColumns.add(column);\n this.applyPinLayout();\n const effective = !this.hiddenColumns.has(column);\n this.mdColumnVisibilityChange.emit({\n column,\n visible: effective,\n hidden: Array.from(this.hiddenColumns).sort((a, b) => a - b),\n });\n return effective;\n }\n\n /** Re-sequence cells + sticky attrs + template for the current pin state. */\n private applyPinLayout() {\n const tracks = this.pinBaseTracks!;\n const all = tracks.map((_, i) => i);\n const start = all.filter((i) => this.pinnedColumns.get(i) === 'start');\n const end = all.filter((i) => this.pinnedColumns.get(i) === 'end');\n const mid = all.filter((i) => !this.pinnedColumns.has(i));\n const order = [...start, ...mid, ...end];\n\n this.el.querySelectorAll('md-table-row').forEach((row) => {\n order.forEach((k) => {\n const cell =\n MdTable.directChildren(row, (c) => c.getAttribute('data-md-col') === String(k))[0] ?? null;\n if (!cell) return;\n row.appendChild(cell); // appending in `order` re-sequences the cells\n const side = this.pinnedColumns.get(k);\n if (side) cell.setAttribute('sticky', side);\n else cell.removeAttribute('sticky');\n // hidden columns: cells stay in the DOM (state survives), just\n // undisplayed — their track leaves the template below\n if (this.hiddenColumns.has(k)) cell.setAttribute('data-md-col-hidden', '');\n else cell.removeAttribute('data-md-col-hidden');\n });\n });\n const visibleOrder = order.filter((k) => !this.hiddenColumns.has(k));\n this.el.setAttribute('column-template', visibleOrder.map((k) => tracks[k]).join(' '));\n this.syncHeaderContentFloors(visibleOrder);\n }\n\n /**\n * Content-driven header floors: in frozen mode each header track is forced\n * to its BODY cell's width, so header content that is wider than the body\n * values — a sort arrow, a pin icon — would spill into the next column.\n * Measure every header cell's light-DOM content span and floor its track\n * with minmax(need, base). The pin icon renders asynchronously in the cell's\n * shadow root, so pinned headers get a fixed allowance for it instead of\n * waiting on that render (16px icon + 4px gap).\n */\n private syncHeaderContentFloors(order?: number[]) {\n if (!this.frozenHeader || !this.pinBaseTracks) return;\n const tracks = this.pinBaseTracks;\n const seq = order ?? tracks.map((_, i) => i);\n requestAnimationFrame(() => {\n const headRow = this.el.querySelector('md-table-head md-table-row');\n if (!headRow) return;\n const tpl = seq.map((k) => {\n const base = tracks[k];\n const cell =\n MdTable.directChildren(headRow, (c) => c.getAttribute('data-md-col') === String(k))[0] ?? null;\n if (!cell || cell.getAttribute('padding') === 'checkbox') return base;\n const kids = Array.from(cell.children) as HTMLElement[];\n if (!kids.length) return base;\n const left = Math.min(...kids.map((el) => el.getBoundingClientRect().left));\n const right = Math.max(...kids.map((el) => el.getBoundingClientRect().right));\n const span = right - left;\n if (span <= 1) return base; // not laid out yet — no bogus floor\n const cs = getComputedStyle(cell);\n const pad = (parseFloat(cs.paddingInlineStart) || 0) + (parseFloat(cs.paddingInlineEnd) || 0);\n const pin =\n this.pinnedColumns.has(k) && !cell.hasAttribute('no-pin-indicator') ? 20 : 0;\n return `minmax(${Math.ceil(span + pad + pin)}px, ${base})`;\n });\n this.el.setAttribute('column-template', tpl.join(' '));\n });\n }\n\n /** Mount-time floors: a frozen table with sort labels needs its header\n * content floored even before any pinning (the always-reserved sort arrow\n * is wider than a short body value). Retries until the labels lay out. */\n private scheduleHeaderFloors(attempt = 0) {\n if (!this.frozenHeader || !this.columnTemplate) return;\n const probe = this.el.querySelector('md-table-head md-table-sort-label') as HTMLElement | null;\n if (!probe) return; // no sort labels — nothing wider than the body values\n const ready = probe.getBoundingClientRect().width > 1;\n if (!ready && attempt <= 30) {\n requestAnimationFrame(() => this.scheduleHeaderFloors(attempt + 1));\n return;\n }\n if (this.ensurePinBase(true)) this.syncHeaderContentFloors();\n }\n\n // ------------------------------------------------------------------\n // Built-in expressive motion (FLIP bracketing around sort / page events)\n // ------------------------------------------------------------------\n\n /**\n * Snapshot the current row boxes and FLIP-animate whatever the next\n * SYNCHRONOUS DOM mutation does to them. Call it right before you reorder /\n * show-hide rows outside the table's own events (custom filters, async\n * refetch completion, …); sort and pagination are bracketed automatically.\n */\n @Method()\n async animateNextChange(): Promise<void> {\n this.armMotion()?.();\n }\n\n /** Internal, synchronous arm signal — dispatched by md-table-container when\n * it hears a pagination event in the CAPTURE phase (a cross-shadow @Method\n * call would resolve on a microtask, after the consumer already mutated). */\n @Listen('mdMotionArm')\n handleMotionArm(e: CustomEvent) {\n e.stopPropagation();\n this.armMotion()?.();\n }\n\n /** Capture FIRST rects of the slotted body rows; returns the rAF-deferred\n * play(), or null when motion is off / there is nothing to animate. */\n private armMotion(): (() => void) | null {\n if (this.motion === 'none') return null;\n const body = this.el.querySelector('md-table-body') as HTMLElement | null;\n if (!body) return null;\n return captureFlip(body, { enter: true, stagger: 18, staggerCap: 6, spring: 'fast' });\n }\n\n // ------------------------------------------------------------------\n // Sort / selection event coordination\n // ------------------------------------------------------------------\n\n @Listen('mdSortRequest')\n handleSortRequest(e: CustomEvent<{ column: string; defaultOrder?: 'asc' | 'desc' }>) {\n e.stopPropagation();\n const col = e.detail.column;\n if (!col) return;\n\n // First activation starts at the label's default-order; subsequent clicks\n // cycle from there (desc-first columns cycle desc -> asc -> none).\n const first: MdTableSortOrder = e.detail.defaultOrder === 'desc' ? 'desc' : 'asc';\n let order: MdTableSortOrder = first;\n if (this.sortBy === col) {\n const second: MdTableSortOrder = first === 'asc' ? 'desc' : 'asc';\n order = this.sortOrder === first ? second : this.sortOrder === second ? 'none' : first;\n }\n this.sortBy = order === 'none' ? '' : col;\n this.sortOrder = order === 'none' ? 'asc' : order;\n // Bracket the consumer's reorder: capture rows now, emit (handlers run\n // synchronously during emit), then play — the rAF-deferred FLIP glides\n // survivors and fades in rows the new order revealed.\n const play = this.armMotion();\n this.mdSortChange.emit({ column: this.sortBy, order });\n play?.();\n }\n\n /**\n * AUTO-WIRED selection checkboxes: the table already keeps slotted\n * md-checkboxes in sync (syncSelectionUI) — it now also HANDLES them, so\n * plain markup works with zero consumer wiring. Deliberately DECLARATIVE\n * (set state to the checkbox's checked value, never toggle): consumers that\n * wired their own handlers apply the same end state, so double-handling is\n * idempotent instead of self-cancelling.\n */\n @Listen('mdChange')\n handleSlottedCheckboxChange(e: CustomEvent<{ checked?: boolean }>) {\n if (this.selection === 'none') return;\n const target = e.target as HTMLElement;\n if (target.tagName !== 'MD-CHECKBOX') return;\n const checked = !!e.detail?.checked;\n // DEFER one microtask. Consumer handlers run earlier in the dispatch\n // (target phase) but their table calls go through Stencil @Method\n // proxies, whose bodies also run on a microtask — queued BEFORE this one\n // (FIFO). Acting synchronously here inverted stateful consumer wiring:\n // auto-wire selected all during bubble, then the consumer's deferred\n // toggleSelectAll() read all=true and DESELECTED — the click net-reverted\n // (proven with an event trace). Deferred, the consumer's toggle executes\n // against the pre-click state and this declarative set converges last.\n queueMicrotask(() => {\n if (target.closest('md-table-head')) {\n if (this.selection !== 'multiple') return; // select-all box is inert in single mode\n if (checked) void this.selectAll();\n else void this.deselectAll();\n return;\n }\n const row = target.closest('md-table-row') as SelectableRow | null;\n if (row && row.closest('md-table-body') && !row.disabled && row.selectable !== false) {\n row.selected = checked;\n }\n });\n }\n\n /** Rowgroups relay their internal slot changes (row reorders/additions\n * never cross their shadow boundary as slotchange) — re-stamp context. */\n @Listen('mdRowgroupSlotChange')\n handleRowgroupSlotChange() {\n this.syncRows();\n // Covers checkbox columns appearing with a mode switch: the select-all box\n // must pick up its single-mode disabled state even though it was\n // inserted AFTER the selection watch ran.\n this.recomputeSelection(false);\n // Cell-count changes alter the resolved body tracks — the frozen header\n // held stale tracks (8 vs the body's 6 after Playground none->single)\n // until the next unrelated resize.\n this.syncFrozenColumns();\n this.updateHScroll();\n this.updateVScroll();\n }\n\n @Listen('mdRowSelectionChange')\n handleRowSelectionChange(e: CustomEvent<{ selected: boolean; value: string }>) {\n if (this.bulkSelecting) return; // one recompute at the end of the bulk op\n if (this.selection === 'single' && e.detail.selected) {\n // Enforce single-selection: deselect all OTHER rows\n const target = e.target as HTMLElement;\n this.bulkSelecting = true;\n try {\n this.getSelectableRows().forEach((r) => {\n if (r !== target) r.selected = false;\n });\n } finally {\n this.bulkSelecting = false;\n }\n }\n this.recomputeSelection();\n }\n\n // ------------------------------------------------------------------\n // Internal helpers\n // ------------------------------------------------------------------\n\n /** Body rows only — header/footer rows must never join selection math. */\n private getSelectableRows(): SelectableRow[] {\n return (Array.from(this.el.querySelectorAll('md-table-row')) as unknown as SelectableRow[]).filter(\n (r) => (r.closest('md-table-head') || r.closest('md-table-foot')) == null,\n );\n }\n\n private recomputeSelection(emit: boolean = true) {\n const rows = this.getSelectableRows();\n const selectable = rows.filter((r) => !r.disabled && r.selectable !== false);\n const selected = selectable.filter((r) => r.selected);\n const all = selectable.length > 0 && selected.length === selectable.length;\n const indeterminate = selected.length > 0 && !all;\n\n this.selectionCache = {\n count: selected.length,\n total: selectable.length,\n values: selected.map((r, i) => r.value || String(i)),\n all,\n indeterminate,\n };\n\n this.syncSelectionUI(rows, all, indeterminate);\n\n if (emit) this.mdSelectionChange.emit(this.selectionCache);\n }\n\n /**\n * Push the selection MODEL back into the slotted checkboxes (the missing half\n * of the two-way sync): each body row's checkbox mirrors `row.selected`, and\n * the header checkbox reflects all / indeterminate. Row `selected` is the\n * source of truth; a checkbox is just its view. `md-checkbox` only emits\n * `mdChange` on user interaction (not on programmatic `.checked`), and the\n * value-equality guards make this a no-op once in sync — so no event loops.\n */\n private syncSelectionUI(rows: SelectableRow[], all: boolean, indeterminate: boolean) {\n // Keep the ARIA selected state in lockstep with the visual one.\n if (this.selection !== 'none') {\n for (const r of rows) {\n const host = r as unknown as HTMLElement;\n if (host.closest('md-table-body') == null) continue;\n if (r.selectable === false || r.disabled) host.removeAttribute('aria-selected');\n else host.setAttribute('aria-selected', String(!!r.selected));\n }\n }\n\n if (this.selection === 'none') {\n // Clear any residue a previous mode left on the select-all checkbox.\n const staleHead = this.el.querySelector('md-table-head md-checkbox') as\n | (HTMLElement & { checked: boolean; disabled: boolean; indeterminate: boolean })\n | null;\n if (staleHead) {\n staleHead.disabled = false;\n staleHead.checked = false;\n staleHead.indeterminate = false;\n }\n return;\n }\n for (const r of rows) {\n const cb = (r as unknown as HTMLElement).querySelector('md-checkbox') as\n | (HTMLElement & { checked: boolean; disabled: boolean })\n | null;\n if (!cb) continue;\n if (cb.checked !== r.selected) cb.checked = r.selected;\n if (cb.disabled !== !!r.disabled) cb.disabled = !!r.disabled;\n }\n const headCb = this.el.querySelector('md-table-head md-checkbox') as\n | (HTMLElement & { checked: boolean; indeterminate: boolean; disabled: boolean })\n | null;\n if (headCb) {\n if (this.selection === 'single') {\n // No select-all in radio-like mode: the affordance is disabled and\n // cleared so single visibly differs from multiple.\n if (!headCb.disabled) headCb.disabled = true;\n if (headCb.checked) headCb.checked = false;\n if (headCb.indeterminate) headCb.indeterminate = false;\n } else {\n if (headCb.disabled) headCb.disabled = false;\n if (headCb.indeterminate !== indeterminate) headCb.indeterminate = indeterminate;\n if (headCb.checked !== all) headCb.checked = all;\n }\n }\n }\n\n /**\n * Stamp layout context onto slotted rows (the stepper-style push pattern):\n * rowgroup (head/body/foot), stripe parity, sticky flags. Rows/cells style\n * themselves from these attributes — no `:host-context()`, no observers.\n */\n private syncRows() {\n // Frozen header: project md-table-head into the dedicated header grid via\n // the `head` slot (only when sticky-header, else it stays in the main grid).\n const headEl = this.el.querySelector('md-table-head');\n if (headEl) {\n if (this.frozenHeader) headEl.setAttribute('slot', 'head');\n else if (headEl.getAttribute('slot') === 'head') headEl.removeAttribute('slot');\n }\n\n // Rowgroup role coordination for the frozen split. The body/foot render\n // inside `.md-table__body-scroll`, which is itself role=\"rowgroup\" (it must\n // be a valid child of role=\"table\" despite being a focusable scroll tab\n // stop). Their own rowgroup role would then nest inside that wrapper\n // rowgroup (axe aria-required-children: a rowgroup may only own rows), so\n // they drop to presentation and their rows promote to the wrapper. The head\n // sits in a presentational header wrapper, so it keeps its own rowgroup\n // role. Pushed as a reflected prop (not an imperative role override) so the\n // child decides its own role on render — no race with its first paint.\n (Array.from(this.el.querySelectorAll('md-table-body, md-table-foot')) as HTMLElement[]).forEach((rg) => {\n if (this.frozenHeader) rg.setAttribute('presentational', '');\n else rg.removeAttribute('presentational');\n });\n\n const rows = Array.from(this.el.querySelectorAll('md-table-row')) as HTMLElement[];\n const lastIndex = rows.length - 1;\n // A treegrid is the only table-family container whose rows may carry\n // aria-expanded (the disclosure state md-table-row stamps when expandable).\n // Recompute here so the structural role in render() promotes to treegrid\n // exactly when such a row exists, and drops back to table when none do.\n const hasExpandable = rows.some((r) => r.hasAttribute('expandable'));\n if (this.hasExpandableRow !== hasExpandable) this.hasExpandableRow = hasExpandable;\n // Suppress the final row's divider ONLY when that row actually sits at the\n // container's rounded bottom corner: i.e. the table is inside an\n // md-table-container AND nothing is slotted below it (a `slot=\"bottom\"`\n // pagination bar owns the corner instead, and needs the divider above it\n // kept). A bare md-table has no rounded corner, so its bottom border stays.\n const container = this.el.closest('md-table-container');\n const hasBottomBar =\n !!container &&\n MdTable.directChildren(container, (c) => c.getAttribute('slot') === 'bottom').length > 0;\n const suppressLastDivider = !!container && !hasBottomBar;\n // The foot row carries its own top divider (border-block-start); the last\n // body row before it must drop its bottom divider or the two double up.\n const footExists = rows.some((r) => r.closest('md-table-foot') != null);\n let lastBodyIdx = -1;\n rows.forEach((r, i) => {\n if (r.closest('md-table-head') == null && r.closest('md-table-foot') == null) lastBodyIdx = i;\n });\n const nHead = rows.filter((r) => r.closest('md-table-head') != null).length;\n let bodyIndex = 0;\n let headIndex = 0;\n let footIndex = 0;\n rows.forEach((row, i) => {\n const inHead = row.closest('md-table-head') != null;\n const inFoot = row.closest('md-table-foot') != null;\n const group = inHead ? 'head' : inFoot ? 'foot' : 'body';\n const set = (k: string, v: string | null) => {\n if (v === null) {\n if (row.hasAttribute(k)) row.removeAttribute(k);\n } else if (row.getAttribute(k) !== v) {\n row.setAttribute(k, v);\n }\n };\n set('rowgroup', group);\n set('data-stripe', group === 'body' && this.striped && bodyIndex % 2 === 1 ? 'true' : null);\n set('data-sticky', (inHead && this.stickyHeader) || (inFoot && this.stickyFooter) ? 'true' : null);\n // Stamp the final row only when it truly meets the container's rounded\n // bottom (see suppressLastDivider). `:host([data-last])` in\n // md-table-row.css drops just that row's divider; all others are kept.\n set('data-last', suppressLastDivider && i === lastIndex ? 'true' : null);\n // Drop the last body row's bottom divider when a footer follows (the foot\n // supplies the single body/foot divider via border-block-start).\n set('data-adjacent-foot', footExists && i === lastBodyIdx ? 'true' : null);\n // ARIA pagination positions: with row-count set only a subset is in the\n // DOM, so every row needs aria-rowindex (1-based, headers first, body\n // offset by row-offset). Foot rows have no well-defined absolute index.\n if (this.rowCount > 0) {\n if (inHead) set('aria-rowindex', String(headIndex + 1));\n else if (!inFoot) set('aria-rowindex', String(nHead + this.rowOffset + bodyIndex + 1));\n // Foot rows sit AFTER the full dataset in reading order.\n else set('aria-rowindex', String(nHead + this.rowCount + footIndex + 1));\n } else {\n set('aria-rowindex', null);\n }\n if (inFoot) footIndex++;\n // aria-selected belongs ONLY on selectable body rows of a\n // selection-enabled table (never head/foot, never selection=\"none\").\n if (group === 'body' && this.selection !== 'none') {\n const r = row as unknown as SelectableRow;\n set('aria-selected', r.selectable === false || r.disabled ? null : String(!!r.selected));\n } else {\n set('aria-selected', null);\n }\n if (group === 'body') bodyIndex++;\n if (inHead) headIndex++;\n // Cast the table-wide pin icon to pinned header cells (author-set\n // values win; our previous casts are tracked and replaceable).\n if (inHead) {\n (Array.from(row.children) as HTMLElement[]).forEach((cell) => {\n const side = cell.getAttribute('sticky');\n if (cell.tagName !== 'MD-TABLE-CELL' || (side !== 'start' && side !== 'end')) return;\n const cast = cell.getAttribute('data-pin-icon-cast');\n const own = cell.getAttribute('pin-icon');\n if (own !== null && own !== cast) return; // author override — hands off\n if (this.pinIcon) {\n if (own !== this.pinIcon) {\n cell.setAttribute('pin-icon', this.pinIcon);\n cell.setAttribute('data-pin-icon-cast', this.pinIcon);\n }\n } else if (cast !== null) {\n cell.removeAttribute('pin-icon');\n cell.removeAttribute('data-pin-icon-cast');\n }\n });\n }\n });\n }\n\n /** Push the active sort state into every slotted sort label. */\n private syncSortLabels() {\n const labels = Array.from(this.el.querySelectorAll('md-table-sort-label')) as Array<\n HTMLElement & { active: boolean; order: MdTableSortOrder }\n >;\n for (const l of labels) {\n const col = l.getAttribute('column') || '';\n const active = !!col && col === this.sortBy;\n if (l.active !== active) l.active = active;\n const order = active ? this.sortOrder : 'none';\n if (l.order !== order) l.order = order;\n // aria-sort lives on the columnheader CELL (it is ignored on the sort\n // label's role=\"button\"); sortable-but-inactive columns expose \"none\".\n const cell = l.closest('md-table-cell');\n if (cell) {\n const ariaSort = !active || order === 'none' ? 'none' : order === 'asc' ? 'ascending' : 'descending';\n if (cell.getAttribute('aria-sort') !== ariaSort) cell.setAttribute('aria-sort', ariaSort);\n }\n }\n }\n\n private handleSlotChange = () => {\n this.syncRows();\n this.syncSortLabels();\n this.recomputeSelection(false);\n };\n\n /** Best-effort column count for the skeleton loader. */\n private get columnCount(): number {\n if (this.columns > 0) return this.columns;\n if (this.columnTemplate) {\n const t = this.columnTemplate.trim();\n const m = t.match(/repeat\\(\\s*(\\d+)/);\n if (m) return parseInt(m[1], 10);\n return t.split(/\\s+/).filter(Boolean).length || 1;\n }\n const firstRow = this.el.querySelector('md-table-row');\n return firstRow ? firstRow.querySelectorAll('md-table-cell').length || 1 : 1;\n }\n\n /** Skeleton body rows: one shimmer bar PER COLUMN (fills the row, on the\n * shared subgrid tracks), varied widths for a natural look. */\n private renderSkeletonRows() {\n const cols = Math.max(1, this.columnCount);\n return Array.from({ length: Math.max(1, this.loadingRows) }).map((_, r) => (\n <div class=\"md-table__skeleton-row\" part=\"skeleton-row\" aria-hidden=\"true\" key={`sk-${r}`}>\n {Array.from({ length: cols }).map((__, c) => (\n <span class=\"md-table__bar\" key={`sk-${r}-${c}`} />\n ))}\n </div>\n ));\n }\n\n private renderEmpty() {\n return (\n <div class=\"md-table__empty\" part=\"empty\">\n <slot name=\"empty\">\n <span class=\"md-table__empty-text\">No data</span>\n </slot>\n </div>\n );\n }\n\n render() {\n // Template resolution: explicit prop → public CSS var (in stylesheet\n // fallback chain) → derived-from-first-row count.\n const style: { [k: string]: string } = {};\n if (this.columnTemplate) {\n style['--_columns-template'] = this.columnTemplate;\n } else if (this.columns > 0) {\n style['--_columns-template'] = `repeat(${this.columns}, minmax(0, 1fr))`;\n } else {\n const firstRow = this.el.querySelector('md-table-row');\n const count = firstRow ? firstRow.querySelectorAll('md-table-cell').length : 0;\n if (count > 0) style['--_derived-template'] = `repeat(${count}, minmax(0, 1fr))`;\n }\n if (this.minWidth) style['--_min-width'] = this.minWidth;\n // ARIA for the structural table element (see host comment). When any row\n // is expandable the container is a `treegrid` rather than a plain `table`\n // so those rows' `aria-expanded` is valid (aria-conditional-attr); every\n // other property below is shared by both roles.\n const tableAria = {\n role: this.hasExpandableRow ? 'treegrid' : 'table',\n 'aria-label': this.label || this.caption || 'Data table',\n 'aria-description': this.summary || null,\n 'aria-busy': this.loading ? 'true' : null,\n // Header + foot rows count toward the ARIA row total.\n 'aria-rowcount':\n this.rowCount > 0\n ? String(\n this.rowCount +\n this.el.querySelectorAll('md-table-head md-table-row, md-table-foot md-table-row').length,\n )\n : null,\n };\n\n return (\n <Host\n class={{\n 'md-table': true,\n [`md-table--density-${this.density}`]: typeof this.density === 'string',\n 'md-table--sticky-header': this.stickyHeader,\n 'md-table--sticky-footer': this.stickyFooter,\n 'md-table--striped': this.striped,\n 'md-table--no-dividers': this.noDividers,\n 'md-table--hoverable': this.hoverable,\n 'md-table--loading': this.loading,\n [`md-table--loading-${this.loadingMode}`]: this.loading,\n 'md-table--empty': this.empty,\n }}\n // The table / treegrid role lives on the inner STRUCTURAL wrapper, not\n // the host: the table content model admits only rowgroups/rows, and the\n // host also hosts the caption, live region, loading overlay and empty\n // state (axe aria-required-children).\n style={style}\n >\n {/* Persistent polite live region: announces the empty state appearing.\n NO role=\"status\" — an explicit status role is an invalid child of\n role=\"table\" (axe aria-required-children); a bare aria-live span\n announces identically without entering the table content model. */}\n <span class=\"md-table__sr-status\" aria-live=\"polite\">\n {this.srAnnouncement}\n </span>\n {/* Caption is VISUAL only: its text names the table via aria-label\n (IDREFs can't cross the shadow boundary, and axe rejects\n role=\"caption\" as a table child) — aria-hidden avoids the name\n being announced twice. */}\n {this.caption && (\n <div class=\"md-table__caption\" part=\"caption\" aria-hidden=\"true\">\n {this.caption}\n </div>\n )}\n\n {this.frozenHeader ? (\n // Frozen header: the header grid sits above a vertically-scrolling\n // body grid, so the scrollbar spans only the body. Both grids share\n // the column tracks (syncFrozenColumns copies the body's resolved\n // pixel tracks onto the header, which also reserves the body's\n // scrollbar gutter on the header). Horizontal scroll is mirrored.\n <div class=\"md-table__frozen\" {...tableAria}>\n <div\n class=\"md-table__head-scroll\"\n role=\"presentation\"\n ref={(el) => (this.headScrollEl = el as HTMLElement)}\n >\n <div\n class=\"md-table__grid md-table__grid--head\"\n part=\"header-grid\"\n ref={(el) => (this.headGridEl = el as HTMLElement)}\n >\n <slot name=\"head\" onSlotchange={this.handleSlotChange}></slot>\n </div>\n </div>\n <div\n class=\"md-table__body-scroll\"\n // Keyboard users must be able to scroll the capped body without\n // a pointer (WAI: scrollable region), hence the tab stop. A\n // focusable element may not sit as a bare child of role=\"table\"\n // (axe aria-required-children — only rowgroup/row are allowed),\n // so this wrapper IS the body's rowgroup: role=\"rowgroup\" is a\n // required child of table, so axe walks THROUGH it to the rows\n // even though it is a scroll tab stop. The slotted md-table-body/\n // md-table-foot inside drop to presentation (see syncRows) so\n // their rows promote here instead of nesting a second rowgroup.\n role=\"rowgroup\"\n tabindex=\"0\"\n ref={(el) => (this.bodyScrollEl = el as HTMLElement)}\n onScroll={this.onBodyScroll}\n onWheel={this.onBodyWheel}\n onKeyDown={this.onBodyKeyDown}\n >\n <div\n class=\"md-table__grid md-table__grid--body\"\n part=\"grid\"\n // Layout-only grid between the rowgroup wrapper and the rows.\n role=\"presentation\"\n ref={(el) => (this.bodyGridEl = el as HTMLElement)}\n >\n <slot onSlotchange={this.handleSlotChange}></slot>\n {this.loading && this.loadingMode === 'skeleton' && this.renderSkeletonRows()}\n </div>\n {/* Frozen mode: empty message lives inside the body scroll area so\n it sits directly under the header and fills the body. */}\n {this.empty && !this.loading && this.renderEmpty()}\n </div>\n {/* Custom, always-visible horizontal scrollbar (JS-toggled when the\n body overflows) — replaces the invisible native overlay bar. */}\n <div\n class=\"md-table__hscroll\"\n part=\"hscrollbar\"\n aria-hidden=\"true\"\n ref={(el) => (this.hTrackEl = el as HTMLElement)}\n >\n <div\n class=\"md-table__hscroll-thumb\"\n part=\"hscrollbar-thumb\"\n ref={(el) => (this.hThumbEl = el as HTMLElement)}\n onPointerDown={this.onHThumbPointerDown}\n onPointerMove={this.onHThumbPointerMove}\n onPointerUp={this.onHThumbPointerUp}\n onPointerCancel={this.onHThumbPointerUp}\n ></div>\n </div>\n {/* Custom vertical OVERLAY scrollbar — floats over the rows' right\n edge (no reserved gutter, rows stay full width). */}\n <div\n class=\"md-table__vscroll\"\n part=\"vscrollbar\"\n aria-hidden=\"true\"\n ref={(el) => (this.vTrackEl = el as HTMLElement)}\n >\n <div\n class=\"md-table__vscroll-thumb\"\n part=\"vscrollbar-thumb\"\n ref={(el) => (this.vThumbEl = el as HTMLElement)}\n onPointerDown={this.onVThumbPointerDown}\n onPointerMove={this.onVThumbPointerMove}\n onPointerUp={this.onVThumbPointerUp}\n onPointerCancel={this.onVThumbPointerUp}\n ></div>\n </div>\n </div>\n ) : (\n <div class=\"md-table__grid\" part=\"grid\" {...tableAria}>\n <slot onSlotchange={this.handleSlotChange}></slot>\n {this.loading && this.loadingMode === 'skeleton' && this.renderSkeletonRows()}\n </div>\n )}\n\n {this.loading && this.loadingMode === 'overlay' && (\n <div class=\"md-table__loading\" part=\"loading\" aria-hidden=\"true\">\n {/* `loader` is the library-wide name for \"swap the loading affordance\";\n `loading` is kept as the older alias. Nesting them means either\n works — the outer slot falls back to the inner one, which falls\n back to the default below — and `loader` wins if both are given. */}\n <slot name=\"loader\">\n <slot name=\"loading\">\n <div class=\"md-table__progress\" part=\"progress\">\n <md-progress-indicator variant=\"linear\" indeterminate aria-label=\"Loading\"></md-progress-indicator>\n </div>\n <div class=\"md-table__scrim\" />\n </slot>\n </slot>\n </div>\n )}\n\n {/* Non-frozen: empty message is a sibling that flex-fills below the grid. */}\n {this.empty && !this.loading && !this.frozenHeader && this.renderEmpty()}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|