@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":["pad2","n","String","toIsoDate","d","getFullYear","getMonth","getDate","buildValidatedDate","year","month","day","Date","escapeRegExp","value","replace","resolveDateSeparator","locale","explicit","length","parts","Intl","DateTimeFormat","formatToParts","literal","find","p","type","formatDisplayDate","separator","sep","undefined","map","join","dateFormatPattern","prefersDayFirst","dayIdx","findIndex","monthIdx","parseCompactDateInput","digits","a","Number","parseInt","slice","b","candidates","pattern","valid","c","date","filter","mddDay","mddMonth","mdd","ddmDay","ddm","mmdMonth","mmd","preferred","pick","parseFlexibleDateInput","trimmed","trim","iso","parseIsoDate","test","split","RegExp","Boolean","nums","some","isNaN","m","exec","y","mo","daysInMonth","getFirstDayOfWeek","IntlAny","loc","Locale","getWeekInfo","w","firstDay","weekInfo","isoLte","isSameDay","addDays","addMonths","target","lastDay","Math","min","clampDate","minIso","maxIso","isOutOfRange","buildMonthMatrix","firstDayOfWeek","first","firstWeekday","getDay","lead","start","cells","i","push","outOfMonth","weekdayNames","format","fmt","weekday","names","idx","mdDatePickerCss","dpUid","DOCKED_SELECTION_BLOOM_IN_MS","DOCKED_SELECTION_BLOOM_OUT_MS","PANEL_BLOOM_OUT_MS","DOCKED_CALENDAR_BLOOM_IN_MS","DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET","DOCKED_NAV_MENU_TOOLTIP_OFFSET","MdDatePicker","constructor","hostRef","this","valueMissingLabel","reserveSupportingSpace","customValidityMessage","defaultValue","variant","label","placeholder","max","open","disabled","required","clearable","clearLabel","error","errorText","supportingText","dateSeparator","fieldVariant","headline","cancelLabel","okLabel","selectDateLabel","enterDatesLabel","invalidDateLabel","previousMonthLabel","nextMonthLabel","previousYearLabel","nextYearLabel","chooseMonthLabel","chooseYearLabel","chooseMonthYearLabel","chooseMonthAndYearLabel","toggleCalendarLabel","toggleTextLabel","openCalendarLabel","closeCalendarLabel","calendarIcon","yearGridLabel","scrimDismissible","outsideClickDismissible","commitOnSelect","name","density","focused","inputDraft","viewYear","viewMonth","viewMode","inputMode","focusedDate","pendingDate","hasSlottedHeader","hasSlottedActions","hasSlottedLeading","hasSlottedCalendarIcon","monthMenuOpen","yearMenuOpen","selectionMenuClosing","dockedCalendarBloom","gridSlideDirection","yearViewClosing","modalCalendarBloom","panelClosing","dockedPanelAlign","dockedPanelPlacement","dockedPanelMaxBlockSize","uid","entryInputShouldFocus","restoreFocusEl","gridShouldFocus","menuShouldFocus","menuRestoreFocus","yearGridShouldScroll","yearListMinYear","yearListMaxYear","panelPointerEngaged","closingFromDismiss","dockedPositionCleanup","dockedPositionRafId","dockedPositionRafAttempts","lastSelectedEmitValue","onFieldInput","e","v","mdInput","emit","onFieldCommit","raw","emitChange","syncTextFieldDisplay","parsed","isDisabledDate","formatField","syncViewToValue","onGridSlideAnimationEnd","currentTarget","animationName","includes","toggleMonthMenu","toggleMonthMenuAsync","toggleYearMenu","toggleYearMenuAsync","onMonthMenuClose","closeDockedSelectionMenu","bloomCalendar","restoreFocus","onYearMenuClose","toggleYearView","closeYearViewAnimated","openYearView","toggleInputMode","commitDialogInput","emitModeChange","onPanelMouseDown","button","panelEl","shouldPanelClaimFocus","handleDayKeyDown","defaultPrevented","handleCalendarKeyDown","isDockedMenuToggleKey","key","toLowerCase","preventDefault","stopPropagation","stopImmediatePropagation","next","resolveNavigationKey","shiftKey","isDayGridKeyTarget","selectDay","commit","prevViewYear","prevViewMonth","navKey","setGridSlideDirection","onPanelKeyDown","isDocked","closeMenus","requestDismiss","canHandleCalendarKeyDown","resolveCalendarKeyTarget","trapTab","textFieldKeyDown","syncInputDraftFromField","entryTextFieldKeyDown","lastValidityKey","hasField","triggerExpanded","connectedCallback","componentWillLoad","syncFormValue","el","querySelector","seedFieldDraftFromValue","seedPending","lockScroll","componentDidLoad","shadow","shadowRoot","watch","set","slot","update","assignedElements","addEventListener","h","disconnectedCallback","unlockScroll","unbindDockedPositionListeners","getDockedViewportMargin","resetDockedPanelPosition","cancelAnimationFrame","resolveDockedPanelBlockSize","panel","prev","style","getPropertyValue","prevPriority","getPropertyPriority","setProperty","natural","offsetHeight","getBoundingClientRect","height","removeProperty","isRtl","window","getComputedStyle","direction","projectedHorizontalRect","anchorRect","panelW","align","rtl","left","right","positionDockedPanel","anchor","dockedAnchorEl","offsetWidth","width","measuredH","requestAnimationFrame","DOCKED_POSITION_RAF_MAX","panelH","margin","vw","innerWidth","vh","innerHeight","gap","placement","maxBlockSize","startRect","endRect","activeRect","startAgain","belowBottom","bottom","aboveTop","top","availableBelow","floor","availableAbove","changed","bindDockedPositionListeners","onReposition","passive","capture","removeEventListener","onBoundsChange","onDateSeparatorChange","onOpenChange","now","handleOpen","dismissPanel","handleClose","show","close","clear","focusInput","tfInput","focus","triggerEl","resolvedFirstDay","formatHeadline","formatMonthYear","formatFullDate","dateFormatHint","document","activeElement","clearYearListRange","clearModalCalendarBloom","mdOpen","clearDockedCalendarBloom","mdClose","restore","closeDockedMenusAnimated","prefersReducedMotion","delay","panelBloomOutMs","body","isDateDisabled","isDisabledYear","minDate","maxDate","mdChange","emitSelected","mdSelected","Promise","resolve","then","emitViewChange","source","mdViewChange","emitMenuOpen","mdMenuOpen","emitMenuSelect","mdMenuSelect","mode","mdModeChange","monthLabel","cell","cancel","mdCancel","asEventElement","input","closest","tf","syncEntryTextFieldDisplay","entryTextFieldEl","selected","delta","goToMonth","fromUser","ref","goToYear","captureYearListRange","navActionLabel","scope","side","navShortcutKey","navTooltipText","menuShortcutKey","kind","menuTooltipText","fullMonth","current","getYearListBounds","minYear","maxYear","keep","restoreMenuFocus","monthMenuButtonEl","yearMenuButtonEl","options","isOpen","selectionBloomOutMs","beginDockedCalendarBloom","openDockedMonthMenu","openDockedYearMenu","isDockedMonthMenuExpanded","isDockedYearMenuExpanded","dockedSelectionMenuToShow","dockedMenuTrailingIcon","expanded","renderDockedMenuTrailingCaret","class","part","run","getDockedSelectionMenuScrollEl","menuHost","menuShadow","getDockedSelectionMenuTarget","menu","scrollDockedSelectionMenuIntoView","scrollEl","scrollRect","itemRect","itemCenter","scrollCenter","scrollTop","scrollIntoView","block","inline","afterDockedSelectionMenuPaint","selectionBloomInMs","calculateModalYearGridScrollTop","columns","blockSize","paddingBlockStart","paddingBlockEnd","viewportBlockSize","yearCount","index","row","rowCount","ceil","rowStride","contentBlockSize","itemBlockStart","maxScroll","getModalYearGridScrollEl","wrap","scrollModalYearGridIntoView","afterModalYearGridPaint","matchMedia","matches","calendarBloomInMs","ms","setTimeout","beginModalCalendarBloom","waitForSelectionMenuClose","pickDockedSelection","apply","item","host","HTMLElement","waitForHostRipple","pickMonth","pickYear","selectYear","code","altKey","ctrlKey","metaKey","isEditableKeyTarget","editable","isInsideSelectionMenu","findInPickerTree","selector","root","getRootNode","ShadowRoot","parentElement","letter","isCalendarNavigationKey","menuToggle","t","isTriggerFieldTarget","getEventPathNodes","composedPath","nodes","node","parentNode","isNodeInPicker","isEventInPicker","isNodeInPanel","active","tryCommitTriggerFieldOnEnter","tryCommitDialogInputOnEnter","routePickerKeyDown","fromHostCapture","handleDocumentKeyDown","handleDocumentPointerDown","handleHostKeyDown","swallowNestedMdOpen","swallowNestedMdClose","focusFocusedDay","btn","focusables","Array","from","querySelectorAll","offsetParent","last","componentDidRender","renderTextFieldTrigger","display","supporting","appearFocused","onFocusin","onFocusout","onKeyDown","onMdInput","detail","onMdChange","icon","onClick","onMdClick","renderModalNavChevron","onStep","text","showDelay","position","offset","size","modalMonthYearTooltipText","renderNav","secondary","navYear","navMonth","yearExpanded","monthYearButton","toggle","trailingIcon","suppressExpandIconFlip","mirrorIcon","renderDockedNavChevron","visible","renderDockedNav","monthShort","monthExpanded","renderDockedSelectionDivider","role","renderDockedMonthMenu","closing","months","_","exportparts","quick","persistent","autoFocus","onMdClose","sel","renderDockedYearMenu","years","renderCalendar","primary","contentBloom","fullNames","today","gridLabel","onAnimationEnd","_unused","week","renderDay","isToday","isFocusTarget","unselected","shape","roleOverride","groupTabindex","renderYearGrid","r","renderDialogInput","renderHeadline","renderHeader","modeToggleLabel","hasActionRow","renderActions","renderBody","showYearGrid","showModalCalendar","selectionVisible","activeSelectionMenu","showYearMenu","showMonthMenu","renderPanel","docked","dockedMaxBlockStyle","tabindex","onMouseDown","renderModal","render","panelVisible","panelOpen","Host","setFormValue","internals","setValidityState","missing","missingMessage","customMessage","emitValidityChange","formResetCallback","getValidity","getValidityOf","validationMessage","primed","mdValidityChange","checkValidity","checkValidityOf","reportValidity","reportValidityOf","setCustomValidity","message"],"sources":["src/components/md-date-picker/date-utils.ts","src/components/md-date-picker/md-date-picker.css?tag=md-date-picker&encapsulation=shadow","src/components/md-date-picker/md-date-picker.tsx"],"sourcesContent":["/**\n * Pure date helpers used by md-date-picker.\n *\n * Co-located with the component but exported separately so we can\n * unit-test them without booting a Stencil page, and so the component\n * file stays a single-default-export module (required by Stencil's\n * bundling rules).\n */\n\n/** Pad a number to two digits (locale-independent). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\n/** ISO YYYY-MM-DD (local-time, NOT toISOString which is UTC). */\nexport function toIsoDate(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/** Build a local-midnight Date when (year, month, day) is a real calendar day. */\nfunction buildValidatedDate(\n year: number,\n month: number,\n day: number,\n): Date | null {\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n const d = new Date(year, month - 1, day);\n if (\n d.getFullYear() !== year ||\n d.getMonth() !== month - 1 ||\n d.getDate() !== day\n ) {\n return null;\n }\n return d;\n}\n\n/** Escape a separator for use inside a RegExp character class or alternation. */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Resolve the separator between day, month, and year segments.\n * When `explicit` is non-empty it wins; otherwise the locale's\n * `Intl.DateTimeFormat` literal is used (falls back to `/`).\n */\nexport function resolveDateSeparator(\n locale?: string,\n explicit?: string,\n): string {\n if (explicit && explicit.length > 0) return explicit;\n try {\n const parts = new Intl.DateTimeFormat(locale || 'en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(new Date(2000, 11, 31));\n const literal = parts.find((p) => p.type === 'literal');\n return literal?.value ?? '/';\n } catch {\n return '/';\n }\n}\n\n/**\n * Format a date for text-field display using locale field order and an\n * optional separator override (`date-separator` on the component).\n */\nexport function formatDisplayDate(\n d: Date,\n locale?: string,\n separator?: string,\n): string {\n const sep = resolveDateSeparator(locale, separator);\n const parts = new Intl.DateTimeFormat(locale || undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(d);\n return parts\n .map((p) => {\n switch (p.type) {\n case 'day':\n return pad2(d.getDate());\n case 'month':\n return pad2(d.getMonth() + 1);\n case 'year':\n return String(d.getFullYear());\n case 'literal':\n return sep;\n default:\n return '';\n }\n })\n .join('');\n}\n\n/**\n * Locale-aware date format hint (e.g. `MM/DD/YYYY` or `DD.MM.YYYY`) with an\n * optional separator override.\n */\nexport function dateFormatPattern(locale?: string, separator?: string): string {\n const sep = resolveDateSeparator(locale, separator);\n const parts = new Intl.DateTimeFormat(locale || 'en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(new Date(2000, 11, 31));\n return parts\n .map((p) => {\n switch (p.type) {\n case 'day':\n return 'DD';\n case 'month':\n return 'MM';\n case 'year':\n return 'YYYY';\n case 'literal':\n return sep;\n default:\n return '';\n }\n })\n .join('');\n}\n\n/** True when the locale formats day before month (e.g. en-GB). */\nfunction prefersDayFirst(locale?: string): boolean {\n try {\n const parts = new Intl.DateTimeFormat(locale || 'en-US').formatToParts(\n new Date(2025, 3, 3),\n );\n const dayIdx = parts.findIndex((p) => p.type === 'day');\n const monthIdx = parts.findIndex((p) => p.type === 'month');\n return dayIdx >= 0 && monthIdx >= 0 && dayIdx < monthIdx;\n } catch {\n return false;\n }\n}\n\n/**\n * Parse compact digit-only strings such as `06122025` (8) or `6122025` (7).\n * Year is always the trailing four digits.\n */\nfunction parseCompactDateInput(digits: string, locale?: string): Date | null {\n if (digits.length === 8) {\n const a = Number.parseInt(digits.slice(0, 2), 10);\n const b = Number.parseInt(digits.slice(2, 4), 10);\n const year = Number.parseInt(digits.slice(4, 8), 10);\n let month: number;\n let day: number;\n\n if (a > 12 && b <= 12) {\n day = a;\n month = b;\n } else if (b > 12 && a <= 12) {\n month = a;\n day = b;\n } else if (a > 12 && b > 12) {\n return null;\n } else if (prefersDayFirst(locale)) {\n day = a;\n month = b;\n } else {\n month = a;\n day = b;\n }\n return buildValidatedDate(year, month, day);\n }\n\n if (digits.length === 7) {\n const year = Number.parseInt(digits.slice(3, 7), 10);\n const candidates: Array<{ month: number; day: number; pattern: string }> = [\n {\n month: Number.parseInt(digits.slice(0, 1), 10),\n day: Number.parseInt(digits.slice(1, 3), 10),\n pattern: 'MDD',\n },\n {\n day: Number.parseInt(digits.slice(0, 2), 10),\n month: Number.parseInt(digits.slice(2, 3), 10),\n pattern: 'DDM',\n },\n {\n month: Number.parseInt(digits.slice(0, 2), 10),\n day: Number.parseInt(digits.slice(2, 3), 10),\n pattern: 'MMD',\n },\n ];\n\n const valid = candidates\n .map((c) => ({\n ...c,\n date: buildValidatedDate(year, c.month, c.day),\n }))\n .filter((c) => c.date !== null);\n\n if (valid.length === 0) return null;\n if (valid.length === 1) return valid[0].date;\n\n const mddDay = Number.parseInt(digits.slice(1, 3), 10);\n const mddMonth = Number.parseInt(digits.slice(0, 1), 10);\n if (mddMonth >= 1 && mddMonth <= 9 && mddDay >= 10) {\n const mdd = valid.find((c) => c.pattern === 'MDD');\n if (mdd) return mdd.date;\n }\n\n const ddmDay = Number.parseInt(digits.slice(0, 2), 10);\n if (ddmDay > 12) {\n const ddm = valid.find((c) => c.pattern === 'DDM');\n if (ddm) return ddm.date;\n }\n\n const mmdMonth = Number.parseInt(digits.slice(0, 2), 10);\n if (mmdMonth > 12) {\n const mmd = valid.find((c) => c.pattern === 'MMD');\n if (mmd) return mmd.date;\n }\n\n const preferred = prefersDayFirst(locale) ? 'DDM' : 'MMD';\n const pick = valid.find((c) => c.pattern === preferred) ?? valid[0];\n return pick.date;\n }\n\n return null;\n}\n\n/**\n * Parse a user-typed date string into a local-midnight Date, or null.\n *\n * Accepts flexible separators (`/`, `-`, `.`, spaces) when no `separator` is\n * given, or only the configured `separator` when set. Optional leading zeros\n * on month/day, compact digit strings (`06122025`, `6122025`), and ISO\n * `YYYY-MM-DD` are always accepted. When the year has four digits, order is\n * inferred: `YYYY-M-D`, `M-D-YYYY`, or `D-M-YYYY` (when the first segment is\n * > 12 and the second is ≤ 12). Ambiguous compact/all-numeric orders fall back\n * to the locale hint.\n */\nexport function parseFlexibleDateInput(\n value: string,\n locale?: string,\n separator?: string,\n): Date | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n const iso = parseIsoDate(trimmed);\n if (iso) return iso;\n\n if (/^\\d+$/.test(trimmed)) {\n return parseCompactDateInput(trimmed, locale);\n }\n\n let parts: string[];\n if (separator && separator.length > 0) {\n parts = trimmed.split(new RegExp(escapeRegExp(separator))).filter(Boolean);\n } else {\n parts = trimmed.split(/[/\\-.]|\\s+/).filter(Boolean);\n }\n if (parts.length !== 3) return null;\n\n const nums = parts.map((p) => Number.parseInt(p, 10));\n if (nums.some((n) => Number.isNaN(n))) return null;\n\n let year: number;\n let month: number;\n let day: number;\n\n if (parts[0].length === 4 || nums[0] > 31) {\n [year, month, day] = nums;\n } else if (parts[2].length === 4 || nums[2] > 31) {\n if (nums[0] > 12 && nums[1] <= 12) {\n [day, month, year] = nums;\n } else if (nums[1] > 12 && nums[0] <= 12) {\n [month, day, year] = nums;\n } else if (prefersDayFirst(locale)) {\n [day, month, year] = nums;\n } else {\n [month, day, year] = nums;\n }\n } else {\n return null;\n }\n\n return buildValidatedDate(year, month, day);\n}\n\n/** Parse YYYY-MM-DD into a local-midnight Date, or null. */\nexport function parseIsoDate(value: string): Date | null {\n if (!value) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value.trim());\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const day = Number(m[3]);\n const d = new Date(y, mo, day);\n if (\n d.getFullYear() !== y ||\n d.getMonth() !== mo ||\n d.getDate() !== day\n ) {\n return null;\n }\n return d;\n}\n\n/** Number of days in the (year, month) where month is 0-indexed. */\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Resolve the first day-of-week index for the given BCP-47 locale.\n * Returns 0 (Sunday) when the runtime can't tell us — that matches\n * the en-US default. */\nexport function getFirstDayOfWeek(locale: string): number {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const IntlAny: any = Intl;\n const loc = new IntlAny.Locale(locale || 'en-US');\n if (typeof loc.getWeekInfo === 'function') {\n const w = loc.getWeekInfo();\n if (w && typeof w.firstDay === 'number') {\n return w.firstDay === 7 ? 0 : w.firstDay;\n }\n }\n if (loc.weekInfo && typeof loc.weekInfo.firstDay === 'number') {\n return loc.weekInfo.firstDay === 7 ? 0 : loc.weekInfo.firstDay;\n }\n } catch {\n /* ignore */\n }\n return 0;\n}\n\n/** YYYY-MM-DD comparison without timezone surprises. */\nexport function isoLte(a: string, b: string): boolean {\n return a <= b;\n}\n\n/** True when `a` is the same calendar day as `b`. */\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/** Return a new Date `n` days after `d` (local time, no mutation). */\nexport function addDays(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n}\n\n/** Return a new Date `n` months after `d`, clamping the day-of-month so\n * e.g. Jan 31 + 1 month → Feb 28/29 instead of spilling into March. */\nexport function addMonths(d: Date, n: number): Date {\n const target = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth());\n return new Date(\n target.getFullYear(),\n target.getMonth(),\n Math.min(d.getDate(), lastDay),\n );\n}\n\n/** Clamp a date into the inclusive [minIso, maxIso] window. Returns the\n * same date when already inside (or when a bound is absent). */\nexport function clampDate(\n d: Date,\n minIso: string,\n maxIso: string,\n): Date {\n const iso = toIsoDate(d);\n if (minIso && !isoLte(minIso, iso)) {\n return parseIsoDate(minIso) ?? d;\n }\n if (maxIso && !isoLte(iso, maxIso)) {\n return parseIsoDate(maxIso) ?? d;\n }\n return d;\n}\n\n/** True when `d` lies outside the inclusive [minIso, maxIso] window. */\nexport function isOutOfRange(d: Date, minIso: string, maxIso: string): boolean {\n const iso = toIsoDate(d);\n if (minIso && !isoLte(minIso, iso)) return true;\n if (maxIso && !isoLte(iso, maxIso)) return true;\n return false;\n}\n\n/** A single rendered calendar cell. */\nexport interface DayCell {\n date: Date;\n /** Belongs to a month other than the one being displayed. */\n outOfMonth: boolean;\n}\n\n/**\n * Build a fixed 6-row (42-cell) calendar matrix for `(year, month)`,\n * starting on `firstDayOfWeek` (0 = Sunday … 6 = Saturday). Leading and\n * trailing cells are filled with the adjacent months' days, flagged\n * `outOfMonth` so the UI can mute them.\n */\nexport function buildMonthMatrix(\n year: number,\n month: number,\n firstDayOfWeek: number,\n): DayCell[] {\n const first = new Date(year, month, 1);\n const firstWeekday = first.getDay();\n const lead = (firstWeekday - firstDayOfWeek + 7) % 7;\n const start = addDays(first, -lead);\n const cells: DayCell[] = [];\n for (let i = 0; i < 42; i++) {\n const date = addDays(start, i);\n cells.push({ date, outOfMonth: date.getMonth() !== month });\n }\n return cells;\n}\n\n/** Ordered short weekday names for a locale, rotated to `firstDayOfWeek`. */\nexport function weekdayNames(\n locale: string,\n firstDayOfWeek: number,\n format: 'narrow' | 'short' | 'long' = 'narrow',\n): string[] {\n const fmt = new Intl.DateTimeFormat(locale || undefined, { weekday: format });\n // 2024-01-07 is a Sunday — a stable anchor for indexing weekdays 0..6.\n const names: string[] = [];\n for (let i = 0; i < 7; i++) {\n const idx = (firstDayOfWeek + i) % 7;\n names.push(fmt.format(new Date(2024, 0, 7 + idx)));\n }\n return names;\n}\n","/* ==========================================================\n md-date-picker — Material Design 3 Date Picker\n Spec: https://m3.material.io/components/date-pickers/specs\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-date-picker-container-color Dialog / popup body background\n --md-date-picker-header-color Modal header background\n --md-date-picker-container-shape Dialog / popup corner radius\n --md-date-picker-field-color Text-field resting outline color\n --md-date-picker-field-focus-color Text-field focused outline / label color\n --md-date-picker-field-text-color Text-field input text color\n --md-date-picker-field-container-color Filled-field container background\n --md-date-picker-field-container-shape Text-field corner radius (filled + outlined)\n --md-date-picker-field-filled-pill Filled field: 1 for capsule/pill (all corners)\n --md-date-picker-field-supporting-color Supporting text below the field\n --md-date-picker-label-color Floating label color\n --md-date-picker-headline-color Modal headline (selected date) color\n --md-date-picker-supporting-color Header supporting-text color\n --md-date-picker-weekday-color Weekday column-header color\n --md-date-picker-day-color Day cell text color\n --md-date-picker-day-selected-color Selected day text color\n --md-date-picker-day-selected-bg Selected day container color\n --md-date-picker-day-selected-shape Selected day corner radius (overrides morph)\n --md-date-picker-day-today-shape Today ring corner radius\n --md-date-picker-today-outline-color Today's outline ring color\n --md-date-picker-day-outline-color Deprecated — unselected days are plain text\n --md-date-picker-action-color Cancel / OK action label color\n --md-date-picker-menu-color Docked month/year menu surface\n --md-date-picker-selection-bloom-duration Docked month/year menu bloom-in duration\n --md-date-picker-selection-bloom-easing Docked month/year menu bloom-in easing\n --md-date-picker-selection-bloom-out-duration Docked menu bloom-out on pick (default short4)\n --md-date-picker-calendar-bloom-duration Docked day grid bloom-in after pick (default medium2)\n --md-date-picker-grid-slide-duration Day grid month/year slide duration\n --md-date-picker-panel-bloom-out-duration Panel bloom-out on dismiss (default short4)\n --md-date-picker-scrim-color Modal scrim color\n --md-date-picker-icon-color Trailing / nav icon color\n --md-date-picker-panel-width Modal / docked popup panel inline size\n --md-date-picker-panel-max-block-size Modal / docked popup panel max block size\n --md-date-picker-docked-panel-width Docked popup panel inline size (overrides panel-width)\n --md-date-picker-year-inline-size Year grid cell inline size (modal)\n --md-date-picker-year-block-size Year grid cell block size (modal)\n --md-date-picker-year-grid-gap Year grid row/column gap (modal)\n --md-date-picker-year-grid-padding-inline Year grid inline padding (modal)\n --md-date-picker-year-grid-viewport-block-size Year grid scroll viewport block size (modal)\n\n CSS PARTS:\n field Text-field container (trigger)\n leading-icon Slotted leading icon wrapper\n label Floating field label\n input Field text input\n calendar-button Trailing calendar toggle button\n supporting-text Helper / error text below the field\n modal Modal wrapper (scrim + panel)\n scrim Modal scrim overlay\n panel Dialog / docked popup surface\n header Modal header region\n supporting Header supporting text\n headline Large selected-date headline\n mode-toggle Calendar / text-input switch button\n body Calendar / year / input body region\n nav Month label + prev/next nav row (also docked nav row)\n month-toggle Month-year menu button (opens year grid; modal; same as menu-button)\n prev-button Previous-month md-icon-button (modal)\n next-button Next-month md-icon-button (modal)\n month-menu-button Docked month dropdown menu button (\"Aug ▾\")\n year-menu-button Docked year dropdown menu button (\"2025 ▾\")\n prev-month-button Docked previous-month chevron icon button\n next-month-button Docked next-month chevron icon button\n prev-year-button Docked previous-year chevron icon button\n next-year-button Docked next-year chevron icon button\n selection-divider Divider between docked nav and month/year menu\n month-menu Docked inline baseline md-menu (month selection)\n year-menu Docked inline baseline md-menu (year selection)\n month-option A month option in the docked month menu\n month-option-selected The selected month option\n year-option A year option in the docked year menu\n year-option-selected The selected year option\n calendar Calendar grid wrapper\n weekdays Weekday header row\n weekday A single weekday column header\n grid Day-cell grid\n day A day cell button\n day-unselected Unselected in-month day cell (plain text)\n day-selected Selected day cell (filled circle)\n day-today Today's day cell (outlined circle)\n day-disabled Disabled / out-of-range day cell\n day-outside Adjacent-month day cell (muted)\n year-grid Year-selection grid (modal)\n year-grid-wrap Animated wrapper for modal year grid\n year-grid-scroll md-scroll-shadow wrapper for modal year grid\n year-grid-viewport Modal year grid scroll viewport (re-exported)\n year-grid-shadow-block-start Top scroll shadow (re-exported)\n year-grid-shadow-block-end Bottom scroll shadow (re-exported)\n year A year cell button (modal)\n year-unselected Unselected year cell (plain text)\n year-selected Selected year cell (filled pill)\n year-disabled Disabled / out-of-range year cell\n entry In-dialog text-entry region\n entry-input In-dialog outlined md-text-field (single modal input)\n actions Cancel / OK action row\n cancel-button Cancel action\n ok-button Confirm action\n\n SLOTS:\n leading-icon Custom leading icon for the field\n calendar-icon Custom trailing calendar toggle icon (replaces calendar-icon prop)\n header Replaces the entire modal header\n actions Replaces the Cancel / OK action row\n ========================================================== */\n\n:host {\n /* Public → internal token mapping */\n --_selection-bloom-duration: var(\n --md-date-picker-selection-bloom-duration,\n var(--md-sys-motion-duration-long1, 450ms)\n );\n --_selection-bloom-easing: var(\n --md-date-picker-selection-bloom-easing,\n var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1))\n );\n --_selection-bloom-out-duration: var(\n --md-date-picker-selection-bloom-out-duration,\n var(--md-sys-motion-duration-short4, 200ms)\n );\n --_calendar-bloom-duration: var(\n --md-date-picker-calendar-bloom-duration,\n var(--md-sys-motion-duration-medium2, 300ms)\n );\n --_grid-slide-duration: var(\n --md-date-picker-grid-slide-duration,\n var(--md-sys-motion-duration-medium2, 300ms)\n );\n --_grid-slide-easing: var(\n --md-sys-motion-easing-emphasized,\n cubic-bezier(0.2, 0, 0, 1)\n );\n --_panel-bloom-out-duration: var(\n --md-date-picker-panel-bloom-out-duration,\n var(--md-sys-motion-duration-short4, 200ms)\n );\n --_selection-bloom-out-easing: var(\n --md-sys-motion-easing-emphasized-accelerate,\n cubic-bezier(0.3, 0, 0.8, 0.15)\n );\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface));\n --_header-color: var(--md-date-picker-header-color, var(--md-sys-color-surface-container-high));\n --_container-shape: var(--md-date-picker-container-shape, var(--md-sys-shape-corner-extra-large, 28px));\n --_field-color: var(--md-date-picker-field-color, var(--md-sys-color-outline));\n --_field-focus-color: var(--md-date-picker-field-focus-color, var(--md-sys-color-primary));\n --_field-text-color: var(--md-date-picker-field-text-color, var(--md-sys-color-on-surface));\n --_field-container-color: var(\n --md-date-picker-field-container-color,\n var(--md-sys-color-surface-container-highest, #e6e0e9)\n );\n --_field-container-shape: var(\n --md-date-picker-field-container-shape,\n var(--md-sys-shape-corner-extra-small, 4px)\n );\n --_field-supporting-color: var(\n --md-date-picker-field-supporting-color,\n var(--md-sys-color-on-surface-variant)\n );\n --_label-color: var(--md-date-picker-label-color, var(--md-sys-color-on-surface-variant));\n --_headline-color: var(--md-date-picker-headline-color, var(--md-sys-color-on-surface));\n --_supporting-color: var(--md-date-picker-supporting-color, var(--md-sys-color-on-surface-variant));\n --_weekday-color: var(--md-date-picker-weekday-color, var(--md-sys-color-on-surface));\n --_weekday-size: 24px;\n --_day-color: var(--md-date-picker-day-color, var(--md-sys-color-on-surface));\n /* Adjacent-month days stay selectable, so their label must meet WCAG AA\n (4.5:1) contrast — a solid de-emphasized token, not opacity-faded text. */\n --_day-outside-color: var(--md-date-picker-day-outside-color, var(--md-sys-color-on-surface-variant, #49454f));\n --_day-selected-color: var(--md-date-picker-day-selected-color, var(--md-sys-color-on-primary));\n --_day-selected-bg: var(--md-date-picker-day-selected-bg, var(--md-sys-color-primary));\n --_today-outline-color: var(--md-date-picker-today-outline-color, var(--md-sys-color-primary));\n --_action-color: var(--md-date-picker-action-color, var(--md-sys-color-primary));\n --_menu-color: var(--md-date-picker-menu-color, var(--md-sys-color-surface-container-high));\n --_scrim-color: var(--md-date-picker-scrim-color, var(--md-sys-color-scrim, #000));\n --_icon-color: var(--md-date-picker-icon-color, var(--md-sys-color-on-surface-variant));\n /* Fixed panel width (360px) so the nav row (month/year selectors + chevrons)\n and header always fit. The calendar cells + grid gaps still densify inside\n it; only the panel HEIGHT tracks content (block-size:auto below). */\n /* Width = day grid + 2×12px gutter, so the grid FILLS the body (no extra\n centering gap) and its edges line up with the nav and the Cancel/OK footer.\n Chosen wider than the bare grid so the 1fr day columns spread the day\n circles across the row (fill the space) instead of packing them tight;\n shrinks ~20px/rung with density so the spread stays proportional, floored\n at 288px so the day circles never overlap. */\n --_panel-width: var(--md-date-picker-panel-width, max(288px, calc(380px + var(--md-sys-density-scale, 0) * 20px)));\n --_panel-max-block-size: var(--md-date-picker-panel-max-block-size, 524px);\n --_error-color: var(--md-sys-color-error);\n /* 1px per rung off 24dp (18px floor) — the library-wide icon taper. */\n --_icon-size: var(--md-date-picker-icon-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px)));\n /* Day cell follows global density (40px at 0 → 28px at -4, 3px/rung). The grid\n columns/rows, day buttons and panel width all derive from this. */\n --_day-size: max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px));\n /* Year pills, gap and scroll viewport follow global density like the day grid. */\n --_year-inline-size: var(--md-date-picker-year-inline-size, max(48px, calc(72px + var(--md-sys-density-scale, 0) * 6px)));\n --_year-block-size: var(--md-date-picker-year-block-size, max(24px, calc(36px + var(--md-sys-density-scale, 0) * 3px)));\n /* 2× day grid gap — year pills are wider and need more breathing room in the 360px panel. */\n --_year-grid-gap: var(--md-date-picker-year-grid-gap, max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px)));\n --_year-grid-padding-inline: var(--md-date-picker-year-grid-padding-inline, 30px);\n /* 8×36px year rows — scroll viewport below modal nav; shrinks with density. */\n --_year-grid-viewport-block-size: var(--md-date-picker-year-grid-viewport-block-size, max(180px, calc(288px + var(--md-sys-density-scale, 0) * 24px)));\n --_grid-gap: max(2px, calc(6px + var(--md-sys-density-scale, 0) * 1px));\n --_caret-fade-duration: var(--md-sys-motion-duration-short3, 150ms);\n --_caret-fade-easing: var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n\n display: inline-block;\n inline-size: 100%;\n max-inline-size: 360px;\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n color: var(--_field-text-color);\n position: relative;\n}\n\n:host(.md-date-picker--docked) {\n /* Do not stretch in flex parents — popup anchors to field bottom, not host block-size. */\n align-self: flex-start;\n /* Docked variant is gated by its 6-control nav (< month > < year >), which is\n wider than the shrinking day grid. The nav densifies ~10px/rung, so the\n floor tracks it (360px at density 0 → ~320px at -4) rather than following\n the modal panel all the way down (would clip the nav). Modal has only 3 nav\n controls, so it shrinks freely via --_panel-width. */\n --_docked-panel-width: var(--md-date-picker-docked-panel-width, max(calc(360px + var(--md-sys-density-scale, 0) * 10px), var(--_panel-width)));\n /* 7×6 day grid + weekday row — shared by calendar and month/year menus. */\n --_docked-content-block-size: calc(\n var(--_weekday-size) + 16px + 6 * var(--_day-size) + 5 * var(--_grid-gap) + 8px\n );\n}\n\n:host(.md-date-picker--modal) {\n display: contents;\n}\n\n:host(.md-date-picker--disabled) {\n pointer-events: none;\n opacity: 0.5;\n}\n\n.material-symbols-outlined {\n font-family: var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n overflow-wrap: normal;\n direction: ltr;\n /* Form the icon ligatures (e.g. \"chevron_left\" → glyph) — matches\n md-icon-button so glyphs never fall back to literal text. */\n font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n.md-date-picker__icon {\n font-size: var(--_icon-size);\n inline-size: var(--_icon-size);\n block-size: var(--_icon-size);\n color: var(--_icon-color);\n pointer-events: none;\n}\n\n/* ---- Text-field trigger (docked + modal-input) ---------------------- */\n\n.md-date-picker__textfield,\n.md-date-picker__entry-textfield {\n display: block;\n inline-size: 100%;\n --md-text-field-outline-color: var(--_field-color);\n --md-text-field-input-color: var(--_field-text-color);\n --md-text-field-label-color: var(--_label-color);\n --md-text-field-active-indicator-color: var(--_field-focus-color);\n --md-text-field-supporting-text-color: var(--_field-supporting-color);\n --md-text-field-icon-color: var(--_icon-color);\n --md-text-field-container-color: var(--_field-container-color);\n --md-text-field-container-shape: var(--_field-container-shape);\n --md-text-field-filled-pill: var(--md-date-picker-field-filled-pill, 0);\n}\n\n/* Keep the trigger visually coupled to the open panel — OS focus moves into\n the popup, but `appear-focused` on md-text-field needs primary outline /\n label tokens (not the resting outline) so the field does not fall back to\n hover charcoal or a mismatched border colour. */\n:host(.md-date-picker--open) .md-date-picker__textfield {\n --md-text-field-active-indicator-color: var(--_field-focus-color);\n --md-text-field-icon-color: var(--_field-focus-color);\n}\n\n/* Trigger + popup share one positioning context sized to the field only. */\n.md-date-picker__docked-anchor {\n position: relative;\n display: block;\n inline-size: 100%;\n}\n\n/* ---- Modal scrim + panel -------------------------------------------- */\n\n.md-date-picker__modal {\n position: fixed;\n inset: 0;\n z-index: var(--md-sys-z-index-modal, 1000);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--md-sys-spacing-inset-lg, 16px);\n}\n\n.md-date-picker__scrim {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--_scrim-color) 32%, transparent);\n animation: md-date-picker-fade-in var(--md-sys-motion-duration-short3, 150ms)\n var(--md-sys-motion-easing-standard, ease);\n}\n\n.md-date-picker__modal--closing .md-date-picker__scrim {\n animation: md-date-picker-fade-out\n var(--_panel-bloom-out-duration)\n var(--md-sys-motion-easing-standard, ease)\n forwards;\n}\n\n.md-date-picker__panel {\n position: relative;\n display: flex;\n flex-direction: column;\n inline-size: var(--_panel-width);\n max-inline-size: calc(100vw - 32px);\n max-block-size: min(\n var(--_panel-max-block-size),\n calc(100vh - 32px),\n calc(100dvh - 32px)\n );\n overflow: hidden;\n background: var(--_container-color);\n color: var(--_field-text-color);\n border-radius: var(--_container-shape);\n box-shadow: var(--md-sys-elevation-3, 0 4px 8px 3px rgba(0, 0, 0, 0.15),\n 0 1px 3px rgba(0, 0, 0, 0.3));\n}\n\n/* Modal calendar / range — unified surface-container-high. Height fits the\n content (capped by max-block-size on .md-date-picker__panel) so the panel\n shrinks as the calendar + header + footer densify, instead of pooling the\n freed space as empty top/bottom padding. At density 0 the 6-row calendar\n still fills ~the 524px cap. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked):not(.md-date-picker__panel--input-mode) {\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface-container-high));\n block-size: auto;\n}\n\n/* Modal date-input — unified surface-container-high; compact height. */\n.md-date-picker__panel--input-mode:not(.md-date-picker__panel--docked) {\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface-container-high));\n block-size: auto;\n min-block-size: 0;\n}\n\n/* Modal / range — scale entrance (non-docked). */\n.md-date-picker__panel:not(.md-date-picker__panel--docked):not(.md-date-picker__panel--bloom-out) {\n animation: md-date-picker-scale var(--md-sys-motion-duration-medium2, 300ms)\n var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1));\n transform-origin: center top;\n}\n\n/* Docked popup — expressive bloom entrance (matches month/year menus). */\n.md-date-picker__panel--docked.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n animation: md-date-picker-selection-bloom-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n/* Panel dismiss — bloom-out shrink/fade (docked + modal). */\n.md-date-picker__panel--bloom-out {\n animation: md-date-picker-panel-bloom-out\n var(--_panel-bloom-out-duration)\n var(--_selection-bloom-out-easing)\n both;\n transform-origin: center top;\n}\n\n:host(.md-date-picker--panel-closing) .md-date-picker__panel {\n pointer-events: none;\n}\n\n/* Panel is tabindex=\"-1\" for shortcut routing — never show a focus ring on the container. */\n.md-date-picker__panel:focus,\n.md-date-picker__panel:focus-visible {\n outline: none;\n}\n\n.md-date-picker__panel--docked {\n /* Docked drawer + selection menus share surface-container-high. */\n --_container-color: var(--md-sys-color-surface-container-high);\n position: absolute;\n /* 4px MD3 gap below field — popup wrapper is already at inset-block-start: 100%. */\n inset-block-start: 4px;\n inset-block-end: auto;\n inset-inline-start: 0;\n inset-inline-end: auto;\n inline-size: var(--_docked-panel-width);\n max-inline-size: calc(100vw - 32px);\n /* Grow to natural content height; cap only when viewport is short. */\n block-size: auto;\n min-block-size: 0;\n max-block-size: min(\n var(--_panel-max-block-size),\n calc(100vh - 32px),\n calc(100dvh - 32px)\n );\n display: flex;\n flex-direction: column;\n /* Visible so md-tooltip popups above docked nav are not clipped; scroll lives on calendar/menu. */\n overflow: visible;\n box-shadow: none;\n border-radius: var(--md-sys-shape-corner-large, 16px);\n z-index: var(--md-sys-z-index-popup, 900);\n}\n\n/* Viewport-aware flip — align panel end edge to anchor end when start overflows. */\n.md-date-picker__panel--docked.md-date-picker__panel--align-end {\n inset-inline-start: auto;\n inset-inline-end: 0;\n}\n\n/* Viewport-aware flip — open above the field when block-end overflows. */\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above {\n inset-block-start: auto;\n inset-block-end: 4px;\n}\n\n.md-date-picker__docked-popup {\n position: absolute;\n inset-block-start: 100%;\n inset-block-end: auto;\n inset-inline-start: 0;\n inline-size: 100%;\n}\n\n.md-date-picker__docked-popup--above {\n inset-block-start: auto;\n inset-block-end: 100%;\n}\n\n/* Bloom origin follows the anchored corner (start/end × below/above).\n\n `transform-origin` has no logical keywords — `inline-start` / `inline-end`\n are invalid values, so every one of the rules below was dropped whole and\n the panel bloomed from its own centre in both directions. These two\n properties carry the physical equivalent and swap under RTL, which is what\n the logical keywords were reaching for. */\n:host {\n --_docked-origin-inline-start: left;\n --_docked-origin-inline-end: right;\n}\n\n:host([dir='rtl']),\n:host-context([dir='rtl']) {\n --_docked-origin-inline-start: right;\n --_docked-origin-inline-end: left;\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: top var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--align-end.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: top var(--_docked-origin-inline-end);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: bottom var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--align-end.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: bottom var(--_docked-origin-inline-end);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--bloom-out {\n transform-origin: top var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--align-end.md-date-picker__panel--bloom-out {\n transform-origin: top var(--_docked-origin-inline-end);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--bloom-out {\n transform-origin: bottom var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--align-end.md-date-picker__panel--bloom-out {\n transform-origin: bottom var(--_docked-origin-inline-end);\n}\n\n/* ---- Header --------------------------------------------------------- */\n\n/* Redline header anatomy (modal): 16px top, 24px inline-start, 12px inline-end,\n 12px bottom. The supporting + headline rows stack with no inter-row gap so the\n 36px supporting region and 40px headline region land exactly. */\n.md-date-picker__header {\n display: flex;\n flex-direction: column;\n gap: 0;\n padding-block-start: var(--md-sys-spacing-inset-lg, 16px);\n padding-block-end: var(--md-sys-spacing-inset-md, 12px);\n padding-inline-start: var(--md-sys-spacing-inset-xl, 24px);\n padding-inline-end: var(--md-sys-spacing-inset-md, 12px);\n background-color: var(--_header-color);\n border-block-end: 1px solid var(--md-sys-color-outline-variant);\n flex: none;\n}\n\n/* \"Select date\" supporting label — label-medium / on-surface-variant.\n Occupies the 36px region from its top to the headline top (redline). */\n.md-date-picker__header-supporting {\n font-family: var(--md-sys-typescale-label-medium-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-label-medium-font-weight, 500);\n line-height: max(14px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n letter-spacing: var(--md-sys-typescale-label-medium-letter-spacing, 0.5px);\n color: var(--_supporting-color);\n /* The 36px gap below the supporting label is the biggest top spacer; shrink it\n with density (36px at 0 → 12px at -4). */\n padding-block-end: max(4px, calc(36px + var(--md-sys-density-scale, 0) * 6px));\n}\n\n/* Headline row — 40px headline-large line box plus the 48px trailing edit-button\n column with an 8px gap between them. */\n.md-date-picker__header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--md-sys-spacing-gap-sm, 8px);\n min-block-size: max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px));\n}\n\n.md-date-picker__headline {\n flex: 1 1 auto;\n min-inline-size: 0;\n font-family: var(--md-sys-typescale-headline-large-font-family, Roboto, sans-serif);\n font-size: max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px));\n font-weight: var(--md-sys-typescale-headline-large-font-weight, 400);\n line-height: max(30px, calc(40px + var(--md-sys-density-scale, 0) * 2.5px));\n letter-spacing: var(--md-sys-typescale-headline-large-letter-spacing, 0px);\n color: var(--_headline-color);\n}\n\n/* Edit / mode-toggle — 48px touch target in the trailing column (redline). */\n.md-date-picker__mode-toggle {\n flex: none;\n --md-icon-button-container-width: 48px;\n --md-icon-button-container-height: 48px;\n}\n\n/* ---- Body / nav ----------------------------------------------------- */\n\n/* Redline: 12px inline padding → 7×40px day cells (6px grid gap) inside the 360px\n panel; 12px gap above the month/year nav row. */\n.md-date-picker__body {\n padding-block-start: var(--md-sys-spacing-inset-md, 12px);\n padding-inline: 12px;\n padding-block-end: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* Modal / range — fill space between header and actions; children own overflow. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__body {\n flex: 1 1 auto;\n min-block-size: 0;\n overflow: hidden;\n}\n\n/* Modal / range month-year nav row: 48px chevron touch targets, 4px inline edge\n padding, 4px gap below the row before the weekday header (redline). */\n.md-date-picker__nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-block-size: 48px;\n padding-inline: var(--md-sys-spacing-inset-xs, 4px);\n margin-block-end: var(--md-sys-spacing-inset-xs, 4px);\n flex: none;\n}\n\n.md-date-picker__nav-buttons {\n display: flex;\n gap: var(--md-sys-spacing-gap-xs, 4px);\n align-items: center;\n}\n\n.md-date-picker__nav md-icon-button.md-date-picker__nav-chevron {\n flex: none;\n}\n\n/* ---- Docked nav: month / year menu buttons + flanking chevrons ------ */\n\n/* Without a Cancel / OK row the panel has no bottom inset — that row WAS the\n spacing, so the last week sat flush against the panel edge and read as cut\n off. Both variants get the same bottom inset, so a picker reads identically\n whether it is docked or modal.\n\n A modal body's own top padding is only half the visible gap (the header adds\n its own `padding-block-end` above it), so matching that 12px below would\n still read tight — the full inset is what makes the two edges balance. The\n docked rule below subtracts `--md-sys-spacing-inset-sm`: a DOCKED calendar\n is not stretched, so its own bottom padding lands directly under the grid and\n would otherwise be counted twice. In a modal the calendar is `flex: 1 1 auto`\n and its bottom padding is zeroed, so nothing is double-counted there. */\n.md-date-picker__body--no-actions {\n padding-block-end: max(4px, calc(20px + var(--md-sys-density-scale, 0) * 2px));\n}\n\n.md-date-picker__body--docked,\n.md-date-picker__body--docked.md-date-picker__body--docked-selection {\n /* Identical chrome in day grid and selection — triggers must not shift. */\n padding-block-start: max(4px, calc(20px + var(--md-sys-density-scale, 0) * 2px));\n padding-inline: 12px;\n padding-block-end: 0;\n}\n\n.md-date-picker__body--docked.md-date-picker__body--no-actions {\n /* The docked top inset, minus what the calendar already adds below the grid,\n so both edges read the same at every density rung. */\n padding-block-end: max(\n 0px,\n calc(\n max(4px, calc(20px + var(--md-sys-density-scale, 0) * 2px)) -\n var(--md-sys-spacing-inset-sm, 8px)\n )\n );\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-block-size: 0;\n /* Nav tooltips extend above the row; calendar/menu children own overflow scrolling. */\n overflow: hidden;\n}\n\n/* Wraps selection divider only while month/year menu is open (not rendered for day grid). */\n.md-date-picker__docked-below-nav {\n flex: none;\n display: flex;\n align-items: center;\n inline-size: 100%;\n box-sizing: border-box;\n}\n\n.md-date-picker__selection-divider {\n flex: none;\n inline-size: 100%;\n margin: 0;\n padding: 0;\n border: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n}\n\n/* Full-bleed selection menu + divider while nav keeps body inline padding. */\n.md-date-picker__body--docked-selection .md-date-picker__docked-below-nav,\n.md-date-picker__body--docked-selection .md-date-picker__selection-menu-wrap {\n margin-inline: -12px;\n inline-size: calc(100% + 24px);\n}\n\n.md-date-picker__selection-divider::before {\n content: '';\n display: block;\n inline-size: 100%;\n block-size: 1px;\n background-color: var(--md-sys-color-outline-variant);\n}\n\n.md-date-picker__body--docked-selection .md-date-picker__selection-divider {\n animation: md-date-picker-selection-divider-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n.md-date-picker__body--docked-selection > .md-date-picker__selection-menu-wrap {\n box-sizing: border-box;\n /* Divider row above consumes 1px — keep nav-to-content span identical to day grid. */\n flex: 1 1 auto;\n block-size: auto;\n min-block-size: 0;\n max-block-size: 100%;\n border-end-start-radius: var(--md-sys-shape-corner-large, 16px);\n border-end-end-radius: var(--md-sys-shape-corner-large, 16px);\n transform-origin: center top;\n}\n\n/* Bloom-in on every menu mount (Stencil remounts on open) — matches md-time-picker mode-swap. */\n.md-date-picker__body--docked-selection\n > .md-date-picker__selection-menu-wrap:not(.md-date-picker__selection-menu-wrap--bloom-out) {\n animation: md-date-picker-selection-bloom-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n.md-date-picker__selection-menu-wrap--bloom-out {\n animation: md-date-picker-selection-bloom-out\n var(--_selection-bloom-out-duration)\n var(--_selection-bloom-out-easing)\n both;\n transform-origin: center top;\n}\n\n/* Docked day grid — fills body below nav; scroll inside when viewport-capped. */\n.md-date-picker__body--docked > .md-date-picker__calendar {\n box-sizing: border-box;\n flex: 1 1 auto;\n block-size: auto;\n min-block-size: 0;\n max-block-size: 100%;\n overflow-x: clip;\n overflow-y: auto;\n}\n\n/* Day grid returns after month/year pick — expressive bloom (docked only). */\n.md-date-picker__body--docked .md-date-picker__calendar--docked-bloom-in {\n animation: md-date-picker-docked-calendar-bloom-in\n var(--_calendar-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n transform-origin: center top;\n}\n\n/* Modal / range — day grid bloom after year grid closes (matches docked pick return). */\n.md-date-picker__panel:not(.md-date-picker__panel--docked)\n .md-date-picker__calendar--content-bloom-in {\n animation: md-date-picker-docked-calendar-bloom-in\n var(--_calendar-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n transform-origin: center top;\n}\n\n.md-date-picker__docked-nav {\n /* Match the chevron icon-button's own density-scaled size (40px at 0 -> 32px\n floor) so the slot shrinks WITH the button: the icon-button stays centred\n (fixes the button/chevron misalignment) and the following controls pull in\n tighter as density increases. */\n --_nav-chevron-size: max(32px, calc(40px + var(--md-sys-density-scale, 0) * 4px));\n /* 3px outline + 2px offset — clearance between chevrons and menu triggers */\n --_nav-focus-ring-gap: 5px;\n display: flex;\n flex-direction: row;\n align-items: center;\n /* Pack the month + year groups together (was space-between, which spread them\n to the panel edges leaving a large middle gap). The between-group gap is now\n a fixed, density-shrinking value. */\n justify-content: center;\n gap: var(--md-sys-spacing-gap-lg, 16px);\n inline-size: 100%;\n padding-block-start: 0;\n padding-inline: 0;\n /* Gap below nav row — docked nav bottom tooltips use offset to center here (see md-date-picker.tsx). */\n padding-block-end: 30px;\n flex: none;\n box-sizing: border-box;\n}\n\n.md-date-picker__docked-nav .md-date-picker__nav-group {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--md-sys-spacing-gap-xs, 4px);\n flex: 0 0 auto;\n min-inline-size: 0;\n box-sizing: border-box;\n}\n\n.md-date-picker__docked-nav md-icon-button.md-date-picker__directional-icon {\n flex: none;\n flex-shrink: 0;\n}\n\n.md-date-picker__docked-nav .md-date-picker__nav-group--month {\n justify-content: flex-start;\n}\n\n.md-date-picker__docked-nav .md-date-picker__nav-group--year {\n justify-content: flex-end;\n}\n\n/* Prev/next chevrons and spacers share one slot — crossfade without layout shift. */\n.md-date-picker__nav-chevron-slot {\n position: relative;\n flex: none;\n flex-shrink: 0;\n inline-size: var(--_nav-chevron-size, 40px);\n block-size: var(--_nav-chevron-size, 40px);\n}\n\n.md-date-picker__nav-chevron-slot > md-tooltip,\n.md-date-picker__nav-chevron-slot > .md-date-picker__nav-chevron-spacer {\n position: absolute;\n inset: 0;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear var(--_caret-fade-duration);\n}\n\n.md-date-picker__nav-chevron-slot > md-tooltip.md-date-picker__nav-chevron--visible,\n.md-date-picker__nav-chevron-slot\n > .md-date-picker__nav-chevron-spacer.md-date-picker__nav-chevron--visible {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear 0s;\n}\n\n/* Visible chevron must accept clicks; hidden layer stays inert (spacer never does). */\n.md-date-picker__nav-chevron-slot > md-tooltip {\n display: block;\n}\n\n.md-date-picker__nav-chevron-slot > md-tooltip.md-date-picker__nav-chevron--visible {\n pointer-events: auto;\n z-index: 1;\n}\n\n.md-date-picker__nav-chevron-spacer {\n display: block;\n inline-size: 100%;\n block-size: 100%;\n}\n\n.md-date-picker__icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 40px;\n block-size: 40px;\n border: none;\n border-radius: var(--md-sys-shape-corner-full, 9999px);\n background: transparent;\n cursor: pointer;\n position: relative;\n flex: none;\n}\n.md-date-picker__icon-button:hover {\n background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);\n}\n.md-date-picker__icon-button:focus-visible {\n outline: 3px solid var(--md-sys-color-secondary);\n outline-offset: 2px;\n}\n\n/* Docked month/year triggers — `md-button` text + sm with trailing caret. */\n.md-date-picker__menu-button {\n flex: none;\n --md-button-label-color: var(--md-sys-color-on-surface-variant);\n /* Literal formula, not `var(--_icon-size)`: this lands on an md-button, which\n defines its own `--_icon-size` — handing a private name across that boundary\n is cyclic and silently collapses to invalid. */\n --md-button-icon-size: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n --_state-layer-color: var(--md-sys-color-on-surface-variant);\n}\n\n/* Override md-button--sm default 8px label↔icon gap — spec wants 2px. */\n.md-date-picker__menu-button.md-button--sm {\n gap: 2px;\n}\n\n/* Open menu: match selected md-menu-item (secondary container). */\n.md-date-picker__menu-button.md-button--selected {\n --md-button-container-color: var(--md-sys-color-secondary-container);\n --md-button-label-color: var(--md-sys-color-on-secondary-container);\n --_state-layer-color: var(--md-sys-color-on-secondary-container);\n}\n\n.md-date-picker__menu-button::part(label) {\n font-family: var(--md-sys-typescale-label-large-font-family, Roboto, sans-serif);\n font-size: max(12px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-label-large-font-weight, 500);\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n letter-spacing: var(--md-sys-typescale-label-large-letter-spacing, 0.1px);\n}\n\n/* Month/year nav hints include full name + shortcut — wider than default 200px plain max. */\n.md-date-picker__menu-button-tooltip {\n --md-tooltip-plain-max-inline-size: max-content;\n}\n\n/* Trailing caret — crossfade arrow_drop_down ↔ arrow_drop_up (slotted glyphs). */\n.md-date-picker__menu-caret {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n align-self: center;\n flex: none;\n inline-size: 20px;\n block-size: 20px;\n}\n\n.md-date-picker__menu-caret-glyph {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n line-height: 1;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear var(--_caret-fade-duration);\n}\n\n.md-date-picker__menu-caret-glyph--visible {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear 0s;\n}\n\n/* ---- Docked month/year selection (inline baseline md-menu) ------------ */\n\n.md-date-picker__selection-menu-wrap {\n inline-size: 100%;\n display: flex;\n flex-direction: column;\n flex: 0 0 auto;\n overflow: hidden;\n margin-block: 0;\n box-sizing: border-box;\n /* Blend with the docked panel — no contrasting menu container band. */\n background-color: var(--_container-color);\n}\n\n/* Render md-menu inline in the panel (not as a fixed popover). */\n.md-date-picker__selection-menu {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-block-size: 0;\n inline-size: 100%;\n block-size: 100%;\n pointer-events: auto;\n z-index: auto;\n --md-menu-min-width: 100%;\n --md-menu-max-width: none;\n --md-menu-inline-surface-color: var(--_container-color);\n --md-menu-inline-fill-radius-end: var(--md-sys-shape-corner-large, 16px);\n}\n\n/* Radio-at-start rows: 16px before check, 16px between check and headline. */\n.md-date-picker__selection-menu md-menu-item {\n --md-menu-item-gap: var(--md-sys-spacing-gap-lg, 16px);\n padding-inline-start: var(--md-sys-spacing-inset-lg, 16px);\n}\n\n.md-date-picker__selection-menu md-menu-item::part(headline) {\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-large-font-weight, 400);\n line-height: var(--md-sys-typescale-body-large-line-height, 24px);\n letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);\n color: var(--md-sys-color-on-surface);\n}\n\n/* ---- Calendar grid -------------------------------------------------- */\n\n.md-date-picker__calendar {\n padding-block-end: var(--md-sys-spacing-inset-sm, 8px);\n overflow-x: clip;\n}\n\n/* Modal / range — calendar stretches to fill the body slot below nav. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__calendar {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n min-block-size: 0;\n padding-block-end: 0;\n overflow: hidden;\n}\n\n/* Modal / range — weekday row spacing above the fixed-size day grid. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__weekdays {\n flex: none;\n}\n\n.md-date-picker__weekdays,\n.md-date-picker__grid {\n display: grid;\n /* 1fr columns fill the (wider-than-grid) body, so the day circles distribute\n evenly across the full width instead of packing tight in the centre. Each\n day/weekday keeps its fixed --_day-size and is centred in its track. */\n grid-template-columns: repeat(7, 1fr);\n gap: var(--_grid-gap);\n justify-items: center;\n}\n\n.md-date-picker__weekdays {\n padding-block-end: var(--md-sys-spacing-inset-lg, 16px);\n}\n\n/* Tooltip wrapper acts as the grid cell so the weekday layout is unchanged. */\n.md-date-picker__weekday-tooltip {\n display: flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--_day-size);\n cursor: pointer;\n}\n\n.md-date-picker__weekday {\n display: flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--_day-size);\n block-size: var(--_weekday-size);\n cursor: pointer;\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-large-font-weight, 400);\n line-height: var(--md-sys-typescale-body-large-line-height, 24px);\n letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);\n color: var(--_weekday-color);\n}\n\n.md-date-picker__grid {\n grid-auto-rows: var(--_day-size);\n}\n\n/* ARIA week rows (grid > rowgroup > row > gridcell) — box-less so day cells\n remain the direct grid items of the 7-column track above. */\n.md-date-picker__week {\n display: contents;\n}\n\n/* Month/year chevron + Page Up/Down — horizontal slide on the day grid. */\n.md-date-picker__grid--slide-forward {\n animation: md-date-picker-grid-slide-forward\n var(--_grid-slide-duration)\n var(--_grid-slide-easing)\n both;\n}\n\n.md-date-picker__grid--slide-backward {\n animation: md-date-picker-grid-slide-backward\n var(--_grid-slide-duration)\n var(--_grid-slide-easing)\n both;\n}\n\n@keyframes md-date-picker-grid-slide-forward {\n from {\n transform: translateX(100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@keyframes md-date-picker-grid-slide-backward {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n:host-context([dir='rtl']) .md-date-picker__grid--slide-forward,\n:host([dir='rtl']) .md-date-picker__grid--slide-forward {\n animation-name: md-date-picker-grid-slide-forward-rtl;\n}\n\n:host-context([dir='rtl']) .md-date-picker__grid--slide-backward,\n:host([dir='rtl']) .md-date-picker__grid--slide-backward {\n animation-name: md-date-picker-grid-slide-backward-rtl;\n}\n\n@keyframes md-date-picker-grid-slide-forward-rtl {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@keyframes md-date-picker-grid-slide-backward-rtl {\n from {\n transform: translateX(100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n/* Calendar grid cells (day + year) — md-button square + shapeMorph.\n Square resting morphs to a filled circle/pill on select.\n Do not pin --md-button-container-shape here — that blocks the morph. */\n.md-date-picker__day,\n.md-date-picker__year {\n --md-button-label-color: var(--_day-color);\n --md-button-container-color: transparent;\n\n position: relative;\n padding: 0;\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-large-font-weight, 400);\n line-height: var(--md-sys-typescale-body-large-line-height, 24px);\n letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);\n font-variant-numeric: tabular-nums;\n}\n\n.md-date-picker__day::part(label),\n.md-date-picker__year::part(label) {\n position: relative;\n z-index: 1;\n font: inherit;\n font-variant-numeric: tabular-nums;\n}\n\n.md-date-picker__day:focus-visible,\n.md-date-picker__year:focus-visible {\n outline-offset: -1px;\n}\n\n/* Day cells — fixed square size in the 7-column grid. */\n.md-date-picker__day {\n --md-button-min-width: var(--_day-size);\n --md-button-width: var(--_day-size);\n --md-button-min-height: var(--_day-size);\n --md-button-height: var(--_day-size);\n}\n\n/* Single-class rule so light-DOM ::part(day-today) can override shape. */\n.md-date-picker__day--today {\n --md-button-container-shape: var(--md-date-picker-day-today-shape, calc(var(--_day-size) / 2));\n --md-button-label-color: var(--_today-outline-color);\n box-shadow: 0 0 0 1px var(--_today-outline-color);\n}\n\n/* Outside (adjacent-month) days remain selectable — de-emphasized but WCAG-AA\n legible. A solid on-surface-variant token (~7.6:1 on the panel surface) instead\n of the 38% disabled fade (~2:1), which is reserved for the disabled rule below. */\n.md-date-picker__day--outside {\n --md-button-label-color: var(--_day-outside-color);\n}\n\n.md-date-picker__day--selected,\n.md-date-picker__year--selected {\n --md-button-container-color: var(--_day-selected-bg);\n --md-button-label-color: var(--_day-selected-color);\n --md-button-container-shape: var(--md-date-picker-day-selected-shape);\n}\n\n.md-date-picker__day--selected.md-date-picker__day--today {\n box-shadow: none;\n}\n\n.md-date-picker__day--disabled,\n.md-date-picker__year--disabled {\n --md-button-label-color: color-mix(\n in srgb,\n var(--_day-color) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%),\n transparent\n );\n}\n\n/* ---- Day grid spacing ----------------------------------------------- */\n/* Day states (plain text / today ring / selected fill) inherit base rules. */\n/* Fixed 40px cells + 6px gap — shared by modal and docked (7×40 + 6×6). */\n\n/* ---- Year grid ------------------------------------------------------ */\n/* 3×N grid of 72×36px pills with 30px inline inset — first column at the start\n edge, third at the end edge (not centered as a block). Gap 12px. */\n\n.md-date-picker__year-grid-wrap {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-block-size: 0;\n overflow: hidden;\n transform-origin: center top;\n}\n\n/* Year grid spans panel inline edges — body keeps 12px for nav; grid owns 30px inset. */\n.md-date-picker__body--year-view .md-date-picker__year-grid-wrap {\n margin-inline: -12px;\n inline-size: calc(100% + 24px);\n box-sizing: border-box;\n}\n\n/* Modal / range year view — bloom on every grid mount (matches docked menus). */\n.md-date-picker__panel:not(.md-date-picker__panel--docked)\n .md-date-picker__year-grid-wrap:not(.md-date-picker__year-grid-wrap--bloom-out) {\n animation: md-date-picker-selection-bloom-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n.md-date-picker__year-grid-wrap--bloom-out {\n animation: md-date-picker-selection-bloom-out\n var(--_selection-bloom-out-duration)\n var(--_selection-bloom-out-easing)\n both;\n}\n\n/* Modal year grid scroll is owned by md-scroll-shadow (edge fades when overflow). */\n.md-date-picker__year-grid-scroll {\n flex: 1 1 auto;\n min-block-size: 0;\n overflow-y: auto;\n}\n\n/* Modal / range — fixed 288px scroll viewport (8×36px rows); flex was shrinking to 271px. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__year-grid-scroll {\n min-block-size: var(--_year-grid-viewport-block-size);\n max-block-size: var(--_year-grid-viewport-block-size);\n}\n\n.md-date-picker__year-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: var(--_year-block-size);\n gap: var(--_year-grid-gap);\n padding-block-start: 8px;\n padding-inline: var(--_year-grid-padding-inline);\n padding-block-end: 16px;\n align-content: start;\n}\n\n/* ARIA year rows (grid > row > gridcell) — box-less so year cells remain the\n direct grid items of the 3-column track above; each row holds ≤3 cells, so\n the nth-child column alignment below still maps position → column. */\n.md-date-picker__year-row {\n display: contents;\n}\n\n/* Modal / range — range typed-entry scrolls inside the body when tall. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked):not(.md-date-picker__panel--input-mode)\n .md-date-picker__entry {\n flex: 1 1 auto;\n min-block-size: 0;\n overflow-y: auto;\n padding: var(--md-sys-spacing-inset-lg, 16px) var(--md-sys-spacing-inset-xl, 24px) var(--md-sys-spacing-inset-sm, 8px);\n}\n\n/* Year cells — fixed 72×36px pill; morph on select.\n Per-column alignment: start / center / end so columns sit at container edges. */\n.md-date-picker__year {\n --md-button-min-width: var(--_year-inline-size);\n --md-button-width: var(--_year-inline-size);\n --md-button-min-height: var(--_year-block-size);\n --md-button-height: var(--_year-block-size);\n}\n\n.md-date-picker__year:nth-child(3n + 1) {\n justify-self: start;\n}\n\n.md-date-picker__year:nth-child(3n + 2) {\n justify-self: center;\n}\n\n.md-date-picker__year:nth-child(3n) {\n justify-self: end;\n}\n\n/* ---- In-dialog text entry ------------------------------------------- */\n\n.md-date-picker__entry {\n display: flex;\n flex-wrap: wrap;\n gap: var(--md-sys-spacing-gap-lg, 16px);\n padding: 0;\n inline-size: 100%;\n}\n\n/* Single-date modal input — outlined md-text-field with floating label. */\n\n.md-date-picker__body--input-mode {\n padding-block-start: var(--md-sys-spacing-inset-xl, 24px);\n padding-inline: var(--md-sys-spacing-inset-xl, 24px);\n padding-block-end: var(--md-sys-spacing-inset-sm, 8px);\n flex: none;\n}\n.md-date-picker__entry-error {\n flex-basis: 100%;\n font-size: max(10px, calc(12px + var(--md-sys-density-scale, 0) * 0.5px));\n color: var(--_error-color);\n}\n\n/* ---- Actions -------------------------------------------------------- */\n\n/* Redline: 8px above the 40px action row, 12px below, 12px inline-end edge,\n 8px gap between Cancel / OK. */\n.md-date-picker__actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--md-sys-spacing-gap-sm, 8px);\n min-block-size: max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px));\n /* Inline padding is a constant 12px so the Cancel/OK edge stays aligned with\n the day grid (also 12px) at every density — the grid margin doesn't scale,\n so the footer's must not either. Vertical padding still densifies. */\n padding-block: var(--md-sys-spacing-inset-sm, 8px) var(--md-sys-spacing-inset-md, 12px);\n padding-inline: 12px;\n flex: none;\n}\n\n/* Cancel / OK — compose md-button (text variant). */\n.md-date-picker__action-btn {\n --md-button-label-color: var(--_action-color);\n}\n\n.md-date-picker__action-btn--primary {\n --md-button-label-color: var(--_action-color);\n}\n\n/* ---- RTL ------------------------------------------------------------ */\n\n:host-context([dir='rtl']) .md-date-picker__directional-icon .md-date-picker__icon,\n:host([dir='rtl']) .md-date-picker__directional-icon .md-date-picker__icon {\n transform: scaleX(-1);\n}\n/* Docked chevrons are md-icon-buttons — their glyph lives in their own shadow,\n so mirror the whole element instead of an inner span. */\n:host-context([dir='rtl']) md-icon-button.md-date-picker__directional-icon,\n:host([dir='rtl']) md-icon-button.md-date-picker__directional-icon {\n transform: scaleX(-1);\n}\n\n/* ---- Slotted icons -------------------------------------------------- */\n\n::slotted([slot='leading-icon']) {\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: var(--_icon-color);\n fill: currentColor;\n pointer-events: none;\n}\n\n/* ---- Dark theme ----------------------------------------------------- */\n\n:host([data-theme='dark']),\n:host-context([data-theme='dark']) {\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface));\n --_header-color: var(--md-date-picker-header-color, var(--md-sys-color-surface-container-high));\n}\n\n/* ---- Motion --------------------------------------------------------- */\n\n/* Docked month/year selection — expressive bloom below nav/divider\n (mirrors md-time-picker mode-swap: scale 0.94 + 8dp drop + fade). */\n@keyframes md-date-picker-selection-bloom-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.94);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes md-date-picker-selection-bloom-out {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(4px) scale(0.96);\n }\n}\n\n@keyframes md-date-picker-selection-divider-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes md-date-picker-docked-calendar-bloom-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.92);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes md-date-picker-fade-in {\n from {\n opacity: 0;\n }\n}\n@keyframes md-date-picker-fade-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes md-date-picker-scale {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n}\n\n@keyframes md-date-picker-panel-bloom-out {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(4px) scale(0.96);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .md-date-picker__scrim,\n .md-date-picker__modal--closing .md-date-picker__scrim,\n .md-date-picker__panel:not(.md-date-picker__panel--docked),\n .md-date-picker__panel--docked.md-date-picker__panel--bloom-in,\n .md-date-picker__panel--bloom-out,\n .md-date-picker__body--docked-selection .md-date-picker__selection-divider,\n .md-date-picker__body--docked-selection\n > .md-date-picker__selection-menu-wrap:not(.md-date-picker__selection-menu-wrap--bloom-out),\n .md-date-picker__selection-menu-wrap--bloom-out,\n .md-date-picker__panel:not(.md-date-picker__panel--docked)\n .md-date-picker__year-grid-wrap:not(.md-date-picker__year-grid-wrap--bloom-out),\n .md-date-picker__year-grid-wrap--bloom-out,\n .md-date-picker__calendar--docked-bloom-in,\n .md-date-picker__calendar--content-bloom-in,\n .md-date-picker__grid--slide-forward,\n .md-date-picker__grid--slide-backward {\n animation: none;\n }\n\n .md-date-picker__nav-chevron-slot > md-tooltip,\n .md-date-picker__nav-chevron-slot > .md-date-picker__nav-chevron-spacer,\n .md-date-picker__menu-caret-glyph {\n transition: 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 { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Method, Prop, State, Watch, h } from '@stencil/core';\nimport {\n toIsoDate,\n parseIsoDate,\n parseFlexibleDateInput,\n formatDisplayDate,\n dateFormatPattern,\n isSameDay,\n addMonths,\n addDays,\n daysInMonth,\n clampDate,\n isOutOfRange,\n buildMonthMatrix,\n weekdayNames,\n getFirstDayOfWeek,\n type DayCell,\n} from './date-utils';\nimport { waitForHostRipple } from '../../utils/ripple';\nimport {\n setFormValue,\n setValidityState,\n checkValidityOf,\n reportValidityOf,\n getValidityOf,\n} from '../../utils/form';\n\nlet dpUid = 0;\n\n/** Docked selection menu bloom-in — keep in sync with `--_selection-bloom-duration`. */\nconst DOCKED_SELECTION_BLOOM_IN_MS = 450;\n\n/** Docked selection menu bloom-out — keep in sync with `--_selection-bloom-out-duration`. */\nconst DOCKED_SELECTION_BLOOM_OUT_MS = 200;\n\n/** Panel bloom-out on dismiss — keep in sync with `--_panel-bloom-out-duration`. */\nconst PANEL_BLOOM_OUT_MS = 200;\n\n/** Calendar bloom-in after selection — keep in sync with `--_calendar-bloom-duration`. */\nconst DOCKED_CALENDAR_BLOOM_IN_MS = 300;\n\n/**\n * Bottom tooltip offsets for docked nav — center the ~24px plain popup in the\n * 30px gap below the nav row (`.md-date-picker__docked-nav` padding-block-end).\n * Chevrons fill the 40px row; sm menu buttons are shorter and vertically centered.\n */\nconst DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET = 3;\nconst DOCKED_NAV_MENU_TOOLTIP_OFFSET = 5;\n\n/** Detail payload emitted by the `mdChange` event. */\nexport interface MdDatePickerChangeDetail {\n /** Selected ISO date. */\n value: string;\n /** Selected `Date`. */\n date: Date | null;\n}\n\n/** Detail payload emitted by the `mdSelected` event. */\nexport interface MdDatePickerSelectedDetail {\n /** Selected ISO date. */\n value: string;\n /** Selected `Date`. */\n date: Date;\n}\n\n/** How the displayed calendar month/year was changed. */\nexport type MdDatePickerViewChangeSource =\n | 'chevron-month'\n | 'chevron-year'\n | 'month-menu'\n | 'year-menu';\n\n/** Detail payload emitted by the `mdViewChange` event. */\nexport interface MdDatePickerViewChangeDetail {\n /** Zero-based month index (`0` = January). */\n month: number;\n year: number;\n source: MdDatePickerViewChangeSource;\n}\n\n/** Detail payload emitted by the `mdMenuOpen` event. */\nexport interface MdDatePickerMenuOpenDetail {\n type: 'month' | 'year';\n}\n\n/** Detail payload emitted by the `mdMenuSelect` event. */\nexport interface MdDatePickerMenuSelectDetail {\n type: 'month' | 'year';\n /** Zero-based month index or four-digit year. */\n value: number;\n /** Locale-aware month name or year string when available. */\n label?: string;\n}\n\n/** Modal dialog entry mode — calendar grid or typed text field. */\nexport type MdDatePickerMode = 'calendar' | 'input';\n\n/** Detail payload emitted by the `mdModeChange` event. */\nexport interface MdDatePickerModeChangeDetail {\n mode: MdDatePickerMode;\n}\n\n/**\n * `md-date-picker` — a Material Design 3 date picker.\n *\n * Variants:\n * - `modal-input` *(default)* — outlined text field + modal calendar dialog.\n * - `modal` — bare modal dialog surfaced via `show()` / `open`.\n * - `docked` — outlined text field + dropdown calendar anchored to the field.\n *\n * The modal dialog can flip to a typed-entry view (date input) via the\n * header toggle, satisfying the MD3 \"modal date input\" pattern.\n */\n@Component({\n tag: 'md-date-picker',\n styleUrl: 'md-date-picker.css',\n shadow: true,\n formAssociated: true,\n})\nexport class MdDatePicker {\n @Element() el!: HTMLElement;\n\n /**\n * Form-association handle. The picker previously declared `name`/`value` but\n * was not form-associated, so the chosen date never reached FormData.\n */\n @AttachInternals() internals!: ElementInternals;\n\n\n /**\n * Localized constraint-validation message shown when `required` is unmet.\n *\n * A prop rather than a hardcoded string, matching md-time-picker's\n * `value-missing-label`: components stay i18n-engine-agnostic and the\n * consumer localizes through its own dictionary. Native inputs get their\n * message from the browser's locale for free; a form-associated custom\n * element supplies its own, so leaving this hardcoded would ship an\n * English-only form to every locale.\n */\n @Prop({ attribute: 'value-missing-label' }) valueMissingLabel: string =\n 'Please choose a date.';\n\n\n /**\n * Always occupy the supporting-text line, even when there is no message, so a\n * validation error does not push the content below it down. Forwarded to the\n * embedded md-text-field. See that component for why it is opt-in.\n */\n @Prop({ attribute: 'reserve-supporting-space' }) reserveSupportingSpace: boolean = false;\n\n /** Message set via setCustomValidity(); non-empty wins over valueMissing. */\n private customValidityMessage = '';\n\n /** `value` at first render, restored on form reset. */\n private defaultValue = '';\n\n /** Presentation variant. */\n @Prop({ reflect: true }) variant: 'modal' | 'modal-input' | 'docked' =\n 'modal-input';\n\n /** Selected date as ISO `YYYY-MM-DD`. Two-way bindable. */\n @Prop({ mutable: true, reflect: true }) value: string = '';\n\n /** Floating label / accessible name for the field. */\n @Prop() label: string = 'Date';\n\n /** Placeholder shown inside the text-field input. */\n @Prop() placeholder: string = '';\n\n /** Earliest selectable date, inclusive, as ISO `YYYY-MM-DD`. */\n @Prop() min: string = '';\n\n /** Latest selectable date, inclusive, as ISO `YYYY-MM-DD`. */\n @Prop() max: string = '';\n\n /** Whether the modal / docked panel is open. Two-way bindable. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /** Disabled — blocks all interaction and removes from tab order. */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /** Marks the field as required (for form-validation contexts). */\n @Prop({ reflect: true }) required: boolean = false;\n\n /**\n * Show a clear (\"×\") button on the field trigger while a date is selected,\n * which resets the value (same as calling `clear()`). Applies to the\n * `modal-input` and `docked` variants.\n */\n @Prop({ reflect: true }) clearable: boolean = false;\n\n /** Accessible label for the clear button. */\n @Prop({ attribute: 'clear-label' }) clearLabel: string = 'Clear date';\n\n /** Error state — paints the field with the error color and shows `error-text`. */\n @Prop({ mutable: true, reflect: true }) error: boolean = false;\n\n /** Error message shown below the field when `error` is true. */\n @Prop({ mutable: true, attribute: 'error-text' }) errorText: string = '';\n\n /** Helper text shown below the field. Hidden while an error is displayed. */\n @Prop({ attribute: 'supporting-text' }) supportingText: string = '';\n\n /** BCP-47 locale for month/weekday names and date formatting. */\n @Prop() locale: string = '';\n\n /**\n * Character between day, month, and year in the text field (display and\n * parsing). Leave empty to use the locale default (e.g. `/` for `en-US`,\n * `.` for `de-DE`). The `value` prop and `mdChange` / `mdSelected` events\n * always use ISO `YYYY-MM-DD` regardless of this setting.\n *\n * @example\n * ```html\n * <md-date-picker date-separator=\"/\" value=\"2025-06-15\"></md-date-picker>\n * <!-- displays 06/15/2025 in en-US -->\n * <md-date-picker date-separator=\".\" locale=\"de-DE\"></md-date-picker>\n * <!-- displays and parses DD.MM.YYYY -->\n * ```\n */\n @Prop({ attribute: 'date-separator' }) dateSeparator: string = '';\n\n /**\n * Visual variant of the trigger `md-text-field` (`modal-input` and `docked`).\n * Use `filled` with `--md-date-picker-field-container-color` for branded fills.\n */\n @Prop({ attribute: 'field-variant' }) fieldVariant: 'outlined' | 'filled' = 'outlined';\n\n /**\n * First day of the week (0 = Sunday … 6 = Saturday). `-1` derives it from\n * the locale.\n */\n @Prop({ attribute: 'first-day-of-week' }) firstDayOfWeek: number = -1;\n\n /** Headline / supporting text shown at the top of the modal header. */\n @Prop() headline: string = 'Select date';\n\n /** Label of the cancel button in the modal action row. */\n @Prop({ attribute: 'cancel-label' }) cancelLabel: string = 'Cancel';\n\n /** Label of the confirm button in the modal action row. */\n @Prop({ attribute: 'ok-label' }) okLabel: string = 'OK';\n\n /** Large headline when no date is staged in calendar mode. */\n @Prop({ attribute: 'select-date-label' }) selectDateLabel: string = 'Select date';\n\n /** Large headline shown in typed-entry (input) mode. */\n @Prop({ attribute: 'enter-dates-label' }) enterDatesLabel: string = 'Enter dates';\n\n /** Default error when a typed date cannot be parsed or is out of range. */\n @Prop({ attribute: 'invalid-date-label' }) invalidDateLabel: string = 'Invalid date';\n\n /** Accessible label for the \"previous month\" nav chevron. */\n @Prop({ attribute: 'previous-month-label' }) previousMonthLabel: string = 'Previous month';\n\n /** Accessible label for the \"next month\" nav chevron. */\n @Prop({ attribute: 'next-month-label' }) nextMonthLabel: string = 'Next month';\n\n /** Accessible label for the \"previous year\" nav chevron. */\n @Prop({ attribute: 'previous-year-label' }) previousYearLabel: string = 'Previous year';\n\n /** Accessible label for the \"next year\" nav chevron. */\n @Prop({ attribute: 'next-year-label' }) nextYearLabel: string = 'Next year';\n\n /** Accessible label for the docked month menu button. */\n @Prop({ attribute: 'choose-month-label' }) chooseMonthLabel: string = 'Choose month';\n\n /** Accessible label for the docked year menu button. */\n @Prop({ attribute: 'choose-year-label' }) chooseYearLabel: string = 'Choose year';\n\n /** Accessible label for the modal month/year toggle button. */\n @Prop({ attribute: 'choose-month-year-label' })\n chooseMonthYearLabel: string = 'Choose a different month and year';\n\n /** Tooltip suffix on the modal month/year nav button. */\n @Prop({ attribute: 'choose-month-and-year-label' })\n chooseMonthAndYearLabel: string = 'Choose month and year';\n\n /** Mode-toggle label when in typed-entry mode (switch to calendar). */\n @Prop({ attribute: 'toggle-calendar-label' })\n toggleCalendarLabel: string = 'Switch to calendar input';\n\n /** Mode-toggle label when in calendar mode (switch to text). */\n @Prop({ attribute: 'toggle-text-label' }) toggleTextLabel: string = 'Switch to text input';\n\n /** Trigger calendar icon label when the panel is closed. */\n @Prop({ attribute: 'open-calendar-label' }) openCalendarLabel: string = 'Open calendar';\n\n /** Trigger calendar icon label when the panel is open. */\n @Prop({ attribute: 'close-calendar-label' }) closeCalendarLabel: string = 'Close calendar';\n\n /**\n * Material Symbols name for the trailing calendar toggle on the field.\n * Ignored when a `calendar-icon` slot is provided.\n */\n @Prop({ attribute: 'calendar-icon' }) calendarIcon: string = 'calendar_today';\n\n /** Accessible label for the modal year-selection grid. */\n @Prop({ attribute: 'year-grid-label' }) yearGridLabel: string = 'Year';\n\n /** Clicking the modal scrim closes the picker when true. */\n @Prop({ attribute: 'scrim-dismissible' }) scrimDismissible: boolean = true;\n\n /**\n * Clicking outside a DOCKED panel dismisses it (like `scrim-dismissible` for\n * the modal, which has a scrim to catch the click and a docked panel does not).\n *\n * Set `false` to keep the panel open until Cancel / OK / Esc — useful when the\n * picker sits inside another popup whose own outside-click handling would\n * otherwise fight it, or when a stray click should not discard staged input.\n *\n * Dismissing this way is a cancel: it emits `mdCancel` and discards staging,\n * exactly as the modal scrim does.\n */\n @Prop({ attribute: 'outside-click-dismissible' }) outsideClickDismissible: boolean = true;\n\n /**\n * Commit a day the moment it is clicked, instead of staging it behind the\n * Cancel / OK row.\n *\n * By default every variant STAGES a day click (`mdSelected`) and commits only\n * on OK (`mdChange`). With this set the two collapse into one interaction:\n * the click stages and commits together, the panel dismisses, and the built-in\n * action row is not rendered at all — there is nothing left for it to confirm.\n *\n * Suits a low-stakes, reversible field. Keep the default when the choice is\n * expensive to get wrong and the user deserves an explicit confirm step.\n */\n @Prop({ reflect: true, attribute: 'commit-on-select' }) commitOnSelect: boolean = false;\n\n /** Form-association name attribute. */\n @Prop() name: string = '';\n\n /** Predicate that disables individual dates (return `true` to disable). */\n @Prop() isDateDisabled?: (date: Date) => boolean;\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 /** Emitted when the user commits a selection. */\n @Event() mdChange: EventEmitter<MdDatePickerChangeDetail>;\n\n /** Emitted when the user selects a day in the calendar (click or keyboard). */\n @Event() mdSelected: EventEmitter<MdDatePickerSelectedDetail>;\n\n /** Emitted on every keystroke in a text-entry field. */\n @Event() mdInput: EventEmitter<{ value: string }>;\n\n /** Emitted when the picker opens. */\n @Event() mdOpen: EventEmitter<void>;\n\n /** Emitted when the picker closes for any reason. */\n @Event() mdClose: EventEmitter<void>;\n\n /** Emitted when the user dismisses without committing (scrim, Cancel, Esc). */\n @Event() mdCancel: EventEmitter<void>;\n\n /** Emitted when the displayed calendar month/year changes from user navigation. */\n @Event() mdViewChange: EventEmitter<MdDatePickerViewChangeDetail>;\n\n /** Emitted when the user opens the month or year selection menu / grid. */\n @Event() mdMenuOpen: EventEmitter<MdDatePickerMenuOpenDetail>;\n\n /** Emitted when the user picks a month or year from a selection menu / grid. */\n @Event() mdMenuSelect: EventEmitter<MdDatePickerMenuSelectDetail>;\n\n /** Emitted when the user toggles between calendar and typed-entry views. */\n @Event() mdModeChange: EventEmitter<MdDatePickerModeChangeDetail>;\n\n @State() private focused = false;\n @State() private inputDraft = '';\n @State() private viewYear: number = new Date().getFullYear();\n @State() private viewMonth: number = new Date().getMonth();\n @State() private viewMode: 'calendar' | 'year' = 'calendar';\n @State() private inputMode = false;\n @State() private focusedDate: Date = new Date();\n /** Staged selection awaiting OK. */\n @State() private pendingDate: Date | null = null;\n @State() private hasSlottedHeader = false;\n @State() private hasSlottedActions = false;\n @State() private hasSlottedLeading = false;\n @State() private hasSlottedCalendarIcon = false;\n /** Docked month-selection dropdown open. */\n @State() private monthMenuOpen = false;\n /** Docked year-selection dropdown open. */\n @State() private yearMenuOpen = false;\n /** Docked month/year menu playing exit bloom before unmount. */\n @State() private selectionMenuClosing: 'month' | 'year' | null = null;\n /** Docked day grid playing enter bloom after selection menu closes. */\n @State() private dockedCalendarBloom = false;\n /** Day grid slide direction after chevron or Page Up/Down navigation. */\n @State() private gridSlideDirection: 'forward' | 'backward' | null = null;\n /** Modal year grid playing exit bloom before returning to calendar. */\n @State() private yearViewClosing = false;\n /** Modal day grid playing enter bloom after year grid closes. */\n @State() private modalCalendarBloom = false;\n /** Entire panel playing exit bloom before unmount. */\n @State() private panelClosing = false;\n /** Docked panel horizontal alignment vs the trigger anchor. */\n @State() private dockedPanelAlign: 'start' | 'end' = 'start';\n /** Docked panel vertical placement relative to the trigger anchor. */\n @State() private dockedPanelPlacement: 'below' | 'above' = 'below';\n /** Max block-size when the panel cannot fully fit below or above. */\n @State() private dockedPanelMaxBlockSize: string | null = null;\n\n private uid = `md-dp-${++dpUid}`;\n private entryTextFieldEl?: HTMLElement;\n private entryInputShouldFocus = false;\n private panelEl?: HTMLElement;\n private triggerEl?: HTMLElement;\n private monthMenuButtonEl?: HTMLElement;\n private yearMenuButtonEl?: HTMLElement;\n private restoreFocusEl: HTMLElement | null = null;\n private gridShouldFocus = false;\n private menuShouldFocus: 'month' | 'year' | null = null;\n private menuRestoreFocus: 'month' | 'year' | null = null;\n /** Modal year grid should scroll the active year into view after paint. */\n private yearGridShouldScroll = false;\n /**\n * Frozen year-list bounds while docked year menu or modal year grid is open.\n * Without min/max props the default range is `viewYear ± 100`; freezing prevents\n * the list from re-centering on every year click or chevron step.\n */\n private yearListMinYear: number | null = null;\n private yearListMaxYear: number | null = null;\n /** True after pointer down on non-interactive panel chrome — keeps shortcuts live when focus stays on `body`. */\n private panelPointerEngaged = false;\n /** Set while `dismissPanel()` sets `open = false` so `@Watch('open')` skips re-entry. */\n private closingFromDismiss = false;\n private dockedAnchorEl?: HTMLElement;\n private dockedPositionCleanup: (() => void) | null = null;\n private dockedPositionRafId = 0;\n private dockedPositionRafAttempts = 0;\n private static readonly DOCKED_POSITION_RAF_MAX = 60;\n\n private get hasField(): boolean {\n return this.variant !== 'modal';\n }\n\n private get isDocked(): boolean {\n return this.variant === 'docked';\n }\n\n /** Whether trigger `aria-expanded` should read as open (false during exit bloom). */\n private get triggerExpanded(): boolean {\n return this.open && !this.panelClosing;\n }\n\n connectedCallback() {\n this.syncViewToValue();\n }\n\n componentWillLoad() {\n this.defaultValue = this.value;\n this.syncFormValue();\n // Detect projected content from the light DOM up-front so conditionally\n // rendered slots (header / actions) appear on the very first render.\n this.hasSlottedHeader = !!this.el.querySelector('[slot=\"header\"]');\n this.hasSlottedActions = !!this.el.querySelector('[slot=\"actions\"]');\n this.hasSlottedLeading = !!this.el.querySelector('[slot=\"leading-icon\"]');\n this.hasSlottedCalendarIcon = !!this.el.querySelector('[slot=\"calendar-icon\"]');\n if (this.value) {\n this.seedFieldDraftFromValue();\n }\n if (this.open) {\n this.seedPending();\n this.lockScroll();\n this.gridShouldFocus = true;\n }\n }\n\n componentDidLoad() {\n const shadow = this.el.shadowRoot;\n if (!shadow) return;\n const watch = (name: string, set: (has: boolean) => void) => {\n const slot = shadow.querySelector(\n `slot[name=\"${name}\"]`,\n ) as HTMLSlotElement | null;\n if (!slot) return;\n const update = () => set(slot.assignedElements().length > 0);\n slot.addEventListener('slotchange', update);\n update();\n };\n watch('header', (h) => (this.hasSlottedHeader = h));\n watch('actions', (h) => (this.hasSlottedActions = h));\n watch('leading-icon', (h) => (this.hasSlottedLeading = h));\n watch('calendar-icon', (h) => (this.hasSlottedCalendarIcon = h));\n }\n\n disconnectedCallback() {\n this.unlockScroll();\n this.unbindDockedPositionListeners();\n }\n\n // ---- docked panel viewport positioning --------------------------------\n\n private getDockedViewportMargin(): number {\n return 16;\n }\n\n private resetDockedPanelPosition() {\n this.dockedPanelAlign = 'start';\n this.dockedPanelPlacement = 'below';\n this.dockedPanelMaxBlockSize = null;\n this.dockedPositionRafAttempts = 0;\n if (this.dockedPositionRafId) {\n cancelAnimationFrame(this.dockedPositionRafId);\n this.dockedPositionRafId = 0;\n }\n }\n\n /**\n * The panel's UNCONSTRAINED content height for viewport-overflow calculations,\n * measured with any `max-block-size` clamp momentarily lifted.\n *\n * The overflow decision must never depend on the clamp it produces. If it read\n * the clamped height, the sequence clamp → \"now it fits\" → unclamp → \"now it\n * overflows\" → clamp repeats every render — an infinite render loop that FREEZES\n * the page. It bit the docked selection menus hardest (the year menu re-renders\n * its whole list each cycle). Lifting the clamp for the measurement makes the\n * input independent of the output, so the decision settles in one pass. The\n * inline value is restored synchronously, so there is no visible flash.\n */\n private resolveDockedPanelBlockSize(panel: HTMLElement): number {\n const prev = panel.style.getPropertyValue('max-block-size');\n const prevPriority = panel.style.getPropertyPriority('max-block-size');\n panel.style.setProperty('max-block-size', 'none', 'important');\n const natural = panel.offsetHeight || panel.getBoundingClientRect().height;\n if (prev) {\n panel.style.setProperty('max-block-size', prev, prevPriority);\n } else {\n panel.style.removeProperty('max-block-size');\n }\n return natural;\n }\n\n private isRtl(): boolean {\n if (typeof window === 'undefined') return false;\n return getComputedStyle(this.el).direction === 'rtl';\n }\n\n /** Projected physical left/right for a docked panel width + anchor alignment. */\n private projectedHorizontalRect(\n anchorRect: DOMRect,\n panelW: number,\n align: 'start' | 'end',\n ): { left: number; right: number } {\n const rtl = this.isRtl();\n if (align === 'start') {\n if (rtl) {\n return { left: anchorRect.right - panelW, right: anchorRect.right };\n }\n return { left: anchorRect.left, right: anchorRect.left + panelW };\n }\n if (rtl) {\n return { left: anchorRect.left, right: anchorRect.left + panelW };\n }\n return { left: anchorRect.right - panelW, right: anchorRect.right };\n }\n\n /** Flip / clamp the docked popup so it stays inside the viewport. */\n private positionDockedPanel() {\n if (!this.isDocked || !this.open || this.panelClosing) return;\n\n const anchor =\n this.dockedAnchorEl ??\n (this.el.shadowRoot?.querySelector('.md-date-picker__docked-anchor') as\n | HTMLElement\n | null);\n const panel = this.panelEl;\n if (!anchor || !panel) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const panelW = panel.offsetWidth || panel.getBoundingClientRect().width;\n const measuredH = panel.offsetHeight || panel.getBoundingClientRect().height;\n\n if (panelW === 0 || measuredH === 0) {\n if (\n typeof requestAnimationFrame === 'function' &&\n this.dockedPositionRafAttempts < MdDatePicker.DOCKED_POSITION_RAF_MAX\n ) {\n this.dockedPositionRafAttempts += 1;\n cancelAnimationFrame(this.dockedPositionRafId);\n this.dockedPositionRafId = requestAnimationFrame(() => {\n this.dockedPositionRafId = 0;\n this.positionDockedPanel();\n });\n }\n return;\n }\n\n this.dockedPositionRafAttempts = 0;\n const panelH = this.resolveDockedPanelBlockSize(panel);\n\n const margin = this.getDockedViewportMargin();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const gap = 4;\n\n let align: 'start' | 'end' = 'start';\n let placement: 'below' | 'above' = 'below';\n let maxBlockSize: string | null = null;\n\n const startRect = this.projectedHorizontalRect(anchorRect, panelW, 'start');\n if (startRect.right > vw - margin) {\n const endRect = this.projectedHorizontalRect(anchorRect, panelW, 'end');\n if (endRect.left >= margin) {\n align = 'end';\n }\n }\n\n const activeRect = this.projectedHorizontalRect(anchorRect, panelW, align);\n if (activeRect.left < margin) {\n const endRect = this.projectedHorizontalRect(anchorRect, panelW, 'end');\n if (endRect.left >= margin) {\n align = 'end';\n }\n } else if (align === 'end') {\n const endRect = this.projectedHorizontalRect(anchorRect, panelW, 'end');\n if (endRect.left < margin) {\n const startAgain = this.projectedHorizontalRect(anchorRect, panelW, 'start');\n if (startAgain.right <= vw - margin) {\n align = 'start';\n }\n }\n }\n\n const belowBottom = anchorRect.bottom + gap + panelH;\n if (belowBottom > vh - margin) {\n const aboveTop = anchorRect.top - gap - panelH;\n if (aboveTop >= margin) {\n placement = 'above';\n } else {\n const availableBelow = vh - margin - anchorRect.bottom - gap;\n if (availableBelow > 0) {\n maxBlockSize = `${Math.floor(availableBelow)}px`;\n }\n }\n }\n\n if (placement === 'above') {\n const availableAbove = anchorRect.top - gap - margin;\n if (availableAbove > 0 && panelH > availableAbove) {\n maxBlockSize = `${Math.floor(availableAbove)}px`;\n }\n }\n\n const changed =\n this.dockedPanelAlign !== align ||\n this.dockedPanelPlacement !== placement ||\n this.dockedPanelMaxBlockSize !== maxBlockSize;\n\n if (changed) {\n this.dockedPanelAlign = align;\n this.dockedPanelPlacement = placement;\n this.dockedPanelMaxBlockSize = maxBlockSize;\n }\n }\n\n private bindDockedPositionListeners() {\n if (this.dockedPositionCleanup || typeof window === 'undefined') return;\n const onReposition = () => this.positionDockedPanel();\n window.addEventListener('resize', onReposition, { passive: true });\n window.addEventListener('scroll', onReposition, { passive: true, capture: true });\n this.dockedPositionCleanup = () => {\n window.removeEventListener('resize', onReposition);\n window.removeEventListener('scroll', onReposition, { capture: true });\n };\n }\n\n private unbindDockedPositionListeners() {\n this.dockedPositionCleanup?.();\n this.dockedPositionCleanup = null;\n }\n\n @Watch('value')\n @Watch('min')\n @Watch('max')\n onBoundsChange() {\n if (!this.open) this.syncViewToValue();\n }\n\n @Watch('dateSeparator')\n onDateSeparatorChange() {\n if (this.value) {\n this.seedFieldDraftFromValue();\n }\n }\n\n @Watch('open')\n onOpenChange(now: boolean, prev: boolean) {\n if (now === prev) return;\n if (now) {\n this.panelClosing = false;\n this.handleOpen();\n } else if (!this.closingFromDismiss && !this.panelClosing) {\n this.open = true;\n void this.dismissPanel();\n } else {\n this.handleClose();\n }\n }\n\n /** Open the picker. */\n @Method()\n async show(): Promise<void> {\n if (this.disabled) return;\n this.open = true;\n }\n\n /** Close the picker without committing. */\n @Method()\n async close(): Promise<void> {\n await this.dismissPanel();\n }\n\n /** Clear the current selection. */\n @Method()\n async clear(): Promise<void> {\n if (this.disabled) return;\n this.value = '';\n this.inputDraft = '';\n this.error = false;\n this.errorText = '';\n this.emitChange();\n }\n\n /** Move keyboard focus to the field's text input (if present). */\n @Method()\n async focusInput(): Promise<void> {\n const tfInput = this.el.shadowRoot\n ?.querySelector('md-text-field')\n ?.shadowRoot?.querySelector('.md-text-field__input') as HTMLInputElement | null;\n if (tfInput) {\n tfInput.focus();\n return;\n }\n this.triggerEl?.focus();\n }\n\n // ---- locale / formatting helpers --------------------------------------\n\n private get loc(): string | undefined {\n return this.locale || undefined;\n }\n\n private resolvedFirstDay(): number {\n if (this.firstDayOfWeek >= 0 && this.firstDayOfWeek <= 6) {\n return this.firstDayOfWeek;\n }\n return getFirstDayOfWeek(this.locale);\n }\n\n private formatHeadline(d: Date | null): string {\n if (!d) return '';\n return new Intl.DateTimeFormat(this.loc, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n }).format(d);\n }\n\n private formatField(d: Date | null): string {\n if (!d) return '';\n return formatDisplayDate(d, this.loc, this.dateSeparator || undefined);\n }\n\n private formatMonthYear(year: number, month: number): string {\n return new Intl.DateTimeFormat(this.loc, {\n month: 'long',\n year: 'numeric',\n }).format(new Date(year, month, 1));\n }\n\n private formatFullDate(d: Date): string {\n return new Intl.DateTimeFormat(this.loc, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(d);\n }\n\n /** Locale-aware date format hint (e.g. `MM/DD/YYYY` or `DD.MM.YYYY`). */\n private dateFormatHint(): string {\n return dateFormatPattern(this.loc, this.dateSeparator || undefined);\n }\n\n // ---- state sync -------------------------------------------------------\n\n private syncViewToValue() {\n const anchor =\n parseIsoDate(this.value) ?? parseIsoDate(this.min) ?? new Date();\n this.viewYear = anchor.getFullYear();\n this.viewMonth = anchor.getMonth();\n this.focusedDate = clampDate(anchor, this.min, this.max);\n }\n\n private seedPending() {\n this.viewMode = 'calendar';\n this.pendingDate = parseIsoDate(this.value);\n this.seedFieldDraftFromValue();\n this.syncViewToValue();\n }\n\n private handleOpen() {\n this.restoreFocusEl =\n typeof document !== 'undefined'\n ? ((document.activeElement as HTMLElement) ?? null)\n : null;\n this.inputMode = this.variant === 'modal-input' ? false : this.inputMode;\n this.monthMenuOpen = false;\n this.yearMenuOpen = false;\n this.clearYearListRange();\n this.yearViewClosing = false;\n this.clearModalCalendarBloom();\n this.resetDockedPanelPosition();\n this.seedPending();\n this.lockScroll();\n this.mdOpen.emit();\n this.gridShouldFocus = true;\n if (this.isDocked) {\n this.bindDockedPositionListeners();\n }\n }\n\n private handleClose() {\n this.unlockScroll();\n this.unbindDockedPositionListeners();\n this.resetDockedPanelPosition();\n this.panelPointerEngaged = false;\n this.panelClosing = false;\n this.clearDockedCalendarBloom();\n this.clearModalCalendarBloom();\n this.yearViewClosing = false;\n this.monthMenuOpen = false;\n this.yearMenuOpen = false;\n this.selectionMenuClosing = null;\n this.clearYearListRange();\n this.mdClose.emit();\n const restore = this.restoreFocusEl ?? this.triggerEl ?? null;\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => restore?.focus?.());\n } else {\n restore?.focus?.();\n }\n }\n\n /** Animated panel dismiss — bloom-out then unmount (docked + modal). */\n private async dismissPanel(): Promise<void> {\n if (!this.open || this.panelClosing) return;\n\n if (\n this.isDocked &&\n (this.monthMenuOpen || this.yearMenuOpen || this.selectionMenuClosing)\n ) {\n await this.closeDockedMenusAnimated(null, false);\n }\n\n if (this.prefersReducedMotion()) {\n this.closingFromDismiss = true;\n this.open = false;\n this.closingFromDismiss = false;\n return;\n }\n\n this.panelClosing = true;\n await this.delay(this.panelBloomOutMs());\n this.closingFromDismiss = true;\n this.open = false;\n this.panelClosing = false;\n this.closingFromDismiss = false;\n }\n\n private lockScroll() {\n if (this.isDocked) return;\n try {\n document.body.style.setProperty('overflow', 'hidden');\n } catch {\n /* SSR / no document */\n }\n }\n\n private unlockScroll() {\n try {\n document.body.style.removeProperty('overflow');\n } catch {\n /* noop */\n }\n }\n\n // ---- selection / commit ----------------------------------------------\n\n private isDisabledDate(d: Date): boolean {\n if (isOutOfRange(d, this.min, this.max)) return true;\n if (this.isDateDisabled && this.isDateDisabled(d)) return true;\n return false;\n }\n\n private isDisabledYear(year: number): boolean {\n const minDate = parseIsoDate(this.min);\n const maxDate = parseIsoDate(this.max);\n if (minDate && year < minDate.getFullYear()) return true;\n if (maxDate && year > maxDate.getFullYear()) return true;\n return false;\n }\n\n private lastSelectedEmitValue: string | null = null;\n\n private emitChange() {\n const date = parseIsoDate(this.value);\n this.mdChange.emit({ value: this.value, date });\n }\n\n private emitSelected(date: Date) {\n const value = toIsoDate(date);\n if (this.lastSelectedEmitValue === value) return;\n this.lastSelectedEmitValue = value;\n this.mdSelected.emit({ value, date });\n void Promise.resolve().then(() => {\n this.lastSelectedEmitValue = null;\n });\n }\n\n private emitViewChange(source: MdDatePickerViewChangeSource) {\n this.mdViewChange.emit({\n month: this.viewMonth,\n year: this.viewYear,\n source,\n });\n }\n\n private emitMenuOpen(type: 'month' | 'year') {\n this.mdMenuOpen.emit({ type });\n }\n\n private emitMenuSelect(type: 'month' | 'year', value: number, label?: string) {\n this.mdMenuSelect.emit({ type, value, label });\n }\n\n private emitModeChange(mode: MdDatePickerMode) {\n this.mdModeChange.emit({ mode });\n }\n\n private monthLabel(month: number): string {\n return new Intl.DateTimeFormat(this.loc, { month: 'long' }).format(\n new Date(2024, month, 1),\n );\n }\n\n private selectDay(cell: DayCell) {\n const d = cell.date;\n if (this.isDisabledDate(d)) return;\n this.closeMenus(null, false);\n this.focusedDate = d;\n if (cell.outOfMonth) {\n this.viewYear = d.getFullYear();\n this.viewMonth = d.getMonth();\n }\n // All variants — including docked — stage the selection and commit on OK\n // so the Cancel / OK action row is meaningful everywhere.\n this.pendingDate = d;\n this.emitSelected(d);\n // …unless the consumer opted out of the confirm step, in which case the\n // same click commits. mdSelected still fires first, so a listener that\n // treats it as \"the user picked something\" keeps working either way.\n if (this.commitOnSelect) this.commit();\n }\n\n private commit() {\n if (this.pendingDate) {\n this.value = toIsoDate(this.pendingDate);\n this.inputDraft = this.formatField(this.pendingDate);\n this.error = false;\n this.errorText = '';\n }\n this.emitChange();\n void this.dismissPanel();\n }\n\n private cancel() {\n this.mdCancel.emit();\n void this.dismissPanel();\n }\n\n private requestDismiss() {\n this.cancel();\n }\n\n // ---- text-entry handling ---------------------------------------------\n\n private onFieldInput = (e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n this.inputDraft = v;\n this.mdInput.emit({ value: v });\n };\n\n /** Read the live typed value from a trigger-field key target before commit. */\n private syncInputDraftFromField(target: EventTarget | null): void {\n const el = this.asEventElement(target);\n if (!el) return;\n const input = el.closest(\n 'input:not([readonly]):not([disabled]), textarea:not([readonly]):not([disabled])',\n ) as HTMLInputElement | HTMLTextAreaElement | null;\n if (input) {\n this.inputDraft = input.value;\n return;\n }\n const tf = el.closest('md-text-field') as (HTMLElement & { value?: string }) | null;\n if (tf) {\n this.inputDraft = tf.value ?? this.inputDraft;\n }\n }\n\n /**\n * Keep the md-text-field input in sync after commit while focus remains.\n * md-text-field skips display sync on external value updates during focus.\n */\n private syncTextFieldDisplay(): void {\n if (this.variant === 'modal') return;\n const tf = this.el.shadowRoot?.querySelector('md-text-field') as\n | (HTMLElement & { value?: string })\n | null;\n if (!tf) return;\n tf.value = this.inputDraft;\n const input = tf.shadowRoot?.querySelector('.md-text-field__input') as\n | HTMLInputElement\n | null;\n if (input) {\n input.value = this.inputDraft;\n }\n }\n\n /** Keep the modal typed-entry md-text-field in sync after parse/format. */\n private syncEntryTextFieldDisplay(): void {\n if (!this.entryTextFieldEl) return;\n const tf = this.entryTextFieldEl as HTMLElement & { value?: string };\n tf.value = this.inputDraft;\n const input = tf.shadowRoot?.querySelector('.md-text-field__input') as\n | HTMLInputElement\n | null;\n if (input) {\n input.value = this.inputDraft;\n }\n }\n\n private onFieldCommit = () => {\n const raw = this.inputDraft.trim();\n if (!raw) {\n this.value = '';\n this.inputDraft = '';\n this.error = false;\n this.errorText = '';\n this.emitChange();\n this.syncTextFieldDisplay();\n return;\n }\n const parsed = parseFlexibleDateInput(\n raw,\n this.locale,\n this.dateSeparator || undefined,\n );\n if (!parsed || this.isDisabledDate(parsed)) {\n this.error = true;\n this.errorText = this.errorText || (this.invalidDateLabel ?? 'Invalid date');\n return;\n }\n this.value = toIsoDate(parsed);\n this.inputDraft = this.formatField(parsed);\n this.error = false;\n this.errorText = '';\n this.syncViewToValue();\n this.emitChange();\n this.syncTextFieldDisplay();\n };\n\n private seedFieldDraftFromValue() {\n const selected = parseIsoDate(this.value);\n this.inputDraft = selected ? this.formatField(selected) : '';\n }\n\n private commitDialogInput() {\n const raw = this.inputDraft.trim();\n if (!raw) {\n this.error = false;\n this.errorText = '';\n this.pendingDate = null;\n return;\n }\n const parsed = parseFlexibleDateInput(\n raw,\n this.locale,\n this.dateSeparator || undefined,\n );\n if (!parsed || this.isDisabledDate(parsed)) {\n this.error = true;\n this.errorText = this.invalidDateLabel ?? 'Invalid date';\n return;\n }\n this.error = false;\n this.errorText = '';\n this.pendingDate = parsed;\n this.inputDraft = this.formatField(parsed);\n this.syncEntryTextFieldDisplay();\n this.viewYear = parsed.getFullYear();\n this.viewMonth = parsed.getMonth();\n this.focusedDate = parsed;\n }\n\n // ---- navigation -------------------------------------------------------\n\n private setGridSlideDirection(delta: number) {\n if (this.prefersReducedMotion()) return;\n if (\n this.monthMenuOpen ||\n this.yearMenuOpen ||\n this.selectionMenuClosing ||\n this.dockedCalendarBloom\n ) {\n return;\n }\n this.gridSlideDirection = delta > 0 ? 'forward' : 'backward';\n }\n\n private onGridSlideAnimationEnd = (e: AnimationEvent) => {\n if (e.target !== e.currentTarget) return;\n const name = e.animationName ?? '';\n if (!name.includes('md-date-picker-grid-slide')) return;\n this.gridSlideDirection = null;\n };\n\n private goToMonth(delta: number, fromUser = false) {\n this.setGridSlideDirection(delta);\n const ref = addMonths(new Date(this.viewYear, this.viewMonth, 1), delta);\n this.viewYear = ref.getFullYear();\n this.viewMonth = ref.getMonth();\n if (fromUser) {\n this.emitViewChange('chevron-month');\n }\n }\n\n private goToYear(delta: number, fromUser = false) {\n this.setGridSlideDirection(delta);\n this.viewYear += delta;\n if (\n this.yearMenuOpen ||\n this.selectionMenuClosing === 'year' ||\n this.viewMode === 'year' ||\n this.yearViewClosing\n ) {\n this.captureYearListRange();\n }\n if (fromUser) {\n this.emitViewChange('chevron-year');\n }\n }\n\n /** Accessible label for month/year nav chevrons (docked + modal). */\n private navActionLabel(scope: 'month' | 'year', side: 'prev' | 'next'): string {\n if (scope === 'month') {\n return side === 'prev'\n ? (this.previousMonthLabel ?? 'Previous month')\n : (this.nextMonthLabel ?? 'Next month');\n }\n return side === 'prev'\n ? (this.previousYearLabel ?? 'Previous year')\n : (this.nextYearLabel ?? 'Next year');\n }\n\n /** Keyboard shortcut hint matching the day-grid `onGridKeyDown` handlers. */\n private navShortcutKey(scope: 'month' | 'year', side: 'prev' | 'next'): string {\n if (scope === 'month') {\n return side === 'prev' ? 'Page Up' : 'Page Down';\n }\n return side === 'prev' ? 'Shift+Page Up' : 'Shift+Page Down';\n }\n\n /** Tooltip + `aria-description` text (via `md-tooltip`) for nav chevrons. */\n private navTooltipText(scope: 'month' | 'year', side: 'prev' | 'next'): string {\n return `${this.navActionLabel(scope, side)} (${this.navShortcutKey(scope, side)})`;\n }\n\n /** Keyboard shortcut for docked month/year menu buttons (day grid). */\n private menuShortcutKey(kind: 'month' | 'year'): string {\n return kind === 'month' ? 'Shift+M' : 'Shift+Y';\n }\n\n /** Tooltip + `aria-description` for docked month/year menu triggers. */\n private menuTooltipText(kind: 'month' | 'year'): string {\n if (kind === 'month') {\n const fullMonth = new Intl.DateTimeFormat(this.loc, { month: 'long' }).format(\n new Date(this.viewYear, this.viewMonth, 1),\n );\n return `${fullMonth} · ${this.chooseMonthLabel} (${this.menuShortcutKey(kind)})`;\n }\n return `${this.chooseYearLabel} (${this.menuShortcutKey(kind)})`;\n }\n\n /** Snapshot year-list bounds for the active year-selection surface. */\n private captureYearListRange() {\n const current = this.viewYear;\n this.yearListMinYear =\n parseIsoDate(this.min)?.getFullYear() ?? current - 100;\n this.yearListMaxYear =\n parseIsoDate(this.max)?.getFullYear() ?? current + 100;\n }\n\n private clearYearListRange() {\n this.yearListMinYear = null;\n this.yearListMaxYear = null;\n }\n\n private getYearListBounds(): { minYear: number; maxYear: number } {\n if (this.yearListMinYear != null && this.yearListMaxYear != null) {\n return { minYear: this.yearListMinYear, maxYear: this.yearListMaxYear };\n }\n const current = this.viewYear;\n return {\n minYear: parseIsoDate(this.min)?.getFullYear() ?? current - 100,\n maxYear: parseIsoDate(this.max)?.getFullYear() ?? current + 100,\n };\n }\n\n // ---- docked month / year dropdown menus -------------------------------\n\n private closeMenus(keep: 'month' | 'year' | null, restoreFocus: boolean) {\n if (this.isDocked) {\n void this.closeDockedMenusAnimated(keep, restoreFocus);\n return;\n }\n if (keep !== 'month' && this.monthMenuOpen) {\n this.monthMenuOpen = false;\n if (restoreFocus) this.restoreMenuFocus(this.monthMenuButtonEl);\n }\n if (keep !== 'year' && this.yearMenuOpen) {\n this.yearMenuOpen = false;\n this.clearYearListRange();\n if (restoreFocus) this.restoreMenuFocus(this.yearMenuButtonEl);\n }\n }\n\n /** Animated close for docked month/year menus (toggle, pick, Escape, day select). */\n private async closeDockedSelectionMenu(\n kind: 'month' | 'year',\n options: { bloomCalendar?: boolean; restoreFocus?: boolean } = {},\n ) {\n const { bloomCalendar = true, restoreFocus = true } = options;\n const isOpen = kind === 'month' ? this.monthMenuOpen : this.yearMenuOpen;\n if (!isOpen || this.selectionMenuClosing === kind) return;\n\n this.selectionMenuClosing = kind;\n await this.delay(this.selectionBloomOutMs());\n this.selectionMenuClosing = null;\n if (kind === 'month') {\n this.monthMenuOpen = false;\n } else {\n this.yearMenuOpen = false;\n this.clearYearListRange();\n }\n if (restoreFocus) {\n this.gridShouldFocus = false;\n this.menuRestoreFocus = kind;\n } else if (bloomCalendar && !this.monthMenuOpen && !this.yearMenuOpen) {\n this.gridShouldFocus = true;\n }\n if (bloomCalendar && !this.monthMenuOpen && !this.yearMenuOpen) {\n this.beginDockedCalendarBloom();\n } else if (this.isDocked && !this.monthMenuOpen && !this.yearMenuOpen) {\n this.positionDockedPanel();\n }\n }\n\n private async closeDockedMenusAnimated(\n keep: 'month' | 'year' | null,\n restoreFocus: boolean,\n ) {\n const bloomCalendar = keep === null;\n if (keep !== 'month' && this.monthMenuOpen) {\n await this.closeDockedSelectionMenu('month', { bloomCalendar, restoreFocus });\n }\n if (keep !== 'year' && this.yearMenuOpen) {\n await this.closeDockedSelectionMenu('year', { bloomCalendar, restoreFocus });\n }\n }\n\n private openDockedMonthMenu() {\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.yearMenuOpen = false;\n this.monthMenuOpen = true;\n this.menuShouldFocus = 'month';\n this.emitMenuOpen('month');\n }\n\n private openDockedYearMenu() {\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.monthMenuOpen = false;\n this.captureYearListRange();\n this.yearMenuOpen = true;\n this.menuShouldFocus = 'year';\n this.emitMenuOpen('year');\n }\n\n /** Menu stays visually expanded through bloom-out (`selectionMenuClosing`). */\n private isDockedMonthMenuExpanded(): boolean {\n return this.monthMenuOpen || this.selectionMenuClosing === 'month';\n }\n\n private isDockedYearMenuExpanded(): boolean {\n return this.yearMenuOpen || this.selectionMenuClosing === 'year';\n }\n\n /** Which docked selection menu to render (at most one; handles swap transitions). */\n private dockedSelectionMenuToShow(): 'month' | 'year' | null {\n if (this.monthMenuOpen && this.yearMenuOpen) {\n if (this.selectionMenuClosing === 'year') return 'month';\n if (this.selectionMenuClosing === 'month') return 'year';\n return 'year';\n }\n if (this.yearMenuOpen || this.selectionMenuClosing === 'year') return 'year';\n if (this.monthMenuOpen || this.selectionMenuClosing === 'month') return 'month';\n return null;\n }\n\n /**\n * Trailing caret on docked month/year menu buttons.\n * Collapsed: caret down; active (open or bloom-out): caret up (matches md-select).\n */\n private dockedMenuTrailingIcon(expanded: boolean): string {\n return expanded ? 'arrow_drop_up' : 'arrow_drop_down';\n }\n\n /** Crossfading trailing carets (down/up) on docked month/year menu triggers. */\n private renderDockedMenuTrailingCaret(expanded: boolean) {\n return (\n <span\n slot=\"trailing-icon\"\n class=\"md-date-picker__menu-caret\"\n part=\"menu-caret\"\n aria-hidden=\"true\"\n >\n <span\n class={{\n 'md-date-picker__menu-caret-glyph': true,\n 'material-symbols-outlined': true,\n 'md-date-picker__menu-caret-glyph--down': true,\n 'md-date-picker__menu-caret-glyph--visible': !expanded,\n }}\n >\n arrow_drop_down\n </span>\n <span\n class={{\n 'md-date-picker__menu-caret-glyph': true,\n 'material-symbols-outlined': true,\n 'md-date-picker__menu-caret-glyph--up': true,\n 'md-date-picker__menu-caret-glyph--visible': expanded,\n }}\n >\n arrow_drop_up\n </span>\n </span>\n );\n }\n\n private restoreMenuFocus(el?: HTMLElement) {\n if (!el) return;\n const run = () => el.focus();\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n /**\n * Scroll container for inline-fill docked menus — the menu's\n * `.md-menu__scroll-shadow` scroll viewport when the menu is capped,\n * otherwise `.md-menu__surface`.\n */\n private getDockedSelectionMenuScrollEl(menuHost: HTMLElement): HTMLElement | null {\n const menuShadow = menuHost.shadowRoot;\n if (!menuShadow) return null;\n\n // Capped/inline-fill menus scroll inside a `.md-menu__scroll-shadow` viewport\n // div; plain (uncapped) menus scroll on the surface itself.\n return (\n (menuShadow.querySelector('.md-menu__scroll-shadow') as HTMLElement | null) ??\n (menuShadow.querySelector('.md-menu__surface') as HTMLElement | null)\n );\n }\n\n /**\n * Scroll the selected radio item into view inside the inline-fill menu scroll\n * viewport. Runs after the menu DOM is painted.\n */\n private getDockedSelectionMenuTarget(kind: 'month' | 'year'): HTMLElement | null {\n const part = kind === 'month' ? 'month-menu' : 'year-menu';\n const menu = this.panelEl?.querySelector<HTMLElement>(`[part=\"${part}\"]`);\n if (!menu) return null;\n return (\n menu.querySelector<HTMLElement>('md-menu-item[selected]') ??\n menu.querySelector<HTMLElement>(`md-menu-item[part*=\"${kind}-option-selected\"]`) ??\n menu.querySelector<HTMLElement>('md-menu-item')\n );\n }\n\n private scrollDockedSelectionMenuIntoView(kind: 'month' | 'year') {\n const part = kind === 'month' ? 'month-menu' : 'year-menu';\n const menuHost = this.panelEl?.querySelector<HTMLElement>(`[part=\"${part}\"]`);\n if (!menuHost) return;\n\n const selected = this.getDockedSelectionMenuTarget(kind);\n if (!selected) return;\n\n const scrollEl = this.getDockedSelectionMenuScrollEl(menuHost);\n if (scrollEl) {\n const scrollRect = scrollEl.getBoundingClientRect();\n const itemRect = selected.getBoundingClientRect();\n const itemCenter = itemRect.top + itemRect.height / 2;\n const scrollCenter = scrollRect.top + scrollRect.height / 2;\n scrollEl.scrollTop += itemCenter - scrollCenter;\n return;\n }\n\n if (typeof selected.scrollIntoView === 'function') {\n selected.scrollIntoView({ block: 'center', inline: 'nearest' });\n }\n }\n\n private afterDockedSelectionMenuPaint(kind: 'month' | 'year') {\n const run = () => {\n this.scrollDockedSelectionMenuIntoView(kind);\n this.getDockedSelectionMenuTarget(kind)?.focus();\n };\n\n // Defer scroll/focus until the expressive bloom finishes — immediate\n // scrollIntoView on the 201-item year list interrupts the animation.\n const delay = this.selectionBloomInMs();\n if (delay > 0) {\n void this.delay(delay).then(run);\n return;\n }\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n /**\n * Approximate scrollTop to center `viewYear` — matches default `--_year-*` CSS tokens so\n * the active year is visible on first paint before layout measurement.\n */\n private calculateModalYearGridScrollTop(): number {\n const columns = 3;\n const blockSize = 36;\n const gap = 12;\n const paddingBlockStart = 8;\n const paddingBlockEnd = 16;\n const viewportBlockSize = 288;\n\n const { minYear, maxYear } = this.getYearListBounds();\n const yearCount = maxYear - minYear + 1;\n const index = Math.max(0, Math.min(this.viewYear - minYear, yearCount - 1));\n const row = Math.floor(index / columns);\n const rowCount = Math.ceil(yearCount / columns);\n const rowStride = blockSize + gap;\n const contentBlockSize =\n paddingBlockStart + rowCount * blockSize + Math.max(0, rowCount - 1) * gap + paddingBlockEnd;\n const itemBlockStart = paddingBlockStart + row * rowStride;\n const itemCenter = itemBlockStart + blockSize / 2;\n const target = itemCenter - viewportBlockSize / 2;\n const maxScroll = Math.max(0, contentBlockSize - viewportBlockSize);\n return Math.max(0, Math.min(target, maxScroll));\n }\n\n /**\n * Scroll container for the modal year grid — the plain\n * `.md-date-picker__year-grid-scroll` viewport.\n */\n private getModalYearGridScrollEl(): HTMLElement | null {\n const wrap = this.panelEl?.querySelector<HTMLElement>('[part=\"year-grid-wrap\"]');\n if (!wrap) return null;\n\n return wrap.querySelector<HTMLElement>('.md-date-picker__year-grid-scroll') ?? null;\n }\n\n /** Scroll the selected year cell into the center of the modal year grid viewport. */\n private scrollModalYearGridIntoView() {\n const scrollEl = this.getModalYearGridScrollEl();\n if (!scrollEl) return;\n\n scrollEl.scrollTop = this.calculateModalYearGridScrollTop();\n\n const selected =\n scrollEl.querySelector<HTMLElement>(`[data-year=\"${this.viewYear}\"]`) ??\n scrollEl.querySelector<HTMLElement>('[part~=\"year-selected\"]');\n if (!selected) return;\n\n const scrollRect = scrollEl.getBoundingClientRect();\n const itemRect = selected.getBoundingClientRect();\n const itemCenter = itemRect.top + itemRect.height / 2;\n const scrollCenter = scrollRect.top + scrollRect.height / 2;\n scrollEl.scrollTop += itemCenter - scrollCenter;\n }\n\n private afterModalYearGridPaint() {\n const run = () => this.scrollModalYearGridIntoView();\n\n // Unlike docked menus, scrolling the inner overflow grid does not interrupt the\n // wrap bloom animation — deferring 450ms made the year list jump after open.\n this.scrollModalYearGridIntoView();\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n private prefersReducedMotion(): boolean {\n // matchMedia is absent from Stencil's SSR mock, so optional-chain it (this\n // method is only reached post-render today, but harden to match the codebase).\n return (\n typeof window !== 'undefined' &&\n (window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches ?? false)\n );\n }\n\n private selectionBloomInMs(): number {\n return this.prefersReducedMotion() ? 0 : DOCKED_SELECTION_BLOOM_IN_MS;\n }\n\n private selectionBloomOutMs(): number {\n return this.prefersReducedMotion() ? 0 : DOCKED_SELECTION_BLOOM_OUT_MS;\n }\n\n private calendarBloomInMs(): number {\n return this.prefersReducedMotion() ? 0 : DOCKED_CALENDAR_BLOOM_IN_MS;\n }\n\n private panelBloomOutMs(): number {\n return this.prefersReducedMotion() ? 0 : PANEL_BLOOM_OUT_MS;\n }\n\n private delay(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private beginDockedCalendarBloom() {\n if (this.prefersReducedMotion()) {\n this.dockedCalendarBloom = false;\n return;\n }\n this.dockedCalendarBloom = true;\n void this.delay(this.calendarBloomInMs()).then(() => {\n if (!this.monthMenuOpen && !this.yearMenuOpen && !this.selectionMenuClosing) {\n this.dockedCalendarBloom = false;\n this.positionDockedPanel();\n }\n });\n }\n\n private clearDockedCalendarBloom() {\n this.dockedCalendarBloom = false;\n }\n\n private beginModalCalendarBloom() {\n if (this.prefersReducedMotion() || this.isDocked) {\n this.modalCalendarBloom = false;\n return;\n }\n this.modalCalendarBloom = true;\n void this.delay(this.calendarBloomInMs()).then(() => {\n if (this.viewMode === 'calendar' && !this.yearViewClosing) {\n this.modalCalendarBloom = false;\n }\n });\n }\n\n private clearModalCalendarBloom() {\n this.modalCalendarBloom = false;\n }\n\n private async waitForSelectionMenuClose(kind: 'month' | 'year') {\n while (this.selectionMenuClosing === kind) {\n await this.delay(16);\n }\n }\n\n private toggleMonthMenu = () => {\n void this.toggleMonthMenuAsync();\n };\n\n private async toggleMonthMenuAsync() {\n if (this.monthMenuOpen) {\n await this.closeDockedSelectionMenu('month', { bloomCalendar: true, restoreFocus: true });\n return;\n }\n if (this.yearMenuOpen) {\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.monthMenuOpen = true;\n this.menuShouldFocus = 'month';\n this.emitMenuOpen('month');\n await this.closeDockedSelectionMenu('year', {\n bloomCalendar: false,\n restoreFocus: false,\n });\n return;\n }\n if (this.selectionMenuClosing === 'year') {\n await this.waitForSelectionMenuClose('year');\n }\n this.openDockedMonthMenu();\n }\n\n private toggleYearMenu = () => {\n void this.toggleYearMenuAsync();\n };\n\n private async toggleYearMenuAsync() {\n if (this.yearMenuOpen) {\n await this.closeDockedSelectionMenu('year', { bloomCalendar: true, restoreFocus: true });\n return;\n }\n if (this.monthMenuOpen) {\n this.captureYearListRange();\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.yearMenuOpen = true;\n this.menuShouldFocus = 'year';\n this.emitMenuOpen('year');\n await this.closeDockedSelectionMenu('month', {\n bloomCalendar: false,\n restoreFocus: false,\n });\n return;\n }\n if (this.selectionMenuClosing === 'month') {\n await this.waitForSelectionMenuClose('month');\n }\n this.openDockedYearMenu();\n }\n\n /**\n * Docked month/year menu: wait for the activated item's ripple to finish,\n * then apply the selection and return to the day grid.\n */\n private async pickDockedSelection(\n kind: 'month' | 'year',\n apply: () => void,\n item?: EventTarget | null,\n ) {\n const host = item instanceof HTMLElement ? item : null;\n if (host) {\n await waitForHostRipple(host);\n }\n apply();\n await this.closeDockedSelectionMenu(kind, { bloomCalendar: true, restoreFocus: false });\n }\n\n private pickMonth(month: number, item?: EventTarget | null) {\n void this.pickDockedSelection('month', () => {\n this.viewMonth = month;\n this.emitMenuSelect('month', month, this.monthLabel(month));\n this.emitViewChange('month-menu');\n }, item);\n }\n\n private pickYear(year: number, item?: EventTarget | null) {\n void this.pickDockedSelection('year', () => {\n this.viewYear = year;\n this.emitMenuSelect('year', year, String(year));\n this.emitViewChange('year-menu');\n }, item);\n }\n\n private onMonthMenuClose = () => {\n if (!this.monthMenuOpen) return;\n void this.closeDockedSelectionMenu('month', { bloomCalendar: true, restoreFocus: true });\n };\n\n private onYearMenuClose = () => {\n if (!this.yearMenuOpen) return;\n void this.closeDockedSelectionMenu('year', { bloomCalendar: true, restoreFocus: true });\n };\n\n private selectYear(year: number) {\n if (this.isDisabledYear(year)) return;\n this.viewYear = year;\n this.focusedDate = new Date(year, this.viewMonth, 1);\n this.emitMenuSelect('year', year, String(year));\n this.emitViewChange('year-menu');\n void this.closeYearViewAnimated();\n }\n\n private openYearView() {\n this.clearModalCalendarBloom();\n this.yearViewClosing = false;\n this.viewMode = 'year';\n this.captureYearListRange();\n this.yearGridShouldScroll = true;\n this.emitMenuOpen('year');\n }\n\n /** Animated close for modal / range year grid (toggle, pick). */\n private async closeYearViewAnimated() {\n if (this.viewMode !== 'year' || this.yearViewClosing) return;\n\n if (this.prefersReducedMotion()) {\n this.viewMode = 'calendar';\n this.clearYearListRange();\n return;\n }\n\n this.yearViewClosing = true;\n await this.delay(this.selectionBloomOutMs());\n this.yearViewClosing = false;\n this.viewMode = 'calendar';\n this.clearYearListRange();\n this.beginModalCalendarBloom();\n }\n\n private toggleYearView = () => {\n if (this.viewMode === 'year') {\n void this.closeYearViewAnimated();\n } else {\n this.openYearView();\n }\n };\n\n private toggleInputMode = () => {\n if (this.inputMode) {\n this.commitDialogInput();\n if (this.error) return;\n } else {\n // entering input mode: seed draft from pending selection\n this.inputDraft = this.pendingDate ? this.formatField(this.pendingDate) : '';\n }\n this.inputMode = !this.inputMode;\n this.viewMode = 'calendar';\n this.emitModeChange(this.inputMode ? 'input' : 'calendar');\n if (this.inputMode) {\n this.entryInputShouldFocus = true;\n }\n };\n\n /** Normalize navigation keys — some Mac / IME layouts report Page Up/Down via `code`. */\n private resolveNavigationKey(e: KeyboardEvent): string {\n if (e.key === 'PageUp' || e.code === 'PageUp') return 'PageUp';\n if (e.key === 'PageDown' || e.code === 'PageDown') return 'PageDown';\n // Mac compact keyboards: Option/Alt+↑/↓ is a common Page Up/Down fallback.\n if (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) {\n if (e.key === 'ArrowUp' || e.code === 'ArrowUp') return 'PageUp';\n if (e.key === 'ArrowDown' || e.code === 'ArrowDown') return 'PageDown';\n }\n return e.key;\n }\n\n private asEventElement(target: EventTarget | null): Element | null {\n if (target == null || typeof target !== 'object') return null;\n if (!('closest' in target) || typeof (target as Element).closest !== 'function') {\n return null;\n }\n return target as Element;\n }\n\n private isEditableKeyTarget(target: EventTarget | null): boolean {\n const el = this.asEventElement(target);\n if (!el) return false;\n const editable = el.closest(\n 'input:not([readonly]):not([disabled]), textarea:not([disabled]), [contenteditable=\"true\"]',\n );\n return !!editable;\n }\n\n private isInsideSelectionMenu(target: EventTarget | null): boolean {\n return (\n !!this.findInPickerTree(target, '[part=\"month-menu\"]') ||\n !!this.findInPickerTree(target, '[part=\"year-menu\"]')\n );\n }\n\n /** Walk up through shadow boundaries to find a matching ancestor. */\n private findInPickerTree(target: EventTarget | null, selector: string): Element | null {\n const el = this.asEventElement(target);\n if (!el) return null;\n let current: Element | null = el;\n while (current) {\n try {\n if (current.matches(selector)) return current;\n } catch {\n /* invalid selector */\n }\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n current = root.host;\n } else {\n current = current.parentElement;\n }\n }\n return null;\n }\n\n /** True when keyboard target/focus is on a day cell in the calendar grid. */\n private isDayGridKeyTarget(target: EventTarget | null): boolean {\n if (this.findInPickerTree(target, '[data-date]')) return true;\n if (typeof document !== 'undefined') {\n return !!this.findInPickerTree(document.activeElement, '[data-date]');\n }\n return false;\n }\n\n private isDockedMenuToggleKey(e: KeyboardEvent): boolean {\n if (!this.isDocked || !e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) return false;\n const letter = e.key.toLowerCase();\n return letter === 'm' || letter === 'y';\n }\n\n private isCalendarNavigationKey(e: KeyboardEvent): boolean {\n const key = this.resolveNavigationKey(e);\n if (\n key === 'ArrowRight' ||\n key === 'ArrowLeft' ||\n key === 'ArrowDown' ||\n key === 'ArrowUp' ||\n key === 'Home' ||\n key === 'End' ||\n key === 'PageUp' ||\n key === 'PageDown' ||\n key === 'Enter' ||\n key === ' '\n ) {\n return true;\n }\n return this.isDockedMenuToggleKey(e);\n }\n\n private canHandleCalendarKeyDown(e: KeyboardEvent, target?: EventTarget | null): boolean {\n if (!this.open || e.defaultPrevented) return false;\n if (this.viewMode !== 'calendar' || this.inputMode) return false;\n const menuToggle = this.isDockedMenuToggleKey(e);\n if (!menuToggle && (this.monthMenuOpen || this.yearMenuOpen || this.selectionMenuClosing)) {\n return false;\n }\n if (!this.isCalendarNavigationKey(e)) return false;\n\n const t = target ?? e.target;\n if (this.isEditableKeyTarget(t)) {\n // Route navigation shortcuts from the trigger field while the panel is open\n // so users need not Tab into the day grid first (docked / modal-input).\n if (!(this.hasField && this.isTriggerFieldTarget(t))) return false;\n // Enter commits typed text — the field's own handler formats on Enter.\n if (this.resolveNavigationKey(e) === 'Enter') return false;\n }\n if (!menuToggle && this.isInsideSelectionMenu(t)) return false;\n\n const key = this.resolveNavigationKey(e);\n if (key === 'Enter' || key === ' ') {\n if (!this.isDayGridKeyTarget(t) && !this.isDayGridKeyTarget(e.target)) {\n return false;\n }\n }\n\n return true;\n }\n\n /** Event path (composed), with a parent-walk fallback for older test environments. */\n private getEventPathNodes(e: Event): EventTarget[] {\n if (typeof e.composedPath === 'function') {\n return e.composedPath();\n }\n const nodes: EventTarget[] = [];\n let node: Node | null = e.target as Node | null;\n while (node) {\n nodes.push(node);\n const root = node.getRootNode();\n if (root instanceof ShadowRoot) {\n node = root.host;\n } else {\n node = node.parentNode;\n }\n }\n return nodes;\n }\n\n /** True when `node` is this picker or any nested shadow descendant. */\n private isNodeInPicker(node: EventTarget | null): boolean {\n if (node == null || typeof node !== 'object' || !('nodeType' in node)) return false;\n let current: Node | null = node as Node;\n while (current) {\n if (current === this.el || current === this.panelEl) return true;\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n current = root.host;\n } else {\n current = current.parentNode;\n }\n }\n return false;\n }\n\n /** Keyboard event originated inside this picker (crosses shadow boundaries). */\n private isEventInPicker(e: KeyboardEvent): boolean {\n if (!this.open) return false;\n if (this.getEventPathNodes(e).includes(this.el)) return true;\n if (typeof document !== 'undefined') {\n if (this.isNodeInPicker(document.activeElement)) return true;\n if (this.panelPointerEngaged) return true;\n }\n return false;\n }\n\n /** Input inside the trigger field (outside the calendar panel). */\n private isTriggerFieldTarget(target: EventTarget | null): boolean {\n return this.isNodeInPicker(target) && !this.isNodeInPanel(target);\n }\n\n /** Prefer focused panel control, then event target, then the open panel. */\n private resolveCalendarKeyTarget(e: KeyboardEvent): EventTarget | null {\n if (typeof document !== 'undefined') {\n const active = document.activeElement;\n if (active && this.isNodeInPanel(active)) return active;\n }\n if (e.target && this.isNodeInPicker(e.target)) return e.target;\n if (typeof document !== 'undefined') {\n const active = document.activeElement;\n if (active && this.isNodeInPicker(active)) return active;\n }\n return this.panelEl ?? null;\n }\n\n /**\n * Non-interactive panel chrome (grid background, weekday row, padding) does not\n * receive focus on click — route subsequent keys via panelPointerEngaged.\n */\n private shouldPanelClaimFocus(target: EventTarget | null): boolean {\n const el = this.asEventElement(target);\n if (!el) return true;\n if (\n el.closest(\n 'button, [role=\"button\"], input, textarea, [contenteditable=\"true\"], md-menu-item, a[href]',\n )\n ) {\n return false;\n }\n return true;\n }\n\n private onPanelMouseDown = (e: MouseEvent) => {\n if (e.button !== 0 || !this.open || !this.panelEl) return;\n if (!this.shouldPanelClaimFocus(e.target)) return;\n this.panelPointerEngaged = true;\n if (\n this.viewMode === 'calendar' &&\n !this.inputMode &&\n !this.monthMenuOpen &&\n !this.yearMenuOpen\n ) {\n this.gridShouldFocus = true;\n }\n };\n\n /** True when `node` is inside the open calendar panel (crosses shadow boundaries). */\n private isNodeInPanel(node: EventTarget | null): boolean {\n if (!this.panelEl || node == null || typeof node !== 'object' || !('nodeType' in node)) {\n return false;\n }\n let current: Node | null = node as Node;\n while (current) {\n if (current === this.panelEl) return true;\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n current = root.host;\n } else {\n current = current.parentNode;\n }\n }\n return false;\n }\n\n private handleDayKeyDown = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return;\n this.handleCalendarKeyDown(e);\n };\n\n private handleCalendarKeyDown = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return;\n\n if (this.isDockedMenuToggleKey(e)) {\n const key = e.key.toLowerCase();\n if (key === 'm') {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n this.toggleMonthMenu();\n return;\n }\n if (key === 'y') {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n this.toggleYearMenu();\n return;\n }\n }\n\n let next: Date | null = null;\n switch (this.resolveNavigationKey(e)) {\n case 'ArrowRight':\n next = addDays(this.focusedDate, 1);\n break;\n case 'ArrowLeft':\n next = addDays(this.focusedDate, -1);\n break;\n case 'ArrowDown':\n next = addDays(this.focusedDate, 7);\n break;\n case 'ArrowUp':\n next = addDays(this.focusedDate, -7);\n break;\n case 'Home':\n next = new Date(\n this.focusedDate.getFullYear(),\n this.focusedDate.getMonth(),\n 1,\n );\n break;\n case 'End':\n next = new Date(\n this.focusedDate.getFullYear(),\n this.focusedDate.getMonth(),\n daysInMonth(this.focusedDate.getFullYear(), this.focusedDate.getMonth()),\n );\n break;\n case 'PageUp':\n next = addMonths(this.focusedDate, e.shiftKey ? -12 : -1);\n break;\n case 'PageDown':\n next = addMonths(this.focusedDate, e.shiftKey ? 12 : 1);\n break;\n case 'Enter': {\n if (!this.isDayGridKeyTarget(e.target)) return;\n e.preventDefault();\n if (this.isDisabledDate(this.focusedDate)) return;\n this.selectDay({ date: this.focusedDate, outOfMonth: false });\n this.commit();\n return;\n }\n case ' ': {\n if (!this.isDayGridKeyTarget(e.target)) return;\n e.preventDefault();\n this.selectDay({ date: this.focusedDate, outOfMonth: false });\n return;\n }\n default:\n return;\n }\n e.preventDefault();\n const prevViewYear = this.viewYear;\n const prevViewMonth = this.viewMonth;\n this.focusedDate = clampDate(next, this.min, this.max);\n const navKey = this.resolveNavigationKey(e);\n if (\n (navKey === 'PageUp' || navKey === 'PageDown') &&\n (this.focusedDate.getFullYear() !== prevViewYear ||\n this.focusedDate.getMonth() !== prevViewMonth)\n ) {\n this.setGridSlideDirection(navKey === 'PageDown' ? 1 : -1);\n }\n this.viewYear = this.focusedDate.getFullYear();\n this.viewMonth = this.focusedDate.getMonth();\n this.gridShouldFocus = true;\n };\n\n /**\n * Enter in the trigger text field parses and formats typed input.\n * Handled at host capture so shadow-DOM inputs (docked md-text-field) are covered.\n */\n private tryCommitTriggerFieldOnEnter(e: KeyboardEvent): boolean {\n if (this.disabled || !this.hasField || e.key !== 'Enter') return false;\n const target = e.target;\n if (!target || !this.isNodeInPicker(target)) return false;\n if (!this.isEditableKeyTarget(target) || !this.isTriggerFieldTarget(target)) return false;\n\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(target);\n this.onFieldCommit();\n return true;\n }\n\n /**\n * Enter in the modal typed-entry field parses, formats, and commits the selection\n * (same end result as OK). Handled at host capture so md-text-field shadow inputs\n * are covered.\n */\n private tryCommitDialogInputOnEnter(e: KeyboardEvent): boolean {\n if (this.disabled || !this.inputMode || e.key !== 'Enter') return false;\n const target = e.target;\n if (!target || !this.isEditableKeyTarget(target)) return false;\n const el = this.asEventElement(target);\n if (!el?.closest('[part=\"entry-input\"]')) return false;\n\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(target);\n this.commitDialogInput();\n if (this.error) return true;\n this.commit();\n return true;\n }\n\n private routePickerKeyDown(e: KeyboardEvent, fromHostCapture = false): void {\n if (e.defaultPrevented || this.panelClosing) return;\n\n if (this.tryCommitDialogInputOnEnter(e)) return;\n if (this.tryCommitTriggerFieldOnEnter(e)) return;\n\n if (!this.open) return;\n if (!fromHostCapture && !this.isEventInPicker(e)) return;\n\n if (e.key === 'Escape') {\n e.preventDefault();\n if (this.isDocked && (this.monthMenuOpen || this.yearMenuOpen)) {\n this.closeMenus(null, true);\n return;\n }\n this.requestDismiss();\n return;\n }\n\n if (this.canHandleCalendarKeyDown(e, this.resolveCalendarKeyTarget(e))) {\n this.handleCalendarKeyDown(e);\n }\n }\n\n @Listen('keydown', { target: 'document', capture: true })\n handleDocumentKeyDown(e: KeyboardEvent) {\n this.routePickerKeyDown(e);\n }\n\n /**\n * A docked panel has no scrim, so the click that lands outside it arrives here\n * instead. `pointerdown` rather than `click` so the dismiss happens before the\n * pressed element can move or unmount under the pointer.\n *\n * The trigger field is inside the host, so its own click keeps toggling the\n * panel — this only fires for genuinely outside targets.\n */\n @Listen('pointerdown', { target: 'document', capture: true })\n handleDocumentPointerDown(e: Event) {\n if (!this.open || this.panelClosing) return;\n if (!this.isDocked || !this.outsideClickDismissible) return;\n if (this.getEventPathNodes(e).includes(this.el)) return;\n if (this.isNodeInPicker(e.target)) return;\n this.requestDismiss();\n }\n\n /** Capture keys from nested trigger fields (md-text-field shadow) and child components. */\n @Listen('keydown', { capture: true })\n handleHostKeyDown(e: KeyboardEvent) {\n this.routePickerKeyDown(e, true);\n }\n\n /**\n * Nested overlays (md-tooltip, md-menu) also emit `mdOpen` / `mdClose`.\n * Swallow those at the picker host so controlled consumers only react to this\n * component's own open/close lifecycle (see `handleOpen` / `handleClose`).\n */\n @Listen('mdOpen')\n swallowNestedMdOpen(e: Event) {\n if ((e.composedPath?.()[0] ?? e.target) !== this.el) {\n e.stopImmediatePropagation();\n }\n }\n\n @Listen('mdClose')\n swallowNestedMdClose(e: Event) {\n if ((e.composedPath?.()[0] ?? e.target) !== this.el) {\n e.stopImmediatePropagation();\n }\n }\n\n private onPanelKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n if (this.isDocked && (this.monthMenuOpen || this.yearMenuOpen)) {\n this.closeMenus(null, true);\n return;\n }\n this.requestDismiss();\n return;\n }\n if (this.canHandleCalendarKeyDown(e, this.resolveCalendarKeyTarget(e))) {\n this.handleCalendarKeyDown(e);\n return;\n }\n if (e.key === 'Tab' && !this.isDocked) {\n this.trapTab(e);\n }\n };\n\n /** Move roving tabindex to the focused day after open / keyboard navigation. */\n private focusFocusedDay() {\n const iso = toIsoDate(this.focusedDate);\n const btn = this.panelEl?.querySelector<HTMLElement>(`[data-date=\"${iso}\"]`);\n if (!btn) return;\n const run = () => btn.focus();\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n private trapTab(e: KeyboardEvent) {\n const panel = this.panelEl;\n if (!panel) return;\n const focusables = Array.from(\n panel.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n ),\n ).filter((el) => el.offsetParent !== null || el === document.activeElement);\n if (focusables.length === 0) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = (this.el.shadowRoot?.activeElement ?? null) as HTMLElement | null;\n if (e.shiftKey && active === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n componentDidRender() {\n if (\n this.isDocked &&\n this.open &&\n !this.panelClosing &&\n !this.selectionMenuClosing &&\n !this.dockedCalendarBloom\n ) {\n this.positionDockedPanel();\n }\n if (this.menuShouldFocus) {\n const kind = this.menuShouldFocus;\n this.menuShouldFocus = null;\n this.afterDockedSelectionMenuPaint(kind);\n return;\n }\n if (this.yearGridShouldScroll) {\n this.yearGridShouldScroll = false;\n this.afterModalYearGridPaint();\n return;\n }\n if (this.menuRestoreFocus) {\n const kind = this.menuRestoreFocus;\n this.menuRestoreFocus = null;\n const el = kind === 'month' ? this.monthMenuButtonEl : this.yearMenuButtonEl;\n this.restoreMenuFocus(el);\n return;\n }\n if (this.entryInputShouldFocus && this.inputMode) {\n this.entryInputShouldFocus = false;\n const input = this.entryTextFieldEl?.shadowRoot?.querySelector(\n '.md-text-field__input',\n );\n if (input instanceof HTMLElement) {\n input.focus();\n }\n return;\n }\n if (\n this.open &&\n this.gridShouldFocus &&\n this.viewMode === 'calendar' &&\n !this.inputMode &&\n !this.monthMenuOpen &&\n !this.yearMenuOpen\n ) {\n this.focusFocusedDay();\n this.gridShouldFocus = false;\n }\n }\n\n // ---- render helpers ---------------------------------------------------\n\n /**\n * Shared trigger for `docked` and `modal-input` — `md-text-field` (outlined)\n * with a trailing `md-icon-button` calendar toggle instead of hand-rolled field\n * markup so both variants inherit design-system field anatomy and icon handling.\n */\n private textFieldKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n // Host capture (`tryCommitTriggerFieldOnEnter`) handles Enter from shadow inputs.\n if (e.defaultPrevented) return;\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(e.target);\n this.onFieldCommit();\n };\n\n private entryTextFieldKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter' || !this.inputMode) return;\n // Host capture (`tryCommitDialogInputOnEnter`) handles Enter from shadow inputs.\n if (e.defaultPrevented) return;\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(e.target);\n this.commitDialogInput();\n if (this.error) return;\n this.commit();\n };\n\n private renderTextFieldTrigger() {\n const selected = parseIsoDate(this.value);\n const display = this.focused ? this.inputDraft : this.formatField(selected);\n const supporting =\n this.error && this.errorText ? '' : this.supportingText || this.dateFormatHint();\n return (\n <md-text-field\n class=\"md-date-picker__textfield\"\n part=\"field\"\n variant={this.fieldVariant}\n label={this.label}\n value={display}\n supportingText={supporting}\n error={this.error}\n errorText={this.errorText}\n reserveSupportingSpace={this.reserveSupportingSpace}\n disabled={this.disabled}\n required={this.required}\n appearFocused={this.open}\n onFocusin={() => {\n this.focused = true;\n if (!this.error) this.seedFieldDraftFromValue();\n }}\n onFocusout={() => {\n this.focused = false;\n }}\n onKeyDown={this.textFieldKeyDown}\n onMdInput={(e: CustomEvent<string>) => {\n this.inputDraft = e.detail;\n this.mdInput.emit({ value: e.detail });\n }}\n onMdChange={(e: CustomEvent<string>) => {\n this.inputDraft = e.detail;\n this.onFieldCommit();\n }}\n >\n {this.hasSlottedLeading && <slot name=\"leading-icon\" slot=\"leading-icon\" />}\n {this.clearable && !!this.value && !this.disabled && (\n <md-icon-button\n slot=\"trailing-icon\"\n class=\"md-date-picker__clear-button\"\n part=\"clear-button\"\n variant=\"standard\"\n icon=\"close\"\n aria-label={this.clearLabel}\n // Native click so stopPropagation prevents the field toggle from\n // also firing and opening the calendar.\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n void this.clear();\n }}\n ></md-icon-button>\n )}\n <md-icon-button\n slot=\"trailing-icon\"\n class=\"md-date-picker__calendar-button\"\n part=\"calendar-button\"\n variant={this.triggerExpanded ? 'tonal' : 'standard'}\n icon={this.hasSlottedCalendarIcon ? '' : this.calendarIcon}\n aria-label={\n this.triggerExpanded ? this.closeCalendarLabel : this.openCalendarLabel\n }\n aria-haspopup=\"dialog\"\n aria-expanded={this.triggerExpanded ? 'true' : 'false'}\n disabled={this.disabled}\n ref={(el) => (this.triggerEl = el as HTMLElement)}\n onMdClick={() => (this.open ? this.close() : this.show())}\n >\n {this.hasSlottedCalendarIcon && (\n <slot name=\"calendar-icon\" slot=\"\" />\n )}\n </md-icon-button>\n </md-text-field>\n );\n }\n\n /** Prev/next chevron for modal month nav (md-icon-button + tooltip). */\n private renderModalNavChevron(side: 'prev' | 'next', onStep: () => void) {\n return (\n <md-tooltip\n class=\"md-date-picker__nav-chevron-tooltip\"\n text={this.navTooltipText('month', side)}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET}\n >\n <md-icon-button\n class=\"md-date-picker__directional-icon md-date-picker__nav-chevron\"\n part={side === 'prev' ? 'prev-button' : 'next-button'}\n size=\"sm\"\n icon={side === 'prev' ? 'chevron_left' : 'chevron_right'}\n aria-label={this.navActionLabel('month', side)}\n onClick={onStep}\n ></md-icon-button>\n </md-tooltip>\n );\n }\n\n private modalMonthYearTooltipText(year: number, month: number): string {\n return `${this.formatMonthYear(year, month)} · ${this.chooseMonthAndYearLabel}`;\n }\n\n private renderNav(secondary = false) {\n const navYear = secondary\n ? addMonths(new Date(this.viewYear, this.viewMonth, 1), 1).getFullYear()\n : this.viewYear;\n const navMonth = secondary\n ? addMonths(new Date(this.viewYear, this.viewMonth, 1), 1).getMonth()\n : this.viewMonth;\n const yearExpanded =\n !secondary && (this.viewMode === 'year' || this.yearViewClosing);\n const monthYearButton = (\n <md-button\n class={{\n 'md-date-picker__menu-button': true,\n 'md-date-picker__menu-button--expanded': yearExpanded,\n }}\n part=\"month-toggle\"\n variant=\"text\"\n size=\"sm\"\n toggle\n selected={yearExpanded}\n trailingIcon={secondary ? undefined : this.dockedMenuTrailingIcon(yearExpanded)}\n suppressExpandIconFlip\n mirrorIcon={yearExpanded}\n aria-label={this.chooseMonthYearLabel}\n aria-expanded={yearExpanded ? 'true' : 'false'}\n disabled={secondary}\n onMdClick={(e) => {\n e.preventDefault();\n if (!secondary) this.toggleYearView();\n }}\n >\n {this.formatMonthYear(navYear, navMonth)}\n {!secondary && this.renderDockedMenuTrailingCaret(yearExpanded)}\n </md-button>\n );\n return (\n <div class=\"md-date-picker__nav\" part=\"nav\">\n {secondary ? (\n monthYearButton\n ) : (\n <md-tooltip\n class=\"md-date-picker__menu-button-tooltip\"\n text={this.modalMonthYearTooltipText(navYear, navMonth)}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_MENU_TOOLTIP_OFFSET}\n >\n {monthYearButton}\n </md-tooltip>\n )}\n {this.viewMode === 'calendar' && (\n <div class=\"md-date-picker__nav-buttons\">\n {this.renderModalNavChevron('prev', () => this.goToMonth(-1, true))}\n {this.renderModalNavChevron('next', () => this.goToMonth(1, true))}\n </div>\n )}\n </div>\n );\n }\n\n /**\n * Prev/next chevron for docked month/year nav. Inactive scope (other menu open)\n * renders a same-size spacer so menu triggers do not shift when buttons are absent.\n */\n private renderDockedNavChevron(\n side: 'prev' | 'next',\n scope: 'month' | 'year',\n visible: boolean,\n onStep: () => void,\n ) {\n return (\n <span class=\"md-date-picker__nav-chevron-slot\" part={`${side}-${scope}-chevron-slot`}>\n <md-tooltip\n class={{\n 'md-date-picker__nav-chevron-tooltip': true,\n 'md-date-picker__nav-chevron--visible': visible,\n }}\n text={this.navTooltipText(scope, side)}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET}\n >\n <md-icon-button\n class=\"md-date-picker__directional-icon md-date-picker__nav-chevron\"\n part={`${side}-${scope}-button`}\n size=\"sm\"\n icon={side === 'prev' ? 'chevron_left' : 'chevron_right'}\n aria-label={this.navActionLabel(scope, side)}\n disabled={!visible}\n onClick={visible ? onStep : undefined}\n ></md-icon-button>\n </md-tooltip>\n <span\n class={{\n 'md-date-picker__nav-chevron-spacer': true,\n 'md-date-picker__nav-chevron--visible': !visible,\n }}\n part={`${side}-${scope}-chevron-spacer`}\n aria-hidden=\"true\"\n ></span>\n </span>\n );\n }\n\n private renderDockedNav() {\n const monthShort = new Intl.DateTimeFormat(this.loc, { month: 'short' }).format(\n new Date(this.viewYear, this.viewMonth, 1),\n );\n const monthExpanded = this.isDockedMonthMenuExpanded();\n const yearExpanded = this.isDockedYearMenuExpanded();\n return (\n <div class=\"md-date-picker__docked-nav\" part=\"nav\">\n <div\n class={{\n 'md-date-picker__nav-group': true,\n 'md-date-picker__nav-group--month': true,\n 'md-date-picker__nav-group--selection-open': monthExpanded,\n }}\n >\n {this.renderDockedNavChevron('prev', 'month', !yearExpanded, () => this.goToMonth(-1, true))}\n <md-tooltip\n class=\"md-date-picker__menu-button-tooltip\"\n text={this.menuTooltipText('month')}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_MENU_TOOLTIP_OFFSET}\n >\n <md-button\n class={{\n 'md-date-picker__menu-button': true,\n 'md-date-picker__menu-button--expanded': monthExpanded,\n }}\n part=\"month-menu-button\"\n variant=\"text\"\n size=\"sm\"\n toggle\n selected={monthExpanded}\n trailingIcon={this.dockedMenuTrailingIcon(monthExpanded)}\n suppressExpandIconFlip\n mirrorIcon={monthExpanded}\n aria-label={this.chooseMonthLabel}\n aria-haspopup=\"menu\"\n aria-expanded={monthExpanded ? 'true' : 'false'}\n ref={(el) => (this.monthMenuButtonEl = el as HTMLElement)}\n onMdClick={(e) => {\n e.preventDefault();\n this.toggleMonthMenu();\n }}\n >\n {monthShort}\n {this.renderDockedMenuTrailingCaret(monthExpanded)}\n </md-button>\n </md-tooltip>\n {this.renderDockedNavChevron('next', 'month', !yearExpanded, () => this.goToMonth(1, true))}\n </div>\n <div\n class={{\n 'md-date-picker__nav-group': true,\n 'md-date-picker__nav-group--year': true,\n 'md-date-picker__nav-group--selection-open': yearExpanded,\n }}\n >\n {this.renderDockedNavChevron('prev', 'year', !monthExpanded, () => this.goToYear(-1, true))}\n <md-tooltip\n class=\"md-date-picker__menu-button-tooltip\"\n text={this.menuTooltipText('year')}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_MENU_TOOLTIP_OFFSET}\n >\n <md-button\n class={{\n 'md-date-picker__menu-button': true,\n 'md-date-picker__menu-button--expanded': yearExpanded,\n }}\n part=\"year-menu-button\"\n variant=\"text\"\n size=\"sm\"\n toggle\n selected={yearExpanded}\n trailingIcon={this.dockedMenuTrailingIcon(yearExpanded)}\n suppressExpandIconFlip\n mirrorIcon={yearExpanded}\n aria-label={this.chooseYearLabel}\n aria-haspopup=\"menu\"\n aria-expanded={yearExpanded ? 'true' : 'false'}\n ref={(el) => (this.yearMenuButtonEl = el as HTMLElement)}\n onMdClick={(e) => {\n e.preventDefault();\n this.toggleYearMenu();\n }}\n >\n {this.viewYear}\n {this.renderDockedMenuTrailingCaret(yearExpanded)}\n </md-button>\n </md-tooltip>\n {this.renderDockedNavChevron('next', 'year', !monthExpanded, () => this.goToYear(1, true))}\n </div>\n </div>\n );\n }\n\n /** Full-width divider between docked nav and month/year selection list. */\n private renderDockedSelectionDivider() {\n return (\n <div\n class=\"md-date-picker__selection-divider\"\n part=\"selection-divider\"\n role=\"separator\"\n aria-hidden=\"true\"\n />\n );\n }\n\n /**\n * Inline baseline `md-menu` with leading radio checks — replaces the day grid\n * while month selection is active in the docked panel body.\n */\n private renderDockedMonthMenu(closing: boolean) {\n const months = Array.from({ length: 12 }, (_, m) =>\n new Intl.DateTimeFormat(this.loc, { month: 'long' }).format(new Date(2024, m, 1)),\n );\n return (\n <div\n class={{\n 'md-date-picker__selection-menu-wrap': true,\n 'md-date-picker__selection-menu-wrap--bloom-out': closing,\n }}\n part=\"month-menu-wrap\"\n >\n <md-menu\n class=\"md-date-picker__selection-menu md-menu--inline-fill\"\n part=\"month-menu\"\n exportparts=\"menu-viewport:month-menu-viewport\"\n variant=\"baseline\"\n open\n quick\n persistent\n autoFocus={false}\n onMdClose={this.onMonthMenuClose}\n >\n {months.map((name, m) => {\n const sel = m === this.viewMonth;\n return (\n <md-menu-item\n part={sel ? 'month-option month-option-selected' : 'month-option'}\n headline={name}\n type=\"radio\"\n check-position=\"start\"\n keep-open\n selected={sel}\n onMdClick={(e) => this.pickMonth(m, e.target)}\n ></md-menu-item>\n );\n })}\n </md-menu>\n </div>\n );\n }\n\n /**\n * Inline baseline `md-menu` with leading radio checks — replaces the day grid\n * while year selection is active in the docked panel body.\n */\n private renderDockedYearMenu(closing: boolean) {\n const current = this.viewYear;\n const { minYear, maxYear } = this.getYearListBounds();\n const years: number[] = [];\n for (let y = minYear; y <= maxYear; y++) years.push(y);\n return (\n <div\n class={{\n 'md-date-picker__selection-menu-wrap': true,\n 'md-date-picker__selection-menu-wrap--year': true,\n 'md-date-picker__selection-menu-wrap--bloom-out': closing,\n }}\n part=\"year-menu-wrap\"\n >\n <md-menu\n class=\"md-date-picker__selection-menu md-menu--inline-fill\"\n part=\"year-menu\"\n exportparts=\"menu-viewport:year-menu-viewport\"\n variant=\"baseline\"\n open\n quick\n persistent\n autoFocus={false}\n onMdClose={this.onYearMenuClose}\n >\n {years.map((y) => {\n const sel = y === current;\n return (\n <md-menu-item\n part={sel ? 'year-option year-option-selected' : 'year-option'}\n headline={String(y)}\n type=\"radio\"\n check-position=\"start\"\n keep-open\n selected={sel}\n onMdClick={(e) => this.pickYear(y, e.target)}\n ></md-menu-item>\n );\n })}\n </md-menu>\n </div>\n );\n }\n\n private renderCalendar(\n year: number,\n month: number,\n primary = true,\n contentBloom = false,\n ) {\n const firstDay = this.resolvedFirstDay();\n const names = weekdayNames(this.locale, firstDay, 'narrow');\n const fullNames = weekdayNames(this.locale, firstDay, 'long');\n const cells = buildMonthMatrix(year, month, firstDay);\n const today = new Date();\n const gridLabel = this.formatMonthYear(year, month);\n return (\n <div\n class={{\n 'md-date-picker__calendar': true,\n 'md-date-picker__calendar--docked-bloom-in': contentBloom && this.isDocked,\n 'md-date-picker__calendar--content-bloom-in': contentBloom && !this.isDocked,\n }}\n part=\"calendar\"\n role=\"grid\"\n aria-label={gridLabel}\n >\n <div class=\"md-date-picker__weekdays\" part=\"weekdays\" role=\"row\" aria-hidden=\"true\">\n {names.map((n, i) => (\n <md-tooltip\n class=\"md-date-picker__weekday-tooltip\"\n text={fullNames[i]}\n showDelay={0}\n position=\"bottom\"\n offset={3}\n >\n <span\n class=\"md-date-picker__weekday\"\n part=\"weekday\"\n role=\"presentation\"\n >\n {n}\n </span>\n </md-tooltip>\n ))}\n </div>\n <div\n class={{\n 'md-date-picker__grid': true,\n 'md-date-picker__grid--slide-forward': this.gridSlideDirection === 'forward',\n 'md-date-picker__grid--slide-backward': this.gridSlideDirection === 'backward',\n }}\n part=\"grid\"\n role=\"rowgroup\"\n onAnimationEnd={this.onGridSlideAnimationEnd}\n >\n {Array.from({ length: cells.length / 7 }, (_unused, week) => (\n <div class=\"md-date-picker__week\" part=\"week\" role=\"row\">\n {cells\n .slice(week * 7, week * 7 + 7)\n .map((cell) => this.renderDay(cell, today, primary))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n private renderDay(cell: DayCell, today: Date, primary: boolean) {\n const d = cell.date;\n const iso = toIsoDate(d);\n const disabled = this.isDisabledDate(d);\n const isToday = isSameDay(d, today);\n const isFocusTarget = isSameDay(d, this.focusedDate) && primary;\n\n const selected = !!this.pendingDate && isSameDay(d, this.pendingDate);\n const unselected =\n !selected && !isToday && !disabled && !cell.outOfMonth;\n\n const parts = ['day'];\n if (selected) parts.push('day-selected');\n if (isToday) parts.push('day-today');\n if (disabled) parts.push('day-disabled');\n if (cell.outOfMonth) parts.push('day-outside');\n if (unselected) parts.push('day-unselected');\n\n return (\n <md-button\n class={{\n 'md-date-picker__day': true,\n 'md-date-picker__day--selected': selected,\n 'md-date-picker__day--today': isToday,\n 'md-date-picker__day--disabled': disabled,\n 'md-date-picker__day--outside': cell.outOfMonth,\n 'md-date-picker__day--unselected': unselected,\n }}\n part={parts.join(' ')}\n variant={selected ? 'filled' : 'text'}\n size=\"sm\"\n shape=\"square\"\n selected={selected}\n roleOverride=\"gridcell\"\n groupTabindex={isFocusTarget ? 0 : -1}\n data-date={iso}\n aria-selected={selected ? 'true' : 'false'}\n aria-disabled={disabled ? 'true' : undefined}\n aria-current={isToday ? 'date' : undefined}\n aria-label={this.formatFullDate(d)}\n disabled={disabled}\n onMdClick={() => this.selectDay(cell)}\n onKeyDown={primary ? this.handleDayKeyDown : undefined}\n >\n {d.getDate()}\n </md-button>\n );\n }\n\n private renderYearGrid(closing = false) {\n const current = this.viewYear;\n const { minYear, maxYear } = this.getYearListBounds();\n const years: number[] = [];\n for (let y = minYear; y <= maxYear; y++) years.push(y);\n return (\n <div\n class={{\n 'md-date-picker__year-grid-wrap': true,\n 'md-date-picker__year-grid-wrap--bloom-out': closing,\n }}\n part=\"year-grid-wrap\"\n >\n <div\n class=\"md-date-picker__year-grid-scroll\"\n part=\"year-grid-scroll year-grid-viewport\"\n >\n <div class=\"md-date-picker__year-grid\" part=\"year-grid\" role=\"grid\" aria-label={this.yearGridLabel}>\n {Array.from({ length: Math.ceil(years.length / 3) }, (_unused, r) => (\n <div class=\"md-date-picker__year-row\" part=\"year-row\" role=\"row\">\n {years.slice(r * 3, r * 3 + 3).map((y) => {\n const sel = y === current;\n const disabled = this.isDisabledYear(y);\n const unselected = !sel && !disabled;\n const parts = ['year'];\n if (sel) parts.push('year-selected');\n if (disabled) parts.push('year-disabled');\n if (unselected) parts.push('year-unselected');\n\n return (\n <md-button\n class={{\n 'md-date-picker__year': true,\n 'md-date-picker__year--selected': sel,\n 'md-date-picker__year--disabled': disabled,\n 'md-date-picker__year--unselected': unselected,\n }}\n part={parts.join(' ')}\n variant={sel ? 'filled' : 'text'}\n size=\"sm\"\n shape=\"square\"\n selected={sel}\n roleOverride=\"gridcell\"\n data-year={String(y)}\n aria-selected={sel ? 'true' : 'false'}\n aria-disabled={disabled ? 'true' : undefined}\n aria-label={String(y)}\n disabled={disabled}\n onMdClick={() => this.selectYear(y)}\n >\n {y}\n </md-button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n private renderDialogInput() {\n return (\n <div class=\"md-date-picker__entry\" part=\"entry\">\n <md-text-field\n class=\"md-date-picker__entry-textfield\"\n part=\"entry-input\"\n variant=\"outlined\"\n label={this.label}\n placeholder={this.placeholder || this.dateFormatHint()}\n value={this.inputDraft}\n error={this.error}\n errorText={this.errorText}\n reserveSupportingSpace={this.reserveSupportingSpace}\n ref={(el) => (this.entryTextFieldEl = el as HTMLElement)}\n onKeyDown={this.entryTextFieldKeyDown}\n onMdInput={(e: CustomEvent<string>) => {\n this.inputDraft = e.detail;\n this.mdInput.emit({ value: e.detail });\n }}\n ></md-text-field>\n </div>\n );\n }\n\n private renderHeadline() {\n if (this.inputMode) {\n return this.enterDatesLabel;\n }\n return this.pendingDate ? this.formatHeadline(this.pendingDate) : this.selectDateLabel;\n }\n\n private renderHeader() {\n if (this.hasSlottedHeader) {\n return (\n <div class=\"md-date-picker__header\" part=\"header\">\n <slot name=\"header\" />\n </div>\n );\n }\n const supporting = this.headline;\n const modeToggleLabel = this.inputMode\n ? this.toggleCalendarLabel\n : this.toggleTextLabel;\n return (\n <div class=\"md-date-picker__header\" part=\"header\">\n <div class=\"md-date-picker__header-supporting\" part=\"supporting\">\n {supporting}\n </div>\n <div class=\"md-date-picker__header-row\">\n <div class=\"md-date-picker__headline\" part=\"headline\">\n {this.renderHeadline()}\n </div>\n {this.variant !== 'docked' && (\n <md-tooltip\n class=\"md-date-picker__mode-toggle-tooltip\"\n text={modeToggleLabel}\n showDelay={0}\n position=\"bottom\"\n >\n <md-icon-button\n class=\"md-date-picker__mode-toggle\"\n part=\"mode-toggle\"\n icon={this.inputMode ? 'calendar_today' : 'edit'}\n aria-label={modeToggleLabel}\n onClick={this.toggleInputMode}\n ></md-icon-button>\n </md-tooltip>\n )}\n </div>\n </div>\n );\n }\n\n /** Whether a Cancel / OK row is rendered at all. The body relies on it for\n * its bottom inset, so both must agree. */\n private get hasActionRow(): boolean {\n // `commit-on-select` collapses a day CLICK into a commit — text entry has no\n // click to collapse, so input mode keeps its OK button or the typed date\n // could never be committed with the pointer.\n return this.hasSlottedActions || !this.commitOnSelect || this.inputMode;\n }\n\n private renderActions() {\n // Nothing is staged in commit-on-select mode, so a Cancel / OK row would\n // confirm a decision the user already made. Slotted actions are still\n // honoured — those are the consumer's, and they may hold other controls.\n if (!this.hasActionRow) return null;\n if (this.hasSlottedActions) {\n return (\n <div class=\"md-date-picker__actions\" part=\"actions\">\n <slot name=\"actions\" />\n </div>\n );\n }\n return (\n <div class=\"md-date-picker__actions\" part=\"actions\">\n <md-button\n class=\"md-date-picker__action-btn\"\n variant=\"text\"\n size=\"sm\"\n onMdClick={() => this.cancel()}\n part=\"cancel-button\"\n >\n {this.cancelLabel}\n </md-button>\n <md-button\n class=\"md-date-picker__action-btn md-date-picker__action-btn--primary\"\n variant=\"text\"\n size=\"sm\"\n onMdClick={() => {\n if (this.inputMode) {\n this.commitDialogInput();\n if (this.error) return;\n }\n this.commit();\n }}\n part=\"ok-button\"\n >\n {this.okLabel}\n </md-button>\n </div>\n );\n }\n\n private renderBody() {\n if (this.inputMode) {\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--input-mode': true,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderDialogInput()}\n </div>\n );\n }\n const showYearGrid = this.viewMode === 'year' || this.yearViewClosing;\n const showModalCalendar =\n this.viewMode === 'calendar' && !this.yearViewClosing;\n const modalCalendarBloom = this.dockedCalendarBloom || this.modalCalendarBloom;\n\n if (showYearGrid && !this.isDocked) {\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--year-view': true,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderNav()}\n {this.renderYearGrid(this.yearViewClosing)}\n </div>\n );\n }\n if (this.isDocked) {\n const selectionVisible =\n this.monthMenuOpen ||\n this.yearMenuOpen ||\n !!this.selectionMenuClosing;\n const activeSelectionMenu = this.dockedSelectionMenuToShow();\n const showYearMenu = activeSelectionMenu === 'year';\n const showMonthMenu = activeSelectionMenu === 'month';\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--docked': true,\n 'md-date-picker__body--docked-selection': selectionVisible,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderDockedNav()}\n {selectionVisible && (\n <div class=\"md-date-picker__docked-below-nav\" part=\"docked-below-nav\">\n {this.renderDockedSelectionDivider()}\n </div>\n )}\n {showMonthMenu &&\n this.renderDockedMonthMenu(this.selectionMenuClosing === 'month')}\n {showYearMenu &&\n this.renderDockedYearMenu(this.selectionMenuClosing === 'year')}\n {!selectionVisible &&\n this.renderCalendar(\n this.viewYear,\n this.viewMonth,\n true,\n this.dockedCalendarBloom,\n )}\n </div>\n );\n }\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderNav()}\n {showModalCalendar &&\n this.renderCalendar(this.viewYear, this.viewMonth, true, modalCalendarBloom)}\n </div>\n );\n }\n\n private renderPanel(docked = false) {\n const dockedMaxBlockStyle =\n docked && this.dockedPanelMaxBlockSize\n ? { maxBlockSize: this.dockedPanelMaxBlockSize }\n : undefined;\n return (\n <div\n class={{\n 'md-date-picker__panel': true,\n 'md-date-picker__panel--docked': docked,\n 'md-date-picker__panel--align-end': docked && this.dockedPanelAlign === 'end',\n 'md-date-picker__panel--placement-above':\n docked && this.dockedPanelPlacement === 'above',\n 'md-date-picker__panel--input-mode': !docked && this.inputMode,\n 'md-date-picker__panel--bloom-in': !this.panelClosing,\n 'md-date-picker__panel--bloom-out': this.panelClosing,\n }}\n part=\"panel\"\n role=\"dialog\"\n aria-modal={docked ? undefined : 'true'}\n aria-label={this.label}\n style={dockedMaxBlockStyle}\n ref={(el) => (this.panelEl = el as HTMLElement)}\n tabindex=\"-1\"\n onMouseDown={this.onPanelMouseDown}\n onKeyDown={this.onPanelKeyDown}\n >\n {!docked && this.renderHeader()}\n {this.renderBody()}\n {this.renderActions()}\n </div>\n );\n }\n\n private renderModal() {\n return (\n <div\n class={{\n 'md-date-picker__modal': true,\n 'md-date-picker__modal--closing': this.panelClosing,\n }}\n part=\"modal\"\n >\n <div\n class=\"md-date-picker__scrim\"\n part=\"scrim\"\n onClick={() => this.scrimDismissible && this.requestDismiss()}\n />\n {this.renderPanel(false)}\n </div>\n );\n }\n\n render() {\n const panelVisible = this.open || this.panelClosing;\n const panelOpen = this.open && !this.panelClosing;\n return (\n <Host\n class={{\n 'md-date-picker': true,\n [`md-date-picker--${this.variant}`]: true,\n 'md-date-picker--open': panelOpen,\n 'md-date-picker--panel-closing': this.panelClosing,\n 'md-date-picker--disabled': this.disabled,\n 'md-date-picker--error': this.error,\n }}\n aria-disabled={this.disabled ? 'true' : null}\n >\n {this.isDocked ? (\n <div\n class=\"md-date-picker__docked-anchor\"\n ref={(el) => (this.dockedAnchorEl = el as HTMLElement)}\n >\n {this.renderTextFieldTrigger()}\n {panelVisible && (\n <div\n class={{\n 'md-date-picker__docked-popup': true,\n 'md-date-picker__docked-popup--above':\n this.dockedPanelPlacement === 'above',\n }}\n >\n {this.renderPanel(true)}\n </div>\n )}\n </div>\n ) : (\n this.hasField && this.renderTextFieldTrigger()\n )}\n {panelVisible && !this.isDocked && this.renderModal()}\n </Host>\n );\n }\n\n /** Keep the submitted value and validity in step with the selected date. */\n @Watch('value')\n @Watch('required')\n @Watch('valueMissingLabel')\n syncFormValue() {\n setFormValue(this.internals, this.value || null);\n setValidityState(this.internals, {\n missing: this.required && !this.value,\n missingMessage: this.valueMissingLabel,\n customMessage: this.customValidityMessage,\n });\n this.emitValidityChange();\n }\n\n /** Restore the initial date when the owning form is reset. */\n formResetCallback() {\n this.value = this.defaultValue;\n }\n\n /** Current validity: boolean, message and flags. Mirrors md-text-field. */\n @Method()\n async getValidity(): Promise<{\n valid: boolean;\n validationMessage: string;\n flags: Record<string, boolean>;\n }> {\n return getValidityOf(this.internals);\n }\n\n /**\n * Fires when this control's validity CHANGES — never on every keystroke, and\n * never for a re-publish that lands on the same state.\n *\n * `composed: false` is deliberate. Composites like md-select embed an\n * md-text-field, and a composed event escapes that inner shadow root, so a\n * listener on md-select would receive the inner field's event as well as the\n * host's — two events, different payloads, for one logical control. Keeping\n * it uncomposed means each component reports only for itself, while\n * `bubbles: true` still lets a <form> or app root hear every control.\n */\n @Event({ bubbles: true, composed: false }) mdValidityChange: EventEmitter<{\n valid: boolean;\n validationMessage: string;\n flags: Record<string, boolean>;\n }>;\n\n /** Last emitted validity, so a re-publish that changes nothing stays silent. */\n private lastValidityKey: string | null = null;\n\n /**\n * Emit mdValidityChange if validity actually moved.\n *\n * The FIRST call only primes the baseline. Initial state is not a change, and\n * emitting on mount would fire once per control on every page load — noise a\n * consumer would have to filter out, and misleading for anything logging\n * \"field became invalid\".\n */\n private emitValidityChange() {\n const v = getValidityOf(this.internals);\n const key = `${v.valid}|${v.validationMessage}`;\n if (this.lastValidityKey === key) return;\n const primed = this.lastValidityKey !== null;\n this.lastValidityKey = key;\n if (primed) this.mdValidityChange.emit(v);\n }\n\n /** Constraint-validation API, matching md-text-field and the native contract. */\n @Method()\n async checkValidity(): Promise<boolean> {\n return checkValidityOf(this.internals);\n }\n\n @Method()\n async reportValidity(): Promise<boolean> {\n return reportValidityOf(this.internals);\n }\n\n @Method()\n async setCustomValidity(message: string) {\n this.customValidityMessage = message;\n this.syncFormValue();\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["pad2","n","String","toIsoDate","d","getFullYear","getMonth","getDate","buildValidatedDate","year","month","day","Date","escapeRegExp","value","replace","resolveDateSeparator","locale","explicit","length","parts","Intl","DateTimeFormat","formatToParts","literal","find","p","type","formatDisplayDate","separator","sep","undefined","map","join","dateFormatPattern","prefersDayFirst","dayIdx","findIndex","monthIdx","parseCompactDateInput","digits","a","Number","parseInt","slice","b","candidates","pattern","valid","c","date","filter","mddDay","mddMonth","mdd","ddmDay","ddm","mmdMonth","mmd","preferred","pick","parseFlexibleDateInput","trimmed","trim","iso","parseIsoDate","test","split","RegExp","Boolean","nums","some","isNaN","m","exec","y","mo","daysInMonth","getFirstDayOfWeek","IntlAny","loc","Locale","getWeekInfo","w","firstDay","weekInfo","isoLte","isSameDay","addDays","addMonths","target","lastDay","Math","min","clampDate","minIso","maxIso","isOutOfRange","buildMonthMatrix","firstDayOfWeek","first","firstWeekday","getDay","lead","start","cells","i","push","outOfMonth","weekdayNames","format","fmt","weekday","names","idx","mdDatePickerCss","dpUid","DOCKED_SELECTION_BLOOM_IN_MS","DOCKED_SELECTION_BLOOM_OUT_MS","PANEL_BLOOM_OUT_MS","DOCKED_CALENDAR_BLOOM_IN_MS","DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET","DOCKED_NAV_MENU_TOOLTIP_OFFSET","MdDatePicker","constructor","hostRef","this","valueMissingLabel","reserveSupportingSpace","customValidityMessage","defaultValue","variant","label","placeholder","max","open","disabled","required","clearable","clearLabel","error","errorText","supportingText","dateSeparator","fieldVariant","headline","cancelLabel","okLabel","selectDateLabel","enterDatesLabel","invalidDateLabel","previousMonthLabel","nextMonthLabel","previousYearLabel","nextYearLabel","chooseMonthLabel","chooseYearLabel","chooseMonthYearLabel","chooseMonthAndYearLabel","toggleCalendarLabel","toggleTextLabel","openCalendarLabel","closeCalendarLabel","calendarIcon","yearGridLabel","scrimDismissible","outsideClickDismissible","commitOnSelect","name","density","focused","inputDraft","viewYear","viewMonth","viewMode","inputMode","focusedDate","pendingDate","hasSlottedHeader","hasSlottedActions","hasSlottedLeading","hasSlottedCalendarIcon","monthMenuOpen","yearMenuOpen","selectionMenuClosing","dockedCalendarBloom","gridSlideDirection","yearViewClosing","modalCalendarBloom","panelClosing","dockedPanelAlign","dockedPanelPlacement","dockedPanelMaxBlockSize","uid","entryInputShouldFocus","restoreFocusEl","gridShouldFocus","menuShouldFocus","menuRestoreFocus","yearGridShouldScroll","yearListMinYear","yearListMaxYear","panelPointerEngaged","closingFromDismiss","dockedPositionCleanup","dockedPositionRafId","dockedPositionRafAttempts","lastSelectedEmitValue","onFieldInput","e","v","mdInput","emit","onFieldCommit","raw","emitChange","syncTextFieldDisplay","parsed","isDisabledDate","formatField","syncViewToValue","onGridSlideAnimationEnd","currentTarget","animationName","includes","toggleMonthMenu","toggleMonthMenuAsync","toggleYearMenu","toggleYearMenuAsync","onMonthMenuClose","closeDockedSelectionMenu","bloomCalendar","restoreFocus","onYearMenuClose","toggleYearView","closeYearViewAnimated","openYearView","toggleInputMode","commitDialogInput","emitModeChange","onPanelMouseDown","button","panelEl","shouldPanelClaimFocus","handleDayKeyDown","defaultPrevented","handleCalendarKeyDown","isDockedMenuToggleKey","key","toLowerCase","preventDefault","stopPropagation","stopImmediatePropagation","next","resolveNavigationKey","shiftKey","isDayGridKeyTarget","selectDay","commit","prevViewYear","prevViewMonth","navKey","setGridSlideDirection","onPanelKeyDown","isDocked","closeMenus","requestDismiss","canHandleCalendarKeyDown","resolveCalendarKeyTarget","trapTab","textFieldKeyDown","syncInputDraftFromField","entryTextFieldKeyDown","lastValidityKey","hasField","triggerExpanded","connectedCallback","componentWillLoad","syncFormValue","el","querySelector","seedFieldDraftFromValue","seedPending","lockScroll","componentDidLoad","shadow","shadowRoot","watch","set","slot","update","assignedElements","addEventListener","h","disconnectedCallback","unlockScroll","unbindDockedPositionListeners","getDockedViewportMargin","resetDockedPanelPosition","cancelAnimationFrame","resolveDockedPanelBlockSize","panel","prev","style","getPropertyValue","prevPriority","getPropertyPriority","setProperty","natural","offsetHeight","getBoundingClientRect","height","removeProperty","isRtl","window","getComputedStyle","direction","projectedHorizontalRect","anchorRect","panelW","align","rtl","left","right","positionDockedPanel","anchor","dockedAnchorEl","offsetWidth","width","measuredH","requestAnimationFrame","DOCKED_POSITION_RAF_MAX","panelH","margin","vw","innerWidth","vh","innerHeight","gap","placement","maxBlockSize","startRect","endRect","activeRect","startAgain","belowBottom","bottom","aboveTop","top","availableBelow","floor","availableAbove","changed","bindDockedPositionListeners","onReposition","passive","capture","removeEventListener","onBoundsChange","onDateSeparatorChange","onOpenChange","now","handleOpen","dismissPanel","handleClose","show","close","clear","focusInput","tfInput","focus","triggerEl","resolvedFirstDay","formatHeadline","formatMonthYear","formatFullDate","dateFormatHint","document","activeElement","clearYearListRange","clearModalCalendarBloom","mdOpen","clearDockedCalendarBloom","mdClose","restore","closeDockedMenusAnimated","prefersReducedMotion","delay","panelBloomOutMs","body","isDateDisabled","isDisabledYear","minDate","maxDate","mdChange","emitSelected","mdSelected","Promise","resolve","then","emitViewChange","source","mdViewChange","emitMenuOpen","mdMenuOpen","emitMenuSelect","mdMenuSelect","mode","mdModeChange","monthLabel","cell","cancel","mdCancel","asEventElement","input","closest","tf","syncEntryTextFieldDisplay","entryTextFieldEl","selected","delta","goToMonth","fromUser","ref","goToYear","captureYearListRange","navActionLabel","scope","side","navShortcutKey","navTooltipText","menuShortcutKey","kind","menuTooltipText","fullMonth","current","getYearListBounds","minYear","maxYear","keep","restoreMenuFocus","monthMenuButtonEl","yearMenuButtonEl","options","isOpen","selectionBloomOutMs","beginDockedCalendarBloom","openDockedMonthMenu","openDockedYearMenu","isDockedMonthMenuExpanded","isDockedYearMenuExpanded","dockedSelectionMenuToShow","dockedMenuTrailingIcon","expanded","renderDockedMenuTrailingCaret","class","part","run","getDockedSelectionMenuScrollEl","menuHost","menuShadow","getDockedSelectionMenuTarget","menu","scrollDockedSelectionMenuIntoView","scrollEl","scrollRect","itemRect","itemCenter","scrollCenter","scrollTop","scrollIntoView","block","inline","afterDockedSelectionMenuPaint","selectionBloomInMs","calculateModalYearGridScrollTop","columns","blockSize","paddingBlockStart","paddingBlockEnd","viewportBlockSize","yearCount","index","row","rowCount","ceil","rowStride","contentBlockSize","itemBlockStart","maxScroll","getModalYearGridScrollEl","wrap","scrollModalYearGridIntoView","afterModalYearGridPaint","matchMedia","matches","calendarBloomInMs","ms","setTimeout","beginModalCalendarBloom","waitForSelectionMenuClose","pickDockedSelection","apply","item","host","HTMLElement","waitForHostRipple","pickMonth","pickYear","selectYear","code","altKey","ctrlKey","metaKey","isEditableKeyTarget","editable","isInsideSelectionMenu","findInPickerTree","selector","root","getRootNode","ShadowRoot","parentElement","letter","isCalendarNavigationKey","menuToggle","t","isTriggerFieldTarget","getEventPathNodes","composedPath","nodes","node","parentNode","isNodeInPicker","isEventInPicker","isNodeInPanel","active","tryCommitTriggerFieldOnEnter","tryCommitDialogInputOnEnter","routePickerKeyDown","fromHostCapture","handleDocumentKeyDown","handleDocumentPointerDown","handleHostKeyDown","swallowNestedMdOpen","swallowNestedMdClose","focusFocusedDay","btn","focusables","Array","from","querySelectorAll","offsetParent","last","componentDidRender","renderTextFieldTrigger","display","supporting","appearFocused","onFocusin","onFocusout","onKeyDown","onMdInput","detail","onMdChange","icon","onClick","onMdClick","renderModalNavChevron","onStep","text","showDelay","position","offset","size","modalMonthYearTooltipText","renderNav","secondary","navYear","navMonth","yearExpanded","monthYearButton","toggle","trailingIcon","suppressExpandIconFlip","mirrorIcon","renderDockedNavChevron","visible","renderDockedNav","monthShort","monthExpanded","renderDockedSelectionDivider","role","renderDockedMonthMenu","closing","months","_","exportparts","quick","persistent","autoFocus","onMdClose","sel","renderDockedYearMenu","years","renderCalendar","primary","contentBloom","fullNames","today","gridLabel","onAnimationEnd","_unused","week","renderDay","isToday","isFocusTarget","unselected","shape","roleOverride","groupTabindex","renderYearGrid","r","renderDialogInput","renderHeadline","renderHeader","modeToggleLabel","hasActionRow","renderActions","renderBody","showYearGrid","showModalCalendar","selectionVisible","activeSelectionMenu","showYearMenu","showMonthMenu","renderPanel","docked","dockedMaxBlockStyle","tabindex","onMouseDown","renderModal","render","panelVisible","panelOpen","Host","setFormValue","internals","setValidityState","missing","missingMessage","customMessage","emitValidityChange","formResetCallback","getValidity","getValidityOf","validationMessage","primed","mdValidityChange","checkValidity","checkValidityOf","reportValidity","reportValidityOf","setCustomValidity","message"],"sources":["src/components/md-date-picker/date-utils.ts","src/components/md-date-picker/md-date-picker.css?tag=md-date-picker&encapsulation=shadow","src/components/md-date-picker/md-date-picker.tsx"],"sourcesContent":["/**\n * Pure date helpers used by md-date-picker.\n *\n * Co-located with the component but exported separately so we can\n * unit-test them without booting a Stencil page, and so the component\n * file stays a single-default-export module (required by Stencil's\n * bundling rules).\n */\n\n/** Pad a number to two digits (locale-independent). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\n/** ISO YYYY-MM-DD (local-time, NOT toISOString which is UTC). */\nexport function toIsoDate(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/** Build a local-midnight Date when (year, month, day) is a real calendar day. */\nfunction buildValidatedDate(\n year: number,\n month: number,\n day: number,\n): Date | null {\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n const d = new Date(year, month - 1, day);\n if (\n d.getFullYear() !== year ||\n d.getMonth() !== month - 1 ||\n d.getDate() !== day\n ) {\n return null;\n }\n return d;\n}\n\n/** Escape a separator for use inside a RegExp character class or alternation. */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Resolve the separator between day, month, and year segments.\n * When `explicit` is non-empty it wins; otherwise the locale's\n * `Intl.DateTimeFormat` literal is used (falls back to `/`).\n */\nexport function resolveDateSeparator(\n locale?: string,\n explicit?: string,\n): string {\n if (explicit && explicit.length > 0) return explicit;\n try {\n const parts = new Intl.DateTimeFormat(locale || 'en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(new Date(2000, 11, 31));\n const literal = parts.find((p) => p.type === 'literal');\n return literal?.value ?? '/';\n } catch {\n return '/';\n }\n}\n\n/**\n * Format a date for text-field display using locale field order and an\n * optional separator override (`date-separator` on the component).\n */\nexport function formatDisplayDate(\n d: Date,\n locale?: string,\n separator?: string,\n): string {\n const sep = resolveDateSeparator(locale, separator);\n const parts = new Intl.DateTimeFormat(locale || undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(d);\n return parts\n .map((p) => {\n switch (p.type) {\n case 'day':\n return pad2(d.getDate());\n case 'month':\n return pad2(d.getMonth() + 1);\n case 'year':\n return String(d.getFullYear());\n case 'literal':\n return sep;\n default:\n return '';\n }\n })\n .join('');\n}\n\n/**\n * Locale-aware date format hint (e.g. `MM/DD/YYYY` or `DD.MM.YYYY`) with an\n * optional separator override.\n */\nexport function dateFormatPattern(locale?: string, separator?: string): string {\n const sep = resolveDateSeparator(locale, separator);\n const parts = new Intl.DateTimeFormat(locale || 'en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(new Date(2000, 11, 31));\n return parts\n .map((p) => {\n switch (p.type) {\n case 'day':\n return 'DD';\n case 'month':\n return 'MM';\n case 'year':\n return 'YYYY';\n case 'literal':\n return sep;\n default:\n return '';\n }\n })\n .join('');\n}\n\n/** True when the locale formats day before month (e.g. en-GB). */\nfunction prefersDayFirst(locale?: string): boolean {\n try {\n const parts = new Intl.DateTimeFormat(locale || 'en-US').formatToParts(\n new Date(2025, 3, 3),\n );\n const dayIdx = parts.findIndex((p) => p.type === 'day');\n const monthIdx = parts.findIndex((p) => p.type === 'month');\n return dayIdx >= 0 && monthIdx >= 0 && dayIdx < monthIdx;\n } catch {\n return false;\n }\n}\n\n/**\n * Parse compact digit-only strings such as `06122025` (8) or `6122025` (7).\n * Year is always the trailing four digits.\n */\nfunction parseCompactDateInput(digits: string, locale?: string): Date | null {\n if (digits.length === 8) {\n const a = Number.parseInt(digits.slice(0, 2), 10);\n const b = Number.parseInt(digits.slice(2, 4), 10);\n const year = Number.parseInt(digits.slice(4, 8), 10);\n let month: number;\n let day: number;\n\n if (a > 12 && b <= 12) {\n day = a;\n month = b;\n } else if (b > 12 && a <= 12) {\n month = a;\n day = b;\n } else if (a > 12 && b > 12) {\n return null;\n } else if (prefersDayFirst(locale)) {\n day = a;\n month = b;\n } else {\n month = a;\n day = b;\n }\n return buildValidatedDate(year, month, day);\n }\n\n if (digits.length === 7) {\n const year = Number.parseInt(digits.slice(3, 7), 10);\n const candidates: Array<{ month: number; day: number; pattern: string }> = [\n {\n month: Number.parseInt(digits.slice(0, 1), 10),\n day: Number.parseInt(digits.slice(1, 3), 10),\n pattern: 'MDD',\n },\n {\n day: Number.parseInt(digits.slice(0, 2), 10),\n month: Number.parseInt(digits.slice(2, 3), 10),\n pattern: 'DDM',\n },\n {\n month: Number.parseInt(digits.slice(0, 2), 10),\n day: Number.parseInt(digits.slice(2, 3), 10),\n pattern: 'MMD',\n },\n ];\n\n const valid = candidates\n .map((c) => ({\n ...c,\n date: buildValidatedDate(year, c.month, c.day),\n }))\n .filter((c) => c.date !== null);\n\n if (valid.length === 0) return null;\n if (valid.length === 1) return valid[0].date;\n\n const mddDay = Number.parseInt(digits.slice(1, 3), 10);\n const mddMonth = Number.parseInt(digits.slice(0, 1), 10);\n if (mddMonth >= 1 && mddMonth <= 9 && mddDay >= 10) {\n const mdd = valid.find((c) => c.pattern === 'MDD');\n if (mdd) return mdd.date;\n }\n\n const ddmDay = Number.parseInt(digits.slice(0, 2), 10);\n if (ddmDay > 12) {\n const ddm = valid.find((c) => c.pattern === 'DDM');\n if (ddm) return ddm.date;\n }\n\n const mmdMonth = Number.parseInt(digits.slice(0, 2), 10);\n if (mmdMonth > 12) {\n const mmd = valid.find((c) => c.pattern === 'MMD');\n if (mmd) return mmd.date;\n }\n\n const preferred = prefersDayFirst(locale) ? 'DDM' : 'MMD';\n const pick = valid.find((c) => c.pattern === preferred) ?? valid[0];\n return pick.date;\n }\n\n return null;\n}\n\n/**\n * Parse a user-typed date string into a local-midnight Date, or null.\n *\n * Accepts flexible separators (`/`, `-`, `.`, spaces) when no `separator` is\n * given, or only the configured `separator` when set. Optional leading zeros\n * on month/day, compact digit strings (`06122025`, `6122025`), and ISO\n * `YYYY-MM-DD` are always accepted. When the year has four digits, order is\n * inferred: `YYYY-M-D`, `M-D-YYYY`, or `D-M-YYYY` (when the first segment is\n * > 12 and the second is ≤ 12). Ambiguous compact/all-numeric orders fall back\n * to the locale hint.\n */\nexport function parseFlexibleDateInput(\n value: string,\n locale?: string,\n separator?: string,\n): Date | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n const iso = parseIsoDate(trimmed);\n if (iso) return iso;\n\n if (/^\\d+$/.test(trimmed)) {\n return parseCompactDateInput(trimmed, locale);\n }\n\n let parts: string[];\n if (separator && separator.length > 0) {\n parts = trimmed.split(new RegExp(escapeRegExp(separator))).filter(Boolean);\n } else {\n parts = trimmed.split(/[/\\-.]|\\s+/).filter(Boolean);\n }\n if (parts.length !== 3) return null;\n\n const nums = parts.map((p) => Number.parseInt(p, 10));\n if (nums.some((n) => Number.isNaN(n))) return null;\n\n let year: number;\n let month: number;\n let day: number;\n\n if (parts[0].length === 4 || nums[0] > 31) {\n [year, month, day] = nums;\n } else if (parts[2].length === 4 || nums[2] > 31) {\n if (nums[0] > 12 && nums[1] <= 12) {\n [day, month, year] = nums;\n } else if (nums[1] > 12 && nums[0] <= 12) {\n [month, day, year] = nums;\n } else if (prefersDayFirst(locale)) {\n [day, month, year] = nums;\n } else {\n [month, day, year] = nums;\n }\n } else {\n return null;\n }\n\n return buildValidatedDate(year, month, day);\n}\n\n/** Parse YYYY-MM-DD into a local-midnight Date, or null. */\nexport function parseIsoDate(value: string): Date | null {\n if (!value) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value.trim());\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const day = Number(m[3]);\n const d = new Date(y, mo, day);\n if (\n d.getFullYear() !== y ||\n d.getMonth() !== mo ||\n d.getDate() !== day\n ) {\n return null;\n }\n return d;\n}\n\n/** Number of days in the (year, month) where month is 0-indexed. */\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Resolve the first day-of-week index for the given BCP-47 locale.\n * Returns 0 (Sunday) when the runtime can't tell us — that matches\n * the en-US default. */\nexport function getFirstDayOfWeek(locale: string): number {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const IntlAny: any = Intl;\n const loc = new IntlAny.Locale(locale || 'en-US');\n if (typeof loc.getWeekInfo === 'function') {\n const w = loc.getWeekInfo();\n if (w && typeof w.firstDay === 'number') {\n return w.firstDay === 7 ? 0 : w.firstDay;\n }\n }\n if (loc.weekInfo && typeof loc.weekInfo.firstDay === 'number') {\n return loc.weekInfo.firstDay === 7 ? 0 : loc.weekInfo.firstDay;\n }\n } catch {\n /* ignore */\n }\n return 0;\n}\n\n/** YYYY-MM-DD comparison without timezone surprises. */\nexport function isoLte(a: string, b: string): boolean {\n return a <= b;\n}\n\n/** True when `a` is the same calendar day as `b`. */\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/** Return a new Date `n` days after `d` (local time, no mutation). */\nexport function addDays(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n}\n\n/** Return a new Date `n` months after `d`, clamping the day-of-month so\n * e.g. Jan 31 + 1 month → Feb 28/29 instead of spilling into March. */\nexport function addMonths(d: Date, n: number): Date {\n const target = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth());\n return new Date(\n target.getFullYear(),\n target.getMonth(),\n Math.min(d.getDate(), lastDay),\n );\n}\n\n/** Clamp a date into the inclusive [minIso, maxIso] window. Returns the\n * same date when already inside (or when a bound is absent). */\nexport function clampDate(\n d: Date,\n minIso: string,\n maxIso: string,\n): Date {\n const iso = toIsoDate(d);\n if (minIso && !isoLte(minIso, iso)) {\n return parseIsoDate(minIso) ?? d;\n }\n if (maxIso && !isoLte(iso, maxIso)) {\n return parseIsoDate(maxIso) ?? d;\n }\n return d;\n}\n\n/** True when `d` lies outside the inclusive [minIso, maxIso] window. */\nexport function isOutOfRange(d: Date, minIso: string, maxIso: string): boolean {\n const iso = toIsoDate(d);\n if (minIso && !isoLte(minIso, iso)) return true;\n if (maxIso && !isoLte(iso, maxIso)) return true;\n return false;\n}\n\n/** A single rendered calendar cell. */\nexport interface DayCell {\n date: Date;\n /** Belongs to a month other than the one being displayed. */\n outOfMonth: boolean;\n}\n\n/**\n * Build a fixed 6-row (42-cell) calendar matrix for `(year, month)`,\n * starting on `firstDayOfWeek` (0 = Sunday … 6 = Saturday). Leading and\n * trailing cells are filled with the adjacent months' days, flagged\n * `outOfMonth` so the UI can mute them.\n */\nexport function buildMonthMatrix(\n year: number,\n month: number,\n firstDayOfWeek: number,\n): DayCell[] {\n const first = new Date(year, month, 1);\n const firstWeekday = first.getDay();\n const lead = (firstWeekday - firstDayOfWeek + 7) % 7;\n const start = addDays(first, -lead);\n const cells: DayCell[] = [];\n for (let i = 0; i < 42; i++) {\n const date = addDays(start, i);\n cells.push({ date, outOfMonth: date.getMonth() !== month });\n }\n return cells;\n}\n\n/** Ordered short weekday names for a locale, rotated to `firstDayOfWeek`. */\nexport function weekdayNames(\n locale: string,\n firstDayOfWeek: number,\n format: 'narrow' | 'short' | 'long' = 'narrow',\n): string[] {\n const fmt = new Intl.DateTimeFormat(locale || undefined, { weekday: format });\n // 2024-01-07 is a Sunday — a stable anchor for indexing weekdays 0..6.\n const names: string[] = [];\n for (let i = 0; i < 7; i++) {\n const idx = (firstDayOfWeek + i) % 7;\n names.push(fmt.format(new Date(2024, 0, 7 + idx)));\n }\n return names;\n}\n","/* ==========================================================\n md-date-picker — Material Design 3 Date Picker\n Spec: https://m3.material.io/components/date-pickers/specs\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-date-picker-container-color Dialog / popup body background\n --md-date-picker-header-color Modal header background\n --md-date-picker-container-shape Dialog / popup corner radius\n --md-date-picker-field-color Text-field resting outline color\n --md-date-picker-field-focus-color Text-field focused outline / label color\n --md-date-picker-field-text-color Text-field input text color\n --md-date-picker-field-container-color Filled-field container background\n --md-date-picker-field-container-shape Text-field corner radius (filled + outlined)\n --md-date-picker-field-filled-pill Filled field: 1 for capsule/pill (all corners)\n --md-date-picker-field-supporting-color Supporting text below the field\n --md-date-picker-label-color Floating label color\n --md-date-picker-headline-color Modal headline (selected date) color\n --md-date-picker-supporting-color Header supporting-text color\n --md-date-picker-weekday-color Weekday column-header color\n --md-date-picker-day-color Day cell text color\n --md-date-picker-day-selected-color Selected day text color\n --md-date-picker-day-selected-bg Selected day container color\n --md-date-picker-day-selected-shape Selected day corner radius (overrides morph)\n --md-date-picker-day-today-shape Today ring corner radius\n --md-date-picker-today-outline-color Today's outline ring color\n --md-date-picker-day-outline-color Deprecated — unselected days are plain text\n --md-date-picker-action-color Cancel / OK action label color\n --md-date-picker-menu-color Docked month/year menu surface\n --md-date-picker-selection-bloom-duration Docked month/year menu bloom-in duration\n --md-date-picker-selection-bloom-easing Docked month/year menu bloom-in easing\n --md-date-picker-selection-bloom-out-duration Docked menu bloom-out on pick (default short4)\n --md-date-picker-calendar-bloom-duration Docked day grid bloom-in after pick (default medium2)\n --md-date-picker-grid-slide-duration Day grid month/year slide duration\n --md-date-picker-panel-bloom-out-duration Panel bloom-out on dismiss (default short4)\n --md-date-picker-scrim-color Modal scrim color\n --md-date-picker-icon-color Trailing / nav icon color\n --md-date-picker-panel-width Modal / docked popup panel inline size\n --md-date-picker-panel-max-block-size Modal / docked popup panel max block size\n --md-date-picker-docked-panel-width Docked popup panel inline size (overrides panel-width)\n --md-date-picker-year-inline-size Year grid cell inline size (modal)\n --md-date-picker-year-block-size Year grid cell block size (modal)\n --md-date-picker-year-grid-gap Year grid row/column gap (modal)\n --md-date-picker-year-grid-padding-inline Year grid inline padding (modal)\n --md-date-picker-year-grid-viewport-block-size Year grid scroll viewport block size (modal)\n\n CSS PARTS:\n field Text-field container (trigger)\n leading-icon Slotted leading icon wrapper\n label Floating field label\n input Field text input\n calendar-button Trailing calendar toggle button\n supporting-text Helper / error text below the field\n modal Modal wrapper (scrim + panel)\n scrim Modal scrim overlay\n panel Dialog / docked popup surface\n header Modal header region\n supporting Header supporting text\n headline Large selected-date headline\n mode-toggle Calendar / text-input switch button\n body Calendar / year / input body region\n nav Month label + prev/next nav row (also docked nav row)\n month-toggle Month-year menu button (opens year grid; modal; same as menu-button)\n prev-button Previous-month md-icon-button (modal)\n next-button Next-month md-icon-button (modal)\n month-menu-button Docked month dropdown menu button (\"Aug ▾\")\n year-menu-button Docked year dropdown menu button (\"2025 ▾\")\n prev-month-button Docked previous-month chevron icon button\n next-month-button Docked next-month chevron icon button\n prev-year-button Docked previous-year chevron icon button\n next-year-button Docked next-year chevron icon button\n selection-divider Divider between docked nav and month/year menu\n month-menu Docked inline baseline md-menu (month selection)\n year-menu Docked inline baseline md-menu (year selection)\n month-option A month option in the docked month menu\n month-option-selected The selected month option\n year-option A year option in the docked year menu\n year-option-selected The selected year option\n calendar Calendar grid wrapper\n weekdays Weekday header row\n weekday A single weekday column header\n grid Day-cell grid\n day A day cell button\n day-unselected Unselected in-month day cell (plain text)\n day-selected Selected day cell (filled circle)\n day-today Today's day cell (outlined circle)\n day-disabled Disabled / out-of-range day cell\n day-outside Adjacent-month day cell (muted)\n year-grid Year-selection grid (modal)\n year-grid-wrap Animated wrapper for modal year grid\n year-grid-scroll md-scroll-shadow wrapper for modal year grid\n year-grid-viewport Modal year grid scroll viewport (re-exported)\n year-grid-shadow-block-start Top scroll shadow (re-exported)\n year-grid-shadow-block-end Bottom scroll shadow (re-exported)\n year A year cell button (modal)\n year-unselected Unselected year cell (plain text)\n year-selected Selected year cell (filled pill)\n year-disabled Disabled / out-of-range year cell\n entry In-dialog text-entry region\n entry-input In-dialog outlined md-text-field (single modal input)\n actions Cancel / OK action row\n cancel-button Cancel action\n ok-button Confirm action\n\n SLOTS:\n leading-icon Custom leading icon for the field\n calendar-icon Custom trailing calendar toggle icon (replaces calendar-icon prop)\n header Replaces the entire modal header\n actions Replaces the Cancel / OK action row\n ========================================================== */\n\n:host {\n /* Public → internal token mapping */\n --_selection-bloom-duration: var(\n --md-date-picker-selection-bloom-duration,\n var(--md-sys-motion-duration-long1, 450ms)\n );\n --_selection-bloom-easing: var(\n --md-date-picker-selection-bloom-easing,\n var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1))\n );\n --_selection-bloom-out-duration: var(\n --md-date-picker-selection-bloom-out-duration,\n var(--md-sys-motion-duration-short4, 200ms)\n );\n --_calendar-bloom-duration: var(\n --md-date-picker-calendar-bloom-duration,\n var(--md-sys-motion-duration-medium2, 300ms)\n );\n --_grid-slide-duration: var(\n --md-date-picker-grid-slide-duration,\n var(--md-sys-motion-duration-medium2, 300ms)\n );\n --_grid-slide-easing: var(\n --md-sys-motion-easing-emphasized,\n cubic-bezier(0.2, 0, 0, 1)\n );\n --_panel-bloom-out-duration: var(\n --md-date-picker-panel-bloom-out-duration,\n var(--md-sys-motion-duration-short4, 200ms)\n );\n --_selection-bloom-out-easing: var(\n --md-sys-motion-easing-emphasized-accelerate,\n cubic-bezier(0.3, 0, 0.8, 0.15)\n );\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface));\n --_header-color: var(--md-date-picker-header-color, var(--md-sys-color-surface-container-high));\n --_container-shape: var(--md-date-picker-container-shape, var(--md-sys-shape-corner-extra-large, 28px));\n --_field-color: var(--md-date-picker-field-color, var(--md-sys-color-outline));\n --_field-focus-color: var(--md-date-picker-field-focus-color, var(--md-sys-color-primary));\n --_field-text-color: var(--md-date-picker-field-text-color, var(--md-sys-color-on-surface));\n --_field-container-color: var(\n --md-date-picker-field-container-color,\n var(--md-sys-color-surface-container-highest, #e6e0e9)\n );\n --_field-container-shape: var(\n --md-date-picker-field-container-shape,\n var(--md-sys-shape-corner-extra-small, 4px)\n );\n --_field-supporting-color: var(\n --md-date-picker-field-supporting-color,\n var(--md-sys-color-on-surface-variant)\n );\n --_label-color: var(--md-date-picker-label-color, var(--md-sys-color-on-surface-variant));\n --_headline-color: var(--md-date-picker-headline-color, var(--md-sys-color-on-surface));\n --_supporting-color: var(--md-date-picker-supporting-color, var(--md-sys-color-on-surface-variant));\n --_weekday-color: var(--md-date-picker-weekday-color, var(--md-sys-color-on-surface));\n --_weekday-size: 24px;\n --_day-color: var(--md-date-picker-day-color, var(--md-sys-color-on-surface));\n /* Adjacent-month days stay selectable, so their label must meet WCAG AA\n (4.5:1) contrast — a solid de-emphasized token, not opacity-faded text. */\n --_day-outside-color: var(--md-date-picker-day-outside-color, var(--md-sys-color-on-surface-variant, #49454f));\n --_day-selected-color: var(--md-date-picker-day-selected-color, var(--md-sys-color-on-primary));\n --_day-selected-bg: var(--md-date-picker-day-selected-bg, var(--md-sys-color-primary));\n --_today-outline-color: var(--md-date-picker-today-outline-color, var(--md-sys-color-primary));\n --_action-color: var(--md-date-picker-action-color, var(--md-sys-color-primary));\n --_menu-color: var(--md-date-picker-menu-color, var(--md-sys-color-surface-container-high));\n --_scrim-color: var(--md-date-picker-scrim-color, var(--md-sys-color-scrim, #000));\n --_icon-color: var(--md-date-picker-icon-color, var(--md-sys-color-on-surface-variant));\n /* Fixed panel width (360px) so the nav row (month/year selectors + chevrons)\n and header always fit. The calendar cells + grid gaps still densify inside\n it; only the panel HEIGHT tracks content (block-size:auto below). */\n /* Width = day grid + 2×12px gutter, so the grid FILLS the body (no extra\n centering gap) and its edges line up with the nav and the Cancel/OK footer.\n Chosen wider than the bare grid so the 1fr day columns spread the day\n circles across the row (fill the space) instead of packing them tight;\n shrinks ~20px/rung with density so the spread stays proportional, floored\n at 288px so the day circles never overlap. */\n --_panel-width: var(--md-date-picker-panel-width, max(288px, calc(380px + var(--md-sys-density-scale, 0) * 20px)));\n --_panel-max-block-size: var(--md-date-picker-panel-max-block-size, 524px);\n --_error-color: var(--md-sys-color-error);\n /* 1px per rung off 24dp (18px floor) — the library-wide icon taper. */\n --_icon-size: var(--md-date-picker-icon-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px)));\n /* Day cell follows global density (40px at 0 → 28px at -4, 3px/rung). The grid\n columns/rows, day buttons and panel width all derive from this. */\n --_day-size: max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px));\n /* Year pills, gap and scroll viewport follow global density like the day grid. */\n --_year-inline-size: var(--md-date-picker-year-inline-size, max(48px, calc(72px + var(--md-sys-density-scale, 0) * 6px)));\n --_year-block-size: var(--md-date-picker-year-block-size, max(24px, calc(36px + var(--md-sys-density-scale, 0) * 3px)));\n /* 2× day grid gap — year pills are wider and need more breathing room in the 360px panel. */\n --_year-grid-gap: var(--md-date-picker-year-grid-gap, max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px)));\n --_year-grid-padding-inline: var(--md-date-picker-year-grid-padding-inline, 30px);\n /* 8×36px year rows — scroll viewport below modal nav; shrinks with density. */\n --_year-grid-viewport-block-size: var(--md-date-picker-year-grid-viewport-block-size, max(180px, calc(288px + var(--md-sys-density-scale, 0) * 24px)));\n --_grid-gap: max(2px, calc(6px + var(--md-sys-density-scale, 0) * 1px));\n --_caret-fade-duration: var(--md-sys-motion-duration-short3, 150ms);\n --_caret-fade-easing: var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n\n display: inline-block;\n inline-size: 100%;\n max-inline-size: 360px;\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n color: var(--_field-text-color);\n position: relative;\n}\n\n:host(.md-date-picker--docked) {\n /* Do not stretch in flex parents — popup anchors to field bottom, not host block-size. */\n align-self: flex-start;\n /* Docked variant is gated by its 6-control nav (< month > < year >), which is\n wider than the shrinking day grid. The nav densifies ~10px/rung, so the\n floor tracks it (360px at density 0 → ~320px at -4) rather than following\n the modal panel all the way down (would clip the nav). Modal has only 3 nav\n controls, so it shrinks freely via --_panel-width. */\n --_docked-panel-width: var(--md-date-picker-docked-panel-width, max(calc(360px + var(--md-sys-density-scale, 0) * 10px), var(--_panel-width)));\n /* 7×6 day grid + weekday row — shared by calendar and month/year menus. */\n --_docked-content-block-size: calc(\n var(--_weekday-size) + 16px + 6 * var(--_day-size) + 5 * var(--_grid-gap) + 8px\n );\n}\n\n:host(.md-date-picker--modal) {\n display: contents;\n}\n\n:host(.md-date-picker--disabled) {\n pointer-events: none;\n opacity: 0.5;\n}\n\n.material-symbols-outlined {\n font-family: var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n overflow-wrap: normal;\n direction: ltr;\n /* Form the icon ligatures (e.g. \"chevron_left\" → glyph) — matches\n md-icon-button so glyphs never fall back to literal text. */\n font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n.md-date-picker__icon {\n font-size: var(--_icon-size);\n inline-size: var(--_icon-size);\n block-size: var(--_icon-size);\n color: var(--_icon-color);\n pointer-events: none;\n}\n\n/* ---- Text-field trigger (docked + modal-input) ---------------------- */\n\n.md-date-picker__textfield,\n.md-date-picker__entry-textfield {\n display: block;\n inline-size: 100%;\n --md-text-field-outline-color: var(--_field-color);\n --md-text-field-input-color: var(--_field-text-color);\n --md-text-field-label-color: var(--_label-color);\n --md-text-field-active-indicator-color: var(--_field-focus-color);\n --md-text-field-supporting-text-color: var(--_field-supporting-color);\n --md-text-field-icon-color: var(--_icon-color);\n --md-text-field-container-color: var(--_field-container-color);\n --md-text-field-container-shape: var(--_field-container-shape);\n --md-text-field-filled-pill: var(--md-date-picker-field-filled-pill, 0);\n}\n\n/* Keep the trigger visually coupled to the open panel — OS focus moves into\n the popup, but `appear-focused` on md-text-field needs primary outline /\n label tokens (not the resting outline) so the field does not fall back to\n hover charcoal or a mismatched border colour. */\n:host(.md-date-picker--open) .md-date-picker__textfield {\n --md-text-field-active-indicator-color: var(--_field-focus-color);\n --md-text-field-icon-color: var(--_field-focus-color);\n}\n\n/* Trigger + popup share one positioning context sized to the field only. */\n.md-date-picker__docked-anchor {\n position: relative;\n display: block;\n inline-size: 100%;\n}\n\n/* ---- Modal scrim + panel -------------------------------------------- */\n\n.md-date-picker__modal {\n position: fixed;\n inset: 0;\n z-index: var(--md-sys-z-index-modal, 1000);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--md-sys-spacing-inset-lg, 16px);\n}\n\n.md-date-picker__scrim {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--_scrim-color) 32%, transparent);\n animation: md-date-picker-fade-in var(--md-sys-motion-duration-short3, 150ms)\n var(--md-sys-motion-easing-standard, ease);\n}\n\n.md-date-picker__modal--closing .md-date-picker__scrim {\n animation: md-date-picker-fade-out\n var(--_panel-bloom-out-duration)\n var(--md-sys-motion-easing-standard, ease)\n forwards;\n}\n\n.md-date-picker__panel {\n position: relative;\n display: flex;\n flex-direction: column;\n inline-size: var(--_panel-width);\n max-inline-size: calc(100vw - 32px);\n max-block-size: min(\n var(--_panel-max-block-size),\n calc(100vh - 32px),\n calc(100dvh - 32px)\n );\n overflow: hidden;\n background: var(--_container-color);\n color: var(--_field-text-color);\n border-radius: var(--_container-shape);\n box-shadow: var(--md-sys-elevation-3, 0 4px 8px 3px rgba(0, 0, 0, 0.15),\n 0 1px 3px rgba(0, 0, 0, 0.3));\n}\n\n/* Modal calendar / range — unified surface-container-high. Height fits the\n content (capped by max-block-size on .md-date-picker__panel) so the panel\n shrinks as the calendar + header + footer densify, instead of pooling the\n freed space as empty top/bottom padding. At density 0 the 6-row calendar\n still fills ~the 524px cap. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked):not(.md-date-picker__panel--input-mode) {\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface-container-high));\n block-size: auto;\n}\n\n/* Modal date-input — unified surface-container-high; compact height. */\n.md-date-picker__panel--input-mode:not(.md-date-picker__panel--docked) {\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface-container-high));\n block-size: auto;\n min-block-size: 0;\n}\n\n/* Modal / range — scale entrance (non-docked). */\n.md-date-picker__panel:not(.md-date-picker__panel--docked):not(.md-date-picker__panel--bloom-out) {\n animation: md-date-picker-scale var(--md-sys-motion-duration-medium2, 300ms)\n var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1));\n transform-origin: center top;\n}\n\n/* Docked popup — expressive bloom entrance (matches month/year menus). */\n.md-date-picker__panel--docked.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n animation: md-date-picker-selection-bloom-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n/* Panel dismiss — bloom-out shrink/fade (docked + modal). */\n.md-date-picker__panel--bloom-out {\n animation: md-date-picker-panel-bloom-out\n var(--_panel-bloom-out-duration)\n var(--_selection-bloom-out-easing)\n both;\n transform-origin: center top;\n}\n\n:host(.md-date-picker--panel-closing) .md-date-picker__panel {\n pointer-events: none;\n}\n\n/* Panel is tabindex=\"-1\" for shortcut routing — never show a focus ring on the container. */\n.md-date-picker__panel:focus,\n.md-date-picker__panel:focus-visible {\n outline: none;\n}\n\n.md-date-picker__panel--docked {\n /* Docked drawer + selection menus share surface-container-high. */\n --_container-color: var(--md-sys-color-surface-container-high);\n position: absolute;\n /* 4px MD3 gap below field — popup wrapper is already at inset-block-start: 100%. */\n inset-block-start: 4px;\n inset-block-end: auto;\n inset-inline-start: 0;\n inset-inline-end: auto;\n inline-size: var(--_docked-panel-width);\n max-inline-size: calc(100vw - 32px);\n /* Grow to natural content height; cap only when viewport is short. */\n block-size: auto;\n min-block-size: 0;\n max-block-size: min(\n var(--_panel-max-block-size),\n calc(100vh - 32px),\n calc(100dvh - 32px)\n );\n display: flex;\n flex-direction: column;\n /* Visible so md-tooltip popups above docked nav are not clipped; scroll lives on calendar/menu. */\n overflow: visible;\n box-shadow: none;\n border-radius: var(--md-sys-shape-corner-large, 16px);\n z-index: var(--md-sys-z-index-popup, 900);\n}\n\n/* Viewport-aware flip — align panel end edge to anchor end when start overflows. */\n.md-date-picker__panel--docked.md-date-picker__panel--align-end {\n inset-inline-start: auto;\n inset-inline-end: 0;\n}\n\n/* Viewport-aware flip — open above the field when block-end overflows. */\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above {\n inset-block-start: auto;\n inset-block-end: 4px;\n}\n\n.md-date-picker__docked-popup {\n position: absolute;\n inset-block-start: 100%;\n inset-block-end: auto;\n inset-inline-start: 0;\n inline-size: 100%;\n}\n\n.md-date-picker__docked-popup--above {\n inset-block-start: auto;\n inset-block-end: 100%;\n}\n\n/* Bloom origin follows the anchored corner (start/end × below/above).\n\n `transform-origin` has no logical keywords — `inline-start` / `inline-end`\n are invalid values, so every one of the rules below was dropped whole and\n the panel bloomed from its own centre in both directions. These two\n properties carry the physical equivalent and swap under RTL, which is what\n the logical keywords were reaching for. */\n:host {\n --_docked-origin-inline-start: left;\n --_docked-origin-inline-end: right;\n}\n\n:host([dir='rtl']),\n:host-context([dir='rtl']) {\n --_docked-origin-inline-start: right;\n --_docked-origin-inline-end: left;\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: top var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--align-end.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: top var(--_docked-origin-inline-end);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: bottom var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--align-end.md-date-picker__panel--bloom-in:not(.md-date-picker__panel--bloom-out) {\n transform-origin: bottom var(--_docked-origin-inline-end);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--bloom-out {\n transform-origin: top var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--align-end.md-date-picker__panel--bloom-out {\n transform-origin: top var(--_docked-origin-inline-end);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--bloom-out {\n transform-origin: bottom var(--_docked-origin-inline-start);\n}\n\n.md-date-picker__panel--docked.md-date-picker__panel--placement-above.md-date-picker__panel--align-end.md-date-picker__panel--bloom-out {\n transform-origin: bottom var(--_docked-origin-inline-end);\n}\n\n/* ---- Header --------------------------------------------------------- */\n\n/* Redline header anatomy (modal): 16px top, 24px inline-start, 12px inline-end,\n 12px bottom. The supporting + headline rows stack with no inter-row gap so the\n 36px supporting region and 40px headline region land exactly. */\n.md-date-picker__header {\n display: flex;\n flex-direction: column;\n gap: 0;\n padding-block-start: var(--md-sys-spacing-inset-lg, 16px);\n padding-block-end: var(--md-sys-spacing-inset-md, 12px);\n padding-inline-start: var(--md-sys-spacing-inset-xl, 24px);\n padding-inline-end: var(--md-sys-spacing-inset-md, 12px);\n background-color: var(--_header-color);\n border-block-end: 1px solid var(--md-sys-color-outline-variant);\n flex: none;\n}\n\n/* \"Select date\" supporting label — label-medium / on-surface-variant.\n Occupies the 36px region from its top to the headline top (redline). */\n.md-date-picker__header-supporting {\n font-family: var(--md-sys-typescale-label-medium-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-label-medium-font-weight, 500);\n line-height: max(14px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n letter-spacing: var(--md-sys-typescale-label-medium-letter-spacing, 0.5px);\n color: var(--_supporting-color);\n /* The 36px gap below the supporting label is the biggest top spacer; shrink it\n with density (36px at 0 → 12px at -4). */\n padding-block-end: max(4px, calc(36px + var(--md-sys-density-scale, 0) * 6px));\n}\n\n/* Headline row — 40px headline-large line box plus the 48px trailing edit-button\n column with an 8px gap between them. */\n.md-date-picker__header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--md-sys-spacing-gap-sm, 8px);\n min-block-size: max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px));\n}\n\n.md-date-picker__headline {\n flex: 1 1 auto;\n min-inline-size: 0;\n font-family: var(--md-sys-typescale-headline-large-font-family, Roboto, sans-serif);\n font-size: max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px));\n font-weight: var(--md-sys-typescale-headline-large-font-weight, 400);\n line-height: max(30px, calc(40px + var(--md-sys-density-scale, 0) * 2.5px));\n letter-spacing: var(--md-sys-typescale-headline-large-letter-spacing, 0px);\n color: var(--_headline-color);\n}\n\n/* Edit / mode-toggle — 48px touch target in the trailing column (redline). */\n.md-date-picker__mode-toggle {\n flex: none;\n --md-icon-button-container-width: 48px;\n --md-icon-button-container-height: 48px;\n}\n\n/* ---- Body / nav ----------------------------------------------------- */\n\n/* Redline: 12px inline padding → 7×40px day cells (6px grid gap) inside the 360px\n panel; 12px gap above the month/year nav row. */\n.md-date-picker__body {\n padding-block-start: var(--md-sys-spacing-inset-md, 12px);\n padding-inline: 12px;\n padding-block-end: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* Modal / range — fill space between header and actions; children own overflow. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__body {\n flex: 1 1 auto;\n min-block-size: 0;\n overflow: hidden;\n}\n\n/* Modal / range month-year nav row: 48px chevron touch targets, 4px inline edge\n padding, 4px gap below the row before the weekday header (redline). */\n.md-date-picker__nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-block-size: 48px;\n padding-inline: var(--md-sys-spacing-inset-xs, 4px);\n margin-block-end: var(--md-sys-spacing-inset-xs, 4px);\n flex: none;\n}\n\n.md-date-picker__nav-buttons {\n display: flex;\n gap: var(--md-sys-spacing-gap-xs, 4px);\n align-items: center;\n}\n\n.md-date-picker__nav md-icon-button.md-date-picker__nav-chevron {\n flex: none;\n}\n\n/* ---- Docked nav: month / year menu buttons + flanking chevrons ------ */\n\n/* Without a Cancel / OK row the panel has no bottom inset — that row WAS the\n spacing, so the last week sat flush against the panel edge and read as cut\n off. Both variants get the same bottom inset, so a picker reads identically\n whether it is docked or modal.\n\n A modal body's own top padding is only half the visible gap (the header adds\n its own `padding-block-end` above it), so matching that 12px below would\n still read tight — the full inset is what makes the two edges balance. The\n docked rule below subtracts `--md-sys-spacing-inset-sm`: a DOCKED calendar\n is not stretched, so its own bottom padding lands directly under the grid and\n would otherwise be counted twice. In a modal the calendar is `flex: 1 1 auto`\n and its bottom padding is zeroed, so nothing is double-counted there. */\n.md-date-picker__body--no-actions {\n padding-block-end: max(4px, calc(20px + var(--md-sys-density-scale, 0) * 2px));\n}\n\n.md-date-picker__body--docked,\n.md-date-picker__body--docked.md-date-picker__body--docked-selection {\n /* Identical chrome in day grid and selection — triggers must not shift. */\n padding-block-start: max(4px, calc(20px + var(--md-sys-density-scale, 0) * 2px));\n padding-inline: 12px;\n padding-block-end: 0;\n}\n\n.md-date-picker__body--docked.md-date-picker__body--no-actions {\n /* The docked top inset, minus what the calendar already adds below the grid,\n so both edges read the same at every density rung. */\n padding-block-end: max(\n 0px,\n calc(\n max(4px, calc(20px + var(--md-sys-density-scale, 0) * 2px)) -\n var(--md-sys-spacing-inset-sm, 8px)\n )\n );\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-block-size: 0;\n /* Nav tooltips extend above the row; calendar/menu children own overflow scrolling. */\n overflow: hidden;\n}\n\n/* Wraps selection divider only while month/year menu is open (not rendered for day grid). */\n.md-date-picker__docked-below-nav {\n flex: none;\n display: flex;\n align-items: center;\n inline-size: 100%;\n box-sizing: border-box;\n}\n\n.md-date-picker__selection-divider {\n flex: none;\n inline-size: 100%;\n margin: 0;\n padding: 0;\n border: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n}\n\n/* Full-bleed selection menu + divider while nav keeps body inline padding. */\n.md-date-picker__body--docked-selection .md-date-picker__docked-below-nav,\n.md-date-picker__body--docked-selection .md-date-picker__selection-menu-wrap {\n margin-inline: -12px;\n inline-size: calc(100% + 24px);\n}\n\n.md-date-picker__selection-divider::before {\n content: '';\n display: block;\n inline-size: 100%;\n block-size: 1px;\n background-color: var(--md-sys-color-outline-variant);\n}\n\n.md-date-picker__body--docked-selection .md-date-picker__selection-divider {\n animation: md-date-picker-selection-divider-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n.md-date-picker__body--docked-selection > .md-date-picker__selection-menu-wrap {\n box-sizing: border-box;\n /* Divider row above consumes 1px — keep nav-to-content span identical to day grid. */\n flex: 1 1 auto;\n block-size: auto;\n min-block-size: 0;\n max-block-size: 100%;\n border-end-start-radius: var(--md-sys-shape-corner-large, 16px);\n border-end-end-radius: var(--md-sys-shape-corner-large, 16px);\n transform-origin: center top;\n}\n\n/* Bloom-in on every menu mount (Stencil remounts on open) — matches md-time-picker mode-swap. */\n.md-date-picker__body--docked-selection\n > .md-date-picker__selection-menu-wrap:not(.md-date-picker__selection-menu-wrap--bloom-out) {\n animation: md-date-picker-selection-bloom-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n.md-date-picker__selection-menu-wrap--bloom-out {\n animation: md-date-picker-selection-bloom-out\n var(--_selection-bloom-out-duration)\n var(--_selection-bloom-out-easing)\n both;\n transform-origin: center top;\n}\n\n/* Docked day grid — fills body below nav; scroll inside when viewport-capped. */\n.md-date-picker__body--docked > .md-date-picker__calendar {\n box-sizing: border-box;\n flex: 1 1 auto;\n block-size: auto;\n min-block-size: 0;\n max-block-size: 100%;\n overflow-x: clip;\n overflow-y: auto;\n}\n\n/* Day grid returns after month/year pick — expressive bloom (docked only). */\n.md-date-picker__body--docked .md-date-picker__calendar--docked-bloom-in {\n animation: md-date-picker-docked-calendar-bloom-in\n var(--_calendar-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n transform-origin: center top;\n}\n\n/* Modal / range — day grid bloom after year grid closes (matches docked pick return). */\n.md-date-picker__panel:not(.md-date-picker__panel--docked)\n .md-date-picker__calendar--content-bloom-in {\n animation: md-date-picker-docked-calendar-bloom-in\n var(--_calendar-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n transform-origin: center top;\n}\n\n.md-date-picker__docked-nav {\n /* Match the chevron icon-button's own density-scaled size (40px at 0 -> 32px\n floor) so the slot shrinks WITH the button: the icon-button stays centred\n (fixes the button/chevron misalignment) and the following controls pull in\n tighter as density increases. */\n --_nav-chevron-size: max(32px, calc(40px + var(--md-sys-density-scale, 0) * 4px));\n /* 3px outline + 2px offset — clearance between chevrons and menu triggers */\n --_nav-focus-ring-gap: 5px;\n display: flex;\n flex-direction: row;\n align-items: center;\n /* Pack the month + year groups together (was space-between, which spread them\n to the panel edges leaving a large middle gap). The between-group gap is now\n a fixed, density-shrinking value. */\n justify-content: center;\n gap: var(--md-sys-spacing-gap-lg, 16px);\n inline-size: 100%;\n padding-block-start: 0;\n padding-inline: 0;\n /* Gap below nav row — docked nav bottom tooltips use offset to center here (see md-date-picker.tsx). */\n padding-block-end: 30px;\n flex: none;\n box-sizing: border-box;\n}\n\n.md-date-picker__docked-nav .md-date-picker__nav-group {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--md-sys-spacing-gap-xs, 4px);\n flex: 0 0 auto;\n min-inline-size: 0;\n box-sizing: border-box;\n}\n\n.md-date-picker__docked-nav md-icon-button.md-date-picker__directional-icon {\n flex: none;\n flex-shrink: 0;\n}\n\n.md-date-picker__docked-nav .md-date-picker__nav-group--month {\n justify-content: flex-start;\n}\n\n.md-date-picker__docked-nav .md-date-picker__nav-group--year {\n justify-content: flex-end;\n}\n\n/* Prev/next chevrons and spacers share one slot — crossfade without layout shift. */\n.md-date-picker__nav-chevron-slot {\n position: relative;\n flex: none;\n flex-shrink: 0;\n inline-size: var(--_nav-chevron-size, 40px);\n block-size: var(--_nav-chevron-size, 40px);\n}\n\n.md-date-picker__nav-chevron-slot > md-tooltip,\n.md-date-picker__nav-chevron-slot > .md-date-picker__nav-chevron-spacer {\n position: absolute;\n inset: 0;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear var(--_caret-fade-duration);\n}\n\n.md-date-picker__nav-chevron-slot > md-tooltip.md-date-picker__nav-chevron--visible,\n.md-date-picker__nav-chevron-slot\n > .md-date-picker__nav-chevron-spacer.md-date-picker__nav-chevron--visible {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear 0s;\n}\n\n/* Visible chevron must accept clicks; hidden layer stays inert (spacer never does). */\n.md-date-picker__nav-chevron-slot > md-tooltip {\n display: block;\n}\n\n.md-date-picker__nav-chevron-slot > md-tooltip.md-date-picker__nav-chevron--visible {\n pointer-events: auto;\n z-index: 1;\n}\n\n.md-date-picker__nav-chevron-spacer {\n display: block;\n inline-size: 100%;\n block-size: 100%;\n}\n\n.md-date-picker__icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 40px;\n block-size: 40px;\n border: none;\n border-radius: var(--md-sys-shape-corner-full, 9999px);\n background: transparent;\n cursor: pointer;\n position: relative;\n flex: none;\n}\n.md-date-picker__icon-button:hover {\n background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);\n}\n.md-date-picker__icon-button:focus-visible {\n outline: 3px solid var(--md-sys-color-secondary);\n outline-offset: 2px;\n}\n\n/* Docked month/year triggers — `md-button` text + sm with trailing caret. */\n.md-date-picker__menu-button {\n flex: none;\n --md-button-label-color: var(--md-sys-color-on-surface-variant);\n /* Literal formula, not `var(--_icon-size)`: this lands on an md-button, which\n defines its own `--_icon-size` — handing a private name across that boundary\n is cyclic and silently collapses to invalid. */\n --md-button-icon-size: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n --_state-layer-color: var(--md-sys-color-on-surface-variant);\n}\n\n/* Override md-button--sm default 8px label↔icon gap — spec wants 2px. */\n.md-date-picker__menu-button.md-button--sm {\n gap: 2px;\n}\n\n/* Open menu: match selected md-menu-item (secondary container). */\n.md-date-picker__menu-button.md-button--selected {\n --md-button-container-color: var(--md-sys-color-secondary-container);\n --md-button-label-color: var(--md-sys-color-on-secondary-container);\n --_state-layer-color: var(--md-sys-color-on-secondary-container);\n}\n\n.md-date-picker__menu-button::part(label) {\n font-family: var(--md-sys-typescale-label-large-font-family, Roboto, sans-serif);\n font-size: max(12px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-label-large-font-weight, 500);\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n letter-spacing: var(--md-sys-typescale-label-large-letter-spacing, 0.1px);\n}\n\n/* Month/year nav hints include full name + shortcut — wider than default 200px plain max. */\n.md-date-picker__menu-button-tooltip {\n --md-tooltip-plain-max-inline-size: max-content;\n}\n\n/* Trailing caret — crossfade arrow_drop_down ↔ arrow_drop_up (slotted glyphs). */\n.md-date-picker__menu-caret {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n align-self: center;\n flex: none;\n inline-size: 20px;\n block-size: 20px;\n}\n\n.md-date-picker__menu-caret-glyph {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n line-height: 1;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear var(--_caret-fade-duration);\n}\n\n.md-date-picker__menu-caret-glyph--visible {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--_caret-fade-duration) var(--_caret-fade-easing),\n visibility 0s linear 0s;\n}\n\n/* ---- Docked month/year selection (inline baseline md-menu) ------------ */\n\n.md-date-picker__selection-menu-wrap {\n inline-size: 100%;\n display: flex;\n flex-direction: column;\n flex: 0 0 auto;\n overflow: hidden;\n margin-block: 0;\n box-sizing: border-box;\n /* Blend with the docked panel — no contrasting menu container band. */\n background-color: var(--_container-color);\n}\n\n/* Render md-menu inline in the panel (not as a fixed popover). */\n.md-date-picker__selection-menu {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-block-size: 0;\n inline-size: 100%;\n block-size: 100%;\n pointer-events: auto;\n z-index: auto;\n --md-menu-min-width: 100%;\n --md-menu-max-width: none;\n --md-menu-inline-surface-color: var(--_container-color);\n --md-menu-inline-fill-radius-end: var(--md-sys-shape-corner-large, 16px);\n}\n\n/* Radio-at-start rows: 16px before check, 16px between check and headline. */\n.md-date-picker__selection-menu md-menu-item {\n --md-menu-item-gap: var(--md-sys-spacing-gap-lg, 16px);\n padding-inline-start: var(--md-sys-spacing-inset-lg, 16px);\n}\n\n.md-date-picker__selection-menu md-menu-item::part(headline) {\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-large-font-weight, 400);\n line-height: var(--md-sys-typescale-body-large-line-height, 24px);\n letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);\n color: var(--md-sys-color-on-surface);\n}\n\n/* ---- Calendar grid -------------------------------------------------- */\n\n.md-date-picker__calendar {\n padding-block-end: var(--md-sys-spacing-inset-sm, 8px);\n overflow-x: clip;\n}\n\n/* Modal / range — calendar stretches to fill the body slot below nav. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__calendar {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n min-block-size: 0;\n padding-block-end: 0;\n overflow: hidden;\n}\n\n/* Modal / range — weekday row spacing above the fixed-size day grid. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__weekdays {\n flex: none;\n}\n\n.md-date-picker__weekdays,\n.md-date-picker__grid {\n display: grid;\n /* 1fr columns fill the (wider-than-grid) body, so the day circles distribute\n evenly across the full width instead of packing tight in the centre. Each\n day/weekday keeps its fixed --_day-size and is centred in its track. */\n grid-template-columns: repeat(7, 1fr);\n gap: var(--_grid-gap);\n justify-items: center;\n}\n\n.md-date-picker__weekdays {\n padding-block-end: var(--md-sys-spacing-inset-lg, 16px);\n}\n\n/* Tooltip wrapper acts as the grid cell so the weekday layout is unchanged. */\n.md-date-picker__weekday-tooltip {\n display: flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--_day-size);\n cursor: pointer;\n}\n\n.md-date-picker__weekday {\n display: flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--_day-size);\n block-size: var(--_weekday-size);\n cursor: pointer;\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-large-font-weight, 400);\n line-height: var(--md-sys-typescale-body-large-line-height, 24px);\n letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);\n color: var(--_weekday-color);\n}\n\n.md-date-picker__grid {\n grid-auto-rows: var(--_day-size);\n}\n\n/* ARIA week rows (grid > rowgroup > row > gridcell) — box-less so day cells\n remain the direct grid items of the 7-column track above. */\n.md-date-picker__week {\n display: contents;\n}\n\n/* Month/year chevron + Page Up/Down — horizontal slide on the day grid. */\n.md-date-picker__grid--slide-forward {\n animation: md-date-picker-grid-slide-forward\n var(--_grid-slide-duration)\n var(--_grid-slide-easing)\n both;\n}\n\n.md-date-picker__grid--slide-backward {\n animation: md-date-picker-grid-slide-backward\n var(--_grid-slide-duration)\n var(--_grid-slide-easing)\n both;\n}\n\n@keyframes md-date-picker-grid-slide-forward {\n from {\n transform: translateX(100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@keyframes md-date-picker-grid-slide-backward {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n:host-context([dir='rtl']) .md-date-picker__grid--slide-forward,\n:host([dir='rtl']) .md-date-picker__grid--slide-forward {\n animation-name: md-date-picker-grid-slide-forward-rtl;\n}\n\n:host-context([dir='rtl']) .md-date-picker__grid--slide-backward,\n:host([dir='rtl']) .md-date-picker__grid--slide-backward {\n animation-name: md-date-picker-grid-slide-backward-rtl;\n}\n\n@keyframes md-date-picker-grid-slide-forward-rtl {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@keyframes md-date-picker-grid-slide-backward-rtl {\n from {\n transform: translateX(100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n/* Calendar grid cells (day + year) — md-button square + shapeMorph.\n Square resting morphs to a filled circle/pill on select.\n Do not pin --md-button-container-shape here — that blocks the morph. */\n.md-date-picker__day,\n.md-date-picker__year {\n --md-button-label-color: var(--_day-color);\n --md-button-container-color: transparent;\n\n position: relative;\n padding: 0;\n font-family: var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif);\n font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-body-large-font-weight, 400);\n line-height: var(--md-sys-typescale-body-large-line-height, 24px);\n letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);\n font-variant-numeric: tabular-nums;\n}\n\n.md-date-picker__day::part(label),\n.md-date-picker__year::part(label) {\n position: relative;\n z-index: 1;\n font: inherit;\n font-variant-numeric: tabular-nums;\n}\n\n.md-date-picker__day:focus-visible,\n.md-date-picker__year:focus-visible {\n outline-offset: -1px;\n}\n\n/* Day cells — fixed square size in the 7-column grid. */\n.md-date-picker__day {\n --md-button-min-width: var(--_day-size);\n --md-button-width: var(--_day-size);\n --md-button-min-height: var(--_day-size);\n --md-button-height: var(--_day-size);\n}\n\n/* Single-class rule so light-DOM ::part(day-today) can override shape. */\n.md-date-picker__day--today {\n --md-button-container-shape: var(--md-date-picker-day-today-shape, calc(var(--_day-size) / 2));\n --md-button-label-color: var(--_today-outline-color);\n box-shadow: 0 0 0 1px var(--_today-outline-color);\n}\n\n/* Outside (adjacent-month) days remain selectable — de-emphasized but WCAG-AA\n legible. A solid on-surface-variant token (~7.6:1 on the panel surface) instead\n of the 38% disabled fade (~2:1), which is reserved for the disabled rule below. */\n.md-date-picker__day--outside {\n --md-button-label-color: var(--_day-outside-color);\n}\n\n.md-date-picker__day--selected,\n.md-date-picker__year--selected {\n --md-button-container-color: var(--_day-selected-bg);\n --md-button-label-color: var(--_day-selected-color);\n --md-button-container-shape: var(--md-date-picker-day-selected-shape);\n}\n\n.md-date-picker__day--selected.md-date-picker__day--today {\n box-shadow: none;\n}\n\n.md-date-picker__day--disabled,\n.md-date-picker__year--disabled {\n --md-button-label-color: color-mix(\n in srgb,\n var(--_day-color) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%),\n transparent\n );\n}\n\n/* ---- Day grid spacing ----------------------------------------------- */\n/* Day states (plain text / today ring / selected fill) inherit base rules. */\n/* Fixed 40px cells + 6px gap — shared by modal and docked (7×40 + 6×6). */\n\n/* ---- Year grid ------------------------------------------------------ */\n/* 3×N grid of 72×36px pills with 30px inline inset — first column at the start\n edge, third at the end edge (not centered as a block). Gap 12px. */\n\n.md-date-picker__year-grid-wrap {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-block-size: 0;\n overflow: hidden;\n transform-origin: center top;\n}\n\n/* Year grid spans panel inline edges — body keeps 12px for nav; grid owns 30px inset. */\n.md-date-picker__body--year-view .md-date-picker__year-grid-wrap {\n margin-inline: -12px;\n inline-size: calc(100% + 24px);\n box-sizing: border-box;\n}\n\n/* Modal / range year view — bloom on every grid mount (matches docked menus). */\n.md-date-picker__panel:not(.md-date-picker__panel--docked)\n .md-date-picker__year-grid-wrap:not(.md-date-picker__year-grid-wrap--bloom-out) {\n animation: md-date-picker-selection-bloom-in\n var(--_selection-bloom-duration)\n var(--_selection-bloom-easing)\n both;\n}\n\n.md-date-picker__year-grid-wrap--bloom-out {\n animation: md-date-picker-selection-bloom-out\n var(--_selection-bloom-out-duration)\n var(--_selection-bloom-out-easing)\n both;\n}\n\n/* Modal year grid scroll is owned by md-scroll-shadow (edge fades when overflow). */\n.md-date-picker__year-grid-scroll {\n flex: 1 1 auto;\n min-block-size: 0;\n overflow-y: auto;\n}\n\n/* Modal / range — fixed 288px scroll viewport (8×36px rows); flex was shrinking to 271px. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked) .md-date-picker__year-grid-scroll {\n min-block-size: var(--_year-grid-viewport-block-size);\n max-block-size: var(--_year-grid-viewport-block-size);\n}\n\n.md-date-picker__year-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: var(--_year-block-size);\n gap: var(--_year-grid-gap);\n padding-block-start: 8px;\n padding-inline: var(--_year-grid-padding-inline);\n padding-block-end: 16px;\n align-content: start;\n}\n\n/* ARIA year rows (grid > row > gridcell) — box-less so year cells remain the\n direct grid items of the 3-column track above; each row holds ≤3 cells, so\n the nth-child column alignment below still maps position → column. */\n.md-date-picker__year-row {\n display: contents;\n}\n\n/* Modal / range — range typed-entry scrolls inside the body when tall. */\n.md-date-picker__panel:not(.md-date-picker__panel--docked):not(.md-date-picker__panel--input-mode)\n .md-date-picker__entry {\n flex: 1 1 auto;\n min-block-size: 0;\n overflow-y: auto;\n padding: var(--md-sys-spacing-inset-lg, 16px) var(--md-sys-spacing-inset-xl, 24px) var(--md-sys-spacing-inset-sm, 8px);\n}\n\n/* Year cells — fixed 72×36px pill; morph on select.\n Per-column alignment: start / center / end so columns sit at container edges. */\n.md-date-picker__year {\n --md-button-min-width: var(--_year-inline-size);\n --md-button-width: var(--_year-inline-size);\n --md-button-min-height: var(--_year-block-size);\n --md-button-height: var(--_year-block-size);\n}\n\n.md-date-picker__year:nth-child(3n + 1) {\n justify-self: start;\n}\n\n.md-date-picker__year:nth-child(3n + 2) {\n justify-self: center;\n}\n\n.md-date-picker__year:nth-child(3n) {\n justify-self: end;\n}\n\n/* ---- In-dialog text entry ------------------------------------------- */\n\n.md-date-picker__entry {\n display: flex;\n flex-wrap: wrap;\n gap: var(--md-sys-spacing-gap-lg, 16px);\n padding: 0;\n inline-size: 100%;\n}\n\n/* Single-date modal input — outlined md-text-field with floating label. */\n\n.md-date-picker__body--input-mode {\n padding-block-start: var(--md-sys-spacing-inset-xl, 24px);\n padding-inline: var(--md-sys-spacing-inset-xl, 24px);\n padding-block-end: var(--md-sys-spacing-inset-sm, 8px);\n flex: none;\n}\n.md-date-picker__entry-error {\n flex-basis: 100%;\n font-size: max(10px, calc(12px + var(--md-sys-density-scale, 0) * 0.5px));\n color: var(--_error-color);\n}\n\n/* ---- Actions -------------------------------------------------------- */\n\n/* Redline: 8px above the 40px action row, 12px below, 12px inline-end edge,\n 8px gap between Cancel / OK. */\n.md-date-picker__actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--md-sys-spacing-gap-sm, 8px);\n min-block-size: max(28px, calc(40px + var(--md-sys-density-scale, 0) * 3px));\n /* Inline padding is a constant 12px so the Cancel/OK edge stays aligned with\n the day grid (also 12px) at every density — the grid margin doesn't scale,\n so the footer's must not either. Vertical padding still densifies. */\n padding-block: var(--md-sys-spacing-inset-sm, 8px) var(--md-sys-spacing-inset-md, 12px);\n padding-inline: 12px;\n flex: none;\n}\n\n/* Cancel / OK — compose md-button (text variant). */\n.md-date-picker__action-btn {\n --md-button-label-color: var(--_action-color);\n}\n\n.md-date-picker__action-btn--primary {\n --md-button-label-color: var(--_action-color);\n}\n\n/* ---- RTL ------------------------------------------------------------ */\n\n:host-context([dir='rtl']) .md-date-picker__directional-icon .md-date-picker__icon,\n:host([dir='rtl']) .md-date-picker__directional-icon .md-date-picker__icon {\n transform: scaleX(-1);\n}\n/* Docked chevrons are md-icon-buttons — their glyph lives in their own shadow,\n so mirror the whole element instead of an inner span. */\n:host-context([dir='rtl']) md-icon-button.md-date-picker__directional-icon,\n:host([dir='rtl']) md-icon-button.md-date-picker__directional-icon {\n transform: scaleX(-1);\n}\n\n/* ---- Slotted icons -------------------------------------------------- */\n\n::slotted([slot='leading-icon']) {\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: var(--_icon-color);\n fill: currentColor;\n pointer-events: none;\n}\n\n/* ---- Dark theme ----------------------------------------------------- */\n\n:host([data-theme='dark']),\n:host-context([data-theme='dark']) {\n --_container-color: var(--md-date-picker-container-color, var(--md-sys-color-surface));\n --_header-color: var(--md-date-picker-header-color, var(--md-sys-color-surface-container-high));\n}\n\n/* ---- Motion --------------------------------------------------------- */\n\n/* Docked month/year selection — expressive bloom below nav/divider\n (mirrors md-time-picker mode-swap: scale 0.94 + 8dp drop + fade). */\n@keyframes md-date-picker-selection-bloom-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.94);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes md-date-picker-selection-bloom-out {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(4px) scale(0.96);\n }\n}\n\n@keyframes md-date-picker-selection-divider-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes md-date-picker-docked-calendar-bloom-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.92);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes md-date-picker-fade-in {\n from {\n opacity: 0;\n }\n}\n@keyframes md-date-picker-fade-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes md-date-picker-scale {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n}\n\n@keyframes md-date-picker-panel-bloom-out {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(4px) scale(0.96);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .md-date-picker__scrim,\n .md-date-picker__modal--closing .md-date-picker__scrim,\n .md-date-picker__panel:not(.md-date-picker__panel--docked),\n .md-date-picker__panel--docked.md-date-picker__panel--bloom-in,\n .md-date-picker__panel--bloom-out,\n .md-date-picker__body--docked-selection .md-date-picker__selection-divider,\n .md-date-picker__body--docked-selection\n > .md-date-picker__selection-menu-wrap:not(.md-date-picker__selection-menu-wrap--bloom-out),\n .md-date-picker__selection-menu-wrap--bloom-out,\n .md-date-picker__panel:not(.md-date-picker__panel--docked)\n .md-date-picker__year-grid-wrap:not(.md-date-picker__year-grid-wrap--bloom-out),\n .md-date-picker__year-grid-wrap--bloom-out,\n .md-date-picker__calendar--docked-bloom-in,\n .md-date-picker__calendar--content-bloom-in,\n .md-date-picker__grid--slide-forward,\n .md-date-picker__grid--slide-backward {\n animation: none;\n }\n\n .md-date-picker__nav-chevron-slot > md-tooltip,\n .md-date-picker__nav-chevron-slot > .md-date-picker__nav-chevron-spacer,\n .md-date-picker__menu-caret-glyph {\n transition: 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 { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Method, Prop, State, Watch, h } from '@stencil/core';\nimport {\n toIsoDate,\n parseIsoDate,\n parseFlexibleDateInput,\n formatDisplayDate,\n dateFormatPattern,\n isSameDay,\n addMonths,\n addDays,\n daysInMonth,\n clampDate,\n isOutOfRange,\n buildMonthMatrix,\n weekdayNames,\n getFirstDayOfWeek,\n type DayCell,\n} from './date-utils';\nimport { waitForHostRipple } from '../../utils/ripple';\nimport {\n setFormValue,\n setValidityState,\n checkValidityOf,\n reportValidityOf,\n getValidityOf,\n} from '../../utils/form';\n\nlet dpUid = 0;\n\n/** Docked selection menu bloom-in — keep in sync with `--_selection-bloom-duration`. */\nconst DOCKED_SELECTION_BLOOM_IN_MS = 450;\n\n/** Docked selection menu bloom-out — keep in sync with `--_selection-bloom-out-duration`. */\nconst DOCKED_SELECTION_BLOOM_OUT_MS = 200;\n\n/** Panel bloom-out on dismiss — keep in sync with `--_panel-bloom-out-duration`. */\nconst PANEL_BLOOM_OUT_MS = 200;\n\n/** Calendar bloom-in after selection — keep in sync with `--_calendar-bloom-duration`. */\nconst DOCKED_CALENDAR_BLOOM_IN_MS = 300;\n\n/**\n * Bottom tooltip offsets for docked nav — center the ~24px plain popup in the\n * 30px gap below the nav row (`.md-date-picker__docked-nav` padding-block-end).\n * Chevrons fill the 40px row; sm menu buttons are shorter and vertically centered.\n */\nconst DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET = 3;\nconst DOCKED_NAV_MENU_TOOLTIP_OFFSET = 5;\n\n/** Detail payload emitted by the `mdChange` event. */\nexport interface MdDatePickerChangeDetail {\n /** Selected ISO date. */\n value: string;\n /** Selected `Date`. */\n date: Date | null;\n}\n\n/** Detail payload emitted by the `mdSelected` event. */\nexport interface MdDatePickerSelectedDetail {\n /** Selected ISO date. */\n value: string;\n /** Selected `Date`. */\n date: Date;\n}\n\n/** How the displayed calendar month/year was changed. */\nexport type MdDatePickerViewChangeSource =\n | 'chevron-month'\n | 'chevron-year'\n | 'month-menu'\n | 'year-menu';\n\n/** Detail payload emitted by the `mdViewChange` event. */\nexport interface MdDatePickerViewChangeDetail {\n /** Zero-based month index (`0` = January). */\n month: number;\n year: number;\n source: MdDatePickerViewChangeSource;\n}\n\n/** Detail payload emitted by the `mdMenuOpen` event. */\nexport interface MdDatePickerMenuOpenDetail {\n type: 'month' | 'year';\n}\n\n/** Detail payload emitted by the `mdMenuSelect` event. */\nexport interface MdDatePickerMenuSelectDetail {\n type: 'month' | 'year';\n /** Zero-based month index or four-digit year. */\n value: number;\n /** Locale-aware month name or year string when available. */\n label?: string;\n}\n\n/** Modal dialog entry mode — calendar grid or typed text field. */\nexport type MdDatePickerMode = 'calendar' | 'input';\n\n/** Detail payload emitted by the `mdModeChange` event. */\nexport interface MdDatePickerModeChangeDetail {\n mode: MdDatePickerMode;\n}\n\n/**\n * `md-date-picker` — a Material Design 3 date picker.\n *\n * Variants:\n * - `modal-input` *(default)* — outlined text field + modal calendar dialog.\n * - `modal` — bare modal dialog surfaced via `show()` / `open`.\n * - `docked` — outlined text field + dropdown calendar anchored to the field.\n *\n * The modal dialog can flip to a typed-entry view (date input) via the\n * header toggle, satisfying the MD3 \"modal date input\" pattern.\n */\n@Component({\n tag: 'md-date-picker',\n styleUrl: 'md-date-picker.css',\n shadow: true,\n formAssociated: true,\n})\nexport class MdDatePicker {\n @Element() el!: HTMLElement;\n\n /**\n * Form-association handle. The picker previously declared `name`/`value` but\n * was not form-associated, so the chosen date never reached FormData.\n */\n @AttachInternals() internals!: ElementInternals;\n\n\n /**\n * Localized constraint-validation message shown when `required` is unmet.\n *\n * A prop rather than a hardcoded string, matching md-time-picker's\n * `value-missing-label`: components stay i18n-engine-agnostic and the\n * consumer localizes through its own dictionary. Native inputs get their\n * message from the browser's locale for free; a form-associated custom\n * element supplies its own, so leaving this hardcoded would ship an\n * English-only form to every locale.\n */\n @Prop({ attribute: 'value-missing-label' }) valueMissingLabel: string =\n 'Please choose a date.';\n\n\n /**\n * Always occupy the supporting-text line, even when there is no message, so a\n * validation error does not push the content below it down. Forwarded to the\n * embedded md-text-field. See that component for why it is opt-in.\n */\n @Prop({ attribute: 'reserve-supporting-space' }) reserveSupportingSpace: boolean = false;\n\n /** Message set via setCustomValidity(); non-empty wins over valueMissing. */\n private customValidityMessage = '';\n\n /** `value` at first render, restored on form reset. */\n private defaultValue = '';\n\n /** Presentation variant. */\n @Prop({ reflect: true }) variant: 'modal' | 'modal-input' | 'docked' =\n 'modal-input';\n\n /** Selected date as ISO `YYYY-MM-DD`. Two-way bindable. */\n @Prop({ mutable: true, reflect: true }) value: string = '';\n\n /** Floating label / accessible name for the field. */\n @Prop() label: string = 'Date';\n\n /** Placeholder shown inside the text-field input. */\n @Prop() placeholder: string = '';\n\n /** Earliest selectable date, inclusive, as ISO `YYYY-MM-DD`. */\n @Prop() min: string = '';\n\n /** Latest selectable date, inclusive, as ISO `YYYY-MM-DD`. */\n @Prop() max: string = '';\n\n /** Whether the modal / docked panel is open. Two-way bindable. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /** Disabled — blocks all interaction and removes from tab order. */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /** Marks the field as required (for form-validation contexts). */\n @Prop({ reflect: true }) required: boolean = false;\n\n /**\n * Show a clear (\"×\") button on the field trigger while a date is selected,\n * which resets the value (same as calling `clear()`). Applies to the\n * `modal-input` and `docked` variants.\n */\n @Prop({ reflect: true }) clearable: boolean = false;\n\n /** Accessible label for the clear button. */\n @Prop({ attribute: 'clear-label' }) clearLabel: string = 'Clear date';\n\n /** Error state — paints the field with the error color and shows `error-text`. */\n @Prop({ mutable: true, reflect: true }) error: boolean = false;\n\n /** Error message shown below the field when `error` is true. */\n @Prop({ mutable: true, attribute: 'error-text' }) errorText: string = '';\n\n /** Helper text shown below the field. Hidden while an error is displayed. */\n @Prop({ attribute: 'supporting-text' }) supportingText: string = '';\n\n /** BCP-47 locale for month/weekday names and date formatting. */\n @Prop() locale: string = '';\n\n /**\n * Character between day, month, and year in the text field (display and\n * parsing). Leave empty to use the locale default (e.g. `/` for `en-US`,\n * `.` for `de-DE`). The `value` prop and `mdChange` / `mdSelected` events\n * always use ISO `YYYY-MM-DD` regardless of this setting.\n *\n * @example\n * ```html\n * <md-date-picker date-separator=\"/\" value=\"2025-06-15\"></md-date-picker>\n * <!-- displays 06/15/2025 in en-US -->\n * <md-date-picker date-separator=\".\" locale=\"de-DE\"></md-date-picker>\n * <!-- displays and parses DD.MM.YYYY -->\n * ```\n */\n @Prop({ attribute: 'date-separator' }) dateSeparator: string = '';\n\n /**\n * Visual variant of the trigger `md-text-field` (`modal-input` and `docked`).\n * Use `filled` with `--md-date-picker-field-container-color` for branded fills.\n */\n @Prop({ attribute: 'field-variant' }) fieldVariant: 'outlined' | 'filled' = 'outlined';\n\n /**\n * First day of the week (0 = Sunday … 6 = Saturday). `-1` derives it from\n * the locale.\n */\n @Prop({ attribute: 'first-day-of-week' }) firstDayOfWeek: number = -1;\n\n /** Headline / supporting text shown at the top of the modal header. */\n @Prop() headline: string = 'Select date';\n\n /** Label of the cancel button in the modal action row. */\n @Prop({ attribute: 'cancel-label' }) cancelLabel: string = 'Cancel';\n\n /** Label of the confirm button in the modal action row. */\n @Prop({ attribute: 'ok-label' }) okLabel: string = 'OK';\n\n /** Large headline when no date is staged in calendar mode. */\n @Prop({ attribute: 'select-date-label' }) selectDateLabel: string = 'Select date';\n\n /** Large headline shown in typed-entry (input) mode. */\n @Prop({ attribute: 'enter-dates-label' }) enterDatesLabel: string = 'Enter dates';\n\n /** Default error when a typed date cannot be parsed or is out of range. */\n @Prop({ attribute: 'invalid-date-label' }) invalidDateLabel: string = 'Invalid date';\n\n /** Accessible label for the \"previous month\" nav chevron. */\n @Prop({ attribute: 'previous-month-label' }) previousMonthLabel: string = 'Previous month';\n\n /** Accessible label for the \"next month\" nav chevron. */\n @Prop({ attribute: 'next-month-label' }) nextMonthLabel: string = 'Next month';\n\n /** Accessible label for the \"previous year\" nav chevron. */\n @Prop({ attribute: 'previous-year-label' }) previousYearLabel: string = 'Previous year';\n\n /** Accessible label for the \"next year\" nav chevron. */\n @Prop({ attribute: 'next-year-label' }) nextYearLabel: string = 'Next year';\n\n /** Accessible label for the docked month menu button. */\n @Prop({ attribute: 'choose-month-label' }) chooseMonthLabel: string = 'Choose month';\n\n /** Accessible label for the docked year menu button. */\n @Prop({ attribute: 'choose-year-label' }) chooseYearLabel: string = 'Choose year';\n\n /** Accessible label for the modal month/year toggle button. */\n @Prop({ attribute: 'choose-month-year-label' })\n chooseMonthYearLabel: string = 'Choose a different month and year';\n\n /** Tooltip suffix on the modal month/year nav button. */\n @Prop({ attribute: 'choose-month-and-year-label' })\n chooseMonthAndYearLabel: string = 'Choose month and year';\n\n /** Mode-toggle label when in typed-entry mode (switch to calendar). */\n @Prop({ attribute: 'toggle-calendar-label' })\n toggleCalendarLabel: string = 'Switch to calendar input';\n\n /** Mode-toggle label when in calendar mode (switch to text). */\n @Prop({ attribute: 'toggle-text-label' }) toggleTextLabel: string = 'Switch to text input';\n\n /** Trigger calendar icon label when the panel is closed. */\n @Prop({ attribute: 'open-calendar-label' }) openCalendarLabel: string = 'Open calendar';\n\n /** Trigger calendar icon label when the panel is open. */\n @Prop({ attribute: 'close-calendar-label' }) closeCalendarLabel: string = 'Close calendar';\n\n /**\n * Material Symbols name for the trailing calendar toggle on the field.\n * Ignored when a `calendar-icon` slot is provided.\n */\n @Prop({ attribute: 'calendar-icon' }) calendarIcon: string = 'calendar_today';\n\n /** Accessible label for the modal year-selection grid. */\n @Prop({ attribute: 'year-grid-label' }) yearGridLabel: string = 'Year';\n\n /** Clicking the modal scrim closes the picker when true. */\n @Prop({ attribute: 'scrim-dismissible' }) scrimDismissible: boolean = true;\n\n /**\n * Clicking outside a DOCKED panel dismisses it (like `scrim-dismissible` for\n * the modal, which has a scrim to catch the click and a docked panel does not).\n *\n * Set `false` to keep the panel open until Cancel / OK / Esc — useful when the\n * picker sits inside another popup whose own outside-click handling would\n * otherwise fight it, or when a stray click should not discard staged input.\n *\n * Dismissing this way is a cancel: it emits `mdCancel` and discards staging,\n * exactly as the modal scrim does.\n */\n @Prop({ attribute: 'outside-click-dismissible' }) outsideClickDismissible: boolean = true;\n\n /**\n * Commit a day the moment it is clicked, instead of staging it behind the\n * Cancel / OK row.\n *\n * By default every variant STAGES a day click (`mdSelected`) and commits only\n * on OK (`mdChange`). With this set the two collapse into one interaction:\n * the click stages and commits together, the panel dismisses, and the built-in\n * action row is not rendered at all — there is nothing left for it to confirm.\n *\n * Suits a low-stakes, reversible field. Keep the default when the choice is\n * expensive to get wrong and the user deserves an explicit confirm step.\n */\n @Prop({ reflect: true, attribute: 'commit-on-select' }) commitOnSelect: boolean = false;\n\n /** Form-association name attribute. */\n @Prop() name: string = '';\n\n /** Predicate that disables individual dates (return `true` to disable). */\n @Prop() isDateDisabled?: (date: Date) => boolean;\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 /** Emitted when the user commits a selection. */\n @Event() mdChange: EventEmitter<MdDatePickerChangeDetail>;\n\n /** Emitted when the user selects a day in the calendar (click or keyboard). */\n @Event() mdSelected: EventEmitter<MdDatePickerSelectedDetail>;\n\n /** Emitted on every keystroke in a text-entry field. */\n @Event() mdInput: EventEmitter<{ value: string }>;\n\n /** Emitted when the picker opens. */\n @Event() mdOpen: EventEmitter<void>;\n\n /** Emitted when the picker closes for any reason. */\n @Event() mdClose: EventEmitter<void>;\n\n /** Emitted when the user dismisses without committing (scrim, Cancel, Esc). */\n @Event() mdCancel: EventEmitter<void>;\n\n /** Emitted when the displayed calendar month/year changes from user navigation. */\n @Event() mdViewChange: EventEmitter<MdDatePickerViewChangeDetail>;\n\n /** Emitted when the user opens the month or year selection menu / grid. */\n @Event() mdMenuOpen: EventEmitter<MdDatePickerMenuOpenDetail>;\n\n /** Emitted when the user picks a month or year from a selection menu / grid. */\n @Event() mdMenuSelect: EventEmitter<MdDatePickerMenuSelectDetail>;\n\n /** Emitted when the user toggles between calendar and typed-entry views. */\n @Event() mdModeChange: EventEmitter<MdDatePickerModeChangeDetail>;\n\n @State() private focused = false;\n @State() private inputDraft = '';\n @State() private viewYear: number = new Date().getFullYear();\n @State() private viewMonth: number = new Date().getMonth();\n @State() private viewMode: 'calendar' | 'year' = 'calendar';\n @State() private inputMode = false;\n @State() private focusedDate: Date = new Date();\n /** Staged selection awaiting OK. */\n @State() private pendingDate: Date | null = null;\n @State() private hasSlottedHeader = false;\n @State() private hasSlottedActions = false;\n @State() private hasSlottedLeading = false;\n @State() private hasSlottedCalendarIcon = false;\n /** Docked month-selection dropdown open. */\n @State() private monthMenuOpen = false;\n /** Docked year-selection dropdown open. */\n @State() private yearMenuOpen = false;\n /** Docked month/year menu playing exit bloom before unmount. */\n @State() private selectionMenuClosing: 'month' | 'year' | null = null;\n /** Docked day grid playing enter bloom after selection menu closes. */\n @State() private dockedCalendarBloom = false;\n /** Day grid slide direction after chevron or Page Up/Down navigation. */\n @State() private gridSlideDirection: 'forward' | 'backward' | null = null;\n /** Modal year grid playing exit bloom before returning to calendar. */\n @State() private yearViewClosing = false;\n /** Modal day grid playing enter bloom after year grid closes. */\n @State() private modalCalendarBloom = false;\n /** Entire panel playing exit bloom before unmount. */\n @State() private panelClosing = false;\n /** Docked panel horizontal alignment vs the trigger anchor. */\n @State() private dockedPanelAlign: 'start' | 'end' = 'start';\n /** Docked panel vertical placement relative to the trigger anchor. */\n @State() private dockedPanelPlacement: 'below' | 'above' = 'below';\n /** Max block-size when the panel cannot fully fit below or above. */\n @State() private dockedPanelMaxBlockSize: string | null = null;\n\n private uid = `md-dp-${++dpUid}`;\n private entryTextFieldEl?: HTMLElement;\n private entryInputShouldFocus = false;\n private panelEl?: HTMLElement;\n private triggerEl?: HTMLElement;\n private monthMenuButtonEl?: HTMLElement;\n private yearMenuButtonEl?: HTMLElement;\n private restoreFocusEl: HTMLElement | null = null;\n private gridShouldFocus = false;\n private menuShouldFocus: 'month' | 'year' | null = null;\n private menuRestoreFocus: 'month' | 'year' | null = null;\n /** Modal year grid should scroll the active year into view after paint. */\n private yearGridShouldScroll = false;\n /**\n * Frozen year-list bounds while docked year menu or modal year grid is open.\n * Without min/max props the default range is `viewYear ± 100`; freezing prevents\n * the list from re-centering on every year click or chevron step.\n */\n private yearListMinYear: number | null = null;\n private yearListMaxYear: number | null = null;\n /** True after pointer down on non-interactive panel chrome — keeps shortcuts live when focus stays on `body`. */\n private panelPointerEngaged = false;\n /** Set while `dismissPanel()` sets `open = false` so `@Watch('open')` skips re-entry. */\n private closingFromDismiss = false;\n private dockedAnchorEl?: HTMLElement;\n private dockedPositionCleanup: (() => void) | null = null;\n private dockedPositionRafId = 0;\n private dockedPositionRafAttempts = 0;\n private static readonly DOCKED_POSITION_RAF_MAX = 60;\n\n private get hasField(): boolean {\n return this.variant !== 'modal';\n }\n\n private get isDocked(): boolean {\n return this.variant === 'docked';\n }\n\n /** Whether trigger `aria-expanded` should read as open (false during exit bloom). */\n private get triggerExpanded(): boolean {\n return this.open && !this.panelClosing;\n }\n\n connectedCallback() {\n this.syncViewToValue();\n }\n\n componentWillLoad() {\n this.defaultValue = this.value;\n this.syncFormValue();\n // Detect projected content from the light DOM up-front so conditionally\n // rendered slots (header / actions) appear on the very first render.\n this.hasSlottedHeader = !!this.el.querySelector('[slot=\"header\"]');\n this.hasSlottedActions = !!this.el.querySelector('[slot=\"actions\"]');\n this.hasSlottedLeading = !!this.el.querySelector('[slot=\"leading-icon\"]');\n this.hasSlottedCalendarIcon = !!this.el.querySelector('[slot=\"calendar-icon\"]');\n if (this.value) {\n this.seedFieldDraftFromValue();\n }\n if (this.open) {\n this.seedPending();\n this.lockScroll();\n this.gridShouldFocus = true;\n }\n }\n\n componentDidLoad() {\n const shadow = this.el.shadowRoot;\n if (!shadow) return;\n const watch = (name: string, set: (has: boolean) => void) => {\n const slot = shadow.querySelector(\n `slot[name=\"${name}\"]`,\n ) as HTMLSlotElement | null;\n if (!slot) return;\n const update = () => set(slot.assignedElements().length > 0);\n slot.addEventListener('slotchange', update);\n update();\n };\n watch('header', (h) => (this.hasSlottedHeader = h));\n watch('actions', (h) => (this.hasSlottedActions = h));\n watch('leading-icon', (h) => (this.hasSlottedLeading = h));\n watch('calendar-icon', (h) => (this.hasSlottedCalendarIcon = h));\n }\n\n disconnectedCallback() {\n this.unlockScroll();\n this.unbindDockedPositionListeners();\n }\n\n // ---- docked panel viewport positioning --------------------------------\n\n private getDockedViewportMargin(): number {\n return 16;\n }\n\n private resetDockedPanelPosition() {\n this.dockedPanelAlign = 'start';\n this.dockedPanelPlacement = 'below';\n this.dockedPanelMaxBlockSize = null;\n this.dockedPositionRafAttempts = 0;\n if (this.dockedPositionRafId) {\n cancelAnimationFrame(this.dockedPositionRafId);\n this.dockedPositionRafId = 0;\n }\n }\n\n /**\n * The panel's UNCONSTRAINED content height for viewport-overflow calculations,\n * measured with any `max-block-size` clamp momentarily lifted.\n *\n * The overflow decision must never depend on the clamp it produces. If it read\n * the clamped height, the sequence clamp → \"now it fits\" → unclamp → \"now it\n * overflows\" → clamp repeats every render — an infinite render loop that FREEZES\n * the page. It bit the docked selection menus hardest (the year menu re-renders\n * its whole list each cycle). Lifting the clamp for the measurement makes the\n * input independent of the output, so the decision settles in one pass. The\n * inline value is restored synchronously, so there is no visible flash.\n */\n private resolveDockedPanelBlockSize(panel: HTMLElement): number {\n const prev = panel.style.getPropertyValue('max-block-size');\n const prevPriority = panel.style.getPropertyPriority('max-block-size');\n panel.style.setProperty('max-block-size', 'none', 'important');\n const natural = panel.offsetHeight || panel.getBoundingClientRect().height;\n if (prev) {\n panel.style.setProperty('max-block-size', prev, prevPriority);\n } else {\n panel.style.removeProperty('max-block-size');\n }\n return natural;\n }\n\n private isRtl(): boolean {\n if (typeof window === 'undefined') return false;\n return getComputedStyle(this.el).direction === 'rtl';\n }\n\n /** Projected physical left/right for a docked panel width + anchor alignment. */\n private projectedHorizontalRect(\n anchorRect: DOMRect,\n panelW: number,\n align: 'start' | 'end',\n ): { left: number; right: number } {\n const rtl = this.isRtl();\n if (align === 'start') {\n if (rtl) {\n return { left: anchorRect.right - panelW, right: anchorRect.right };\n }\n return { left: anchorRect.left, right: anchorRect.left + panelW };\n }\n if (rtl) {\n return { left: anchorRect.left, right: anchorRect.left + panelW };\n }\n return { left: anchorRect.right - panelW, right: anchorRect.right };\n }\n\n /** Flip / clamp the docked popup so it stays inside the viewport. */\n private positionDockedPanel() {\n if (!this.isDocked || !this.open || this.panelClosing) return;\n\n const anchor =\n this.dockedAnchorEl ??\n (this.el.shadowRoot?.querySelector('.md-date-picker__docked-anchor') as\n | HTMLElement\n | null);\n const panel = this.panelEl;\n if (!anchor || !panel) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const panelW = panel.offsetWidth || panel.getBoundingClientRect().width;\n const measuredH = panel.offsetHeight || panel.getBoundingClientRect().height;\n\n if (panelW === 0 || measuredH === 0) {\n if (\n typeof requestAnimationFrame === 'function' &&\n this.dockedPositionRafAttempts < MdDatePicker.DOCKED_POSITION_RAF_MAX\n ) {\n this.dockedPositionRafAttempts += 1;\n cancelAnimationFrame(this.dockedPositionRafId);\n this.dockedPositionRafId = requestAnimationFrame(() => {\n this.dockedPositionRafId = 0;\n this.positionDockedPanel();\n });\n }\n return;\n }\n\n this.dockedPositionRafAttempts = 0;\n const panelH = this.resolveDockedPanelBlockSize(panel);\n\n const margin = this.getDockedViewportMargin();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const gap = 4;\n\n let align: 'start' | 'end' = 'start';\n let placement: 'below' | 'above' = 'below';\n let maxBlockSize: string | null = null;\n\n const startRect = this.projectedHorizontalRect(anchorRect, panelW, 'start');\n if (startRect.right > vw - margin) {\n const endRect = this.projectedHorizontalRect(anchorRect, panelW, 'end');\n if (endRect.left >= margin) {\n align = 'end';\n }\n }\n\n const activeRect = this.projectedHorizontalRect(anchorRect, panelW, align);\n if (activeRect.left < margin) {\n const endRect = this.projectedHorizontalRect(anchorRect, panelW, 'end');\n if (endRect.left >= margin) {\n align = 'end';\n }\n } else if (align === 'end') {\n const endRect = this.projectedHorizontalRect(anchorRect, panelW, 'end');\n if (endRect.left < margin) {\n const startAgain = this.projectedHorizontalRect(anchorRect, panelW, 'start');\n if (startAgain.right <= vw - margin) {\n align = 'start';\n }\n }\n }\n\n const belowBottom = anchorRect.bottom + gap + panelH;\n if (belowBottom > vh - margin) {\n const aboveTop = anchorRect.top - gap - panelH;\n if (aboveTop >= margin) {\n placement = 'above';\n } else {\n const availableBelow = vh - margin - anchorRect.bottom - gap;\n if (availableBelow > 0) {\n maxBlockSize = `${Math.floor(availableBelow)}px`;\n }\n }\n }\n\n if (placement === 'above') {\n const availableAbove = anchorRect.top - gap - margin;\n if (availableAbove > 0 && panelH > availableAbove) {\n maxBlockSize = `${Math.floor(availableAbove)}px`;\n }\n }\n\n const changed =\n this.dockedPanelAlign !== align ||\n this.dockedPanelPlacement !== placement ||\n this.dockedPanelMaxBlockSize !== maxBlockSize;\n\n if (changed) {\n this.dockedPanelAlign = align;\n this.dockedPanelPlacement = placement;\n this.dockedPanelMaxBlockSize = maxBlockSize;\n }\n }\n\n private bindDockedPositionListeners() {\n if (this.dockedPositionCleanup || typeof window === 'undefined') return;\n const onReposition = () => this.positionDockedPanel();\n window.addEventListener('resize', onReposition, { passive: true });\n window.addEventListener('scroll', onReposition, { passive: true, capture: true });\n this.dockedPositionCleanup = () => {\n window.removeEventListener('resize', onReposition);\n window.removeEventListener('scroll', onReposition, { capture: true });\n };\n }\n\n private unbindDockedPositionListeners() {\n this.dockedPositionCleanup?.();\n this.dockedPositionCleanup = null;\n }\n\n @Watch('value')\n @Watch('min')\n @Watch('max')\n onBoundsChange() {\n if (!this.open) this.syncViewToValue();\n }\n\n @Watch('dateSeparator')\n onDateSeparatorChange() {\n if (this.value) {\n this.seedFieldDraftFromValue();\n }\n }\n\n @Watch('open')\n onOpenChange(now: boolean, prev: boolean) {\n if (now === prev) return;\n if (now) {\n this.panelClosing = false;\n this.handleOpen();\n } else if (!this.closingFromDismiss && !this.panelClosing) {\n this.open = true;\n void this.dismissPanel();\n } else {\n this.handleClose();\n }\n }\n\n /** Open the picker. */\n @Method()\n async show(): Promise<void> {\n if (this.disabled) return;\n this.open = true;\n }\n\n /** Close the picker without committing. */\n @Method()\n async close(): Promise<void> {\n await this.dismissPanel();\n }\n\n /** Clear the current selection. */\n @Method()\n async clear(): Promise<void> {\n if (this.disabled) return;\n this.value = '';\n this.inputDraft = '';\n this.error = false;\n this.errorText = '';\n this.emitChange();\n }\n\n /** Move keyboard focus to the field's text input (if present). */\n @Method()\n async focusInput(): Promise<void> {\n const tfInput = this.el.shadowRoot\n ?.querySelector('md-text-field')\n ?.shadowRoot?.querySelector('.md-text-field__input') as HTMLInputElement | null;\n if (tfInput) {\n tfInput.focus();\n return;\n }\n this.triggerEl?.focus();\n }\n\n // ---- locale / formatting helpers --------------------------------------\n\n private get loc(): string | undefined {\n return this.locale || undefined;\n }\n\n private resolvedFirstDay(): number {\n if (this.firstDayOfWeek >= 0 && this.firstDayOfWeek <= 6) {\n return this.firstDayOfWeek;\n }\n return getFirstDayOfWeek(this.locale);\n }\n\n private formatHeadline(d: Date | null): string {\n if (!d) return '';\n return new Intl.DateTimeFormat(this.loc, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n }).format(d);\n }\n\n private formatField(d: Date | null): string {\n if (!d) return '';\n return formatDisplayDate(d, this.loc, this.dateSeparator || undefined);\n }\n\n private formatMonthYear(year: number, month: number): string {\n return new Intl.DateTimeFormat(this.loc, {\n month: 'long',\n year: 'numeric',\n }).format(new Date(year, month, 1));\n }\n\n private formatFullDate(d: Date): string {\n return new Intl.DateTimeFormat(this.loc, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(d);\n }\n\n /** Locale-aware date format hint (e.g. `MM/DD/YYYY` or `DD.MM.YYYY`). */\n private dateFormatHint(): string {\n return dateFormatPattern(this.loc, this.dateSeparator || undefined);\n }\n\n // ---- state sync -------------------------------------------------------\n\n private syncViewToValue() {\n const anchor =\n parseIsoDate(this.value) ?? parseIsoDate(this.min) ?? new Date();\n this.viewYear = anchor.getFullYear();\n this.viewMonth = anchor.getMonth();\n this.focusedDate = clampDate(anchor, this.min, this.max);\n }\n\n private seedPending() {\n this.viewMode = 'calendar';\n this.pendingDate = parseIsoDate(this.value);\n this.seedFieldDraftFromValue();\n this.syncViewToValue();\n }\n\n private handleOpen() {\n this.restoreFocusEl =\n typeof document !== 'undefined'\n ? ((document.activeElement as HTMLElement) ?? null)\n : null;\n this.inputMode = this.variant === 'modal-input' ? false : this.inputMode;\n this.monthMenuOpen = false;\n this.yearMenuOpen = false;\n this.clearYearListRange();\n this.yearViewClosing = false;\n this.clearModalCalendarBloom();\n this.resetDockedPanelPosition();\n this.seedPending();\n this.lockScroll();\n this.mdOpen.emit();\n this.gridShouldFocus = true;\n if (this.isDocked) {\n this.bindDockedPositionListeners();\n }\n }\n\n private handleClose() {\n this.unlockScroll();\n this.unbindDockedPositionListeners();\n this.resetDockedPanelPosition();\n this.panelPointerEngaged = false;\n this.panelClosing = false;\n this.clearDockedCalendarBloom();\n this.clearModalCalendarBloom();\n this.yearViewClosing = false;\n this.monthMenuOpen = false;\n this.yearMenuOpen = false;\n this.selectionMenuClosing = null;\n this.clearYearListRange();\n this.mdClose.emit();\n const restore = this.restoreFocusEl ?? this.triggerEl ?? null;\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => restore?.focus?.());\n } else {\n restore?.focus?.();\n }\n }\n\n /** Animated panel dismiss — bloom-out then unmount (docked + modal). */\n private async dismissPanel(): Promise<void> {\n if (!this.open || this.panelClosing) return;\n\n if (\n this.isDocked &&\n (this.monthMenuOpen || this.yearMenuOpen || this.selectionMenuClosing)\n ) {\n await this.closeDockedMenusAnimated(null, false);\n }\n\n if (this.prefersReducedMotion()) {\n this.closingFromDismiss = true;\n this.open = false;\n this.closingFromDismiss = false;\n return;\n }\n\n this.panelClosing = true;\n await this.delay(this.panelBloomOutMs());\n this.closingFromDismiss = true;\n this.open = false;\n this.panelClosing = false;\n this.closingFromDismiss = false;\n }\n\n private lockScroll() {\n if (this.isDocked) return;\n try {\n document.body.style.setProperty('overflow', 'hidden');\n } catch {\n /* SSR / no document */\n }\n }\n\n private unlockScroll() {\n try {\n document.body.style.removeProperty('overflow');\n } catch {\n /* noop */\n }\n }\n\n // ---- selection / commit ----------------------------------------------\n\n private isDisabledDate(d: Date): boolean {\n if (isOutOfRange(d, this.min, this.max)) return true;\n if (this.isDateDisabled && this.isDateDisabled(d)) return true;\n return false;\n }\n\n private isDisabledYear(year: number): boolean {\n const minDate = parseIsoDate(this.min);\n const maxDate = parseIsoDate(this.max);\n if (minDate && year < minDate.getFullYear()) return true;\n if (maxDate && year > maxDate.getFullYear()) return true;\n return false;\n }\n\n private lastSelectedEmitValue: string | null = null;\n\n private emitChange() {\n const date = parseIsoDate(this.value);\n this.mdChange.emit({ value: this.value, date });\n }\n\n private emitSelected(date: Date) {\n const value = toIsoDate(date);\n if (this.lastSelectedEmitValue === value) return;\n this.lastSelectedEmitValue = value;\n this.mdSelected.emit({ value, date });\n void Promise.resolve().then(() => {\n this.lastSelectedEmitValue = null;\n });\n }\n\n private emitViewChange(source: MdDatePickerViewChangeSource) {\n this.mdViewChange.emit({\n month: this.viewMonth,\n year: this.viewYear,\n source,\n });\n }\n\n private emitMenuOpen(type: 'month' | 'year') {\n this.mdMenuOpen.emit({ type });\n }\n\n private emitMenuSelect(type: 'month' | 'year', value: number, label?: string) {\n this.mdMenuSelect.emit({ type, value, label });\n }\n\n private emitModeChange(mode: MdDatePickerMode) {\n this.mdModeChange.emit({ mode });\n }\n\n private monthLabel(month: number): string {\n return new Intl.DateTimeFormat(this.loc, { month: 'long' }).format(\n new Date(2024, month, 1),\n );\n }\n\n private selectDay(cell: DayCell) {\n const d = cell.date;\n if (this.isDisabledDate(d)) return;\n this.closeMenus(null, false);\n this.focusedDate = d;\n if (cell.outOfMonth) {\n this.viewYear = d.getFullYear();\n this.viewMonth = d.getMonth();\n }\n // All variants — including docked — stage the selection and commit on OK\n // so the Cancel / OK action row is meaningful everywhere.\n this.pendingDate = d;\n this.emitSelected(d);\n // …unless the consumer opted out of the confirm step, in which case the\n // same click commits. mdSelected still fires first, so a listener that\n // treats it as \"the user picked something\" keeps working either way.\n if (this.commitOnSelect) this.commit();\n }\n\n private commit() {\n if (this.pendingDate) {\n this.value = toIsoDate(this.pendingDate);\n this.inputDraft = this.formatField(this.pendingDate);\n this.error = false;\n this.errorText = '';\n }\n this.emitChange();\n void this.dismissPanel();\n }\n\n private cancel() {\n this.mdCancel.emit();\n void this.dismissPanel();\n }\n\n private requestDismiss() {\n this.cancel();\n }\n\n // ---- text-entry handling ---------------------------------------------\n\n private onFieldInput = (e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n this.inputDraft = v;\n this.mdInput.emit({ value: v });\n };\n\n /** Read the live typed value from a trigger-field key target before commit. */\n private syncInputDraftFromField(target: EventTarget | null): void {\n const el = this.asEventElement(target);\n if (!el) return;\n const input = el.closest(\n 'input:not([readonly]):not([disabled]), textarea:not([readonly]):not([disabled])',\n ) as HTMLInputElement | HTMLTextAreaElement | null;\n if (input) {\n this.inputDraft = input.value;\n return;\n }\n const tf = el.closest('md-text-field') as (HTMLElement & { value?: string }) | null;\n if (tf) {\n this.inputDraft = tf.value ?? this.inputDraft;\n }\n }\n\n /**\n * Keep the md-text-field input in sync after commit while focus remains.\n * md-text-field skips display sync on external value updates during focus.\n */\n private syncTextFieldDisplay(): void {\n if (this.variant === 'modal') return;\n const tf = this.el.shadowRoot?.querySelector('md-text-field') as\n | (HTMLElement & { value?: string })\n | null;\n if (!tf) return;\n tf.value = this.inputDraft;\n const input = tf.shadowRoot?.querySelector('.md-text-field__input') as\n | HTMLInputElement\n | null;\n if (input) {\n input.value = this.inputDraft;\n }\n }\n\n /** Keep the modal typed-entry md-text-field in sync after parse/format. */\n private syncEntryTextFieldDisplay(): void {\n if (!this.entryTextFieldEl) return;\n const tf = this.entryTextFieldEl as HTMLElement & { value?: string };\n tf.value = this.inputDraft;\n const input = tf.shadowRoot?.querySelector('.md-text-field__input') as\n | HTMLInputElement\n | null;\n if (input) {\n input.value = this.inputDraft;\n }\n }\n\n private onFieldCommit = () => {\n const raw = this.inputDraft.trim();\n if (!raw) {\n this.value = '';\n this.inputDraft = '';\n this.error = false;\n this.errorText = '';\n this.emitChange();\n this.syncTextFieldDisplay();\n return;\n }\n const parsed = parseFlexibleDateInput(\n raw,\n this.locale,\n this.dateSeparator || undefined,\n );\n if (!parsed || this.isDisabledDate(parsed)) {\n this.error = true;\n this.errorText = this.errorText || (this.invalidDateLabel ?? 'Invalid date');\n return;\n }\n this.value = toIsoDate(parsed);\n this.inputDraft = this.formatField(parsed);\n this.error = false;\n this.errorText = '';\n this.syncViewToValue();\n this.emitChange();\n this.syncTextFieldDisplay();\n };\n\n private seedFieldDraftFromValue() {\n const selected = parseIsoDate(this.value);\n this.inputDraft = selected ? this.formatField(selected) : '';\n }\n\n private commitDialogInput() {\n const raw = this.inputDraft.trim();\n if (!raw) {\n this.error = false;\n this.errorText = '';\n this.pendingDate = null;\n return;\n }\n const parsed = parseFlexibleDateInput(\n raw,\n this.locale,\n this.dateSeparator || undefined,\n );\n if (!parsed || this.isDisabledDate(parsed)) {\n this.error = true;\n this.errorText = this.invalidDateLabel ?? 'Invalid date';\n return;\n }\n this.error = false;\n this.errorText = '';\n this.pendingDate = parsed;\n this.inputDraft = this.formatField(parsed);\n this.syncEntryTextFieldDisplay();\n this.viewYear = parsed.getFullYear();\n this.viewMonth = parsed.getMonth();\n this.focusedDate = parsed;\n }\n\n // ---- navigation -------------------------------------------------------\n\n private setGridSlideDirection(delta: number) {\n if (this.prefersReducedMotion()) return;\n if (\n this.monthMenuOpen ||\n this.yearMenuOpen ||\n this.selectionMenuClosing ||\n this.dockedCalendarBloom\n ) {\n return;\n }\n this.gridSlideDirection = delta > 0 ? 'forward' : 'backward';\n }\n\n private onGridSlideAnimationEnd = (e: AnimationEvent) => {\n if (e.target !== e.currentTarget) return;\n const name = e.animationName ?? '';\n if (!name.includes('md-date-picker-grid-slide')) return;\n this.gridSlideDirection = null;\n };\n\n private goToMonth(delta: number, fromUser = false) {\n this.setGridSlideDirection(delta);\n const ref = addMonths(new Date(this.viewYear, this.viewMonth, 1), delta);\n this.viewYear = ref.getFullYear();\n this.viewMonth = ref.getMonth();\n if (fromUser) {\n this.emitViewChange('chevron-month');\n }\n }\n\n private goToYear(delta: number, fromUser = false) {\n this.setGridSlideDirection(delta);\n this.viewYear += delta;\n if (\n this.yearMenuOpen ||\n this.selectionMenuClosing === 'year' ||\n this.viewMode === 'year' ||\n this.yearViewClosing\n ) {\n this.captureYearListRange();\n }\n if (fromUser) {\n this.emitViewChange('chevron-year');\n }\n }\n\n /** Accessible label for month/year nav chevrons (docked + modal). */\n private navActionLabel(scope: 'month' | 'year', side: 'prev' | 'next'): string {\n if (scope === 'month') {\n return side === 'prev'\n ? (this.previousMonthLabel ?? 'Previous month')\n : (this.nextMonthLabel ?? 'Next month');\n }\n return side === 'prev'\n ? (this.previousYearLabel ?? 'Previous year')\n : (this.nextYearLabel ?? 'Next year');\n }\n\n /** Keyboard shortcut hint matching the day-grid `onGridKeyDown` handlers. */\n private navShortcutKey(scope: 'month' | 'year', side: 'prev' | 'next'): string {\n if (scope === 'month') {\n return side === 'prev' ? 'Page Up' : 'Page Down';\n }\n return side === 'prev' ? 'Shift+Page Up' : 'Shift+Page Down';\n }\n\n /** Tooltip + `aria-description` text (via `md-tooltip`) for nav chevrons. */\n private navTooltipText(scope: 'month' | 'year', side: 'prev' | 'next'): string {\n return `${this.navActionLabel(scope, side)} (${this.navShortcutKey(scope, side)})`;\n }\n\n /** Keyboard shortcut for docked month/year menu buttons (day grid). */\n private menuShortcutKey(kind: 'month' | 'year'): string {\n return kind === 'month' ? 'Shift+M' : 'Shift+Y';\n }\n\n /** Tooltip + `aria-description` for docked month/year menu triggers. */\n private menuTooltipText(kind: 'month' | 'year'): string {\n if (kind === 'month') {\n const fullMonth = new Intl.DateTimeFormat(this.loc, { month: 'long' }).format(\n new Date(this.viewYear, this.viewMonth, 1),\n );\n return `${fullMonth} · ${this.chooseMonthLabel} (${this.menuShortcutKey(kind)})`;\n }\n return `${this.chooseYearLabel} (${this.menuShortcutKey(kind)})`;\n }\n\n /** Snapshot year-list bounds for the active year-selection surface. */\n private captureYearListRange() {\n const current = this.viewYear;\n this.yearListMinYear =\n parseIsoDate(this.min)?.getFullYear() ?? current - 100;\n this.yearListMaxYear =\n parseIsoDate(this.max)?.getFullYear() ?? current + 100;\n }\n\n private clearYearListRange() {\n this.yearListMinYear = null;\n this.yearListMaxYear = null;\n }\n\n private getYearListBounds(): { minYear: number; maxYear: number } {\n if (this.yearListMinYear != null && this.yearListMaxYear != null) {\n return { minYear: this.yearListMinYear, maxYear: this.yearListMaxYear };\n }\n const current = this.viewYear;\n return {\n minYear: parseIsoDate(this.min)?.getFullYear() ?? current - 100,\n maxYear: parseIsoDate(this.max)?.getFullYear() ?? current + 100,\n };\n }\n\n // ---- docked month / year dropdown menus -------------------------------\n\n private closeMenus(keep: 'month' | 'year' | null, restoreFocus: boolean) {\n if (this.isDocked) {\n void this.closeDockedMenusAnimated(keep, restoreFocus);\n return;\n }\n if (keep !== 'month' && this.monthMenuOpen) {\n this.monthMenuOpen = false;\n if (restoreFocus) this.restoreMenuFocus(this.monthMenuButtonEl);\n }\n if (keep !== 'year' && this.yearMenuOpen) {\n this.yearMenuOpen = false;\n this.clearYearListRange();\n if (restoreFocus) this.restoreMenuFocus(this.yearMenuButtonEl);\n }\n }\n\n /** Animated close for docked month/year menus (toggle, pick, Escape, day select). */\n private async closeDockedSelectionMenu(\n kind: 'month' | 'year',\n options: { bloomCalendar?: boolean; restoreFocus?: boolean } = {},\n ) {\n const { bloomCalendar = true, restoreFocus = true } = options;\n const isOpen = kind === 'month' ? this.monthMenuOpen : this.yearMenuOpen;\n if (!isOpen || this.selectionMenuClosing === kind) return;\n\n this.selectionMenuClosing = kind;\n await this.delay(this.selectionBloomOutMs());\n this.selectionMenuClosing = null;\n if (kind === 'month') {\n this.monthMenuOpen = false;\n } else {\n this.yearMenuOpen = false;\n this.clearYearListRange();\n }\n if (restoreFocus) {\n this.gridShouldFocus = false;\n this.menuRestoreFocus = kind;\n } else if (bloomCalendar && !this.monthMenuOpen && !this.yearMenuOpen) {\n this.gridShouldFocus = true;\n }\n if (bloomCalendar && !this.monthMenuOpen && !this.yearMenuOpen) {\n this.beginDockedCalendarBloom();\n } else if (this.isDocked && !this.monthMenuOpen && !this.yearMenuOpen) {\n this.positionDockedPanel();\n }\n }\n\n private async closeDockedMenusAnimated(\n keep: 'month' | 'year' | null,\n restoreFocus: boolean,\n ) {\n const bloomCalendar = keep === null;\n if (keep !== 'month' && this.monthMenuOpen) {\n await this.closeDockedSelectionMenu('month', { bloomCalendar, restoreFocus });\n }\n if (keep !== 'year' && this.yearMenuOpen) {\n await this.closeDockedSelectionMenu('year', { bloomCalendar, restoreFocus });\n }\n }\n\n private openDockedMonthMenu() {\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.yearMenuOpen = false;\n this.monthMenuOpen = true;\n this.menuShouldFocus = 'month';\n this.emitMenuOpen('month');\n }\n\n private openDockedYearMenu() {\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.monthMenuOpen = false;\n this.captureYearListRange();\n this.yearMenuOpen = true;\n this.menuShouldFocus = 'year';\n this.emitMenuOpen('year');\n }\n\n /** Menu stays visually expanded through bloom-out (`selectionMenuClosing`). */\n private isDockedMonthMenuExpanded(): boolean {\n return this.monthMenuOpen || this.selectionMenuClosing === 'month';\n }\n\n private isDockedYearMenuExpanded(): boolean {\n return this.yearMenuOpen || this.selectionMenuClosing === 'year';\n }\n\n /** Which docked selection menu to render (at most one; handles swap transitions). */\n private dockedSelectionMenuToShow(): 'month' | 'year' | null {\n if (this.monthMenuOpen && this.yearMenuOpen) {\n if (this.selectionMenuClosing === 'year') return 'month';\n if (this.selectionMenuClosing === 'month') return 'year';\n return 'year';\n }\n if (this.yearMenuOpen || this.selectionMenuClosing === 'year') return 'year';\n if (this.monthMenuOpen || this.selectionMenuClosing === 'month') return 'month';\n return null;\n }\n\n /**\n * Trailing caret on docked month/year menu buttons.\n * Collapsed: caret down; active (open or bloom-out): caret up (matches md-select).\n */\n private dockedMenuTrailingIcon(expanded: boolean): string {\n return expanded ? 'arrow_drop_up' : 'arrow_drop_down';\n }\n\n /** Crossfading trailing carets (down/up) on docked month/year menu triggers. */\n private renderDockedMenuTrailingCaret(expanded: boolean) {\n return (\n <span\n slot=\"trailing-icon\"\n class=\"md-date-picker__menu-caret\"\n part=\"menu-caret\"\n aria-hidden=\"true\"\n >\n <span\n class={{\n 'md-date-picker__menu-caret-glyph': true,\n 'material-symbols-outlined': true,\n 'md-date-picker__menu-caret-glyph--down': true,\n 'md-date-picker__menu-caret-glyph--visible': !expanded,\n }}\n >\n arrow_drop_down\n </span>\n <span\n class={{\n 'md-date-picker__menu-caret-glyph': true,\n 'material-symbols-outlined': true,\n 'md-date-picker__menu-caret-glyph--up': true,\n 'md-date-picker__menu-caret-glyph--visible': expanded,\n }}\n >\n arrow_drop_up\n </span>\n </span>\n );\n }\n\n private restoreMenuFocus(el?: HTMLElement) {\n if (!el) return;\n const run = () => el.focus();\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n /**\n * Scroll container for inline-fill docked menus — the menu's\n * `.md-menu__scroll-shadow` scroll viewport when the menu is capped,\n * otherwise `.md-menu__surface`.\n */\n private getDockedSelectionMenuScrollEl(menuHost: HTMLElement): HTMLElement | null {\n const menuShadow = menuHost.shadowRoot;\n if (!menuShadow) return null;\n\n // Capped/inline-fill menus scroll inside a `.md-menu__scroll-shadow` viewport\n // div; plain (uncapped) menus scroll on the surface itself.\n return (\n (menuShadow.querySelector('.md-menu__scroll-shadow') as HTMLElement | null) ??\n (menuShadow.querySelector('.md-menu__surface') as HTMLElement | null)\n );\n }\n\n /**\n * Scroll the selected radio item into view inside the inline-fill menu scroll\n * viewport. Runs after the menu DOM is painted.\n */\n private getDockedSelectionMenuTarget(kind: 'month' | 'year'): HTMLElement | null {\n const part = kind === 'month' ? 'month-menu' : 'year-menu';\n const menu = this.panelEl?.querySelector<HTMLElement>(`[part=\"${part}\"]`);\n if (!menu) return null;\n return (\n menu.querySelector<HTMLElement>('md-menu-item[selected]') ??\n menu.querySelector<HTMLElement>(`md-menu-item[part*=\"${kind}-option-selected\"]`) ??\n menu.querySelector<HTMLElement>('md-menu-item')\n );\n }\n\n private scrollDockedSelectionMenuIntoView(kind: 'month' | 'year') {\n const part = kind === 'month' ? 'month-menu' : 'year-menu';\n const menuHost = this.panelEl?.querySelector<HTMLElement>(`[part=\"${part}\"]`);\n if (!menuHost) return;\n\n const selected = this.getDockedSelectionMenuTarget(kind);\n if (!selected) return;\n\n const scrollEl = this.getDockedSelectionMenuScrollEl(menuHost);\n if (scrollEl) {\n const scrollRect = scrollEl.getBoundingClientRect();\n const itemRect = selected.getBoundingClientRect();\n const itemCenter = itemRect.top + itemRect.height / 2;\n const scrollCenter = scrollRect.top + scrollRect.height / 2;\n scrollEl.scrollTop += itemCenter - scrollCenter;\n return;\n }\n\n if (typeof selected.scrollIntoView === 'function') {\n selected.scrollIntoView({ block: 'center', inline: 'nearest' });\n }\n }\n\n private afterDockedSelectionMenuPaint(kind: 'month' | 'year') {\n const run = () => {\n this.scrollDockedSelectionMenuIntoView(kind);\n this.getDockedSelectionMenuTarget(kind)?.focus();\n };\n\n // Defer scroll/focus until the expressive bloom finishes — immediate\n // scrollIntoView on the 201-item year list interrupts the animation.\n const delay = this.selectionBloomInMs();\n if (delay > 0) {\n void this.delay(delay).then(run);\n return;\n }\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n /**\n * Approximate scrollTop to center `viewYear` — matches default `--_year-*` CSS tokens so\n * the active year is visible on first paint before layout measurement.\n */\n private calculateModalYearGridScrollTop(): number {\n const columns = 3;\n const blockSize = 36;\n const gap = 12;\n const paddingBlockStart = 8;\n const paddingBlockEnd = 16;\n const viewportBlockSize = 288;\n\n const { minYear, maxYear } = this.getYearListBounds();\n const yearCount = maxYear - minYear + 1;\n const index = Math.max(0, Math.min(this.viewYear - minYear, yearCount - 1));\n const row = Math.floor(index / columns);\n const rowCount = Math.ceil(yearCount / columns);\n const rowStride = blockSize + gap;\n const contentBlockSize =\n paddingBlockStart + rowCount * blockSize + Math.max(0, rowCount - 1) * gap + paddingBlockEnd;\n const itemBlockStart = paddingBlockStart + row * rowStride;\n const itemCenter = itemBlockStart + blockSize / 2;\n const target = itemCenter - viewportBlockSize / 2;\n const maxScroll = Math.max(0, contentBlockSize - viewportBlockSize);\n return Math.max(0, Math.min(target, maxScroll));\n }\n\n /**\n * Scroll container for the modal year grid — the plain\n * `.md-date-picker__year-grid-scroll` viewport.\n */\n private getModalYearGridScrollEl(): HTMLElement | null {\n const wrap = this.panelEl?.querySelector<HTMLElement>('[part=\"year-grid-wrap\"]');\n if (!wrap) return null;\n\n return wrap.querySelector<HTMLElement>('.md-date-picker__year-grid-scroll') ?? null;\n }\n\n /** Scroll the selected year cell into the center of the modal year grid viewport. */\n private scrollModalYearGridIntoView() {\n const scrollEl = this.getModalYearGridScrollEl();\n if (!scrollEl) return;\n\n scrollEl.scrollTop = this.calculateModalYearGridScrollTop();\n\n const selected =\n scrollEl.querySelector<HTMLElement>(`[data-year=\"${this.viewYear}\"]`) ??\n scrollEl.querySelector<HTMLElement>('[part~=\"year-selected\"]');\n if (!selected) return;\n\n const scrollRect = scrollEl.getBoundingClientRect();\n const itemRect = selected.getBoundingClientRect();\n const itemCenter = itemRect.top + itemRect.height / 2;\n const scrollCenter = scrollRect.top + scrollRect.height / 2;\n scrollEl.scrollTop += itemCenter - scrollCenter;\n }\n\n private afterModalYearGridPaint() {\n const run = () => this.scrollModalYearGridIntoView();\n\n // Unlike docked menus, scrolling the inner overflow grid does not interrupt the\n // wrap bloom animation — deferring 450ms made the year list jump after open.\n this.scrollModalYearGridIntoView();\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n private prefersReducedMotion(): boolean {\n // matchMedia is absent from Stencil's SSR mock, so optional-chain it (this\n // method is only reached post-render today, but harden to match the codebase).\n return (\n typeof window !== 'undefined' &&\n (window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches ?? false)\n );\n }\n\n private selectionBloomInMs(): number {\n return this.prefersReducedMotion() ? 0 : DOCKED_SELECTION_BLOOM_IN_MS;\n }\n\n private selectionBloomOutMs(): number {\n return this.prefersReducedMotion() ? 0 : DOCKED_SELECTION_BLOOM_OUT_MS;\n }\n\n private calendarBloomInMs(): number {\n return this.prefersReducedMotion() ? 0 : DOCKED_CALENDAR_BLOOM_IN_MS;\n }\n\n private panelBloomOutMs(): number {\n return this.prefersReducedMotion() ? 0 : PANEL_BLOOM_OUT_MS;\n }\n\n private delay(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private beginDockedCalendarBloom() {\n if (this.prefersReducedMotion()) {\n this.dockedCalendarBloom = false;\n return;\n }\n this.dockedCalendarBloom = true;\n void this.delay(this.calendarBloomInMs()).then(() => {\n if (!this.monthMenuOpen && !this.yearMenuOpen && !this.selectionMenuClosing) {\n this.dockedCalendarBloom = false;\n this.positionDockedPanel();\n }\n });\n }\n\n private clearDockedCalendarBloom() {\n this.dockedCalendarBloom = false;\n }\n\n private beginModalCalendarBloom() {\n if (this.prefersReducedMotion() || this.isDocked) {\n this.modalCalendarBloom = false;\n return;\n }\n this.modalCalendarBloom = true;\n void this.delay(this.calendarBloomInMs()).then(() => {\n if (this.viewMode === 'calendar' && !this.yearViewClosing) {\n this.modalCalendarBloom = false;\n }\n });\n }\n\n private clearModalCalendarBloom() {\n this.modalCalendarBloom = false;\n }\n\n private async waitForSelectionMenuClose(kind: 'month' | 'year') {\n while (this.selectionMenuClosing === kind) {\n await this.delay(16);\n }\n }\n\n private toggleMonthMenu = () => {\n void this.toggleMonthMenuAsync();\n };\n\n private async toggleMonthMenuAsync() {\n if (this.monthMenuOpen) {\n await this.closeDockedSelectionMenu('month', { bloomCalendar: true, restoreFocus: true });\n return;\n }\n if (this.yearMenuOpen) {\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.monthMenuOpen = true;\n this.menuShouldFocus = 'month';\n this.emitMenuOpen('month');\n await this.closeDockedSelectionMenu('year', {\n bloomCalendar: false,\n restoreFocus: false,\n });\n return;\n }\n if (this.selectionMenuClosing === 'year') {\n await this.waitForSelectionMenuClose('year');\n }\n this.openDockedMonthMenu();\n }\n\n private toggleYearMenu = () => {\n void this.toggleYearMenuAsync();\n };\n\n private async toggleYearMenuAsync() {\n if (this.yearMenuOpen) {\n await this.closeDockedSelectionMenu('year', { bloomCalendar: true, restoreFocus: true });\n return;\n }\n if (this.monthMenuOpen) {\n this.captureYearListRange();\n this.clearDockedCalendarBloom();\n this.selectionMenuClosing = null;\n this.menuRestoreFocus = null;\n this.yearMenuOpen = true;\n this.menuShouldFocus = 'year';\n this.emitMenuOpen('year');\n await this.closeDockedSelectionMenu('month', {\n bloomCalendar: false,\n restoreFocus: false,\n });\n return;\n }\n if (this.selectionMenuClosing === 'month') {\n await this.waitForSelectionMenuClose('month');\n }\n this.openDockedYearMenu();\n }\n\n /**\n * Docked month/year menu: wait for the activated item's ripple to finish,\n * then apply the selection and return to the day grid.\n */\n private async pickDockedSelection(\n kind: 'month' | 'year',\n apply: () => void,\n item?: EventTarget | null,\n ) {\n const host = item instanceof HTMLElement ? item : null;\n if (host) {\n await waitForHostRipple(host);\n }\n apply();\n await this.closeDockedSelectionMenu(kind, { bloomCalendar: true, restoreFocus: false });\n }\n\n private pickMonth(month: number, item?: EventTarget | null) {\n void this.pickDockedSelection('month', () => {\n this.viewMonth = month;\n this.emitMenuSelect('month', month, this.monthLabel(month));\n this.emitViewChange('month-menu');\n }, item);\n }\n\n private pickYear(year: number, item?: EventTarget | null) {\n void this.pickDockedSelection('year', () => {\n this.viewYear = year;\n this.emitMenuSelect('year', year, String(year));\n this.emitViewChange('year-menu');\n }, item);\n }\n\n private onMonthMenuClose = () => {\n if (!this.monthMenuOpen) return;\n void this.closeDockedSelectionMenu('month', { bloomCalendar: true, restoreFocus: true });\n };\n\n private onYearMenuClose = () => {\n if (!this.yearMenuOpen) return;\n void this.closeDockedSelectionMenu('year', { bloomCalendar: true, restoreFocus: true });\n };\n\n private selectYear(year: number) {\n if (this.isDisabledYear(year)) return;\n this.viewYear = year;\n this.focusedDate = new Date(year, this.viewMonth, 1);\n this.emitMenuSelect('year', year, String(year));\n this.emitViewChange('year-menu');\n void this.closeYearViewAnimated();\n }\n\n private openYearView() {\n this.clearModalCalendarBloom();\n this.yearViewClosing = false;\n this.viewMode = 'year';\n this.captureYearListRange();\n this.yearGridShouldScroll = true;\n this.emitMenuOpen('year');\n }\n\n /** Animated close for modal / range year grid (toggle, pick). */\n private async closeYearViewAnimated() {\n if (this.viewMode !== 'year' || this.yearViewClosing) return;\n\n if (this.prefersReducedMotion()) {\n this.viewMode = 'calendar';\n this.clearYearListRange();\n return;\n }\n\n this.yearViewClosing = true;\n await this.delay(this.selectionBloomOutMs());\n this.yearViewClosing = false;\n this.viewMode = 'calendar';\n this.clearYearListRange();\n this.beginModalCalendarBloom();\n }\n\n private toggleYearView = () => {\n if (this.viewMode === 'year') {\n void this.closeYearViewAnimated();\n } else {\n this.openYearView();\n }\n };\n\n private toggleInputMode = () => {\n if (this.inputMode) {\n this.commitDialogInput();\n if (this.error) return;\n } else {\n // entering input mode: seed draft from pending selection\n this.inputDraft = this.pendingDate ? this.formatField(this.pendingDate) : '';\n }\n this.inputMode = !this.inputMode;\n this.viewMode = 'calendar';\n this.emitModeChange(this.inputMode ? 'input' : 'calendar');\n if (this.inputMode) {\n this.entryInputShouldFocus = true;\n }\n };\n\n /** Normalize navigation keys — some Mac / IME layouts report Page Up/Down via `code`. */\n private resolveNavigationKey(e: KeyboardEvent): string {\n if (e.key === 'PageUp' || e.code === 'PageUp') return 'PageUp';\n if (e.key === 'PageDown' || e.code === 'PageDown') return 'PageDown';\n // Mac compact keyboards: Option/Alt+↑/↓ is a common Page Up/Down fallback.\n if (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) {\n if (e.key === 'ArrowUp' || e.code === 'ArrowUp') return 'PageUp';\n if (e.key === 'ArrowDown' || e.code === 'ArrowDown') return 'PageDown';\n }\n return e.key;\n }\n\n private asEventElement(target: EventTarget | null): Element | null {\n if (target == null || typeof target !== 'object') return null;\n if (!('closest' in target) || typeof (target as Element).closest !== 'function') {\n return null;\n }\n return target as Element;\n }\n\n private isEditableKeyTarget(target: EventTarget | null): boolean {\n const el = this.asEventElement(target);\n if (!el) return false;\n const editable = el.closest(\n 'input:not([readonly]):not([disabled]), textarea:not([disabled]), [contenteditable=\"true\"]',\n );\n return !!editable;\n }\n\n private isInsideSelectionMenu(target: EventTarget | null): boolean {\n return (\n !!this.findInPickerTree(target, '[part=\"month-menu\"]') ||\n !!this.findInPickerTree(target, '[part=\"year-menu\"]')\n );\n }\n\n /** Walk up through shadow boundaries to find a matching ancestor. */\n private findInPickerTree(target: EventTarget | null, selector: string): Element | null {\n const el = this.asEventElement(target);\n if (!el) return null;\n let current: Element | null = el;\n while (current) {\n try {\n if (current.matches(selector)) return current;\n } catch {\n /* invalid selector */\n }\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n current = root.host;\n } else {\n current = current.parentElement;\n }\n }\n return null;\n }\n\n /** True when keyboard target/focus is on a day cell in the calendar grid. */\n private isDayGridKeyTarget(target: EventTarget | null): boolean {\n if (this.findInPickerTree(target, '[data-date]')) return true;\n if (typeof document !== 'undefined') {\n return !!this.findInPickerTree(document.activeElement, '[data-date]');\n }\n return false;\n }\n\n private isDockedMenuToggleKey(e: KeyboardEvent): boolean {\n if (!this.isDocked || !e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) return false;\n const letter = e.key.toLowerCase();\n return letter === 'm' || letter === 'y';\n }\n\n private isCalendarNavigationKey(e: KeyboardEvent): boolean {\n const key = this.resolveNavigationKey(e);\n if (\n key === 'ArrowRight' ||\n key === 'ArrowLeft' ||\n key === 'ArrowDown' ||\n key === 'ArrowUp' ||\n key === 'Home' ||\n key === 'End' ||\n key === 'PageUp' ||\n key === 'PageDown' ||\n key === 'Enter' ||\n key === ' '\n ) {\n return true;\n }\n return this.isDockedMenuToggleKey(e);\n }\n\n private canHandleCalendarKeyDown(e: KeyboardEvent, target?: EventTarget | null): boolean {\n if (!this.open || e.defaultPrevented) return false;\n if (this.viewMode !== 'calendar' || this.inputMode) return false;\n const menuToggle = this.isDockedMenuToggleKey(e);\n if (!menuToggle && (this.monthMenuOpen || this.yearMenuOpen || this.selectionMenuClosing)) {\n return false;\n }\n if (!this.isCalendarNavigationKey(e)) return false;\n\n const t = target ?? e.target;\n if (this.isEditableKeyTarget(t)) {\n // Route navigation shortcuts from the trigger field while the panel is open\n // so users need not Tab into the day grid first (docked / modal-input).\n if (!(this.hasField && this.isTriggerFieldTarget(t))) return false;\n // Enter commits typed text — the field's own handler formats on Enter.\n if (this.resolveNavigationKey(e) === 'Enter') return false;\n }\n if (!menuToggle && this.isInsideSelectionMenu(t)) return false;\n\n const key = this.resolveNavigationKey(e);\n if (key === 'Enter' || key === ' ') {\n if (!this.isDayGridKeyTarget(t) && !this.isDayGridKeyTarget(e.target)) {\n return false;\n }\n }\n\n return true;\n }\n\n /** Event path (composed), with a parent-walk fallback for older test environments. */\n private getEventPathNodes(e: Event): EventTarget[] {\n if (typeof e.composedPath === 'function') {\n return e.composedPath();\n }\n const nodes: EventTarget[] = [];\n let node: Node | null = e.target as Node | null;\n while (node) {\n nodes.push(node);\n const root = node.getRootNode();\n if (root instanceof ShadowRoot) {\n node = root.host;\n } else {\n node = node.parentNode;\n }\n }\n return nodes;\n }\n\n /** True when `node` is this picker or any nested shadow descendant. */\n private isNodeInPicker(node: EventTarget | null): boolean {\n if (node == null || typeof node !== 'object' || !('nodeType' in node)) return false;\n let current: Node | null = node as Node;\n while (current) {\n if (current === this.el || current === this.panelEl) return true;\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n current = root.host;\n } else {\n current = current.parentNode;\n }\n }\n return false;\n }\n\n /** Keyboard event originated inside this picker (crosses shadow boundaries). */\n private isEventInPicker(e: KeyboardEvent): boolean {\n if (!this.open) return false;\n if (this.getEventPathNodes(e).includes(this.el)) return true;\n if (typeof document !== 'undefined') {\n if (this.isNodeInPicker(document.activeElement)) return true;\n if (this.panelPointerEngaged) return true;\n }\n return false;\n }\n\n /** Input inside the trigger field (outside the calendar panel). */\n private isTriggerFieldTarget(target: EventTarget | null): boolean {\n return this.isNodeInPicker(target) && !this.isNodeInPanel(target);\n }\n\n /** Prefer focused panel control, then event target, then the open panel. */\n private resolveCalendarKeyTarget(e: KeyboardEvent): EventTarget | null {\n if (typeof document !== 'undefined') {\n const active = document.activeElement;\n if (active && this.isNodeInPanel(active)) return active;\n }\n if (e.target && this.isNodeInPicker(e.target)) return e.target;\n if (typeof document !== 'undefined') {\n const active = document.activeElement;\n if (active && this.isNodeInPicker(active)) return active;\n }\n return this.panelEl ?? null;\n }\n\n /**\n * Non-interactive panel chrome (grid background, weekday row, padding) does not\n * receive focus on click — route subsequent keys via panelPointerEngaged.\n */\n private shouldPanelClaimFocus(target: EventTarget | null): boolean {\n const el = this.asEventElement(target);\n if (!el) return true;\n if (\n el.closest(\n 'button, [role=\"button\"], input, textarea, [contenteditable=\"true\"], md-menu-item, a[href]',\n )\n ) {\n return false;\n }\n return true;\n }\n\n private onPanelMouseDown = (e: MouseEvent) => {\n if (e.button !== 0 || !this.open || !this.panelEl) return;\n if (!this.shouldPanelClaimFocus(e.target)) return;\n this.panelPointerEngaged = true;\n if (\n this.viewMode === 'calendar' &&\n !this.inputMode &&\n !this.monthMenuOpen &&\n !this.yearMenuOpen\n ) {\n this.gridShouldFocus = true;\n }\n };\n\n /** True when `node` is inside the open calendar panel (crosses shadow boundaries). */\n private isNodeInPanel(node: EventTarget | null): boolean {\n if (!this.panelEl || node == null || typeof node !== 'object' || !('nodeType' in node)) {\n return false;\n }\n let current: Node | null = node as Node;\n while (current) {\n if (current === this.panelEl) return true;\n const root = current.getRootNode();\n if (root instanceof ShadowRoot) {\n current = root.host;\n } else {\n current = current.parentNode;\n }\n }\n return false;\n }\n\n private handleDayKeyDown = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return;\n this.handleCalendarKeyDown(e);\n };\n\n private handleCalendarKeyDown = (e: KeyboardEvent) => {\n if (e.defaultPrevented) return;\n\n if (this.isDockedMenuToggleKey(e)) {\n const key = e.key.toLowerCase();\n if (key === 'm') {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n this.toggleMonthMenu();\n return;\n }\n if (key === 'y') {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n this.toggleYearMenu();\n return;\n }\n }\n\n let next: Date | null = null;\n switch (this.resolveNavigationKey(e)) {\n case 'ArrowRight':\n next = addDays(this.focusedDate, 1);\n break;\n case 'ArrowLeft':\n next = addDays(this.focusedDate, -1);\n break;\n case 'ArrowDown':\n next = addDays(this.focusedDate, 7);\n break;\n case 'ArrowUp':\n next = addDays(this.focusedDate, -7);\n break;\n case 'Home':\n next = new Date(\n this.focusedDate.getFullYear(),\n this.focusedDate.getMonth(),\n 1,\n );\n break;\n case 'End':\n next = new Date(\n this.focusedDate.getFullYear(),\n this.focusedDate.getMonth(),\n daysInMonth(this.focusedDate.getFullYear(), this.focusedDate.getMonth()),\n );\n break;\n case 'PageUp':\n next = addMonths(this.focusedDate, e.shiftKey ? -12 : -1);\n break;\n case 'PageDown':\n next = addMonths(this.focusedDate, e.shiftKey ? 12 : 1);\n break;\n case 'Enter': {\n if (!this.isDayGridKeyTarget(e.target)) return;\n e.preventDefault();\n if (this.isDisabledDate(this.focusedDate)) return;\n this.selectDay({ date: this.focusedDate, outOfMonth: false });\n this.commit();\n return;\n }\n case ' ': {\n if (!this.isDayGridKeyTarget(e.target)) return;\n e.preventDefault();\n this.selectDay({ date: this.focusedDate, outOfMonth: false });\n return;\n }\n default:\n return;\n }\n e.preventDefault();\n const prevViewYear = this.viewYear;\n const prevViewMonth = this.viewMonth;\n this.focusedDate = clampDate(next, this.min, this.max);\n const navKey = this.resolveNavigationKey(e);\n if (\n (navKey === 'PageUp' || navKey === 'PageDown') &&\n (this.focusedDate.getFullYear() !== prevViewYear ||\n this.focusedDate.getMonth() !== prevViewMonth)\n ) {\n this.setGridSlideDirection(navKey === 'PageDown' ? 1 : -1);\n }\n this.viewYear = this.focusedDate.getFullYear();\n this.viewMonth = this.focusedDate.getMonth();\n this.gridShouldFocus = true;\n };\n\n /**\n * Enter in the trigger text field parses and formats typed input.\n * Handled at host capture so shadow-DOM inputs (docked md-text-field) are covered.\n */\n private tryCommitTriggerFieldOnEnter(e: KeyboardEvent): boolean {\n if (this.disabled || !this.hasField || e.key !== 'Enter') return false;\n const target = e.target;\n if (!target || !this.isNodeInPicker(target)) return false;\n if (!this.isEditableKeyTarget(target) || !this.isTriggerFieldTarget(target)) return false;\n\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(target);\n this.onFieldCommit();\n return true;\n }\n\n /**\n * Enter in the modal typed-entry field parses, formats, and commits the selection\n * (same end result as OK). Handled at host capture so md-text-field shadow inputs\n * are covered.\n */\n private tryCommitDialogInputOnEnter(e: KeyboardEvent): boolean {\n if (this.disabled || !this.inputMode || e.key !== 'Enter') return false;\n const target = e.target;\n if (!target || !this.isEditableKeyTarget(target)) return false;\n const el = this.asEventElement(target);\n if (!el?.closest('[part=\"entry-input\"]')) return false;\n\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(target);\n this.commitDialogInput();\n if (this.error) return true;\n this.commit();\n return true;\n }\n\n private routePickerKeyDown(e: KeyboardEvent, fromHostCapture = false): void {\n if (e.defaultPrevented || this.panelClosing) return;\n\n if (this.tryCommitDialogInputOnEnter(e)) return;\n if (this.tryCommitTriggerFieldOnEnter(e)) return;\n\n if (!this.open) return;\n if (!fromHostCapture && !this.isEventInPicker(e)) return;\n\n if (e.key === 'Escape') {\n e.preventDefault();\n if (this.isDocked && (this.monthMenuOpen || this.yearMenuOpen)) {\n this.closeMenus(null, true);\n return;\n }\n this.requestDismiss();\n return;\n }\n\n if (this.canHandleCalendarKeyDown(e, this.resolveCalendarKeyTarget(e))) {\n this.handleCalendarKeyDown(e);\n }\n }\n\n @Listen('keydown', { target: 'document', capture: true })\n handleDocumentKeyDown(e: KeyboardEvent) {\n this.routePickerKeyDown(e);\n }\n\n /**\n * A docked panel has no scrim, so the click that lands outside it arrives here\n * instead. `pointerdown` rather than `click` so the dismiss happens before the\n * pressed element can move or unmount under the pointer.\n *\n * The trigger field is inside the host, so its own click keeps toggling the\n * panel — this only fires for genuinely outside targets.\n */\n @Listen('pointerdown', { target: 'document', capture: true })\n handleDocumentPointerDown(e: Event) {\n if (!this.open || this.panelClosing) return;\n if (!this.isDocked || !this.outsideClickDismissible) return;\n if (this.getEventPathNodes(e).includes(this.el)) return;\n if (this.isNodeInPicker(e.target)) return;\n this.requestDismiss();\n }\n\n /** Capture keys from nested trigger fields (md-text-field shadow) and child components. */\n @Listen('keydown', { capture: true })\n handleHostKeyDown(e: KeyboardEvent) {\n this.routePickerKeyDown(e, true);\n }\n\n /**\n * Nested overlays (md-tooltip, md-menu) also emit `mdOpen` / `mdClose`.\n * Swallow those at the picker host so controlled consumers only react to this\n * component's own open/close lifecycle (see `handleOpen` / `handleClose`).\n */\n @Listen('mdOpen')\n swallowNestedMdOpen(e: Event) {\n if ((e.composedPath?.()[0] ?? e.target) !== this.el) {\n e.stopImmediatePropagation();\n }\n }\n\n @Listen('mdClose')\n swallowNestedMdClose(e: Event) {\n if ((e.composedPath?.()[0] ?? e.target) !== this.el) {\n e.stopImmediatePropagation();\n }\n }\n\n private onPanelKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n if (this.isDocked && (this.monthMenuOpen || this.yearMenuOpen)) {\n this.closeMenus(null, true);\n return;\n }\n this.requestDismiss();\n return;\n }\n if (this.canHandleCalendarKeyDown(e, this.resolveCalendarKeyTarget(e))) {\n this.handleCalendarKeyDown(e);\n return;\n }\n if (e.key === 'Tab' && !this.isDocked) {\n this.trapTab(e);\n }\n };\n\n /** Move roving tabindex to the focused day after open / keyboard navigation. */\n private focusFocusedDay() {\n const iso = toIsoDate(this.focusedDate);\n const btn = this.panelEl?.querySelector<HTMLElement>(`[data-date=\"${iso}\"]`);\n if (!btn) return;\n const run = () => btn.focus();\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => requestAnimationFrame(run));\n } else {\n run();\n }\n }\n\n private trapTab(e: KeyboardEvent) {\n const panel = this.panelEl;\n if (!panel) return;\n const focusables = Array.from(\n panel.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n ),\n ).filter((el) => el.offsetParent !== null || el === document.activeElement);\n if (focusables.length === 0) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = (this.el.shadowRoot?.activeElement ?? null) as HTMLElement | null;\n if (e.shiftKey && active === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n componentDidRender() {\n if (\n this.isDocked &&\n this.open &&\n !this.panelClosing &&\n !this.selectionMenuClosing &&\n !this.dockedCalendarBloom\n ) {\n this.positionDockedPanel();\n }\n if (this.menuShouldFocus) {\n const kind = this.menuShouldFocus;\n this.menuShouldFocus = null;\n this.afterDockedSelectionMenuPaint(kind);\n return;\n }\n if (this.yearGridShouldScroll) {\n this.yearGridShouldScroll = false;\n this.afterModalYearGridPaint();\n return;\n }\n if (this.menuRestoreFocus) {\n const kind = this.menuRestoreFocus;\n this.menuRestoreFocus = null;\n const el = kind === 'month' ? this.monthMenuButtonEl : this.yearMenuButtonEl;\n this.restoreMenuFocus(el);\n return;\n }\n if (this.entryInputShouldFocus && this.inputMode) {\n this.entryInputShouldFocus = false;\n const input = this.entryTextFieldEl?.shadowRoot?.querySelector(\n '.md-text-field__input',\n );\n if (input instanceof HTMLElement) {\n input.focus();\n }\n return;\n }\n if (\n this.open &&\n this.gridShouldFocus &&\n this.viewMode === 'calendar' &&\n !this.inputMode &&\n !this.monthMenuOpen &&\n !this.yearMenuOpen\n ) {\n this.focusFocusedDay();\n this.gridShouldFocus = false;\n }\n }\n\n // ---- render helpers ---------------------------------------------------\n\n /**\n * Shared trigger for `docked` and `modal-input` — `md-text-field` (outlined)\n * with a trailing `md-icon-button` calendar toggle instead of hand-rolled field\n * markup so both variants inherit design-system field anatomy and icon handling.\n */\n private textFieldKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n // Host capture (`tryCommitTriggerFieldOnEnter`) handles Enter from shadow inputs.\n if (e.defaultPrevented) return;\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(e.target);\n this.onFieldCommit();\n };\n\n private entryTextFieldKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter' || !this.inputMode) return;\n // Host capture (`tryCommitDialogInputOnEnter`) handles Enter from shadow inputs.\n if (e.defaultPrevented) return;\n e.preventDefault();\n e.stopPropagation();\n this.syncInputDraftFromField(e.target);\n this.commitDialogInput();\n if (this.error) return;\n this.commit();\n };\n\n private renderTextFieldTrigger() {\n const selected = parseIsoDate(this.value);\n const display = this.focused ? this.inputDraft : this.formatField(selected);\n const supporting =\n this.error && this.errorText ? '' : this.supportingText || this.dateFormatHint();\n return (\n <md-text-field\n class=\"md-date-picker__textfield\"\n part=\"field\"\n variant={this.fieldVariant}\n label={this.label}\n value={display}\n supportingText={supporting}\n error={this.error}\n errorText={this.errorText}\n reserveSupportingSpace={this.reserveSupportingSpace}\n disabled={this.disabled}\n required={this.required}\n appearFocused={this.open}\n onFocusin={() => {\n this.focused = true;\n if (!this.error) this.seedFieldDraftFromValue();\n }}\n onFocusout={() => {\n this.focused = false;\n }}\n onKeyDown={this.textFieldKeyDown}\n onMdInput={(e: CustomEvent<string>) => {\n this.inputDraft = e.detail;\n this.mdInput.emit({ value: e.detail });\n }}\n onMdChange={(e: CustomEvent<string>) => {\n this.inputDraft = e.detail;\n this.onFieldCommit();\n }}\n >\n {this.hasSlottedLeading && <slot name=\"leading-icon\" slot=\"leading-icon\" />}\n {this.clearable && !!this.value && !this.disabled && (\n <md-icon-button\n slot=\"trailing-icon\"\n class=\"md-date-picker__clear-button\"\n part=\"clear-button\"\n variant=\"standard\"\n icon=\"close\"\n aria-label={this.clearLabel}\n // Native click so stopPropagation prevents the field toggle from\n // also firing and opening the calendar.\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n void this.clear();\n }}\n ></md-icon-button>\n )}\n <md-icon-button\n slot=\"trailing-icon\"\n class=\"md-date-picker__calendar-button\"\n part=\"calendar-button\"\n variant={this.triggerExpanded ? 'tonal' : 'standard'}\n icon={this.hasSlottedCalendarIcon ? '' : this.calendarIcon}\n aria-label={\n this.triggerExpanded ? this.closeCalendarLabel : this.openCalendarLabel\n }\n aria-haspopup=\"dialog\"\n aria-expanded={this.triggerExpanded ? 'true' : 'false'}\n disabled={this.disabled}\n ref={(el) => (this.triggerEl = el as HTMLElement)}\n onMdClick={() => (this.open ? this.close() : this.show())}\n >\n {this.hasSlottedCalendarIcon && (\n <slot name=\"calendar-icon\" slot=\"\" />\n )}\n </md-icon-button>\n </md-text-field>\n );\n }\n\n /** Prev/next chevron for modal month nav (md-icon-button + tooltip). */\n private renderModalNavChevron(side: 'prev' | 'next', onStep: () => void) {\n return (\n <md-tooltip\n class=\"md-date-picker__nav-chevron-tooltip\"\n text={this.navTooltipText('month', side)}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET}\n >\n <md-icon-button\n class=\"md-date-picker__directional-icon md-date-picker__nav-chevron\"\n part={side === 'prev' ? 'prev-button' : 'next-button'}\n size=\"sm\"\n icon={side === 'prev' ? 'chevron_left' : 'chevron_right'}\n aria-label={this.navActionLabel('month', side)}\n onClick={onStep}\n ></md-icon-button>\n </md-tooltip>\n );\n }\n\n private modalMonthYearTooltipText(year: number, month: number): string {\n return `${this.formatMonthYear(year, month)} · ${this.chooseMonthAndYearLabel}`;\n }\n\n private renderNav(secondary = false) {\n const navYear = secondary\n ? addMonths(new Date(this.viewYear, this.viewMonth, 1), 1).getFullYear()\n : this.viewYear;\n const navMonth = secondary\n ? addMonths(new Date(this.viewYear, this.viewMonth, 1), 1).getMonth()\n : this.viewMonth;\n const yearExpanded =\n !secondary && (this.viewMode === 'year' || this.yearViewClosing);\n const monthYearButton = (\n <md-button\n class={{\n 'md-date-picker__menu-button': true,\n 'md-date-picker__menu-button--expanded': yearExpanded,\n }}\n part=\"month-toggle\"\n variant=\"text\"\n size=\"sm\"\n toggle\n selected={yearExpanded}\n trailingIcon={secondary ? undefined : this.dockedMenuTrailingIcon(yearExpanded)}\n suppressExpandIconFlip\n mirrorIcon={yearExpanded}\n aria-label={this.chooseMonthYearLabel}\n aria-expanded={yearExpanded ? 'true' : 'false'}\n disabled={secondary}\n onMdClick={(e) => {\n e.preventDefault();\n if (!secondary) this.toggleYearView();\n }}\n >\n {this.formatMonthYear(navYear, navMonth)}\n {!secondary && this.renderDockedMenuTrailingCaret(yearExpanded)}\n </md-button>\n );\n return (\n <div class=\"md-date-picker__nav\" part=\"nav\">\n {secondary ? (\n monthYearButton\n ) : (\n <md-tooltip\n class=\"md-date-picker__menu-button-tooltip\"\n text={this.modalMonthYearTooltipText(navYear, navMonth)}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_MENU_TOOLTIP_OFFSET}\n >\n {monthYearButton}\n </md-tooltip>\n )}\n {this.viewMode === 'calendar' && (\n <div class=\"md-date-picker__nav-buttons\">\n {this.renderModalNavChevron('prev', () => this.goToMonth(-1, true))}\n {this.renderModalNavChevron('next', () => this.goToMonth(1, true))}\n </div>\n )}\n </div>\n );\n }\n\n /**\n * Prev/next chevron for docked month/year nav. Inactive scope (other menu open)\n * renders a same-size spacer so menu triggers do not shift when buttons are absent.\n */\n private renderDockedNavChevron(\n side: 'prev' | 'next',\n scope: 'month' | 'year',\n visible: boolean,\n onStep: () => void,\n ) {\n return (\n <span class=\"md-date-picker__nav-chevron-slot\" part={`${side}-${scope}-chevron-slot`}>\n <md-tooltip\n class={{\n 'md-date-picker__nav-chevron-tooltip': true,\n 'md-date-picker__nav-chevron--visible': visible,\n }}\n text={this.navTooltipText(scope, side)}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_CHEVRON_TOOLTIP_OFFSET}\n >\n <md-icon-button\n class=\"md-date-picker__directional-icon md-date-picker__nav-chevron\"\n part={`${side}-${scope}-button`}\n size=\"sm\"\n icon={side === 'prev' ? 'chevron_left' : 'chevron_right'}\n aria-label={this.navActionLabel(scope, side)}\n disabled={!visible}\n onClick={visible ? onStep : undefined}\n ></md-icon-button>\n </md-tooltip>\n <span\n class={{\n 'md-date-picker__nav-chevron-spacer': true,\n 'md-date-picker__nav-chevron--visible': !visible,\n }}\n part={`${side}-${scope}-chevron-spacer`}\n aria-hidden=\"true\"\n ></span>\n </span>\n );\n }\n\n private renderDockedNav() {\n const monthShort = new Intl.DateTimeFormat(this.loc, { month: 'short' }).format(\n new Date(this.viewYear, this.viewMonth, 1),\n );\n const monthExpanded = this.isDockedMonthMenuExpanded();\n const yearExpanded = this.isDockedYearMenuExpanded();\n return (\n <div class=\"md-date-picker__docked-nav\" part=\"nav\">\n <div\n class={{\n 'md-date-picker__nav-group': true,\n 'md-date-picker__nav-group--month': true,\n 'md-date-picker__nav-group--selection-open': monthExpanded,\n }}\n >\n {this.renderDockedNavChevron('prev', 'month', !yearExpanded, () => this.goToMonth(-1, true))}\n <md-tooltip\n class=\"md-date-picker__menu-button-tooltip\"\n text={this.menuTooltipText('month')}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_MENU_TOOLTIP_OFFSET}\n >\n <md-button\n class={{\n 'md-date-picker__menu-button': true,\n 'md-date-picker__menu-button--expanded': monthExpanded,\n }}\n part=\"month-menu-button\"\n variant=\"text\"\n size=\"sm\"\n toggle\n selected={monthExpanded}\n trailingIcon={this.dockedMenuTrailingIcon(monthExpanded)}\n suppressExpandIconFlip\n mirrorIcon={monthExpanded}\n aria-label={this.chooseMonthLabel}\n aria-haspopup=\"menu\"\n aria-expanded={monthExpanded ? 'true' : 'false'}\n ref={(el) => (this.monthMenuButtonEl = el as HTMLElement)}\n onMdClick={(e) => {\n e.preventDefault();\n this.toggleMonthMenu();\n }}\n >\n {monthShort}\n {this.renderDockedMenuTrailingCaret(monthExpanded)}\n </md-button>\n </md-tooltip>\n {this.renderDockedNavChevron('next', 'month', !yearExpanded, () => this.goToMonth(1, true))}\n </div>\n <div\n class={{\n 'md-date-picker__nav-group': true,\n 'md-date-picker__nav-group--year': true,\n 'md-date-picker__nav-group--selection-open': yearExpanded,\n }}\n >\n {this.renderDockedNavChevron('prev', 'year', !monthExpanded, () => this.goToYear(-1, true))}\n <md-tooltip\n class=\"md-date-picker__menu-button-tooltip\"\n text={this.menuTooltipText('year')}\n showDelay={0}\n position=\"bottom\"\n offset={DOCKED_NAV_MENU_TOOLTIP_OFFSET}\n >\n <md-button\n class={{\n 'md-date-picker__menu-button': true,\n 'md-date-picker__menu-button--expanded': yearExpanded,\n }}\n part=\"year-menu-button\"\n variant=\"text\"\n size=\"sm\"\n toggle\n selected={yearExpanded}\n trailingIcon={this.dockedMenuTrailingIcon(yearExpanded)}\n suppressExpandIconFlip\n mirrorIcon={yearExpanded}\n aria-label={this.chooseYearLabel}\n aria-haspopup=\"menu\"\n aria-expanded={yearExpanded ? 'true' : 'false'}\n ref={(el) => (this.yearMenuButtonEl = el as HTMLElement)}\n onMdClick={(e) => {\n e.preventDefault();\n this.toggleYearMenu();\n }}\n >\n {this.viewYear}\n {this.renderDockedMenuTrailingCaret(yearExpanded)}\n </md-button>\n </md-tooltip>\n {this.renderDockedNavChevron('next', 'year', !monthExpanded, () => this.goToYear(1, true))}\n </div>\n </div>\n );\n }\n\n /** Full-width divider between docked nav and month/year selection list. */\n private renderDockedSelectionDivider() {\n return (\n <div\n class=\"md-date-picker__selection-divider\"\n part=\"selection-divider\"\n role=\"separator\"\n aria-hidden=\"true\"\n />\n );\n }\n\n /**\n * Inline baseline `md-menu` with leading radio checks — replaces the day grid\n * while month selection is active in the docked panel body.\n */\n private renderDockedMonthMenu(closing: boolean) {\n const months = Array.from({ length: 12 }, (_, m) =>\n new Intl.DateTimeFormat(this.loc, { month: 'long' }).format(new Date(2024, m, 1)),\n );\n return (\n <div\n class={{\n 'md-date-picker__selection-menu-wrap': true,\n 'md-date-picker__selection-menu-wrap--bloom-out': closing,\n }}\n part=\"month-menu-wrap\"\n >\n <md-menu\n class=\"md-date-picker__selection-menu md-menu--inline-fill\"\n part=\"month-menu\"\n exportparts=\"menu-viewport:month-menu-viewport\"\n variant=\"baseline\"\n open\n quick\n persistent\n autoFocus={false}\n onMdClose={this.onMonthMenuClose}\n >\n {months.map((name, m) => {\n const sel = m === this.viewMonth;\n return (\n <md-menu-item\n part={sel ? 'month-option month-option-selected' : 'month-option'}\n headline={name}\n type=\"radio\"\n check-position=\"start\"\n keep-open\n selected={sel}\n onMdClick={(e) => this.pickMonth(m, e.target)}\n ></md-menu-item>\n );\n })}\n </md-menu>\n </div>\n );\n }\n\n /**\n * Inline baseline `md-menu` with leading radio checks — replaces the day grid\n * while year selection is active in the docked panel body.\n */\n private renderDockedYearMenu(closing: boolean) {\n const current = this.viewYear;\n const { minYear, maxYear } = this.getYearListBounds();\n const years: number[] = [];\n for (let y = minYear; y <= maxYear; y++) years.push(y);\n return (\n <div\n class={{\n 'md-date-picker__selection-menu-wrap': true,\n 'md-date-picker__selection-menu-wrap--year': true,\n 'md-date-picker__selection-menu-wrap--bloom-out': closing,\n }}\n part=\"year-menu-wrap\"\n >\n <md-menu\n class=\"md-date-picker__selection-menu md-menu--inline-fill\"\n part=\"year-menu\"\n exportparts=\"menu-viewport:year-menu-viewport\"\n variant=\"baseline\"\n open\n quick\n persistent\n autoFocus={false}\n onMdClose={this.onYearMenuClose}\n >\n {years.map((y) => {\n const sel = y === current;\n return (\n <md-menu-item\n part={sel ? 'year-option year-option-selected' : 'year-option'}\n headline={String(y)}\n type=\"radio\"\n check-position=\"start\"\n keep-open\n selected={sel}\n onMdClick={(e) => this.pickYear(y, e.target)}\n ></md-menu-item>\n );\n })}\n </md-menu>\n </div>\n );\n }\n\n private renderCalendar(\n year: number,\n month: number,\n primary = true,\n contentBloom = false,\n ) {\n const firstDay = this.resolvedFirstDay();\n const names = weekdayNames(this.locale, firstDay, 'narrow');\n const fullNames = weekdayNames(this.locale, firstDay, 'long');\n const cells = buildMonthMatrix(year, month, firstDay);\n const today = new Date();\n const gridLabel = this.formatMonthYear(year, month);\n return (\n <div\n class={{\n 'md-date-picker__calendar': true,\n 'md-date-picker__calendar--docked-bloom-in': contentBloom && this.isDocked,\n 'md-date-picker__calendar--content-bloom-in': contentBloom && !this.isDocked,\n }}\n part=\"calendar\"\n role=\"grid\"\n aria-label={gridLabel}\n >\n <div class=\"md-date-picker__weekdays\" part=\"weekdays\" role=\"row\" aria-hidden=\"true\">\n {names.map((n, i) => (\n <md-tooltip\n class=\"md-date-picker__weekday-tooltip\"\n text={fullNames[i]}\n showDelay={0}\n position=\"bottom\"\n offset={3}\n >\n <span\n class=\"md-date-picker__weekday\"\n part=\"weekday\"\n role=\"presentation\"\n >\n {n}\n </span>\n </md-tooltip>\n ))}\n </div>\n <div\n class={{\n 'md-date-picker__grid': true,\n 'md-date-picker__grid--slide-forward': this.gridSlideDirection === 'forward',\n 'md-date-picker__grid--slide-backward': this.gridSlideDirection === 'backward',\n }}\n part=\"grid\"\n role=\"rowgroup\"\n onAnimationEnd={this.onGridSlideAnimationEnd}\n >\n {Array.from({ length: cells.length / 7 }, (_unused, week) => (\n <div class=\"md-date-picker__week\" part=\"week\" role=\"row\">\n {cells\n .slice(week * 7, week * 7 + 7)\n .map((cell) => this.renderDay(cell, today, primary))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n private renderDay(cell: DayCell, today: Date, primary: boolean) {\n const d = cell.date;\n const iso = toIsoDate(d);\n const disabled = this.isDisabledDate(d);\n const isToday = isSameDay(d, today);\n const isFocusTarget = isSameDay(d, this.focusedDate) && primary;\n\n const selected = !!this.pendingDate && isSameDay(d, this.pendingDate);\n const unselected =\n !selected && !isToday && !disabled && !cell.outOfMonth;\n\n const parts = ['day'];\n if (selected) parts.push('day-selected');\n if (isToday) parts.push('day-today');\n if (disabled) parts.push('day-disabled');\n if (cell.outOfMonth) parts.push('day-outside');\n if (unselected) parts.push('day-unselected');\n\n return (\n <md-button\n class={{\n 'md-date-picker__day': true,\n 'md-date-picker__day--selected': selected,\n 'md-date-picker__day--today': isToday,\n 'md-date-picker__day--disabled': disabled,\n 'md-date-picker__day--outside': cell.outOfMonth,\n 'md-date-picker__day--unselected': unselected,\n }}\n part={parts.join(' ')}\n variant={selected ? 'filled' : 'text'}\n size=\"sm\"\n shape=\"square\"\n selected={selected}\n roleOverride=\"gridcell\"\n groupTabindex={isFocusTarget ? 0 : -1}\n data-date={iso}\n aria-selected={selected ? 'true' : 'false'}\n aria-disabled={disabled ? 'true' : undefined}\n aria-current={isToday ? 'date' : undefined}\n aria-label={this.formatFullDate(d)}\n disabled={disabled}\n onMdClick={() => this.selectDay(cell)}\n onKeyDown={primary ? this.handleDayKeyDown : undefined}\n >\n {d.getDate()}\n </md-button>\n );\n }\n\n private renderYearGrid(closing = false) {\n const current = this.viewYear;\n const { minYear, maxYear } = this.getYearListBounds();\n const years: number[] = [];\n for (let y = minYear; y <= maxYear; y++) years.push(y);\n return (\n <div\n class={{\n 'md-date-picker__year-grid-wrap': true,\n 'md-date-picker__year-grid-wrap--bloom-out': closing,\n }}\n part=\"year-grid-wrap\"\n >\n <div\n class=\"md-date-picker__year-grid-scroll\"\n part=\"year-grid-scroll year-grid-viewport\"\n >\n <div class=\"md-date-picker__year-grid\" part=\"year-grid\" role=\"grid\" aria-label={this.yearGridLabel}>\n {Array.from({ length: Math.ceil(years.length / 3) }, (_unused, r) => (\n <div class=\"md-date-picker__year-row\" part=\"year-row\" role=\"row\">\n {years.slice(r * 3, r * 3 + 3).map((y) => {\n const sel = y === current;\n const disabled = this.isDisabledYear(y);\n const unselected = !sel && !disabled;\n const parts = ['year'];\n if (sel) parts.push('year-selected');\n if (disabled) parts.push('year-disabled');\n if (unselected) parts.push('year-unselected');\n\n return (\n <md-button\n class={{\n 'md-date-picker__year': true,\n 'md-date-picker__year--selected': sel,\n 'md-date-picker__year--disabled': disabled,\n 'md-date-picker__year--unselected': unselected,\n }}\n part={parts.join(' ')}\n variant={sel ? 'filled' : 'text'}\n size=\"sm\"\n shape=\"square\"\n selected={sel}\n roleOverride=\"gridcell\"\n data-year={String(y)}\n aria-selected={sel ? 'true' : 'false'}\n aria-disabled={disabled ? 'true' : undefined}\n aria-label={String(y)}\n disabled={disabled}\n onMdClick={() => this.selectYear(y)}\n >\n {y}\n </md-button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n private renderDialogInput() {\n return (\n <div class=\"md-date-picker__entry\" part=\"entry\">\n <md-text-field\n class=\"md-date-picker__entry-textfield\"\n part=\"entry-input\"\n variant=\"outlined\"\n label={this.label}\n placeholder={this.placeholder || this.dateFormatHint()}\n value={this.inputDraft}\n error={this.error}\n errorText={this.errorText}\n reserveSupportingSpace={this.reserveSupportingSpace}\n ref={(el) => (this.entryTextFieldEl = el as HTMLElement)}\n onKeyDown={this.entryTextFieldKeyDown}\n onMdInput={(e: CustomEvent<string>) => {\n this.inputDraft = e.detail;\n this.mdInput.emit({ value: e.detail });\n }}\n ></md-text-field>\n </div>\n );\n }\n\n private renderHeadline() {\n if (this.inputMode) {\n return this.enterDatesLabel;\n }\n return this.pendingDate ? this.formatHeadline(this.pendingDate) : this.selectDateLabel;\n }\n\n private renderHeader() {\n if (this.hasSlottedHeader) {\n return (\n <div class=\"md-date-picker__header\" part=\"header\">\n <slot name=\"header\" />\n </div>\n );\n }\n const supporting = this.headline;\n const modeToggleLabel = this.inputMode\n ? this.toggleCalendarLabel\n : this.toggleTextLabel;\n return (\n <div class=\"md-date-picker__header\" part=\"header\">\n <div class=\"md-date-picker__header-supporting\" part=\"supporting\">\n {supporting}\n </div>\n <div class=\"md-date-picker__header-row\">\n <div class=\"md-date-picker__headline\" part=\"headline\">\n {this.renderHeadline()}\n </div>\n {this.variant !== 'docked' && (\n <md-tooltip\n class=\"md-date-picker__mode-toggle-tooltip\"\n text={modeToggleLabel}\n showDelay={0}\n position=\"bottom\"\n >\n <md-icon-button\n class=\"md-date-picker__mode-toggle\"\n part=\"mode-toggle\"\n icon={this.inputMode ? 'calendar_today' : 'edit'}\n aria-label={modeToggleLabel}\n onClick={this.toggleInputMode}\n ></md-icon-button>\n </md-tooltip>\n )}\n </div>\n </div>\n );\n }\n\n /** Whether a Cancel / OK row is rendered at all. The body relies on it for\n * its bottom inset, so both must agree. */\n private get hasActionRow(): boolean {\n // `commit-on-select` collapses a day CLICK into a commit — text entry has no\n // click to collapse, so input mode keeps its OK button or the typed date\n // could never be committed with the pointer.\n return this.hasSlottedActions || !this.commitOnSelect || this.inputMode;\n }\n\n private renderActions() {\n // Nothing is staged in commit-on-select mode, so a Cancel / OK row would\n // confirm a decision the user already made. Slotted actions are still\n // honoured — those are the consumer's, and they may hold other controls.\n if (!this.hasActionRow) return null;\n if (this.hasSlottedActions) {\n return (\n <div class=\"md-date-picker__actions\" part=\"actions\">\n <slot name=\"actions\" />\n </div>\n );\n }\n return (\n <div class=\"md-date-picker__actions\" part=\"actions\">\n <md-button\n class=\"md-date-picker__action-btn\"\n variant=\"text\"\n size=\"sm\"\n onMdClick={() => this.cancel()}\n part=\"cancel-button\"\n >\n {this.cancelLabel}\n </md-button>\n <md-button\n class=\"md-date-picker__action-btn md-date-picker__action-btn--primary\"\n variant=\"text\"\n size=\"sm\"\n onMdClick={() => {\n if (this.inputMode) {\n this.commitDialogInput();\n if (this.error) return;\n }\n this.commit();\n }}\n part=\"ok-button\"\n >\n {this.okLabel}\n </md-button>\n </div>\n );\n }\n\n private renderBody() {\n if (this.inputMode) {\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--input-mode': true,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderDialogInput()}\n </div>\n );\n }\n const showYearGrid = this.viewMode === 'year' || this.yearViewClosing;\n const showModalCalendar =\n this.viewMode === 'calendar' && !this.yearViewClosing;\n const modalCalendarBloom = this.dockedCalendarBloom || this.modalCalendarBloom;\n\n if (showYearGrid && !this.isDocked) {\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--year-view': true,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderNav()}\n {this.renderYearGrid(this.yearViewClosing)}\n </div>\n );\n }\n if (this.isDocked) {\n const selectionVisible =\n this.monthMenuOpen ||\n this.yearMenuOpen ||\n !!this.selectionMenuClosing;\n const activeSelectionMenu = this.dockedSelectionMenuToShow();\n const showYearMenu = activeSelectionMenu === 'year';\n const showMonthMenu = activeSelectionMenu === 'month';\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--docked': true,\n 'md-date-picker__body--docked-selection': selectionVisible,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderDockedNav()}\n {selectionVisible && (\n <div class=\"md-date-picker__docked-below-nav\" part=\"docked-below-nav\">\n {this.renderDockedSelectionDivider()}\n </div>\n )}\n {showMonthMenu &&\n this.renderDockedMonthMenu(this.selectionMenuClosing === 'month')}\n {showYearMenu &&\n this.renderDockedYearMenu(this.selectionMenuClosing === 'year')}\n {!selectionVisible &&\n this.renderCalendar(\n this.viewYear,\n this.viewMonth,\n true,\n this.dockedCalendarBloom,\n )}\n </div>\n );\n }\n return (\n <div\n class={{\n 'md-date-picker__body': true,\n 'md-date-picker__body--no-actions': !this.hasActionRow,\n }}\n part=\"body\"\n >\n {this.renderNav()}\n {showModalCalendar &&\n this.renderCalendar(this.viewYear, this.viewMonth, true, modalCalendarBloom)}\n </div>\n );\n }\n\n private renderPanel(docked = false) {\n const dockedMaxBlockStyle =\n docked && this.dockedPanelMaxBlockSize\n ? { maxBlockSize: this.dockedPanelMaxBlockSize }\n : undefined;\n return (\n <div\n class={{\n 'md-date-picker__panel': true,\n 'md-date-picker__panel--docked': docked,\n 'md-date-picker__panel--align-end': docked && this.dockedPanelAlign === 'end',\n 'md-date-picker__panel--placement-above':\n docked && this.dockedPanelPlacement === 'above',\n 'md-date-picker__panel--input-mode': !docked && this.inputMode,\n 'md-date-picker__panel--bloom-in': !this.panelClosing,\n 'md-date-picker__panel--bloom-out': this.panelClosing,\n }}\n part=\"panel\"\n role=\"dialog\"\n aria-modal={docked ? undefined : 'true'}\n aria-label={this.label}\n style={dockedMaxBlockStyle}\n ref={(el) => (this.panelEl = el as HTMLElement)}\n tabindex=\"-1\"\n onMouseDown={this.onPanelMouseDown}\n onKeyDown={this.onPanelKeyDown}\n >\n {!docked && this.renderHeader()}\n {this.renderBody()}\n {this.renderActions()}\n </div>\n );\n }\n\n private renderModal() {\n return (\n <div\n class={{\n 'md-date-picker__modal': true,\n 'md-date-picker__modal--closing': this.panelClosing,\n }}\n part=\"modal\"\n >\n <div\n class=\"md-date-picker__scrim\"\n part=\"scrim\"\n onClick={() => this.scrimDismissible && this.requestDismiss()}\n />\n {this.renderPanel(false)}\n </div>\n );\n }\n\n render() {\n const panelVisible = this.open || this.panelClosing;\n const panelOpen = this.open && !this.panelClosing;\n return (\n <Host\n class={{\n 'md-date-picker': true,\n [`md-date-picker--${this.variant}`]: true,\n 'md-date-picker--open': panelOpen,\n 'md-date-picker--panel-closing': this.panelClosing,\n 'md-date-picker--disabled': this.disabled,\n 'md-date-picker--error': this.error,\n }}\n aria-disabled={this.disabled ? 'true' : null}\n >\n {this.isDocked ? (\n <div\n class=\"md-date-picker__docked-anchor\"\n ref={(el) => (this.dockedAnchorEl = el as HTMLElement)}\n >\n {this.renderTextFieldTrigger()}\n {panelVisible && (\n <div\n class={{\n 'md-date-picker__docked-popup': true,\n 'md-date-picker__docked-popup--above':\n this.dockedPanelPlacement === 'above',\n }}\n >\n {this.renderPanel(true)}\n </div>\n )}\n </div>\n ) : (\n this.hasField && this.renderTextFieldTrigger()\n )}\n {panelVisible && !this.isDocked && this.renderModal()}\n </Host>\n );\n }\n\n /** Keep the submitted value and validity in step with the selected date. */\n @Watch('value')\n @Watch('required')\n @Watch('valueMissingLabel')\n syncFormValue() {\n setFormValue(this.internals, this.value || null);\n setValidityState(this.internals, {\n missing: this.required && !this.value,\n missingMessage: this.valueMissingLabel,\n customMessage: this.customValidityMessage,\n });\n this.emitValidityChange();\n }\n\n /** Restore the initial date when the owning form is reset. */\n formResetCallback() {\n this.value = this.defaultValue;\n }\n\n /** Current validity: boolean, message and flags. Mirrors md-text-field. */\n @Method()\n async getValidity(): Promise<{\n valid: boolean;\n validationMessage: string;\n flags: Record<string, boolean>;\n }> {\n return getValidityOf(this.internals);\n }\n\n /**\n * Fires when this control's validity CHANGES — never on every keystroke, and\n * never for a re-publish that lands on the same state.\n *\n * `composed: false` is deliberate. Composites like md-select embed an\n * md-text-field, and a composed event escapes that inner shadow root, so a\n * listener on md-select would receive the inner field's event as well as the\n * host's — two events, different payloads, for one logical control. Keeping\n * it uncomposed means each component reports only for itself, while\n * `bubbles: true` still lets a <form> or app root hear every control.\n */\n @Event({ bubbles: true, composed: false }) mdValidityChange: EventEmitter<{\n valid: boolean;\n validationMessage: string;\n flags: Record<string, boolean>;\n }>;\n\n /** Last emitted validity, so a re-publish that changes nothing stays silent. */\n private lastValidityKey: string | null = null;\n\n /**\n * Emit mdValidityChange if validity actually moved.\n *\n * The FIRST call only primes the baseline. Initial state is not a change, and\n * emitting on mount would fire once per control on every page load — noise a\n * consumer would have to filter out, and misleading for anything logging\n * \"field became invalid\".\n */\n private emitValidityChange() {\n const v = getValidityOf(this.internals);\n const key = `${v.valid}|${v.validationMessage}`;\n if (this.lastValidityKey === key) return;\n const primed = this.lastValidityKey !== null;\n this.lastValidityKey = key;\n if (primed) this.mdValidityChange.emit(v);\n }\n\n /** Constraint-validation API, matching md-text-field and the native contract. */\n @Method()\n async checkValidity(): Promise<boolean> {\n return checkValidityOf(this.internals);\n }\n\n @Method()\n async reportValidity(): Promise<boolean> {\n return reportValidityOf(this.internals);\n }\n\n @Method()\n async setCustomValidity(message: string) {\n this.customValidityMessage = message;\n this.syncFormValue();\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
|