@awc-ui/core 1.0.0-beta.2 → 1.0.0-beta.3
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/loader.cjs.js +3 -2
- package/dist/cjs/loader.cjs.js.map +1 -1
- package/dist/cjs/md-accordion-item.cjs.entry.js +1 -1
- package/dist/cjs/md-accordion.cjs.entry.js +1 -1
- package/dist/cjs/md-app-bar.cjs.entry.js +1 -1
- package/dist/cjs/md-area-chart.cjs.entry.js +1 -1
- package/dist/cjs/md-autocomplete.cjs.entry.js +2 -2
- package/dist/cjs/md-avatar_2.cjs.entry.js +1 -1
- package/dist/cjs/md-badge.cjs.entry.js +1 -1
- package/dist/cjs/md-bar-chart.cjs.entry.js +1 -1
- package/dist/cjs/md-bottom-sheet.cjs.entry.js +1 -1
- package/dist/cjs/md-breadcrumb-item.cjs.entry.js +1 -1
- package/dist/cjs/md-breadcrumbs.cjs.entry.js +1 -1
- package/dist/cjs/md-button-group.cjs.entry.js +1 -1
- package/dist/cjs/md-button_7.cjs.entry.js +1 -1
- package/dist/cjs/md-checkbox.cjs.entry.js +1 -1
- package/dist/cjs/md-chip.cjs.entry.js +1 -1
- package/dist/cjs/md-color-picker.cjs.entry.js +1 -1
- package/dist/cjs/md-date-picker.cjs.entry.js +1 -1
- package/dist/cjs/md-dialog.cjs.entry.js +1 -1
- package/dist/cjs/md-divider.cjs.entry.js +1 -1
- package/dist/cjs/md-fab-menu-item.cjs.entry.js +1 -1
- package/dist/cjs/md-fab-menu.cjs.entry.js +1 -1
- package/dist/cjs/md-fab.cjs.entry.js +1 -1
- package/dist/cjs/md-line-chart.cjs.entry.js +1 -1
- package/dist/cjs/md-list-item.cjs.entry.js +1 -1
- package/dist/cjs/md-list.cjs.entry.js +1 -1
- package/dist/cjs/md-menu-item-group.cjs.entry.js +1 -1
- package/dist/cjs/md-menu_2.cjs.entry.js +1 -1
- package/dist/cjs/md-meter.cjs.entry.js +1 -1
- package/dist/cjs/md-multi-select.cjs.entry.js +2 -2
- package/dist/cjs/md-navigation-bar.cjs.entry.js +1 -1
- 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 +1 -1
- package/dist/cjs/md-number-field.cjs.entry.js +1 -1
- package/dist/cjs/md-organization-chart.cjs.entry.js +1 -1
- package/dist/cjs/md-otp-field.cjs.entry.js +1 -1
- 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 +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 +1 -1
- package/dist/cjs/md-select.cjs.entry.js +2 -2
- 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 +1 -1
- package/dist/cjs/md-sparkline.cjs.entry.js +1 -1
- package/dist/cjs/md-split-button.cjs.entry.js +1 -1
- package/dist/cjs/md-status-dot.cjs.entry.js +1 -1
- 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 +1 -1
- package/dist/cjs/md-tabs.cjs.entry.js +1 -1
- package/dist/cjs/md-text-field.cjs.entry.js +1 -1
- package/dist/cjs/md-time-picker.cjs.entry.js +1 -1
- package/dist/cjs/md-toolbar.cjs.entry.js +1 -1
- package/dist/cjs/md-transfer-list.cjs.entry.js +1 -1
- package/dist/cjs/md3.cjs.js +3 -2
- 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/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-area-chart.js.map +1 -1
- package/dist/components/md-autocomplete.js +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-dialog.js +1 -1
- package/dist/components/md-divider.js +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-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-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-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-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-stepper.js +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-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-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-B-JfuA2g.js +2 -0
- package/dist/components/p-B-JfuA2g.js.map +1 -0
- package/dist/components/p-B-iHDK5h.js +2 -0
- package/dist/components/p-B-iHDK5h.js.map +1 -0
- package/dist/components/p-BA2v4IuG.js +2 -0
- package/dist/components/p-BA2v4IuG.js.map +1 -0
- package/dist/components/p-BADA63mI.js +2 -0
- package/dist/components/p-BADA63mI.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-CCMritCA.js +2 -0
- package/dist/components/p-CCMritCA.js.map +1 -0
- package/dist/components/p-CTC8XAB6.js +2 -0
- package/dist/components/p-CTC8XAB6.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-CtVItLby.js +2 -0
- package/dist/components/p-CtVItLby.js.map +1 -0
- package/dist/components/p-D8oM1Kr3.js +2 -0
- package/dist/components/p-D8oM1Kr3.js.map +1 -0
- package/dist/components/{p-Ddiw2Kjw.js → p-DEzb9xsY.js} +2 -2
- package/dist/components/p-DEzb9xsY.js.map +1 -0
- package/dist/components/p-DYL-8C5C.js +2 -0
- package/dist/components/p-DYL-8C5C.js.map +1 -0
- package/dist/components/p-DfU4xY2F.js +2 -0
- package/dist/components/p-DfU4xY2F.js.map +1 -0
- package/dist/components/p-Eb44PPZa.js +2 -0
- package/dist/components/p-Eb44PPZa.js.map +1 -0
- package/dist/components/{p-UdGDg2oJ.js → p-Lsoo1B-2.js} +2 -2
- package/dist/components/p-Lsoo1B-2.js.map +1 -0
- package/dist/components/p-tSoecrcz.js +2 -0
- package/dist/components/p-tSoecrcz.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/p-DXXUoRSH.js → components-csr/p--OUYjgKN.js} +2 -2
- package/dist/{components/p-Dp-w93ot.js → components-csr/p--TCJgZnE.js} +2 -2
- package/dist/components-csr/p-BdEoSBtL.js +2 -0
- package/dist/components-csr/p-BdEoSBtL.js.map +1 -0
- package/dist/components-csr/p-Bmu7RqHM.js +2 -0
- package/dist/components-csr/p-Bx6--dQF.js +2 -0
- 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-uTEkf0sE.js → components-csr/p-C0DlKmRg.js} +2 -2
- package/dist/{components/p-Ch2-tttM.js → components-csr/p-C4_7YnHT.js} +2 -2
- package/dist/{components/p-BwXpiUsu.js → components-csr/p-CG6FaRlt.js} +2 -2
- package/dist/{components/p-B0Opn6dK.js → components-csr/p-CSrxeWwL.js} +2 -2
- package/dist/components-csr/p-C_ogF68H.js +2 -0
- 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/p-B3MWYEEJ.js → components-csr/p-CrbzXk64.js} +2 -2
- package/dist/components-csr/p-CxhZdOPw.js +2 -0
- package/dist/components-csr/p-CxhZdOPw.js.map +1 -0
- package/dist/{components/p-7fN_yCXW.js → components-csr/p-DF19mmLl.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-csr/p-DvOKnoqK.js +2 -0
- package/dist/components-csr/p-DvOKnoqK.js.map +1 -0
- package/dist/{components/p-C8EP4S21.js → components-csr/p-DvXQXhgu.js} +2 -2
- package/dist/components-csr/p-DzPKu-Ma.js +2 -0
- package/dist/components-csr/p-DzPKu-Ma.js.map +1 -0
- package/dist/{components/p-stybaFzj.js → components-csr/p-Hm3X1iai.js} +2 -2
- package/dist/{components/p-6wZSqm_2.js → components-csr/p-IWA0yIjJ.js} +2 -2
- package/dist/components-csr/p-RLxbNqRv.js +2 -0
- package/dist/components-csr/p-RLxbNqRv.js.map +1 -0
- package/dist/components-csr/p-bSpXNc5J.js +2 -0
- package/dist/components-csr/p-bSpXNc5J.js.map +1 -0
- package/dist/components-csr/p-uZbtHo-A.js +2 -0
- package/dist/components-csr/package.json +3 -0
- package/dist/esm/app-globals-DQuL1Twl.js +6 -0
- package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
- package/dist/esm/engine.wasm-CfBPnYW7.js +10 -0
- package/dist/esm/engine.wasm-CfBPnYW7.js.map +1 -0
- package/dist/esm/{index-DTaX19_O.js → index-WmvQpZnM.js} +5 -15
- package/dist/esm/index-WmvQpZnM.js.map +1 -0
- package/dist/esm/loader.js +3 -2
- package/dist/esm/loader.js.map +1 -1
- package/dist/esm/md-accordion-item.entry.js +1 -1
- package/dist/esm/md-accordion.entry.js +1 -1
- package/dist/esm/md-app-bar.entry.js +1 -1
- package/dist/esm/md-area-chart.entry.js +1 -1
- package/dist/esm/md-autocomplete.entry.js +2 -2
- package/dist/esm/md-avatar_2.entry.js +1 -1
- package/dist/esm/md-badge.entry.js +1 -1
- package/dist/esm/md-bar-chart.entry.js +1 -1
- package/dist/esm/md-bottom-sheet.entry.js +1 -1
- package/dist/esm/md-breadcrumb-item.entry.js +1 -1
- package/dist/esm/md-breadcrumbs.entry.js +1 -1
- package/dist/esm/md-button-group.entry.js +1 -1
- package/dist/esm/md-button_7.entry.js +1 -1
- package/dist/esm/md-checkbox.entry.js +1 -1
- package/dist/esm/md-chip.entry.js +1 -1
- package/dist/esm/md-color-picker.entry.js +1 -1
- package/dist/esm/md-date-picker.entry.js +1 -1
- package/dist/esm/md-dialog.entry.js +1 -1
- package/dist/esm/md-divider.entry.js +1 -1
- package/dist/esm/md-fab-menu-item.entry.js +1 -1
- package/dist/esm/md-fab-menu.entry.js +1 -1
- package/dist/esm/md-fab.entry.js +1 -1
- package/dist/esm/md-line-chart.entry.js +1 -1
- package/dist/esm/md-list-item.entry.js +1 -1
- package/dist/esm/md-list.entry.js +1 -1
- package/dist/esm/md-menu-item-group.entry.js +1 -1
- package/dist/esm/md-menu_2.entry.js +1 -1
- package/dist/esm/md-meter.entry.js +1 -1
- package/dist/esm/md-multi-select.entry.js +2 -2
- package/dist/esm/md-navigation-bar.entry.js +1 -1
- package/dist/esm/md-navigation-rail-tab.entry.js +1 -1
- package/dist/esm/md-navigation-rail.entry.js +1 -1
- package/dist/esm/md-navigation-tab.entry.js +1 -1
- package/dist/esm/md-number-field.entry.js +1 -1
- package/dist/esm/md-organization-chart.entry.js +1 -1
- package/dist/esm/md-otp-field.entry.js +1 -1
- package/dist/esm/md-pie-chart.entry.js +1 -1
- 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 +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 +1 -1
- package/dist/esm/md-select.entry.js +2 -2
- 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 +1 -1
- package/dist/esm/md-sparkline.entry.js +1 -1
- package/dist/esm/md-split-button.entry.js +1 -1
- package/dist/esm/md-status-dot.entry.js +1 -1
- 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 +1 -1
- package/dist/esm/md-tabs.entry.js +1 -1
- package/dist/esm/md-text-field.entry.js +1 -1
- package/dist/esm/md-time-picker.entry.js +1 -1
- package/dist/esm/md-toolbar.entry.js +1 -1
- package/dist/esm/md-transfer-list.entry.js +1 -1
- package/dist/esm/md3.js +3 -2
- package/dist/esm/md3.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-2e9503d7.entry.js → p-0a599351.entry.js} +2 -2
- package/dist/md3/p-1d7e0203.entry.js +2 -0
- package/dist/md3/{p-fb61868c.entry.js.map → p-1d7e0203.entry.js.map} +1 -1
- package/dist/md3/p-1e85b8a8.entry.js +2 -0
- package/dist/md3/{p-aaec2698.entry.js.map → p-1e85b8a8.entry.js.map} +1 -1
- package/dist/md3/{p-396089fd.entry.js → p-1edb5a0d.entry.js} +2 -2
- package/dist/md3/{p-c00f7514.entry.js → p-21c89d1d.entry.js} +2 -2
- package/dist/md3/p-22633b2d.entry.js +2 -0
- package/dist/md3/{p-6b2871a0.entry.js.map → p-22633b2d.entry.js.map} +1 -1
- package/dist/md3/{p-2e09a7b7.entry.js → p-27135a6b.entry.js} +2 -2
- package/dist/md3/{p-c063c823.entry.js → p-2befc42c.entry.js} +2 -2
- package/dist/md3/p-2dda08b2.entry.js +2 -0
- package/dist/md3/{p-21772851.entry.js.map → p-2dda08b2.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-3cce1de3.entry.js → p-38f82d34.entry.js} +2 -2
- package/dist/md3/p-3a4bd4eb.entry.js +2 -0
- package/dist/md3/{p-72457a85.entry.js.map → p-3a4bd4eb.entry.js.map} +1 -1
- package/dist/md3/{p-be02624e.entry.js → p-3c0469aa.entry.js} +2 -2
- package/dist/md3/{p-63b8c8d1.entry.js → p-408ee4be.entry.js} +2 -2
- package/dist/md3/{p-3015c7e3.entry.js → p-4770b534.entry.js} +2 -2
- package/dist/md3/p-4aed552f.entry.js +2 -0
- package/dist/md3/{p-6c44cf13.entry.js.map → p-4aed552f.entry.js.map} +1 -1
- package/dist/md3/{p-c5af701b.entry.js → p-4ba3623e.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-81843ff7.entry.js → p-5929e59c.entry.js} +2 -2
- package/dist/md3/{p-32bdd439.entry.js → p-5c35f916.entry.js} +2 -2
- package/dist/md3/{p-ac35ac5f.entry.js → p-5db87a9d.entry.js} +2 -2
- package/dist/md3/{p-6038b907.entry.js → p-5f39b49d.entry.js} +2 -2
- package/dist/md3/p-637baee1.entry.js +2 -0
- package/dist/md3/{p-47af9819.entry.js.map → p-637baee1.entry.js.map} +1 -1
- package/dist/md3/{p-05ae91b6.entry.js → p-6bf632c7.entry.js} +2 -2
- package/dist/md3/{p-4e3d6e40.entry.js → p-6ea7117d.entry.js} +2 -2
- package/dist/md3/{p-9ddbf247.entry.js → p-7112374d.entry.js} +2 -2
- package/dist/md3/{p-1a8ec5bc.entry.js → p-7858833e.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-4d82132d.entry.js → p-7f53a423.entry.js} +2 -2
- package/dist/md3/{p-b0431a5c.entry.js → p-8135c606.entry.js} +2 -2
- package/dist/md3/{p-4dda4cb0.entry.js → p-845ca9cc.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-e3124e1e.entry.js → p-8b1ea5dc.entry.js} +2 -2
- package/dist/md3/{p-c10a33c2.entry.js → p-8e7df348.entry.js} +2 -2
- package/dist/md3/{p-65195996.entry.js → p-925768ac.entry.js} +2 -2
- package/dist/md3/p-944e69e0.entry.js +2 -0
- package/dist/md3/{p-a3308c40.entry.js.map → p-944e69e0.entry.js.map} +1 -1
- package/dist/md3/{p-ac8762e5.entry.js → p-96c06b24.entry.js} +2 -2
- package/dist/md3/p-9b9677cc.entry.js +2 -0
- package/dist/md3/{p-e7dc5a32.entry.js.map → p-9b9677cc.entry.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-CfBPnYW7.js +2 -0
- package/dist/md3/p-CfBPnYW7.js.map +1 -0
- package/dist/md3/p-DQuL1Twl.js +2 -0
- package/dist/md3/p-DQuL1Twl.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-a5fee424.entry.js → p-a49df43d.entry.js} +2 -2
- 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-bf7842f8.entry.js → p-adf8a415.entry.js} +2 -2
- package/dist/md3/{p-c861d774.entry.js → p-ae360663.entry.js} +2 -2
- package/dist/md3/{p-8eb0b6a4.entry.js → p-b243284b.entry.js} +2 -2
- 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-b5586b66.entry.js +2 -0
- package/dist/md3/{p-04e97f5d.entry.js.map → p-b5586b66.entry.js.map} +1 -1
- package/dist/md3/{p-a7ffb779.entry.js → p-b7602557.entry.js} +2 -2
- package/dist/md3/{p-6ba63c73.entry.js → p-bc24f0c9.entry.js} +2 -2
- package/dist/md3/{p-edb34a6d.entry.js → p-bed8dfec.entry.js} +2 -2
- package/dist/md3/{p-50555bb7.entry.js → p-c0476406.entry.js} +2 -2
- package/dist/md3/{p-0c2e824d.entry.js → p-c20fbb9e.entry.js} +2 -2
- package/dist/md3/{p-4e45b2ff.entry.js → p-c58c68d0.entry.js} +2 -2
- package/dist/md3/{p-fc0b325d.entry.js → p-cdcea99f.entry.js} +2 -2
- package/dist/md3/{p-0f764a1e.entry.js → p-d2e39c6e.entry.js} +2 -2
- package/dist/md3/p-d7e99f9e.entry.js +2 -0
- package/dist/md3/{p-cf07e761.entry.js.map → p-d7e99f9e.entry.js.map} +1 -1
- package/dist/md3/{p-c1ca6f6c.entry.js → p-da0c36d9.entry.js} +2 -2
- package/dist/md3/{p-77a01bcc.entry.js → p-e3c37222.entry.js} +2 -2
- package/dist/md3/{p-39cb7c24.entry.js → p-e6b09e71.entry.js} +2 -2
- package/dist/md3/{p-b4631a55.entry.js → p-eddae19a.entry.js} +2 -2
- package/dist/md3/{p-c6a12344.entry.js → p-ef7b1826.entry.js} +2 -2
- 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-e6d7f0ff.entry.js → p-f403ad20.entry.js} +2 -2
- 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/types/wasm/engine-abi.d.ts +14 -0
- package/hydrate/index.js +19 -7
- package/hydrate/index.mjs +19 -7
- package/package.json +14 -3
- package/dist/cjs/index-DlQ_5_Mv.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-MWBNn6Lj.js +0 -2
- package/dist/components/p-MWBNn6Lj.js.map +0 -1
- package/dist/esm/index-DTaX19_O.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-47af9819.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-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-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-DXXUoRSH.js.map → components-csr/p--OUYjgKN.js.map} +0 -0
- /package/dist/{components/p-Dp-w93ot.js.map → components-csr/p--TCJgZnE.js.map} +0 -0
- /package/dist/{components/p-UdGDg2oJ.js.map → components-csr/p-Bmu7RqHM.js.map} +0 -0
- /package/dist/{components/p-uTEkf0sE.js.map → components-csr/p-C0DlKmRg.js.map} +0 -0
- /package/dist/{components/p-Ch2-tttM.js.map → components-csr/p-C4_7YnHT.js.map} +0 -0
- /package/dist/{components/p-BwXpiUsu.js.map → components-csr/p-CG6FaRlt.js.map} +0 -0
- /package/dist/{components/p-B0Opn6dK.js.map → components-csr/p-CSrxeWwL.js.map} +0 -0
- /package/dist/{components/p-B3MWYEEJ.js.map → components-csr/p-CrbzXk64.js.map} +0 -0
- /package/dist/{components/p-7fN_yCXW.js.map → components-csr/p-DF19mmLl.js.map} +0 -0
- /package/dist/{components/p-e2HRV63Y.js.map → components-csr/p-DfcpeJAu.js.map} +0 -0
- /package/dist/{components/p-C8EP4S21.js.map → components-csr/p-DvXQXhgu.js.map} +0 -0
- /package/dist/{components/p-stybaFzj.js.map → components-csr/p-Hm3X1iai.js.map} +0 -0
- /package/dist/{components/p-6wZSqm_2.js.map → components-csr/p-IWA0yIjJ.js.map} +0 -0
- /package/dist/{components/p-Ddiw2Kjw.js.map → components-csr/p-uZbtHo-A.js.map} +0 -0
- /package/dist/md3/{p-2e9503d7.entry.js.map → p-0a599351.entry.js.map} +0 -0
- /package/dist/md3/{p-396089fd.entry.js.map → p-1edb5a0d.entry.js.map} +0 -0
- /package/dist/md3/{p-c00f7514.entry.js.map → p-21c89d1d.entry.js.map} +0 -0
- /package/dist/md3/{p-2e09a7b7.entry.js.map → p-27135a6b.entry.js.map} +0 -0
- /package/dist/md3/{p-c063c823.entry.js.map → p-2befc42c.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-3cce1de3.entry.js.map → p-38f82d34.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-3015c7e3.entry.js.map → p-4770b534.entry.js.map} +0 -0
- /package/dist/md3/{p-c5af701b.entry.js.map → p-4ba3623e.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-81843ff7.entry.js.map → p-5929e59c.entry.js.map} +0 -0
- /package/dist/md3/{p-32bdd439.entry.js.map → p-5c35f916.entry.js.map} +0 -0
- /package/dist/md3/{p-ac35ac5f.entry.js.map → p-5db87a9d.entry.js.map} +0 -0
- /package/dist/md3/{p-6038b907.entry.js.map → p-5f39b49d.entry.js.map} +0 -0
- /package/dist/md3/{p-05ae91b6.entry.js.map → p-6bf632c7.entry.js.map} +0 -0
- /package/dist/md3/{p-4e3d6e40.entry.js.map → p-6ea7117d.entry.js.map} +0 -0
- /package/dist/md3/{p-9ddbf247.entry.js.map → p-7112374d.entry.js.map} +0 -0
- /package/dist/md3/{p-1a8ec5bc.entry.js.map → p-7858833e.entry.js.map} +0 -0
- /package/dist/md3/{p-4d82132d.entry.js.map → p-7f53a423.entry.js.map} +0 -0
- /package/dist/md3/{p-b0431a5c.entry.js.map → p-8135c606.entry.js.map} +0 -0
- /package/dist/md3/{p-4dda4cb0.entry.js.map → p-845ca9cc.entry.js.map} +0 -0
- /package/dist/md3/{p-5b74694e.entry.js.map → p-89d47130.entry.js.map} +0 -0
- /package/dist/md3/{p-e3124e1e.entry.js.map → p-8b1ea5dc.entry.js.map} +0 -0
- /package/dist/md3/{p-c10a33c2.entry.js.map → p-8e7df348.entry.js.map} +0 -0
- /package/dist/md3/{p-65195996.entry.js.map → p-925768ac.entry.js.map} +0 -0
- /package/dist/md3/{p-ac8762e5.entry.js.map → p-96c06b24.entry.js.map} +0 -0
- /package/dist/md3/{p-a5fee424.entry.js.map → p-a49df43d.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-bf7842f8.entry.js.map → p-adf8a415.entry.js.map} +0 -0
- /package/dist/md3/{p-c861d774.entry.js.map → p-ae360663.entry.js.map} +0 -0
- /package/dist/md3/{p-8eb0b6a4.entry.js.map → p-b243284b.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-a7ffb779.entry.js.map → p-b7602557.entry.js.map} +0 -0
- /package/dist/md3/{p-6ba63c73.entry.js.map → p-bc24f0c9.entry.js.map} +0 -0
- /package/dist/md3/{p-edb34a6d.entry.js.map → p-bed8dfec.entry.js.map} +0 -0
- /package/dist/md3/{p-50555bb7.entry.js.map → p-c0476406.entry.js.map} +0 -0
- /package/dist/md3/{p-0c2e824d.entry.js.map → p-c20fbb9e.entry.js.map} +0 -0
- /package/dist/md3/{p-4e45b2ff.entry.js.map → p-c58c68d0.entry.js.map} +0 -0
- /package/dist/md3/{p-fc0b325d.entry.js.map → p-cdcea99f.entry.js.map} +0 -0
- /package/dist/md3/{p-0f764a1e.entry.js.map → p-d2e39c6e.entry.js.map} +0 -0
- /package/dist/md3/{p-c1ca6f6c.entry.js.map → p-da0c36d9.entry.js.map} +0 -0
- /package/dist/md3/{p-77a01bcc.entry.js.map → p-e3c37222.entry.js.map} +0 -0
- /package/dist/md3/{p-39cb7c24.entry.js.map → p-e6b09e71.entry.js.map} +0 -0
- /package/dist/md3/{p-b4631a55.entry.js.map → p-eddae19a.entry.js.map} +0 -0
- /package/dist/md3/{p-c6a12344.entry.js.map → p-ef7b1826.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["mdAvatarCss","PRESET_SIZES","Set","coerceCssLength","raw","undefined","value","String","trim","test","MdAvatar","constructor","hostRef","this","src","alt","name","initials","size","shape","label","colorFromName","loading","crossorigin","density","imageFailed","handleImageError","mdError","emit","handleImageLoad","mdLoad","onSrcChange","computeInitials","truncate","tokens","split","filter","Boolean","length","firstGrapheme","toLocaleUpperCase","first","last","text","segments","segmentGraphemes","charAt","out","join","slice","max","SegmenterCtor","Intl","Segmenter","seg","granularity","segment","push","i","Math","min","hashSeed","seed","h","charCodeAt","abs","paletteIndex","accessibleLabel","v","render","hasImage","computedInitials","hasInitials","fallbackMode","a11yLabel","palette","isPresetSize","has","customSize","hostStyle","Host","key","class","style","role","part","draggable","onLoad","onError","mdTooltipCss","TOOLTIP_VIEWPORT_MARGIN","MdTooltip","subhead","variant","position","autoPosition","offset","crossOffset","open","showDelay","hideDelay","disabled","isVisible","resolvedPlacement","hasSlottedActions","hasSlottedSubhead","tooltipId","random","toString","scrollListenerBound","escapeListenerBound","hostHoverBound","hasLoaded","suppressed","onTriggerSlotChange","els","triggerSlot","assignedElements","bindTrigger","handleTriggerEnter","scheduleShow","handleTriggerLeave","scheduleHide","handleTriggerFocus","handleTriggerBlur","e","relatedTarget","el","contains","handleHostFocusOut","handlePopupEnter","clearTimers","handlePopupLeave","handleGlobalEscape","preventDefault","active","getDeepActiveElement","focusInside","triggerEl","focus","lastGeom","at","al","aw","ah","pw","ph","vw","vh","ex","ey","watchdogFrame","handleScroll","updatePosition","componentWillLoad","syncSlotFlags","componentDidLoad","setup","showTooltip","connectedCallback","addScrollListener","addEscapeListener","schedulePositionUpdate","startPositionWatchdog","shadow","shadowRoot","querySelector","addEventListener","MutationObserver","slotObserver","updateTriggerAria","observe","childList","subtree","characterData","children","Array","from","some","c","getAttribute","disconnectedCallback","stopPositionWatchdog","unbindTrigger","removeScrollListener","removeEscapeListener","removeEventListener","disconnect","onOpenChange","val","hideTooltip","onDisabledChange","removeAttribute","onDescriptionChange","show","hide","useHostHover","tag","tagName","toLowerCase","hasAttribute","tabIndex","startsWith","desc","computeDescription","setAttribute","parts","child","slot","t","textContent","showTimer","setTimeout","hideTimer","document","a","activeElement","isConnected","mdOpen","attempt","requestAnimationFrame","positioned","tick","popup","popupEl","offsetWidth","offsetHeight","getAnchorRect","p","getBoundingClientRect","g","drifted","top","left","width","height","window","innerWidth","innerHeight","cancelAnimationFrame","mdClose","clearTimeout","capture","passive","anchorRect","popupW","popupH","placement","physicalPlacement","findBestPlacement","coords","calcCoords","isVertical","M","absLeft","maxLeft","clampedLeft","absTop","maxTop","clampedTop","fixedCoords","toFixedCoords","insetBlockStart","insetInlineStart","triggerRect","viewportTop","viewportLeft","containingBlock","getFixedContainingBlock","cbRect","createsFixedContainingBlock","s","transform","perspective","translate","rotate","scale","backdropFilter","willChange","contain","contentVisibility","containerType","node","getComputedStyle","parentElement","parentNode","ShadowRoot","host","isRTL","direction","axis","align","flippedAxis","flippedAlign","hostW","hostH","o","fitsMainAxis","hostRect","relTop","relLeft","getOppositePlacement","opp","bottom","right","preferred","check","opposite","axes","candidate","isRich","hasSubhead","hasActions","id","ref","onMouseEnter","onMouseLeave"],"sources":["src/components/md-avatar/md-avatar.css?tag=md-avatar&encapsulation=shadow","src/components/md-avatar/md-avatar.tsx","src/components/md-tooltip/md-tooltip.css?tag=md-tooltip&encapsulation=shadow","src/components/md-tooltip/md-tooltip.tsx"],"sourcesContent":["/* ==========================================================\n md-avatar — Material Design 3 Avatar (AWC-UI extension)\n Reference: https://m3.material.io/styles/typography/applying-type\n + Material Components Web avatar pattern\n\n A small identity tile that resolves to the first available\n source from a clear fallback chain (see md-avatar.tsx).\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-avatar-size Square size of the host\n (overrides the preset sizes)\n --md-avatar-container-color Container fill (initials/icon mode)\n --md-avatar-container-shape Border-radius override\n --md-avatar-label-color Initials / icon color\n --md-avatar-label-font-family Initials font family\n --md-avatar-label-font-size Initials font size\n --md-avatar-label-font-weight Initials font weight\n --md-avatar-label-letter-spacing Initials letter-spacing\n --md-avatar-icon-size Icon glyph size\n --md-avatar-outline-color Optional outline color\n --md-avatar-outline-width Optional outline width (default 0)\n\n Tonal palette (used when `color-from-name` is true):\n --md-avatar-palette-{1..7}-container Container fill for that bucket\n --md-avatar-palette-{1..7}-label Label color for that bucket\n\n CSS PARTS:\n image The `<img>` element (image mode)\n initials The initials text element\n icon The fallback person icon\n\n SLOTS:\n (default) Custom fallback rendered when no src/initials are\n available (overrides the built-in person icon).\n ========================================================== */\n\n/* ==========================================================\n 1. HOST — base + custom properties\n ========================================================== */\n:host {\n /* Sizing — overridden per-variant below; authors can pin to any\n length via `--md-avatar-size` for non-preset values. */\n --_size: var(--md-avatar-size, max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px)));\n\n /* Neutral default — used when color-from-name is false or no seed. */\n --_container-color: var(\n --md-avatar-container-color,\n var(--md-sys-color-surface-container-highest, #E6E0E9)\n );\n --_label-color: var(\n --md-avatar-label-color,\n var(--md-sys-color-on-surface-variant, #49454F)\n );\n --_shape: var(--md-avatar-container-shape, 50%);\n --_icon-size: var(--md-avatar-icon-size, calc(var(--_size) * 0.6));\n --_label-font-family: var(\n --md-avatar-label-font-family,\n var(--md-sys-typescale-title-medium-font-family, system-ui, sans-serif)\n );\n --_label-font-size: var(--md-avatar-label-font-size, calc(var(--_size) * 0.4));\n --_label-font-weight: var(\n --md-avatar-label-font-weight,\n var(--md-sys-typescale-title-medium-font-weight, 500)\n );\n --_label-letter-spacing: var(--md-avatar-label-letter-spacing, 0.05em);\n --_outline-color: var(--md-avatar-outline-color, transparent);\n --_outline-width: var(--md-avatar-outline-width, 0);\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-sizing: border-box;\n vertical-align: middle;\n user-select: none;\n\n inline-size: var(--_size);\n block-size: var(--_size);\n border-radius: var(--_shape);\n background-color: var(--_container-color);\n color: var(--_label-color);\n overflow: hidden;\n position: relative;\n outline: var(--_outline-width) solid var(--_outline-color);\n outline-offset: calc(-1 * var(--_outline-width));\n}\n\n/* ==========================================================\n 2. SIZE PRESETS\n Each preset writes to --_size only; everything else (font\n size, icon size) derives from it via calc() above.\n\n Custom sizes (`size=\"72\"`, `size=\"4rem\"`, …) are forwarded by\n the TSX layer as an inline `--md-avatar-size: <length>` on the\n host. The `:host` block at the top already reads from that\n custom property, so non-preset values flow through the same\n pipeline without a dedicated rule. The\n `md-avatar--custom-size` modifier class is provided as a hook\n for callers who need to target custom-sized instances from\n their own stylesheet (e.g. `md-avatar.md-avatar--custom-size\n { --md-avatar-label-letter-spacing: 0; }`).\n ========================================================== */\n:host(.md-avatar--small) {\n --_size: var(--md-avatar-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1.5px)));\n}\n:host(.md-avatar--medium) {\n --_size: var(--md-avatar-size, max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px)));\n}\n:host(.md-avatar--large) {\n --_size: var(--md-avatar-size, max(40px, calc(56px + var(--md-sys-density-scale, 0) * 4px)));\n}\n\n/* ==========================================================\n 3. SHAPE VARIANTS\n ========================================================== */\n:host(.md-avatar--circle) {\n --_shape: var(--md-avatar-container-shape, 50%);\n}\n:host(.md-avatar--rounded) {\n --_shape: var(--md-avatar-container-shape, var(--md-sys-shape-corner-medium, 12px));\n}\n:host(.md-avatar--square) {\n --_shape: var(--md-avatar-container-shape, 0);\n}\n\n/* ==========================================================\n 4. IMAGE MODE\n ========================================================== */\n:host(.md-avatar--mode-image) {\n background-color: transparent;\n}\n\n.md-avatar__image {\n display: block;\n inline-size: 100%;\n block-size: 100%;\n object-fit: cover;\n object-position: center;\n border-radius: inherit;\n pointer-events: none;\n -webkit-user-drag: none;\n}\n\n/* ==========================================================\n 5. INITIALS MODE\n ========================================================== */\n.md-avatar__initials {\n font-family: var(--_label-font-family);\n font-size: var(--_label-font-size);\n font-weight: var(--_label-font-weight);\n letter-spacing: var(--_label-letter-spacing);\n line-height: 1;\n color: inherit;\n /* The initials inherit the host's color stack, which the palette\n modifiers below override when color-from-name resolves to a\n bucket. */\n text-transform: uppercase;\n /* M3 typography sets a baseline shift; for centered tiles we want\n pure optical centering. */\n font-feature-settings: \"tnum\";\n}\n\n/* ==========================================================\n 6. SLOT / ICON FALLBACK\n ========================================================== */\n.md-avatar__icon {\n font-family: var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');\n font-size: var(--_icon-size);\n inline-size: var(--_icon-size);\n block-size: var(--_icon-size);\n color: inherit;\n line-height: 1;\n font-weight: normal;\n font-style: normal;\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n overflow-wrap: normal;\n direction: ltr;\n -webkit-font-smoothing: antialiased;\n pointer-events: none;\n user-select: none;\n}\n\n/* Slotted custom fallback — match icon sizing. */\n/* NOT badges. A custom property inside ::slotted() resolves in the SLOTTED\n element's own scope, and md-badge defines its own `--_icon-size` (10px, for\n its glyph). So `height: var(--_icon-size) !important` here picked up the\n BADGE's 10px instead of this component's icon size and, being !important,\n beat the badge's own 16px — squashing every badge slotted onto an icon\n button / avatar / menu item into a 10px blob. A badge is not an icon; it\n sizes itself. */\n::slotted(*:not(md-badge)) {\n /* Centre the CONTENT, not just the box. The box is forced to the icon size\n above, so a slotted <span> of text kept its single line at the top of a\n 24px box and rendered visibly high — an SVG fills its box and hid the\n problem, while a bare emoji text node (not matched by ::slotted) was\n centred by the wrapper and looked fine. */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--_icon-size);\n block-size: var(--_icon-size);\n font-size: var(--_icon-size);\n color: inherit;\n fill: currentColor;\n line-height: 1;\n pointer-events: none;\n user-select: none;\n}\n\n/* ==========================================================\n 7. TONAL PALETTE\n When `color-from-name` is true and a seed (initials/name) is\n present, the host gets a `md-avatar--palette-N` class\n (N = 1..7). Each bucket uses an M3 tonal pair so light + dark\n themes follow tokens.\n\n The default palette below is built from the M3 reference\n surface-container + on-surface tonal families and the\n secondary / tertiary / primary containers so contrast pairs\n are guaranteed at AA.\n ========================================================== */\n:host(.md-avatar--palette-1) {\n --_container-color: var(\n --md-avatar-palette-1-container,\n var(--md-sys-color-primary-container, #EADDFF)\n );\n --_label-color: var(\n --md-avatar-palette-1-label,\n var(--md-sys-color-on-primary-container, #21005D)\n );\n}\n:host(.md-avatar--palette-2) {\n --_container-color: var(\n --md-avatar-palette-2-container,\n var(--md-sys-color-secondary-container, #E8DEF8)\n );\n --_label-color: var(\n --md-avatar-palette-2-label,\n var(--md-sys-color-on-secondary-container, #1D192B)\n );\n}\n:host(.md-avatar--palette-3) {\n --_container-color: var(\n --md-avatar-palette-3-container,\n var(--md-sys-color-tertiary-container, #FFD8E4)\n );\n --_label-color: var(\n --md-avatar-palette-3-label,\n var(--md-sys-color-on-tertiary-container, #31111D)\n );\n}\n:host(.md-avatar--palette-4) {\n --_container-color: var(\n --md-avatar-palette-4-container,\n var(--md-sys-color-error-container, #F9DEDC)\n );\n --_label-color: var(\n --md-avatar-palette-4-label,\n var(--md-sys-color-on-error-container, #410E0B)\n );\n}\n/* Palettes 5/6/7 are soft tints of the primary / tertiary / secondary\n tones. They were originally mixed against `transparent` for a \"tinted\n chip\" look on a white surface, but that made the tile visibly\n see-through whenever it overlapped another element (e.g. inside an\n avatar group), which broke the bite-mark stacking. We now mix the\n accent tone into `--md-sys-color-surface` instead so the resulting\n color is fully opaque AND theme-aware (dark theme → tint of the dark\n surface). The visible tint stays nearly identical to the previous\n value on a default light surface.\n\n The initials label used the raw accent tone, which lands at only\n ~4.45:1 against the 22% tint container — just under WCAG AA (4.5:1).\n We deepen the label toward `--md-sys-color-on-surface` (dark in light\n theme, light in dark theme) so it clears AA (~6:1 light / ~7:1 dark)\n in both themes while keeping the accent hue recognizably distinct.\n Authors overriding `--md-avatar-palette-N-label` own their own\n contrast. */\n:host(.md-avatar--palette-5) {\n --_container-color: var(\n --md-avatar-palette-5-container,\n color-mix(in srgb, var(--md-sys-color-primary, #6750A4) 22%, var(--md-sys-color-surface, #FEF7FF))\n );\n --_label-color: var(\n --md-avatar-palette-5-label,\n color-mix(in srgb, var(--md-sys-color-primary, #6750A4) 72%, var(--md-sys-color-on-surface, #1C1B1F))\n );\n}\n:host(.md-avatar--palette-6) {\n --_container-color: var(\n --md-avatar-palette-6-container,\n color-mix(in srgb, var(--md-sys-color-tertiary, #7D5260) 22%, var(--md-sys-color-surface, #FEF7FF))\n );\n --_label-color: var(\n --md-avatar-palette-6-label,\n color-mix(in srgb, var(--md-sys-color-tertiary, #7D5260) 72%, var(--md-sys-color-on-surface, #1C1B1F))\n );\n}\n:host(.md-avatar--palette-7) {\n --_container-color: var(\n --md-avatar-palette-7-container,\n color-mix(in srgb, var(--md-sys-color-secondary, #625B71) 22%, var(--md-sys-color-surface, #FEF7FF))\n );\n --_label-color: var(\n --md-avatar-palette-7-label,\n color-mix(in srgb, var(--md-sys-color-secondary, #625B71) 72%, var(--md-sys-color-on-surface, #1C1B1F))\n );\n}\n\n/* ==========================================================\n 8. REDUCED MOTION / FORCED COLORS\n ========================================================== */\n@media (forced-colors: active) {\n :host {\n --_container-color: ButtonFace;\n --_label-color: ButtonText;\n --_outline-color: ButtonText;\n --_outline-width: 1px;\n }\n}\n\n/* ==========================================================\n DENSITY (local override)\n Maps the local `density` prop onto the same --md-sys-density-scale signal a\n global `data-density` ancestor sets. Declared on :host, so a local rung wins\n over the inherited global one. Every density-sensitive value in this file\n derives from that single signal by calc — never add a fixed per-rung ladder.\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 { Component, Host, h, Prop, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\n\n/**\n * Preset size buckets. Map to MD3 reference dimensions (24/40/56dp).\n */\nexport type MdAvatarPresetSize = 'small' | 'medium' | 'large';\n\n/**\n * The `size` prop accepts either a named preset (`'small' | 'medium' | 'large'`)\n * or an arbitrary CSS length / unitless number for a fully-custom dimension.\n *\n * `<md-avatar size=\"medium\" />` → 40 × 40\n * `<md-avatar size=\"72\" />` → 72 × 72 (unitless → px)\n * `<md-avatar size=\"4rem\" />` → 4rem (any CSS length)\n * `<md-avatar size=\"clamp(28px, 4vw, 72px)\" />` → CSS function passes through\n *\n * The `(string & {})` intersection keeps autocomplete on the three presets\n * while still accepting any string at the type level.\n */\nexport type MdAvatarSize = MdAvatarPresetSize | (string & {});\n\nexport type MdAvatarShape = 'circle' | 'rounded' | 'square';\n\nconst PRESET_SIZES: ReadonlySet<string> = new Set(['small', 'medium', 'large']);\n\n/**\n * Coerce a free-form size value into a CSS length string.\n *\n * \"72\" → \"72px\"\n * \"72.5\" → \"72.5px\"\n * \"4rem\" → \"4rem\" (already a length)\n * \"min(72px,8vw)\" → \"min(72px,8vw)\" (CSS function passes through)\n * \"\" / null → undefined (caller falls back to preset)\n */\nfunction coerceCssLength(raw: string | number | null | undefined): string | undefined {\n if (raw == null) return undefined;\n const value = String(raw).trim();\n if (!value) return undefined;\n // Pure number (integer or decimal, optional sign) → px.\n if (/^-?\\d*\\.?\\d+$/.test(value)) return `${value}px`;\n return value;\n}\n\n/**\n * `md-avatar` — a presentational identity tile that resolves the first\n * available source from a clear fallback chain:\n *\n * 1. `src` (image) → `<img>` is rendered.\n * On error/empty, automatically falls through to step 2.\n * 2. `initials` → explicit initials string (verbatim, max 3 chars).\n * 3. `name` → auto-derived initials. Two tokens → first letter\n * of each; one token → first letter only. RTL- and\n * diacritic-safe via `Intl.Segmenter` when available.\n * 4. default slot → caller-provided fallback (icon, emoji, SVG).\n * 5. person icon → material-symbols fallback (always available).\n */\n@Component({\n tag: 'md-avatar',\n styleUrl: 'md-avatar.css',\n shadow: true,\n})\nexport class MdAvatar {\n @Element() el!: HTMLElement;\n\n /** Image URL. When set, the avatar renders as an `<img>` element. */\n @Prop() src: string = '';\n\n /**\n * Alternative text for the image. When empty, the image is exposed to\n * AT as decorative (`aria-hidden`); the host carries the accessible\n * label instead (see `label`).\n */\n @Prop() alt: string = '';\n\n /**\n * Full name. The component derives initials automatically:\n * - `\"Ada Lovelace\"` → `\"AL\"`\n * - `\"Cher\"` → `\"C\"`\n * - `\" john doe\"` → `\"JD\"`\n *\n * Honored only when `src` is not set (or fails to load) and\n * `initials` is empty.\n */\n @Prop() name: string = '';\n\n /**\n * Explicit initials override. Bypasses the `name` parsing entirely.\n * Truncated to the first 3 grapheme clusters at render time so a\n * stray \"WXYZ\" can't blow out the layout.\n */\n @Prop() initials: string = '';\n\n /**\n * Avatar size. Accepts either a named preset or any CSS length.\n *\n * Presets:\n * - `small` — 24×24 (typography: label-medium)\n * - `medium` — 40×40 (typography: title-medium) [default]\n * - `large` — 56×56 (typography: title-large)\n *\n * Custom values:\n * - Unitless number → pixels (`size=\"72\"` → 72px)\n * - Any CSS length → passes through (`size=\"4rem\"`, `size=\"10vw\"`,\n * `size=\"clamp(28px, 4vw, 72px)\"`)\n *\n * Custom values are wired through the existing `--md-avatar-size` CSS\n * custom property, so per-instance overrides via `style` / class still\n * win when set.\n */\n @Prop({ reflect: true }) size: MdAvatarSize = 'medium';\n\n /**\n * Container shape.\n * - `circle` — fully rounded (`50%`) [default]\n * - `rounded` — `--md-sys-shape-corner-medium` (12dp)\n * - `square` — sharp corners (`0`)\n */\n @Prop({ reflect: true }) shape: MdAvatarShape = 'circle';\n\n /**\n * Accessible label for the avatar. When empty:\n * - if `alt` is set, that is exposed instead\n * - if `name` is set, that is exposed instead\n * - otherwise the avatar is hidden from AT (`role=\"presentation\"`)\n * so it doesn't add noise next to a labelled control.\n */\n @Prop() label: string = '';\n\n /**\n * When `true` the avatar background is deterministically picked from a\n * tonal palette using the initials/name as a hash seed. When `false`,\n * the avatar uses the neutral on-surface tone.\n */\n @Prop({ attribute: 'color-from-name', reflect: true }) colorFromName: boolean = true;\n\n /** `<img>` `loading` attribute. */\n @Prop() loading: 'eager' | 'lazy' = 'lazy';\n\n /** `<img>` `crossorigin` attribute (forwarded only when set). */\n @Prop() crossorigin: '' | 'anonymous' | 'use-credentials' = '';\n\n /**\n * Local density rung. Drives the same `--md-sys-density-scale` signal that a\n * global `data-density` ancestor sets, so a local value simply overrides the\n * inherited one. 0 = default, -4 = ultra-compact.\n */\n @Prop({ reflect: true }) density: 0 | -1 | -2 | -3 | -4 = 0;\n\n /** Image successfully loaded. */\n @Event() mdLoad: EventEmitter<{ src: string }>;\n\n /** Image failed to load — component fell back to initials/icon. */\n @Event() mdError: EventEmitter<{ src: string }>;\n\n /** Internal: whether the image src failed (triggers fallback). */\n @State() private imageFailed = false;\n\n @Watch('src')\n onSrcChange() {\n this.imageFailed = false;\n }\n\n private computeInitials(): string {\n if (this.initials) return this.truncate(this.initials.trim());\n\n const name = (this.name || '').trim();\n if (!name) return '';\n\n const tokens = name.split(/\\s+/).filter(Boolean);\n if (tokens.length === 0) return '';\n\n if (tokens.length === 1) {\n return this.firstGrapheme(tokens[0]).toLocaleUpperCase();\n }\n\n const first = this.firstGrapheme(tokens[0]);\n const last = this.firstGrapheme(tokens[tokens.length - 1]);\n return (first + last).toLocaleUpperCase();\n }\n\n /** First grapheme cluster, RTL- and emoji-safe when Intl.Segmenter is present. */\n private firstGrapheme(text: string): string {\n if (!text) return '';\n const segments = this.segmentGraphemes(text, 1);\n return segments[0] ?? text.charAt(0);\n }\n\n private truncate(text: string): string {\n const out = this.segmentGraphemes(text, 3);\n if (out.length > 0) return out.join('').toLocaleUpperCase();\n return text.slice(0, 3).toLocaleUpperCase();\n }\n\n /**\n * Yields up to `max` grapheme clusters from `text`. Uses Intl.Segmenter\n * when available (every evergreen browser since 2022); falls back to\n * `charAt` on the off chance the runtime lacks it.\n */\n private segmentGraphemes(text: string, max: number): string[] {\n interface SegLike {\n segment(input: string): Iterable<{ segment: string }>;\n }\n interface SegCtor {\n new (locale?: unknown, options?: { granularity?: string }): SegLike;\n }\n const SegmenterCtor = (Intl as unknown as { Segmenter?: SegCtor }).Segmenter;\n const out: string[] = [];\n if (typeof SegmenterCtor === 'function') {\n try {\n const seg = new SegmenterCtor(undefined, { granularity: 'grapheme' });\n for (const { segment } of seg.segment(text)) {\n out.push(segment);\n if (out.length === max) break;\n }\n return out;\n } catch {\n /* fall through */\n }\n }\n for (let i = 0; i < Math.min(max, text.length); i++) {\n out.push(text.charAt(i));\n }\n return out;\n }\n\n /**\n * Deterministic hash → palette index. Same seed → same color across\n * sessions/devices so a given user always has the same avatar tint.\n */\n private hashSeed(seed: string): number {\n let h = 0;\n for (let i = 0; i < seed.length; i++) {\n h = (h << 5) - h + seed.charCodeAt(i);\n h |= 0;\n }\n return Math.abs(h);\n }\n\n /** 1-based palette index (1..7) matching the CSS palette variables. */\n private get paletteIndex(): number {\n if (!this.colorFromName) return 0;\n const seed = (this.initials || this.name || this.label || '').trim();\n if (!seed) return 0;\n return (this.hashSeed(seed) % 7) + 1;\n }\n\n private handleImageError = () => {\n this.imageFailed = true;\n this.mdError.emit({ src: this.src });\n };\n\n private handleImageLoad = () => {\n this.imageFailed = false;\n this.mdLoad.emit({ src: this.src });\n };\n\n private get accessibleLabel(): string | undefined {\n const v = (this.label || this.alt || this.name || '').trim();\n return v || undefined;\n }\n\n render() {\n const hasImage = !!this.src && !this.imageFailed;\n const computedInitials = this.computeInitials();\n const hasInitials = !hasImage && !!computedInitials;\n const fallbackMode: 'image' | 'initials' | 'slot' = hasImage\n ? 'image'\n : hasInitials\n ? 'initials'\n : 'slot';\n\n const a11yLabel = this.accessibleLabel;\n const palette = this.paletteIndex;\n\n // Resolve `size`: presets emit a `md-avatar--{preset}` modifier class\n // and rely on the CSS-defined token defaults; everything else is treated\n // as a CSS length and pushed into `--md-avatar-size` so the existing\n // sizing pipeline (which already cascades through that custom property)\n // picks it up automatically. We deliberately set the inline style at\n // the lowest possible level (`Host`) so an author's `style=\"--md-avatar-size: …\"`\n // or class-based override still wins via CSS specificity.\n const isPresetSize = PRESET_SIZES.has(String(this.size));\n const customSize = isPresetSize ? undefined : coerceCssLength(this.size);\n const hostStyle = customSize ? { '--md-avatar-size': customSize } : undefined;\n\n return (\n <Host\n class={{\n 'md-avatar': true,\n [`md-avatar--${this.size}`]: isPresetSize,\n 'md-avatar--custom-size': !isPresetSize && !!customSize,\n [`md-avatar--${this.shape}`]: true,\n [`md-avatar--mode-${fallbackMode}`]: true,\n [`md-avatar--palette-${palette}`]: palette > 0 && fallbackMode !== 'image',\n 'md-avatar--has-image': hasImage,\n }}\n style={hostStyle}\n role={a11yLabel ? 'img' : 'presentation'}\n aria-label={a11yLabel}\n aria-hidden={a11yLabel ? null : 'true'}\n >\n {fallbackMode === 'image' && (\n <img\n class=\"md-avatar__image\"\n part=\"image\"\n src={this.src}\n alt={this.alt || ''}\n loading={this.loading}\n crossorigin={this.crossorigin || undefined}\n aria-hidden=\"true\"\n draggable={false}\n onLoad={this.handleImageLoad}\n onError={this.handleImageError}\n />\n )}\n\n {fallbackMode === 'initials' && (\n <span class=\"md-avatar__initials\" part=\"initials\" aria-hidden=\"true\">\n {computedInitials}\n </span>\n )}\n\n {fallbackMode === 'slot' && (\n <slot>\n <span class=\"md-avatar__icon material-symbols-outlined\" part=\"icon\" aria-hidden=\"true\">\n person\n </span>\n </slot>\n )}\n </Host>\n );\n }\n}\n","/* ==========================================================\n md-tooltip — Material Design 3 Tooltip\n Spec: https://m3.material.io/components/tooltips/specs\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-tooltip-plain-container-color Plain tooltip background\n --md-tooltip-plain-text-color Plain tooltip text color\n --md-tooltip-rich-container-color Rich tooltip background\n --md-tooltip-rich-subhead-color Rich subhead text color\n --md-tooltip-rich-text-color Rich supporting text color\n --md-tooltip-rich-action-color Rich action button color\n --md-tooltip-container-shape Border-radius (plain)\n --md-tooltip-plain-max-inline-size Plain tooltip max width\n --md-tooltip-rich-container-shape Border-radius (rich)\n --md-tooltip-rich-min-inline-size Rich tooltip min width\n --md-tooltip-rich-max-inline-size Rich tooltip max width\n\n CSS PARTS:\n popup Tooltip popup container\n subhead Rich tooltip subhead wrapper\n supporting-text Rich tooltip supporting text wrapper\n actions Rich tooltip action button wrapper\n text Plain tooltip text wrapper\n\n SLOTS:\n (default) Trigger element\n content Rich tooltip supporting text\n subhead Rich tooltip subhead\n actions Rich tooltip action buttons\n ========================================================== */\n\n/* ==========================================================\n 1. HOST\n ========================================================== */\n\n:host {\n display: inline-block;\n position: relative;\n}\n\n/* ==========================================================\n 2. POPUP — shared base\n ========================================================== */\n\n.md-tooltip__popup {\n /* Fixed + viewport coords (set in JS) so popups escape overflow:hidden ancestors. */\n position: fixed;\n z-index: var(--md-sys-z-index-tooltip, 1500);\n pointer-events: none;\n box-sizing: border-box;\n /* CRITICAL: width must not depend on the popup's own offsets. With width:auto, a\n fixed element shrink-to-fits into (containing block − left), so writing `left`\n changes the width, which re-wraps the text, which the position watchdog sees as\n drift and repositions — an animated wrap/slide feedback loop that crawls the\n popup across the screen one frame at a time. max-content sizes from the CONTENT\n only (the variant max-inline-size caps still bound it), decoupling measurement\n from position: one measure, one placement, no loop. */\n width: max-content;\n\n opacity: 0;\n visibility: hidden;\n transform: scale(0.9);\n\n transition:\n opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n transform var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n visibility 0ms linear var(--md-sys-motion-duration-short2, 100ms);\n}\n\n.md-tooltip__popup--visible {\n opacity: 1;\n visibility: visible;\n transform: scale(1);\n pointer-events: auto;\n transition:\n opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n transform var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n visibility 0ms linear 0ms;\n}\n\n/* ==========================================================\n 3. PLAIN TOOLTIP\n Spec: height 24px (via padding), padding 8px, body-small\n ========================================================== */\n\n.md-tooltip__popup--plain {\n --_container-color: var(--md-tooltip-plain-container-color, var(--md-sys-color-inverse-surface, #313033));\n --_text-color: var(--md-tooltip-plain-text-color, var(--md-sys-color-inverse-on-surface, #F4EFF4));\n --_shape: var(--md-tooltip-container-shape, var(--md-sys-shape-corner-extra-small, 4px));\n\n background-color: var(--_container-color);\n color: var(--_text-color);\n border-radius: var(--_shape);\n\n /* Global density: on-grid padding tracks --md-sys-spacing-* (4/8 = inset-xs/sm);\n defaults resolve byte-for-byte at density 0. min-block-size stays the 24px\n spec height floor. */\n padding-block: var(--md-sys-spacing-inset-xs, 4px);\n padding-inline: var(--md-sys-spacing-inset-sm, 8px);\n\n min-block-size: max(20px, calc(24px + var(--md-sys-density-scale, 0) * 1px));\n max-inline-size: min(var(--md-tooltip-plain-max-inline-size, 280px), calc(100vw - 16px));\n\n font-family: var(--md-sys-typescale-body-small-font-family, Roboto, sans-serif);\n font-size: max(10px, calc(12px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-small-font-weight, 400);\n line-height: max(14px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n letter-spacing: var(--md-sys-typescale-body-small-letter-spacing, 0.4px);\n\n /* Wrap long content over multiple lines instead of clipping it. The plain\n tooltip is the overflow tooltip used by md-list-item, so it must reveal\n the FULL text. `max-inline-size` caps the line length (280px default here,\n overridable per-instance) and the content wraps below it rather than\n truncating with an ellipsis. */\n white-space: normal;\n display: flex;\n align-items: center;\n}\n\n.md-tooltip__text {\n /* No ellipsis / overflow clipping — let the popup grow vertically and wrap.\n `overflow-wrap: anywhere` keeps an unbroken long word (URLs, IDs) from\n forcing the popup wider than its max-inline-size. */\n overflow-wrap: anywhere;\n}\n\n/* ==========================================================\n 4. RICH TOOLTIP\n Spec: top padding 12px, bottom 8px, left/right 16px\n ========================================================== */\n\n.md-tooltip__popup--rich {\n --_container-color: var(--md-tooltip-rich-container-color, var(--md-sys-color-surface-container, #F3EDF7));\n --_subhead-color: var(--md-tooltip-rich-subhead-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_text-color: var(--md-tooltip-rich-text-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_action-color: var(--md-tooltip-rich-action-color, var(--md-sys-color-primary, #6750A4));\n --_shape: var(--md-tooltip-rich-container-shape, var(--md-sys-shape-corner-medium, 12px));\n\n background-color: var(--_container-color);\n color: var(--_text-color);\n border-radius: var(--_shape);\n\n /* Global density: on-grid rich padding tracks --md-sys-spacing-*\n (12/8/16 = inset-md/sm/lg); defaults resolve byte-for-byte at density 0. */\n padding-block-start: var(--md-sys-spacing-inset-md, 12px);\n padding-block-end: var(--md-sys-spacing-inset-sm, 8px);\n padding-inline: var(--md-sys-spacing-inset-lg, 16px);\n\n min-inline-size: var(--md-tooltip-rich-min-inline-size, 120px);\n max-inline-size: min(var(--md-tooltip-rich-max-inline-size, 320px), calc(100vw - 16px));\n\n white-space: normal;\n box-shadow: var(--md-sys-elevation-2, 0 1px 3px 1px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.3));\n}\n\n/* Subhead */\n.md-tooltip__subhead {\n font-family: var(--md-sys-typescale-title-small-font-family, Roboto, sans-serif);\n font-size: max(11px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-title-small-font-weight, 500);\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n letter-spacing: var(--md-sys-typescale-title-small-letter-spacing, 0.1px);\n color: var(--_subhead-color);\n margin-block-end: var(--md-sys-spacing-gap-xs, 4px);\n}\n\n/* Supporting text */\n.md-tooltip__supporting-text {\n font-family: var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif);\n font-size: max(11px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-medium-font-weight, 400);\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 color: var(--_text-color);\n}\n\n/* Actions */\n.md-tooltip__actions {\n display: flex;\n gap: var(--md-sys-spacing-gap-sm, 8px);\n justify-content: flex-end;\n margin-block-start: var(--md-sys-spacing-gap-md, 12px);\n color: var(--_action-color);\n}\n\n.md-tooltip__actions--empty {\n display: none;\n}\n\n/* Slotted action buttons */\n::slotted([slot=\"actions\"]) {\n color: var(--_action-color);\n}\n\n/* ==========================================================\n 5. PLACEMENT — transform-origin for enter animation\n Position is set inline via JS; these handle animation origin.\n ========================================================== */\n\n.md-tooltip__popup--top,\n.md-tooltip__popup--top-start,\n.md-tooltip__popup--top-end {\n transform-origin: bottom center;\n}\n\n.md-tooltip__popup--bottom,\n.md-tooltip__popup--bottom-start,\n.md-tooltip__popup--bottom-end {\n transform-origin: top center;\n}\n\n.md-tooltip__popup--left,\n.md-tooltip__popup--left-start,\n.md-tooltip__popup--left-end {\n transform-origin: center right;\n}\n\n.md-tooltip__popup--right,\n.md-tooltip__popup--right-start,\n.md-tooltip__popup--right-end {\n transform-origin: center left;\n}\n\n/* ==========================================================\n 6. RTL\n NB: no transform-origin overrides here. The placement classes are already\n PHYSICAL — JS (physicalPlacement) maps logical placements per direction\n before resolving the class — so the base origins in section 5 always face\n the trigger. The old :host-context([dir=rtl]) re-flip double-flipped them,\n making the entrance scale grow from the edge facing AWAY from the trigger.\n ========================================================== */\n\n:host-context([dir=\"rtl\"]) .md-tooltip__actions {\n justify-content: flex-start;\n}\n\n/* ==========================================================\n 7. FORCED COLORS (Windows High Contrast)\n The popup is a background + elevation surface — both are dropped in\n forced-colors mode, leaving the tooltip text floating with no boundary\n over the page. Give it a system-color border so the region stays\n perceivable (matches the md-toolbar hardened convention).\n ========================================================== */\n\n@media (forced-colors: active) {\n .md-tooltip__popup {\n border: 1px solid CanvasText;\n }\n}\n\n/* ==========================================================\n 8. REDUCED MOTION\n Honor a reduced-motion preference by dropping the scale/opacity\n entrance so the tooltip appears/disappears instantly instead of\n animating on every hover (md-list-item mounts a tooltip per row).\n ========================================================== */\n\n@media (prefers-reduced-motion: reduce) {\n .md-tooltip__popup,\n .md-tooltip__popup--visible {\n transition: none;\n transform: none;\n }\n}\n\n/* ==========================================================\n DENSITY (local override)\n Maps the local `density` prop onto the same --md-sys-density-scale signal a\n global `data-density` ancestor sets. Declared on :host, so a local rung wins\n over the inherited global one. Every density-sensitive value in this file\n derives from that single signal by calc — never add a fixed per-rung ladder.\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 { Component, Host, h, Prop, State, Event, EventEmitter, Element, Method, Watch } from '@stencil/core';\n\nexport type Placement =\n | 'top' | 'top-start' | 'top-end'\n | 'bottom' | 'bottom-start' | 'bottom-end'\n | 'left' | 'left-start' | 'left-end'\n | 'right' | 'right-start' | 'right-end';\n\n/** Minimum gap kept between a popup and the viewport edge when cross-axis clamping. */\nconst TOOLTIP_VIEWPORT_MARGIN = 8;\n\n/**\n * @slot - Trigger element the tooltip is anchored to\n * @slot content - Rich tooltip supporting text (overrides `text` prop)\n * @slot subhead - Rich tooltip subhead (overrides `subhead` prop)\n * @slot actions - Rich tooltip action buttons\n *\n * @part popup - Tooltip popup container\n * @part subhead - Rich tooltip subhead wrapper\n * @part supporting-text - Rich tooltip supporting text wrapper\n * @part actions - Rich tooltip action button wrapper\n * @part text - Plain tooltip text wrapper\n */\n@Component({\n tag: 'md-tooltip',\n styleUrl: 'md-tooltip.css',\n shadow: true,\n})\nexport class MdTooltip {\n @Element() el!: HTMLElement;\n\n /** Plain tooltip text, or rich tooltip supporting text */\n @Prop() text: string = '';\n\n /** Rich tooltip subhead (headline) */\n @Prop() subhead: string = '';\n\n /** Visual variant */\n @Prop({ reflect: true }) variant: 'plain' | 'rich' = 'plain';\n\n /** Preferred placement relative to the trigger */\n @Prop() position: Placement = 'top';\n\n /** Automatically reposition if overflowing the viewport */\n @Prop() autoPosition: boolean = true;\n\n /** Distance from the trigger in pixels */\n @Prop() offset: number = 8;\n\n /** Cross-axis offset in pixels */\n @Prop() crossOffset: number = 0;\n\n /** Programmatic open state */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /** Delay before showing (ms) */\n @Prop() showDelay: number = 500;\n\n /** Delay before hiding (ms) — for rich variant hover-out grace period */\n @Prop() hideDelay: number = 200;\n\n /** When true, hover/focus handlers are ignored and any open tooltip is dismissed. */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /**\n * Local density rung. Drives the same `--md-sys-density-scale` signal that a\n * global `data-density` ancestor sets, so a local value simply overrides the\n * inherited one. 0 = default, -4 = ultra-compact.\n */\n @Prop({ reflect: true }) density: 0 | -1 | -2 | -3 | -4 = 0;\n\n /**\n * Emits when the tooltip becomes visible. `bubbles:false` + `composed:false` keep it\n * from crossing the shadow boundary and retargeting onto an embedding host (the repo's\n * documented composed-event-leak class — see md-date-picker's swallow guards).\n */\n @Event({ bubbles: false, composed: false }) mdOpen: EventEmitter<void>;\n\n /** Emits when the tooltip is dismissed (does not bubble or cross shadow boundaries). */\n @Event({ bubbles: false, composed: false }) mdClose: EventEmitter<void>;\n\n @State() private isVisible = false;\n @State() private resolvedPlacement: Placement = 'top';\n @State() private hasSlottedActions = false;\n @State() private hasSlottedSubhead = false;\n\n private popupEl?: HTMLElement;\n private triggerEl?: HTMLElement;\n private triggerSlot?: HTMLSlotElement;\n private slotObserver?: MutationObserver;\n private showTimer?: ReturnType<typeof setTimeout>;\n private hideTimer?: ReturnType<typeof setTimeout>;\n private tooltipId = `md-tooltip-${Math.random().toString(36).slice(2, 9)}`;\n private scrollListenerBound = false;\n private escapeListenerBound = false;\n private hostHoverBound = false;\n private hasLoaded = false;\n /** Set on Escape dismissal; blocks re-show until the pointer/focus leaves the trigger. */\n private suppressed = false;\n\n // ─── Lifecycle ───────────────────────────────────────────\n\n componentWillLoad() {\n // Seed slot flags + visible state BEFORE the first render so the didLoad setup()\n // re-computes them to the same values — a no-op write rather than a state change\n // during componentDidLoad (which triggers Stencil's extra-re-render warning).\n // Honor `disabled`: a disabled tooltip must never render visible, and seeding\n // isVisible while disabled would also leak an unbalanced mdClose on the next hide.\n this.syncSlotFlags();\n if (this.open && !this.disabled) this.isVisible = true;\n }\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.setup();\n if (this.open) this.showTooltip();\n }\n\n connectedCallback() {\n // On a REPARENT (disconnect→connect after first load), re-establish bindings —\n // componentDidLoad runs only once, so without this a moved tooltip goes dead.\n if (!this.hasLoaded) return;\n this.setup();\n // If the tooltip was still visible when it was moved, disconnectedCallback tore\n // down its scroll/Escape listeners without hiding it — restore them and reposition\n // against the moved trigger so it isn't stranded open, undismissable and detached.\n if (this.isVisible && !this.disabled) {\n this.addScrollListener();\n this.addEscapeListener();\n this.schedulePositionUpdate();\n this.startPositionWatchdog();\n } else if (this.open && !this.isVisible && !this.disabled) {\n // `open` was set while the element was DETACHED (showTooltip refuses to bind\n // global listeners there) — honor it now that we are connected again.\n this.showTooltip();\n }\n }\n\n /** (Re)attach trigger binding, slot detection and the host focusout listener. */\n private setup() {\n const shadow = this.el.shadowRoot;\n if (!shadow) return;\n\n this.triggerSlot = (shadow.querySelector('slot:not([name])') as HTMLSlotElement | null) ?? undefined;\n // addEventListener dedupes identical (fn, capture) pairs, so a re-setup is safe.\n this.triggerSlot?.addEventListener('slotchange', this.onTriggerSlotChange);\n this.el.addEventListener('focusout', this.handleHostFocusOut);\n\n // Rich content is authored in light DOM regardless of variant, so detect it there —\n // the shadow content/subhead/actions slots only exist while variant=\"rich\" renders,\n // which is why shadow-slot detection missed a runtime plain→rich switch.\n this.syncSlotFlags();\n if (typeof MutationObserver !== 'undefined' && !this.slotObserver) {\n // childList catches slotted content add/remove; subtree+characterData catches\n // edits to slotted text so a slot-only rich tooltip's aria-description stays fresh.\n this.slotObserver = new MutationObserver(() => {\n this.syncSlotFlags();\n if (this.triggerEl) this.updateTriggerAria(this.triggerEl);\n });\n this.slotObserver.observe(this.el, { childList: true, subtree: true, characterData: true });\n }\n\n const first = this.triggerSlot?.assignedElements()[0] as HTMLElement | undefined;\n if (first) this.bindTrigger(first);\n }\n\n private onTriggerSlotChange = () => {\n const els = this.triggerSlot?.assignedElements();\n if (els && els.length > 0) this.bindTrigger(els[0] as HTMLElement);\n };\n\n private syncSlotFlags() {\n // Direct-child scan (not `:scope >`, which Stencil's mock-doc can't parse).\n const children = Array.from(this.el.children);\n this.hasSlottedActions = children.some((c) => c.getAttribute('slot') === 'actions');\n this.hasSlottedSubhead = children.some((c) => c.getAttribute('slot') === 'subhead');\n }\n\n disconnectedCallback() {\n this.clearTimers();\n this.stopPositionWatchdog();\n this.unbindTrigger();\n this.removeScrollListener();\n this.removeEscapeListener();\n this.el.removeEventListener('focusout', this.handleHostFocusOut);\n this.triggerSlot?.removeEventListener('slotchange', this.onTriggerSlotChange);\n this.triggerSlot = undefined;\n this.slotObserver?.disconnect();\n this.slotObserver = undefined;\n }\n\n // ─── Watchers ────────────────────────────────────────────\n\n @Watch('open')\n onOpenChange(val: boolean) {\n if (val) {\n this.showTooltip();\n } else {\n this.hideTooltip();\n }\n }\n\n @Watch('disabled')\n onDisabledChange(disabled: boolean) {\n if (disabled) {\n this.clearTimers();\n if (this.open) this.open = false;\n this.triggerEl?.removeAttribute('aria-description');\n } else if (this.triggerEl) {\n this.updateTriggerAria(this.triggerEl);\n }\n }\n\n /** Keep the trigger's aria-description in sync when the tooltip's text changes\n * after binding (bindTrigger and the disabled watcher were the only refreshers). */\n @Watch('text')\n @Watch('subhead')\n onDescriptionChange() {\n if (this.triggerEl) this.updateTriggerAria(this.triggerEl);\n }\n\n // ─── Public Methods ──────────────────────────────────────\n\n /** Show the tooltip programmatically (no-op while `disabled`). */\n @Method()\n async show() {\n // Don't flip `open` (a reflected attribute) true while disabled — showTooltip\n // would early-return, leaving open=true with nothing visible (a state desync).\n if (this.disabled) return;\n this.open = true;\n }\n\n /** Dismiss the tooltip programmatically. */\n @Method()\n async hide() {\n this.open = false;\n }\n\n // ─── Trigger Binding ─────────────────────────────────────\n\n private bindTrigger(el: HTMLElement) {\n this.unbindTrigger();\n this.triggerEl = el;\n\n // Presentational triggers (e.g. weekday spans) are not focusable; hover the host instead.\n if (this.useHostHover(el)) {\n this.el.addEventListener('mouseenter', this.handleTriggerEnter);\n this.el.addEventListener('mouseleave', this.handleTriggerLeave);\n this.hostHoverBound = true;\n } else {\n el.addEventListener('mouseenter', this.handleTriggerEnter);\n el.addEventListener('mouseleave', this.handleTriggerLeave);\n }\n\n el.addEventListener('focus', this.handleTriggerFocus);\n el.addEventListener('blur', this.handleTriggerBlur);\n this.updateTriggerAria(el);\n }\n\n private unbindTrigger() {\n if (this.hostHoverBound) {\n this.el.removeEventListener('mouseenter', this.handleTriggerEnter);\n this.el.removeEventListener('mouseleave', this.handleTriggerLeave);\n this.hostHoverBound = false;\n } else if (this.triggerEl) {\n this.triggerEl.removeEventListener('mouseenter', this.handleTriggerEnter);\n this.triggerEl.removeEventListener('mouseleave', this.handleTriggerLeave);\n }\n\n if (!this.triggerEl) return;\n\n this.triggerEl.removeEventListener('focus', this.handleTriggerFocus);\n this.triggerEl.removeEventListener('blur', this.handleTriggerBlur);\n this.triggerEl.removeAttribute('aria-description');\n this.triggerEl = undefined;\n }\n\n /** True when hover should be tracked on the tooltip host (non-interactive triggers). */\n private useHostHover(el: HTMLElement): boolean {\n const tag = el.tagName.toLowerCase();\n if (tag === 'button' || tag === 'a' || tag === 'input' || tag === 'select' || tag === 'textarea') {\n return false;\n }\n if (el.hasAttribute('tabindex') && el.tabIndex >= 0) return false;\n if (tag.startsWith('md-')) return false;\n return true;\n }\n\n /** aria-description works across shadow DOM (unlike aria-describedby IDREFs) */\n private updateTriggerAria(el: HTMLElement) {\n if (this.disabled) {\n el.removeAttribute('aria-description');\n return;\n }\n const desc = this.computeDescription();\n if (desc) {\n el.setAttribute('aria-description', desc);\n } else {\n el.removeAttribute('aria-description');\n }\n }\n\n /**\n * The trigger's accessible description: `text`/`subhead` props first, then a\n * fallback to slotted rich content (subhead + supporting text) so a slot-only\n * rich tooltip is still announced to screen readers. Action buttons are excluded\n * — they are not description text and carry their own accessible names.\n */\n private computeDescription(): string {\n if (this.text) return this.text;\n if (this.subhead) return this.subhead;\n const parts: string[] = [];\n for (const child of Array.from(this.el.children)) {\n const slot = child.getAttribute('slot');\n if (slot === 'subhead' || slot === 'content') {\n const t = (child.textContent || '').trim();\n if (t) parts.push(t);\n }\n }\n return parts.join('. ');\n }\n\n // ─── Event Handlers ──────────────────────────────────────\n\n /** Arm the show timer, unless disabled or Escape-suppressed until re-entry. */\n private scheduleShow() {\n if (this.disabled || this.suppressed) return;\n this.clearTimers();\n this.showTimer = setTimeout(() => {\n this.open = true;\n }, this.showDelay);\n }\n\n /** Arm the hide grace timer (both variants) so the pointer can travel from the\n * trigger onto the popup without it vanishing — WCAG 1.4.13 \"hoverable\". */\n private scheduleHide() {\n this.clearTimers();\n this.hideTimer = setTimeout(() => {\n this.open = false;\n }, this.hideDelay);\n }\n\n private handleTriggerEnter = () => this.scheduleShow();\n\n private handleTriggerLeave = () => {\n // A fresh hover may re-show after an Escape dismissal.\n this.suppressed = false;\n this.scheduleHide();\n };\n\n private handleTriggerFocus = () => this.scheduleShow();\n\n private handleTriggerBlur = (e: FocusEvent) => {\n // Focus moving into the popup (rich action buttons) keeps the tooltip open.\n if (e.relatedTarget && this.el.contains(e.relatedTarget as Node)) return;\n this.suppressed = false;\n this.scheduleHide();\n };\n\n /**\n * Handles focusout at the host level — covers focus leaving\n * both the trigger AND slotted rich-tooltip action buttons.\n */\n private handleHostFocusOut = (e: FocusEvent) => {\n if (this.variant !== 'rich' || !this.isVisible) return;\n if (e.relatedTarget && this.el.contains(e.relatedTarget as Node)) return;\n this.scheduleHide();\n };\n\n /** Pointer over the popup keeps it open (hoverable) — both variants. */\n private handlePopupEnter = () => {\n this.clearTimers();\n };\n\n private handlePopupLeave = () => {\n this.scheduleHide();\n };\n\n // ─── Show / Hide ─────────────────────────────────────────\n\n /** Document-level Escape handler — dismisses from any focused descendant */\n private handleGlobalEscape = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !this.isVisible) return;\n e.preventDefault();\n this.clearTimers();\n // Suppress re-show until the pointer/focus leaves and returns, so refocusing\n // the trigger (below) or a lingering hover can't immediately reopen it.\n this.suppressed = true;\n // WCAG 1.4.13: dismissal must NOT move focus. Only return focus to the trigger\n // when focus is currently inside the tooltip (popup/actions) or on the trigger —\n // never yank it from an unrelated element the user is interacting with.\n const active = this.getDeepActiveElement();\n const focusInside = !!active && (this.el.contains(active) || active === this.triggerEl);\n this.open = false;\n if (focusInside && this.triggerEl) this.triggerEl.focus();\n };\n\n /** Deepest focused element, piercing shadow roots. */\n private getDeepActiveElement(): Element | null {\n if (typeof document === 'undefined') return null;\n let a: Element | null = document.activeElement;\n while (a && a.shadowRoot && a.shadowRoot.activeElement) a = a.shadowRoot.activeElement;\n return a;\n }\n\n private addEscapeListener() {\n if (!this.escapeListenerBound) {\n document.addEventListener('keydown', this.handleGlobalEscape, true);\n this.escapeListenerBound = true;\n }\n }\n\n private removeEscapeListener() {\n if (this.escapeListenerBound) {\n document.removeEventListener('keydown', this.handleGlobalEscape, true);\n this.escapeListenerBound = false;\n }\n }\n\n private showTooltip() {\n if (this.disabled) return;\n // A DETACHED element must not bind global listeners or start the rAF loop —\n // disconnectedCallback can never fire again to clean them up (a stale ref\n // toggling `open` after removal would otherwise leak a 60fps loop plus a\n // document-level Escape handler forever). connectedCallback re-shows on\n // reconnect via the open/isVisible checks.\n if (!this.el.isConnected) return;\n this.isVisible = true;\n this.mdOpen.emit();\n this.addScrollListener();\n this.addEscapeListener();\n // Measure after layout so fixed coords are accurate (retry if popup not yet sized).\n this.schedulePositionUpdate();\n this.startPositionWatchdog();\n }\n\n private schedulePositionUpdate(attempt = 0) {\n requestAnimationFrame(() => {\n const positioned = this.updatePosition();\n if (!positioned && attempt < 3) {\n this.schedulePositionUpdate(attempt + 1);\n }\n });\n }\n\n // ─── Position Watchdog ──────────────────────────────────\n //\n // The scroll listener only repairs staleness that arrives as a light-DOM scroll.\n // Everything else that moves the anchor or resizes the popup after positioning is\n // invisible to it: window resize reflow, scrollers inside OTHER shadow roots\n // (scroll is composed:false), sibling layout shift, web-font/text growth, and a\n // containing-block appearing/vanishing at rest (md-list's --shifting adds\n // will-change:transform to rows that haven't moved; md-date-picker's entrance\n // transform settles back to none). Rather than plumbing per-ancestor listeners +\n // ResizeObservers + animation hooks (large lifecycle surface), a single rAF\n // watchdog runs ONLY while the tooltip is visible and repositions when the anchor\n // rect, popup size, the popup's ACTUAL viewport position (which shifts when a\n // containing block reinterprets the stored coords), or the viewport changes.\n // Cost: two getBoundingClientRect calls (anchor + popup) and two offset reads per\n // frame, per visible tooltip (tooltips are transient, effectively one at a time).\n\n /** Geometry snapshot from the last successful updatePosition. ex/ey are the popup's\n * EXPECTED viewport coords — if a containing-block change reinterprets the stored\n * style.top/left, the popup's real rect drifts from these and we reposition. */\n private lastGeom = { at: 0, al: 0, aw: 0, ah: 0, pw: 0, ph: 0, vw: 0, vh: 0, ex: 0, ey: 0 };\n private watchdogFrame = 0;\n\n private startPositionWatchdog() {\n if (typeof requestAnimationFrame !== 'function') return;\n this.stopPositionWatchdog();\n const tick = () => {\n if (!this.isVisible || !this.el.isConnected) {\n this.watchdogFrame = 0;\n return;\n }\n const popup = this.popupEl;\n if (popup && this.triggerEl) {\n const pw = popup.offsetWidth;\n const ph = popup.offsetHeight;\n // A 0x0 popup means a hidden ancestor — positioning would fail without\n // refreshing the snapshot, so skip until it has a box again (the size\n // delta versus the snapshot triggers the reposition on reveal).\n if (pw !== 0 || ph !== 0) {\n const a = this.getAnchorRect();\n const p = popup.getBoundingClientRect();\n const g = this.lastGeom;\n const drifted =\n a.top !== g.at || a.left !== g.al || a.width !== g.aw || a.height !== g.ah ||\n pw !== g.pw || ph !== g.ph ||\n // 0.5px tolerance absorbs subpixel churn; the entrance scale animation\n // exceeds it for a few frames, which just re-writes the same coords.\n Math.abs(p.top - g.ey) > 0.5 || Math.abs(p.left - g.ex) > 0.5 ||\n window.innerWidth !== g.vw || window.innerHeight !== g.vh;\n if (drifted) this.updatePosition();\n }\n }\n this.watchdogFrame = requestAnimationFrame(tick);\n };\n this.watchdogFrame = requestAnimationFrame(tick);\n }\n\n private stopPositionWatchdog() {\n if (this.watchdogFrame && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(this.watchdogFrame);\n }\n this.watchdogFrame = 0;\n }\n\n private hideTooltip() {\n // No spurious mdClose if it was never actually shown (e.g. hide() after a\n // show() that was suppressed by `disabled`) — keep open/close events balanced.\n if (!this.isVisible) return;\n this.isVisible = false;\n this.mdClose.emit();\n this.removeScrollListener();\n this.removeEscapeListener();\n this.stopPositionWatchdog();\n }\n\n private clearTimers() {\n if (this.showTimer != null) {\n clearTimeout(this.showTimer);\n this.showTimer = undefined;\n }\n if (this.hideTimer != null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = undefined;\n }\n }\n\n // ─── Scroll Listener ────────────────────────────────────\n\n private addScrollListener() {\n if (!this.scrollListenerBound) {\n window.addEventListener('scroll', this.handleScroll, { capture: true, passive: true });\n this.scrollListenerBound = true;\n }\n }\n\n private removeScrollListener() {\n if (this.scrollListenerBound) {\n window.removeEventListener('scroll', this.handleScroll, true);\n this.scrollListenerBound = false;\n }\n }\n\n private handleScroll = () => {\n if (this.isVisible) this.updatePosition();\n };\n\n // ─── Positioning ─────────────────────────────────────────\n\n private updatePosition(): boolean {\n if (!this.popupEl || !this.triggerEl) return false;\n\n const anchorRect = this.getAnchorRect();\n const popupW = this.popupEl.offsetWidth;\n const popupH = this.popupEl.offsetHeight;\n\n if (popupW === 0 && popupH === 0) return false;\n\n let placement = this.physicalPlacement(this.position);\n\n if (this.autoPosition) {\n placement = this.findBestPlacement(anchorRect, popupW, popupH, placement);\n }\n\n const coords = this.calcCoords(anchorRect.width, anchorRect.height, popupW, popupH, placement);\n\n // crossOffset shifts the popup along the axis PERPENDICULAR to the placement:\n // horizontal for top/bottom, vertical for left/right. Applying it to `left`\n // unconditionally moved it along the MAIN axis for left/right placements.\n if (placement.startsWith('top') || placement.startsWith('bottom')) {\n coords.left += this.crossOffset;\n } else {\n coords.top += this.crossOffset;\n }\n\n // Cross-axis clamp: nudge the popup along the axis perpendicular to the\n // placement so it stays in the viewport, instead of flipping. A centered\n // top/bottom tooltip on an edge trigger (e.g. the first/last nav chevron in\n // a docked md-date-picker) would otherwise overflow horizontally — keep the\n // requested side and shift it inward so it stays bottom and fully visible.\n if (this.autoPosition) {\n const isVertical = placement.startsWith('top') || placement.startsWith('bottom');\n const M = TOOLTIP_VIEWPORT_MARGIN;\n if (isVertical) {\n const absLeft = anchorRect.left + coords.left;\n const maxLeft = window.innerWidth - popupW - M;\n const clampedLeft = Math.min(Math.max(absLeft, M), Math.max(M, maxLeft));\n coords.left += clampedLeft - absLeft;\n } else {\n const absTop = anchorRect.top + coords.top;\n const maxTop = window.innerHeight - popupH - M;\n const clampedTop = Math.min(Math.max(absTop, M), Math.max(M, maxTop));\n coords.top += clampedTop - absTop;\n }\n }\n\n const fixedCoords = this.toFixedCoords(anchorRect.top + coords.top, anchorRect.left + coords.left);\n\n // position:fixed — use physical top/left; getBoundingClientRect is viewport-physical.\n // Logical inset-inline-start would misplace popups in RTL (inline-start is on the right).\n this.popupEl.style.top = `${fixedCoords.top}px`;\n this.popupEl.style.left = `${fixedCoords.left}px`;\n this.popupEl.style.insetBlockStart = '';\n this.popupEl.style.insetInlineStart = '';\n this.resolvedPlacement = placement as Placement;\n // Snapshot the geometry this position was computed FROM — the watchdog\n // repositions when any of it drifts. ex/ey are the intended VIEWPORT position\n // (pre containing-block conversion): if a CB later appears/vanishes at rest,\n // the popup's real rect diverges from these with no other signal.\n this.lastGeom = {\n at: anchorRect.top, al: anchorRect.left, aw: anchorRect.width, ah: anchorRect.height,\n pw: popupW, ph: popupH,\n vw: window.innerWidth, vh: window.innerHeight,\n ex: anchorRect.left + coords.left, ey: anchorRect.top + coords.top,\n };\n return true;\n }\n\n /** Prefer the slotted trigger; fall back to the tooltip host when the trigger has\n * no box. Reads the trigger rect FIRST so the common case costs one rect read —\n * this runs every watchdog frame. */\n private getAnchorRect(): DOMRect {\n if (this.triggerEl) {\n const triggerRect = this.triggerEl.getBoundingClientRect();\n if (triggerRect.width > 0 || triggerRect.height > 0) return triggerRect;\n }\n return this.el.getBoundingClientRect();\n }\n\n /**\n * `position:fixed` is viewport-relative unless an ancestor has transform/filter/perspective,\n * in which case fixed is relative to that ancestor. Convert viewport coords accordingly.\n */\n private toFixedCoords(viewportTop: number, viewportLeft: number): { top: number; left: number } {\n const containingBlock = this.getFixedContainingBlock();\n if (!containingBlock) {\n return { top: viewportTop, left: viewportLeft };\n }\n\n const cbRect = containingBlock.getBoundingClientRect();\n return {\n top: viewportTop - cbRect.top,\n left: viewportLeft - cbRect.left,\n };\n }\n\n /** Whether this element's computed style makes it a containing block for\n * position:fixed descendants. Beyond transform/filter/perspective/backdrop-filter,\n * this includes will-change of those properties (md-list-item's --shifting uses\n * will-change: transform), layout/paint containment (incl. the contain shorthands\n * and container-type, which md-app-bar uses), and content-visibility. */\n private createsFixedContainingBlock(style: CSSStyleDeclaration): boolean {\n const s = style as CSSStyleDeclaration & {\n backdropFilter?: string;\n contain?: string;\n contentVisibility?: string;\n containerType?: string;\n translate?: string;\n rotate?: string;\n scale?: string;\n };\n // NB: check truthiness too — mock-doc (spec env) returns '' for unset\n // properties, and '' !== 'none' would make every element a containing block.\n if (\n (style.transform && style.transform !== 'none') ||\n (style.filter && style.filter !== 'none') ||\n (style.perspective && style.perspective !== 'none')\n ) return true;\n // The individual transform properties create containing blocks too.\n if (\n (s.translate && s.translate !== 'none') ||\n (s.rotate && s.rotate !== 'none') ||\n (s.scale && s.scale !== 'none')\n ) return true;\n if (s.backdropFilter && s.backdropFilter !== 'none') return true;\n if (/\\b(transform|perspective|filter|translate|rotate|scale)\\b/.test(style.willChange || '')) return true;\n if (/(layout|paint|strict|content)\\b/.test(s.contain || '')) return true;\n if (s.contentVisibility === 'auto' || s.contentVisibility === 'hidden') return true;\n // Only size containment creates a containing block — `scroll-state` query\n // containers apply no containment at all.\n if (s.containerType && /\\bsize\\b/.test(s.containerType)) return true;\n return false;\n }\n\n private getFixedContainingBlock(): HTMLElement | null {\n // Start at the HOST itself — a transformed md-tooltip is the popup's containing\n // block too (the popup lives inside its shadow root).\n let node: HTMLElement | null = this.el;\n\n while (node) {\n if (this.createsFixedContainingBlock(getComputedStyle(node))) {\n return node;\n }\n\n if (node.parentElement) {\n node = node.parentElement;\n } else if (node.parentNode instanceof ShadowRoot) {\n node = node.parentNode.host as HTMLElement;\n } else {\n node = null;\n }\n }\n\n return null;\n }\n\n private physicalPlacement(placement: string): string {\n if (typeof window === 'undefined') return placement;\n const isRTL = getComputedStyle(this.el).direction === 'rtl';\n if (!isRTL) return placement;\n\n const [axis, align = ''] = [placement.split('-')[0], placement.split('-').slice(1).join('-')];\n // The placement SIDE mirrors in RTL for left/right (inline axis).\n const flippedAxis = axis === 'left' ? 'right' : axis === 'right' ? 'left' : axis;\n // The -start/-end SUFFIX is inline-axis alignment only for top/bottom placements —\n // for left/right it aligns on the BLOCK (vertical) axis, which does not mirror\n // in RTL. Flipping it there swapped top-aligned to bottom-aligned.\n const flippedAlign =\n axis === 'top' || axis === 'bottom'\n ? align === 'start' ? 'end' : align === 'end' ? 'start' : align\n : align;\n return flippedAlign ? `${flippedAxis}-${flippedAlign}` : flippedAxis;\n }\n\n private calcCoords(\n hostW: number, hostH: number,\n popupW: number, popupH: number,\n placement: string,\n ): { top: number; left: number } {\n const o = this.offset;\n\n switch (placement) {\n case 'top': return { top: -(popupH + o), left: (hostW - popupW) / 2 };\n case 'top-start': return { top: -(popupH + o), left: 0 };\n case 'top-end': return { top: -(popupH + o), left: hostW - popupW };\n case 'bottom': return { top: hostH + o, left: (hostW - popupW) / 2 };\n case 'bottom-start': return { top: hostH + o, left: 0 };\n case 'bottom-end': return { top: hostH + o, left: hostW - popupW };\n case 'left': return { top: (hostH - popupH) / 2, left: -(popupW + o) };\n case 'left-start': return { top: 0, left: -(popupW + o) };\n case 'left-end': return { top: hostH - popupH, left: -(popupW + o) };\n case 'right': return { top: (hostH - popupH) / 2, left: hostW + o };\n case 'right-start': return { top: 0, left: hostW + o };\n case 'right-end': return { top: hostH - popupH, left: hostW + o };\n default: return { top: -(popupH + o), left: (hostW - popupW) / 2 };\n }\n }\n\n /**\n * Whether the placement fits the viewport along its MAIN axis only — the axis\n * the popup is pushed along (vertical for top/bottom, horizontal for left/right).\n * Cross-axis overflow is handled by clamping in `updatePosition`, not flipping,\n * so an edge-anchored centered tooltip keeps its requested side.\n */\n private fitsMainAxis(\n hostRect: DOMRect,\n popupW: number,\n popupH: number,\n relTop: number,\n relLeft: number,\n placement: string,\n ): boolean {\n const isVertical = placement.startsWith('top') || placement.startsWith('bottom');\n if (isVertical) {\n const absTop = hostRect.top + relTop;\n return absTop >= 0 && absTop + popupH <= window.innerHeight;\n }\n const absLeft = hostRect.left + relLeft;\n return absLeft >= 0 && absLeft + popupW <= window.innerWidth;\n }\n\n private getOppositePlacement(p: string): string {\n const [axis, align] = [p.split('-')[0], p.split('-').slice(1).join('-')];\n const opp: Record<string, string> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n return align ? `${opp[axis]}-${align}` : opp[axis];\n }\n\n private findBestPlacement(\n hostRect: DOMRect,\n popupW: number,\n popupH: number,\n preferred: string,\n ): string {\n const check = (p: string) => {\n const c = this.calcCoords(hostRect.width, hostRect.height, popupW, popupH, p);\n return this.fitsMainAxis(hostRect, popupW, popupH, c.top, c.left, p);\n };\n\n if (check(preferred)) return preferred;\n\n const opposite = this.getOppositePlacement(preferred);\n if (check(opposite)) return opposite;\n\n const align = preferred.split('-')[1] || '';\n const axes = ['top', 'bottom', 'right', 'left'];\n for (const axis of axes) {\n const candidate = align ? `${axis}-${align}` : axis;\n if (candidate !== preferred && candidate !== opposite && check(candidate)) {\n return candidate;\n }\n }\n\n return preferred;\n }\n\n // ─── Render ──────────────────────────────────────────────\n\n render() {\n const isRich = this.variant === 'rich';\n const hasSubhead = !!this.subhead || this.hasSlottedSubhead;\n const hasActions = this.hasSlottedActions;\n\n return (\n <Host class=\"md-tooltip-wrapper\">\n <slot></slot>\n <div\n class={{\n 'md-tooltip__popup': true,\n 'md-tooltip__popup--plain': !isRich,\n 'md-tooltip__popup--rich': isRich,\n 'md-tooltip__popup--visible': this.isVisible,\n [`md-tooltip__popup--${this.resolvedPlacement}`]: true,\n }}\n id={this.tooltipId}\n role=\"tooltip\"\n part=\"popup\"\n aria-hidden={this.isVisible ? 'false' : 'true'}\n ref={el => (this.popupEl = el)}\n onMouseEnter={this.handlePopupEnter}\n onMouseLeave={this.handlePopupLeave}\n >\n {isRich ? ([\n hasSubhead && (\n <div class=\"md-tooltip__subhead\" part=\"subhead\" key=\"subhead\">\n <slot name=\"subhead\">{this.subhead}</slot>\n </div>\n ),\n <div class=\"md-tooltip__supporting-text\" part=\"supporting-text\" key=\"text\">\n <slot name=\"content\">{this.text}</slot>\n </div>,\n <div class={{ 'md-tooltip__actions': true, 'md-tooltip__actions--empty': !hasActions }} part=\"actions\" key=\"actions\">\n <slot name=\"actions\"></slot>\n </div>,\n ]) : (\n <span class=\"md-tooltip__text\" part=\"text\">{this.text}</span>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["mdAvatarCss","PRESET_SIZES","Set","coerceCssLength","raw","undefined","value","String","trim","test","MdAvatar","constructor","hostRef","this","src","alt","name","initials","size","shape","label","colorFromName","loading","crossorigin","density","imageFailed","handleImageError","mdError","emit","handleImageLoad","mdLoad","onSrcChange","computeInitials","truncate","tokens","split","filter","Boolean","length","firstGrapheme","toLocaleUpperCase","first","last","text","segments","segmentGraphemes","charAt","out","join","slice","max","SegmenterCtor","Intl","Segmenter","seg","granularity","segment","push","i","Math","min","hashSeed","seed","h","charCodeAt","abs","paletteIndex","accessibleLabel","v","render","hasImage","computedInitials","hasInitials","fallbackMode","a11yLabel","palette","isPresetSize","has","customSize","hostStyle","Host","key","class","style","role","part","draggable","onLoad","onError","mdTooltipCss","TOOLTIP_VIEWPORT_MARGIN","MdTooltip","subhead","variant","position","autoPosition","offset","crossOffset","open","showDelay","hideDelay","disabled","isVisible","resolvedPlacement","hasSlottedActions","hasSlottedSubhead","tooltipId","random","toString","scrollListenerBound","escapeListenerBound","hostHoverBound","hasLoaded","suppressed","onTriggerSlotChange","els","triggerSlot","assignedElements","bindTrigger","handleTriggerEnter","scheduleShow","handleTriggerLeave","scheduleHide","handleTriggerFocus","handleTriggerBlur","e","relatedTarget","el","contains","handleHostFocusOut","handlePopupEnter","clearTimers","handlePopupLeave","handleGlobalEscape","preventDefault","active","getDeepActiveElement","focusInside","triggerEl","focus","lastGeom","at","al","aw","ah","pw","ph","vw","vh","ex","ey","watchdogFrame","handleScroll","updatePosition","componentWillLoad","syncSlotFlags","componentDidLoad","setup","showTooltip","connectedCallback","addScrollListener","addEscapeListener","schedulePositionUpdate","startPositionWatchdog","shadow","shadowRoot","querySelector","addEventListener","MutationObserver","slotObserver","updateTriggerAria","observe","childList","subtree","characterData","children","Array","from","some","c","getAttribute","disconnectedCallback","stopPositionWatchdog","unbindTrigger","removeScrollListener","removeEscapeListener","removeEventListener","disconnect","onOpenChange","val","hideTooltip","onDisabledChange","removeAttribute","onDescriptionChange","show","hide","useHostHover","tag","tagName","toLowerCase","hasAttribute","tabIndex","startsWith","desc","computeDescription","setAttribute","parts","child","slot","t","textContent","showTimer","setTimeout","hideTimer","document","a","activeElement","isConnected","mdOpen","attempt","requestAnimationFrame","positioned","tick","popup","popupEl","offsetWidth","offsetHeight","getAnchorRect","p","getBoundingClientRect","g","drifted","top","left","width","height","window","innerWidth","innerHeight","cancelAnimationFrame","mdClose","clearTimeout","capture","passive","anchorRect","popupW","popupH","placement","physicalPlacement","findBestPlacement","coords","calcCoords","isVertical","M","absLeft","maxLeft","clampedLeft","absTop","maxTop","clampedTop","fixedCoords","toFixedCoords","insetBlockStart","insetInlineStart","triggerRect","viewportTop","viewportLeft","containingBlock","getFixedContainingBlock","cbRect","createsFixedContainingBlock","s","transform","perspective","translate","rotate","scale","backdropFilter","willChange","contain","contentVisibility","containerType","node","getComputedStyle","parentElement","parentNode","ShadowRoot","host","isRTL","direction","axis","align","flippedAxis","flippedAlign","hostW","hostH","o","fitsMainAxis","hostRect","relTop","relLeft","getOppositePlacement","opp","bottom","right","preferred","check","opposite","axes","candidate","isRich","hasSubhead","hasActions","id","ref","onMouseEnter","onMouseLeave"],"sources":["src/components/md-avatar/md-avatar.css?tag=md-avatar&encapsulation=shadow","src/components/md-avatar/md-avatar.tsx","src/components/md-tooltip/md-tooltip.css?tag=md-tooltip&encapsulation=shadow","src/components/md-tooltip/md-tooltip.tsx"],"sourcesContent":["/* ==========================================================\n md-avatar — Material Design 3 Avatar (AWC-UI extension)\n Reference: https://m3.material.io/styles/typography/applying-type\n + Material Components Web avatar pattern\n\n A small identity tile that resolves to the first available\n source from a clear fallback chain (see md-avatar.tsx).\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-avatar-size Square size of the host\n (overrides the preset sizes)\n --md-avatar-container-color Container fill (initials/icon mode)\n --md-avatar-container-shape Border-radius override\n --md-avatar-label-color Initials / icon color\n --md-avatar-label-font-family Initials font family\n --md-avatar-label-font-size Initials font size\n --md-avatar-label-font-weight Initials font weight\n --md-avatar-label-letter-spacing Initials letter-spacing\n --md-avatar-icon-size Icon glyph size\n --md-avatar-outline-color Optional outline color\n --md-avatar-outline-width Optional outline width (default 0)\n\n Tonal palette (used when `color-from-name` is true):\n --md-avatar-palette-{1..7}-container Container fill for that bucket\n --md-avatar-palette-{1..7}-label Label color for that bucket\n\n CSS PARTS:\n image The `<img>` element (image mode)\n initials The initials text element\n icon The fallback person icon\n\n SLOTS:\n (default) Custom fallback rendered when no src/initials are\n available (overrides the built-in person icon).\n ========================================================== */\n\n/* ==========================================================\n 1. HOST — base + custom properties\n ========================================================== */\n:host {\n /* Sizing — overridden per-variant below; authors can pin to any\n length via `--md-avatar-size` for non-preset values. */\n --_size: var(--md-avatar-size, max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px)));\n\n /* Neutral default — used when color-from-name is false or no seed. */\n --_container-color: var(\n --md-avatar-container-color,\n var(--md-sys-color-surface-container-highest, #E6E0E9)\n );\n --_label-color: var(\n --md-avatar-label-color,\n var(--md-sys-color-on-surface-variant, #49454F)\n );\n --_shape: var(--md-avatar-container-shape, 50%);\n --_icon-size: var(--md-avatar-icon-size, calc(var(--_size) * 0.6));\n --_label-font-family: var(\n --md-avatar-label-font-family,\n var(--md-sys-typescale-title-medium-font-family, system-ui, sans-serif)\n );\n --_label-font-size: var(--md-avatar-label-font-size, calc(var(--_size) * 0.4));\n --_label-font-weight: var(\n --md-avatar-label-font-weight,\n var(--md-sys-typescale-title-medium-font-weight, 500)\n );\n --_label-letter-spacing: var(--md-avatar-label-letter-spacing, 0.05em);\n --_outline-color: var(--md-avatar-outline-color, transparent);\n --_outline-width: var(--md-avatar-outline-width, 0);\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-sizing: border-box;\n vertical-align: middle;\n user-select: none;\n\n inline-size: var(--_size);\n block-size: var(--_size);\n border-radius: var(--_shape);\n background-color: var(--_container-color);\n color: var(--_label-color);\n overflow: hidden;\n position: relative;\n outline: var(--_outline-width) solid var(--_outline-color);\n outline-offset: calc(-1 * var(--_outline-width));\n}\n\n/* ==========================================================\n 2. SIZE PRESETS\n Each preset writes to --_size only; everything else (font\n size, icon size) derives from it via calc() above.\n\n Custom sizes (`size=\"72\"`, `size=\"4rem\"`, …) are forwarded by\n the TSX layer as an inline `--md-avatar-size: <length>` on the\n host. The `:host` block at the top already reads from that\n custom property, so non-preset values flow through the same\n pipeline without a dedicated rule. The\n `md-avatar--custom-size` modifier class is provided as a hook\n for callers who need to target custom-sized instances from\n their own stylesheet (e.g. `md-avatar.md-avatar--custom-size\n { --md-avatar-label-letter-spacing: 0; }`).\n ========================================================== */\n:host(.md-avatar--small) {\n --_size: var(--md-avatar-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1.5px)));\n}\n:host(.md-avatar--medium) {\n --_size: var(--md-avatar-size, max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px)));\n}\n:host(.md-avatar--large) {\n --_size: var(--md-avatar-size, max(40px, calc(56px + var(--md-sys-density-scale, 0) * 4px)));\n}\n\n/* ==========================================================\n 3. SHAPE VARIANTS\n ========================================================== */\n:host(.md-avatar--circle) {\n --_shape: var(--md-avatar-container-shape, 50%);\n}\n:host(.md-avatar--rounded) {\n --_shape: var(--md-avatar-container-shape, var(--md-sys-shape-corner-medium, 12px));\n}\n:host(.md-avatar--square) {\n --_shape: var(--md-avatar-container-shape, 0);\n}\n\n/* ==========================================================\n 4. IMAGE MODE\n ========================================================== */\n:host(.md-avatar--mode-image) {\n background-color: transparent;\n}\n\n.md-avatar__image {\n display: block;\n inline-size: 100%;\n block-size: 100%;\n object-fit: cover;\n object-position: center;\n border-radius: inherit;\n pointer-events: none;\n -webkit-user-drag: none;\n}\n\n/* ==========================================================\n 5. INITIALS MODE\n ========================================================== */\n.md-avatar__initials {\n font-family: var(--_label-font-family);\n font-size: var(--_label-font-size);\n font-weight: var(--_label-font-weight);\n letter-spacing: var(--_label-letter-spacing);\n line-height: 1;\n color: inherit;\n /* The initials inherit the host's color stack, which the palette\n modifiers below override when color-from-name resolves to a\n bucket. */\n text-transform: uppercase;\n /* M3 typography sets a baseline shift; for centered tiles we want\n pure optical centering. */\n font-feature-settings: \"tnum\";\n}\n\n/* ==========================================================\n 6. SLOT / ICON FALLBACK\n ========================================================== */\n.md-avatar__icon {\n font-family: var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');\n font-size: var(--_icon-size);\n inline-size: var(--_icon-size);\n block-size: var(--_icon-size);\n color: inherit;\n line-height: 1;\n font-weight: normal;\n font-style: normal;\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n overflow-wrap: normal;\n direction: ltr;\n -webkit-font-smoothing: antialiased;\n pointer-events: none;\n user-select: none;\n}\n\n/* Slotted custom fallback — match icon sizing. */\n/* NOT badges. A custom property inside ::slotted() resolves in the SLOTTED\n element's own scope, and md-badge defines its own `--_icon-size` (10px, for\n its glyph). So `height: var(--_icon-size) !important` here picked up the\n BADGE's 10px instead of this component's icon size and, being !important,\n beat the badge's own 16px — squashing every badge slotted onto an icon\n button / avatar / menu item into a 10px blob. A badge is not an icon; it\n sizes itself. */\n::slotted(*:not(md-badge)) {\n /* Centre the CONTENT, not just the box. The box is forced to the icon size\n above, so a slotted <span> of text kept its single line at the top of a\n 24px box and rendered visibly high — an SVG fills its box and hid the\n problem, while a bare emoji text node (not matched by ::slotted) was\n centred by the wrapper and looked fine. */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--_icon-size);\n block-size: var(--_icon-size);\n font-size: var(--_icon-size);\n color: inherit;\n fill: currentColor;\n line-height: 1;\n pointer-events: none;\n user-select: none;\n}\n\n/* ==========================================================\n 7. TONAL PALETTE\n When `color-from-name` is true and a seed (initials/name) is\n present, the host gets a `md-avatar--palette-N` class\n (N = 1..7). Each bucket uses an M3 tonal pair so light + dark\n themes follow tokens.\n\n The default palette below is built from the M3 reference\n surface-container + on-surface tonal families and the\n secondary / tertiary / primary containers so contrast pairs\n are guaranteed at AA.\n ========================================================== */\n:host(.md-avatar--palette-1) {\n --_container-color: var(\n --md-avatar-palette-1-container,\n var(--md-sys-color-primary-container, #EADDFF)\n );\n --_label-color: var(\n --md-avatar-palette-1-label,\n var(--md-sys-color-on-primary-container, #21005D)\n );\n}\n:host(.md-avatar--palette-2) {\n --_container-color: var(\n --md-avatar-palette-2-container,\n var(--md-sys-color-secondary-container, #E8DEF8)\n );\n --_label-color: var(\n --md-avatar-palette-2-label,\n var(--md-sys-color-on-secondary-container, #1D192B)\n );\n}\n:host(.md-avatar--palette-3) {\n --_container-color: var(\n --md-avatar-palette-3-container,\n var(--md-sys-color-tertiary-container, #FFD8E4)\n );\n --_label-color: var(\n --md-avatar-palette-3-label,\n var(--md-sys-color-on-tertiary-container, #31111D)\n );\n}\n:host(.md-avatar--palette-4) {\n --_container-color: var(\n --md-avatar-palette-4-container,\n var(--md-sys-color-error-container, #F9DEDC)\n );\n --_label-color: var(\n --md-avatar-palette-4-label,\n var(--md-sys-color-on-error-container, #410E0B)\n );\n}\n/* Palettes 5/6/7 are soft tints of the primary / tertiary / secondary\n tones. They were originally mixed against `transparent` for a \"tinted\n chip\" look on a white surface, but that made the tile visibly\n see-through whenever it overlapped another element (e.g. inside an\n avatar group), which broke the bite-mark stacking. We now mix the\n accent tone into `--md-sys-color-surface` instead so the resulting\n color is fully opaque AND theme-aware (dark theme → tint of the dark\n surface). The visible tint stays nearly identical to the previous\n value on a default light surface.\n\n The initials label used the raw accent tone, which lands at only\n ~4.45:1 against the 22% tint container — just under WCAG AA (4.5:1).\n We deepen the label toward `--md-sys-color-on-surface` (dark in light\n theme, light in dark theme) so it clears AA (~6:1 light / ~7:1 dark)\n in both themes while keeping the accent hue recognizably distinct.\n Authors overriding `--md-avatar-palette-N-label` own their own\n contrast. */\n:host(.md-avatar--palette-5) {\n --_container-color: var(\n --md-avatar-palette-5-container,\n color-mix(in srgb, var(--md-sys-color-primary, #6750A4) 22%, var(--md-sys-color-surface, #FEF7FF))\n );\n --_label-color: var(\n --md-avatar-palette-5-label,\n color-mix(in srgb, var(--md-sys-color-primary, #6750A4) 72%, var(--md-sys-color-on-surface, #1C1B1F))\n );\n}\n:host(.md-avatar--palette-6) {\n --_container-color: var(\n --md-avatar-palette-6-container,\n color-mix(in srgb, var(--md-sys-color-tertiary, #7D5260) 22%, var(--md-sys-color-surface, #FEF7FF))\n );\n --_label-color: var(\n --md-avatar-palette-6-label,\n color-mix(in srgb, var(--md-sys-color-tertiary, #7D5260) 72%, var(--md-sys-color-on-surface, #1C1B1F))\n );\n}\n:host(.md-avatar--palette-7) {\n --_container-color: var(\n --md-avatar-palette-7-container,\n color-mix(in srgb, var(--md-sys-color-secondary, #625B71) 22%, var(--md-sys-color-surface, #FEF7FF))\n );\n --_label-color: var(\n --md-avatar-palette-7-label,\n color-mix(in srgb, var(--md-sys-color-secondary, #625B71) 72%, var(--md-sys-color-on-surface, #1C1B1F))\n );\n}\n\n/* ==========================================================\n 8. REDUCED MOTION / FORCED COLORS\n ========================================================== */\n@media (forced-colors: active) {\n :host {\n --_container-color: ButtonFace;\n --_label-color: ButtonText;\n --_outline-color: ButtonText;\n --_outline-width: 1px;\n }\n}\n\n/* ==========================================================\n DENSITY (local override)\n Maps the local `density` prop onto the same --md-sys-density-scale signal a\n global `data-density` ancestor sets. Declared on :host, so a local rung wins\n over the inherited global one. Every density-sensitive value in this file\n derives from that single signal by calc — never add a fixed per-rung ladder.\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 { Component, Host, h, Prop, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\n\n/**\n * Preset size buckets. Map to MD3 reference dimensions (24/40/56dp).\n */\nexport type MdAvatarPresetSize = 'small' | 'medium' | 'large';\n\n/**\n * The `size` prop accepts either a named preset (`'small' | 'medium' | 'large'`)\n * or an arbitrary CSS length / unitless number for a fully-custom dimension.\n *\n * `<md-avatar size=\"medium\" />` → 40 × 40\n * `<md-avatar size=\"72\" />` → 72 × 72 (unitless → px)\n * `<md-avatar size=\"4rem\" />` → 4rem (any CSS length)\n * `<md-avatar size=\"clamp(28px, 4vw, 72px)\" />` → CSS function passes through\n *\n * The `(string & {})` intersection keeps autocomplete on the three presets\n * while still accepting any string at the type level.\n */\nexport type MdAvatarSize = MdAvatarPresetSize | (string & {});\n\nexport type MdAvatarShape = 'circle' | 'rounded' | 'square';\n\nconst PRESET_SIZES: ReadonlySet<string> = new Set(['small', 'medium', 'large']);\n\n/**\n * Coerce a free-form size value into a CSS length string.\n *\n * \"72\" → \"72px\"\n * \"72.5\" → \"72.5px\"\n * \"4rem\" → \"4rem\" (already a length)\n * \"min(72px,8vw)\" → \"min(72px,8vw)\" (CSS function passes through)\n * \"\" / null → undefined (caller falls back to preset)\n */\nfunction coerceCssLength(raw: string | number | null | undefined): string | undefined {\n if (raw == null) return undefined;\n const value = String(raw).trim();\n if (!value) return undefined;\n // Pure number (integer or decimal, optional sign) → px.\n if (/^-?\\d*\\.?\\d+$/.test(value)) return `${value}px`;\n return value;\n}\n\n/**\n * `md-avatar` — a presentational identity tile that resolves the first\n * available source from a clear fallback chain:\n *\n * 1. `src` (image) → `<img>` is rendered.\n * On error/empty, automatically falls through to step 2.\n * 2. `initials` → explicit initials string (verbatim, max 3 chars).\n * 3. `name` → auto-derived initials. Two tokens → first letter\n * of each; one token → first letter only. RTL- and\n * diacritic-safe via `Intl.Segmenter` when available.\n * 4. default slot → caller-provided fallback (icon, emoji, SVG).\n * 5. person icon → material-symbols fallback (always available).\n */\n@Component({\n tag: 'md-avatar',\n styleUrl: 'md-avatar.css',\n shadow: true,\n})\nexport class MdAvatar {\n @Element() el!: HTMLElement;\n\n /** Image URL. When set, the avatar renders as an `<img>` element. */\n @Prop() src: string = '';\n\n /**\n * Alternative text for the image. When empty, the image is exposed to\n * AT as decorative (`aria-hidden`); the host carries the accessible\n * label instead (see `label`).\n */\n @Prop() alt: string = '';\n\n /**\n * Full name. The component derives initials automatically:\n * - `\"Ada Lovelace\"` → `\"AL\"`\n * - `\"Cher\"` → `\"C\"`\n * - `\" john doe\"` → `\"JD\"`\n *\n * Honored only when `src` is not set (or fails to load) and\n * `initials` is empty.\n */\n @Prop() name: string = '';\n\n /**\n * Explicit initials override. Bypasses the `name` parsing entirely.\n * Truncated to the first 3 grapheme clusters at render time so a\n * stray \"WXYZ\" can't blow out the layout.\n */\n @Prop() initials: string = '';\n\n /**\n * Avatar size. Accepts either a named preset or any CSS length.\n *\n * Presets:\n * - `small` — 24×24 (typography: label-medium)\n * - `medium` — 40×40 (typography: title-medium) [default]\n * - `large` — 56×56 (typography: title-large)\n *\n * Custom values:\n * - Unitless number → pixels (`size=\"72\"` → 72px)\n * - Any CSS length → passes through (`size=\"4rem\"`, `size=\"10vw\"`,\n * `size=\"clamp(28px, 4vw, 72px)\"`)\n *\n * Custom values are wired through the existing `--md-avatar-size` CSS\n * custom property, so per-instance overrides via `style` / class still\n * win when set.\n */\n @Prop({ reflect: true }) size: MdAvatarSize = 'medium';\n\n /**\n * Container shape.\n * - `circle` — fully rounded (`50%`) [default]\n * - `rounded` — `--md-sys-shape-corner-medium` (12dp)\n * - `square` — sharp corners (`0`)\n */\n @Prop({ reflect: true }) shape: MdAvatarShape = 'circle';\n\n /**\n * Accessible label for the avatar. When empty:\n * - if `alt` is set, that is exposed instead\n * - if `name` is set, that is exposed instead\n * - otherwise the avatar is hidden from AT (`role=\"presentation\"`)\n * so it doesn't add noise next to a labelled control.\n */\n @Prop() label: string = '';\n\n /**\n * When `true` the avatar background is deterministically picked from a\n * tonal palette using the initials/name as a hash seed. When `false`,\n * the avatar uses the neutral on-surface tone.\n */\n @Prop({ attribute: 'color-from-name', reflect: true }) colorFromName: boolean = true;\n\n /** `<img>` `loading` attribute. */\n @Prop() loading: 'eager' | 'lazy' = 'lazy';\n\n /** `<img>` `crossorigin` attribute (forwarded only when set). */\n @Prop() crossorigin: '' | 'anonymous' | 'use-credentials' = '';\n\n /**\n * Local density rung. Drives the same `--md-sys-density-scale` signal that a\n * global `data-density` ancestor sets, so a local value simply overrides the\n * inherited one. 0 = default, -4 = ultra-compact.\n */\n @Prop({ reflect: true }) density: 0 | -1 | -2 | -3 | -4 = 0;\n\n /** Image successfully loaded. */\n @Event() mdLoad: EventEmitter<{ src: string }>;\n\n /** Image failed to load — component fell back to initials/icon. */\n @Event() mdError: EventEmitter<{ src: string }>;\n\n /** Internal: whether the image src failed (triggers fallback). */\n @State() private imageFailed = false;\n\n @Watch('src')\n onSrcChange() {\n this.imageFailed = false;\n }\n\n private computeInitials(): string {\n if (this.initials) return this.truncate(this.initials.trim());\n\n const name = (this.name || '').trim();\n if (!name) return '';\n\n const tokens = name.split(/\\s+/).filter(Boolean);\n if (tokens.length === 0) return '';\n\n if (tokens.length === 1) {\n return this.firstGrapheme(tokens[0]).toLocaleUpperCase();\n }\n\n const first = this.firstGrapheme(tokens[0]);\n const last = this.firstGrapheme(tokens[tokens.length - 1]);\n return (first + last).toLocaleUpperCase();\n }\n\n /** First grapheme cluster, RTL- and emoji-safe when Intl.Segmenter is present. */\n private firstGrapheme(text: string): string {\n if (!text) return '';\n const segments = this.segmentGraphemes(text, 1);\n return segments[0] ?? text.charAt(0);\n }\n\n private truncate(text: string): string {\n const out = this.segmentGraphemes(text, 3);\n if (out.length > 0) return out.join('').toLocaleUpperCase();\n return text.slice(0, 3).toLocaleUpperCase();\n }\n\n /**\n * Yields up to `max` grapheme clusters from `text`. Uses Intl.Segmenter\n * when available (every evergreen browser since 2022); falls back to\n * `charAt` on the off chance the runtime lacks it.\n */\n private segmentGraphemes(text: string, max: number): string[] {\n interface SegLike {\n segment(input: string): Iterable<{ segment: string }>;\n }\n interface SegCtor {\n new (locale?: unknown, options?: { granularity?: string }): SegLike;\n }\n const SegmenterCtor = (Intl as unknown as { Segmenter?: SegCtor }).Segmenter;\n const out: string[] = [];\n if (typeof SegmenterCtor === 'function') {\n try {\n const seg = new SegmenterCtor(undefined, { granularity: 'grapheme' });\n for (const { segment } of seg.segment(text)) {\n out.push(segment);\n if (out.length === max) break;\n }\n return out;\n } catch {\n /* fall through */\n }\n }\n for (let i = 0; i < Math.min(max, text.length); i++) {\n out.push(text.charAt(i));\n }\n return out;\n }\n\n /**\n * Deterministic hash → palette index. Same seed → same color across\n * sessions/devices so a given user always has the same avatar tint.\n */\n private hashSeed(seed: string): number {\n let h = 0;\n for (let i = 0; i < seed.length; i++) {\n h = (h << 5) - h + seed.charCodeAt(i);\n h |= 0;\n }\n return Math.abs(h);\n }\n\n /** 1-based palette index (1..7) matching the CSS palette variables. */\n private get paletteIndex(): number {\n if (!this.colorFromName) return 0;\n const seed = (this.initials || this.name || this.label || '').trim();\n if (!seed) return 0;\n return (this.hashSeed(seed) % 7) + 1;\n }\n\n private handleImageError = () => {\n this.imageFailed = true;\n this.mdError.emit({ src: this.src });\n };\n\n private handleImageLoad = () => {\n this.imageFailed = false;\n this.mdLoad.emit({ src: this.src });\n };\n\n private get accessibleLabel(): string | undefined {\n const v = (this.label || this.alt || this.name || '').trim();\n return v || undefined;\n }\n\n render() {\n const hasImage = !!this.src && !this.imageFailed;\n const computedInitials = this.computeInitials();\n const hasInitials = !hasImage && !!computedInitials;\n const fallbackMode: 'image' | 'initials' | 'slot' = hasImage\n ? 'image'\n : hasInitials\n ? 'initials'\n : 'slot';\n\n const a11yLabel = this.accessibleLabel;\n const palette = this.paletteIndex;\n\n // Resolve `size`: presets emit a `md-avatar--{preset}` modifier class\n // and rely on the CSS-defined token defaults; everything else is treated\n // as a CSS length and pushed into `--md-avatar-size` so the existing\n // sizing pipeline (which already cascades through that custom property)\n // picks it up automatically. We deliberately set the inline style at\n // the lowest possible level (`Host`) so an author's `style=\"--md-avatar-size: …\"`\n // or class-based override still wins via CSS specificity.\n const isPresetSize = PRESET_SIZES.has(String(this.size));\n const customSize = isPresetSize ? undefined : coerceCssLength(this.size);\n const hostStyle = customSize ? { '--md-avatar-size': customSize } : undefined;\n\n return (\n <Host\n class={{\n 'md-avatar': true,\n [`md-avatar--${this.size}`]: isPresetSize,\n 'md-avatar--custom-size': !isPresetSize && !!customSize,\n [`md-avatar--${this.shape}`]: true,\n [`md-avatar--mode-${fallbackMode}`]: true,\n [`md-avatar--palette-${palette}`]: palette > 0 && fallbackMode !== 'image',\n 'md-avatar--has-image': hasImage,\n }}\n style={hostStyle}\n role={a11yLabel ? 'img' : 'presentation'}\n aria-label={a11yLabel}\n aria-hidden={a11yLabel ? null : 'true'}\n >\n {fallbackMode === 'image' && (\n <img\n class=\"md-avatar__image\"\n part=\"image\"\n src={this.src}\n alt={this.alt || ''}\n loading={this.loading}\n crossorigin={this.crossorigin || undefined}\n aria-hidden=\"true\"\n draggable={false}\n onLoad={this.handleImageLoad}\n onError={this.handleImageError}\n />\n )}\n\n {fallbackMode === 'initials' && (\n <span class=\"md-avatar__initials\" part=\"initials\" aria-hidden=\"true\">\n {computedInitials}\n </span>\n )}\n\n {fallbackMode === 'slot' && (\n <slot>\n <span class=\"md-avatar__icon material-symbols-outlined\" part=\"icon\" aria-hidden=\"true\">\n person\n </span>\n </slot>\n )}\n </Host>\n );\n }\n}\n","/* ==========================================================\n md-tooltip — Material Design 3 Tooltip\n Spec: https://m3.material.io/components/tooltips/specs\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-tooltip-plain-container-color Plain tooltip background\n --md-tooltip-plain-text-color Plain tooltip text color\n --md-tooltip-rich-container-color Rich tooltip background\n --md-tooltip-rich-subhead-color Rich subhead text color\n --md-tooltip-rich-text-color Rich supporting text color\n --md-tooltip-rich-action-color Rich action button color\n --md-tooltip-container-shape Border-radius (plain)\n --md-tooltip-plain-max-inline-size Plain tooltip max width\n --md-tooltip-rich-container-shape Border-radius (rich)\n --md-tooltip-rich-min-inline-size Rich tooltip min width\n --md-tooltip-rich-max-inline-size Rich tooltip max width\n\n CSS PARTS:\n popup Tooltip popup container\n subhead Rich tooltip subhead wrapper\n supporting-text Rich tooltip supporting text wrapper\n actions Rich tooltip action button wrapper\n text Plain tooltip text wrapper\n\n SLOTS:\n (default) Trigger element\n content Rich tooltip supporting text\n subhead Rich tooltip subhead\n actions Rich tooltip action buttons\n ========================================================== */\n\n/* ==========================================================\n 1. HOST\n ========================================================== */\n\n:host {\n display: inline-block;\n position: relative;\n}\n\n/* ==========================================================\n 2. POPUP — shared base\n ========================================================== */\n\n.md-tooltip__popup {\n /* Fixed + viewport coords (set in JS) so popups escape overflow:hidden ancestors. */\n position: fixed;\n z-index: var(--md-sys-z-index-tooltip, 1500);\n pointer-events: none;\n box-sizing: border-box;\n /* CRITICAL: width must not depend on the popup's own offsets. With width:auto, a\n fixed element shrink-to-fits into (containing block − left), so writing `left`\n changes the width, which re-wraps the text, which the position watchdog sees as\n drift and repositions — an animated wrap/slide feedback loop that crawls the\n popup across the screen one frame at a time. max-content sizes from the CONTENT\n only (the variant max-inline-size caps still bound it), decoupling measurement\n from position: one measure, one placement, no loop. */\n width: max-content;\n\n opacity: 0;\n visibility: hidden;\n transform: scale(0.9);\n\n transition:\n opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n transform var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n visibility 0ms linear var(--md-sys-motion-duration-short2, 100ms);\n}\n\n.md-tooltip__popup--visible {\n opacity: 1;\n visibility: visible;\n transform: scale(1);\n pointer-events: auto;\n transition:\n opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n transform var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease),\n visibility 0ms linear 0ms;\n}\n\n/* ==========================================================\n 3. PLAIN TOOLTIP\n Spec: height 24px (via padding), padding 8px, body-small\n ========================================================== */\n\n.md-tooltip__popup--plain {\n --_container-color: var(--md-tooltip-plain-container-color, var(--md-sys-color-inverse-surface, #313033));\n --_text-color: var(--md-tooltip-plain-text-color, var(--md-sys-color-inverse-on-surface, #F4EFF4));\n --_shape: var(--md-tooltip-container-shape, var(--md-sys-shape-corner-extra-small, 4px));\n\n background-color: var(--_container-color);\n color: var(--_text-color);\n border-radius: var(--_shape);\n\n /* Global density: on-grid padding tracks --md-sys-spacing-* (4/8 = inset-xs/sm);\n defaults resolve byte-for-byte at density 0. min-block-size stays the 24px\n spec height floor. */\n padding-block: var(--md-sys-spacing-inset-xs, 4px);\n padding-inline: var(--md-sys-spacing-inset-sm, 8px);\n\n min-block-size: max(20px, calc(24px + var(--md-sys-density-scale, 0) * 1px));\n max-inline-size: min(var(--md-tooltip-plain-max-inline-size, 280px), calc(100vw - 16px));\n\n font-family: var(--md-sys-typescale-body-small-font-family, Roboto, sans-serif);\n font-size: max(10px, calc(12px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-small-font-weight, 400);\n line-height: max(14px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n letter-spacing: var(--md-sys-typescale-body-small-letter-spacing, 0.4px);\n\n /* Wrap long content over multiple lines instead of clipping it. The plain\n tooltip is the overflow tooltip used by md-list-item, so it must reveal\n the FULL text. `max-inline-size` caps the line length (280px default here,\n overridable per-instance) and the content wraps below it rather than\n truncating with an ellipsis. */\n white-space: normal;\n display: flex;\n align-items: center;\n}\n\n.md-tooltip__text {\n /* No ellipsis / overflow clipping — let the popup grow vertically and wrap.\n `overflow-wrap: anywhere` keeps an unbroken long word (URLs, IDs) from\n forcing the popup wider than its max-inline-size. */\n overflow-wrap: anywhere;\n}\n\n/* ==========================================================\n 4. RICH TOOLTIP\n Spec: top padding 12px, bottom 8px, left/right 16px\n ========================================================== */\n\n.md-tooltip__popup--rich {\n --_container-color: var(--md-tooltip-rich-container-color, var(--md-sys-color-surface-container, #F3EDF7));\n --_subhead-color: var(--md-tooltip-rich-subhead-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_text-color: var(--md-tooltip-rich-text-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_action-color: var(--md-tooltip-rich-action-color, var(--md-sys-color-primary, #6750A4));\n --_shape: var(--md-tooltip-rich-container-shape, var(--md-sys-shape-corner-medium, 12px));\n\n background-color: var(--_container-color);\n color: var(--_text-color);\n border-radius: var(--_shape);\n\n /* Global density: on-grid rich padding tracks --md-sys-spacing-*\n (12/8/16 = inset-md/sm/lg); defaults resolve byte-for-byte at density 0. */\n padding-block-start: var(--md-sys-spacing-inset-md, 12px);\n padding-block-end: var(--md-sys-spacing-inset-sm, 8px);\n padding-inline: var(--md-sys-spacing-inset-lg, 16px);\n\n min-inline-size: var(--md-tooltip-rich-min-inline-size, 120px);\n max-inline-size: min(var(--md-tooltip-rich-max-inline-size, 320px), calc(100vw - 16px));\n\n white-space: normal;\n box-shadow: var(--md-sys-elevation-2, 0 1px 3px 1px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.3));\n}\n\n/* Subhead */\n.md-tooltip__subhead {\n font-family: var(--md-sys-typescale-title-small-font-family, Roboto, sans-serif);\n font-size: max(11px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-title-small-font-weight, 500);\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n letter-spacing: var(--md-sys-typescale-title-small-letter-spacing, 0.1px);\n color: var(--_subhead-color);\n margin-block-end: var(--md-sys-spacing-gap-xs, 4px);\n}\n\n/* Supporting text */\n.md-tooltip__supporting-text {\n font-family: var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif);\n font-size: max(11px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-medium-font-weight, 400);\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 color: var(--_text-color);\n}\n\n/* Actions */\n.md-tooltip__actions {\n display: flex;\n gap: var(--md-sys-spacing-gap-sm, 8px);\n justify-content: flex-end;\n margin-block-start: var(--md-sys-spacing-gap-md, 12px);\n color: var(--_action-color);\n}\n\n.md-tooltip__actions--empty {\n display: none;\n}\n\n/* Slotted action buttons */\n::slotted([slot=\"actions\"]) {\n color: var(--_action-color);\n}\n\n/* ==========================================================\n 5. PLACEMENT — transform-origin for enter animation\n Position is set inline via JS; these handle animation origin.\n ========================================================== */\n\n.md-tooltip__popup--top,\n.md-tooltip__popup--top-start,\n.md-tooltip__popup--top-end {\n transform-origin: bottom center;\n}\n\n.md-tooltip__popup--bottom,\n.md-tooltip__popup--bottom-start,\n.md-tooltip__popup--bottom-end {\n transform-origin: top center;\n}\n\n.md-tooltip__popup--left,\n.md-tooltip__popup--left-start,\n.md-tooltip__popup--left-end {\n transform-origin: center right;\n}\n\n.md-tooltip__popup--right,\n.md-tooltip__popup--right-start,\n.md-tooltip__popup--right-end {\n transform-origin: center left;\n}\n\n/* ==========================================================\n 6. RTL\n NB: no transform-origin overrides here. The placement classes are already\n PHYSICAL — JS (physicalPlacement) maps logical placements per direction\n before resolving the class — so the base origins in section 5 always face\n the trigger. The old :host-context([dir=rtl]) re-flip double-flipped them,\n making the entrance scale grow from the edge facing AWAY from the trigger.\n ========================================================== */\n\n:host-context([dir=\"rtl\"]) .md-tooltip__actions {\n justify-content: flex-start;\n}\n\n/* ==========================================================\n 7. FORCED COLORS (Windows High Contrast)\n The popup is a background + elevation surface — both are dropped in\n forced-colors mode, leaving the tooltip text floating with no boundary\n over the page. Give it a system-color border so the region stays\n perceivable (matches the md-toolbar hardened convention).\n ========================================================== */\n\n@media (forced-colors: active) {\n .md-tooltip__popup {\n border: 1px solid CanvasText;\n }\n}\n\n/* ==========================================================\n 8. REDUCED MOTION\n Honor a reduced-motion preference by dropping the scale/opacity\n entrance so the tooltip appears/disappears instantly instead of\n animating on every hover (md-list-item mounts a tooltip per row).\n ========================================================== */\n\n@media (prefers-reduced-motion: reduce) {\n .md-tooltip__popup,\n .md-tooltip__popup--visible {\n transition: none;\n transform: none;\n }\n}\n\n/* ==========================================================\n DENSITY (local override)\n Maps the local `density` prop onto the same --md-sys-density-scale signal a\n global `data-density` ancestor sets. Declared on :host, so a local rung wins\n over the inherited global one. Every density-sensitive value in this file\n derives from that single signal by calc — never add a fixed per-rung ladder.\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 { Component, Host, h, Prop, State, Event, EventEmitter, Element, Method, Watch } from '@stencil/core';\n\nexport type Placement =\n | 'top' | 'top-start' | 'top-end'\n | 'bottom' | 'bottom-start' | 'bottom-end'\n | 'left' | 'left-start' | 'left-end'\n | 'right' | 'right-start' | 'right-end';\n\n/** Minimum gap kept between a popup and the viewport edge when cross-axis clamping. */\nconst TOOLTIP_VIEWPORT_MARGIN = 8;\n\n/**\n * @slot - Trigger element the tooltip is anchored to\n * @slot content - Rich tooltip supporting text (overrides `text` prop)\n * @slot subhead - Rich tooltip subhead (overrides `subhead` prop)\n * @slot actions - Rich tooltip action buttons\n *\n * @part popup - Tooltip popup container\n * @part subhead - Rich tooltip subhead wrapper\n * @part supporting-text - Rich tooltip supporting text wrapper\n * @part actions - Rich tooltip action button wrapper\n * @part text - Plain tooltip text wrapper\n */\n@Component({\n tag: 'md-tooltip',\n styleUrl: 'md-tooltip.css',\n shadow: true,\n})\nexport class MdTooltip {\n @Element() el!: HTMLElement;\n\n /** Plain tooltip text, or rich tooltip supporting text */\n @Prop() text: string = '';\n\n /** Rich tooltip subhead (headline) */\n @Prop() subhead: string = '';\n\n /** Visual variant */\n @Prop({ reflect: true }) variant: 'plain' | 'rich' = 'plain';\n\n /** Preferred placement relative to the trigger */\n @Prop() position: Placement = 'top';\n\n /** Automatically reposition if overflowing the viewport */\n @Prop() autoPosition: boolean = true;\n\n /** Distance from the trigger in pixels */\n @Prop() offset: number = 8;\n\n /** Cross-axis offset in pixels */\n @Prop() crossOffset: number = 0;\n\n /** Programmatic open state */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /** Delay before showing (ms) */\n @Prop() showDelay: number = 500;\n\n /** Delay before hiding (ms) — for rich variant hover-out grace period */\n @Prop() hideDelay: number = 200;\n\n /** When true, hover/focus handlers are ignored and any open tooltip is dismissed. */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /**\n * Local density rung. Drives the same `--md-sys-density-scale` signal that a\n * global `data-density` ancestor sets, so a local value simply overrides the\n * inherited one. 0 = default, -4 = ultra-compact.\n */\n @Prop({ reflect: true }) density: 0 | -1 | -2 | -3 | -4 = 0;\n\n /**\n * Emits when the tooltip becomes visible. `bubbles:false` + `composed:false` keep it\n * from crossing the shadow boundary and retargeting onto an embedding host (the repo's\n * documented composed-event-leak class — see md-date-picker's swallow guards).\n */\n @Event({ bubbles: false, composed: false }) mdOpen: EventEmitter<void>;\n\n /** Emits when the tooltip is dismissed (does not bubble or cross shadow boundaries). */\n @Event({ bubbles: false, composed: false }) mdClose: EventEmitter<void>;\n\n @State() private isVisible = false;\n @State() private resolvedPlacement: Placement = 'top';\n @State() private hasSlottedActions = false;\n @State() private hasSlottedSubhead = false;\n\n private popupEl?: HTMLElement;\n private triggerEl?: HTMLElement;\n private triggerSlot?: HTMLSlotElement;\n private slotObserver?: MutationObserver;\n private showTimer?: ReturnType<typeof setTimeout>;\n private hideTimer?: ReturnType<typeof setTimeout>;\n private tooltipId = `md-tooltip-${Math.random().toString(36).slice(2, 9)}`;\n private scrollListenerBound = false;\n private escapeListenerBound = false;\n private hostHoverBound = false;\n private hasLoaded = false;\n /** Set on Escape dismissal; blocks re-show until the pointer/focus leaves the trigger. */\n private suppressed = false;\n\n // ─── Lifecycle ───────────────────────────────────────────\n\n componentWillLoad() {\n // Seed slot flags + visible state BEFORE the first render so the didLoad setup()\n // re-computes them to the same values — a no-op write rather than a state change\n // during componentDidLoad (which triggers Stencil's extra-re-render warning).\n // Honor `disabled`: a disabled tooltip must never render visible, and seeding\n // isVisible while disabled would also leak an unbalanced mdClose on the next hide.\n this.syncSlotFlags();\n if (this.open && !this.disabled) this.isVisible = true;\n }\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.setup();\n if (this.open) this.showTooltip();\n }\n\n connectedCallback() {\n // On a REPARENT (disconnect→connect after first load), re-establish bindings —\n // componentDidLoad runs only once, so without this a moved tooltip goes dead.\n if (!this.hasLoaded) return;\n this.setup();\n // If the tooltip was still visible when it was moved, disconnectedCallback tore\n // down its scroll/Escape listeners without hiding it — restore them and reposition\n // against the moved trigger so it isn't stranded open, undismissable and detached.\n if (this.isVisible && !this.disabled) {\n this.addScrollListener();\n this.addEscapeListener();\n this.schedulePositionUpdate();\n this.startPositionWatchdog();\n } else if (this.open && !this.isVisible && !this.disabled) {\n // `open` was set while the element was DETACHED (showTooltip refuses to bind\n // global listeners there) — honor it now that we are connected again.\n this.showTooltip();\n }\n }\n\n /** (Re)attach trigger binding, slot detection and the host focusout listener. */\n private setup() {\n const shadow = this.el.shadowRoot;\n if (!shadow) return;\n\n this.triggerSlot = (shadow.querySelector('slot:not([name])') as HTMLSlotElement | null) ?? undefined;\n // addEventListener dedupes identical (fn, capture) pairs, so a re-setup is safe.\n this.triggerSlot?.addEventListener('slotchange', this.onTriggerSlotChange);\n this.el.addEventListener('focusout', this.handleHostFocusOut);\n\n // Rich content is authored in light DOM regardless of variant, so detect it there —\n // the shadow content/subhead/actions slots only exist while variant=\"rich\" renders,\n // which is why shadow-slot detection missed a runtime plain→rich switch.\n this.syncSlotFlags();\n if (typeof MutationObserver !== 'undefined' && !this.slotObserver) {\n // childList catches slotted content add/remove; subtree+characterData catches\n // edits to slotted text so a slot-only rich tooltip's aria-description stays fresh.\n this.slotObserver = new MutationObserver(() => {\n this.syncSlotFlags();\n if (this.triggerEl) this.updateTriggerAria(this.triggerEl);\n });\n this.slotObserver.observe(this.el, { childList: true, subtree: true, characterData: true });\n }\n\n const first = this.triggerSlot?.assignedElements()[0] as HTMLElement | undefined;\n if (first) this.bindTrigger(first);\n }\n\n private onTriggerSlotChange = () => {\n const els = this.triggerSlot?.assignedElements();\n if (els && els.length > 0) this.bindTrigger(els[0] as HTMLElement);\n };\n\n private syncSlotFlags() {\n // Direct-child scan (not `:scope >`, which Stencil's mock-doc can't parse).\n const children = Array.from(this.el.children);\n this.hasSlottedActions = children.some((c) => c.getAttribute('slot') === 'actions');\n this.hasSlottedSubhead = children.some((c) => c.getAttribute('slot') === 'subhead');\n }\n\n disconnectedCallback() {\n this.clearTimers();\n this.stopPositionWatchdog();\n this.unbindTrigger();\n this.removeScrollListener();\n this.removeEscapeListener();\n this.el.removeEventListener('focusout', this.handleHostFocusOut);\n this.triggerSlot?.removeEventListener('slotchange', this.onTriggerSlotChange);\n this.triggerSlot = undefined;\n this.slotObserver?.disconnect();\n this.slotObserver = undefined;\n }\n\n // ─── Watchers ────────────────────────────────────────────\n\n @Watch('open')\n onOpenChange(val: boolean) {\n if (val) {\n this.showTooltip();\n } else {\n this.hideTooltip();\n }\n }\n\n @Watch('disabled')\n onDisabledChange(disabled: boolean) {\n if (disabled) {\n this.clearTimers();\n if (this.open) this.open = false;\n this.triggerEl?.removeAttribute('aria-description');\n } else if (this.triggerEl) {\n this.updateTriggerAria(this.triggerEl);\n }\n }\n\n /** Keep the trigger's aria-description in sync when the tooltip's text changes\n * after binding (bindTrigger and the disabled watcher were the only refreshers). */\n @Watch('text')\n @Watch('subhead')\n onDescriptionChange() {\n if (this.triggerEl) this.updateTriggerAria(this.triggerEl);\n }\n\n // ─── Public Methods ──────────────────────────────────────\n\n /** Show the tooltip programmatically (no-op while `disabled`). */\n @Method()\n async show() {\n // Don't flip `open` (a reflected attribute) true while disabled — showTooltip\n // would early-return, leaving open=true with nothing visible (a state desync).\n if (this.disabled) return;\n this.open = true;\n }\n\n /** Dismiss the tooltip programmatically. */\n @Method()\n async hide() {\n this.open = false;\n }\n\n // ─── Trigger Binding ─────────────────────────────────────\n\n private bindTrigger(el: HTMLElement) {\n this.unbindTrigger();\n this.triggerEl = el;\n\n // Presentational triggers (e.g. weekday spans) are not focusable; hover the host instead.\n if (this.useHostHover(el)) {\n this.el.addEventListener('mouseenter', this.handleTriggerEnter);\n this.el.addEventListener('mouseleave', this.handleTriggerLeave);\n this.hostHoverBound = true;\n } else {\n el.addEventListener('mouseenter', this.handleTriggerEnter);\n el.addEventListener('mouseleave', this.handleTriggerLeave);\n }\n\n el.addEventListener('focus', this.handleTriggerFocus);\n el.addEventListener('blur', this.handleTriggerBlur);\n this.updateTriggerAria(el);\n }\n\n private unbindTrigger() {\n if (this.hostHoverBound) {\n this.el.removeEventListener('mouseenter', this.handleTriggerEnter);\n this.el.removeEventListener('mouseleave', this.handleTriggerLeave);\n this.hostHoverBound = false;\n } else if (this.triggerEl) {\n this.triggerEl.removeEventListener('mouseenter', this.handleTriggerEnter);\n this.triggerEl.removeEventListener('mouseleave', this.handleTriggerLeave);\n }\n\n if (!this.triggerEl) return;\n\n this.triggerEl.removeEventListener('focus', this.handleTriggerFocus);\n this.triggerEl.removeEventListener('blur', this.handleTriggerBlur);\n this.triggerEl.removeAttribute('aria-description');\n this.triggerEl = undefined;\n }\n\n /** True when hover should be tracked on the tooltip host (non-interactive triggers). */\n private useHostHover(el: HTMLElement): boolean {\n const tag = el.tagName.toLowerCase();\n if (tag === 'button' || tag === 'a' || tag === 'input' || tag === 'select' || tag === 'textarea') {\n return false;\n }\n if (el.hasAttribute('tabindex') && el.tabIndex >= 0) return false;\n if (tag.startsWith('md-')) return false;\n return true;\n }\n\n /** aria-description works across shadow DOM (unlike aria-describedby IDREFs) */\n private updateTriggerAria(el: HTMLElement) {\n if (this.disabled) {\n el.removeAttribute('aria-description');\n return;\n }\n const desc = this.computeDescription();\n if (desc) {\n el.setAttribute('aria-description', desc);\n } else {\n el.removeAttribute('aria-description');\n }\n }\n\n /**\n * The trigger's accessible description: `text`/`subhead` props first, then a\n * fallback to slotted rich content (subhead + supporting text) so a slot-only\n * rich tooltip is still announced to screen readers. Action buttons are excluded\n * — they are not description text and carry their own accessible names.\n */\n private computeDescription(): string {\n if (this.text) return this.text;\n if (this.subhead) return this.subhead;\n const parts: string[] = [];\n for (const child of Array.from(this.el.children)) {\n const slot = child.getAttribute('slot');\n if (slot === 'subhead' || slot === 'content') {\n const t = (child.textContent || '').trim();\n if (t) parts.push(t);\n }\n }\n return parts.join('. ');\n }\n\n // ─── Event Handlers ──────────────────────────────────────\n\n /** Arm the show timer, unless disabled or Escape-suppressed until re-entry. */\n private scheduleShow() {\n if (this.disabled || this.suppressed) return;\n this.clearTimers();\n this.showTimer = setTimeout(() => {\n this.open = true;\n }, this.showDelay);\n }\n\n /** Arm the hide grace timer (both variants) so the pointer can travel from the\n * trigger onto the popup without it vanishing — WCAG 1.4.13 \"hoverable\". */\n private scheduleHide() {\n this.clearTimers();\n this.hideTimer = setTimeout(() => {\n this.open = false;\n }, this.hideDelay);\n }\n\n private handleTriggerEnter = () => this.scheduleShow();\n\n private handleTriggerLeave = () => {\n // A fresh hover may re-show after an Escape dismissal.\n this.suppressed = false;\n this.scheduleHide();\n };\n\n private handleTriggerFocus = () => this.scheduleShow();\n\n private handleTriggerBlur = (e: FocusEvent) => {\n // Focus moving into the popup (rich action buttons) keeps the tooltip open.\n if (e.relatedTarget && this.el.contains(e.relatedTarget as Node)) return;\n this.suppressed = false;\n this.scheduleHide();\n };\n\n /**\n * Handles focusout at the host level — covers focus leaving\n * both the trigger AND slotted rich-tooltip action buttons.\n */\n private handleHostFocusOut = (e: FocusEvent) => {\n if (this.variant !== 'rich' || !this.isVisible) return;\n if (e.relatedTarget && this.el.contains(e.relatedTarget as Node)) return;\n this.scheduleHide();\n };\n\n /** Pointer over the popup keeps it open (hoverable) — both variants. */\n private handlePopupEnter = () => {\n this.clearTimers();\n };\n\n private handlePopupLeave = () => {\n this.scheduleHide();\n };\n\n // ─── Show / Hide ─────────────────────────────────────────\n\n /** Document-level Escape handler — dismisses from any focused descendant */\n private handleGlobalEscape = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !this.isVisible) return;\n e.preventDefault();\n this.clearTimers();\n // Suppress re-show until the pointer/focus leaves and returns, so refocusing\n // the trigger (below) or a lingering hover can't immediately reopen it.\n this.suppressed = true;\n // WCAG 1.4.13: dismissal must NOT move focus. Only return focus to the trigger\n // when focus is currently inside the tooltip (popup/actions) or on the trigger —\n // never yank it from an unrelated element the user is interacting with.\n const active = this.getDeepActiveElement();\n const focusInside = !!active && (this.el.contains(active) || active === this.triggerEl);\n this.open = false;\n if (focusInside && this.triggerEl) this.triggerEl.focus();\n };\n\n /** Deepest focused element, piercing shadow roots. */\n private getDeepActiveElement(): Element | null {\n if (typeof document === 'undefined') return null;\n let a: Element | null = document.activeElement;\n while (a && a.shadowRoot && a.shadowRoot.activeElement) a = a.shadowRoot.activeElement;\n return a;\n }\n\n private addEscapeListener() {\n if (!this.escapeListenerBound) {\n document.addEventListener('keydown', this.handleGlobalEscape, true);\n this.escapeListenerBound = true;\n }\n }\n\n private removeEscapeListener() {\n if (this.escapeListenerBound) {\n document.removeEventListener('keydown', this.handleGlobalEscape, true);\n this.escapeListenerBound = false;\n }\n }\n\n private showTooltip() {\n if (this.disabled) return;\n // A DETACHED element must not bind global listeners or start the rAF loop —\n // disconnectedCallback can never fire again to clean them up (a stale ref\n // toggling `open` after removal would otherwise leak a 60fps loop plus a\n // document-level Escape handler forever). connectedCallback re-shows on\n // reconnect via the open/isVisible checks.\n if (!this.el.isConnected) return;\n this.isVisible = true;\n this.mdOpen.emit();\n this.addScrollListener();\n this.addEscapeListener();\n // Measure after layout so fixed coords are accurate (retry if popup not yet sized).\n this.schedulePositionUpdate();\n this.startPositionWatchdog();\n }\n\n private schedulePositionUpdate(attempt = 0) {\n requestAnimationFrame(() => {\n const positioned = this.updatePosition();\n if (!positioned && attempt < 3) {\n this.schedulePositionUpdate(attempt + 1);\n }\n });\n }\n\n // ─── Position Watchdog ──────────────────────────────────\n //\n // The scroll listener only repairs staleness that arrives as a light-DOM scroll.\n // Everything else that moves the anchor or resizes the popup after positioning is\n // invisible to it: window resize reflow, scrollers inside OTHER shadow roots\n // (scroll is composed:false), sibling layout shift, web-font/text growth, and a\n // containing-block appearing/vanishing at rest (md-list's --shifting adds\n // will-change:transform to rows that haven't moved; md-date-picker's entrance\n // transform settles back to none). Rather than plumbing per-ancestor listeners +\n // ResizeObservers + animation hooks (large lifecycle surface), a single rAF\n // watchdog runs ONLY while the tooltip is visible and repositions when the anchor\n // rect, popup size, the popup's ACTUAL viewport position (which shifts when a\n // containing block reinterprets the stored coords), or the viewport changes.\n // Cost: two getBoundingClientRect calls (anchor + popup) and two offset reads per\n // frame, per visible tooltip (tooltips are transient, effectively one at a time).\n\n /** Geometry snapshot from the last successful updatePosition. ex/ey are the popup's\n * EXPECTED viewport coords — if a containing-block change reinterprets the stored\n * style.top/left, the popup's real rect drifts from these and we reposition. */\n private lastGeom = { at: 0, al: 0, aw: 0, ah: 0, pw: 0, ph: 0, vw: 0, vh: 0, ex: 0, ey: 0 };\n private watchdogFrame = 0;\n\n private startPositionWatchdog() {\n if (typeof requestAnimationFrame !== 'function') return;\n this.stopPositionWatchdog();\n const tick = () => {\n if (!this.isVisible || !this.el.isConnected) {\n this.watchdogFrame = 0;\n return;\n }\n const popup = this.popupEl;\n if (popup && this.triggerEl) {\n const pw = popup.offsetWidth;\n const ph = popup.offsetHeight;\n // A 0x0 popup means a hidden ancestor — positioning would fail without\n // refreshing the snapshot, so skip until it has a box again (the size\n // delta versus the snapshot triggers the reposition on reveal).\n if (pw !== 0 || ph !== 0) {\n const a = this.getAnchorRect();\n const p = popup.getBoundingClientRect();\n const g = this.lastGeom;\n const drifted =\n a.top !== g.at || a.left !== g.al || a.width !== g.aw || a.height !== g.ah ||\n pw !== g.pw || ph !== g.ph ||\n // 0.5px tolerance absorbs subpixel churn; the entrance scale animation\n // exceeds it for a few frames, which just re-writes the same coords.\n Math.abs(p.top - g.ey) > 0.5 || Math.abs(p.left - g.ex) > 0.5 ||\n window.innerWidth !== g.vw || window.innerHeight !== g.vh;\n if (drifted) this.updatePosition();\n }\n }\n this.watchdogFrame = requestAnimationFrame(tick);\n };\n this.watchdogFrame = requestAnimationFrame(tick);\n }\n\n private stopPositionWatchdog() {\n if (this.watchdogFrame && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(this.watchdogFrame);\n }\n this.watchdogFrame = 0;\n }\n\n private hideTooltip() {\n // No spurious mdClose if it was never actually shown (e.g. hide() after a\n // show() that was suppressed by `disabled`) — keep open/close events balanced.\n if (!this.isVisible) return;\n this.isVisible = false;\n this.mdClose.emit();\n this.removeScrollListener();\n this.removeEscapeListener();\n this.stopPositionWatchdog();\n }\n\n private clearTimers() {\n if (this.showTimer != null) {\n clearTimeout(this.showTimer);\n this.showTimer = undefined;\n }\n if (this.hideTimer != null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = undefined;\n }\n }\n\n // ─── Scroll Listener ────────────────────────────────────\n\n private addScrollListener() {\n if (!this.scrollListenerBound) {\n window.addEventListener('scroll', this.handleScroll, { capture: true, passive: true });\n this.scrollListenerBound = true;\n }\n }\n\n private removeScrollListener() {\n if (this.scrollListenerBound) {\n window.removeEventListener('scroll', this.handleScroll, true);\n this.scrollListenerBound = false;\n }\n }\n\n private handleScroll = () => {\n if (this.isVisible) this.updatePosition();\n };\n\n // ─── Positioning ─────────────────────────────────────────\n\n private updatePosition(): boolean {\n if (!this.popupEl || !this.triggerEl) return false;\n\n const anchorRect = this.getAnchorRect();\n const popupW = this.popupEl.offsetWidth;\n const popupH = this.popupEl.offsetHeight;\n\n if (popupW === 0 && popupH === 0) return false;\n\n let placement = this.physicalPlacement(this.position);\n\n if (this.autoPosition) {\n placement = this.findBestPlacement(anchorRect, popupW, popupH, placement);\n }\n\n const coords = this.calcCoords(anchorRect.width, anchorRect.height, popupW, popupH, placement);\n\n // crossOffset shifts the popup along the axis PERPENDICULAR to the placement:\n // horizontal for top/bottom, vertical for left/right. Applying it to `left`\n // unconditionally moved it along the MAIN axis for left/right placements.\n if (placement.startsWith('top') || placement.startsWith('bottom')) {\n coords.left += this.crossOffset;\n } else {\n coords.top += this.crossOffset;\n }\n\n // Cross-axis clamp: nudge the popup along the axis perpendicular to the\n // placement so it stays in the viewport, instead of flipping. A centered\n // top/bottom tooltip on an edge trigger (e.g. the first/last nav chevron in\n // a docked md-date-picker) would otherwise overflow horizontally — keep the\n // requested side and shift it inward so it stays bottom and fully visible.\n if (this.autoPosition) {\n const isVertical = placement.startsWith('top') || placement.startsWith('bottom');\n const M = TOOLTIP_VIEWPORT_MARGIN;\n if (isVertical) {\n const absLeft = anchorRect.left + coords.left;\n const maxLeft = window.innerWidth - popupW - M;\n const clampedLeft = Math.min(Math.max(absLeft, M), Math.max(M, maxLeft));\n coords.left += clampedLeft - absLeft;\n } else {\n const absTop = anchorRect.top + coords.top;\n const maxTop = window.innerHeight - popupH - M;\n const clampedTop = Math.min(Math.max(absTop, M), Math.max(M, maxTop));\n coords.top += clampedTop - absTop;\n }\n }\n\n const fixedCoords = this.toFixedCoords(anchorRect.top + coords.top, anchorRect.left + coords.left);\n\n // position:fixed — use physical top/left; getBoundingClientRect is viewport-physical.\n // Logical inset-inline-start would misplace popups in RTL (inline-start is on the right).\n this.popupEl.style.top = `${fixedCoords.top}px`;\n this.popupEl.style.left = `${fixedCoords.left}px`;\n this.popupEl.style.insetBlockStart = '';\n this.popupEl.style.insetInlineStart = '';\n this.resolvedPlacement = placement as Placement;\n // Snapshot the geometry this position was computed FROM — the watchdog\n // repositions when any of it drifts. ex/ey are the intended VIEWPORT position\n // (pre containing-block conversion): if a CB later appears/vanishes at rest,\n // the popup's real rect diverges from these with no other signal.\n this.lastGeom = {\n at: anchorRect.top, al: anchorRect.left, aw: anchorRect.width, ah: anchorRect.height,\n pw: popupW, ph: popupH,\n vw: window.innerWidth, vh: window.innerHeight,\n ex: anchorRect.left + coords.left, ey: anchorRect.top + coords.top,\n };\n return true;\n }\n\n /** Prefer the slotted trigger; fall back to the tooltip host when the trigger has\n * no box. Reads the trigger rect FIRST so the common case costs one rect read —\n * this runs every watchdog frame. */\n private getAnchorRect(): DOMRect {\n if (this.triggerEl) {\n const triggerRect = this.triggerEl.getBoundingClientRect();\n if (triggerRect.width > 0 || triggerRect.height > 0) return triggerRect;\n }\n return this.el.getBoundingClientRect();\n }\n\n /**\n * `position:fixed` is viewport-relative unless an ancestor has transform/filter/perspective,\n * in which case fixed is relative to that ancestor. Convert viewport coords accordingly.\n */\n private toFixedCoords(viewportTop: number, viewportLeft: number): { top: number; left: number } {\n const containingBlock = this.getFixedContainingBlock();\n if (!containingBlock) {\n return { top: viewportTop, left: viewportLeft };\n }\n\n const cbRect = containingBlock.getBoundingClientRect();\n return {\n top: viewportTop - cbRect.top,\n left: viewportLeft - cbRect.left,\n };\n }\n\n /** Whether this element's computed style makes it a containing block for\n * position:fixed descendants. Beyond transform/filter/perspective/backdrop-filter,\n * this includes will-change of those properties (md-list-item's --shifting uses\n * will-change: transform), layout/paint containment (incl. the contain shorthands\n * and container-type, which md-app-bar uses), and content-visibility. */\n private createsFixedContainingBlock(style: CSSStyleDeclaration): boolean {\n const s = style as CSSStyleDeclaration & {\n backdropFilter?: string;\n contain?: string;\n contentVisibility?: string;\n containerType?: string;\n translate?: string;\n rotate?: string;\n scale?: string;\n };\n // NB: check truthiness too — mock-doc (spec env) returns '' for unset\n // properties, and '' !== 'none' would make every element a containing block.\n if (\n (style.transform && style.transform !== 'none') ||\n (style.filter && style.filter !== 'none') ||\n (style.perspective && style.perspective !== 'none')\n ) return true;\n // The individual transform properties create containing blocks too.\n if (\n (s.translate && s.translate !== 'none') ||\n (s.rotate && s.rotate !== 'none') ||\n (s.scale && s.scale !== 'none')\n ) return true;\n if (s.backdropFilter && s.backdropFilter !== 'none') return true;\n if (/\\b(transform|perspective|filter|translate|rotate|scale)\\b/.test(style.willChange || '')) return true;\n if (/(layout|paint|strict|content)\\b/.test(s.contain || '')) return true;\n if (s.contentVisibility === 'auto' || s.contentVisibility === 'hidden') return true;\n // Only size containment creates a containing block — `scroll-state` query\n // containers apply no containment at all.\n if (s.containerType && /\\bsize\\b/.test(s.containerType)) return true;\n return false;\n }\n\n private getFixedContainingBlock(): HTMLElement | null {\n // Start at the HOST itself — a transformed md-tooltip is the popup's containing\n // block too (the popup lives inside its shadow root).\n let node: HTMLElement | null = this.el;\n\n while (node) {\n if (this.createsFixedContainingBlock(getComputedStyle(node))) {\n return node;\n }\n\n if (node.parentElement) {\n node = node.parentElement;\n } else if (node.parentNode instanceof ShadowRoot) {\n node = node.parentNode.host as HTMLElement;\n } else {\n node = null;\n }\n }\n\n return null;\n }\n\n private physicalPlacement(placement: string): string {\n if (typeof window === 'undefined') return placement;\n const isRTL = getComputedStyle(this.el).direction === 'rtl';\n if (!isRTL) return placement;\n\n const [axis, align = ''] = [placement.split('-')[0], placement.split('-').slice(1).join('-')];\n // The placement SIDE mirrors in RTL for left/right (inline axis).\n const flippedAxis = axis === 'left' ? 'right' : axis === 'right' ? 'left' : axis;\n // The -start/-end SUFFIX is inline-axis alignment only for top/bottom placements —\n // for left/right it aligns on the BLOCK (vertical) axis, which does not mirror\n // in RTL. Flipping it there swapped top-aligned to bottom-aligned.\n const flippedAlign =\n axis === 'top' || axis === 'bottom'\n ? align === 'start' ? 'end' : align === 'end' ? 'start' : align\n : align;\n return flippedAlign ? `${flippedAxis}-${flippedAlign}` : flippedAxis;\n }\n\n private calcCoords(\n hostW: number, hostH: number,\n popupW: number, popupH: number,\n placement: string,\n ): { top: number; left: number } {\n const o = this.offset;\n\n switch (placement) {\n case 'top': return { top: -(popupH + o), left: (hostW - popupW) / 2 };\n case 'top-start': return { top: -(popupH + o), left: 0 };\n case 'top-end': return { top: -(popupH + o), left: hostW - popupW };\n case 'bottom': return { top: hostH + o, left: (hostW - popupW) / 2 };\n case 'bottom-start': return { top: hostH + o, left: 0 };\n case 'bottom-end': return { top: hostH + o, left: hostW - popupW };\n case 'left': return { top: (hostH - popupH) / 2, left: -(popupW + o) };\n case 'left-start': return { top: 0, left: -(popupW + o) };\n case 'left-end': return { top: hostH - popupH, left: -(popupW + o) };\n case 'right': return { top: (hostH - popupH) / 2, left: hostW + o };\n case 'right-start': return { top: 0, left: hostW + o };\n case 'right-end': return { top: hostH - popupH, left: hostW + o };\n default: return { top: -(popupH + o), left: (hostW - popupW) / 2 };\n }\n }\n\n /**\n * Whether the placement fits the viewport along its MAIN axis only — the axis\n * the popup is pushed along (vertical for top/bottom, horizontal for left/right).\n * Cross-axis overflow is handled by clamping in `updatePosition`, not flipping,\n * so an edge-anchored centered tooltip keeps its requested side.\n */\n private fitsMainAxis(\n hostRect: DOMRect,\n popupW: number,\n popupH: number,\n relTop: number,\n relLeft: number,\n placement: string,\n ): boolean {\n const isVertical = placement.startsWith('top') || placement.startsWith('bottom');\n if (isVertical) {\n const absTop = hostRect.top + relTop;\n return absTop >= 0 && absTop + popupH <= window.innerHeight;\n }\n const absLeft = hostRect.left + relLeft;\n return absLeft >= 0 && absLeft + popupW <= window.innerWidth;\n }\n\n private getOppositePlacement(p: string): string {\n const [axis, align] = [p.split('-')[0], p.split('-').slice(1).join('-')];\n const opp: Record<string, string> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n return align ? `${opp[axis]}-${align}` : opp[axis];\n }\n\n private findBestPlacement(\n hostRect: DOMRect,\n popupW: number,\n popupH: number,\n preferred: string,\n ): string {\n const check = (p: string) => {\n const c = this.calcCoords(hostRect.width, hostRect.height, popupW, popupH, p);\n return this.fitsMainAxis(hostRect, popupW, popupH, c.top, c.left, p);\n };\n\n if (check(preferred)) return preferred;\n\n const opposite = this.getOppositePlacement(preferred);\n if (check(opposite)) return opposite;\n\n const align = preferred.split('-')[1] || '';\n const axes = ['top', 'bottom', 'right', 'left'];\n for (const axis of axes) {\n const candidate = align ? `${axis}-${align}` : axis;\n if (candidate !== preferred && candidate !== opposite && check(candidate)) {\n return candidate;\n }\n }\n\n return preferred;\n }\n\n // ─── Render ──────────────────────────────────────────────\n\n render() {\n const isRich = this.variant === 'rich';\n const hasSubhead = !!this.subhead || this.hasSlottedSubhead;\n const hasActions = this.hasSlottedActions;\n\n return (\n <Host class=\"md-tooltip-wrapper\">\n <slot></slot>\n <div\n class={{\n 'md-tooltip__popup': true,\n 'md-tooltip__popup--plain': !isRich,\n 'md-tooltip__popup--rich': isRich,\n 'md-tooltip__popup--visible': this.isVisible,\n [`md-tooltip__popup--${this.resolvedPlacement}`]: true,\n }}\n id={this.tooltipId}\n role=\"tooltip\"\n part=\"popup\"\n aria-hidden={this.isVisible ? 'false' : 'true'}\n ref={el => (this.popupEl = el)}\n onMouseEnter={this.handlePopupEnter}\n onMouseLeave={this.handlePopupLeave}\n >\n {isRich ? ([\n hasSubhead && (\n <div class=\"md-tooltip__subhead\" part=\"subhead\" key=\"subhead\">\n <slot name=\"subhead\">{this.subhead}</slot>\n </div>\n ),\n <div class=\"md-tooltip__supporting-text\" part=\"supporting-text\" key=\"text\">\n <slot name=\"content\">{this.text}</slot>\n </div>,\n <div class={{ 'md-tooltip__actions': true, 'md-tooltip__actions--empty': !hasActions }} part=\"actions\" key=\"actions\">\n <slot name=\"actions\"></slot>\n </div>,\n ]) : (\n <span class=\"md-tooltip__text\" part=\"text\">{this.text}</span>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as t,c as e,h as s,H as i,a as o}from"./p-DTaX19_O.js";const a=()=>`:host{--_container-color:var(--md-bottom-sheet-container-color, var(--md-sys-color-surface-container-low, #F7F2FA));--_container-shape:var(--md-bottom-sheet-container-shape, max(16px, calc(28px + var(--md-sys-density-scale, 0) * 2px)));--_content-color:var(--md-bottom-sheet-content-color, var(--md-sys-color-on-surface, #1C1B1F));--_headline-color:var(--md-bottom-sheet-headline-color, var(--md-sys-color-on-surface, #1C1B1F));--_scrim-color:var(--md-bottom-sheet-scrim-color, rgba(0, 0, 0, 0.32));--_drag-handle-color:var(--md-bottom-sheet-drag-handle-color, var(--md-sys-color-on-surface-variant, #49454F));--_divider-color:var(--md-bottom-sheet-divider-color, var(--md-sys-color-outline-variant, #CAC4D0));--_icon-color:var(--md-bottom-sheet-icon-color, var(--md-sys-color-on-surface-variant, #49454F));--_min-width:var(--md-bottom-sheet-min-width, 0);--_max-width:var(--md-bottom-sheet-max-width, 100%);--_width:var(--md-bottom-sheet-width, 100%);--_min-height:var(--md-bottom-sheet-min-height, 0);--_max-height:var(--md-bottom-sheet-max-height, 80vh);--_height:var(--md-bottom-sheet-height, auto);--_detached-margin:var(--md-bottom-sheet-detached-margin, 16px);--_content-padding-inline:var(--md-bottom-sheet-content-padding-inline, max(12px, calc(24px + var(--md-sys-density-scale, 0) * 2px)));display:contents;font-family:var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif);font-size:max(12px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));font-weight:var(--md-sys-typescale-body-medium-font-weight, 400);line-height:max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));letter-spacing:var(--md-sys-typescale-body-medium-letter-spacing, 0.25px);color:var(--_content-color)}:host(:not(.md-bottom-sheet--open)){pointer-events:none}.md-bottom-sheet__scrim{position:fixed;inset:0;background-color:var(--_scrim-color);z-index:var(--md-sys-z-index-popup, 1000);opacity:0;pointer-events:none;transition:opacity var(--md-sys-motion-duration-medium2, 300ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1))}:host(.md-bottom-sheet--open) .md-bottom-sheet__scrim{opacity:1;pointer-events:auto}.md-bottom-sheet__container{position:fixed;inset-inline:0;inset-block-end:0;margin-inline:auto;z-index:var(--md-sys-z-index-dialog-scrim, 1001);inline-size:var(--_width);min-inline-size:var(--_min-width);max-inline-size:var(--_max-width);block-size:var(--_height);min-block-size:var(--_min-height);max-block-size:var(--_max-height);background-color:var(--_container-color);color:var(--_content-color);display:flex;flex-direction:column;overflow:hidden;pointer-events:none;opacity:0;transform:translateY(100%);transition:transform var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)), opacity var(--md-sys-motion-duration-medium2, 300ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));padding-block-end:env(safe-area-inset-bottom, 0px);box-sizing:border-box;outline:none}:host(.md-bottom-sheet--open) .md-bottom-sheet__container{pointer-events:auto;opacity:1;transform:translateY(0)}:host(.md-bottom-sheet--standard) .md-bottom-sheet__container{border-start-start-radius:var(--_container-shape);border-start-end-radius:var(--_container-shape);border-end-start-radius:0;border-end-end-radius:0}:host(.md-bottom-sheet--detached) .md-bottom-sheet__container{inset-inline:var(--_detached-margin);inset-block-end:var(--_detached-margin);margin-inline:auto;border-radius:var(--_container-shape);box-shadow:var(--md-sys-elevation-3);max-inline-size:min(var(--_max-width), calc(100% - calc(var(--_detached-margin) * 2)))}@media (max-width: 639.98px){:host{--_width:var(--md-bottom-sheet-width, 100%);--_max-width:var(--md-bottom-sheet-max-width, 100%)}}@media (min-width: 640px){:host{--_width:var(--md-bottom-sheet-width, 640px);--_max-width:var(--md-bottom-sheet-max-width, calc(100% - 112px))}}.md-bottom-sheet__drag-handle{display:flex;justify-content:center;align-items:center;padding-block:max(12px, calc(22px + var(--md-sys-density-scale, 0) * 2px));flex-shrink:0;cursor:grab;touch-action:none;user-select:none}.md-bottom-sheet__drag-handle--dragging{cursor:grabbing}.md-bottom-sheet__drag-handle-indicator{inline-size:max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px));block-size:max(3px, calc(4px + var(--md-sys-density-scale, 0) * 0.25px));border-radius:2px;background-color:var(--_drag-handle-color);opacity:0.4;transition:opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease)}.md-bottom-sheet__drag-handle:hover .md-bottom-sheet__drag-handle-indicator{opacity:0.6}.md-bottom-sheet__drag-handle--dragging .md-bottom-sheet__drag-handle-indicator{opacity:0.8}:host(.md-bottom-sheet--no-drag-handle) .md-bottom-sheet__container{padding-block-start:max(12px, calc(24px + var(--md-sys-density-scale, 0) * 2px))}.md-bottom-sheet__header{display:flex;align-items:center;gap:max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px));padding-inline:max(12px, calc(24px + var(--md-sys-density-scale, 0) * 2px));padding-block:0 max(4px, calc(8px + var(--md-sys-density-scale, 0) * 1px));flex-shrink:0}.md-bottom-sheet__headline{flex:1;font-family:var(--md-sys-typescale-headline-small-font-family, Roboto, sans-serif);font-size:max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px));font-weight:var(--md-sys-typescale-headline-small-font-weight, 400);line-height:max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px));letter-spacing:var(--md-sys-typescale-headline-small-letter-spacing, 0);color:var(--_headline-color);overflow:hidden;text-overflow:ellipsis;text-align:start}:host([headline-align='center']) .md-bottom-sheet__headline{text-align:center}:host([headline-align='end']) .md-bottom-sheet__headline{text-align:end}.md-bottom-sheet__close{flex-shrink:0;margin-inline-start:auto;margin-inline-end:calc(-12px - var(--md-sys-density-scale, 0) * 1px)}.md-bottom-sheet__close md-icon-button{--md-icon-button-icon-color:var(--_icon-color);--md-icon-button-container-width:max(32px, calc(40px + var(--md-sys-density-scale, 0) * 4px));--md-icon-button-container-height:max(32px, calc(40px + var(--md-sys-density-scale, 0) * 4px));--md-icon-button-icon-size:max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px))}.md-bottom-sheet__divider{block-size:1px;background-color:var(--_divider-color);flex-shrink:0}.md-bottom-sheet__divider--bottom{margin-block-start:auto}.md-bottom-sheet__content{flex:1 1 auto;min-block-size:0;display:flex;flex-direction:column;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:var(--_content-color);text-align:start}:host([content-align='center']) .md-bottom-sheet__content{text-align:center}:host([content-align='end']) .md-bottom-sheet__content{text-align:end}.md-bottom-sheet__content{overflow-y:auto;padding-inline:var(--_content-padding-inline);padding-block:var(--md-sys-spacing-inset-sm, 8px) var(--md-sys-spacing-inset-lg, 16px);scrollbar-width:thin;scrollbar-color:var(--md-sys-color-outline-variant, #CAC4D0) transparent}.md-bottom-sheet__content::-webkit-scrollbar{inline-size:4px}.md-bottom-sheet__content::-webkit-scrollbar-thumb{background-color:var(--md-sys-color-outline-variant, #CAC4D0);border-radius:2px}.md-bottom-sheet__content::-webkit-scrollbar-track{background-color:transparent}.md-bottom-sheet__actions{display:flex;align-items:center;gap:var(--md-sys-spacing-gap-sm, 8px);padding-inline:var(--md-sys-spacing-inset-xl, 24px);padding-block:var(--md-sys-spacing-inset-lg, 16px) var(--md-sys-spacing-inset-xl, 24px);flex-shrink:0;box-sizing:border-box}::slotted([slot="actions"]){flex-shrink:0}.md-bottom-sheet__focus-guard{position:fixed;overflow:hidden;clip-path:inset(50%);inline-size:1px;block-size:1px;padding:0;border:0;margin:-1px;white-space:nowrap}.md-bottom-sheet__container:focus-visible{outline:3px solid var(--md-sys-color-secondary, #625B71);outline-offset:-3px}@media (prefers-reduced-motion: reduce){.md-bottom-sheet__container,.md-bottom-sheet__scrim{transition:none}}@media (forced-colors: active){.md-bottom-sheet__container{border:1px solid CanvasText}.md-bottom-sheet__divider{background-color:CanvasText}.md-bottom-sheet__drag-handle-indicator{background-color:CanvasText;opacity:1}}:host([density='-1']){--md-sys-density-scale:-1}:host([density='-2']){--md-sys-density-scale:-2}:host([density='-3']){--md-sys-density-scale:-3}:host([density='-4']){--md-sys-density-scale:-4}`;const n=class{constructor(s){t(this,s);this.mdOpen=e(this,"mdOpen",7);this.mdClose=e(this,"mdClose",7);this.mdCancel=e(this,"mdCancel",7);this.open=false;this.variant="standard";this.headline="";this.showDragHandle=true;this.closeable=false;this.scrimDismissible=true;this.topDivider=false;this.bottomDivider=false;this.sheetAriaLabel="";this.scrollShadow=true;this.headlineAlign="start";this.contentAlign="start";this.density=0;this.hasSlottedClose=false;this.hasActions=false;this.dragging=false;this.previousFocus=null;this.headlineId=`md-bottom-sheet-headline-${Math.random().toString(36).slice(2)}`;this.dragStartY=0;this.dragCurrentY=0;this.DISMISS_THRESHOLD=100;this.handleDocKeyDown=t=>{if(!this.open)return;if(t.key==="Escape"){t.preventDefault();t.stopPropagation();this.mdCancel.emit();this.open=false}};this.handleDocFocusIn=()=>{if(!this.open)return;const t=document.activeElement;if(!t)return;if(t===this.el||this.el.contains(t))return;const e=this.containerEl?.contains(t);if(e)return;this.focusFirst()};this.handleStartGuardFocus=()=>{const t=this.getFocusableElements();if(t.length>0){t[t.length-1].focus()}else{this.containerEl?.focus()}};this.handleEndGuardFocus=()=>{const t=this.getFocusableElements();if(t.length>0){t[0].focus()}else{this.containerEl?.focus()}};this.handleScrimClick=()=>{if(!this.scrimDismissible)return;this.mdCancel.emit();this.open=false};this.handleCloseClick=()=>{this.mdCancel.emit();this.open=false};this.handleDragStart=t=>{if(!this.open||!this.showDragHandle)return;this.dragging=true;this.dragStartY=t.clientY;this.dragCurrentY=0;if(this.containerEl){this.containerEl.style.transition="none"}t.target.setPointerCapture(t.pointerId)};this.handleDragMove=t=>{if(!this.dragging)return;const e=t.clientY-this.dragStartY;this.dragCurrentY=Math.max(0,e);if(this.containerEl){this.containerEl.style.transform=`translateY(${this.dragCurrentY}px)`}};this.handleDragEnd=()=>{if(!this.dragging)return;this.dragging=false;if(this.containerEl){this.containerEl.style.transition=""}if(this.dragCurrentY>this.DISMISS_THRESHOLD){this.mdCancel.emit();this.open=false}else if(this.containerEl){this.containerEl.style.transform=""}this.dragCurrentY=0}}connectedCallback(){this.hasActions=!!this.el.querySelector('[slot="actions"]')}componentWillLoad(){this.hasSlottedClose=Array.from(this.el.children).some((t=>t.getAttribute("slot")==="close"))}componentDidLoad(){const t=this.el.shadowRoot;if(!t)return;const e=t.querySelector('slot[name="close"]');const s=t.querySelector('slot[name="actions"]');e?.addEventListener("slotchange",(()=>{this.hasSlottedClose=e.assignedElements().length>0}));s?.addEventListener("slotchange",(()=>{this.hasActions=s.assignedElements().length>0}));if(this.open){this.onOpenChange(true)}}disconnectedCallback(){this.removeGlobalListeners();document.body.style.overflow=""}onOpenChange(t){if(t){this.previousFocus=document.activeElement;document.body.style.overflow="hidden";this.addGlobalListeners();requestAnimationFrame((()=>{this.containerEl?.removeAttribute("inert");this.focusFirst()}));this.mdOpen.emit()}else{this.removeGlobalListeners();document.body.style.overflow="";this.previousFocus?.focus?.({preventScroll:true});this.previousFocus=null;if(this.containerEl){this.containerEl.style.transform=""}this.mdClose.emit()}}async show(){this.open=true}async close(){this.open=false}addGlobalListeners(){document.addEventListener("keydown",this.handleDocKeyDown,true);document.addEventListener("focusin",this.handleDocFocusIn)}removeGlobalListeners(){document.removeEventListener("keydown",this.handleDocKeyDown,true);document.removeEventListener("focusin",this.handleDocFocusIn)}focusFirst(){if(!this.containerEl)return;const t=this.getFocusableElements();if(t.length>0){t[0].focus()}else{this.containerEl.focus()}}getFocusableElements(){const t='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"]), md-icon-button:not([disabled]), md-button:not([disabled]), md-text-field:not([disabled]), md-checkbox:not([disabled]), md-switch:not([disabled]), md-radio:not([disabled]), md-slider:not([disabled])';const e=Array.from(this.containerEl?.querySelectorAll(t)??[]).filter((t=>!t.classList.contains("md-bottom-sheet__focus-guard")));const s=this.containerEl?.querySelectorAll("slot")??[];const i=[];s.forEach((e=>{const s=e.assignedElements({flatten:true});s.forEach((e=>{if(e.matches?.(t)){i.push(e)}const s=e.querySelectorAll?.(t);if(s)i.push(...Array.from(s))}))}));return[...e,...i]}render(){const t=!!this.headline;const e=t||this.closeable||this.hasSlottedClose;return s(i,{key:"7bf8662ebf946e995685290835cd8ae1b760facd",class:{"md-bottom-sheet":true,[`md-bottom-sheet--${this.variant}`]:true,"md-bottom-sheet--open":this.open,"md-bottom-sheet--no-drag-handle":!this.showDragHandle}},s("div",{key:"47c620ee40367d41ef709717f5b4124583239677",class:"md-bottom-sheet__scrim",part:"scrim","aria-hidden":"true",onClick:this.handleScrimClick}),s("div",{key:"3e1e741f8d4ec34d0ec7b7cea469973daf8b357f",class:"md-bottom-sheet__container",part:"container",role:"dialog","aria-modal":"true","aria-labelledby":t?this.headlineId:undefined,"aria-label":this.sheetAriaLabel||(!t?"Bottom sheet":undefined),"aria-hidden":!this.open?"true":undefined,inert:!this.open,tabindex:-1,ref:t=>this.containerEl=t},s("span",{key:"c9d16b98c401a630282dc269611a8949d34ad4e0",class:"md-bottom-sheet__focus-guard",tabindex:0,"aria-hidden":"true",onFocus:this.handleEndGuardFocus}),this.showDragHandle&&s("div",{key:"2f30f95cec55aa7dac22e65b4ec588fb62a74ba2",class:{"md-bottom-sheet__drag-handle":true,"md-bottom-sheet__drag-handle--dragging":this.dragging},part:"drag-handle","aria-hidden":"true",onPointerDown:this.handleDragStart,onPointerMove:this.handleDragMove,onPointerUp:this.handleDragEnd,onPointerCancel:this.handleDragEnd},s("div",{key:"36b88841e55f3dcc8632eae6aa4ccbed8d66b288",class:"md-bottom-sheet__drag-handle-indicator",part:"drag-handle-indicator"})),e&&s("div",{key:"86cf0fb217c23190850506d20cc315bb33a2cd61",class:"md-bottom-sheet__header",part:"header"},t&&s("span",{key:"718af03929d31904541e40781143b1c03058493e",id:this.headlineId,class:"md-bottom-sheet__headline",part:"headline"},s("slot",{key:"b42e1bd6a51d8aa774ab5fbf401bee39b9610f97",name:"headline"},this.headline)),(this.closeable||this.hasSlottedClose)&&s("div",{key:"2c85f77dc9d235fcf042682746800d1a106f776e",class:"md-bottom-sheet__close",part:"close"},s("slot",{key:"8b519e7a49a47fb7ac6a680edddcfc3571d086e5",name:"close"},s("md-icon-button",{key:"0aedcd29fd764feec2fd7782e0e98c1abde2b379",variant:"standard",icon:"close","aria-label":"Close bottom sheet",onClick:this.handleCloseClick})))),this.topDivider&&s("div",{key:"a568c1979145410546cc022b05c872eb85854ea0",class:"md-bottom-sheet__divider",part:"divider-top","aria-hidden":"true"}),s("div",{key:"d38538f74c944acf9b797ac71b0edc31f5a5ec12",class:"md-bottom-sheet__content",part:"content"},s("slot",{key:"f9c060e543f80074ca44455b80e8e208027cb447"})),this.hasActions&&this.bottomDivider&&s("div",{key:"d9695c0415763040a0e940b90629fc247dd48cf5",class:"md-bottom-sheet__divider md-bottom-sheet__divider--bottom",part:"divider-bottom","aria-hidden":"true"}),this.hasActions&&s("div",{key:"97f2727a454a547ed42f2bb7ae975c9c1faba061",class:"md-bottom-sheet__actions",part:"actions"},s("slot",{key:"8a8c7a032c56d0ee4d575bf8b28668977564787c",name:"actions"})),s("span",{key:"02d8e8162536432e224b8b4be26f3e3debadbd91",class:"md-bottom-sheet__focus-guard",tabindex:0,"aria-hidden":"true",onFocus:this.handleStartGuardFocus})))}get el(){return o(this)}static get watchers(){return{open:[{onOpenChange:0}]}}};n.style=a();export{n as md_bottom_sheet};
|
|
2
|
-
//# sourceMappingURL=p-
|
|
1
|
+
import{r as t,c as e,h as s,H as i,g as o}from"./p-WmvQpZnM.js";const a=()=>`:host{--_container-color:var(--md-bottom-sheet-container-color, var(--md-sys-color-surface-container-low, #F7F2FA));--_container-shape:var(--md-bottom-sheet-container-shape, max(16px, calc(28px + var(--md-sys-density-scale, 0) * 2px)));--_content-color:var(--md-bottom-sheet-content-color, var(--md-sys-color-on-surface, #1C1B1F));--_headline-color:var(--md-bottom-sheet-headline-color, var(--md-sys-color-on-surface, #1C1B1F));--_scrim-color:var(--md-bottom-sheet-scrim-color, rgba(0, 0, 0, 0.32));--_drag-handle-color:var(--md-bottom-sheet-drag-handle-color, var(--md-sys-color-on-surface-variant, #49454F));--_divider-color:var(--md-bottom-sheet-divider-color, var(--md-sys-color-outline-variant, #CAC4D0));--_icon-color:var(--md-bottom-sheet-icon-color, var(--md-sys-color-on-surface-variant, #49454F));--_min-width:var(--md-bottom-sheet-min-width, 0);--_max-width:var(--md-bottom-sheet-max-width, 100%);--_width:var(--md-bottom-sheet-width, 100%);--_min-height:var(--md-bottom-sheet-min-height, 0);--_max-height:var(--md-bottom-sheet-max-height, 80vh);--_height:var(--md-bottom-sheet-height, auto);--_detached-margin:var(--md-bottom-sheet-detached-margin, 16px);--_content-padding-inline:var(--md-bottom-sheet-content-padding-inline, max(12px, calc(24px + var(--md-sys-density-scale, 0) * 2px)));display:contents;font-family:var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif);font-size:max(12px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));font-weight:var(--md-sys-typescale-body-medium-font-weight, 400);line-height:max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));letter-spacing:var(--md-sys-typescale-body-medium-letter-spacing, 0.25px);color:var(--_content-color)}:host(:not(.md-bottom-sheet--open)){pointer-events:none}.md-bottom-sheet__scrim{position:fixed;inset:0;background-color:var(--_scrim-color);z-index:var(--md-sys-z-index-popup, 1000);opacity:0;pointer-events:none;transition:opacity var(--md-sys-motion-duration-medium2, 300ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1))}:host(.md-bottom-sheet--open) .md-bottom-sheet__scrim{opacity:1;pointer-events:auto}.md-bottom-sheet__container{position:fixed;inset-inline:0;inset-block-end:0;margin-inline:auto;z-index:var(--md-sys-z-index-dialog-scrim, 1001);inline-size:var(--_width);min-inline-size:var(--_min-width);max-inline-size:var(--_max-width);block-size:var(--_height);min-block-size:var(--_min-height);max-block-size:var(--_max-height);background-color:var(--_container-color);color:var(--_content-color);display:flex;flex-direction:column;overflow:hidden;pointer-events:none;opacity:0;transform:translateY(100%);transition:transform var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)), opacity var(--md-sys-motion-duration-medium2, 300ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));padding-block-end:env(safe-area-inset-bottom, 0px);box-sizing:border-box;outline:none}:host(.md-bottom-sheet--open) .md-bottom-sheet__container{pointer-events:auto;opacity:1;transform:translateY(0)}:host(.md-bottom-sheet--standard) .md-bottom-sheet__container{border-start-start-radius:var(--_container-shape);border-start-end-radius:var(--_container-shape);border-end-start-radius:0;border-end-end-radius:0}:host(.md-bottom-sheet--detached) .md-bottom-sheet__container{inset-inline:var(--_detached-margin);inset-block-end:var(--_detached-margin);margin-inline:auto;border-radius:var(--_container-shape);box-shadow:var(--md-sys-elevation-3);max-inline-size:min(var(--_max-width), calc(100% - calc(var(--_detached-margin) * 2)))}@media (max-width: 639.98px){:host{--_width:var(--md-bottom-sheet-width, 100%);--_max-width:var(--md-bottom-sheet-max-width, 100%)}}@media (min-width: 640px){:host{--_width:var(--md-bottom-sheet-width, 640px);--_max-width:var(--md-bottom-sheet-max-width, calc(100% - 112px))}}.md-bottom-sheet__drag-handle{display:flex;justify-content:center;align-items:center;padding-block:max(12px, calc(22px + var(--md-sys-density-scale, 0) * 2px));flex-shrink:0;cursor:grab;touch-action:none;user-select:none}.md-bottom-sheet__drag-handle--dragging{cursor:grabbing}.md-bottom-sheet__drag-handle-indicator{inline-size:max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px));block-size:max(3px, calc(4px + var(--md-sys-density-scale, 0) * 0.25px));border-radius:2px;background-color:var(--_drag-handle-color);opacity:0.4;transition:opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, ease)}.md-bottom-sheet__drag-handle:hover .md-bottom-sheet__drag-handle-indicator{opacity:0.6}.md-bottom-sheet__drag-handle--dragging .md-bottom-sheet__drag-handle-indicator{opacity:0.8}:host(.md-bottom-sheet--no-drag-handle) .md-bottom-sheet__container{padding-block-start:max(12px, calc(24px + var(--md-sys-density-scale, 0) * 2px))}.md-bottom-sheet__header{display:flex;align-items:center;gap:max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px));padding-inline:max(12px, calc(24px + var(--md-sys-density-scale, 0) * 2px));padding-block:0 max(4px, calc(8px + var(--md-sys-density-scale, 0) * 1px));flex-shrink:0}.md-bottom-sheet__headline{flex:1;font-family:var(--md-sys-typescale-headline-small-font-family, Roboto, sans-serif);font-size:max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px));font-weight:var(--md-sys-typescale-headline-small-font-weight, 400);line-height:max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px));letter-spacing:var(--md-sys-typescale-headline-small-letter-spacing, 0);color:var(--_headline-color);overflow:hidden;text-overflow:ellipsis;text-align:start}:host([headline-align='center']) .md-bottom-sheet__headline{text-align:center}:host([headline-align='end']) .md-bottom-sheet__headline{text-align:end}.md-bottom-sheet__close{flex-shrink:0;margin-inline-start:auto;margin-inline-end:calc(-12px - var(--md-sys-density-scale, 0) * 1px)}.md-bottom-sheet__close md-icon-button{--md-icon-button-icon-color:var(--_icon-color);--md-icon-button-container-width:max(32px, calc(40px + var(--md-sys-density-scale, 0) * 4px));--md-icon-button-container-height:max(32px, calc(40px + var(--md-sys-density-scale, 0) * 4px));--md-icon-button-icon-size:max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px))}.md-bottom-sheet__divider{block-size:1px;background-color:var(--_divider-color);flex-shrink:0}.md-bottom-sheet__divider--bottom{margin-block-start:auto}.md-bottom-sheet__content{flex:1 1 auto;min-block-size:0;display:flex;flex-direction:column;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:var(--_content-color);text-align:start}:host([content-align='center']) .md-bottom-sheet__content{text-align:center}:host([content-align='end']) .md-bottom-sheet__content{text-align:end}.md-bottom-sheet__content{overflow-y:auto;padding-inline:var(--_content-padding-inline);padding-block:var(--md-sys-spacing-inset-sm, 8px) var(--md-sys-spacing-inset-lg, 16px);scrollbar-width:thin;scrollbar-color:var(--md-sys-color-outline-variant, #CAC4D0) transparent}.md-bottom-sheet__content::-webkit-scrollbar{inline-size:4px}.md-bottom-sheet__content::-webkit-scrollbar-thumb{background-color:var(--md-sys-color-outline-variant, #CAC4D0);border-radius:2px}.md-bottom-sheet__content::-webkit-scrollbar-track{background-color:transparent}.md-bottom-sheet__actions{display:flex;align-items:center;gap:var(--md-sys-spacing-gap-sm, 8px);padding-inline:var(--md-sys-spacing-inset-xl, 24px);padding-block:var(--md-sys-spacing-inset-lg, 16px) var(--md-sys-spacing-inset-xl, 24px);flex-shrink:0;box-sizing:border-box}::slotted([slot="actions"]){flex-shrink:0}.md-bottom-sheet__focus-guard{position:fixed;overflow:hidden;clip-path:inset(50%);inline-size:1px;block-size:1px;padding:0;border:0;margin:-1px;white-space:nowrap}.md-bottom-sheet__container:focus-visible{outline:3px solid var(--md-sys-color-secondary, #625B71);outline-offset:-3px}@media (prefers-reduced-motion: reduce){.md-bottom-sheet__container,.md-bottom-sheet__scrim{transition:none}}@media (forced-colors: active){.md-bottom-sheet__container{border:1px solid CanvasText}.md-bottom-sheet__divider{background-color:CanvasText}.md-bottom-sheet__drag-handle-indicator{background-color:CanvasText;opacity:1}}:host([density='-1']){--md-sys-density-scale:-1}:host([density='-2']){--md-sys-density-scale:-2}:host([density='-3']){--md-sys-density-scale:-3}:host([density='-4']){--md-sys-density-scale:-4}`;const n=class{constructor(s){t(this,s);this.mdOpen=e(this,"mdOpen",7);this.mdClose=e(this,"mdClose",7);this.mdCancel=e(this,"mdCancel",7);this.open=false;this.variant="standard";this.headline="";this.showDragHandle=true;this.closeable=false;this.scrimDismissible=true;this.topDivider=false;this.bottomDivider=false;this.sheetAriaLabel="";this.scrollShadow=true;this.headlineAlign="start";this.contentAlign="start";this.density=0;this.hasSlottedClose=false;this.hasActions=false;this.dragging=false;this.previousFocus=null;this.headlineId=`md-bottom-sheet-headline-${Math.random().toString(36).slice(2)}`;this.dragStartY=0;this.dragCurrentY=0;this.DISMISS_THRESHOLD=100;this.handleDocKeyDown=t=>{if(!this.open)return;if(t.key==="Escape"){t.preventDefault();t.stopPropagation();this.mdCancel.emit();this.open=false}};this.handleDocFocusIn=()=>{if(!this.open)return;const t=document.activeElement;if(!t)return;if(t===this.el||this.el.contains(t))return;const e=this.containerEl?.contains(t);if(e)return;this.focusFirst()};this.handleStartGuardFocus=()=>{const t=this.getFocusableElements();if(t.length>0){t[t.length-1].focus()}else{this.containerEl?.focus()}};this.handleEndGuardFocus=()=>{const t=this.getFocusableElements();if(t.length>0){t[0].focus()}else{this.containerEl?.focus()}};this.handleScrimClick=()=>{if(!this.scrimDismissible)return;this.mdCancel.emit();this.open=false};this.handleCloseClick=()=>{this.mdCancel.emit();this.open=false};this.handleDragStart=t=>{if(!this.open||!this.showDragHandle)return;this.dragging=true;this.dragStartY=t.clientY;this.dragCurrentY=0;if(this.containerEl){this.containerEl.style.transition="none"}t.target.setPointerCapture(t.pointerId)};this.handleDragMove=t=>{if(!this.dragging)return;const e=t.clientY-this.dragStartY;this.dragCurrentY=Math.max(0,e);if(this.containerEl){this.containerEl.style.transform=`translateY(${this.dragCurrentY}px)`}};this.handleDragEnd=()=>{if(!this.dragging)return;this.dragging=false;if(this.containerEl){this.containerEl.style.transition=""}if(this.dragCurrentY>this.DISMISS_THRESHOLD){this.mdCancel.emit();this.open=false}else if(this.containerEl){this.containerEl.style.transform=""}this.dragCurrentY=0}}connectedCallback(){this.hasActions=!!this.el.querySelector('[slot="actions"]')}componentWillLoad(){this.hasSlottedClose=Array.from(this.el.children).some((t=>t.getAttribute("slot")==="close"))}componentDidLoad(){const t=this.el.shadowRoot;if(!t)return;const e=t.querySelector('slot[name="close"]');const s=t.querySelector('slot[name="actions"]');e?.addEventListener("slotchange",(()=>{this.hasSlottedClose=e.assignedElements().length>0}));s?.addEventListener("slotchange",(()=>{this.hasActions=s.assignedElements().length>0}));if(this.open){this.onOpenChange(true)}}disconnectedCallback(){this.removeGlobalListeners();document.body.style.overflow=""}onOpenChange(t){if(t){this.previousFocus=document.activeElement;document.body.style.overflow="hidden";this.addGlobalListeners();requestAnimationFrame((()=>{this.containerEl?.removeAttribute("inert");this.focusFirst()}));this.mdOpen.emit()}else{this.removeGlobalListeners();document.body.style.overflow="";this.previousFocus?.focus?.({preventScroll:true});this.previousFocus=null;if(this.containerEl){this.containerEl.style.transform=""}this.mdClose.emit()}}async show(){this.open=true}async close(){this.open=false}addGlobalListeners(){document.addEventListener("keydown",this.handleDocKeyDown,true);document.addEventListener("focusin",this.handleDocFocusIn)}removeGlobalListeners(){document.removeEventListener("keydown",this.handleDocKeyDown,true);document.removeEventListener("focusin",this.handleDocFocusIn)}focusFirst(){if(!this.containerEl)return;const t=this.getFocusableElements();if(t.length>0){t[0].focus()}else{this.containerEl.focus()}}getFocusableElements(){const t='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"]), md-icon-button:not([disabled]), md-button:not([disabled]), md-text-field:not([disabled]), md-checkbox:not([disabled]), md-switch:not([disabled]), md-radio:not([disabled]), md-slider:not([disabled])';const e=Array.from(this.containerEl?.querySelectorAll(t)??[]).filter((t=>!t.classList.contains("md-bottom-sheet__focus-guard")));const s=this.containerEl?.querySelectorAll("slot")??[];const i=[];s.forEach((e=>{const s=e.assignedElements({flatten:true});s.forEach((e=>{if(e.matches?.(t)){i.push(e)}const s=e.querySelectorAll?.(t);if(s)i.push(...Array.from(s))}))}));return[...e,...i]}render(){const t=!!this.headline;const e=t||this.closeable||this.hasSlottedClose;return s(i,{key:"7bf8662ebf946e995685290835cd8ae1b760facd",class:{"md-bottom-sheet":true,[`md-bottom-sheet--${this.variant}`]:true,"md-bottom-sheet--open":this.open,"md-bottom-sheet--no-drag-handle":!this.showDragHandle}},s("div",{key:"47c620ee40367d41ef709717f5b4124583239677",class:"md-bottom-sheet__scrim",part:"scrim","aria-hidden":"true",onClick:this.handleScrimClick}),s("div",{key:"3e1e741f8d4ec34d0ec7b7cea469973daf8b357f",class:"md-bottom-sheet__container",part:"container",role:"dialog","aria-modal":"true","aria-labelledby":t?this.headlineId:undefined,"aria-label":this.sheetAriaLabel||(!t?"Bottom sheet":undefined),"aria-hidden":!this.open?"true":undefined,inert:!this.open,tabindex:-1,ref:t=>this.containerEl=t},s("span",{key:"c9d16b98c401a630282dc269611a8949d34ad4e0",class:"md-bottom-sheet__focus-guard",tabindex:0,"aria-hidden":"true",onFocus:this.handleEndGuardFocus}),this.showDragHandle&&s("div",{key:"2f30f95cec55aa7dac22e65b4ec588fb62a74ba2",class:{"md-bottom-sheet__drag-handle":true,"md-bottom-sheet__drag-handle--dragging":this.dragging},part:"drag-handle","aria-hidden":"true",onPointerDown:this.handleDragStart,onPointerMove:this.handleDragMove,onPointerUp:this.handleDragEnd,onPointerCancel:this.handleDragEnd},s("div",{key:"36b88841e55f3dcc8632eae6aa4ccbed8d66b288",class:"md-bottom-sheet__drag-handle-indicator",part:"drag-handle-indicator"})),e&&s("div",{key:"86cf0fb217c23190850506d20cc315bb33a2cd61",class:"md-bottom-sheet__header",part:"header"},t&&s("span",{key:"718af03929d31904541e40781143b1c03058493e",id:this.headlineId,class:"md-bottom-sheet__headline",part:"headline"},s("slot",{key:"b42e1bd6a51d8aa774ab5fbf401bee39b9610f97",name:"headline"},this.headline)),(this.closeable||this.hasSlottedClose)&&s("div",{key:"2c85f77dc9d235fcf042682746800d1a106f776e",class:"md-bottom-sheet__close",part:"close"},s("slot",{key:"8b519e7a49a47fb7ac6a680edddcfc3571d086e5",name:"close"},s("md-icon-button",{key:"0aedcd29fd764feec2fd7782e0e98c1abde2b379",variant:"standard",icon:"close","aria-label":"Close bottom sheet",onClick:this.handleCloseClick})))),this.topDivider&&s("div",{key:"a568c1979145410546cc022b05c872eb85854ea0",class:"md-bottom-sheet__divider",part:"divider-top","aria-hidden":"true"}),s("div",{key:"d38538f74c944acf9b797ac71b0edc31f5a5ec12",class:"md-bottom-sheet__content",part:"content"},s("slot",{key:"f9c060e543f80074ca44455b80e8e208027cb447"})),this.hasActions&&this.bottomDivider&&s("div",{key:"d9695c0415763040a0e940b90629fc247dd48cf5",class:"md-bottom-sheet__divider md-bottom-sheet__divider--bottom",part:"divider-bottom","aria-hidden":"true"}),this.hasActions&&s("div",{key:"97f2727a454a547ed42f2bb7ae975c9c1faba061",class:"md-bottom-sheet__actions",part:"actions"},s("slot",{key:"8a8c7a032c56d0ee4d575bf8b28668977564787c",name:"actions"})),s("span",{key:"02d8e8162536432e224b8b4be26f3e3debadbd91",class:"md-bottom-sheet__focus-guard",tabindex:0,"aria-hidden":"true",onFocus:this.handleStartGuardFocus})))}get el(){return o(this)}static get watchers(){return{open:[{onOpenChange:0}]}}};n.style=a();export{n as md_bottom_sheet};
|
|
2
|
+
//# sourceMappingURL=p-27135a6b.entry.js.map
|