@awc-ui/core 1.0.0-beta.2 → 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js +8 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js.map +1 -0
- package/dist/cjs/engine.wasm-9JtXME10.js +12 -0
- package/dist/cjs/engine.wasm-9JtXME10.js.map +1 -0
- package/dist/cjs/{index-DlQ_5_Mv.js → index-Bm07YAg9.js} +4 -15
- package/dist/cjs/index-Bm07YAg9.js.map +1 -0
- package/dist/cjs/lazy-loading-indicator-CoC-_DMs.js +69 -0
- package/dist/cjs/lazy-loading-indicator-CoC-_DMs.js.map +1 -0
- package/dist/cjs/loader.cjs.js +4 -3
- package/dist/cjs/loader.cjs.js.map +1 -1
- package/dist/cjs/md-accordion-item.cjs.entry.js +4 -4
- package/dist/cjs/md-accordion.cjs.entry.js +1 -1
- package/dist/cjs/md-app-bar.cjs.entry.js +2 -2
- package/dist/cjs/md-area-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-autocomplete.cjs.entry.js +6 -5
- package/dist/cjs/md-autocomplete.cjs.entry.js.map +1 -1
- package/dist/cjs/md-avatar_2.cjs.entry.js +4 -4
- package/dist/cjs/md-badge.cjs.entry.js +3 -3
- package/dist/cjs/md-bar-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-bottom-sheet.cjs.entry.js +5 -5
- package/dist/cjs/md-breadcrumb-item.cjs.entry.js +1 -1
- package/dist/cjs/md-breadcrumbs.cjs.entry.js +3 -3
- package/dist/cjs/md-button-group.cjs.entry.js +3 -3
- package/dist/cjs/{md-button_7.cjs.entry.js → md-button_6.cjs.entry.js} +14 -39
- package/dist/cjs/md-button_6.cjs.entry.js.map +1 -0
- package/dist/cjs/md-checkbox.cjs.entry.js +3 -3
- package/dist/cjs/md-chip.cjs.entry.js +3 -3
- package/dist/cjs/md-color-picker.cjs.entry.js +1 -1
- package/dist/cjs/md-date-picker.cjs.entry.js +2 -2
- package/dist/cjs/md-dialog.cjs.entry.js +3 -3
- package/dist/cjs/md-divider.cjs.entry.js +3 -3
- package/dist/cjs/md-fab-menu-item.cjs.entry.js +3 -3
- package/dist/cjs/md-fab-menu.cjs.entry.js +3 -3
- package/dist/cjs/md-fab.cjs.entry.js +3 -3
- package/dist/cjs/md-line-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-list-item.cjs.entry.js +4 -4
- package/dist/cjs/md-list.cjs.entry.js +4 -4
- package/dist/cjs/md-loading-indicator-CmzdcYLR.js +33 -0
- package/dist/cjs/md-loading-indicator-CmzdcYLR.js.map +1 -0
- package/dist/cjs/md-loading-indicator.cjs.entry.js +11 -0
- package/dist/cjs/md-loading-indicator.cjs.entry.js.map +1 -0
- package/dist/cjs/md-menu-item-group.cjs.entry.js +1 -1
- package/dist/cjs/md-menu_2.cjs.entry.js +6 -6
- package/dist/cjs/md-meter.cjs.entry.js +1 -1
- package/dist/cjs/md-multi-select.cjs.entry.js +7 -6
- package/dist/cjs/md-multi-select.cjs.entry.js.map +1 -1
- package/dist/cjs/md-navigation-bar.cjs.entry.js +2 -2
- package/dist/cjs/md-navigation-rail-tab.cjs.entry.js +1 -1
- package/dist/cjs/md-navigation-rail.cjs.entry.js +1 -1
- package/dist/cjs/md-navigation-tab.cjs.entry.js +3 -3
- package/dist/cjs/md-number-field.cjs.entry.js +3 -3
- package/dist/cjs/md-organization-chart.cjs.entry.js +3 -3
- package/dist/cjs/md-otp-field.cjs.entry.js +4 -4
- package/dist/cjs/md-pie-chart.cjs.entry.js +1 -1
- package/dist/cjs/md-progress-indicator.cjs.entry.js +1 -1
- package/dist/cjs/md-rating.cjs.entry.js +1 -1
- package/dist/cjs/md-search.cjs.entry.js +8 -7
- package/dist/cjs/md-search.cjs.entry.js.map +1 -1
- package/dist/cjs/md-segmented-button-set.cjs.entry.js +1 -1
- package/dist/cjs/md-segmented-button.cjs.entry.js +1 -1
- package/dist/cjs/md-select-option.cjs.entry.js +2 -2
- package/dist/cjs/md-select.cjs.entry.js +7 -6
- package/dist/cjs/md-select.cjs.entry.js.map +1 -1
- package/dist/cjs/md-side-sheet.cjs.entry.js +1 -1
- package/dist/cjs/md-skeleton.cjs.entry.js +1 -1
- package/dist/cjs/md-slider.cjs.entry.js +3 -3
- package/dist/cjs/md-sparkline.cjs.entry.js +3 -3
- package/dist/cjs/md-split-button.cjs.entry.js +1 -1
- package/dist/cjs/md-status-dot.cjs.entry.js +2 -2
- package/dist/cjs/md-step.cjs.entry.js +1 -1
- package/dist/cjs/md-stepper.cjs.entry.js +1 -1
- package/dist/cjs/md-sub-menu-item.cjs.entry.js +1 -1
- package/dist/cjs/md-switch.cjs.entry.js +1 -1
- package/dist/cjs/md-tab-panel.cjs.entry.js +1 -1
- package/dist/cjs/md-tab-panels.cjs.entry.js +1 -1
- package/dist/cjs/md-tab.cjs.entry.js +1 -1
- package/dist/cjs/md-table-body.cjs.entry.js +1 -1
- package/dist/cjs/md-table-cell.cjs.entry.js +1 -1
- package/dist/cjs/md-table-container.cjs.entry.js +1 -1
- package/dist/cjs/md-table-expand-toggle.cjs.entry.js +1 -1
- package/dist/cjs/md-table-foot.cjs.entry.js +1 -1
- package/dist/cjs/md-table-head.cjs.entry.js +1 -1
- package/dist/cjs/md-table-pagination.cjs.entry.js +1 -1
- package/dist/cjs/md-table-row.cjs.entry.js +1 -1
- package/dist/cjs/md-table-sort-label.cjs.entry.js +1 -1
- package/dist/cjs/md-table-toolbar.cjs.entry.js +1 -1
- package/dist/cjs/md-table.cjs.entry.js +4 -4
- package/dist/cjs/md-tabs.cjs.entry.js +1 -1
- package/dist/cjs/md-text-field.cjs.entry.js +8 -8
- package/dist/cjs/md-time-picker.cjs.entry.js +2 -2
- package/dist/cjs/md-toolbar.cjs.entry.js +1 -1
- package/dist/cjs/md-transfer-list.cjs.entry.js +2 -2
- package/dist/cjs/md3.cjs.js +4 -3
- package/dist/cjs/md3.cjs.js.map +1 -1
- package/dist/cjs/{virtual-select-controller-CqriaZgm.js → virtual-select-controller-C5cSoKfB.js} +10 -9
- package/dist/cjs/virtual-select-controller-C5cSoKfB.js.map +1 -0
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/md-accordion-item/md-accordion-item.js +3 -3
- package/dist/collection/components/md-app-bar/md-app-bar.js +1 -1
- package/dist/collection/components/md-area-chart/md-area-chart.js +2 -2
- package/dist/collection/components/md-autocomplete/md-autocomplete.js +4 -3
- package/dist/collection/components/md-autocomplete/md-autocomplete.js.map +1 -1
- package/dist/collection/components/md-avatar/md-avatar.js +2 -2
- package/dist/collection/components/md-badge/md-badge.js +2 -2
- package/dist/collection/components/md-bar-chart/md-bar-chart.js +2 -2
- package/dist/collection/components/md-bottom-sheet/md-bottom-sheet.js +4 -4
- package/dist/collection/components/md-breadcrumbs/md-breadcrumbs.js +2 -2
- package/dist/collection/components/md-button/md-button.js +4 -3
- package/dist/collection/components/md-button/md-button.js.map +1 -1
- package/dist/collection/components/md-button-group/md-button-group.js +2 -2
- package/dist/collection/components/md-card/md-card.js +2 -2
- package/dist/collection/components/md-checkbox/md-checkbox.js +2 -2
- package/dist/collection/components/md-chip/md-chip.js +2 -2
- package/dist/collection/components/md-date-picker/md-date-picker.js +1 -1
- package/dist/collection/components/md-dialog/md-dialog.js +2 -2
- package/dist/collection/components/md-divider/md-divider.js +2 -2
- package/dist/collection/components/md-fab/md-fab.js +2 -2
- package/dist/collection/components/md-fab-menu/md-fab-menu.js +2 -2
- package/dist/collection/components/md-fab-menu-item/md-fab-menu-item.js +2 -2
- package/dist/collection/components/md-icon-button/md-icon-button.js +4 -4
- package/dist/collection/components/md-line-chart/md-line-chart.js +2 -2
- package/dist/collection/components/md-list/md-list.js +3 -3
- package/dist/collection/components/md-list-item/md-list-item.js +3 -3
- package/dist/collection/components/md-loading-indicator/md-loading-indicator.js +2 -2
- package/dist/collection/components/md-menu/md-menu.js +3 -3
- package/dist/collection/components/md-menu-item/md-menu-item.js +2 -2
- package/dist/collection/components/md-multi-select/md-multi-select.js +5 -4
- package/dist/collection/components/md-multi-select/md-multi-select.js.map +1 -1
- package/dist/collection/components/md-navigation-bar/md-navigation-bar.js +1 -1
- package/dist/collection/components/md-navigation-tab/md-navigation-tab.js +2 -2
- package/dist/collection/components/md-number-field/md-number-field.js +2 -2
- package/dist/collection/components/md-organization-chart/md-organization-chart.js +2 -2
- package/dist/collection/components/md-otp-field/md-otp-field.js +3 -3
- package/dist/collection/components/md-ripple/md-ripple.js +1 -1
- package/dist/collection/components/md-search/md-search.js +7 -6
- package/dist/collection/components/md-search/md-search.js.map +1 -1
- package/dist/collection/components/md-select/md-select.js +5 -4
- package/dist/collection/components/md-select/md-select.js.map +1 -1
- package/dist/collection/components/md-select-option/md-select-option.js +1 -1
- package/dist/collection/components/md-slider/md-slider.js +2 -2
- package/dist/collection/components/md-sparkline/md-sparkline.js +2 -2
- package/dist/collection/components/md-status-dot/md-status-dot.js +1 -1
- package/dist/collection/components/md-table/md-table.js +3 -3
- package/dist/collection/components/md-text-field/md-text-field.js +7 -7
- package/dist/collection/components/md-time-picker/md-time-picker.js +1 -1
- package/dist/collection/components/md-tooltip/md-tooltip.js +1 -1
- package/dist/collection/components/md-transfer-list/md-transfer-list.js +1 -1
- package/dist/collection/utils/lazy-loading-indicator.js +62 -0
- package/dist/collection/utils/lazy-loading-indicator.js.map +1 -0
- package/dist/collection/wasm/engine-abi.js +8 -2
- package/dist/collection/wasm/engine-abi.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/md-accordion-item.js +1 -1
- package/dist/components/md-accordion.js +1 -1
- package/dist/components/md-app-bar.js +1 -1
- package/dist/components/md-area-chart.js +1 -1
- package/dist/components/md-autocomplete.js +1 -1
- package/dist/components/md-autocomplete.js.map +1 -1
- package/dist/components/md-avatar.js +1 -1
- package/dist/components/md-badge.js +1 -1
- package/dist/components/md-bar-chart.js +1 -1
- package/dist/components/md-bottom-sheet.js +1 -1
- package/dist/components/md-breadcrumb-item.js +1 -1
- package/dist/components/md-breadcrumbs.js +1 -1
- package/dist/components/md-button-group.js +1 -1
- package/dist/components/md-button.js +1 -1
- package/dist/components/md-card.js +1 -1
- package/dist/components/md-checkbox.js +1 -1
- package/dist/components/md-chip.js +1 -1
- package/dist/components/md-color-picker.js +1 -1
- package/dist/components/md-date-picker.js +1 -1
- package/dist/components/md-date-picker.js.map +1 -1
- package/dist/components/md-dialog.js +1 -1
- package/dist/components/md-dialog.js.map +1 -1
- package/dist/components/md-divider.js +1 -1
- package/dist/components/md-divider.js.map +1 -1
- package/dist/components/md-fab-menu-item.js +1 -1
- package/dist/components/md-fab-menu.js +1 -1
- package/dist/components/md-fab.js +1 -1
- package/dist/components/md-icon-button.js +1 -1
- package/dist/components/md-line-chart.js +1 -1
- package/dist/components/md-line-chart.js.map +1 -1
- package/dist/components/md-list-item.js +1 -1
- package/dist/components/md-list.js +1 -1
- package/dist/components/md-loading-indicator.js +1 -1
- package/dist/components/md-menu-item-group.js +1 -1
- package/dist/components/md-menu-item.js +1 -1
- package/dist/components/md-menu.js +1 -1
- package/dist/components/md-meter.js +1 -1
- package/dist/components/md-multi-select.js +1 -1
- package/dist/components/md-multi-select.js.map +1 -1
- package/dist/components/md-navigation-bar.js +1 -1
- package/dist/components/md-navigation-rail-tab.js +1 -1
- package/dist/components/md-navigation-rail.js +1 -1
- package/dist/components/md-navigation-tab.js +1 -1
- package/dist/components/md-number-field.js +1 -1
- package/dist/components/md-organization-chart.js +1 -1
- package/dist/components/md-otp-field.js +1 -1
- package/dist/components/md-pie-chart.js +1 -1
- package/dist/components/md-progress-indicator.js +1 -1
- package/dist/components/md-radio.js +1 -1
- package/dist/components/md-rating.js +1 -1
- package/dist/components/md-ripple.js +1 -1
- package/dist/components/md-search.js +1 -1
- package/dist/components/md-search.js.map +1 -1
- package/dist/components/md-segmented-button-set.js +1 -1
- package/dist/components/md-segmented-button.js +1 -1
- package/dist/components/md-select-option.js +1 -1
- package/dist/components/md-select.js +1 -1
- package/dist/components/md-side-sheet.js +1 -1
- package/dist/components/md-skeleton.js +1 -1
- package/dist/components/md-slider.js +1 -1
- package/dist/components/md-snackbar.js +1 -1
- package/dist/components/md-snackbar.js.map +1 -1
- package/dist/components/md-sparkline.js +1 -1
- package/dist/components/md-split-button.js +1 -1
- package/dist/components/md-status-dot.js +1 -1
- package/dist/components/md-step.js +1 -1
- package/dist/components/md-step.js.map +1 -1
- package/dist/components/md-stepper.js +1 -1
- package/dist/components/md-stepper.js.map +1 -1
- package/dist/components/md-sub-menu-item.js +1 -1
- package/dist/components/md-switch.js +1 -1
- package/dist/components/md-tab-panel.js +1 -1
- package/dist/components/md-tab-panels.js +1 -1
- package/dist/components/md-tab.js +1 -1
- package/dist/components/md-table-body.js +1 -1
- package/dist/components/md-table-cell.js +1 -1
- package/dist/components/md-table-container.js +1 -1
- package/dist/components/md-table-expand-toggle.js +1 -1
- package/dist/components/md-table-foot.js +1 -1
- package/dist/components/md-table-head.js +1 -1
- package/dist/components/md-table-pagination.js +1 -1
- package/dist/components/md-table-pagination.js.map +1 -1
- package/dist/components/md-table-row.js +1 -1
- package/dist/components/md-table-sort-label.js +1 -1
- package/dist/components/md-table-toolbar.js +1 -1
- package/dist/components/md-table.js +1 -1
- package/dist/components/md-tabs.js +1 -1
- package/dist/components/md-text-field.js +1 -1
- package/dist/components/md-time-picker.js +1 -1
- package/dist/components/md-time-picker.js.map +1 -1
- package/dist/components/md-toolbar.js +1 -1
- package/dist/components/md-tooltip.js +1 -1
- package/dist/components/md-transfer-list.js +1 -1
- package/dist/components/p-1RSrsLOs.js +2 -0
- package/dist/components/p-1RSrsLOs.js.map +1 -0
- package/dist/components/p-2HV152w7.js +2 -0
- package/dist/components/p-2HV152w7.js.map +1 -0
- package/dist/components/p-6ZDAcEKN.js +2 -0
- package/dist/components/p-6ZDAcEKN.js.map +1 -0
- package/dist/components/p-B2fYoYe9.js +2 -0
- package/dist/components/p-B2fYoYe9.js.map +1 -0
- package/dist/components/p-BR6gfOQH.js +2 -0
- package/dist/components/p-BR6gfOQH.js.map +1 -0
- package/dist/components/p-Bz-JaJcA.js +2 -0
- package/dist/components/p-Bz-JaJcA.js.map +1 -0
- package/dist/components/p-C77M30dm.js +2 -0
- package/dist/components/p-C77M30dm.js.map +1 -0
- package/dist/components/p-CNgkGl_1.js +2 -0
- package/dist/components/p-CNgkGl_1.js.map +1 -0
- package/dist/components/p-CfBPnYW7.js +2 -0
- package/dist/components/p-CfBPnYW7.js.map +1 -0
- package/dist/components/p-D5Ht729E.js +2 -0
- package/dist/components/p-D5Ht729E.js.map +1 -0
- package/dist/components/p-DPqGg8C1.js +2 -0
- package/dist/components/p-DPqGg8C1.js.map +1 -0
- package/dist/components/p-De3E5Q8v.js +2 -0
- package/dist/components/p-De3E5Q8v.js.map +1 -0
- package/dist/components/p-Dm_7DA1f.js +2 -0
- package/dist/components/p-Dm_7DA1f.js.map +1 -0
- package/dist/components/p-Dz3R-2Wn.js +2 -0
- package/dist/components/p-Dz3R-2Wn.js.map +1 -0
- package/dist/components/p-Zjf9uhOr.js +2 -0
- package/dist/components/p-Zjf9uhOr.js.map +1 -0
- package/dist/components/p-ssLobpGS.js +2 -0
- package/dist/components/p-ssLobpGS.js.map +1 -0
- package/dist/components/p-tSoecrcz.js +2 -0
- package/dist/components/p-tSoecrcz.js.map +1 -0
- package/dist/components/p-zMR3UIR_.js +2 -0
- package/dist/components/p-zMR3UIR_.js.map +1 -0
- package/dist/components-csr/index.js +2 -0
- package/dist/components-csr/index.js.map +1 -0
- package/dist/components-csr/md-accordion-item.js +2 -0
- package/dist/components-csr/md-accordion-item.js.map +1 -0
- package/dist/components-csr/md-accordion.js +2 -0
- package/dist/components-csr/md-accordion.js.map +1 -0
- package/dist/components-csr/md-app-bar.js +2 -0
- package/dist/components-csr/md-app-bar.js.map +1 -0
- package/dist/components-csr/md-area-chart.js +2 -0
- package/dist/components-csr/md-area-chart.js.map +1 -0
- package/dist/components-csr/md-autocomplete.js +2 -0
- package/dist/components-csr/md-autocomplete.js.map +1 -0
- package/dist/components-csr/md-avatar.js +2 -0
- package/dist/components-csr/md-avatar.js.map +1 -0
- package/dist/components-csr/md-badge.js +2 -0
- package/dist/components-csr/md-badge.js.map +1 -0
- package/dist/components-csr/md-bar-chart.js +2 -0
- package/dist/components-csr/md-bar-chart.js.map +1 -0
- package/dist/components-csr/md-bottom-sheet.js +2 -0
- package/dist/components-csr/md-bottom-sheet.js.map +1 -0
- package/dist/components-csr/md-breadcrumb-item.js +2 -0
- package/dist/components-csr/md-breadcrumb-item.js.map +1 -0
- package/dist/components-csr/md-breadcrumbs.js +2 -0
- package/dist/components-csr/md-breadcrumbs.js.map +1 -0
- package/dist/components-csr/md-button-group.js +2 -0
- package/dist/components-csr/md-button-group.js.map +1 -0
- package/dist/components-csr/md-button.js +2 -0
- package/dist/components-csr/md-button.js.map +1 -0
- package/dist/components-csr/md-card.js +2 -0
- package/dist/components-csr/md-card.js.map +1 -0
- package/dist/components-csr/md-checkbox.js +2 -0
- package/dist/components-csr/md-checkbox.js.map +1 -0
- package/dist/components-csr/md-chip.js +2 -0
- package/dist/components-csr/md-chip.js.map +1 -0
- package/dist/components-csr/md-color-picker.js +2 -0
- package/dist/components-csr/md-color-picker.js.map +1 -0
- package/dist/components-csr/md-date-picker.js +2 -0
- package/dist/components-csr/md-date-picker.js.map +1 -0
- package/dist/components-csr/md-dialog.js +2 -0
- package/dist/components-csr/md-dialog.js.map +1 -0
- package/dist/components-csr/md-divider.js +2 -0
- package/dist/components-csr/md-divider.js.map +1 -0
- package/dist/components-csr/md-fab-menu-item.js +2 -0
- package/dist/components-csr/md-fab-menu-item.js.map +1 -0
- package/dist/components-csr/md-fab-menu.js +2 -0
- package/dist/components-csr/md-fab-menu.js.map +1 -0
- package/dist/components-csr/md-fab.js +2 -0
- package/dist/components-csr/md-fab.js.map +1 -0
- package/dist/components-csr/md-icon-button.js +2 -0
- package/dist/components-csr/md-icon-button.js.map +1 -0
- package/dist/components-csr/md-line-chart.js +2 -0
- package/dist/components-csr/md-line-chart.js.map +1 -0
- package/dist/components-csr/md-list-item.js +2 -0
- package/dist/components-csr/md-list-item.js.map +1 -0
- package/dist/components-csr/md-list.js +2 -0
- package/dist/components-csr/md-list.js.map +1 -0
- package/dist/components-csr/md-loading-indicator.js +2 -0
- package/dist/components-csr/md-loading-indicator.js.map +1 -0
- package/dist/components-csr/md-menu-item-group.js +2 -0
- package/dist/components-csr/md-menu-item-group.js.map +1 -0
- package/dist/components-csr/md-menu-item.js +2 -0
- package/dist/components-csr/md-menu-item.js.map +1 -0
- package/dist/components-csr/md-menu.js +2 -0
- package/dist/components-csr/md-menu.js.map +1 -0
- package/dist/components-csr/md-meter.js +2 -0
- package/dist/components-csr/md-meter.js.map +1 -0
- package/dist/components-csr/md-multi-select.js +2 -0
- package/dist/components-csr/md-multi-select.js.map +1 -0
- package/dist/components-csr/md-navigation-bar.js +2 -0
- package/dist/components-csr/md-navigation-bar.js.map +1 -0
- package/dist/components-csr/md-navigation-rail-tab.js +2 -0
- package/dist/components-csr/md-navigation-rail-tab.js.map +1 -0
- package/dist/components-csr/md-navigation-rail.js +2 -0
- package/dist/components-csr/md-navigation-rail.js.map +1 -0
- package/dist/components-csr/md-navigation-tab.js +2 -0
- package/dist/components-csr/md-navigation-tab.js.map +1 -0
- package/dist/components-csr/md-number-field.js +2 -0
- package/dist/components-csr/md-number-field.js.map +1 -0
- package/dist/components-csr/md-organization-chart.js +2 -0
- package/dist/components-csr/md-organization-chart.js.map +1 -0
- package/dist/components-csr/md-otp-field.js +2 -0
- package/dist/components-csr/md-otp-field.js.map +1 -0
- package/dist/components-csr/md-pie-chart.js +2 -0
- package/dist/components-csr/md-pie-chart.js.map +1 -0
- package/dist/components-csr/md-progress-indicator.js +2 -0
- package/dist/components-csr/md-progress-indicator.js.map +1 -0
- package/dist/components-csr/md-radio.js +2 -0
- package/dist/components-csr/md-radio.js.map +1 -0
- package/dist/components-csr/md-rating.js +2 -0
- package/dist/components-csr/md-rating.js.map +1 -0
- package/dist/components-csr/md-ripple.js +2 -0
- package/dist/components-csr/md-ripple.js.map +1 -0
- package/dist/components-csr/md-search.js +2 -0
- package/dist/components-csr/md-search.js.map +1 -0
- package/dist/components-csr/md-segmented-button-set.js +2 -0
- package/dist/components-csr/md-segmented-button-set.js.map +1 -0
- package/dist/components-csr/md-segmented-button.js +2 -0
- package/dist/components-csr/md-segmented-button.js.map +1 -0
- package/dist/components-csr/md-select-option.js +2 -0
- package/dist/components-csr/md-select-option.js.map +1 -0
- package/dist/components-csr/md-select.js +2 -0
- package/dist/components-csr/md-select.js.map +1 -0
- package/dist/components-csr/md-side-sheet.js +2 -0
- package/dist/components-csr/md-side-sheet.js.map +1 -0
- package/dist/components-csr/md-skeleton.js +2 -0
- package/dist/components-csr/md-skeleton.js.map +1 -0
- package/dist/components-csr/md-slider.js +2 -0
- package/dist/components-csr/md-slider.js.map +1 -0
- package/dist/components-csr/md-snackbar.js +2 -0
- package/dist/components-csr/md-snackbar.js.map +1 -0
- package/dist/components-csr/md-sparkline.js +2 -0
- package/dist/components-csr/md-sparkline.js.map +1 -0
- package/dist/components-csr/md-split-button.js +2 -0
- package/dist/components-csr/md-split-button.js.map +1 -0
- package/dist/components-csr/md-status-dot.js +2 -0
- package/dist/components-csr/md-status-dot.js.map +1 -0
- package/dist/components-csr/md-step.js +2 -0
- package/dist/components-csr/md-step.js.map +1 -0
- package/dist/components-csr/md-stepper.js +2 -0
- package/dist/components-csr/md-stepper.js.map +1 -0
- package/dist/components-csr/md-sub-menu-item.js +2 -0
- package/dist/components-csr/md-sub-menu-item.js.map +1 -0
- package/dist/components-csr/md-switch.js +2 -0
- package/dist/components-csr/md-switch.js.map +1 -0
- package/dist/components-csr/md-tab-panel.js +2 -0
- package/dist/components-csr/md-tab-panel.js.map +1 -0
- package/dist/components-csr/md-tab-panels.js +2 -0
- package/dist/components-csr/md-tab-panels.js.map +1 -0
- package/dist/components-csr/md-tab.js +2 -0
- package/dist/components-csr/md-tab.js.map +1 -0
- package/dist/components-csr/md-table-body.js +2 -0
- package/dist/components-csr/md-table-body.js.map +1 -0
- package/dist/components-csr/md-table-cell.js +2 -0
- package/dist/components-csr/md-table-cell.js.map +1 -0
- package/dist/components-csr/md-table-container.js +2 -0
- package/dist/components-csr/md-table-container.js.map +1 -0
- package/dist/components-csr/md-table-expand-toggle.js +2 -0
- package/dist/components-csr/md-table-expand-toggle.js.map +1 -0
- package/dist/components-csr/md-table-foot.js +2 -0
- package/dist/components-csr/md-table-foot.js.map +1 -0
- package/dist/components-csr/md-table-head.js +2 -0
- package/dist/components-csr/md-table-head.js.map +1 -0
- package/dist/components-csr/md-table-pagination.js +2 -0
- package/dist/components-csr/md-table-pagination.js.map +1 -0
- package/dist/components-csr/md-table-row.js +2 -0
- package/dist/components-csr/md-table-row.js.map +1 -0
- package/dist/components-csr/md-table-sort-label.js +2 -0
- package/dist/components-csr/md-table-sort-label.js.map +1 -0
- package/dist/components-csr/md-table-toolbar.js +2 -0
- package/dist/components-csr/md-table-toolbar.js.map +1 -0
- package/dist/components-csr/md-table.js +2 -0
- package/dist/components-csr/md-table.js.map +1 -0
- package/dist/components-csr/md-tabs.js +2 -0
- package/dist/components-csr/md-tabs.js.map +1 -0
- package/dist/components-csr/md-text-field.js +2 -0
- package/dist/components-csr/md-text-field.js.map +1 -0
- package/dist/components-csr/md-time-picker.js +2 -0
- package/dist/components-csr/md-time-picker.js.map +1 -0
- package/dist/components-csr/md-toolbar.js +2 -0
- package/dist/components-csr/md-toolbar.js.map +1 -0
- package/dist/components-csr/md-tooltip.js +2 -0
- package/dist/components-csr/md-tooltip.js.map +1 -0
- package/dist/components-csr/md-transfer-list.js +2 -0
- package/dist/components-csr/md-transfer-list.js.map +1 -0
- package/dist/components-csr/p-6WgHjhDg.js +2 -0
- package/dist/components-csr/p-6WgHjhDg.js.map +1 -0
- package/dist/{components/p-uTEkf0sE.js → components-csr/p-BEmwDSzw.js} +2 -2
- package/dist/{components/p-C8EP4S21.js → components-csr/p-BQKzjYcY.js} +2 -2
- package/dist/{components/p-BwXpiUsu.js → components-csr/p-BWMwewtY.js} +2 -2
- package/dist/{components/p-DXXUoRSH.js → components-csr/p-BZakoRau.js} +2 -2
- package/dist/components-csr/p-BZakoRau.js.map +1 -0
- package/dist/{md3/p-BjYKc1Ge.js → components-csr/p-BdEoSBtL.js} +2 -2
- package/dist/components-csr/p-BdEoSBtL.js.map +1 -0
- package/dist/{components/p-B0Opn6dK.js → components-csr/p-Bkt_X-6v.js} +2 -2
- package/dist/components-csr/p-Bx6--dQF.js.map +1 -0
- package/dist/components-csr/p-Bz-JaJcA.js +2 -0
- package/dist/components-csr/p-Bz-JaJcA.js.map +1 -0
- package/dist/{components/p-stybaFzj.js → components-csr/p-C3vB0Hd9.js} +2 -2
- package/dist/{components/p-B3MWYEEJ.js → components-csr/p-CF7mq5T7.js} +2 -2
- package/dist/{components/p-7fN_yCXW.js → components-csr/p-CVMM-tdC.js} +2 -2
- package/dist/components-csr/p-C_ogF68H.js.map +1 -0
- package/dist/components-csr/p-Cch_V1vi.js +2 -0
- package/dist/components-csr/p-Cch_V1vi.js.map +1 -0
- package/dist/components-csr/p-CfBPnYW7.js +2 -0
- package/dist/components-csr/p-CfBPnYW7.js.map +1 -0
- package/dist/components-csr/p-CxhZdOPw.js +2 -0
- package/dist/components-csr/p-CxhZdOPw.js.map +1 -0
- package/dist/{components/p-Ch2-tttM.js → components-csr/p-DMQ-6aj8.js} +2 -2
- package/dist/components-csr/p-DWxN44zD.js +2 -0
- package/dist/components-csr/p-DWxN44zD.js.map +1 -0
- package/dist/components-csr/p-DYBUr7K_.js +2 -0
- package/dist/components-csr/p-DYBUr7K_.js.map +1 -0
- package/dist/{components/p-e2HRV63Y.js → components-csr/p-DfcpeJAu.js} +2 -2
- package/dist/{components/p-Dp-w93ot.js → components-csr/p-DjKPc5EU.js} +2 -2
- package/dist/components-csr/p-DvOKnoqK.js.map +1 -0
- package/dist/components-csr/p-DzPKu-Ma.js.map +1 -0
- package/dist/{components/p-UdGDg2oJ.js → components-csr/p-If0JHsYV.js} +2 -2
- package/dist/components-csr/p-If0JHsYV.js.map +1 -0
- package/dist/components-csr/p-RLxbNqRv.js.map +1 -0
- package/dist/{components/p-6wZSqm_2.js → components-csr/p-R_guULjT.js} +2 -2
- package/dist/components-csr/p-bSpXNc5J.js +2 -0
- package/dist/components-csr/p-bSpXNc5J.js.map +1 -0
- package/dist/{components/p-Ddiw2Kjw.js → components-csr/p-uSMrgqAy.js} +2 -2
- package/dist/components-csr/package.json +3 -0
- package/dist/esm/{a11y-C6CRqodW.js → a11y-BckJ95d7.js} +3 -3
- package/dist/esm/{a11y-C6CRqodW.js.map → a11y-BckJ95d7.js.map} +1 -1
- package/dist/esm/app-globals-DQuL1Twl.js +6 -0
- package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
- package/dist/esm/{bar-chart-ZZrajEkM.js → bar-chart-BuTyuCbt.js} +4 -4
- package/dist/esm/{bar-chart-ZZrajEkM.js.map → bar-chart-BuTyuCbt.js.map} +1 -1
- package/dist/esm/{chart-32olae06.js → chart-ByIhkqsG.js} +4 -4
- package/dist/esm/{chart-32olae06.js.map → chart-ByIhkqsG.js.map} +1 -1
- package/dist/esm/engine.wasm-CfBPnYW7.js +10 -0
- package/dist/esm/engine.wasm-CfBPnYW7.js.map +1 -0
- package/dist/esm/{hit-test-DHldf5Lm.js → hit-test-c_hI-yCX.js} +3 -3
- package/dist/esm/{hit-test-DHldf5Lm.js.map → hit-test-c_hI-yCX.js.map} +1 -1
- package/dist/esm/{index-DTaX19_O.js → index-WmvQpZnM.js} +5 -15
- package/dist/esm/index-WmvQpZnM.js.map +1 -0
- package/dist/esm/lazy-loading-indicator-BWFcjJiK.js +67 -0
- package/dist/esm/lazy-loading-indicator-BWFcjJiK.js.map +1 -0
- package/dist/esm/loader.js +4 -3
- package/dist/esm/loader.js.map +1 -1
- package/dist/esm/md-accordion-item.entry.js +4 -4
- package/dist/esm/md-accordion.entry.js +1 -1
- package/dist/esm/md-app-bar.entry.js +2 -2
- package/dist/esm/md-area-chart.entry.js +7 -7
- package/dist/esm/md-autocomplete.entry.js +6 -5
- package/dist/esm/md-autocomplete.entry.js.map +1 -1
- package/dist/esm/md-avatar_2.entry.js +4 -4
- package/dist/esm/md-badge.entry.js +3 -3
- package/dist/esm/md-bar-chart.entry.js +7 -7
- package/dist/esm/md-bottom-sheet.entry.js +5 -5
- package/dist/esm/md-breadcrumb-item.entry.js +2 -2
- package/dist/esm/md-breadcrumbs.entry.js +3 -3
- package/dist/esm/md-button-group.entry.js +3 -3
- package/dist/esm/{md-button_7.entry.js → md-button_6.entry.js} +16 -40
- package/dist/esm/md-button_6.entry.js.map +1 -0
- package/dist/esm/md-checkbox.entry.js +3 -3
- package/dist/esm/md-chip.entry.js +3 -3
- package/dist/esm/md-color-picker.entry.js +1 -1
- package/dist/esm/md-date-picker.entry.js +2 -2
- package/dist/esm/md-dialog.entry.js +3 -3
- package/dist/esm/md-divider.entry.js +3 -3
- package/dist/esm/md-fab-menu-item.entry.js +3 -3
- package/dist/esm/md-fab-menu.entry.js +3 -3
- package/dist/esm/md-fab.entry.js +3 -3
- package/dist/esm/md-line-chart.entry.js +7 -7
- package/dist/esm/md-list-item.entry.js +5 -5
- package/dist/esm/md-list.entry.js +4 -4
- package/dist/esm/md-loading-indicator-Bf-Pt29l.js +31 -0
- package/dist/esm/md-loading-indicator-Bf-Pt29l.js.map +1 -0
- package/dist/esm/md-loading-indicator.entry.js +5 -0
- package/dist/esm/md-loading-indicator.entry.js.map +1 -0
- package/dist/esm/md-menu-item-group.entry.js +1 -1
- package/dist/esm/md-menu_2.entry.js +6 -6
- package/dist/esm/md-meter.entry.js +1 -1
- package/dist/esm/md-multi-select.entry.js +7 -6
- package/dist/esm/md-multi-select.entry.js.map +1 -1
- package/dist/esm/md-navigation-bar.entry.js +2 -2
- package/dist/esm/md-navigation-rail-tab.entry.js +2 -2
- package/dist/esm/md-navigation-rail.entry.js +1 -1
- package/dist/esm/md-navigation-tab.entry.js +4 -4
- package/dist/esm/md-number-field.entry.js +3 -3
- package/dist/esm/md-organization-chart.entry.js +3 -3
- package/dist/esm/md-otp-field.entry.js +4 -4
- package/dist/esm/md-pie-chart.entry.js +3 -3
- package/dist/esm/md-progress-indicator.entry.js +1 -1
- package/dist/esm/md-rating.entry.js +1 -1
- package/dist/esm/md-search.entry.js +8 -7
- package/dist/esm/md-search.entry.js.map +1 -1
- package/dist/esm/md-segmented-button-set.entry.js +1 -1
- package/dist/esm/md-segmented-button.entry.js +1 -1
- package/dist/esm/md-select-option.entry.js +2 -2
- package/dist/esm/md-select.entry.js +7 -6
- package/dist/esm/md-select.entry.js.map +1 -1
- package/dist/esm/md-side-sheet.entry.js +1 -1
- package/dist/esm/md-skeleton.entry.js +1 -1
- package/dist/esm/md-slider.entry.js +3 -3
- package/dist/esm/md-sparkline.entry.js +7 -7
- package/dist/esm/md-split-button.entry.js +1 -1
- package/dist/esm/md-status-dot.entry.js +2 -2
- package/dist/esm/md-step.entry.js +1 -1
- package/dist/esm/md-stepper.entry.js +1 -1
- package/dist/esm/md-sub-menu-item.entry.js +1 -1
- package/dist/esm/md-switch.entry.js +1 -1
- package/dist/esm/md-tab-panel.entry.js +1 -1
- package/dist/esm/md-tab-panels.entry.js +1 -1
- package/dist/esm/md-tab.entry.js +1 -1
- package/dist/esm/md-table-body.entry.js +1 -1
- package/dist/esm/md-table-cell.entry.js +1 -1
- package/dist/esm/md-table-container.entry.js +1 -1
- package/dist/esm/md-table-expand-toggle.entry.js +1 -1
- package/dist/esm/md-table-foot.entry.js +1 -1
- package/dist/esm/md-table-head.entry.js +1 -1
- package/dist/esm/md-table-pagination.entry.js +1 -1
- package/dist/esm/md-table-row.entry.js +1 -1
- package/dist/esm/md-table-sort-label.entry.js +1 -1
- package/dist/esm/md-table-toolbar.entry.js +1 -1
- package/dist/esm/md-table.entry.js +4 -4
- package/dist/esm/md-tabs.entry.js +1 -1
- package/dist/esm/md-text-field.entry.js +8 -8
- package/dist/esm/md-time-picker.entry.js +2 -2
- package/dist/esm/md-toolbar.entry.js +1 -1
- package/dist/esm/md-transfer-list.entry.js +2 -2
- package/dist/esm/md3.js +4 -3
- package/dist/esm/md3.js.map +1 -1
- package/dist/esm/{rtl-DvOKnoqK.js → rtl-CVFH1DkU.js} +3 -3
- package/dist/esm/{rtl-DvOKnoqK.js.map → rtl-CVFH1DkU.js.map} +1 -1
- package/dist/esm/{url-BjYKc1Ge.js → url-BdEoSBtL.js} +3 -3
- package/dist/esm/{url-BjYKc1Ge.js.map → url-BdEoSBtL.js.map} +1 -1
- package/dist/esm/{virtual-select-controller-BEWIC0pC.js → virtual-select-controller-CR60w6DO.js} +10 -9
- package/dist/esm/virtual-select-controller-CR60w6DO.js.map +1 -0
- package/dist/md3/md3.css +1 -1
- package/dist/md3/md3.esm.js +1 -1
- package/dist/md3/md3.esm.js.map +1 -1
- package/dist/md3/p-08f1c469.entry.js +2 -0
- package/dist/md3/{p-4d82132d.entry.js.map → p-08f1c469.entry.js.map} +1 -1
- package/dist/md3/{p-9ddbf247.entry.js → p-108f89d7.entry.js} +2 -2
- package/dist/md3/p-1112bffc.entry.js +2 -0
- package/dist/md3/{p-cf07e761.entry.js.map → p-1112bffc.entry.js.map} +1 -1
- package/dist/md3/{p-c6a12344.entry.js → p-114c270b.entry.js} +2 -2
- package/dist/md3/p-1835fe36.entry.js +2 -0
- package/dist/md3/{p-a3308c40.entry.js.map → p-1835fe36.entry.js.map} +1 -1
- package/dist/md3/{p-396089fd.entry.js → p-1edb5a0d.entry.js} +2 -2
- package/dist/md3/p-2ba2db3b.entry.js +2 -0
- package/dist/md3/{p-6b2871a0.entry.js.map → p-2ba2db3b.entry.js.map} +1 -1
- package/dist/md3/p-3508d0e0.entry.js +2 -0
- package/dist/md3/{p-f31ab454.entry.js.map → p-3508d0e0.entry.js.map} +1 -1
- package/dist/md3/{p-b34d385b.entry.js → p-35b05b45.entry.js} +2 -2
- package/dist/md3/{p-c2dd8c8c.entry.js → p-38e9a583.entry.js} +2 -2
- package/dist/md3/{p-be02624e.entry.js → p-3c0469aa.entry.js} +2 -2
- package/dist/md3/p-3f64a27d.entry.js +2 -0
- package/dist/md3/{p-fb61868c.entry.js.map → p-3f64a27d.entry.js.map} +1 -1
- package/dist/md3/{p-63b8c8d1.entry.js → p-408ee4be.entry.js} +2 -2
- package/dist/md3/{p-edb34a6d.entry.js → p-43c708ad.entry.js} +2 -2
- package/dist/md3/{p-3015c7e3.entry.js → p-4770b534.entry.js} +2 -2
- package/dist/md3/{p-c861d774.entry.js → p-4b7cf934.entry.js} +2 -2
- package/dist/md3/{p-2e09a7b7.entry.js → p-4f26bd60.entry.js} +2 -2
- package/dist/md3/{p-7b463fbe.entry.js → p-4f2e82cb.entry.js} +2 -2
- package/dist/md3/{p-be412e3f.entry.js → p-501bf161.entry.js} +2 -2
- package/dist/md3/{p-c063c823.entry.js → p-56c7c570.entry.js} +2 -2
- package/dist/md3/{p-2e9503d7.entry.js → p-56ca0c3c.entry.js} +2 -2
- package/dist/md3/{p-ac8762e5.entry.js → p-5b63149a.entry.js} +2 -2
- package/dist/md3/{p-c5af701b.entry.js → p-5f668b0a.entry.js} +2 -2
- package/dist/md3/p-6237ddac.entry.js +2 -0
- package/dist/md3/{p-e7dc5a32.entry.js.map → p-6237ddac.entry.js.map} +1 -1
- package/dist/md3/{p-8eb0b6a4.entry.js → p-6d65fc6a.entry.js} +2 -2
- package/dist/md3/{p-e3124e1e.entry.js → p-707b6d7c.entry.js} +2 -2
- package/dist/md3/{p-a5fee424.entry.js → p-71f1660b.entry.js} +2 -2
- package/dist/md3/{p-1a8ec5bc.entry.js → p-7501170f.entry.js} +2 -2
- package/dist/md3/p-7c8842bf.entry.js +2 -0
- package/dist/md3/{p-ba2ebde1.entry.js.map → p-7c8842bf.entry.js.map} +1 -1
- package/dist/md3/{p-4e3d6e40.entry.js → p-7d1686a7.entry.js} +2 -2
- package/dist/md3/p-7e7f0e45.entry.js +2 -0
- package/dist/md3/p-7e7f0e45.entry.js.map +1 -0
- package/dist/md3/p-80379565.entry.js +2 -0
- package/dist/md3/{p-6c44cf13.entry.js.map → p-80379565.entry.js.map} +1 -1
- package/dist/md3/p-830724e4.entry.js +2 -0
- package/dist/md3/p-830724e4.entry.js.map +1 -0
- package/dist/md3/{p-4dda4cb0.entry.js → p-845ca9cc.entry.js} +2 -2
- package/dist/md3/{p-77a01bcc.entry.js → p-87f88d62.entry.js} +2 -2
- package/dist/md3/{p-5b74694e.entry.js → p-89d47130.entry.js} +2 -2
- package/dist/md3/p-8a6fed13.entry.js +2 -0
- package/dist/md3/{p-a803da99.entry.js.map → p-8a6fed13.entry.js.map} +1 -1
- package/dist/md3/p-8a7e0297.entry.js +2 -0
- package/dist/md3/p-8a7e0297.entry.js.map +1 -0
- package/dist/md3/{p-b0431a5c.entry.js → p-8bdcda53.entry.js} +2 -2
- package/dist/md3/{p-c10a33c2.entry.js → p-8e7df348.entry.js} +2 -2
- package/dist/md3/p-9003a7d4.entry.js +2 -0
- package/dist/md3/p-9003a7d4.entry.js.map +1 -0
- package/dist/md3/{p-05ae91b6.entry.js → p-90ccf4c3.entry.js} +2 -2
- package/dist/md3/p-BdEoSBtL.js +2 -0
- package/dist/md3/{p-BjYKc1Ge.js.map → p-BdEoSBtL.js.map} +1 -1
- package/dist/md3/p-Bz-JaJcA.js +2 -0
- package/dist/md3/p-Bz-JaJcA.js.map +1 -0
- package/dist/md3/p-CGqeEMjY.js +2 -0
- package/dist/md3/{p-DzPKu-Ma.js.map → p-CGqeEMjY.js.map} +1 -1
- package/dist/md3/p-CVFH1DkU.js +2 -0
- package/dist/md3/{p-DvOKnoqK.js.map → p-CVFH1DkU.js.map} +1 -1
- package/dist/md3/p-Cch92tDM.js +2 -0
- package/dist/md3/{p-RLxbNqRv.js.map → p-Cch92tDM.js.map} +1 -1
- package/dist/md3/p-CfBPnYW7.js +2 -0
- package/dist/md3/p-CfBPnYW7.js.map +1 -0
- package/dist/md3/p-D17cVKxS.js +2 -0
- package/dist/md3/p-D17cVKxS.js.map +1 -0
- package/dist/md3/p-DGtztV3K.js +2 -0
- package/dist/md3/{p-Bx6--dQF.js.map → p-DGtztV3K.js.map} +1 -1
- package/dist/md3/p-DQuL1Twl.js +2 -0
- package/dist/md3/p-DQuL1Twl.js.map +1 -0
- package/dist/md3/p-DnKDoE8K.js +2 -0
- package/dist/md3/p-DnKDoE8K.js.map +1 -0
- package/dist/md3/p-WmvQpZnM.js +3 -0
- package/dist/md3/p-WmvQpZnM.js.map +1 -0
- package/dist/md3/p-a3623653.entry.js +2 -0
- package/dist/md3/{p-19ee9c33.entry.js.map → p-a3623653.entry.js.map} +1 -1
- package/dist/md3/{p-da4e27d4.entry.js → p-a4d4cfed.entry.js} +2 -2
- package/dist/md3/{p-5394254f.entry.js → p-a976498b.entry.js} +2 -2
- package/dist/md3/{p-6038b907.entry.js → p-ab568d1c.entry.js} +2 -2
- package/dist/md3/{p-bf7842f8.entry.js → p-adf8a415.entry.js} +2 -2
- package/dist/md3/p-ae30e899.entry.js +2 -0
- package/dist/md3/p-ae30e899.entry.js.map +1 -0
- package/dist/md3/{p-45280bf4.entry.js → p-b2d88292.entry.js} +2 -2
- package/dist/md3/{p-796f79f8.entry.js → p-b3b5247b.entry.js} +2 -2
- package/dist/md3/{p-5b799707.entry.js → p-b4266f6b.entry.js} +2 -2
- package/dist/md3/p-b54bbf88.entry.js +2 -0
- package/dist/md3/p-b54bbf88.entry.js.map +1 -0
- package/dist/md3/{p-c00f7514.entry.js → p-ba011453.entry.js} +2 -2
- package/dist/md3/{p-6ba63c73.entry.js → p-bc24f0c9.entry.js} +2 -2
- package/dist/md3/{p-0c2e824d.entry.js → p-c20fbb9e.entry.js} +2 -2
- package/dist/md3/{p-fc0b325d.entry.js → p-c2944c87.entry.js} +2 -2
- package/dist/md3/{p-4e45b2ff.entry.js → p-c58c68d0.entry.js} +2 -2
- package/dist/md3/p-cc6e8afd.entry.js +2 -0
- package/dist/md3/{p-72457a85.entry.js.map → p-cc6e8afd.entry.js.map} +1 -1
- package/dist/md3/{p-0f764a1e.entry.js → p-d2e39c6e.entry.js} +2 -2
- package/dist/md3/{p-50555bb7.entry.js → p-d8885f53.entry.js} +2 -2
- package/dist/md3/{p-c1ca6f6c.entry.js → p-db6fb4e1.entry.js} +2 -2
- package/dist/md3/{p-81843ff7.entry.js → p-dcba2857.entry.js} +2 -2
- package/dist/md3/{p-65195996.entry.js → p-e357e8ac.entry.js} +2 -2
- package/dist/md3/{p-39cb7c24.entry.js → p-e5c6795e.entry.js} +2 -2
- package/dist/md3/p-e871663b.entry.js +2 -0
- package/dist/md3/{p-aaec2698.entry.js.map → p-e871663b.entry.js.map} +1 -1
- package/dist/md3/p-f1b69181.entry.js +2 -0
- package/dist/md3/{p-a986fd24.entry.js.map → p-f1b69181.entry.js.map} +1 -1
- package/dist/md3/p-f297d786.entry.js +2 -0
- package/dist/md3/{p-3cce1de3.entry.js.map → p-f297d786.entry.js.map} +1 -1
- package/dist/md3/{p-e6d7f0ff.entry.js → p-f403ad20.entry.js} +2 -2
- package/dist/md3/p-f5399b73.entry.js +2 -0
- package/dist/md3/{p-04e97f5d.entry.js.map → p-f5399b73.entry.js.map} +1 -1
- package/dist/md3/{p-708a9313.entry.js → p-f5fd9a0b.entry.js} +2 -2
- package/dist/md3/{p-aa0e7d4d.entry.js → p-f71af38f.entry.js} +2 -2
- package/dist/md3/{p-757e3aaf.entry.js → p-fac6da4c.entry.js} +2 -2
- package/dist/md3/{p-134b670a.entry.js → p-fc864f96.entry.js} +2 -2
- package/dist/md3/{p-32bdd439.entry.js → p-fd686966.entry.js} +2 -2
- package/dist/md3/p-nhfFYWzy.js +2 -0
- package/dist/md3/{p-C_ogF68H.js.map → p-nhfFYWzy.js.map} +1 -1
- package/dist/types/utils/lazy-loading-indicator.d.ts +7 -0
- package/dist/types/wasm/engine-abi.d.ts +14 -0
- package/hydrate/index.js +191 -113
- package/hydrate/index.mjs +191 -113
- package/package.json +30 -5
- package/dist/cjs/index-DlQ_5_Mv.js.map +0 -1
- package/dist/cjs/md-button_7.cjs.entry.js.map +0 -1
- package/dist/cjs/virtual-select-controller-CqriaZgm.js.map +0 -1
- package/dist/components/p-BEWIC0pC.js +0 -2
- package/dist/components/p-BEWIC0pC.js.map +0 -1
- package/dist/components/p-DXXUoRSH.js.map +0 -1
- package/dist/components/p-MWBNn6Lj.js +0 -2
- package/dist/components/p-MWBNn6Lj.js.map +0 -1
- package/dist/components/p-UdGDg2oJ.js.map +0 -1
- package/dist/esm/index-DTaX19_O.js.map +0 -1
- package/dist/esm/md-button_7.entry.js.map +0 -1
- package/dist/esm/virtual-select-controller-BEWIC0pC.js.map +0 -1
- package/dist/md3/p-04e97f5d.entry.js +0 -2
- package/dist/md3/p-19ee9c33.entry.js +0 -2
- package/dist/md3/p-21772851.entry.js +0 -2
- package/dist/md3/p-21772851.entry.js.map +0 -1
- package/dist/md3/p-3cce1de3.entry.js +0 -2
- package/dist/md3/p-47af9819.entry.js +0 -2
- package/dist/md3/p-47af9819.entry.js.map +0 -1
- package/dist/md3/p-4d82132d.entry.js +0 -2
- package/dist/md3/p-6b2871a0.entry.js +0 -2
- package/dist/md3/p-6c44cf13.entry.js +0 -2
- package/dist/md3/p-72457a85.entry.js +0 -2
- package/dist/md3/p-BEWIC0pC.js +0 -2
- package/dist/md3/p-BEWIC0pC.js.map +0 -1
- package/dist/md3/p-DTaX19_O.js +0 -3
- package/dist/md3/p-DTaX19_O.js.map +0 -1
- package/dist/md3/p-a3308c40.entry.js +0 -2
- package/dist/md3/p-a7ffb779.entry.js +0 -2
- package/dist/md3/p-a7ffb779.entry.js.map +0 -1
- package/dist/md3/p-a803da99.entry.js +0 -2
- package/dist/md3/p-a986fd24.entry.js +0 -2
- package/dist/md3/p-aaec2698.entry.js +0 -2
- package/dist/md3/p-ac35ac5f.entry.js +0 -2
- package/dist/md3/p-ac35ac5f.entry.js.map +0 -1
- package/dist/md3/p-b4631a55.entry.js +0 -2
- package/dist/md3/p-b4631a55.entry.js.map +0 -1
- package/dist/md3/p-ba2ebde1.entry.js +0 -2
- package/dist/md3/p-cf07e761.entry.js +0 -2
- package/dist/md3/p-e7dc5a32.entry.js +0 -2
- package/dist/md3/p-f31ab454.entry.js +0 -2
- package/dist/md3/p-fb61868c.entry.js +0 -2
- /package/dist/{components/p-uTEkf0sE.js.map → components-csr/p-BEmwDSzw.js.map} +0 -0
- /package/dist/{components/p-C8EP4S21.js.map → components-csr/p-BQKzjYcY.js.map} +0 -0
- /package/dist/{components/p-BwXpiUsu.js.map → components-csr/p-BWMwewtY.js.map} +0 -0
- /package/dist/{components/p-B0Opn6dK.js.map → components-csr/p-Bkt_X-6v.js.map} +0 -0
- /package/dist/{md3 → components-csr}/p-Bx6--dQF.js +0 -0
- /package/dist/{components/p-stybaFzj.js.map → components-csr/p-C3vB0Hd9.js.map} +0 -0
- /package/dist/{components/p-B3MWYEEJ.js.map → components-csr/p-CF7mq5T7.js.map} +0 -0
- /package/dist/{components/p-7fN_yCXW.js.map → components-csr/p-CVMM-tdC.js.map} +0 -0
- /package/dist/{md3 → components-csr}/p-C_ogF68H.js +0 -0
- /package/dist/{components/p-Ch2-tttM.js.map → components-csr/p-DMQ-6aj8.js.map} +0 -0
- /package/dist/{components/p-e2HRV63Y.js.map → components-csr/p-DfcpeJAu.js.map} +0 -0
- /package/dist/{components/p-Dp-w93ot.js.map → components-csr/p-DjKPc5EU.js.map} +0 -0
- /package/dist/{md3 → components-csr}/p-DvOKnoqK.js +0 -0
- /package/dist/{md3 → components-csr}/p-DzPKu-Ma.js +0 -0
- /package/dist/{md3 → components-csr}/p-RLxbNqRv.js +0 -0
- /package/dist/{components/p-6wZSqm_2.js.map → components-csr/p-R_guULjT.js.map} +0 -0
- /package/dist/{components/p-Ddiw2Kjw.js.map → components-csr/p-uSMrgqAy.js.map} +0 -0
- /package/dist/md3/{p-9ddbf247.entry.js.map → p-108f89d7.entry.js.map} +0 -0
- /package/dist/md3/{p-c6a12344.entry.js.map → p-114c270b.entry.js.map} +0 -0
- /package/dist/md3/{p-396089fd.entry.js.map → p-1edb5a0d.entry.js.map} +0 -0
- /package/dist/md3/{p-b34d385b.entry.js.map → p-35b05b45.entry.js.map} +0 -0
- /package/dist/md3/{p-c2dd8c8c.entry.js.map → p-38e9a583.entry.js.map} +0 -0
- /package/dist/md3/{p-be02624e.entry.js.map → p-3c0469aa.entry.js.map} +0 -0
- /package/dist/md3/{p-63b8c8d1.entry.js.map → p-408ee4be.entry.js.map} +0 -0
- /package/dist/md3/{p-edb34a6d.entry.js.map → p-43c708ad.entry.js.map} +0 -0
- /package/dist/md3/{p-3015c7e3.entry.js.map → p-4770b534.entry.js.map} +0 -0
- /package/dist/md3/{p-c861d774.entry.js.map → p-4b7cf934.entry.js.map} +0 -0
- /package/dist/md3/{p-2e09a7b7.entry.js.map → p-4f26bd60.entry.js.map} +0 -0
- /package/dist/md3/{p-7b463fbe.entry.js.map → p-4f2e82cb.entry.js.map} +0 -0
- /package/dist/md3/{p-be412e3f.entry.js.map → p-501bf161.entry.js.map} +0 -0
- /package/dist/md3/{p-c063c823.entry.js.map → p-56c7c570.entry.js.map} +0 -0
- /package/dist/md3/{p-2e9503d7.entry.js.map → p-56ca0c3c.entry.js.map} +0 -0
- /package/dist/md3/{p-ac8762e5.entry.js.map → p-5b63149a.entry.js.map} +0 -0
- /package/dist/md3/{p-c5af701b.entry.js.map → p-5f668b0a.entry.js.map} +0 -0
- /package/dist/md3/{p-8eb0b6a4.entry.js.map → p-6d65fc6a.entry.js.map} +0 -0
- /package/dist/md3/{p-e3124e1e.entry.js.map → p-707b6d7c.entry.js.map} +0 -0
- /package/dist/md3/{p-a5fee424.entry.js.map → p-71f1660b.entry.js.map} +0 -0
- /package/dist/md3/{p-1a8ec5bc.entry.js.map → p-7501170f.entry.js.map} +0 -0
- /package/dist/md3/{p-4e3d6e40.entry.js.map → p-7d1686a7.entry.js.map} +0 -0
- /package/dist/md3/{p-4dda4cb0.entry.js.map → p-845ca9cc.entry.js.map} +0 -0
- /package/dist/md3/{p-77a01bcc.entry.js.map → p-87f88d62.entry.js.map} +0 -0
- /package/dist/md3/{p-5b74694e.entry.js.map → p-89d47130.entry.js.map} +0 -0
- /package/dist/md3/{p-b0431a5c.entry.js.map → p-8bdcda53.entry.js.map} +0 -0
- /package/dist/md3/{p-c10a33c2.entry.js.map → p-8e7df348.entry.js.map} +0 -0
- /package/dist/md3/{p-05ae91b6.entry.js.map → p-90ccf4c3.entry.js.map} +0 -0
- /package/dist/md3/{p-da4e27d4.entry.js.map → p-a4d4cfed.entry.js.map} +0 -0
- /package/dist/md3/{p-5394254f.entry.js.map → p-a976498b.entry.js.map} +0 -0
- /package/dist/md3/{p-6038b907.entry.js.map → p-ab568d1c.entry.js.map} +0 -0
- /package/dist/md3/{p-bf7842f8.entry.js.map → p-adf8a415.entry.js.map} +0 -0
- /package/dist/md3/{p-45280bf4.entry.js.map → p-b2d88292.entry.js.map} +0 -0
- /package/dist/md3/{p-796f79f8.entry.js.map → p-b3b5247b.entry.js.map} +0 -0
- /package/dist/md3/{p-5b799707.entry.js.map → p-b4266f6b.entry.js.map} +0 -0
- /package/dist/md3/{p-c00f7514.entry.js.map → p-ba011453.entry.js.map} +0 -0
- /package/dist/md3/{p-6ba63c73.entry.js.map → p-bc24f0c9.entry.js.map} +0 -0
- /package/dist/md3/{p-0c2e824d.entry.js.map → p-c20fbb9e.entry.js.map} +0 -0
- /package/dist/md3/{p-fc0b325d.entry.js.map → p-c2944c87.entry.js.map} +0 -0
- /package/dist/md3/{p-4e45b2ff.entry.js.map → p-c58c68d0.entry.js.map} +0 -0
- /package/dist/md3/{p-0f764a1e.entry.js.map → p-d2e39c6e.entry.js.map} +0 -0
- /package/dist/md3/{p-50555bb7.entry.js.map → p-d8885f53.entry.js.map} +0 -0
- /package/dist/md3/{p-c1ca6f6c.entry.js.map → p-db6fb4e1.entry.js.map} +0 -0
- /package/dist/md3/{p-81843ff7.entry.js.map → p-dcba2857.entry.js.map} +0 -0
- /package/dist/md3/{p-65195996.entry.js.map → p-e357e8ac.entry.js.map} +0 -0
- /package/dist/md3/{p-39cb7c24.entry.js.map → p-e5c6795e.entry.js.map} +0 -0
- /package/dist/md3/{p-e6d7f0ff.entry.js.map → p-f403ad20.entry.js.map} +0 -0
- /package/dist/md3/{p-708a9313.entry.js.map → p-f5fd9a0b.entry.js.map} +0 -0
- /package/dist/md3/{p-aa0e7d4d.entry.js.map → p-f71af38f.entry.js.map} +0 -0
- /package/dist/md3/{p-757e3aaf.entry.js.map → p-fac6da4c.entry.js.map} +0 -0
- /package/dist/md3/{p-134b670a.entry.js.map → p-fc864f96.entry.js.map} +0 -0
- /package/dist/md3/{p-32bdd439.entry.js.map → p-fd686966.entry.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"virtual-select-controller-CqriaZgm.js","sources":["src/utils/select-options.ts","src/utils/virtual-window.ts","src/wasm/engine.wasm.ts","src/wasm/engine-abi.ts","src/utils/wasm-option-store.ts","src/utils/virtual-select-controller.ts"],"sourcesContent":["/**\n * Shared option model + reader for `md-select` / `md-multi-select`.\n *\n * Both components accept options two ways (decided by the consumer):\n * 1. Declarative slotted `<md-select-option>` children (primary API —\n * framework-friendly, supports rich labels + per-option icons).\n * 2. A programmatic `options` array prop (data-driven lists).\n *\n * `collectOptions()` normalises either source into a single flat\n * `SelectOptionData[]` the pickers render into `md-menu-item`s. When\n * slotted children are present they take precedence; otherwise the\n * array prop is used. This keeps the result predictable (no silent\n * duplication when a consumer accidentally supplies both).\n */\n\n/** Normalised option the pickers render. */\nexport interface SelectOptionData {\n /** Stable identifier — emitted in the picker `value` and used for matching. */\n value: string;\n /** Visible label rendered in the menu, chips, and the trigger text. */\n label: string;\n /** Disabled options stay visible but cannot be selected. */\n disabled: boolean;\n /** Optional Material Symbols leading-icon glyph. */\n icon?: string;\n /** Optional CSS colour applied to the leading icon (e.g. a status/swatch hue).\n * Any CSS `<color>` — hex, `rgb()`, or a theme token like\n * `var(--md-sys-color-primary)`. Ignored when the option has no `icon`, and\n * not carried on the virtualized (WASM) path — huge datasets fall back to the\n * `--md-{multi-}select-option-icon-color` token. */\n iconColor?: string;\n /** Optional secondary text rendered under the label in the menu. */\n supportingText?: string;\n /** Initial-selected hint carried by the option element / array entry. */\n selected?: boolean;\n}\n\n/** Programmatic option entry accepted by the `options` array prop. */\nexport interface SelectOptionInit {\n value: string;\n label?: string;\n disabled?: boolean;\n icon?: string;\n iconColor?: string;\n supportingText?: string;\n selected?: boolean;\n}\n\n/** Element-side shape of a slotted `<md-select-option>`. */\ninterface SelectOptionEl extends HTMLElement {\n value?: string;\n label?: string;\n disabled?: boolean;\n icon?: string;\n iconColor?: string;\n supportingText?: string;\n selected?: boolean;\n}\n\nfunction fromElement(el: SelectOptionEl): SelectOptionData {\n const label = (el.label || el.getAttribute('label') || el.textContent || '').trim();\n return {\n value: el.value ?? el.getAttribute('value') ?? '',\n label,\n disabled: el.disabled ?? el.hasAttribute('disabled'),\n icon: el.icon || el.getAttribute('icon') || undefined,\n iconColor: el.iconColor || el.getAttribute('icon-color') || undefined,\n supportingText:\n el.supportingText || el.getAttribute('supporting-text') || undefined,\n selected: el.selected ?? el.hasAttribute('selected'),\n };\n}\n\nfunction fromInit(o: SelectOptionInit): SelectOptionData {\n return {\n value: o.value,\n label: o.label ?? o.value,\n disabled: !!o.disabled,\n icon: o.icon,\n iconColor: o.iconColor,\n supportingText: o.supportingText,\n selected: !!o.selected,\n };\n}\n\n/**\n * A dataset given as a row factory rather than a materialised array, so very\n * large option sets (tens of millions) can be streamed into the WASM store\n * without ever holding the whole array in JS at once.\n */\nexport interface OptionRowSource {\n count: number;\n getRow: (index: number) => SelectOptionInit;\n}\n\n/**\n * Type guard distinguishing a row factory from a materialised array.\n * (`Array.isArray` doesn't narrow a `readonly[]` union, so this is explicit.)\n */\nexport function isRowSource(\n source: ReadonlyArray<SelectOptionInit> | OptionRowSource,\n): source is OptionRowSource {\n return !Array.isArray(source);\n}\n\n/** Materialise a row source (array or factory) into a plain array. */\nexport function rowsToArray(\n source: ReadonlyArray<SelectOptionInit> | OptionRowSource,\n): SelectOptionInit[] {\n if (!isRowSource(source)) return source.slice();\n const out = new Array<SelectOptionInit>(source.count);\n for (let i = 0; i < source.count; i++) out[i] = source.getRow(i);\n return out;\n}\n\n/** Normalise a programmatic `options` array to `SelectOptionData[]`. */\nexport function normalizeInits(inits: ReadonlyArray<SelectOptionInit>): SelectOptionData[] {\n return inits.map(fromInit);\n}\n\n/**\n * Read the option set for a picker host. Slotted `<md-select-option>`\n * children win when present; otherwise the `options` array is used.\n */\nexport function collectOptions(\n host: HTMLElement,\n optionsProp?: SelectOptionInit[],\n): SelectOptionData[] {\n // Direct light-DOM children only (avoids `:scope`, which mock-doc/older\n // engines don't support, and avoids reaching into nested option groups).\n const slotted = Array.from(host.children).filter(\n (c) => c.tagName.toLowerCase() === 'md-select-option',\n ) as SelectOptionEl[];\n\n if (slotted.length > 0) {\n return slotted.map(fromElement);\n }\n return (optionsProp ?? []).map(fromInit);\n}\n\n/** Label for a single value, or '' if not found. */\nexport function labelFor(options: SelectOptionData[], value: string): string {\n return options.find((o) => o.value === value)?.label ?? '';\n}\n","/**\n * Fixed-row-height virtual windowing math, shared by the virtualized selects.\n *\n * Pure and DOM-free so it can be unit-tested directly. Given the scroll offset\n * and viewport size, it returns the slice of rows to render plus the spacer\n * heights that make the scroll container behave as if every row were present.\n *\n * Two regimes:\n * - Exact: when the full list height fits under `maxScrollHeight`, the spacers\n * reproduce the real height 1:1 and the offset maps to a row directly.\n * - Scaled: when the list is taller than a browser can lay out (millions of\n * rows × row height easily exceeds the ~16–33M px element-height cap), the\n * spacers reproduce a *capped* height and the scroll offset maps\n * proportionally onto the row range. The rendered block is always\n * positioned to cover the viewport, so the list never shows blank rows and\n * can be scrolled all the way to the end.\n */\nexport interface WindowCalc {\n /** First filtered index to render (inclusive), overscan applied. */\n start: number;\n /** One past the last filtered index to render (exclusive). */\n end: number;\n /** Spacer height (px) before the first rendered row. */\n topPad: number;\n /** Spacer height (px) after the last rendered row. */\n bottomPad: number;\n /** Total scrollable height the spacers reproduce (topPad + rows + bottomPad). */\n scrollHeight: number;\n /**\n * The scroll offset this window is laid out for. Equal to the input scrollTop\n * for mouse-driven windows; for an anchored (keyboard-nav) window it is the\n * offset the caller should apply so the anchor row lands at the viewport top.\n */\n scrollTop: number;\n}\n\n/**\n * Default ceiling on the scrollable height. Comfortably under every major\n * browser's maximum element height (Firefox ~17.9M, Chrome ~33.5M) so the\n * spacers always lay out, while still giving smooth scroll resolution for\n * millions of rows. The controller can lower this further at runtime if it\n * detects the browser clamping even shorter.\n */\nexport const DEFAULT_MAX_SCROLL_HEIGHT = 1_500_000;\n\nexport function computeWindow(\n scrollTop: number,\n viewportHeight: number,\n rowHeight: number,\n total: number,\n overscan: number,\n maxScrollHeight: number = DEFAULT_MAX_SCROLL_HEIGHT,\n // In the scaled regime, pin the first rendered row to this index instead of\n // deriving it from the scroll fraction. Keyboard nav uses this because integer\n // scrollTop is too coarse to address individual rows in a multi-million list.\n anchorFirstRow: number = -1,\n): WindowCalc {\n if (total <= 0 || rowHeight <= 0 || viewportHeight <= 0) {\n const realHeight = total > 0 && rowHeight > 0 ? total * rowHeight : 0;\n return { start: 0, end: 0, topPad: 0, bottomPad: realHeight, scrollHeight: realHeight, scrollTop: 0 };\n }\n\n const realHeight = total * rowHeight;\n const visibleCount = Math.ceil(viewportHeight / rowHeight);\n\n // ── Exact regime: the list fits, spacers mirror the real height. ──\n if (realHeight <= maxScrollHeight) {\n const clamped = Math.min(Math.max(0, scrollTop), Math.max(0, realHeight - viewportHeight));\n const firstVisible = Math.floor(clamped / rowHeight);\n const start = Math.min(total, Math.max(0, firstVisible - overscan));\n const end = Math.min(total, Math.max(start, firstVisible + visibleCount + overscan));\n return {\n start,\n end,\n topPad: start * rowHeight,\n bottomPad: Math.max(0, (total - end) * rowHeight),\n scrollHeight: realHeight,\n scrollTop: clamped,\n };\n }\n\n // ── Scaled regime: list taller than `maxScrollHeight`. ──\n const scrollHeight = maxScrollHeight;\n const maxScrollTop = Math.max(1, scrollHeight - viewportHeight);\n const maxFirstRow = Math.max(0, total - visibleCount);\n\n if (anchorFirstRow >= 0) {\n // Keyboard nav: position the anchor row at the viewport top and *derive* the\n // scroll offset to match. Integer scrollTop is too coarse to address single\n // rows near the ends of a multi-million-row list, so we treat the offset as\n // an output (the caller applies `scrollTop`) instead of an input. This is\n // what makes ArrowDown/ArrowUp keep advancing past the rendered window.\n const firstVisibleRow = Math.min(maxFirstRow, anchorFirstRow);\n const aboveRows = Math.min(overscan, firstVisibleRow);\n const start = firstVisibleRow - aboveRows;\n const end = Math.min(total, firstVisibleRow + visibleCount + overscan);\n const blockHeight = (end - start) * rowHeight;\n // Use the SAME proportional row↔offset mapping as the mouse-scroll branch\n // below, so a given offset uniquely identifies the anchor row and re-deriving\n // the window from `scrollTop` (when the anchor is dropped) lands on the same\n // row. We deliberately do NOT pull the offset up to bottom-align the block\n // near the end (an earlier `hi` clamp did): that collapsed many adjacent\n // anchors onto one integer offset, so a single stray scroll event would\n // re-map that offset proportionally and teleport the view thousands of rows\n // (ArrowUp \"jumping\" near the bottom of a huge list). `lo` still keeps\n // topPad ≥ 0 near the very top. The block may now extend a few hundred px\n // past the nominal cap at the very end; we clamp `bottomPad` to ≥ 0 and let\n // the real content height absorb the remainder — negligible against\n // `scrollHeight`, and the offset stays reachable.\n const lo = aboveRows * rowHeight;\n const proportional = Math.round((firstVisibleRow / Math.max(1, maxFirstRow)) * maxScrollTop);\n const usedScrollTop = Math.max(lo, Math.min(maxScrollTop, proportional));\n const topPad = usedScrollTop - aboveRows * rowHeight;\n const bottomPad = Math.max(0, scrollHeight - topPad - blockHeight);\n return { start, end, topPad, bottomPad, scrollHeight, scrollTop: usedScrollTop };\n }\n\n // Mouse scroll: the browser's scrollTop is authoritative; map it onto the row\n // range and seat the block so the first visible row lands at the viewport top\n // (overscan above limited to the room the offset leaves, so topPad stays ≥ 0).\n const clamped = Math.min(Math.max(0, scrollTop), maxScrollTop);\n const firstVisibleRow = Math.round((clamped / maxScrollTop) * maxFirstRow);\n const aboveRows = Math.min(overscan, firstVisibleRow, Math.floor(clamped / rowHeight));\n const start = firstVisibleRow - aboveRows;\n const end = Math.min(total, firstVisibleRow + visibleCount + overscan);\n const blockHeight = (end - start) * rowHeight;\n const maxTop = Math.max(0, scrollHeight - blockHeight);\n let topPad = clamped - aboveRows * rowHeight;\n if (topPad < 0) topPad = 0;\n else if (topPad > maxTop) topPad = maxTop;\n const bottomPad = Math.max(0, scrollHeight - topPad - blockHeight);\n\n return { start, end, topPad, bottomPad, scrollHeight, scrollTop: clamped };\n}\n","// GENERATED by scripts/build-wasm.mjs — DO NOT EDIT.\n// Source: packages/core/src/wasm/engine.ts\n// Regenerate with: pnpm --filter @awc-ui/core build:wasm\n/* eslint-disable */\nexport const WASM_BASE64 =\n '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';\n","/**\n * Hand-written ABI surface for the WASM option engine.\n *\n * `engine.wasm.ts` (the base64 blob) is generated by scripts/build-wasm.mjs;\n * this file is the stable, committed wrapper the rest of the codebase imports.\n * Keep `EngineExports` in sync with the exports of `engine.ts`.\n */\nimport { WASM_BASE64 } from './engine.wasm';\n\n/** Filter modes accepted by `setQuery` (mirrors engine.ts). */\nexport const FILTER_SUBSTRING = 0;\nexport const FILTER_PREFIX = 1;\nexport const FILTER_FUZZY = 2;\n\n/** The functions exported by the compiled WASM engine. */\nexport interface EngineExports {\n memory: WebAssembly.Memory;\n reserve(\n rows: number,\n valueBytesTotal: number,\n labelBytesTotal: number,\n iconBytesTotal: number,\n supportBytesTotal: number,\n ): void;\n valueWritePtr(): number;\n labelWritePtr(): number;\n iconWritePtr(): number;\n supportWritePtr(): number;\n appendRow(\n valueLen: number,\n labelLen: number,\n iconLen: number,\n supportLen: number,\n flags: number,\n ): number;\n finalizeLoad(): void;\n queryPtr(): number;\n queryCapacity(): number;\n setQuery(queryLen: number, mode: number): number;\n totalCount(): number;\n filteredCount(): number;\n rowAt(filteredIndex: number): number;\n valuePtr(absIndex: number): number;\n valueLen(absIndex: number): number;\n labelPtr(absIndex: number): number;\n labelLen(absIndex: number): number;\n iconPtr(absIndex: number): number;\n iconLen(absIndex: number): number;\n supportPtr(absIndex: number): number;\n supportLen(absIndex: number): number;\n rowFlags(absIndex: number): number;\n indexOfValue(queryLen: number): number;\n findLabelPrefix(queryLen: number, fromFilteredIndex: number): number;\n reset(): void;\n}\n\nfunction decodeBase64(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n }\n // Node without a global atob (older runtimes / spec env).\n return Uint8Array.from(Buffer.from(b64, 'base64'));\n}\n\n/**\n * Compiled once per process — the module bytes never change, and every\n * consumer gets its own isolated instance (fresh memory) below. Without this\n * cache each component instance re-decoded and recompiled the same module.\n */\nlet modulePromise: Promise<WebAssembly.Module> | undefined;\n\n/**\n * Lazily instantiate the engine. The compiled module is a few KB; consumers\n * load their (potentially millions of) rows into its memory at runtime.\n */\nexport async function instantiateEngine(): Promise<EngineExports> {\n modulePromise ??= WebAssembly.compile(decodeBase64(WASM_BASE64));\n const module = await modulePromise;\n const imports = {\n env: {\n abort() {},\n trace() {},\n seed() {\n return Date.now();\n },\n },\n };\n const instance = await WebAssembly.instantiate(module, imports);\n return instance.exports as unknown as EngineExports;\n}\n","/**\n * `WasmOptionStore` — the single integration point both `md-select` and\n * `md-multi-select` use for virtualized, WASM-backed option data.\n *\n * It hides the engine ABI entirely (see `wasm/engine-abi.ts`): the dataset is\n * packed into WASM linear memory at `load()` time and JS keeps no copy, so a\n * select can hold millions of options while only ever decoding the ~visible\n * window back out per render. Filtering/typeahead run inside WASM.\n *\n * One instance per component → one `WebAssembly.Instance` → isolated memory.\n */\nimport {\n EngineExports,\n FILTER_SUBSTRING,\n instantiateEngine,\n} from '../wasm/engine-abi';\nimport { isRowSource, OptionRowSource, SelectOptionInit } from './select-options';\n\n/** A row read back out of the store for rendering. */\nexport interface VirtualRow {\n /** Absolute row index in the dataset (stable across filtering). */\n index: number;\n value: string;\n label: string;\n disabled: boolean;\n /** Material Symbols leading-icon glyph, or '' when the dataset has no icons. */\n icon: string;\n /** Secondary line under the label, or '' when the dataset has no supporting text. */\n supportingText: string;\n}\n\n/** Filter strategy, mapped to the engine's `setQuery` mode. */\nexport type FilterMode = 'substring' | 'prefix' | 'fuzzy';\n\nconst FILTER_MODE: Record<FilterMode, number> = {\n substring: 0,\n prefix: 1,\n fuzzy: 2,\n};\n\nconst DISABLED_FLAG = 1;\n\n/**\n * Time budget (ms) for one main-thread slice while packing. Bounding every\n * slice to roughly a frame keeps busy animations (the loading indicator)\n * fluid during multi-million-row loads — a fixed row-count chunk (formerly\n * 250k rows) blocked 100ms+ per chunk and dropped the spinner to ~7fps.\n */\nconst LOAD_SLICE_BUDGET_MS = 6;\n\n/** Rows between clock reads inside a slice (amortises performance.now()).\n * Small enough that one stride stays well inside the slice budget even with\n * an expensive consumer getRow (~1.4µs/row measured → ~3ms per stride). */\nconst LOAD_STRIDE = 2_048;\n\n/** Millisecond clock that also works in non-DOM (spec) environments. */\nconst nowMs: () => number =\n typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? () => performance.now()\n : () => Date.now();\n\n/** Yield to the event loop so the browser can handle input mid-load. NB:\n * scheduler.yield() continuations PREEMPT rendering, so this alone does not\n * produce paints — see yieldForPaint(). */\nfunction yieldToMain(): Promise<void> {\n const scheduler = (globalThis as { scheduler?: { yield?: () => Promise<void> } }).scheduler;\n if (scheduler?.yield) return scheduler.yield();\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/**\n * Work window between paint yields. Deliberately UNDER a 60Hz frame (16.7ms):\n * we resume ~1ms after a paint, so a 16ms window would finish just past the\n * next vsync and miss it (measured: alternating 17/33ms gaps → 25ms average).\n * 12ms of work + up to a stride of overshoot still lands the rAF request\n * before the deadline, giving a consistent ~16.7ms cadence.\n */\nconst PAINT_INTERVAL_MS = 12;\n\n/**\n * Yield in a way that guarantees the browser can PAINT when a frame is due —\n * scheduler.yield continuations outprioritise rendering, which froze the\n * loading animation to ~10fps during multi-million-row packs. When a frame is\n * due, await requestAnimationFrame (a real rendering opportunity); otherwise\n * take the cheap yield.\n */\nasync function yieldForPaint(lastPaint: { t: number }): Promise<void> {\n if (\n typeof requestAnimationFrame === 'function' &&\n nowMs() - lastPaint.t >= PAINT_INTERVAL_MS\n ) {\n // Resume AFTER the paint, not inside the rAF callback: resolving in rAF\n // would continue the pack as a microtask still inside the rendering-steps\n // task — the paint would then wait behind the next 16ms of work (measured\n // as ~33ms frame gaps). rAF marks the frame; the nested macrotask lands\n // once rendering has actually flushed.\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => setTimeout(resolve, 0));\n });\n lastPaint.t = nowMs();\n return;\n }\n await yieldToMain();\n}\n\n/** True when this runtime can host the engine (false in non-WASM SSR/test envs). */\nexport function isWasmSupported(): boolean {\n return typeof WebAssembly !== 'undefined' && typeof WebAssembly.instantiate === 'function';\n}\n\n/**\n * UTF-8 byte length of a string, matching `TextEncoder` semantics (lone\n * surrogates count as the 3-byte U+FFFD replacement). Allocation-free, so the\n * load sizing pass over millions of rows stays cheap.\n */\nexport function utf8ByteLength(str: string): number {\n let bytes = 0;\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x80) {\n bytes += 1;\n } else if (c < 0x800) {\n bytes += 2;\n } else if (c >= 0xd800 && c <= 0xdbff) {\n const next = str.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n bytes += 4;\n i++;\n } else {\n bytes += 3; // lone high surrogate → U+FFFD\n }\n } else {\n bytes += 3; // BMP ≥ 0x800, or lone low surrogate → U+FFFD\n }\n }\n return bytes;\n}\n\nexport class WasmOptionStore {\n private engine?: EngineExports;\n private ready?: Promise<void>;\n private enc = new TextEncoder();\n private dec = new TextDecoder();\n private _length = 0;\n private _total = 0;\n private mode: number = FILTER_SUBSTRING;\n\n /** Lazily instantiate the engine (memoized). */\n ensureReady(): Promise<void> {\n if (!this.ready) {\n this.ready = isWasmSupported()\n ? instantiateEngine().then((e) => {\n this.engine = e;\n })\n : Promise.reject(new Error('WebAssembly is not available in this environment'));\n }\n return this.ready;\n }\n\n get ready$(): boolean {\n return !!this.engine;\n }\n\n /** Current filtered row count. */\n get length(): number {\n return this._length;\n }\n\n /** Total rows loaded (ignores the active filter). */\n get total(): number {\n return this._total;\n }\n\n setFilterMode(mode: FilterMode): void {\n this.mode = FILTER_MODE[mode] ?? FILTER_SUBSTRING;\n }\n\n private mem(): Uint8Array {\n // Re-derived on every read batch: a prior `memory.grow` detaches the old\n // ArrayBuffer, so a cached view would throw.\n return new Uint8Array(this.engine!.memory.buffer);\n }\n\n /**\n * Load a dataset into WASM memory. Accepts either a materialised array or a\n * row factory (`{ count, getRow }`) — the factory path never holds more than\n * one row in JS at a time, so it scales to tens of millions of options. Two\n * passes over the input: size, then encode each row's UTF-8 directly into the\n * engine's buffers. JS references to the rows are not retained.\n */\n async load(source: ReadonlyArray<SelectOptionInit> | OptionRowSource): Promise<void> {\n await this.ensureReady();\n const e = this.engine!;\n\n let count: number;\n let at: (i: number) => SelectOptionInit;\n if (isRowSource(source)) {\n count = source.count;\n at = source.getRow;\n } else {\n count = source.length;\n at = (i) => source[i];\n }\n\n const lastPaint = { t: nowMs() };\n\n // Pass 1 — size the columns. TIME-SLICED with yields so a\n // multi-million-row load never blocks the main thread longer than about a\n // frame: the browser paints (fluid loading animation) and handles input\n // between slices. Icon / supporting-text totals stay 0 when the dataset\n // uses neither, so the engine skips those columns entirely.\n let valueBytesTotal = 0;\n let labelBytesTotal = 0;\n let iconBytesTotal = 0;\n let supportBytesTotal = 0;\n for (let i = 0; i < count; ) {\n const sliceStart = nowMs();\n do {\n const end = Math.min(count, i + LOAD_STRIDE);\n for (; i < end; i++) {\n const r = at(i);\n valueBytesTotal += utf8ByteLength(r.value);\n labelBytesTotal += utf8ByteLength(r.label ?? r.value);\n if (r.icon) iconBytesTotal += utf8ByteLength(r.icon);\n if (r.supportingText) supportBytesTotal += utf8ByteLength(r.supportingText);\n }\n } while (i < count && nowMs() - sliceStart < LOAD_SLICE_BUDGET_MS);\n if (i < count) await yieldForPaint(lastPaint);\n }\n\n e.reserve(count, valueBytesTotal, labelBytesTotal, iconBytesTotal, supportBytesTotal);\n\n // Pass 2 — encode each row's UTF-8 straight into the engine buffers, also\n // time-sliced + yielding. The memory view is re-derived per slice: appendRow\n // never grows memory, but a yield could let other work run in between. Read\n // all four write pointers before appendRow — it advances every cursor.\n for (let i = 0; i < count; ) {\n const sliceStart = nowMs();\n const mem = this.mem();\n do {\n const end = Math.min(count, i + LOAD_STRIDE);\n for (; i < end; i++) {\n const r = at(i);\n const vp = e.valueWritePtr();\n const v = this.enc.encodeInto(r.value, mem.subarray(vp));\n const lp = e.labelWritePtr();\n const l = this.enc.encodeInto(r.label ?? r.value, mem.subarray(lp));\n const ip = e.iconWritePtr();\n const ic =\n iconBytesTotal > 0 ? this.enc.encodeInto(r.icon ?? '', mem.subarray(ip)) : null;\n const sp = e.supportWritePtr();\n const sc =\n supportBytesTotal > 0\n ? this.enc.encodeInto(r.supportingText ?? '', mem.subarray(sp))\n : null;\n e.appendRow(\n v.written ?? 0,\n l.written ?? 0,\n ic?.written ?? 0,\n sc?.written ?? 0,\n r.disabled ? DISABLED_FLAG : 0,\n );\n }\n } while (i < count && nowMs() - sliceStart < LOAD_SLICE_BUDGET_MS);\n if (i < count) await yieldForPaint(lastPaint);\n }\n\n e.finalizeLoad(); // allocates the value index — may grow memory\n\n this._total = e.totalCount();\n this._length = e.filteredCount();\n }\n\n /** Write a string into the engine's scratch buffer; returns bytes written. */\n private writeScratch(s: string): number {\n const e = this.engine!;\n const cap = e.queryCapacity();\n const ptr = e.queryPtr();\n const { written } = this.enc.encodeInto(s, this.mem().subarray(ptr, ptr + cap));\n return written ?? 0;\n }\n\n /** Apply a filter query. Returns the new filtered length. */\n setQuery(query: string): number {\n if (!this.engine) return 0;\n const len = this.writeScratch(query);\n this._length = this.engine.setQuery(len, this.mode);\n return this._length;\n }\n\n private decodeRow(absIndex: number, mem: Uint8Array): VirtualRow {\n const e = this.engine!;\n const vp = e.valuePtr(absIndex);\n const vl = e.valueLen(absIndex);\n const lp = e.labelPtr(absIndex);\n const ll = e.labelLen(absIndex);\n // Icon / supporting-text columns return 0-length ranges when the dataset\n // didn't supply them, so these decode to '' at no extra packing cost.\n const ip = e.iconPtr(absIndex);\n const il = e.iconLen(absIndex);\n const sp = e.supportPtr(absIndex);\n const sl = e.supportLen(absIndex);\n return {\n index: absIndex,\n value: this.dec.decode(mem.subarray(vp, vp + vl)),\n label: this.dec.decode(mem.subarray(lp, lp + ll)),\n disabled: (e.rowFlags(absIndex) & DISABLED_FLAG) !== 0,\n icon: il > 0 ? this.dec.decode(mem.subarray(ip, ip + il)) : '',\n supportingText: sl > 0 ? this.dec.decode(mem.subarray(sp, sp + sl)) : '',\n };\n }\n\n /** Decode `count` rows starting at filtered position `start`. */\n getWindow(start: number, count: number): VirtualRow[] {\n if (!this.engine) return [];\n const e = this.engine;\n const mem = this.mem();\n const out: VirtualRow[] = [];\n const from = Math.max(0, start);\n const to = Math.min(this._length, start + count);\n for (let fi = from; fi < to; fi++) {\n const abs = e.rowAt(fi);\n if (abs >= 0) out.push(this.decodeRow(abs, mem));\n }\n return out;\n }\n\n /** Decode a single row at filtered position `filteredIndex`, or null. */\n getRow(filteredIndex: number): VirtualRow | null {\n if (!this.engine) return null;\n const abs = this.engine.rowAt(filteredIndex);\n if (abs < 0) return null;\n return this.decodeRow(abs, this.mem());\n }\n\n /** Map a filtered position to its absolute row index, or -1. */\n rowAt(filteredIndex: number): number {\n return this.engine ? this.engine.rowAt(filteredIndex) : -1;\n }\n\n /** Disabled flag for a filtered position — flag-only, no string decode. */\n disabledAt(filteredIndex: number): boolean {\n if (!this.engine) return false;\n const abs = this.engine.rowAt(filteredIndex);\n if (abs < 0) return false;\n return (this.engine.rowFlags(abs) & DISABLED_FLAG) !== 0;\n }\n\n /** Label for a filtered position — decodes a single label. */\n labelAt(filteredIndex: number): string {\n if (!this.engine) return '';\n const abs = this.engine.rowAt(filteredIndex);\n if (abs < 0) return '';\n const lp = this.engine.labelPtr(abs);\n const ll = this.engine.labelLen(abs);\n return this.dec.decode(this.mem().subarray(lp, lp + ll));\n }\n\n /**\n * Resolve labels for selected values that may be outside the current filter\n * (e.g. the trigger text / chips). O(1) per value via the engine's index.\n */\n getLabels(values: ReadonlyArray<string>): Map<string, string> {\n const result = new Map<string, string>();\n if (!this.engine) return result;\n const e = this.engine;\n for (const value of values) {\n const len = this.writeScratch(value);\n const abs = e.indexOfValue(len);\n if (abs >= 0) {\n const lp = e.labelPtr(abs);\n const ll = e.labelLen(abs);\n result.set(value, this.dec.decode(this.mem().subarray(lp, lp + ll)));\n }\n }\n return result;\n }\n\n /** Whether a value exists in the dataset. */\n has(value: string): boolean {\n if (!this.engine) return false;\n return this.engine.indexOfValue(this.writeScratch(value)) >= 0;\n }\n\n /**\n * Typeahead helper: first filtered position at/after `fromFilteredIndex`\n * whose label starts with `query` (wraps the filtered list). Returns a\n * filtered-list index, or -1.\n */\n findLabelPrefix(query: string, fromFilteredIndex: number): number {\n if (!this.engine) return -1;\n const len = this.writeScratch(query);\n return this.engine.findLabelPrefix(len, fromFilteredIndex);\n }\n\n /** Drop the dataset. */\n reset(): void {\n this.engine?.reset();\n this._length = 0;\n this._total = 0;\n }\n}\n","/**\n * `VirtualSelectController` — the shared virtualization engine for `md-select`\n * and `md-multi-select`, so neither component duplicates the window math,\n * scroll wiring, or the `VirtualMenuProvider` glue.\n *\n * It owns a `WasmOptionStore` (the dataset, packed in WASM memory) and the\n * current scroll window. The host component supplies a tiny adapter\n * (`queryItem` + `requestRender`) and reads the controller's public window\n * fields from its `render()`.\n */\nimport { computeWindow, DEFAULT_MAX_SCROLL_HEIGHT } from './virtual-window';\n\n/** Floor under which a measured scrollHeight cannot be a genuine browser\n * element-height clamp (real clamps are millions of px — Chrome ~33.5M,\n * Firefox ~17.8M) — it just means layout wasn't ready (see detectScrollCap). */\nconst MIN_PLAUSIBLE_SCROLL_CAP = 1_000_000;\nimport {\n FilterMode,\n isWasmSupported,\n VirtualRow,\n WasmOptionStore,\n} from './wasm-option-store';\nimport { isRowSource, OptionRowSource, SelectOptionInit } from './select-options';\nimport { VirtualMenuProvider } from './types';\n\n// Larger overscan than a typical virtual list: in the scaled regime a single\n// scroll frame can advance many rows, and render is async, so extra buffered\n// rows above/below the fold keep the body from flashing blank on fast scrolls.\nconst OVERSCAN = 8;\nconst DEFAULT_ROW_HEIGHT = 48;\nconst DEFAULT_VIEWPORT_HEIGHT = 320;\n// Extra px to keep a keyboard-revealed row clear of the viewport's top/bottom\n// edge. Historically 32px to clear md-scroll-shadow's edge fade; the scroll\n// shadow was removed, so a revealed row can sit flush against the edge (0). Kept\n// as a named knob in case a future edge treatment needs slack again.\nconst EDGE_SCRIM_PAD = 0;\n\nexport interface VirtualSelectHost {\n /** The rendered `md-menu-item` for a filtered index, from the host's shadow DOM. */\n queryItem(filteredIndex: number): HTMLElement | null;\n /** Re-render the host (it reads the controller's window fields). */\n requestRender(): void;\n}\n\nexport class VirtualSelectController {\n readonly store = new WasmOptionStore();\n\n /** True once a dataset is loaded and the component should render windowed. */\n active = false;\n /** First filtered index currently rendered. */\n windowStart = 0;\n /** The decoded rows in the current window. */\n windowRows: VirtualRow[] = [];\n /** Spacer heights (px) that preserve the full scroll height. */\n topPad = 0;\n bottomPad = 0;\n /** Current filtered row count. */\n filteredLength = 0;\n /** Effective fixed row height (measured or overridden). */\n rowHeight = DEFAULT_ROW_HEIGHT;\n\n private fixedRowHeight?: number;\n private viewportEl?: HTMLElement;\n private scrollRaf = 0;\n\n /**\n * The browser's observed maximum element height. Browsers clamp very tall\n * elements (a few-million-row list × row height blows past the ~16–33M px\n * cap), so the spacers can't reproduce the true height. We start optimistic\n * and shrink to the real clamp once we can measure it (see `detectScrollCap`).\n */\n private browserMaxScroll = Infinity;\n /** The scrollable height the last `recompute` asked the spacers to produce. */\n private intendedScrollHeight = 0;\n private detectRaf = 0;\n /** Retries left for detectScrollCap while layout isn't ready (see below). */\n private detectRetries = 0;\n\n /**\n * Scaled-regime keyboard nav: the first row to render, pinned independent of\n * the (too-coarse) integer scrollTop. -1 means the window is scroll-driven.\n */\n private navAnchorFirstRow = -1;\n /** The scroll offset the last `recompute` laid the window out for. */\n private usedScrollTop = 0;\n\n constructor(private host: VirtualSelectHost) {}\n\n /** Ceiling on the spacer height: our safe default, lowered by any real clamp. */\n private effectiveMaxScroll(): number {\n return Math.min(DEFAULT_MAX_SCROLL_HEIGHT, this.browserMaxScroll);\n }\n\n setFixedRowHeight(px?: number): void {\n this.fixedRowHeight = px && px > 0 ? px : undefined;\n if (this.fixedRowHeight) this.rowHeight = this.fixedRowHeight;\n }\n\n setFilterMode(mode: FilterMode): void {\n this.store.setFilterMode(mode);\n }\n\n /** Load a dataset into WASM memory. Returns false if WASM is unavailable. */\n async load(source: ReadonlyArray<SelectOptionInit> | OptionRowSource): Promise<boolean> {\n const count = isRowSource(source) ? source.count : source.length;\n if (!isWasmSupported() || count === 0) return false;\n try {\n await this.store.ensureReady();\n } catch {\n return false;\n }\n await this.store.load(source);\n this.active = true;\n this.filteredLength = this.store.length;\n this.recompute(this.viewportEl?.scrollTop ?? 0);\n return true;\n }\n\n /** Apply a filter query and reset the scroll to the top. */\n setQuery(query: string): void {\n if (!this.active) return;\n this.filteredLength = this.store.setQuery(query);\n this.navAnchorFirstRow = -1;\n if (this.viewportEl) this.viewportEl.scrollTop = 0;\n this.recompute(0);\n }\n\n getLabels(values: ReadonlyArray<string>): Map<string, string> {\n return this.store.getLabels(values);\n }\n\n reset(): void {\n this.store.reset();\n this.active = false;\n this.windowRows = [];\n this.filteredLength = 0;\n this.windowStart = 0;\n this.topPad = 0;\n this.bottomPad = 0;\n this.navAnchorFirstRow = -1;\n }\n\n // ── Viewport wiring (call when the menu opens / closes) ──────\n\n async attachViewport(getViewport: () => Promise<HTMLElement | null>): Promise<void> {\n this.detachViewport();\n const vp = await getViewport();\n this.viewportEl = vp ?? undefined;\n if (this.viewportEl) {\n this.viewportEl.addEventListener('scroll', this.onScroll, { passive: true });\n this.measureRowHeight();\n this.recompute(this.viewportEl.scrollTop);\n this.detectRetries = 60; // ~2s of rAF pairs — spacers may render late\n this.detectScrollCap();\n }\n }\n\n detachViewport(): void {\n if (this.scrollRaf) {\n cancelAnimationFrame(this.scrollRaf);\n this.scrollRaf = 0;\n }\n if (this.detectRaf) {\n cancelAnimationFrame(this.detectRaf);\n this.detectRaf = 0;\n }\n this.viewportEl?.removeEventListener('scroll', this.onScroll);\n this.viewportEl = undefined;\n }\n\n private onScroll = () => {\n if (this.scrollRaf) return;\n this.scrollRaf = requestAnimationFrame(() => {\n this.scrollRaf = 0;\n const vp = this.viewportEl;\n if (!vp) return;\n // Tell our own programmatic scroll (driving an anchored keyboard-nav\n // window) from a genuine user scroll by value: if the offset still matches\n // what the current window was laid out for, keep the anchor; otherwise the\n // user scrolled, so resume scroll-driven windowing. (A value check is\n // robust to event coalescing/ordering, unlike a one-shot flag.)\n if (this.navAnchorFirstRow >= 0 && Math.abs(vp.scrollTop - this.usedScrollTop) <= 1) {\n return;\n }\n this.navAnchorFirstRow = -1;\n this.recompute(vp.scrollTop);\n });\n };\n\n private measureRowHeight(): void {\n if (this.fixedRowHeight) {\n this.rowHeight = this.fixedRowHeight;\n return;\n }\n const first = this.host.queryItem(this.windowStart);\n const h = first?.offsetHeight ?? 0;\n if (h > 0 && h !== this.rowHeight) {\n this.rowHeight = h;\n if (this.viewportEl) this.recompute(this.viewportEl.scrollTop);\n }\n }\n\n private recompute(scrollTop: number): void {\n const vpH = this.viewportEl?.clientHeight || DEFAULT_VIEWPORT_HEIGHT;\n const calc = computeWindow(\n scrollTop,\n vpH,\n this.rowHeight,\n this.filteredLength,\n OVERSCAN,\n this.effectiveMaxScroll(),\n this.navAnchorFirstRow,\n );\n this.windowStart = calc.start;\n this.topPad = calc.topPad;\n this.bottomPad = calc.bottomPad;\n this.intendedScrollHeight = calc.scrollHeight;\n this.usedScrollTop = calc.scrollTop;\n this.windowRows = this.store.getWindow(calc.start, calc.end - calc.start);\n this.host.requestRender();\n }\n\n /**\n * Detect the browser's real maximum element height. After the spacers lay\n * out, if the viewport's `scrollHeight` came back shorter than we asked for,\n * the browser clamped it — and that clamp *is* the true maximum, so adopt it\n * and re-window against it. Runs a couple of frames after attach so the\n * (async) spacer render has committed; idempotent and only ever shrinks.\n */\n private detectScrollCap(): void {\n if (this.detectRaf) cancelAnimationFrame(this.detectRaf);\n this.detectRaf = requestAnimationFrame(() => {\n this.detectRaf = requestAnimationFrame(() => {\n this.detectRaf = 0;\n const vp = this.viewportEl;\n if (!vp) return;\n const measured = vp.scrollHeight;\n if (\n measured > 0 &&\n measured + 2 < this.intendedScrollHeight &&\n measured < this.browserMaxScroll\n ) {\n // A small reading is NOT a browser clamp — the spacers simply have\n // not been laid out yet (e.g. the menu opened during a dataset pack\n // and still showed the uncapped busy bar when we measured). Locking\n // it in would permanently collapse the scroll geometry (the cap\n // never grows back), so retry instead.\n if (measured < MIN_PLAUSIBLE_SCROLL_CAP) {\n if (this.detectRetries-- > 0) this.detectScrollCap();\n return;\n }\n this.browserMaxScroll = measured;\n this.recompute(vp.scrollTop);\n }\n });\n });\n }\n\n // ── VirtualMenuProvider (md-menu drives nav through this) ────\n\n readonly provider: VirtualMenuProvider = {\n count: () => this.filteredLength,\n labelAt: (i) => this.store.labelAt(i),\n isDisabledAt: (i) => this.store.disabledAt(i),\n ensureVisible: (i) => this.ensureVisible(i),\n domItemForIndex: (i) => this.host.queryItem(i),\n findPrefix: (buffer, from) => this.store.findLabelPrefix(buffer, from),\n };\n\n private async ensureVisible(filteredIndex: number): Promise<void> {\n const vp = this.viewportEl;\n if (!vp) return;\n const clientH = vp.clientHeight || DEFAULT_VIEWPORT_HEIGHT;\n const realHeight = this.filteredLength * this.rowHeight;\n\n if (realHeight <= this.effectiveMaxScroll()) {\n // Exact regime: pixel offset is the row index times the row height.\n this.navAnchorFirstRow = -1;\n const top = filteredIndex * this.rowHeight;\n const bottom = top + this.rowHeight;\n // Reveal with EDGE_SCRIM_PAD of slack so the row clears the edge fade.\n // Clamped to [0, maxScroll]: rows at the very top/bottom — where no scrim\n // shows — still seat flush.\n const maxScroll = Math.max(0, vp.scrollHeight - clientH);\n if (top - EDGE_SCRIM_PAD < vp.scrollTop) {\n vp.scrollTop = Math.max(0, top - EDGE_SCRIM_PAD);\n } else if (bottom + EDGE_SCRIM_PAD > vp.scrollTop + clientH) {\n vp.scrollTop = Math.min(maxScroll, bottom + EDGE_SCRIM_PAD - clientH);\n }\n this.recompute(vp.scrollTop);\n } else {\n // Scaled regime: integer scrollTop can't address single rows (millions of\n // rows compressed into a capped height — one pixel can be dozens of rows).\n // When the target row isn't already on screen, pin the window to an anchor\n // and let `computeWindow` choose the matching scroll offset, then apply it.\n const visibleRows = Math.max(1, Math.floor(clientH / this.rowHeight));\n const visibleCount = Math.ceil(clientH / this.rowHeight);\n const maxFirstRow = Math.max(0, this.filteredLength - visibleCount);\n // First visible row: take it exactly from the anchor when the window is\n // anchor-driven (deriving it from a fractional scrollTop drifts by a row);\n // fall back to the live geometry only when scroll-driven.\n const firstVisible =\n this.navAnchorFirstRow >= 0\n ? this.navAnchorFirstRow\n : this.windowStart +\n Math.max(0, Math.round((vp.scrollTop - this.topPad) / this.rowHeight));\n const lastVisible = firstVisible + visibleRows - 1;\n\n // Re-anchor when the focused row is outside the visible range OR within\n // `padRows` of either edge. The edge check matters even when the row is\n // already visible: navigating up one row at a time makes the focused row\n // the *first* visible row (flush against the top), which is never \"outside\"\n // the range — so without it the top scroll-shadow scrim would still cover\n // the focused row. Mirrors the exact-regime branch above.\n const padRows = Math.ceil(EDGE_SCRIM_PAD / this.rowHeight);\n if (\n filteredIndex < firstVisible + padRows ||\n filteredIndex > lastVisible - padRows\n ) {\n // Reveal `padRows` clear of the top (scrolling up) or bottom (scrolling\n // down) edge, clamped to [0, maxFirstRow] so the list ends — where no\n // scrim shows — still seat the row flush.\n this.navAnchorFirstRow = Math.min(\n maxFirstRow,\n Math.max(\n 0,\n filteredIndex < firstVisible + padRows\n ? filteredIndex - padRows\n : filteredIndex - visibleRows + 1 + padRows,\n ),\n );\n }\n this.recompute(vp.scrollTop);\n // Sync the browser scroll to the offset the (anchored) window was laid out\n // for. Clamp to the viewport's real max — the capped element can render a\n // hair shorter than we asked (scroll-shadow sentinels), and overshooting by\n // even a pixel near the end gets clamped by the browser — then adopt\n // whatever it actually applied, so the scroll guard and the next \"first\n // visible\" never drift out of sync and clear the anchor.\n if (this.navAnchorFirstRow >= 0) {\n const maxScroll = Math.max(0, vp.scrollHeight - clientH);\n const target = Math.min(Math.round(this.usedScrollTop), maxScroll);\n if (target !== Math.round(vp.scrollTop)) {\n vp.scrollTop = target;\n }\n this.usedScrollTop = vp.scrollTop;\n }\n }\n // Wait for the host to render the target row into the window so the menu\n // can move real focus onto it.\n for (let tries = 0; tries < 8; tries++) {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n if (this.host.queryItem(filteredIndex)) return;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function A(A){const Q=(A.label||A.getAttribute("label")||A.textContent||"").trim();return{value:A.value??A.getAttribute("value")??"",label:Q,disabled:A.disabled??A.hasAttribute("disabled"),icon:A.icon||A.getAttribute("icon")||undefined,iconColor:A.iconColor||A.getAttribute("icon-color")||undefined,supportingText:A.supportingText||A.getAttribute("supporting-text")||undefined,selected:A.selected??A.hasAttribute("selected")}}function Q(A){return{value:A.value,label:A.label??A.value,disabled:!!A.disabled,icon:A.icon,iconColor:A.iconColor,supportingText:A.supportingText,selected:!!A.selected}}function I(A){return!Array.isArray(A)}function B(A){if(!I(A))return A.slice();const Q=new Array(A.count);for(let I=0;I<A.count;I++)Q[I]=A.getRow(I);return Q}function E(A){return A.map(Q)}function C(I,B){const E=Array.from(I.children).filter((A=>A.tagName.toLowerCase()==="md-select-option"));if(E.length>0){return E.map(A)}return(B??[]).map(Q)}function t(A,Q){return A.find((A=>A.value===Q))?.label??""}const s=15e5;function g(A,Q,I,B,E,C=s,t=-1){if(B<=0||I<=0||Q<=0){const A=B>0&&I>0?B*I:0;return{start:0,end:0,topPad:0,bottomPad:A,scrollHeight:A,scrollTop:0}}const g=B*I;const i=Math.ceil(Q/I);if(g<=C){const C=Math.min(Math.max(0,A),Math.max(0,g-Q));const t=Math.floor(C/I);const s=Math.min(B,Math.max(0,t-E));const h=Math.min(B,Math.max(s,t+i+E));return{start:s,end:h,topPad:s*I,bottomPad:Math.max(0,(B-h)*I),scrollHeight:g,scrollTop:C}}const h=C;const n=Math.max(1,h-Q);const o=Math.max(0,B-i);if(t>=0){const A=Math.min(o,t);const Q=Math.min(E,A);const C=A-Q;const s=Math.min(B,A+i+E);const g=(s-C)*I;const e=Q*I;const M=Math.round(A/Math.max(1,o)*n);const c=Math.max(e,Math.min(n,M));const r=c-Q*I;const a=Math.max(0,h-r-g);return{start:C,end:s,topPad:r,bottomPad:a,scrollHeight:h,scrollTop:c}}const e=Math.min(Math.max(0,A),n);const M=Math.round(e/n*o);const c=Math.min(E,M,Math.floor(e/I));const r=M-c;const a=Math.min(B,M+i+E);const y=(a-r)*I;const k=Math.max(0,h-y);let J=e-c*I;if(J<0)J=0;else if(J>k)J=k;const w=Math.max(0,h-J-y);return{start:r,end:a,topPad:J,bottomPad:w,scrollHeight:h,scrollTop:e}}const i="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";const h=0;function n(A){if(typeof atob==="function"){const Q=atob(A);const I=new Uint8Array(Q.length);for(let A=0;A<Q.length;A++)I[A]=Q.charCodeAt(A);return I}return Uint8Array.from(Buffer.from(A,"base64"))}let o;async function e(){o??(o=WebAssembly.compile(n(i)));const A=await o;const Q={env:{abort(){},trace(){},seed(){return Date.now()}}};const I=await WebAssembly.instantiate(A,Q);return I.exports}const M={substring:0,prefix:1,fuzzy:2};const c=1;const r=6;const a=2048;const y=typeof performance!=="undefined"&&typeof performance.now==="function"?()=>performance.now():()=>Date.now();function k(){const A=globalThis.scheduler;if(A?.yield)return A.yield();return new Promise((A=>setTimeout(A,0)))}const J=12;async function w(A){if(typeof requestAnimationFrame==="function"&&y()-A.t>=J){await new Promise((A=>{requestAnimationFrame((()=>setTimeout(A,0)))}));A.t=y();return}await k()}function R(){return typeof WebAssembly!=="undefined"&&typeof WebAssembly.instantiate==="function"}function f(A){let Q=0;for(let I=0;I<A.length;I++){const B=A.charCodeAt(I);if(B<128){Q+=1}else if(B<2048){Q+=2}else if(B>=55296&&B<=56319){const B=A.charCodeAt(I+1);if(B>=56320&&B<=57343){Q+=4;I++}else{Q+=3}}else{Q+=3}}return Q}class F{constructor(){this.enc=new TextEncoder;this.dec=new TextDecoder;this._length=0;this._total=0;this.mode=h}ensureReady(){if(!this.ready){this.ready=R()?e().then((A=>{this.engine=A})):Promise.reject(new Error("WebAssembly is not available in this environment"))}return this.ready}get ready$(){return!!this.engine}get length(){return this._length}get total(){return this._total}setFilterMode(A){this.mode=M[A]??h}mem(){return new Uint8Array(this.engine.memory.buffer)}async load(A){await this.ensureReady();const Q=this.engine;let B;let E;if(I(A)){B=A.count;E=A.getRow}else{B=A.length;E=Q=>A[Q]}const C={t:y()};let t=0;let s=0;let g=0;let i=0;for(let A=0;A<B;){const Q=y();do{const Q=Math.min(B,A+a);for(;A<Q;A++){const Q=E(A);t+=f(Q.value);s+=f(Q.label??Q.value);if(Q.icon)g+=f(Q.icon);if(Q.supportingText)i+=f(Q.supportingText)}}while(A<B&&y()-Q<r);if(A<B)await w(C)}Q.reserve(B,t,s,g,i);for(let A=0;A<B;){const I=y();const t=this.mem();do{const I=Math.min(B,A+a);for(;A<I;A++){const I=E(A);const B=Q.valueWritePtr();const C=this.enc.encodeInto(I.value,t.subarray(B));const s=Q.labelWritePtr();const h=this.enc.encodeInto(I.label??I.value,t.subarray(s));const n=Q.iconWritePtr();const o=g>0?this.enc.encodeInto(I.icon??"",t.subarray(n)):null;const e=Q.supportWritePtr();const M=i>0?this.enc.encodeInto(I.supportingText??"",t.subarray(e)):null;Q.appendRow(C.written??0,h.written??0,o?.written??0,M?.written??0,I.disabled?c:0)}}while(A<B&&y()-I<r);if(A<B)await w(C)}Q.finalizeLoad();this._total=Q.totalCount();this._length=Q.filteredCount()}writeScratch(A){const Q=this.engine;const I=Q.queryCapacity();const B=Q.queryPtr();const{written:E}=this.enc.encodeInto(A,this.mem().subarray(B,B+I));return E??0}setQuery(A){if(!this.engine)return 0;const Q=this.writeScratch(A);this._length=this.engine.setQuery(Q,this.mode);return this._length}decodeRow(A,Q){const I=this.engine;const B=I.valuePtr(A);const E=I.valueLen(A);const C=I.labelPtr(A);const t=I.labelLen(A);const s=I.iconPtr(A);const g=I.iconLen(A);const i=I.supportPtr(A);const h=I.supportLen(A);return{index:A,value:this.dec.decode(Q.subarray(B,B+E)),label:this.dec.decode(Q.subarray(C,C+t)),disabled:(I.rowFlags(A)&c)!==0,icon:g>0?this.dec.decode(Q.subarray(s,s+g)):"",supportingText:h>0?this.dec.decode(Q.subarray(i,i+h)):""}}getWindow(A,Q){if(!this.engine)return[];const I=this.engine;const B=this.mem();const E=[];const C=Math.max(0,A);const t=Math.min(this._length,A+Q);for(let A=C;A<t;A++){const Q=I.rowAt(A);if(Q>=0)E.push(this.decodeRow(Q,B))}return E}getRow(A){if(!this.engine)return null;const Q=this.engine.rowAt(A);if(Q<0)return null;return this.decodeRow(Q,this.mem())}rowAt(A){return this.engine?this.engine.rowAt(A):-1}disabledAt(A){if(!this.engine)return false;const Q=this.engine.rowAt(A);if(Q<0)return false;return(this.engine.rowFlags(Q)&c)!==0}labelAt(A){if(!this.engine)return"";const Q=this.engine.rowAt(A);if(Q<0)return"";const I=this.engine.labelPtr(Q);const B=this.engine.labelLen(Q);return this.dec.decode(this.mem().subarray(I,I+B))}getLabels(A){const Q=new Map;if(!this.engine)return Q;const I=this.engine;for(const B of A){const A=this.writeScratch(B);const E=I.indexOfValue(A);if(E>=0){const A=I.labelPtr(E);const C=I.labelLen(E);Q.set(B,this.dec.decode(this.mem().subarray(A,A+C)))}}return Q}has(A){if(!this.engine)return false;return this.engine.indexOfValue(this.writeScratch(A))>=0}findLabelPrefix(A,Q){if(!this.engine)return-1;const I=this.writeScratch(A);return this.engine.findLabelPrefix(I,Q)}reset(){this.engine?.reset();this._length=0;this._total=0}}const D=1e6;const u=8;const l=48;const j=320;const L=0;class G{constructor(A){this.host=A;this.store=new F;this.active=false;this.windowStart=0;this.windowRows=[];this.topPad=0;this.bottomPad=0;this.filteredLength=0;this.rowHeight=l;this.scrollRaf=0;this.browserMaxScroll=Infinity;this.intendedScrollHeight=0;this.detectRaf=0;this.detectRetries=0;this.navAnchorFirstRow=-1;this.usedScrollTop=0;this.onScroll=()=>{if(this.scrollRaf)return;this.scrollRaf=requestAnimationFrame((()=>{this.scrollRaf=0;const A=this.viewportEl;if(!A)return;if(this.navAnchorFirstRow>=0&&Math.abs(A.scrollTop-this.usedScrollTop)<=1){return}this.navAnchorFirstRow=-1;this.recompute(A.scrollTop)}))};this.provider={count:()=>this.filteredLength,labelAt:A=>this.store.labelAt(A),isDisabledAt:A=>this.store.disabledAt(A),ensureVisible:A=>this.ensureVisible(A),domItemForIndex:A=>this.host.queryItem(A),findPrefix:(A,Q)=>this.store.findLabelPrefix(A,Q)}}effectiveMaxScroll(){return Math.min(s,this.browserMaxScroll)}setFixedRowHeight(A){this.fixedRowHeight=A&&A>0?A:undefined;if(this.fixedRowHeight)this.rowHeight=this.fixedRowHeight}setFilterMode(A){this.store.setFilterMode(A)}async load(A){const Q=I(A)?A.count:A.length;if(!R()||Q===0)return false;try{await this.store.ensureReady()}catch{return false}await this.store.load(A);this.active=true;this.filteredLength=this.store.length;this.recompute(this.viewportEl?.scrollTop??0);return true}setQuery(A){if(!this.active)return;this.filteredLength=this.store.setQuery(A);this.navAnchorFirstRow=-1;if(this.viewportEl)this.viewportEl.scrollTop=0;this.recompute(0)}getLabels(A){return this.store.getLabels(A)}reset(){this.store.reset();this.active=false;this.windowRows=[];this.filteredLength=0;this.windowStart=0;this.topPad=0;this.bottomPad=0;this.navAnchorFirstRow=-1}async attachViewport(A){this.detachViewport();const Q=await A();this.viewportEl=Q??undefined;if(this.viewportEl){this.viewportEl.addEventListener("scroll",this.onScroll,{passive:true});this.measureRowHeight();this.recompute(this.viewportEl.scrollTop);this.detectRetries=60;this.detectScrollCap()}}detachViewport(){if(this.scrollRaf){cancelAnimationFrame(this.scrollRaf);this.scrollRaf=0}if(this.detectRaf){cancelAnimationFrame(this.detectRaf);this.detectRaf=0}this.viewportEl?.removeEventListener("scroll",this.onScroll);this.viewportEl=undefined}measureRowHeight(){if(this.fixedRowHeight){this.rowHeight=this.fixedRowHeight;return}const A=this.host.queryItem(this.windowStart);const Q=A?.offsetHeight??0;if(Q>0&&Q!==this.rowHeight){this.rowHeight=Q;if(this.viewportEl)this.recompute(this.viewportEl.scrollTop)}}recompute(A){const Q=this.viewportEl?.clientHeight||j;const I=g(A,Q,this.rowHeight,this.filteredLength,u,this.effectiveMaxScroll(),this.navAnchorFirstRow);this.windowStart=I.start;this.topPad=I.topPad;this.bottomPad=I.bottomPad;this.intendedScrollHeight=I.scrollHeight;this.usedScrollTop=I.scrollTop;this.windowRows=this.store.getWindow(I.start,I.end-I.start);this.host.requestRender()}detectScrollCap(){if(this.detectRaf)cancelAnimationFrame(this.detectRaf);this.detectRaf=requestAnimationFrame((()=>{this.detectRaf=requestAnimationFrame((()=>{this.detectRaf=0;const A=this.viewportEl;if(!A)return;const Q=A.scrollHeight;if(Q>0&&Q+2<this.intendedScrollHeight&&Q<this.browserMaxScroll){if(Q<D){if(this.detectRetries-- >0)this.detectScrollCap();return}this.browserMaxScroll=Q;this.recompute(A.scrollTop)}}))}))}async ensureVisible(A){const Q=this.viewportEl;if(!Q)return;const I=Q.clientHeight||j;const B=this.filteredLength*this.rowHeight;if(B<=this.effectiveMaxScroll()){this.navAnchorFirstRow=-1;const B=A*this.rowHeight;const E=B+this.rowHeight;const C=Math.max(0,Q.scrollHeight-I);if(B-L<Q.scrollTop){Q.scrollTop=Math.max(0,B-L)}else if(E+L>Q.scrollTop+I){Q.scrollTop=Math.min(C,E+L-I)}this.recompute(Q.scrollTop)}else{const B=Math.max(1,Math.floor(I/this.rowHeight));const E=Math.ceil(I/this.rowHeight);const C=Math.max(0,this.filteredLength-E);const t=this.navAnchorFirstRow>=0?this.navAnchorFirstRow:this.windowStart+Math.max(0,Math.round((Q.scrollTop-this.topPad)/this.rowHeight));const s=t+B-1;const g=Math.ceil(L/this.rowHeight);if(A<t+g||A>s-g){this.navAnchorFirstRow=Math.min(C,Math.max(0,A<t+g?A-g:A-B+1+g))}this.recompute(Q.scrollTop);if(this.navAnchorFirstRow>=0){const A=Math.max(0,Q.scrollHeight-I);const B=Math.min(Math.round(this.usedScrollTop),A);if(B!==Math.round(Q.scrollTop)){Q.scrollTop=B}this.usedScrollTop=Q.scrollTop}}for(let Q=0;Q<8;Q++){await new Promise((A=>requestAnimationFrame((()=>A()))));if(this.host.queryItem(A))return}}}export{G as V,C as c,R as i,t as l,E as n,B as r};
|
|
2
|
-
//# sourceMappingURL=p-BEWIC0pC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["fromElement","el","label","getAttribute","textContent","trim","value","disabled","hasAttribute","icon","undefined","iconColor","supportingText","selected","fromInit","o","isRowSource","source","Array","isArray","rowsToArray","slice","out","count","i","getRow","normalizeInits","inits","map","collectOptions","host","optionsProp","slotted","from","children","filter","c","tagName","toLowerCase","length","labelFor","options","find","DEFAULT_MAX_SCROLL_HEIGHT","computeWindow","scrollTop","viewportHeight","rowHeight","total","overscan","maxScrollHeight","anchorFirstRow","realHeight","start","end","topPad","bottomPad","scrollHeight","visibleCount","Math","ceil","clamped","min","max","firstVisible","floor","maxScrollTop","maxFirstRow","firstVisibleRow","aboveRows","blockHeight","lo","proportional","round","usedScrollTop","maxTop","WASM_BASE64","FILTER_SUBSTRING","decodeBase64","b64","atob","bin","Uint8Array","charCodeAt","Buffer","modulePromise","async","instantiateEngine","WebAssembly","compile","module","imports","env","abort","trace","seed","Date","now","instance","instantiate","exports","FILTER_MODE","substring","prefix","fuzzy","DISABLED_FLAG","LOAD_SLICE_BUDGET_MS","LOAD_STRIDE","nowMs","performance","yieldToMain","scheduler","globalThis","yield","Promise","resolve","setTimeout","PAINT_INTERVAL_MS","yieldForPaint","lastPaint","requestAnimationFrame","t","isWasmSupported","utf8ByteLength","str","bytes","next","WasmOptionStore","constructor","this","enc","TextEncoder","dec","TextDecoder","_length","_total","mode","ensureReady","ready","then","e","engine","reject","Error","ready$","setFilterMode","mem","memory","buffer","load","at","valueBytesTotal","labelBytesTotal","iconBytesTotal","supportBytesTotal","sliceStart","r","reserve","vp","valueWritePtr","v","encodeInto","subarray","lp","labelWritePtr","l","ip","iconWritePtr","ic","sp","supportWritePtr","sc","appendRow","written","finalizeLoad","totalCount","filteredCount","writeScratch","s","cap","queryCapacity","ptr","queryPtr","setQuery","query","len","decodeRow","absIndex","valuePtr","vl","valueLen","labelPtr","ll","labelLen","iconPtr","il","iconLen","supportPtr","sl","supportLen","index","decode","rowFlags","getWindow","to","fi","abs","rowAt","push","filteredIndex","disabledAt","labelAt","getLabels","values","result","Map","indexOfValue","set","has","findLabelPrefix","fromFilteredIndex","reset","MIN_PLAUSIBLE_SCROLL_CAP","OVERSCAN","DEFAULT_ROW_HEIGHT","DEFAULT_VIEWPORT_HEIGHT","EDGE_SCRIM_PAD","VirtualSelectController","store","active","windowStart","windowRows","filteredLength","scrollRaf","browserMaxScroll","Infinity","intendedScrollHeight","detectRaf","detectRetries","navAnchorFirstRow","onScroll","viewportEl","recompute","provider","isDisabledAt","ensureVisible","domItemForIndex","queryItem","findPrefix","effectiveMaxScroll","setFixedRowHeight","px","fixedRowHeight","attachViewport","getViewport","detachViewport","addEventListener","passive","measureRowHeight","detectScrollCap","cancelAnimationFrame","removeEventListener","first","h","offsetHeight","vpH","clientHeight","calc","requestRender","measured","clientH","top","bottom","maxScroll","visibleRows","lastVisible","padRows","target","tries"],"sources":["src/utils/select-options.ts","src/utils/virtual-window.ts","src/wasm/engine.wasm.ts","src/wasm/engine-abi.ts","src/utils/wasm-option-store.ts","src/utils/virtual-select-controller.ts"],"sourcesContent":["/**\n * Shared option model + reader for `md-select` / `md-multi-select`.\n *\n * Both components accept options two ways (decided by the consumer):\n * 1. Declarative slotted `<md-select-option>` children (primary API —\n * framework-friendly, supports rich labels + per-option icons).\n * 2. A programmatic `options` array prop (data-driven lists).\n *\n * `collectOptions()` normalises either source into a single flat\n * `SelectOptionData[]` the pickers render into `md-menu-item`s. When\n * slotted children are present they take precedence; otherwise the\n * array prop is used. This keeps the result predictable (no silent\n * duplication when a consumer accidentally supplies both).\n */\n\n/** Normalised option the pickers render. */\nexport interface SelectOptionData {\n /** Stable identifier — emitted in the picker `value` and used for matching. */\n value: string;\n /** Visible label rendered in the menu, chips, and the trigger text. */\n label: string;\n /** Disabled options stay visible but cannot be selected. */\n disabled: boolean;\n /** Optional Material Symbols leading-icon glyph. */\n icon?: string;\n /** Optional CSS colour applied to the leading icon (e.g. a status/swatch hue).\n * Any CSS `<color>` — hex, `rgb()`, or a theme token like\n * `var(--md-sys-color-primary)`. Ignored when the option has no `icon`, and\n * not carried on the virtualized (WASM) path — huge datasets fall back to the\n * `--md-{multi-}select-option-icon-color` token. */\n iconColor?: string;\n /** Optional secondary text rendered under the label in the menu. */\n supportingText?: string;\n /** Initial-selected hint carried by the option element / array entry. */\n selected?: boolean;\n}\n\n/** Programmatic option entry accepted by the `options` array prop. */\nexport interface SelectOptionInit {\n value: string;\n label?: string;\n disabled?: boolean;\n icon?: string;\n iconColor?: string;\n supportingText?: string;\n selected?: boolean;\n}\n\n/** Element-side shape of a slotted `<md-select-option>`. */\ninterface SelectOptionEl extends HTMLElement {\n value?: string;\n label?: string;\n disabled?: boolean;\n icon?: string;\n iconColor?: string;\n supportingText?: string;\n selected?: boolean;\n}\n\nfunction fromElement(el: SelectOptionEl): SelectOptionData {\n const label = (el.label || el.getAttribute('label') || el.textContent || '').trim();\n return {\n value: el.value ?? el.getAttribute('value') ?? '',\n label,\n disabled: el.disabled ?? el.hasAttribute('disabled'),\n icon: el.icon || el.getAttribute('icon') || undefined,\n iconColor: el.iconColor || el.getAttribute('icon-color') || undefined,\n supportingText:\n el.supportingText || el.getAttribute('supporting-text') || undefined,\n selected: el.selected ?? el.hasAttribute('selected'),\n };\n}\n\nfunction fromInit(o: SelectOptionInit): SelectOptionData {\n return {\n value: o.value,\n label: o.label ?? o.value,\n disabled: !!o.disabled,\n icon: o.icon,\n iconColor: o.iconColor,\n supportingText: o.supportingText,\n selected: !!o.selected,\n };\n}\n\n/**\n * A dataset given as a row factory rather than a materialised array, so very\n * large option sets (tens of millions) can be streamed into the WASM store\n * without ever holding the whole array in JS at once.\n */\nexport interface OptionRowSource {\n count: number;\n getRow: (index: number) => SelectOptionInit;\n}\n\n/**\n * Type guard distinguishing a row factory from a materialised array.\n * (`Array.isArray` doesn't narrow a `readonly[]` union, so this is explicit.)\n */\nexport function isRowSource(\n source: ReadonlyArray<SelectOptionInit> | OptionRowSource,\n): source is OptionRowSource {\n return !Array.isArray(source);\n}\n\n/** Materialise a row source (array or factory) into a plain array. */\nexport function rowsToArray(\n source: ReadonlyArray<SelectOptionInit> | OptionRowSource,\n): SelectOptionInit[] {\n if (!isRowSource(source)) return source.slice();\n const out = new Array<SelectOptionInit>(source.count);\n for (let i = 0; i < source.count; i++) out[i] = source.getRow(i);\n return out;\n}\n\n/** Normalise a programmatic `options` array to `SelectOptionData[]`. */\nexport function normalizeInits(inits: ReadonlyArray<SelectOptionInit>): SelectOptionData[] {\n return inits.map(fromInit);\n}\n\n/**\n * Read the option set for a picker host. Slotted `<md-select-option>`\n * children win when present; otherwise the `options` array is used.\n */\nexport function collectOptions(\n host: HTMLElement,\n optionsProp?: SelectOptionInit[],\n): SelectOptionData[] {\n // Direct light-DOM children only (avoids `:scope`, which mock-doc/older\n // engines don't support, and avoids reaching into nested option groups).\n const slotted = Array.from(host.children).filter(\n (c) => c.tagName.toLowerCase() === 'md-select-option',\n ) as SelectOptionEl[];\n\n if (slotted.length > 0) {\n return slotted.map(fromElement);\n }\n return (optionsProp ?? []).map(fromInit);\n}\n\n/** Label for a single value, or '' if not found. */\nexport function labelFor(options: SelectOptionData[], value: string): string {\n return options.find((o) => o.value === value)?.label ?? '';\n}\n","/**\n * Fixed-row-height virtual windowing math, shared by the virtualized selects.\n *\n * Pure and DOM-free so it can be unit-tested directly. Given the scroll offset\n * and viewport size, it returns the slice of rows to render plus the spacer\n * heights that make the scroll container behave as if every row were present.\n *\n * Two regimes:\n * - Exact: when the full list height fits under `maxScrollHeight`, the spacers\n * reproduce the real height 1:1 and the offset maps to a row directly.\n * - Scaled: when the list is taller than a browser can lay out (millions of\n * rows × row height easily exceeds the ~16–33M px element-height cap), the\n * spacers reproduce a *capped* height and the scroll offset maps\n * proportionally onto the row range. The rendered block is always\n * positioned to cover the viewport, so the list never shows blank rows and\n * can be scrolled all the way to the end.\n */\nexport interface WindowCalc {\n /** First filtered index to render (inclusive), overscan applied. */\n start: number;\n /** One past the last filtered index to render (exclusive). */\n end: number;\n /** Spacer height (px) before the first rendered row. */\n topPad: number;\n /** Spacer height (px) after the last rendered row. */\n bottomPad: number;\n /** Total scrollable height the spacers reproduce (topPad + rows + bottomPad). */\n scrollHeight: number;\n /**\n * The scroll offset this window is laid out for. Equal to the input scrollTop\n * for mouse-driven windows; for an anchored (keyboard-nav) window it is the\n * offset the caller should apply so the anchor row lands at the viewport top.\n */\n scrollTop: number;\n}\n\n/**\n * Default ceiling on the scrollable height. Comfortably under every major\n * browser's maximum element height (Firefox ~17.9M, Chrome ~33.5M) so the\n * spacers always lay out, while still giving smooth scroll resolution for\n * millions of rows. The controller can lower this further at runtime if it\n * detects the browser clamping even shorter.\n */\nexport const DEFAULT_MAX_SCROLL_HEIGHT = 1_500_000;\n\nexport function computeWindow(\n scrollTop: number,\n viewportHeight: number,\n rowHeight: number,\n total: number,\n overscan: number,\n maxScrollHeight: number = DEFAULT_MAX_SCROLL_HEIGHT,\n // In the scaled regime, pin the first rendered row to this index instead of\n // deriving it from the scroll fraction. Keyboard nav uses this because integer\n // scrollTop is too coarse to address individual rows in a multi-million list.\n anchorFirstRow: number = -1,\n): WindowCalc {\n if (total <= 0 || rowHeight <= 0 || viewportHeight <= 0) {\n const realHeight = total > 0 && rowHeight > 0 ? total * rowHeight : 0;\n return { start: 0, end: 0, topPad: 0, bottomPad: realHeight, scrollHeight: realHeight, scrollTop: 0 };\n }\n\n const realHeight = total * rowHeight;\n const visibleCount = Math.ceil(viewportHeight / rowHeight);\n\n // ── Exact regime: the list fits, spacers mirror the real height. ──\n if (realHeight <= maxScrollHeight) {\n const clamped = Math.min(Math.max(0, scrollTop), Math.max(0, realHeight - viewportHeight));\n const firstVisible = Math.floor(clamped / rowHeight);\n const start = Math.min(total, Math.max(0, firstVisible - overscan));\n const end = Math.min(total, Math.max(start, firstVisible + visibleCount + overscan));\n return {\n start,\n end,\n topPad: start * rowHeight,\n bottomPad: Math.max(0, (total - end) * rowHeight),\n scrollHeight: realHeight,\n scrollTop: clamped,\n };\n }\n\n // ── Scaled regime: list taller than `maxScrollHeight`. ──\n const scrollHeight = maxScrollHeight;\n const maxScrollTop = Math.max(1, scrollHeight - viewportHeight);\n const maxFirstRow = Math.max(0, total - visibleCount);\n\n if (anchorFirstRow >= 0) {\n // Keyboard nav: position the anchor row at the viewport top and *derive* the\n // scroll offset to match. Integer scrollTop is too coarse to address single\n // rows near the ends of a multi-million-row list, so we treat the offset as\n // an output (the caller applies `scrollTop`) instead of an input. This is\n // what makes ArrowDown/ArrowUp keep advancing past the rendered window.\n const firstVisibleRow = Math.min(maxFirstRow, anchorFirstRow);\n const aboveRows = Math.min(overscan, firstVisibleRow);\n const start = firstVisibleRow - aboveRows;\n const end = Math.min(total, firstVisibleRow + visibleCount + overscan);\n const blockHeight = (end - start) * rowHeight;\n // Use the SAME proportional row↔offset mapping as the mouse-scroll branch\n // below, so a given offset uniquely identifies the anchor row and re-deriving\n // the window from `scrollTop` (when the anchor is dropped) lands on the same\n // row. We deliberately do NOT pull the offset up to bottom-align the block\n // near the end (an earlier `hi` clamp did): that collapsed many adjacent\n // anchors onto one integer offset, so a single stray scroll event would\n // re-map that offset proportionally and teleport the view thousands of rows\n // (ArrowUp \"jumping\" near the bottom of a huge list). `lo` still keeps\n // topPad ≥ 0 near the very top. The block may now extend a few hundred px\n // past the nominal cap at the very end; we clamp `bottomPad` to ≥ 0 and let\n // the real content height absorb the remainder — negligible against\n // `scrollHeight`, and the offset stays reachable.\n const lo = aboveRows * rowHeight;\n const proportional = Math.round((firstVisibleRow / Math.max(1, maxFirstRow)) * maxScrollTop);\n const usedScrollTop = Math.max(lo, Math.min(maxScrollTop, proportional));\n const topPad = usedScrollTop - aboveRows * rowHeight;\n const bottomPad = Math.max(0, scrollHeight - topPad - blockHeight);\n return { start, end, topPad, bottomPad, scrollHeight, scrollTop: usedScrollTop };\n }\n\n // Mouse scroll: the browser's scrollTop is authoritative; map it onto the row\n // range and seat the block so the first visible row lands at the viewport top\n // (overscan above limited to the room the offset leaves, so topPad stays ≥ 0).\n const clamped = Math.min(Math.max(0, scrollTop), maxScrollTop);\n const firstVisibleRow = Math.round((clamped / maxScrollTop) * maxFirstRow);\n const aboveRows = Math.min(overscan, firstVisibleRow, Math.floor(clamped / rowHeight));\n const start = firstVisibleRow - aboveRows;\n const end = Math.min(total, firstVisibleRow + visibleCount + overscan);\n const blockHeight = (end - start) * rowHeight;\n const maxTop = Math.max(0, scrollHeight - blockHeight);\n let topPad = clamped - aboveRows * rowHeight;\n if (topPad < 0) topPad = 0;\n else if (topPad > maxTop) topPad = maxTop;\n const bottomPad = Math.max(0, scrollHeight - topPad - blockHeight);\n\n return { start, end, topPad, bottomPad, scrollHeight, scrollTop: clamped };\n}\n","// GENERATED by scripts/build-wasm.mjs — DO NOT EDIT.\n// Source: packages/core/src/wasm/engine.ts\n// Regenerate with: pnpm --filter @awc-ui/core build:wasm\n/* eslint-disable */\nexport const WASM_BASE64 =\n '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';\n","/**\n * Hand-written ABI surface for the WASM option engine.\n *\n * `engine.wasm.ts` (the base64 blob) is generated by scripts/build-wasm.mjs;\n * this file is the stable, committed wrapper the rest of the codebase imports.\n * Keep `EngineExports` in sync with the exports of `engine.ts`.\n */\nimport { WASM_BASE64 } from './engine.wasm';\n\n/** Filter modes accepted by `setQuery` (mirrors engine.ts). */\nexport const FILTER_SUBSTRING = 0;\nexport const FILTER_PREFIX = 1;\nexport const FILTER_FUZZY = 2;\n\n/** The functions exported by the compiled WASM engine. */\nexport interface EngineExports {\n memory: WebAssembly.Memory;\n reserve(\n rows: number,\n valueBytesTotal: number,\n labelBytesTotal: number,\n iconBytesTotal: number,\n supportBytesTotal: number,\n ): void;\n valueWritePtr(): number;\n labelWritePtr(): number;\n iconWritePtr(): number;\n supportWritePtr(): number;\n appendRow(\n valueLen: number,\n labelLen: number,\n iconLen: number,\n supportLen: number,\n flags: number,\n ): number;\n finalizeLoad(): void;\n queryPtr(): number;\n queryCapacity(): number;\n setQuery(queryLen: number, mode: number): number;\n totalCount(): number;\n filteredCount(): number;\n rowAt(filteredIndex: number): number;\n valuePtr(absIndex: number): number;\n valueLen(absIndex: number): number;\n labelPtr(absIndex: number): number;\n labelLen(absIndex: number): number;\n iconPtr(absIndex: number): number;\n iconLen(absIndex: number): number;\n supportPtr(absIndex: number): number;\n supportLen(absIndex: number): number;\n rowFlags(absIndex: number): number;\n indexOfValue(queryLen: number): number;\n findLabelPrefix(queryLen: number, fromFilteredIndex: number): number;\n reset(): void;\n}\n\nfunction decodeBase64(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n }\n // Node without a global atob (older runtimes / spec env).\n return Uint8Array.from(Buffer.from(b64, 'base64'));\n}\n\n/**\n * Compiled once per process — the module bytes never change, and every\n * consumer gets its own isolated instance (fresh memory) below. Without this\n * cache each component instance re-decoded and recompiled the same module.\n */\nlet modulePromise: Promise<WebAssembly.Module> | undefined;\n\n/**\n * Lazily instantiate the engine. The compiled module is a few KB; consumers\n * load their (potentially millions of) rows into its memory at runtime.\n */\nexport async function instantiateEngine(): Promise<EngineExports> {\n modulePromise ??= WebAssembly.compile(decodeBase64(WASM_BASE64));\n const module = await modulePromise;\n const imports = {\n env: {\n abort() {},\n trace() {},\n seed() {\n return Date.now();\n },\n },\n };\n const instance = await WebAssembly.instantiate(module, imports);\n return instance.exports as unknown as EngineExports;\n}\n","/**\n * `WasmOptionStore` — the single integration point both `md-select` and\n * `md-multi-select` use for virtualized, WASM-backed option data.\n *\n * It hides the engine ABI entirely (see `wasm/engine-abi.ts`): the dataset is\n * packed into WASM linear memory at `load()` time and JS keeps no copy, so a\n * select can hold millions of options while only ever decoding the ~visible\n * window back out per render. Filtering/typeahead run inside WASM.\n *\n * One instance per component → one `WebAssembly.Instance` → isolated memory.\n */\nimport {\n EngineExports,\n FILTER_SUBSTRING,\n instantiateEngine,\n} from '../wasm/engine-abi';\nimport { isRowSource, OptionRowSource, SelectOptionInit } from './select-options';\n\n/** A row read back out of the store for rendering. */\nexport interface VirtualRow {\n /** Absolute row index in the dataset (stable across filtering). */\n index: number;\n value: string;\n label: string;\n disabled: boolean;\n /** Material Symbols leading-icon glyph, or '' when the dataset has no icons. */\n icon: string;\n /** Secondary line under the label, or '' when the dataset has no supporting text. */\n supportingText: string;\n}\n\n/** Filter strategy, mapped to the engine's `setQuery` mode. */\nexport type FilterMode = 'substring' | 'prefix' | 'fuzzy';\n\nconst FILTER_MODE: Record<FilterMode, number> = {\n substring: 0,\n prefix: 1,\n fuzzy: 2,\n};\n\nconst DISABLED_FLAG = 1;\n\n/**\n * Time budget (ms) for one main-thread slice while packing. Bounding every\n * slice to roughly a frame keeps busy animations (the loading indicator)\n * fluid during multi-million-row loads — a fixed row-count chunk (formerly\n * 250k rows) blocked 100ms+ per chunk and dropped the spinner to ~7fps.\n */\nconst LOAD_SLICE_BUDGET_MS = 6;\n\n/** Rows between clock reads inside a slice (amortises performance.now()).\n * Small enough that one stride stays well inside the slice budget even with\n * an expensive consumer getRow (~1.4µs/row measured → ~3ms per stride). */\nconst LOAD_STRIDE = 2_048;\n\n/** Millisecond clock that also works in non-DOM (spec) environments. */\nconst nowMs: () => number =\n typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? () => performance.now()\n : () => Date.now();\n\n/** Yield to the event loop so the browser can handle input mid-load. NB:\n * scheduler.yield() continuations PREEMPT rendering, so this alone does not\n * produce paints — see yieldForPaint(). */\nfunction yieldToMain(): Promise<void> {\n const scheduler = (globalThis as { scheduler?: { yield?: () => Promise<void> } }).scheduler;\n if (scheduler?.yield) return scheduler.yield();\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/**\n * Work window between paint yields. Deliberately UNDER a 60Hz frame (16.7ms):\n * we resume ~1ms after a paint, so a 16ms window would finish just past the\n * next vsync and miss it (measured: alternating 17/33ms gaps → 25ms average).\n * 12ms of work + up to a stride of overshoot still lands the rAF request\n * before the deadline, giving a consistent ~16.7ms cadence.\n */\nconst PAINT_INTERVAL_MS = 12;\n\n/**\n * Yield in a way that guarantees the browser can PAINT when a frame is due —\n * scheduler.yield continuations outprioritise rendering, which froze the\n * loading animation to ~10fps during multi-million-row packs. When a frame is\n * due, await requestAnimationFrame (a real rendering opportunity); otherwise\n * take the cheap yield.\n */\nasync function yieldForPaint(lastPaint: { t: number }): Promise<void> {\n if (\n typeof requestAnimationFrame === 'function' &&\n nowMs() - lastPaint.t >= PAINT_INTERVAL_MS\n ) {\n // Resume AFTER the paint, not inside the rAF callback: resolving in rAF\n // would continue the pack as a microtask still inside the rendering-steps\n // task — the paint would then wait behind the next 16ms of work (measured\n // as ~33ms frame gaps). rAF marks the frame; the nested macrotask lands\n // once rendering has actually flushed.\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => setTimeout(resolve, 0));\n });\n lastPaint.t = nowMs();\n return;\n }\n await yieldToMain();\n}\n\n/** True when this runtime can host the engine (false in non-WASM SSR/test envs). */\nexport function isWasmSupported(): boolean {\n return typeof WebAssembly !== 'undefined' && typeof WebAssembly.instantiate === 'function';\n}\n\n/**\n * UTF-8 byte length of a string, matching `TextEncoder` semantics (lone\n * surrogates count as the 3-byte U+FFFD replacement). Allocation-free, so the\n * load sizing pass over millions of rows stays cheap.\n */\nexport function utf8ByteLength(str: string): number {\n let bytes = 0;\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x80) {\n bytes += 1;\n } else if (c < 0x800) {\n bytes += 2;\n } else if (c >= 0xd800 && c <= 0xdbff) {\n const next = str.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n bytes += 4;\n i++;\n } else {\n bytes += 3; // lone high surrogate → U+FFFD\n }\n } else {\n bytes += 3; // BMP ≥ 0x800, or lone low surrogate → U+FFFD\n }\n }\n return bytes;\n}\n\nexport class WasmOptionStore {\n private engine?: EngineExports;\n private ready?: Promise<void>;\n private enc = new TextEncoder();\n private dec = new TextDecoder();\n private _length = 0;\n private _total = 0;\n private mode: number = FILTER_SUBSTRING;\n\n /** Lazily instantiate the engine (memoized). */\n ensureReady(): Promise<void> {\n if (!this.ready) {\n this.ready = isWasmSupported()\n ? instantiateEngine().then((e) => {\n this.engine = e;\n })\n : Promise.reject(new Error('WebAssembly is not available in this environment'));\n }\n return this.ready;\n }\n\n get ready$(): boolean {\n return !!this.engine;\n }\n\n /** Current filtered row count. */\n get length(): number {\n return this._length;\n }\n\n /** Total rows loaded (ignores the active filter). */\n get total(): number {\n return this._total;\n }\n\n setFilterMode(mode: FilterMode): void {\n this.mode = FILTER_MODE[mode] ?? FILTER_SUBSTRING;\n }\n\n private mem(): Uint8Array {\n // Re-derived on every read batch: a prior `memory.grow` detaches the old\n // ArrayBuffer, so a cached view would throw.\n return new Uint8Array(this.engine!.memory.buffer);\n }\n\n /**\n * Load a dataset into WASM memory. Accepts either a materialised array or a\n * row factory (`{ count, getRow }`) — the factory path never holds more than\n * one row in JS at a time, so it scales to tens of millions of options. Two\n * passes over the input: size, then encode each row's UTF-8 directly into the\n * engine's buffers. JS references to the rows are not retained.\n */\n async load(source: ReadonlyArray<SelectOptionInit> | OptionRowSource): Promise<void> {\n await this.ensureReady();\n const e = this.engine!;\n\n let count: number;\n let at: (i: number) => SelectOptionInit;\n if (isRowSource(source)) {\n count = source.count;\n at = source.getRow;\n } else {\n count = source.length;\n at = (i) => source[i];\n }\n\n const lastPaint = { t: nowMs() };\n\n // Pass 1 — size the columns. TIME-SLICED with yields so a\n // multi-million-row load never blocks the main thread longer than about a\n // frame: the browser paints (fluid loading animation) and handles input\n // between slices. Icon / supporting-text totals stay 0 when the dataset\n // uses neither, so the engine skips those columns entirely.\n let valueBytesTotal = 0;\n let labelBytesTotal = 0;\n let iconBytesTotal = 0;\n let supportBytesTotal = 0;\n for (let i = 0; i < count; ) {\n const sliceStart = nowMs();\n do {\n const end = Math.min(count, i + LOAD_STRIDE);\n for (; i < end; i++) {\n const r = at(i);\n valueBytesTotal += utf8ByteLength(r.value);\n labelBytesTotal += utf8ByteLength(r.label ?? r.value);\n if (r.icon) iconBytesTotal += utf8ByteLength(r.icon);\n if (r.supportingText) supportBytesTotal += utf8ByteLength(r.supportingText);\n }\n } while (i < count && nowMs() - sliceStart < LOAD_SLICE_BUDGET_MS);\n if (i < count) await yieldForPaint(lastPaint);\n }\n\n e.reserve(count, valueBytesTotal, labelBytesTotal, iconBytesTotal, supportBytesTotal);\n\n // Pass 2 — encode each row's UTF-8 straight into the engine buffers, also\n // time-sliced + yielding. The memory view is re-derived per slice: appendRow\n // never grows memory, but a yield could let other work run in between. Read\n // all four write pointers before appendRow — it advances every cursor.\n for (let i = 0; i < count; ) {\n const sliceStart = nowMs();\n const mem = this.mem();\n do {\n const end = Math.min(count, i + LOAD_STRIDE);\n for (; i < end; i++) {\n const r = at(i);\n const vp = e.valueWritePtr();\n const v = this.enc.encodeInto(r.value, mem.subarray(vp));\n const lp = e.labelWritePtr();\n const l = this.enc.encodeInto(r.label ?? r.value, mem.subarray(lp));\n const ip = e.iconWritePtr();\n const ic =\n iconBytesTotal > 0 ? this.enc.encodeInto(r.icon ?? '', mem.subarray(ip)) : null;\n const sp = e.supportWritePtr();\n const sc =\n supportBytesTotal > 0\n ? this.enc.encodeInto(r.supportingText ?? '', mem.subarray(sp))\n : null;\n e.appendRow(\n v.written ?? 0,\n l.written ?? 0,\n ic?.written ?? 0,\n sc?.written ?? 0,\n r.disabled ? DISABLED_FLAG : 0,\n );\n }\n } while (i < count && nowMs() - sliceStart < LOAD_SLICE_BUDGET_MS);\n if (i < count) await yieldForPaint(lastPaint);\n }\n\n e.finalizeLoad(); // allocates the value index — may grow memory\n\n this._total = e.totalCount();\n this._length = e.filteredCount();\n }\n\n /** Write a string into the engine's scratch buffer; returns bytes written. */\n private writeScratch(s: string): number {\n const e = this.engine!;\n const cap = e.queryCapacity();\n const ptr = e.queryPtr();\n const { written } = this.enc.encodeInto(s, this.mem().subarray(ptr, ptr + cap));\n return written ?? 0;\n }\n\n /** Apply a filter query. Returns the new filtered length. */\n setQuery(query: string): number {\n if (!this.engine) return 0;\n const len = this.writeScratch(query);\n this._length = this.engine.setQuery(len, this.mode);\n return this._length;\n }\n\n private decodeRow(absIndex: number, mem: Uint8Array): VirtualRow {\n const e = this.engine!;\n const vp = e.valuePtr(absIndex);\n const vl = e.valueLen(absIndex);\n const lp = e.labelPtr(absIndex);\n const ll = e.labelLen(absIndex);\n // Icon / supporting-text columns return 0-length ranges when the dataset\n // didn't supply them, so these decode to '' at no extra packing cost.\n const ip = e.iconPtr(absIndex);\n const il = e.iconLen(absIndex);\n const sp = e.supportPtr(absIndex);\n const sl = e.supportLen(absIndex);\n return {\n index: absIndex,\n value: this.dec.decode(mem.subarray(vp, vp + vl)),\n label: this.dec.decode(mem.subarray(lp, lp + ll)),\n disabled: (e.rowFlags(absIndex) & DISABLED_FLAG) !== 0,\n icon: il > 0 ? this.dec.decode(mem.subarray(ip, ip + il)) : '',\n supportingText: sl > 0 ? this.dec.decode(mem.subarray(sp, sp + sl)) : '',\n };\n }\n\n /** Decode `count` rows starting at filtered position `start`. */\n getWindow(start: number, count: number): VirtualRow[] {\n if (!this.engine) return [];\n const e = this.engine;\n const mem = this.mem();\n const out: VirtualRow[] = [];\n const from = Math.max(0, start);\n const to = Math.min(this._length, start + count);\n for (let fi = from; fi < to; fi++) {\n const abs = e.rowAt(fi);\n if (abs >= 0) out.push(this.decodeRow(abs, mem));\n }\n return out;\n }\n\n /** Decode a single row at filtered position `filteredIndex`, or null. */\n getRow(filteredIndex: number): VirtualRow | null {\n if (!this.engine) return null;\n const abs = this.engine.rowAt(filteredIndex);\n if (abs < 0) return null;\n return this.decodeRow(abs, this.mem());\n }\n\n /** Map a filtered position to its absolute row index, or -1. */\n rowAt(filteredIndex: number): number {\n return this.engine ? this.engine.rowAt(filteredIndex) : -1;\n }\n\n /** Disabled flag for a filtered position — flag-only, no string decode. */\n disabledAt(filteredIndex: number): boolean {\n if (!this.engine) return false;\n const abs = this.engine.rowAt(filteredIndex);\n if (abs < 0) return false;\n return (this.engine.rowFlags(abs) & DISABLED_FLAG) !== 0;\n }\n\n /** Label for a filtered position — decodes a single label. */\n labelAt(filteredIndex: number): string {\n if (!this.engine) return '';\n const abs = this.engine.rowAt(filteredIndex);\n if (abs < 0) return '';\n const lp = this.engine.labelPtr(abs);\n const ll = this.engine.labelLen(abs);\n return this.dec.decode(this.mem().subarray(lp, lp + ll));\n }\n\n /**\n * Resolve labels for selected values that may be outside the current filter\n * (e.g. the trigger text / chips). O(1) per value via the engine's index.\n */\n getLabels(values: ReadonlyArray<string>): Map<string, string> {\n const result = new Map<string, string>();\n if (!this.engine) return result;\n const e = this.engine;\n for (const value of values) {\n const len = this.writeScratch(value);\n const abs = e.indexOfValue(len);\n if (abs >= 0) {\n const lp = e.labelPtr(abs);\n const ll = e.labelLen(abs);\n result.set(value, this.dec.decode(this.mem().subarray(lp, lp + ll)));\n }\n }\n return result;\n }\n\n /** Whether a value exists in the dataset. */\n has(value: string): boolean {\n if (!this.engine) return false;\n return this.engine.indexOfValue(this.writeScratch(value)) >= 0;\n }\n\n /**\n * Typeahead helper: first filtered position at/after `fromFilteredIndex`\n * whose label starts with `query` (wraps the filtered list). Returns a\n * filtered-list index, or -1.\n */\n findLabelPrefix(query: string, fromFilteredIndex: number): number {\n if (!this.engine) return -1;\n const len = this.writeScratch(query);\n return this.engine.findLabelPrefix(len, fromFilteredIndex);\n }\n\n /** Drop the dataset. */\n reset(): void {\n this.engine?.reset();\n this._length = 0;\n this._total = 0;\n }\n}\n","/**\n * `VirtualSelectController` — the shared virtualization engine for `md-select`\n * and `md-multi-select`, so neither component duplicates the window math,\n * scroll wiring, or the `VirtualMenuProvider` glue.\n *\n * It owns a `WasmOptionStore` (the dataset, packed in WASM memory) and the\n * current scroll window. The host component supplies a tiny adapter\n * (`queryItem` + `requestRender`) and reads the controller's public window\n * fields from its `render()`.\n */\nimport { computeWindow, DEFAULT_MAX_SCROLL_HEIGHT } from './virtual-window';\n\n/** Floor under which a measured scrollHeight cannot be a genuine browser\n * element-height clamp (real clamps are millions of px — Chrome ~33.5M,\n * Firefox ~17.8M) — it just means layout wasn't ready (see detectScrollCap). */\nconst MIN_PLAUSIBLE_SCROLL_CAP = 1_000_000;\nimport {\n FilterMode,\n isWasmSupported,\n VirtualRow,\n WasmOptionStore,\n} from './wasm-option-store';\nimport { isRowSource, OptionRowSource, SelectOptionInit } from './select-options';\nimport { VirtualMenuProvider } from './types';\n\n// Larger overscan than a typical virtual list: in the scaled regime a single\n// scroll frame can advance many rows, and render is async, so extra buffered\n// rows above/below the fold keep the body from flashing blank on fast scrolls.\nconst OVERSCAN = 8;\nconst DEFAULT_ROW_HEIGHT = 48;\nconst DEFAULT_VIEWPORT_HEIGHT = 320;\n// Extra px to keep a keyboard-revealed row clear of the viewport's top/bottom\n// edge. Historically 32px to clear md-scroll-shadow's edge fade; the scroll\n// shadow was removed, so a revealed row can sit flush against the edge (0). Kept\n// as a named knob in case a future edge treatment needs slack again.\nconst EDGE_SCRIM_PAD = 0;\n\nexport interface VirtualSelectHost {\n /** The rendered `md-menu-item` for a filtered index, from the host's shadow DOM. */\n queryItem(filteredIndex: number): HTMLElement | null;\n /** Re-render the host (it reads the controller's window fields). */\n requestRender(): void;\n}\n\nexport class VirtualSelectController {\n readonly store = new WasmOptionStore();\n\n /** True once a dataset is loaded and the component should render windowed. */\n active = false;\n /** First filtered index currently rendered. */\n windowStart = 0;\n /** The decoded rows in the current window. */\n windowRows: VirtualRow[] = [];\n /** Spacer heights (px) that preserve the full scroll height. */\n topPad = 0;\n bottomPad = 0;\n /** Current filtered row count. */\n filteredLength = 0;\n /** Effective fixed row height (measured or overridden). */\n rowHeight = DEFAULT_ROW_HEIGHT;\n\n private fixedRowHeight?: number;\n private viewportEl?: HTMLElement;\n private scrollRaf = 0;\n\n /**\n * The browser's observed maximum element height. Browsers clamp very tall\n * elements (a few-million-row list × row height blows past the ~16–33M px\n * cap), so the spacers can't reproduce the true height. We start optimistic\n * and shrink to the real clamp once we can measure it (see `detectScrollCap`).\n */\n private browserMaxScroll = Infinity;\n /** The scrollable height the last `recompute` asked the spacers to produce. */\n private intendedScrollHeight = 0;\n private detectRaf = 0;\n /** Retries left for detectScrollCap while layout isn't ready (see below). */\n private detectRetries = 0;\n\n /**\n * Scaled-regime keyboard nav: the first row to render, pinned independent of\n * the (too-coarse) integer scrollTop. -1 means the window is scroll-driven.\n */\n private navAnchorFirstRow = -1;\n /** The scroll offset the last `recompute` laid the window out for. */\n private usedScrollTop = 0;\n\n constructor(private host: VirtualSelectHost) {}\n\n /** Ceiling on the spacer height: our safe default, lowered by any real clamp. */\n private effectiveMaxScroll(): number {\n return Math.min(DEFAULT_MAX_SCROLL_HEIGHT, this.browserMaxScroll);\n }\n\n setFixedRowHeight(px?: number): void {\n this.fixedRowHeight = px && px > 0 ? px : undefined;\n if (this.fixedRowHeight) this.rowHeight = this.fixedRowHeight;\n }\n\n setFilterMode(mode: FilterMode): void {\n this.store.setFilterMode(mode);\n }\n\n /** Load a dataset into WASM memory. Returns false if WASM is unavailable. */\n async load(source: ReadonlyArray<SelectOptionInit> | OptionRowSource): Promise<boolean> {\n const count = isRowSource(source) ? source.count : source.length;\n if (!isWasmSupported() || count === 0) return false;\n try {\n await this.store.ensureReady();\n } catch {\n return false;\n }\n await this.store.load(source);\n this.active = true;\n this.filteredLength = this.store.length;\n this.recompute(this.viewportEl?.scrollTop ?? 0);\n return true;\n }\n\n /** Apply a filter query and reset the scroll to the top. */\n setQuery(query: string): void {\n if (!this.active) return;\n this.filteredLength = this.store.setQuery(query);\n this.navAnchorFirstRow = -1;\n if (this.viewportEl) this.viewportEl.scrollTop = 0;\n this.recompute(0);\n }\n\n getLabels(values: ReadonlyArray<string>): Map<string, string> {\n return this.store.getLabels(values);\n }\n\n reset(): void {\n this.store.reset();\n this.active = false;\n this.windowRows = [];\n this.filteredLength = 0;\n this.windowStart = 0;\n this.topPad = 0;\n this.bottomPad = 0;\n this.navAnchorFirstRow = -1;\n }\n\n // ── Viewport wiring (call when the menu opens / closes) ──────\n\n async attachViewport(getViewport: () => Promise<HTMLElement | null>): Promise<void> {\n this.detachViewport();\n const vp = await getViewport();\n this.viewportEl = vp ?? undefined;\n if (this.viewportEl) {\n this.viewportEl.addEventListener('scroll', this.onScroll, { passive: true });\n this.measureRowHeight();\n this.recompute(this.viewportEl.scrollTop);\n this.detectRetries = 60; // ~2s of rAF pairs — spacers may render late\n this.detectScrollCap();\n }\n }\n\n detachViewport(): void {\n if (this.scrollRaf) {\n cancelAnimationFrame(this.scrollRaf);\n this.scrollRaf = 0;\n }\n if (this.detectRaf) {\n cancelAnimationFrame(this.detectRaf);\n this.detectRaf = 0;\n }\n this.viewportEl?.removeEventListener('scroll', this.onScroll);\n this.viewportEl = undefined;\n }\n\n private onScroll = () => {\n if (this.scrollRaf) return;\n this.scrollRaf = requestAnimationFrame(() => {\n this.scrollRaf = 0;\n const vp = this.viewportEl;\n if (!vp) return;\n // Tell our own programmatic scroll (driving an anchored keyboard-nav\n // window) from a genuine user scroll by value: if the offset still matches\n // what the current window was laid out for, keep the anchor; otherwise the\n // user scrolled, so resume scroll-driven windowing. (A value check is\n // robust to event coalescing/ordering, unlike a one-shot flag.)\n if (this.navAnchorFirstRow >= 0 && Math.abs(vp.scrollTop - this.usedScrollTop) <= 1) {\n return;\n }\n this.navAnchorFirstRow = -1;\n this.recompute(vp.scrollTop);\n });\n };\n\n private measureRowHeight(): void {\n if (this.fixedRowHeight) {\n this.rowHeight = this.fixedRowHeight;\n return;\n }\n const first = this.host.queryItem(this.windowStart);\n const h = first?.offsetHeight ?? 0;\n if (h > 0 && h !== this.rowHeight) {\n this.rowHeight = h;\n if (this.viewportEl) this.recompute(this.viewportEl.scrollTop);\n }\n }\n\n private recompute(scrollTop: number): void {\n const vpH = this.viewportEl?.clientHeight || DEFAULT_VIEWPORT_HEIGHT;\n const calc = computeWindow(\n scrollTop,\n vpH,\n this.rowHeight,\n this.filteredLength,\n OVERSCAN,\n this.effectiveMaxScroll(),\n this.navAnchorFirstRow,\n );\n this.windowStart = calc.start;\n this.topPad = calc.topPad;\n this.bottomPad = calc.bottomPad;\n this.intendedScrollHeight = calc.scrollHeight;\n this.usedScrollTop = calc.scrollTop;\n this.windowRows = this.store.getWindow(calc.start, calc.end - calc.start);\n this.host.requestRender();\n }\n\n /**\n * Detect the browser's real maximum element height. After the spacers lay\n * out, if the viewport's `scrollHeight` came back shorter than we asked for,\n * the browser clamped it — and that clamp *is* the true maximum, so adopt it\n * and re-window against it. Runs a couple of frames after attach so the\n * (async) spacer render has committed; idempotent and only ever shrinks.\n */\n private detectScrollCap(): void {\n if (this.detectRaf) cancelAnimationFrame(this.detectRaf);\n this.detectRaf = requestAnimationFrame(() => {\n this.detectRaf = requestAnimationFrame(() => {\n this.detectRaf = 0;\n const vp = this.viewportEl;\n if (!vp) return;\n const measured = vp.scrollHeight;\n if (\n measured > 0 &&\n measured + 2 < this.intendedScrollHeight &&\n measured < this.browserMaxScroll\n ) {\n // A small reading is NOT a browser clamp — the spacers simply have\n // not been laid out yet (e.g. the menu opened during a dataset pack\n // and still showed the uncapped busy bar when we measured). Locking\n // it in would permanently collapse the scroll geometry (the cap\n // never grows back), so retry instead.\n if (measured < MIN_PLAUSIBLE_SCROLL_CAP) {\n if (this.detectRetries-- > 0) this.detectScrollCap();\n return;\n }\n this.browserMaxScroll = measured;\n this.recompute(vp.scrollTop);\n }\n });\n });\n }\n\n // ── VirtualMenuProvider (md-menu drives nav through this) ────\n\n readonly provider: VirtualMenuProvider = {\n count: () => this.filteredLength,\n labelAt: (i) => this.store.labelAt(i),\n isDisabledAt: (i) => this.store.disabledAt(i),\n ensureVisible: (i) => this.ensureVisible(i),\n domItemForIndex: (i) => this.host.queryItem(i),\n findPrefix: (buffer, from) => this.store.findLabelPrefix(buffer, from),\n };\n\n private async ensureVisible(filteredIndex: number): Promise<void> {\n const vp = this.viewportEl;\n if (!vp) return;\n const clientH = vp.clientHeight || DEFAULT_VIEWPORT_HEIGHT;\n const realHeight = this.filteredLength * this.rowHeight;\n\n if (realHeight <= this.effectiveMaxScroll()) {\n // Exact regime: pixel offset is the row index times the row height.\n this.navAnchorFirstRow = -1;\n const top = filteredIndex * this.rowHeight;\n const bottom = top + this.rowHeight;\n // Reveal with EDGE_SCRIM_PAD of slack so the row clears the edge fade.\n // Clamped to [0, maxScroll]: rows at the very top/bottom — where no scrim\n // shows — still seat flush.\n const maxScroll = Math.max(0, vp.scrollHeight - clientH);\n if (top - EDGE_SCRIM_PAD < vp.scrollTop) {\n vp.scrollTop = Math.max(0, top - EDGE_SCRIM_PAD);\n } else if (bottom + EDGE_SCRIM_PAD > vp.scrollTop + clientH) {\n vp.scrollTop = Math.min(maxScroll, bottom + EDGE_SCRIM_PAD - clientH);\n }\n this.recompute(vp.scrollTop);\n } else {\n // Scaled regime: integer scrollTop can't address single rows (millions of\n // rows compressed into a capped height — one pixel can be dozens of rows).\n // When the target row isn't already on screen, pin the window to an anchor\n // and let `computeWindow` choose the matching scroll offset, then apply it.\n const visibleRows = Math.max(1, Math.floor(clientH / this.rowHeight));\n const visibleCount = Math.ceil(clientH / this.rowHeight);\n const maxFirstRow = Math.max(0, this.filteredLength - visibleCount);\n // First visible row: take it exactly from the anchor when the window is\n // anchor-driven (deriving it from a fractional scrollTop drifts by a row);\n // fall back to the live geometry only when scroll-driven.\n const firstVisible =\n this.navAnchorFirstRow >= 0\n ? this.navAnchorFirstRow\n : this.windowStart +\n Math.max(0, Math.round((vp.scrollTop - this.topPad) / this.rowHeight));\n const lastVisible = firstVisible + visibleRows - 1;\n\n // Re-anchor when the focused row is outside the visible range OR within\n // `padRows` of either edge. The edge check matters even when the row is\n // already visible: navigating up one row at a time makes the focused row\n // the *first* visible row (flush against the top), which is never \"outside\"\n // the range — so without it the top scroll-shadow scrim would still cover\n // the focused row. Mirrors the exact-regime branch above.\n const padRows = Math.ceil(EDGE_SCRIM_PAD / this.rowHeight);\n if (\n filteredIndex < firstVisible + padRows ||\n filteredIndex > lastVisible - padRows\n ) {\n // Reveal `padRows` clear of the top (scrolling up) or bottom (scrolling\n // down) edge, clamped to [0, maxFirstRow] so the list ends — where no\n // scrim shows — still seat the row flush.\n this.navAnchorFirstRow = Math.min(\n maxFirstRow,\n Math.max(\n 0,\n filteredIndex < firstVisible + padRows\n ? filteredIndex - padRows\n : filteredIndex - visibleRows + 1 + padRows,\n ),\n );\n }\n this.recompute(vp.scrollTop);\n // Sync the browser scroll to the offset the (anchored) window was laid out\n // for. Clamp to the viewport's real max — the capped element can render a\n // hair shorter than we asked (scroll-shadow sentinels), and overshooting by\n // even a pixel near the end gets clamped by the browser — then adopt\n // whatever it actually applied, so the scroll guard and the next \"first\n // visible\" never drift out of sync and clear the anchor.\n if (this.navAnchorFirstRow >= 0) {\n const maxScroll = Math.max(0, vp.scrollHeight - clientH);\n const target = Math.min(Math.round(this.usedScrollTop), maxScroll);\n if (target !== Math.round(vp.scrollTop)) {\n vp.scrollTop = target;\n }\n this.usedScrollTop = vp.scrollTop;\n }\n }\n // Wait for the host to render the target row into the window so the menu\n // can move real focus onto it.\n for (let tries = 0; tries < 8; tries++) {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n if (this.host.queryItem(filteredIndex)) return;\n }\n }\n}\n"],"mappings":"AA2DA,SAASA,EAAYC,GACnB,MAAMC,GAASD,EAAGC,OAASD,EAAGE,aAAa,UAAYF,EAAGG,aAAe,IAAIC,OAC7E,MAAO,CACLC,MAAOL,EAAGK,OAASL,EAAGE,aAAa,UAAY,GAC/CD,QACAK,SAAUN,EAAGM,UAAYN,EAAGO,aAAa,YACzCC,KAAMR,EAAGQ,MAAQR,EAAGE,aAAa,SAAWO,UAC5CC,UAAWV,EAAGU,WAAaV,EAAGE,aAAa,eAAiBO,UAC5DE,eACEX,EAAGW,gBAAkBX,EAAGE,aAAa,oBAAsBO,UAC7DG,SAAUZ,EAAGY,UAAYZ,EAAGO,aAAa,YAE7C,CAEA,SAASM,EAASC,GAChB,MAAO,CACLT,MAAOS,EAAET,MACTJ,MAAOa,EAAEb,OAASa,EAAET,MACpBC,WAAYQ,EAAER,SACdE,KAAMM,EAAEN,KACRE,UAAWI,EAAEJ,UACbC,eAAgBG,EAAEH,eAClBC,WAAYE,EAAEF,SAElB,CAgBM,SAAUG,EACdC,GAEA,OAAQC,MAAMC,QAAQF,EACxB,CAGM,SAAUG,EACdH,GAEA,IAAKD,EAAYC,GAAS,OAAOA,EAAOI,QACxC,MAAMC,EAAM,IAAIJ,MAAwBD,EAAOM,OAC/C,IAAK,IAAIC,EAAI,EAAGA,EAAIP,EAAOM,MAAOC,IAAKF,EAAIE,GAAKP,EAAOQ,OAAOD,GAC9D,OAAOF,CACT,CAGM,SAAUI,EAAeC,GAC7B,OAAOA,EAAMC,IAAId,EACnB,CAMM,SAAUe,EACdC,EACAC,GAIA,MAAMC,EAAUd,MAAMe,KAAKH,EAAKI,UAAUC,QACvCC,GAAMA,EAAEC,QAAQC,gBAAkB,qBAGrC,GAAIN,EAAQO,OAAS,EAAG,CACtB,OAAOP,EAAQJ,IAAI5B,E,CAErB,OAAQ+B,GAAe,IAAIH,IAAId,EACjC,CAGM,SAAU0B,EAASC,EAA6BnC,GACpD,OAAOmC,EAAQC,MAAM3B,GAAMA,EAAET,QAAUA,KAAQJ,OAAS,EAC1D,CCpGO,MAAMyC,EAA4B,KAEnC,SAAUC,EACdC,EACAC,EACAC,EACAC,EACAC,EACAC,EAA0BP,EAI1BQ,GAAyB,GAEzB,GAAIH,GAAS,GAAKD,GAAa,GAAKD,GAAkB,EAAG,CACvD,MAAMM,EAAaJ,EAAQ,GAAKD,EAAY,EAAIC,EAAQD,EAAY,EACpE,MAAO,CAAEM,MAAO,EAAGC,IAAK,EAAGC,OAAQ,EAAGC,UAAWJ,EAAYK,aAAcL,EAAYP,UAAW,E,CAGpG,MAAMO,EAAaJ,EAAQD,EAC3B,MAAMW,EAAeC,KAAKC,KAAKd,EAAiBC,GAGhD,GAAIK,GAAcF,EAAiB,CACjC,MAAMW,EAAUF,KAAKG,IAAIH,KAAKI,IAAI,EAAGlB,GAAYc,KAAKI,IAAI,EAAGX,EAAaN,IAC1E,MAAMkB,EAAeL,KAAKM,MAAMJ,EAAUd,GAC1C,MAAMM,EAAQM,KAAKG,IAAId,EAAOW,KAAKI,IAAI,EAAGC,EAAef,IACzD,MAAMK,EAAMK,KAAKG,IAAId,EAAOW,KAAKI,IAAIV,EAAOW,EAAeN,EAAeT,IAC1E,MAAO,CACLI,QACAC,MACAC,OAAQF,EAAQN,EAChBS,UAAWG,KAAKI,IAAI,GAAIf,EAAQM,GAAOP,GACvCU,aAAcL,EACdP,UAAWgB,E,CAKf,MAAMJ,EAAeP,EACrB,MAAMgB,EAAeP,KAAKI,IAAI,EAAGN,EAAeX,GAChD,MAAMqB,EAAcR,KAAKI,IAAI,EAAGf,EAAQU,GAExC,GAAIP,GAAkB,EAAG,CAMvB,MAAMiB,EAAkBT,KAAKG,IAAIK,EAAahB,GAC9C,MAAMkB,EAAYV,KAAKG,IAAIb,EAAUmB,GACrC,MAAMf,EAAQe,EAAkBC,EAChC,MAAMf,EAAMK,KAAKG,IAAId,EAAOoB,EAAkBV,EAAeT,GAC7D,MAAMqB,GAAehB,EAAMD,GAASN,EAapC,MAAMwB,EAAKF,EAAYtB,EACvB,MAAMyB,EAAeb,KAAKc,MAAOL,EAAkBT,KAAKI,IAAI,EAAGI,GAAgBD,GAC/E,MAAMQ,EAAgBf,KAAKI,IAAIQ,EAAIZ,KAAKG,IAAII,EAAcM,IAC1D,MAAMjB,EAASmB,EAAgBL,EAAYtB,EAC3C,MAAMS,EAAYG,KAAKI,IAAI,EAAGN,EAAeF,EAASe,GACtD,MAAO,CAAEjB,QAAOC,MAAKC,SAAQC,YAAWC,eAAcZ,UAAW6B,E,CAMnE,MAAMb,EAAUF,KAAKG,IAAIH,KAAKI,IAAI,EAAGlB,GAAYqB,GACjD,MAAME,EAAkBT,KAAKc,MAAOZ,EAAUK,EAAgBC,GAC9D,MAAME,EAAYV,KAAKG,IAAIb,EAAUmB,EAAiBT,KAAKM,MAAMJ,EAAUd,IAC3E,MAAMM,EAAQe,EAAkBC,EAChC,MAAMf,EAAMK,KAAKG,IAAId,EAAOoB,EAAkBV,EAAeT,GAC7D,MAAMqB,GAAehB,EAAMD,GAASN,EACpC,MAAM4B,EAAShB,KAAKI,IAAI,EAAGN,EAAea,GAC1C,IAAIf,EAASM,EAAUQ,EAAYtB,EACnC,GAAIQ,EAAS,EAAGA,EAAS,OACpB,GAAIA,EAASoB,EAAQpB,EAASoB,EACnC,MAAMnB,EAAYG,KAAKI,IAAI,EAAGN,EAAeF,EAASe,GAEtD,MAAO,CAAEjB,QAAOC,MAAKC,SAAQC,YAAWC,eAAcZ,UAAWgB,EACnE,CCjIO,MAAMe,EACX,2nVCKK,MAAMC,EAAmB,EA8ChC,SAASC,EAAaC,GACpB,UAAWC,OAAS,WAAY,CAC9B,MAAMC,EAAMD,KAAKD,GACjB,MAAMzD,EAAM,IAAI4D,WAAWD,EAAI1C,QAC/B,IAAK,IAAIf,EAAI,EAAGA,EAAIyD,EAAI1C,OAAQf,IAAKF,EAAIE,GAAKyD,EAAIE,WAAW3D,GAC7D,OAAOF,C,CAGT,OAAO4D,WAAWjD,KAAKmD,OAAOnD,KAAK8C,EAAK,UAC1C,CAOA,IAAIM,EAMGC,eAAeC,IACpBF,MAAkBG,YAAYC,QAAQX,EAAaF,KACnD,MAAMc,QAAeL,EACrB,MAAMM,EAAU,CACdC,IAAK,CACH,KAAAC,GAAK,EACL,KAAAC,GAAK,EACL,IAAAC,GACE,OAAOC,KAAKC,K,IAIlB,MAAMC,QAAiBV,YAAYW,YAAYT,EAAQC,GACvD,OAAOO,EAASE,OAClB,CC1DA,MAAMC,EAA0C,CAC9CC,UAAW,EACXC,OAAQ,EACRC,MAAO,GAGT,MAAMC,EAAgB,EAQtB,MAAMC,EAAuB,EAK7B,MAAMC,EAAc,KAGpB,MAAMC,SACGC,cAAgB,oBAAsBA,YAAYZ,MAAQ,WAC7D,IAAMY,YAAYZ,MAClB,IAAMD,KAAKC,MAKjB,SAASa,IACP,MAAMC,EAAaC,WAA+DD,UAClF,GAAIA,GAAWE,MAAO,OAAOF,EAAUE,QACvC,OAAO,IAAIC,SAASC,GAAYC,WAAWD,EAAS,IACtD,CASA,MAAME,EAAoB,GAS1B/B,eAAegC,EAAcC,GAC3B,UACSC,wBAA0B,YACjCZ,IAAUW,EAAUE,GAAKJ,EACzB,OAMM,IAAIH,SAAeC,IACvBK,uBAAsB,IAAMJ,WAAWD,EAAS,IAAG,IAErDI,EAAUE,EAAIb,IACd,M,OAEIE,GACR,C,SAGgBY,IACd,cAAclC,cAAgB,oBAAsBA,YAAYW,cAAgB,UAClF,CAOM,SAAUwB,EAAeC,GAC7B,IAAIC,EAAQ,EACZ,IAAK,IAAIrG,EAAI,EAAGA,EAAIoG,EAAIrF,OAAQf,IAAK,CACnC,MAAMY,EAAIwF,EAAIzC,WAAW3D,GACzB,GAAIY,EAAI,IAAM,CACZyF,GAAS,C,MACJ,GAAIzF,EAAI,KAAO,CACpByF,GAAS,C,MACJ,GAAIzF,GAAK,OAAUA,GAAK,MAAQ,CACrC,MAAM0F,EAAOF,EAAIzC,WAAW3D,EAAI,GAChC,GAAIsG,GAAQ,OAAUA,GAAQ,MAAQ,CACpCD,GAAS,EACTrG,G,KACK,CACLqG,GAAS,C,MAEN,CACLA,GAAS,C,EAGb,OAAOA,CACT,C,MAEaE,EAAb,WAAAC,GAGUC,KAAAC,IAAM,IAAIC,YACVF,KAAAG,IAAM,IAAIC,YACVJ,KAAAK,QAAU,EACVL,KAAAM,OAAS,EACTN,KAAAO,KAAe3D,C,CAGvB,WAAA4D,GACE,IAAKR,KAAKS,MAAO,CACfT,KAAKS,MAAQhB,IACTnC,IAAoBoD,MAAMC,IACxBX,KAAKY,OAASD,CAAC,IAEjB1B,QAAQ4B,OAAO,IAAIC,MAAM,oD,CAE/B,OAAOd,KAAKS,K,CAGd,UAAIM,GACF,QAASf,KAAKY,M,CAIhB,UAAItG,GACF,OAAO0F,KAAKK,O,CAId,SAAItF,GACF,OAAOiF,KAAKM,M,CAGd,aAAAU,CAAcT,GACZP,KAAKO,KAAOnC,EAAYmC,IAAS3D,C,CAG3B,GAAAqE,GAGN,OAAO,IAAIhE,WAAW+C,KAAKY,OAAQM,OAAOC,O,CAU5C,UAAMC,CAAKpI,SACHgH,KAAKQ,cACX,MAAMG,EAAIX,KAAKY,OAEf,IAAItH,EACJ,IAAI+H,EACJ,GAAItI,EAAYC,GAAS,CACvBM,EAAQN,EAAOM,MACf+H,EAAKrI,EAAOQ,M,KACP,CACLF,EAAQN,EAAOsB,OACf+G,EAAM9H,GAAMP,EAAOO,E,CAGrB,MAAM+F,EAAY,CAAEE,EAAGb,KAOvB,IAAI2C,EAAkB,EACtB,IAAIC,EAAkB,EACtB,IAAIC,EAAiB,EACrB,IAAIC,EAAoB,EACxB,IAAK,IAAIlI,EAAI,EAAGA,EAAID,GAAS,CAC3B,MAAMoI,EAAa/C,IACnB,EAAG,CACD,MAAMtD,EAAMK,KAAKG,IAAIvC,EAAOC,EAAImF,GAChC,KAAOnF,EAAI8B,EAAK9B,IAAK,CACnB,MAAMoI,EAAIN,EAAG9H,GACb+H,GAAmB5B,EAAeiC,EAAEtJ,OACpCkJ,GAAmB7B,EAAeiC,EAAE1J,OAAS0J,EAAEtJ,OAC/C,GAAIsJ,EAAEnJ,KAAMgJ,GAAkB9B,EAAeiC,EAAEnJ,MAC/C,GAAImJ,EAAEhJ,eAAgB8I,GAAqB/B,EAAeiC,EAAEhJ,e,QAEvDY,EAAID,GAASqF,IAAU+C,EAAajD,GAC7C,GAAIlF,EAAID,QAAa+F,EAAcC,E,CAGrCqB,EAAEiB,QAAQtI,EAAOgI,EAAiBC,EAAiBC,EAAgBC,GAMnE,IAAK,IAAIlI,EAAI,EAAGA,EAAID,GAAS,CAC3B,MAAMoI,EAAa/C,IACnB,MAAMsC,EAAMjB,KAAKiB,MACjB,EAAG,CACD,MAAM5F,EAAMK,KAAKG,IAAIvC,EAAOC,EAAImF,GAChC,KAAOnF,EAAI8B,EAAK9B,IAAK,CACnB,MAAMoI,EAAIN,EAAG9H,GACb,MAAMsI,EAAKlB,EAAEmB,gBACb,MAAMC,EAAI/B,KAAKC,IAAI+B,WAAWL,EAAEtJ,MAAO4I,EAAIgB,SAASJ,IACpD,MAAMK,EAAKvB,EAAEwB,gBACb,MAAMC,EAAIpC,KAAKC,IAAI+B,WAAWL,EAAE1J,OAAS0J,EAAEtJ,MAAO4I,EAAIgB,SAASC,IAC/D,MAAMG,EAAK1B,EAAE2B,eACb,MAAMC,EACJf,EAAiB,EAAIxB,KAAKC,IAAI+B,WAAWL,EAAEnJ,MAAQ,GAAIyI,EAAIgB,SAASI,IAAO,KAC7E,MAAMG,EAAK7B,EAAE8B,kBACb,MAAMC,EACJjB,EAAoB,EAChBzB,KAAKC,IAAI+B,WAAWL,EAAEhJ,gBAAkB,GAAIsI,EAAIgB,SAASO,IACzD,KACN7B,EAAEgC,UACAZ,EAAEa,SAAW,EACbR,EAAEQ,SAAW,EACbL,GAAIK,SAAW,EACfF,GAAIE,SAAW,EACfjB,EAAErJ,SAAWkG,EAAgB,E,QAG1BjF,EAAID,GAASqF,IAAU+C,EAAajD,GAC7C,GAAIlF,EAAID,QAAa+F,EAAcC,E,CAGrCqB,EAAEkC,eAEF7C,KAAKM,OAASK,EAAEmC,aAChB9C,KAAKK,QAAUM,EAAEoC,e,CAIX,YAAAC,CAAaC,GACnB,MAAMtC,EAAIX,KAAKY,OACf,MAAMsC,EAAMvC,EAAEwC,gBACd,MAAMC,EAAMzC,EAAE0C,WACd,MAAMT,QAAEA,GAAY5C,KAAKC,IAAI+B,WAAWiB,EAAGjD,KAAKiB,MAAMgB,SAASmB,EAAKA,EAAMF,IAC1E,OAAON,GAAW,C,CAIpB,QAAAU,CAASC,GACP,IAAKvD,KAAKY,OAAQ,OAAO,EACzB,MAAM4C,EAAMxD,KAAKgD,aAAaO,GAC9BvD,KAAKK,QAAUL,KAAKY,OAAO0C,SAASE,EAAKxD,KAAKO,MAC9C,OAAOP,KAAKK,O,CAGN,SAAAoD,CAAUC,EAAkBzC,GAClC,MAAMN,EAAIX,KAAKY,OACf,MAAMiB,EAAKlB,EAAEgD,SAASD,GACtB,MAAME,EAAKjD,EAAEkD,SAASH,GACtB,MAAMxB,EAAKvB,EAAEmD,SAASJ,GACtB,MAAMK,EAAKpD,EAAEqD,SAASN,GAGtB,MAAMrB,EAAK1B,EAAEsD,QAAQP,GACrB,MAAMQ,EAAKvD,EAAEwD,QAAQT,GACrB,MAAMlB,EAAK7B,EAAEyD,WAAWV,GACxB,MAAMW,EAAK1D,EAAE2D,WAAWZ,GACxB,MAAO,CACLa,MAAOb,EACPrL,MAAO2H,KAAKG,IAAIqE,OAAOvD,EAAIgB,SAASJ,EAAIA,EAAK+B,IAC7C3L,MAAO+H,KAAKG,IAAIqE,OAAOvD,EAAIgB,SAASC,EAAIA,EAAK6B,IAC7CzL,UAAWqI,EAAE8D,SAASf,GAAYlF,KAAmB,EACrDhG,KAAM0L,EAAK,EAAIlE,KAAKG,IAAIqE,OAAOvD,EAAIgB,SAASI,EAAIA,EAAK6B,IAAO,GAC5DvL,eAAgB0L,EAAK,EAAIrE,KAAKG,IAAIqE,OAAOvD,EAAIgB,SAASO,EAAIA,EAAK6B,IAAO,G,CAK1E,SAAAK,CAAUtJ,EAAe9B,GACvB,IAAK0G,KAAKY,OAAQ,MAAO,GACzB,MAAMD,EAAIX,KAAKY,OACf,MAAMK,EAAMjB,KAAKiB,MACjB,MAAM5H,EAAoB,GAC1B,MAAMW,EAAO0B,KAAKI,IAAI,EAAGV,GACzB,MAAMuJ,EAAKjJ,KAAKG,IAAImE,KAAKK,QAASjF,EAAQ9B,GAC1C,IAAK,IAAIsL,EAAK5K,EAAM4K,EAAKD,EAAIC,IAAM,CACjC,MAAMC,EAAMlE,EAAEmE,MAAMF,GACpB,GAAIC,GAAO,EAAGxL,EAAI0L,KAAK/E,KAAKyD,UAAUoB,EAAK5D,G,CAE7C,OAAO5H,C,CAIT,MAAAG,CAAOwL,GACL,IAAKhF,KAAKY,OAAQ,OAAO,KACzB,MAAMiE,EAAM7E,KAAKY,OAAOkE,MAAME,GAC9B,GAAIH,EAAM,EAAG,OAAO,KACpB,OAAO7E,KAAKyD,UAAUoB,EAAK7E,KAAKiB,M,CAIlC,KAAA6D,CAAME,GACJ,OAAOhF,KAAKY,OAASZ,KAAKY,OAAOkE,MAAME,IAAiB,C,CAI1D,UAAAC,CAAWD,GACT,IAAKhF,KAAKY,OAAQ,OAAO,MACzB,MAAMiE,EAAM7E,KAAKY,OAAOkE,MAAME,GAC9B,GAAIH,EAAM,EAAG,OAAO,MACpB,OAAQ7E,KAAKY,OAAO6D,SAASI,GAAOrG,KAAmB,C,CAIzD,OAAA0G,CAAQF,GACN,IAAKhF,KAAKY,OAAQ,MAAO,GACzB,MAAMiE,EAAM7E,KAAKY,OAAOkE,MAAME,GAC9B,GAAIH,EAAM,EAAG,MAAO,GACpB,MAAM3C,EAAKlC,KAAKY,OAAOkD,SAASe,GAChC,MAAMd,EAAK/D,KAAKY,OAAOoD,SAASa,GAChC,OAAO7E,KAAKG,IAAIqE,OAAOxE,KAAKiB,MAAMgB,SAASC,EAAIA,EAAK6B,G,CAOtD,SAAAoB,CAAUC,GACR,MAAMC,EAAS,IAAIC,IACnB,IAAKtF,KAAKY,OAAQ,OAAOyE,EACzB,MAAM1E,EAAIX,KAAKY,OACf,IAAK,MAAMvI,KAAS+M,EAAQ,CAC1B,MAAM5B,EAAMxD,KAAKgD,aAAa3K,GAC9B,MAAMwM,EAAMlE,EAAE4E,aAAa/B,GAC3B,GAAIqB,GAAO,EAAG,CACZ,MAAM3C,EAAKvB,EAAEmD,SAASe,GACtB,MAAMd,EAAKpD,EAAEqD,SAASa,GACtBQ,EAAOG,IAAInN,EAAO2H,KAAKG,IAAIqE,OAAOxE,KAAKiB,MAAMgB,SAASC,EAAIA,EAAK6B,I,EAGnE,OAAOsB,C,CAIT,GAAAI,CAAIpN,GACF,IAAK2H,KAAKY,OAAQ,OAAO,MACzB,OAAOZ,KAAKY,OAAO2E,aAAavF,KAAKgD,aAAa3K,KAAW,C,CAQ/D,eAAAqN,CAAgBnC,EAAeoC,GAC7B,IAAK3F,KAAKY,OAAQ,OAAO,EACzB,MAAM4C,EAAMxD,KAAKgD,aAAaO,GAC9B,OAAOvD,KAAKY,OAAO8E,gBAAgBlC,EAAKmC,E,CAI1C,KAAAC,GACE5F,KAAKY,QAAQgF,QACb5F,KAAKK,QAAU,EACfL,KAAKM,OAAS,C,EChYlB,MAAMuF,EAA2B,IAajC,MAAMC,EAAW,EACjB,MAAMC,EAAqB,GAC3B,MAAMC,EAA0B,IAKhC,MAAMC,EAAiB,E,MASVC,EA0CX,WAAAnG,CAAoBlG,GAAAmG,KAAAnG,OAzCXmG,KAAAmG,MAAQ,IAAIrG,EAGrBE,KAAAoG,OAAS,MAETpG,KAAAqG,YAAc,EAEdrG,KAAAsG,WAA2B,GAE3BtG,KAAA1E,OAAS,EACT0E,KAAAzE,UAAY,EAEZyE,KAAAuG,eAAiB,EAEjBvG,KAAAlF,UAAYiL,EAIJ/F,KAAAwG,UAAY,EAQZxG,KAAAyG,iBAAmBC,SAEnB1G,KAAA2G,qBAAuB,EACvB3G,KAAA4G,UAAY,EAEZ5G,KAAA6G,cAAgB,EAMhB7G,KAAA8G,mBAAoB,EAEpB9G,KAAAvD,cAAgB,EAsFhBuD,KAAA+G,SAAW,KACjB,GAAI/G,KAAKwG,UAAW,OACpBxG,KAAKwG,UAAYjH,uBAAsB,KACrCS,KAAKwG,UAAY,EACjB,MAAM3E,EAAK7B,KAAKgH,WAChB,IAAKnF,EAAI,OAMT,GAAI7B,KAAK8G,mBAAqB,GAAKpL,KAAKmJ,IAAIhD,EAAGjH,UAAYoF,KAAKvD,gBAAkB,EAAG,CACnF,M,CAEFuD,KAAK8G,mBAAoB,EACzB9G,KAAKiH,UAAUpF,EAAGjH,UAAU,GAC5B,EA0EKoF,KAAAkH,SAAgC,CACvC5N,MAAO,IAAM0G,KAAKuG,eAClBrB,QAAU3L,GAAMyG,KAAKmG,MAAMjB,QAAQ3L,GACnC4N,aAAe5N,GAAMyG,KAAKmG,MAAMlB,WAAW1L,GAC3C6N,cAAgB7N,GAAMyG,KAAKoH,cAAc7N,GACzC8N,gBAAkB9N,GAAMyG,KAAKnG,KAAKyN,UAAU/N,GAC5CgO,WAAY,CAACpG,EAAQnH,IAASgG,KAAKmG,MAAMT,gBAAgBvE,EAAQnH,G,CAjL3D,kBAAAwN,GACN,OAAO9L,KAAKG,IAAInB,EAA2BsF,KAAKyG,iB,CAGlD,iBAAAgB,CAAkBC,GAChB1H,KAAK2H,eAAiBD,GAAMA,EAAK,EAAIA,EAAKjP,UAC1C,GAAIuH,KAAK2H,eAAgB3H,KAAKlF,UAAYkF,KAAK2H,c,CAGjD,aAAA3G,CAAcT,GACZP,KAAKmG,MAAMnF,cAAcT,E,CAI3B,UAAMa,CAAKpI,GACT,MAAMM,EAAQP,EAAYC,GAAUA,EAAOM,MAAQN,EAAOsB,OAC1D,IAAKmF,KAAqBnG,IAAU,EAAG,OAAO,MAC9C,UACQ0G,KAAKmG,MAAM3F,a,CACjB,MACA,OAAO,K,OAEHR,KAAKmG,MAAM/E,KAAKpI,GACtBgH,KAAKoG,OAAS,KACdpG,KAAKuG,eAAiBvG,KAAKmG,MAAM7L,OACjC0F,KAAKiH,UAAUjH,KAAKgH,YAAYpM,WAAa,GAC7C,OAAO,I,CAIT,QAAA0I,CAASC,GACP,IAAKvD,KAAKoG,OAAQ,OAClBpG,KAAKuG,eAAiBvG,KAAKmG,MAAM7C,SAASC,GAC1CvD,KAAK8G,mBAAoB,EACzB,GAAI9G,KAAKgH,WAAYhH,KAAKgH,WAAWpM,UAAY,EACjDoF,KAAKiH,UAAU,E,CAGjB,SAAA9B,CAAUC,GACR,OAAOpF,KAAKmG,MAAMhB,UAAUC,E,CAG9B,KAAAQ,GACE5F,KAAKmG,MAAMP,QACX5F,KAAKoG,OAAS,MACdpG,KAAKsG,WAAa,GAClBtG,KAAKuG,eAAiB,EACtBvG,KAAKqG,YAAc,EACnBrG,KAAK1E,OAAS,EACd0E,KAAKzE,UAAY,EACjByE,KAAK8G,mBAAoB,C,CAK3B,oBAAMc,CAAeC,GACnB7H,KAAK8H,iBACL,MAAMjG,QAAWgG,IACjB7H,KAAKgH,WAAanF,GAAMpJ,UACxB,GAAIuH,KAAKgH,WAAY,CACnBhH,KAAKgH,WAAWe,iBAAiB,SAAU/H,KAAK+G,SAAU,CAAEiB,QAAS,OACrEhI,KAAKiI,mBACLjI,KAAKiH,UAAUjH,KAAKgH,WAAWpM,WAC/BoF,KAAK6G,cAAgB,GACrB7G,KAAKkI,iB,EAIT,cAAAJ,GACE,GAAI9H,KAAKwG,UAAW,CAClB2B,qBAAqBnI,KAAKwG,WAC1BxG,KAAKwG,UAAY,C,CAEnB,GAAIxG,KAAK4G,UAAW,CAClBuB,qBAAqBnI,KAAK4G,WAC1B5G,KAAK4G,UAAY,C,CAEnB5G,KAAKgH,YAAYoB,oBAAoB,SAAUpI,KAAK+G,UACpD/G,KAAKgH,WAAavO,S,CAsBZ,gBAAAwP,GACN,GAAIjI,KAAK2H,eAAgB,CACvB3H,KAAKlF,UAAYkF,KAAK2H,eACtB,M,CAEF,MAAMU,EAAQrI,KAAKnG,KAAKyN,UAAUtH,KAAKqG,aACvC,MAAMiC,EAAID,GAAOE,cAAgB,EACjC,GAAID,EAAI,GAAKA,IAAMtI,KAAKlF,UAAW,CACjCkF,KAAKlF,UAAYwN,EACjB,GAAItI,KAAKgH,WAAYhH,KAAKiH,UAAUjH,KAAKgH,WAAWpM,U,EAIhD,SAAAqM,CAAUrM,GAChB,MAAM4N,EAAMxI,KAAKgH,YAAYyB,cAAgBzC,EAC7C,MAAM0C,EAAO/N,EACXC,EACA4N,EACAxI,KAAKlF,UACLkF,KAAKuG,eACLT,EACA9F,KAAKwH,qBACLxH,KAAK8G,mBAEP9G,KAAKqG,YAAcqC,EAAKtN,MACxB4E,KAAK1E,OAASoN,EAAKpN,OACnB0E,KAAKzE,UAAYmN,EAAKnN,UACtByE,KAAK2G,qBAAuB+B,EAAKlN,aACjCwE,KAAKvD,cAAgBiM,EAAK9N,UAC1BoF,KAAKsG,WAAatG,KAAKmG,MAAMzB,UAAUgE,EAAKtN,MAAOsN,EAAKrN,IAAMqN,EAAKtN,OACnE4E,KAAKnG,KAAK8O,e,CAUJ,eAAAT,GACN,GAAIlI,KAAK4G,UAAWuB,qBAAqBnI,KAAK4G,WAC9C5G,KAAK4G,UAAYrH,uBAAsB,KACrCS,KAAK4G,UAAYrH,uBAAsB,KACrCS,KAAK4G,UAAY,EACjB,MAAM/E,EAAK7B,KAAKgH,WAChB,IAAKnF,EAAI,OACT,MAAM+G,EAAW/G,EAAGrG,aACpB,GACEoN,EAAW,GACXA,EAAW,EAAI5I,KAAK2G,sBACpBiC,EAAW5I,KAAKyG,iBAChB,CAMA,GAAImC,EAAW/C,EAA0B,CACvC,GAAI7F,KAAK6G,iBAAkB,EAAG7G,KAAKkI,kBACnC,M,CAEFlI,KAAKyG,iBAAmBmC,EACxB5I,KAAKiH,UAAUpF,EAAGjH,U,IAEpB,G,CAeE,mBAAMwM,CAAcpC,GAC1B,MAAMnD,EAAK7B,KAAKgH,WAChB,IAAKnF,EAAI,OACT,MAAMgH,EAAUhH,EAAG4G,cAAgBzC,EACnC,MAAM7K,EAAa6E,KAAKuG,eAAiBvG,KAAKlF,UAE9C,GAAIK,GAAc6E,KAAKwH,qBAAsB,CAE3CxH,KAAK8G,mBAAoB,EACzB,MAAMgC,EAAM9D,EAAgBhF,KAAKlF,UACjC,MAAMiO,EAASD,EAAM9I,KAAKlF,UAI1B,MAAMkO,EAAYtN,KAAKI,IAAI,EAAG+F,EAAGrG,aAAeqN,GAChD,GAAIC,EAAM7C,EAAiBpE,EAAGjH,UAAW,CACvCiH,EAAGjH,UAAYc,KAAKI,IAAI,EAAGgN,EAAM7C,E,MAC5B,GAAI8C,EAAS9C,EAAiBpE,EAAGjH,UAAYiO,EAAS,CAC3DhH,EAAGjH,UAAYc,KAAKG,IAAImN,EAAWD,EAAS9C,EAAiB4C,E,CAE/D7I,KAAKiH,UAAUpF,EAAGjH,U,KACb,CAKL,MAAMqO,EAAcvN,KAAKI,IAAI,EAAGJ,KAAKM,MAAM6M,EAAU7I,KAAKlF,YAC1D,MAAMW,EAAeC,KAAKC,KAAKkN,EAAU7I,KAAKlF,WAC9C,MAAMoB,EAAcR,KAAKI,IAAI,EAAGkE,KAAKuG,eAAiB9K,GAItD,MAAMM,EACJiE,KAAK8G,mBAAqB,EACtB9G,KAAK8G,kBACL9G,KAAKqG,YACL3K,KAAKI,IAAI,EAAGJ,KAAKc,OAAOqF,EAAGjH,UAAYoF,KAAK1E,QAAU0E,KAAKlF,YACjE,MAAMoO,EAAcnN,EAAekN,EAAc,EAQjD,MAAME,EAAUzN,KAAKC,KAAKsK,EAAiBjG,KAAKlF,WAChD,GACEkK,EAAgBjJ,EAAeoN,GAC/BnE,EAAgBkE,EAAcC,EAC9B,CAIAnJ,KAAK8G,kBAAoBpL,KAAKG,IAC5BK,EACAR,KAAKI,IACH,EACAkJ,EAAgBjJ,EAAeoN,EAC3BnE,EAAgBmE,EAChBnE,EAAgBiE,EAAc,EAAIE,G,CAI5CnJ,KAAKiH,UAAUpF,EAAGjH,WAOlB,GAAIoF,KAAK8G,mBAAqB,EAAG,CAC/B,MAAMkC,EAAYtN,KAAKI,IAAI,EAAG+F,EAAGrG,aAAeqN,GAChD,MAAMO,EAAS1N,KAAKG,IAAIH,KAAKc,MAAMwD,KAAKvD,eAAgBuM,GACxD,GAAII,IAAW1N,KAAKc,MAAMqF,EAAGjH,WAAY,CACvCiH,EAAGjH,UAAYwO,C,CAEjBpJ,KAAKvD,cAAgBoF,EAAGjH,S,EAK5B,IAAK,IAAIyO,EAAQ,EAAGA,EAAQ,EAAGA,IAAS,OAChC,IAAIpK,SAAeC,GAAYK,uBAAsB,IAAML,QACjE,GAAIc,KAAKnG,KAAKyN,UAAUtC,GAAgB,M","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["mdButtonCss","MdButton","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","type","variant","size","shape","disabled","softDisabled","ripple","loading","icon","trailingIcon","href","target","toggle","selected","shapeMorph","mirrorIcon","suppressExpandIconFlip","fullWidth","connectedLeft","connectedRight","value","groupTabindex","roleOverride","density","hasSlottedLeadingIcon","hasSlottedTrailingIcon","pressed","handleClick","e","isDisabled","preventDefault","nextSelected","evt","mdClick","emit","originalEvent","defaultPrevented","mdChange","sanitizeHref","window","open","SAFE_WINDOW_FEATURES","internals","form","requestSubmit","reset","handleKeyDown","key","triggerRipple","el","click","setTimeout","handlePointerDown","handlePointerUp","componentDidLoad","shadow","shadowRoot","leadingSlot","querySelector","trailingSlot","addEventListener","assignedElements","length","render","isEffectivelyDisabled","hasLeadingIcon","hasTrailingIcon","h","Host","class","role","String","undefined","tabindex","onClick","onKeyDown","onPointerDown","onPointerUp","onPointerLeave","onPointerCancel","part","name"],"sources":["src/components/md-button/md-button.css?tag=md-button&encapsulation=shadow","src/components/md-button/md-button.tsx"],"sourcesContent":["/* ==========================================================\n md-button — Material Design 3 Common Button\n Spec: https://m3.material.io/components/buttons/specs\n API: https://developer.android.com/reference/kotlin/\n androidx/compose/material3/ButtonDefaults\n Supports M3 + M3 Expressive (size, shape)\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-button-container-color Container background\n --md-button-label-color Label + icon text color\n --md-button-icon-color Icon-only color override\n --md-button-icon-size Icon dimensions\n --md-button-container-shape Border-radius override\n --md-button-outline-color Outlined border color\n --md-button-outline-width Outlined border width\n --md-button-width Fixed inline-size (default: auto)\n --md-button-min-width Minimum inline-size (default: per-size touch target)\n --md-button-max-width Maximum inline-size (default: none)\n --md-button-height Fixed block-size (default: auto)\n --md-button-min-height Minimum block-size (default: per-size touch target)\n\n CSS PARTS:\n state-layer State-layer overlay\n icon Leading icon (fallback)\n trailing-icon Trailing icon (fallback)\n label Label text wrapper\n loading Loading spinner\n\n SLOTS:\n leading-icon Custom leading icon (replaces icon prop)\n trailing-icon Custom trailing icon (replaces trailingIcon prop)\n\n RTL:\n Layout uses CSS logical properties throughout, so leading/\n trailing icons swap visual sides automatically in `dir=\"rtl\"`.\n Set the `mirror-icon` attribute on buttons that use directional\n glyphs (arrows, chevrons) so the icon path itself flips.\n ========================================================== */\n\n:host {\n --_container-color: var(--md-button-container-color, transparent);\n --_label-color: var(--md-button-label-color, var(--md-sys-color-primary));\n --_state-layer-color: var(--md-sys-color-primary);\n --_container-elevation: var(--md-sys-elevation-0, none);\n --_icon-size: var(--md-button-icon-size, 18px);\n\n /* Sizing — defaults come from each size class via --_size-* tokens.\n Public --md-button-{width,min-width,max-width,height,min-height}\n custom properties override per-instance for variable / full-width\n buttons without sacrificing the spec touch-target on resize. */\n --_width: var(--md-button-width, auto);\n /* Min-width tightens with density too (floored at 40px) so short-label\n buttons narrow, not just content-wide ones. Unchanged at density 0. */\n --_min-width: var(\n --md-button-min-width,\n max(40px, calc(var(--_size-min-width, 48px) + var(--md-sys-density-scale, 0) * 4px))\n );\n --_max-width: var(--md-button-max-width, none);\n --_height: var(--md-button-height, auto);\n /* Global density: on top of the size scale, each `data-density` rung (0…-4)\n trims 4px off the touch target, floored at 24px so small buttons stay\n usable. density-scale is 0 by default so the per-size height is unchanged. */\n --_min-height: var(\n --md-button-min-height,\n max(24px, calc(var(--_size-min-height, 32px) + var(--md-sys-density-scale, 0) * 4px))\n );\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n overflow: hidden;\n cursor: pointer;\n user-select: none;\n text-decoration: none;\n border: none;\n /* Transparent resting outline; focus-visible swaps outline-color in instantly.\n Deliberately NOT transitioned — on hydration the host's pre-upgrade UA outline\n (style:none, color:currentColor) animates to solid/transparent, which renders a\n dark ring that fades out on every button. Most visible when many mount at once\n (e.g. the 42 day cells in md-date-picker). Instant focus ring matches M3. */\n outline: 3px solid transparent;\n outline-offset: 2px;\n box-sizing: border-box;\n inline-size: var(--_width);\n block-size: var(--_height);\n min-inline-size: var(--_min-width);\n min-block-size: var(--_min-height);\n max-inline-size: var(--_max-width);\n background-color: var(--_container-color);\n color: var(--_label-color);\n box-shadow: var(--_container-elevation);\n --_shape-round: 20px;\n transition:\n box-shadow var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),\n background-color var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),\n border-color var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),\n border-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),\n color var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n -webkit-tap-highlight-color: transparent;\n vertical-align: middle;\n}\n\n/* ==========================================================\n 1. SIZE\n XS (32px) · SM (40px, default) · MD (48px) · LG (56px) · XL (96px)\n ========================================================== */\n/* Icon<->label gap tapers with density like the rest of the button: the\n container height and icon already shrink per rung, so a frozen gap made\n compact buttons read as loosely spaced. Each tier halves across the range\n (rate = base/8 per rung), floored at half its base. */\n:host(.md-button--xs) {\n --_icon-size: var(--md-button-icon-size, max(10px, calc(20px + var(--md-sys-density-scale, 0) * 2.5px)));\n --_shape-round: 16px;\n --_size-min-height: 32px;\n --_size-min-width: 48px;\n /* 25% across the density range, floored at half. At 50% the inset shrank\n faster than the button did — a -4 sm button was still 24px tall but had\n only 8px of side padding, which read crammed. */\n padding: 0 max(6px, calc(12px + var(--md-sys-density-scale, 0) * 0.75px));\n gap: max(2px, calc(4px + var(--md-sys-density-scale, 0) * 0.5px));\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 letter-spacing: var(--md-sys-typescale-label-medium-letter-spacing, 0.5px);\n line-height: max(14px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));\n}\n\n:host(.md-button--sm) {\n --_icon-size: var(--md-button-icon-size, max(10px, calc(20px + var(--md-sys-density-scale, 0) * 2.5px)));\n --_shape-round: 20px;\n --_size-min-height: 40px;\n --_size-min-width: 58px;\n /* 25% across the density range, floored at half. At 50% the inset shrank\n faster than the button did — a -4 sm button was still 24px tall but had\n only 8px of side padding, which read crammed. */\n padding: 0 max(8px, calc(16px + var(--md-sys-density-scale, 0) * 1px));\n gap: max(4px, calc(8px + var(--md-sys-density-scale, 0) * 1px));\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 letter-spacing: var(--md-sys-typescale-label-large-letter-spacing, 0.1px);\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n}\n\n:host(.md-button--md) {\n --_icon-size: var(--md-button-icon-size, max(12px, calc(24px + var(--md-sys-density-scale, 0) * 3px)));\n --_shape-round: 28px;\n --_size-min-height: 56px;\n --_size-min-width: 72px;\n /* 25% across the density range, floored at half. At 50% the inset shrank\n faster than the button did — a -4 sm button was still 24px tall but had\n only 8px of side padding, which read crammed. */\n padding: 0 max(12px, calc(24px + var(--md-sys-density-scale, 0) * 1.5px));\n gap: max(4px, calc(8px + var(--md-sys-density-scale, 0) * 1px));\n font-family: var(--md-sys-typescale-title-small-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-title-small-font-weight, 500);\n letter-spacing: var(--md-sys-typescale-title-small-letter-spacing, 0.1px);\n line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));\n}\n\n:host(.md-button--lg) {\n --_icon-size: var(--md-button-icon-size, max(16px, calc(32px + var(--md-sys-density-scale, 0) * 4px)));\n --_shape-round: 48px;\n --_size-min-height: 96px;\n --_size-min-width: 88px;\n /* 25% across the density range, floored at half. At 50% the inset shrank\n faster than the button did — a -4 sm button was still 24px tall but had\n only 8px of side padding, which read crammed. */\n padding: 0 max(24px, calc(48px + var(--md-sys-density-scale, 0) * 3px));\n gap: max(6px, calc(12px + var(--md-sys-density-scale, 0) * 1.5px));\n font-family: var(--md-sys-typescale-title-medium-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-title-medium-font-weight, 500);\n letter-spacing: var(--md-sys-typescale-title-medium-letter-spacing, 0.15px);\n line-height: max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px));\n}\n\n:host(.md-button--xl) {\n --_icon-size: var(--md-button-icon-size, max(20px, calc(40px + var(--md-sys-density-scale, 0) * 5px)));\n --_shape-round: 68px;\n --_size-min-height: 136px;\n --_size-min-width: 120px;\n /* 25% across the density range, floored at half. At 50% the inset shrank\n faster than the button did — a -4 sm button was still 24px tall but had\n only 8px of side padding, which read crammed. */\n padding: 0 max(32px, calc(64px + var(--md-sys-density-scale, 0) * 4px));\n gap: max(8px, calc(16px + var(--md-sys-density-scale, 0) * 2px));\n font-family: var(--md-sys-typescale-headline-small-font-family, Roboto, sans-serif);\n font-size: max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px));\n font-weight: var(--md-sys-typescale-headline-small-font-weight, 400);\n letter-spacing: var(--md-sys-typescale-headline-small-letter-spacing, 0px);\n line-height: max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px));\n}\n\n/* ==========================================================\n 1b. FULL WIDTH — block-level, fills inline axis\n `full-width` switches the host from inline-flex to flex and stretches\n inline-size to 100% of the containing block. The size's\n --_size-min-height (touch target) is still in force, so the button\n keeps its spec block-size unless --md-button-height overrides it.\n --md-button-width still wins if explicitly set.\n ========================================================== */\n:host(.md-button--full-width) {\n display: flex;\n --_width: var(--md-button-width, 100%);\n}\n\n/* ==========================================================\n 2. SHAPE\n Round (default) · Square (scaled corner radius)\n Round uses --_shape-round (height/2 per size) instead of\n corner-full (9999px) so the browser can smoothly interpolate\n border-radius transitions between resting and morphed states.\n --md-button-container-shape overrides both.\n ========================================================== */\n/* The RESTING radius is named (--_shape-rest) so the morph states below can be\n expressed as a blend back toward it. --_morph-to carries the morphed target\n and defaults to the resting value, so a button with no active morph state\n resolves to exactly its resting radius:\n\n calc(REST + FLAG * (MORPH - REST)) FLAG 1 -> MORPH, FLAG 0 -> REST\n\n That is what makes `data-shape-morph=\"off\"` / `shape-morph=\"off\"` freeze the\n shape (§13 in tokens.css) without a re-render and without :host-context,\n which Firefox does not implement. */\n:host(.md-button--round) {\n --_shape-rest: var(--md-button-container-shape, var(--_shape-round));\n border-radius: calc(var(--_shape-rest) + var(--md-sys-shape-morph-enabled, 1) * (var(--_morph-to, var(--_shape-rest)) - var(--_shape-rest)));\n}\n\n:host(.md-button--square.md-button--xs) { --_shape-rest: var(--md-button-container-shape, var(--md-sys-shape-corner-small, 8px)); border-radius: calc(var(--_shape-rest) + var(--md-sys-shape-morph-enabled, 1) * (var(--_morph-to, var(--_shape-rest)) - var(--_shape-rest))); }\n:host(.md-button--square.md-button--sm) { --_shape-rest: var(--md-button-container-shape, var(--md-sys-shape-corner-medium, 12px)); border-radius: calc(var(--_shape-rest) + var(--md-sys-shape-morph-enabled, 1) * (var(--_morph-to, var(--_shape-rest)) - var(--_shape-rest))); }\n:host(.md-button--square.md-button--md) { --_shape-rest: var(--md-button-container-shape, var(--md-sys-shape-corner-medium, 12px)); border-radius: calc(var(--_shape-rest) + var(--md-sys-shape-morph-enabled, 1) * (var(--_morph-to, var(--_shape-rest)) - var(--_shape-rest))); }\n:host(.md-button--square.md-button--lg) { --_shape-rest: var(--md-button-container-shape, var(--md-sys-shape-corner-large, 16px)); border-radius: calc(var(--_shape-rest) + var(--md-sys-shape-morph-enabled, 1) * (var(--_morph-to, var(--_shape-rest)) - var(--_shape-rest))); }\n:host(.md-button--square.md-button--xl) { --_shape-rest: var(--md-button-container-shape, var(--md-sys-shape-corner-extra-large, 28px)); border-radius: calc(var(--_shape-rest) + var(--md-sys-shape-morph-enabled, 1) * (var(--_morph-to, var(--_shape-rest)) - var(--_shape-rest))); }\n\n/* ==========================================================\n 2b. SHAPE MORPHING — M3 Expressive\n Uses direct border-radius overrides for reliable transitions.\n\n Order: selected rules FIRST, pressed rules LAST so pressed\n always wins while the pointer is down.\n\n Asymmetric timing (M3 motion tokens):\n Release / selected : medium4 (400ms) + emphasized-decelerate\n Press-in : short4 (200ms) + standard\n ========================================================== */\n\n/* ── Selected shape — round resting → square tokens when selected ── */\n:host(.md-button--shape-morph.md-button--round.md-button--selected.md-button--xs) { --_morph-to: var(--md-sys-shape-corner-small, 8px); }\n:host(.md-button--shape-morph.md-button--round.md-button--selected.md-button--sm) { --_morph-to: var(--md-sys-shape-corner-medium, 12px); }\n:host(.md-button--shape-morph.md-button--round.md-button--selected.md-button--md) { --_morph-to: var(--md-sys-shape-corner-medium, 12px); }\n:host(.md-button--shape-morph.md-button--round.md-button--selected.md-button--lg) { --_morph-to: var(--md-sys-shape-corner-large, 16px); }\n:host(.md-button--shape-morph.md-button--round.md-button--selected.md-button--xl) { --_morph-to: var(--md-sys-shape-corner-extra-large, 28px); }\n\n/* ── Selected shape — square resting → round when selected ── */\n:host(.md-button--shape-morph.md-button--square.md-button--selected) {\n --_morph-to: var(--md-button-container-shape, var(--_shape-round));\n}\n\n/* ── Pressed shape — both round & square morph to more square, overrides selected ── */\n:host(.md-button--pressed.md-button--xs) {\n --_morph-to: var(--md-sys-shape-corner-extra-small, 4px);\n transition-duration: var(--md-sys-motion-duration-short4, 200ms);\n transition-timing-function: var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n:host(.md-button--pressed.md-button--sm) {\n --_morph-to: var(--md-sys-shape-corner-small, 8px);\n transition-duration: var(--md-sys-motion-duration-short4, 200ms);\n transition-timing-function: var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n:host(.md-button--pressed.md-button--md) {\n --_morph-to: var(--md-sys-shape-corner-small, 8px);\n transition-duration: var(--md-sys-motion-duration-short4, 200ms);\n transition-timing-function: var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n:host(.md-button--pressed.md-button--lg) {\n --_morph-to: var(--md-sys-shape-corner-medium, 12px);\n transition-duration: var(--md-sys-motion-duration-short4, 200ms);\n transition-timing-function: var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n:host(.md-button--pressed.md-button--xl) {\n --_morph-to: var(--md-sys-shape-corner-large, 16px);\n transition-duration: var(--md-sys-motion-duration-short4, 200ms);\n transition-timing-function: var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n\n/* ==========================================================\n 2c. CONNECTED GROUP — per-corner border-radius\n Set by md-button-group when variant=\"connected\".\n shapeMorph is disabled for connected children so these rules\n only need to beat the base shape rules (section 2, specificity 0-1-0).\n ========================================================== */\n\n:host(.md-button--connected-left.md-button--xs),\n:host(.md-button--connected-right.md-button--xs) { --_c-inner: 4px; }\n:host(.md-button--connected-left.md-button--sm),\n:host(.md-button--connected-right.md-button--sm) { --_c-inner: 8px; }\n:host(.md-button--connected-left.md-button--md),\n:host(.md-button--connected-right.md-button--md) { --_c-inner: 8px; }\n:host(.md-button--connected-left.md-button--lg),\n:host(.md-button--connected-right.md-button--lg) { --_c-inner: 16px; }\n:host(.md-button--connected-left.md-button--xl),\n:host(.md-button--connected-right.md-button--xl) { --_c-inner: 20px; }\n\n/* Middle button — all corners inner */\n:host(.md-button--connected-left.md-button--connected-right) {\n border-radius: var(--_c-inner);\n}\n\n/* `connected-left` / `connected-right` reflect DOM-order siblings (set by\n md-button-group when a previous / next sibling exists), so the radii\n here must use logical corner properties to flip correctly under\n `dir=\"rtl\"`. The outer pill always lives on the free inline-start\n (first child) or inline-end (last child) edge. */\n\n/* First button (round) — pill on inline-start edge, inner on inline-end edge */\n:host(.md-button--round.md-button--connected-right:not(.md-button--connected-left)) {\n border-start-start-radius: var(--_shape-round);\n border-end-start-radius: var(--_shape-round);\n border-start-end-radius: var(--_c-inner);\n border-end-end-radius: var(--_c-inner);\n}\n\n/* Last button (round) — inner on inline-start edge, pill on inline-end edge */\n:host(.md-button--round.md-button--connected-left:not(.md-button--connected-right)) {\n border-start-start-radius: var(--_c-inner);\n border-end-start-radius: var(--_c-inner);\n border-start-end-radius: var(--_shape-round);\n border-end-end-radius: var(--_shape-round);\n}\n\n/* Square first / last — outer equals inner */\n:host(.md-button--square.md-button--connected-right:not(.md-button--connected-left)),\n:host(.md-button--square.md-button--connected-left:not(.md-button--connected-right)) {\n border-radius: var(--_c-inner);\n}\n\n/* ==========================================================\n 3. ICON PADDING\n An icon does NOT change the button's insets. The M3 Expressive size sheet\n specifies the SAME padding on both sides whether or not a leading icon is\n present (12/12, 16/16, 24/24, 48/48, 64/64) — the third number on those\n drawings is the icon-to-label gap, not a reduced leading inset. The size's\n base padding therefore applies symmetrically and there is nothing to override.\n ========================================================== */\n\n/* ==========================================================\n 4. COLOR VARIANTS\n --md-button-container-color and --md-button-label-color\n override the variant defaults when set.\n ========================================================== */\n\n/* Filled */\n:host(.md-button--filled) {\n --_container-color: var(--md-button-container-color, var(--md-sys-color-primary));\n --_label-color: var(--md-button-label-color, var(--md-sys-color-on-primary));\n --_state-layer-color: var(--md-sys-color-on-primary);\n}\n:host(.md-button--filled:hover) { --_container-elevation: var(--md-sys-elevation-1); }\n:host(.md-button--filled:active) { --_container-elevation: var(--md-sys-elevation-0, none); }\n:host(.md-button--filled:focus-visible) { --_container-elevation: var(--md-sys-elevation-0, none); }\n\n/* Outlined */\n:host(.md-button--outlined) {\n --_container-color: var(--md-button-container-color, transparent);\n --_label-color: var(--md-button-label-color, var(--md-sys-color-primary));\n --_state-layer-color: var(--md-sys-color-primary);\n border: var(--md-button-outline-width, 1px) solid var(--md-button-outline-color, var(--md-sys-color-outline));\n}\n:host(.md-button--outlined.md-button--xs) { padding: 0 max(3px, calc(11px + var(--md-sys-density-scale, 0) * 2px)); }\n:host(.md-button--outlined.md-button--sm) { padding: 0 max(7px, calc(23px + var(--md-sys-density-scale, 0) * 4px)); }\n:host(.md-button--outlined.md-button--md) { padding: 0 max(9px, calc(27px + var(--md-sys-density-scale, 0) * 4px)); }\n:host(.md-button--outlined.md-button--lg) { padding: 0 max(10px, calc(31px + var(--md-sys-density-scale, 0) * 4px)); }\n:host(.md-button--outlined.md-button--xl) { padding: 0 max(15px, calc(47px + var(--md-sys-density-scale, 0) * 2px)); }\n:host(.md-button--outlined:hover:not(.md-button--disabled)) {\n border-color: var(--md-button-outline-color, var(--md-sys-color-primary));\n}\n:host(.md-button--outlined:focus-visible) {\n border-color: var(--md-button-outline-color, var(--md-sys-color-primary));\n}\n\n/* Text */\n:host(.md-button--text) {\n --_container-color: var(--md-button-container-color, transparent);\n --_label-color: var(--md-button-label-color, var(--md-sys-color-primary));\n --_state-layer-color: var(--md-sys-color-primary);\n}\n:host(.md-button--text.md-button--xs) { padding: 0 max(3px, calc(8px + var(--md-sys-density-scale, 0) * 2px)); }\n:host(.md-button--text.md-button--sm) { padding: 0 max(4px, calc(12px + var(--md-sys-density-scale, 0) * 4px)); }\n:host(.md-button--text.md-button--md) { padding: 0 max(5px, calc(16px + var(--md-sys-density-scale, 0) * 4px)); }\n:host(.md-button--text.md-button--lg) { padding: 0 max(6px, calc(20px + var(--md-sys-density-scale, 0) * 4px)); }\n:host(.md-button--text.md-button--xl) { padding: 0 max(10px, calc(32px + var(--md-sys-density-scale, 0) * 2px)); }\n\n/* Elevated */\n:host(.md-button--elevated) {\n --_container-color: var(--md-button-container-color, var(--md-sys-color-surface-container-low));\n --_label-color: var(--md-button-label-color, var(--md-sys-color-primary));\n --_state-layer-color: var(--md-sys-color-primary);\n --_container-elevation: var(--md-sys-elevation-1);\n}\n:host(.md-button--elevated:hover) { --_container-elevation: var(--md-sys-elevation-2); }\n:host(.md-button--elevated:focus-visible) { --_container-elevation: var(--md-sys-elevation-1); }\n:host(.md-button--elevated:active) { --_container-elevation: var(--md-sys-elevation-1); }\n\n/* Tonal */\n:host(.md-button--tonal) {\n --_container-color: var(--md-button-container-color, var(--md-sys-color-secondary-container));\n --_label-color: var(--md-button-label-color, var(--md-sys-color-on-secondary-container));\n --_state-layer-color: var(--md-sys-color-on-secondary-container);\n}\n:host(.md-button--tonal:hover) { --_container-elevation: var(--md-sys-elevation-1); }\n:host(.md-button--tonal:focus-visible) { --_container-elevation: var(--md-sys-elevation-0, none); }\n:host(.md-button--tonal:active) { --_container-elevation: var(--md-sys-elevation-0, none); }\n\n/* ==========================================================\n 4b. TOGGLE SELECTED / UNSELECTED — MD3 spec\n When toggle=true, the unselected state is muted; selected\n shows the full variant color. Mirrors md-icon-button pattern.\n ========================================================== */\n\n/* The toggle-state rules below all carry `:not(.md-button--disabled)` so\n they drop out when the host becomes disabled. Without it, their higher\n specificity (4 classes vs the disabled rules' 2–3) would override the\n muted disabled palette and the button would still look enabled. */\n\n/* ── Filled toggle ── */\n:host(.md-button--filled.md-button--toggle:not(.md-button--selected):not(.md-button--disabled)) {\n --_container-color: var(--md-button-container-color, var(--md-sys-color-surface-container-highest, #E6E0E9));\n --_label-color: var(--md-button-label-color, var(--md-sys-color-primary));\n --_state-layer-color: var(--md-sys-color-primary);\n}\n\n/* ── Tonal toggle ── */\n:host(.md-button--tonal.md-button--toggle:not(.md-button--selected):not(.md-button--disabled)) {\n --_container-color: var(--md-button-container-color, var(--md-sys-color-surface-container-highest, #E6E0E9));\n --_label-color: var(--md-button-label-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_state-layer-color: var(--md-sys-color-on-surface-variant, #49454F);\n}\n\n/* ── Outlined toggle ── */\n:host(.md-button--outlined.md-button--toggle.md-button--selected:not(.md-button--disabled)) {\n --_container-color: var(--md-button-container-color, var(--md-sys-color-secondary-container, #E8DEF8));\n --_label-color: var(--md-button-label-color, var(--md-sys-color-on-secondary-container, #1E192B));\n --_state-layer-color: var(--md-sys-color-on-secondary-container, #1E192B);\n border-color: transparent;\n}\n\n/* ── Elevated toggle ── */\n:host(.md-button--elevated.md-button--toggle:not(.md-button--selected):not(.md-button--disabled)) {\n --_container-color: var(--md-button-container-color, var(--md-sys-color-surface-container-highest, #E6E0E9));\n --_label-color: var(--md-button-label-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_state-layer-color: var(--md-sys-color-on-surface-variant, #49454F);\n --_container-elevation: var(--md-sys-elevation-0, none);\n}\n\n/* ── Text toggle ── */\n:host(.md-button--text.md-button--toggle:not(.md-button--selected):not(.md-button--disabled)) {\n --_label-color: var(--md-button-label-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_state-layer-color: var(--md-sys-color-on-surface-variant, #49454F);\n}\n\n/* ==========================================================\n 5. STATE LAYER\n ========================================================== */\n.md-button__state-layer {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background-color: var(--_state-layer-color);\n opacity: 0;\n transition: opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n pointer-events: none;\n}\n:host(:hover) .md-button__state-layer {\n opacity: var(--md-sys-state-hover-state-layer-opacity, 0.08);\n}\n:host(:active:not(.md-button--disabled)) .md-button__state-layer {\n opacity: var(--md-sys-state-pressed-state-layer-opacity, 0.12);\n transition-duration: var(--md-sys-motion-duration-short1, 50ms);\n transition-timing-function: var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1));\n}\n:host(:focus-visible) .md-button__state-layer {\n opacity: var(--md-sys-state-focus-state-layer-opacity, 0.12);\n}\n\n/* ==========================================================\n 6. FOCUS RING\n `z-index: 1` raises the focused button above its siblings so the\n outline is never clipped by a neighbor — important inside\n md-button-group, where connected groups have only 2px between\n buttons and standard groups animate neighbor padding on press.\n ========================================================== */\n/* Connected children inside md-button-group sit only 2px apart, so a\n 3px-outset focus ring naturally extends across the neighbor. The\n `z-index: 1` raise lets it draw *on top* of the neighbor cleanly so\n the ring keeps its full 2px breathing room — same visual treatment\n as a stand-alone button. */\n:host(:focus-visible) {\n outline-color: var(--md-sys-color-secondary);\n z-index: 1;\n}\n\n/* ==========================================================\n 7. DISABLED\n ========================================================== */\n:host(.md-button--disabled) {\n cursor: default;\n pointer-events: none;\n --_container-elevation: var(--md-sys-elevation-0, none) !important;\n transition: none;\n}\n\n:host([soft-disabled]) {\n cursor: default;\n pointer-events: auto;\n}\n:host([soft-disabled]) .md-button__state-layer { display: none; }\n\n:host(.md-button--filled.md-button--disabled),\n:host(.md-button--tonal.md-button--disabled) {\n --_container-color: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-disabled-container-opacity, 0.12) * 100%), transparent);\n}\n:host(.md-button--elevated.md-button--disabled) {\n --_container-color: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-disabled-container-opacity, 0.12) * 100%), transparent);\n --_container-elevation: var(--md-sys-elevation-0, none);\n}\n\n:host(.md-button--disabled) {\n --_label-color: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);\n}\n\n:host(.md-button--outlined.md-button--disabled) {\n --_container-color: transparent;\n border-color: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-disabled-container-opacity, 0.12) * 100%), transparent);\n}\n\n:host(.md-button--text.md-button--disabled) {\n --_container-color: transparent;\n}\n\n:host(.md-button--disabled:hover) .md-button__state-layer,\n:host(.md-button--disabled:active) .md-button__state-layer,\n:host(.md-button--disabled:focus-visible) .md-button__state-layer {\n opacity: 0;\n}\n\n/* ==========================================================\n 8. ICON (prop-based fallback inside slot)\n ========================================================== */\n.md-button__icon,\n.md-button__trailing-icon {\n color: var(--md-button-icon-color, inherit);\n font-size: var(--_icon-size, 18px);\n width: var(--_icon-size, 18px);\n height: var(--_icon-size, 18px);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n/* ==========================================================\n 9. NAMED ICON SLOTS\n Slots use display:contents so they don't create a box;\n slotted content participates directly in flex layout.\n ========================================================== */\nslot[name=\"leading-icon\"],\nslot[name=\"trailing-icon\"] {\n display: contents;\n}\n\n::slotted([slot=\"leading-icon\"]),\n::slotted([slot=\"trailing-icon\"]) {\n color: var(--md-button-icon-color, inherit);\n width: var(--_icon-size, 18px);\n height: var(--_icon-size, 18px);\n flex-shrink: 0;\n}\n\n/* ----------------------------------------------------------\n Trailing-icon rotation when this button is a popover anchor.\n\n md-menu (and any other popup component using the same ARIA\n contract) sets aria-expanded=\"true\" on its anchor element\n while the popup is open. Rotating the trailing dropdown\n indicator 180° on that signal flips arrow_drop_down to\n point up, matching MD3 select-trigger behavior, with no\n wiring needed on the consumer side.\n\n Honors prefers-reduced-motion via short2 motion duration.\n ---------------------------------------------------------- */\n.md-button__trailing-icon,\n::slotted([slot=\"trailing-icon\"]) {\n transition: transform var(--md-sys-motion-duration-short2, 150ms)\n var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n\n:host([aria-expanded=\"true\"]:not([suppress-expand-icon-flip])) .md-button__trailing-icon,\n:host([aria-expanded=\"true\"]:not([suppress-expand-icon-flip])) ::slotted([slot=\"trailing-icon\"]) {\n transform: rotate(180deg);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n transition: none;\n }\n\n .md-button__state-layer {\n transition: none;\n }\n\n .md-button__trailing-icon,\n ::slotted([slot=\"trailing-icon\"]) {\n transition: none;\n }\n}\n\n/* ==========================================================\n 10. LABEL\n ========================================================== */\n.md-button__label {\n display: flex;\n align-items: center;\n white-space: nowrap;\n}\n\n/* ==========================================================\n 11. LOADING SPINNER (scales with icon size)\n ========================================================== */\n.md-button__loading {\n /* A FRACTION of the icon it stands in for. Two constraints pull against each\n other: at full --_icon-size the ring reads heavier than the glyph (a bare\n stroke has none of the internal padding a Material glyph carries), but at\n 1em it was pinned to the label and stopped scaling per tier -- sm and md\n share a 14px label, so a 40px and a 56px button drew the same 14px ring\n despite 20px vs 24px icons. 0.7 keeps it visibly lighter than a glyph while\n tracking the tier, and inherits the icon's density taper. */\n /* 10px floor: the icon token itself bottoms out at 10px on the small tiers,\n and 0.7 of that is a 7px ring — too small to read as a spinner at all. */\n --_loading-size: var(--md-button-loading-size, max(10px, calc(var(--_icon-size, 18px) * 0.7)));\n\n /* Hand the size straight to md-loading-indicator's PUBLIC hooks. These\n replace the child's whole default expression, so the button's own taper\n (and its 10px floor) survives instead of hitting the child's 32px floor.\n Not --_size / --_shape-size: those are the child's private vars and\n writing them from out here is the handoff trap. currentColor keeps the\n indicator matching each variant's label, which a token would not. */\n --md-loading-indicator-size: var(--_loading-size);\n --md-loading-indicator-shape-size: var(--_loading-size);\n --md-loading-indicator-color: currentColor;\n flex-shrink: 0;\n /* A wrapper now, so the hooks above reach a SLOTTED replacement too. It has\n to lay out like the indicator it replaced — an inline span would add a text\n baseline gap next to the label. */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Whatever the consumer slots in gets the same box the default occupies. */\n.md-button__loading ::slotted(*) {\n flex-shrink: 0;\n}\n\n/* ==========================================================\n 12. MATERIAL SYMBOLS (default icon font)\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 font-size: var(--_icon-size, 18px);\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 font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n/* ==========================================================\n 13. RTL — opt-in directional-icon mirroring\n\n Buttons that show directional Material Symbols (arrow_forward,\n chevron_right, send, reply…) should set `mirror-icon` so the\n glyph itself flips alongside the leading/trailing slot swap that\n the logical-property layout already performs. Non-directional\n icons (add, search, favorite…) leave `mirror-icon` unset so the\n glyph stays semantically correct.\n\n Two rules cover both placements of `dir=\"rtl\"`:\n (a) on the host itself — `:host([dir=\"rtl\"])`\n (b) on any ancestor element — `:host-context([dir=\"rtl\"])`\n ========================================================== */\n:host([mirror-icon][dir=\"rtl\"]) .md-button__icon,\n:host([mirror-icon][dir=\"rtl\"]) .md-button__trailing-icon,\n:host([mirror-icon][dir=\"rtl\"]) ::slotted([slot=\"leading-icon\"]),\n:host([mirror-icon][dir=\"rtl\"]) ::slotted([slot=\"trailing-icon\"]) {\n transform: scaleX(-1);\n}\n\n:host-context([dir=\"rtl\"]):host([mirror-icon]) .md-button__icon,\n:host-context([dir=\"rtl\"]):host([mirror-icon]) .md-button__trailing-icon,\n:host-context([dir=\"rtl\"]):host([mirror-icon]) ::slotted([slot=\"leading-icon\"]),\n:host-context([dir=\"rtl\"]):host([mirror-icon]) ::slotted([slot=\"trailing-icon\"]) {\n transform: scaleX(-1);\n}\n\n/* ==========================================================\n DENSITY (local override)\n Maps the local `density` prop onto the same --md-sys-density-scale signal a\n global `data-density` ancestor sets. Declared on :host, so a local rung wins\n over the inherited global one. Every density-sensitive value in this file\n derives from that single signal by calc — never add a fixed per-rung ladder.\n ========================================================== */\n:host([density='-1']) { --md-sys-density-scale: -1; }\n:host([density='-2']) { --md-sys-density-scale: -2; }\n:host([density='-3']) { --md-sys-density-scale: -3; }\n:host([density='-4']) { --md-sys-density-scale: -4; }\n","import { Component, Host, h, Prop, State, Event, EventEmitter, Element, AttachInternals } from '@stencil/core';\nimport { triggerRipple } from '../../utils/ripple';\nimport { sanitizeHref, SAFE_WINDOW_FEATURES } from '../../utils/url';\n\n/**\n * Detail payload emitted by `md-button`'s `mdClick` event when the user\n * activates the button (mouse, touch, or keyboard).\n *\n * The event is **cancelable** — calling `event.preventDefault()` from a\n * listener stops the button's default side effects (toggle-state flip\n * and `href` navigation) but does NOT stop the underlying DOM click\n * event. This is the recommended hook for SPA routing and \"are you\n * sure?\" confirmation flows.\n */\nexport interface MdButtonClickDetail {\n /** The button's `value` prop (useful when grouped via `md-button-group`). */\n value: string;\n /** Whether toggle mode is enabled. */\n toggle: boolean;\n /**\n * Selected state the button WILL transition to if the click is not\n * cancelled. In non-toggle mode this is identical to `selected`.\n */\n selected: boolean;\n /** Navigation target (empty if the button is not a link). */\n href: string;\n /** Browsing context (`_self`, `_blank`, …). */\n target: string;\n /** The original DOM event that triggered the activation. */\n originalEvent: MouseEvent | KeyboardEvent;\n}\n\n/**\n * Detail payload emitted by `md-button`'s `mdChange` event when toggle\n * mode flips the selected state in response to a user activation.\n */\nexport interface MdButtonChangeDetail {\n /** New selected state. */\n selected: boolean;\n /** The button's `value` prop. */\n value: string;\n}\n\n@Component({\n tag: 'md-button',\n styleUrl: 'md-button.css',\n shadow: true,\n formAssociated: true,\n})\nexport class MdButton {\n @Element() el!: HTMLElement;\n\n /**\n * Form-association handle. Used to submit/reset the associated form when\n * `type` is `submit`/`reset` — works across shadow boundaries, unlike a\n * native `<button>` rendered in the shadow root (which can't see the\n * light-DOM `<form>` it lives in).\n */\n @AttachInternals() internals!: ElementInternals;\n\n /**\n * Activation behavior, mirroring the native `<button type>`:\n * - `button` (default): no implicit form action.\n * - `submit`: submits the associated form (`requestSubmit`, so the form's\n * `submit` event fires and constraint validation runs).\n * - `reset`: resets the associated form.\n */\n @Prop({ reflect: true }) type: 'button' | 'submit' | 'reset' = 'button';\n\n @Prop() variant: 'filled' | 'outlined' | 'text' | 'elevated' | 'tonal' = 'filled';\n @Prop() size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'sm';\n @Prop() shape: 'round' | 'square' = 'round';\n @Prop({ reflect: true }) disabled: boolean = false;\n @Prop({ reflect: true, attribute: 'soft-disabled' }) softDisabled: boolean = false;\n @Prop() ripple: boolean = true;\n @Prop() loading: boolean = false;\n @Prop() icon: string = '';\n @Prop() trailingIcon: string = '';\n @Prop() href: string = '';\n @Prop() target: string = '_self';\n\n /** Enable toggle behavior (selected/unselected) */\n @Prop() toggle: boolean = false;\n\n /** Current selected state (toggle mode) */\n @Prop({ mutable: true }) selected: boolean = false;\n\n /** Enable M3 Expressive shape morphing on press and toggle */\n @Prop() shapeMorph: boolean = true;\n\n /**\n * Mirror leading and trailing icons horizontally when the button is\n * rendered in a right-to-left context. Set this on buttons that use\n * **directional** Material Symbols (arrows, chevrons, send, reply…)\n * — non-directional icons (add, search, favorite…) should leave it\n * `false` so the glyph stays semantically correct.\n */\n @Prop({ reflect: true, attribute: 'mirror-icon' }) mirrorIcon: boolean = false;\n\n /**\n * When true, suppresses the default 180° trailing-icon rotation while\n * `aria-expanded=\"true\"`. Use when the consumer swaps the glyph (e.g.\n * docked `md-date-picker` month/year triggers use `chevron_right`).\n */\n @Prop({ reflect: true, attribute: 'suppress-expand-icon-flip' })\n suppressExpandIconFlip: boolean = false;\n\n /**\n * Stretch the button to fill its inline-axis container.\n *\n * Switches the host from `inline-flex` to `flex` and sets\n * `inline-size: 100%` so the button consumes the full width of its\n * parent — the standard pattern for primary CTAs in forms, modals,\n * and bottom sheets. The size's `min-block-size` (touch target) is\n * preserved.\n *\n * For arbitrary fixed widths or heights, set the\n * `--md-button-width`, `--md-button-height`, `--md-button-min-width`,\n * `--md-button-min-height`, or `--md-button-max-width` CSS custom\n * properties on the host instead.\n */\n @Prop({ reflect: true, attribute: 'full-width' }) fullWidth: boolean = false;\n\n /** @internal Set by md-button-group — left side is connected to a neighbor */\n @Prop({ reflect: true }) connectedLeft: boolean = false;\n\n /** @internal Set by md-button-group — right side is connected to a neighbor */\n @Prop({ reflect: true }) connectedRight: boolean = false;\n\n /** @internal Value for button-group association */\n @Prop() value: string = '';\n\n /**\n * @internal Roving-tabindex override set by `md-button-group`. When the\n * button is a child of a group, the group sets this to `0` on the\n * currently-active button and `-1` on the rest, so Tab enters the group\n * once instead of stepping through every button. Outside a group, this\n * stays `null` and the button uses its normal tabindex behavior.\n */\n @Prop({ mutable: true, reflect: false }) groupTabindex: number | null = null;\n\n /**\n * Override the default `role=\"button\"`. Used by composite widgets such as\n * `md-date-picker` day cells (`role=\"gridcell\"`). Leave empty for `button`.\n */\n @Prop({ attribute: 'role-override' }) roleOverride: string = '';\n\n /**\n * Local density rung. Drives the same `--md-sys-density-scale` signal that a\n * global `data-density` ancestor sets, so a local value simply overrides the\n * inherited one. 0 = default, -4 = ultra-compact.\n */\n @Prop({ reflect: true }) density: 0 | -1 | -2 | -3 | -4 = 0;\n\n /**\n * Fires every time the user activates the button (mouse click, touch,\n * or `Enter`/`Space` while focused). The event is **cancelable** and\n * the detail payload describes what *would* happen: the post-click\n * toggle state, the navigation `href`, and so on.\n *\n * Calling `event.preventDefault()` from a listener suppresses the\n * default side effects (toggle flip + `href` navigation) but lets\n * the underlying DOM click bubble. This is the hook to use for SPA\n * routing, \"are you sure?\" prompts, async confirmation, etc.\n *\n * The event bubbles and is composed, so listeners outside the\n * shadow tree (the typical case) receive it.\n *\n * ```ts\n * document.querySelector('md-button')!.addEventListener('mdClick', (e) => {\n * const { href, selected } = (e as CustomEvent).detail;\n * if (!confirm('Continue?')) e.preventDefault();\n * });\n * ```\n */\n @Event({ cancelable: true, bubbles: true, composed: true })\n mdClick!: EventEmitter<MdButtonClickDetail>;\n\n /**\n * Fires when toggle mode flips the `selected` state in response to a\n * user activation. Not cancelable — the state change has already\n * happened. Pair with `mdClick` (cancelable) when you need a veto.\n *\n * Bubbles and is composed.\n */\n @Event({ bubbles: true, composed: true })\n mdChange!: EventEmitter<MdButtonChangeDetail>;\n\n @State() private hasSlottedLeadingIcon = false;\n @State() private hasSlottedTrailingIcon = false;\n @State() private pressed = false;\n\n private get isDisabled() {\n return this.disabled || this.softDisabled || this.loading;\n }\n\n componentDidLoad() {\n const shadow = this.el.shadowRoot;\n if (!shadow) return;\n\n const leadingSlot = shadow.querySelector('slot[name=\"leading-icon\"]') as HTMLSlotElement | null;\n const trailingSlot = shadow.querySelector('slot[name=\"trailing-icon\"]') as HTMLSlotElement | null;\n\n leadingSlot?.addEventListener('slotchange', () => {\n this.hasSlottedLeadingIcon = leadingSlot.assignedElements().length > 0;\n });\n trailingSlot?.addEventListener('slotchange', () => {\n this.hasSlottedTrailingIcon = trailingSlot.assignedElements().length > 0;\n });\n }\n\n private handleClick = (e: MouseEvent) => {\n if (this.isDisabled) { e.preventDefault(); return; }\n\n // Compute the post-click toggle state up front so the detail\n // payload describes what *would* happen — listeners can then\n // call preventDefault on the CustomEvent to veto the change.\n const nextSelected = this.toggle ? !this.selected : this.selected;\n\n const evt = this.mdClick.emit({\n value: this.value,\n toggle: this.toggle,\n selected: nextSelected,\n href: this.href,\n target: this.target,\n originalEvent: e,\n });\n\n if (evt.defaultPrevented) {\n // Suppress browser's default link navigation as well so the\n // host stays consistent. We don't flip selected and don't\n // open the href.\n e.preventDefault();\n return;\n }\n\n if (this.toggle && nextSelected !== this.selected) {\n this.selected = nextSelected;\n this.mdChange.emit({ selected: nextSelected, value: this.value });\n }\n\n /* Setting `href` makes this a link rather than a form control, so the\n branch is taken on the raw prop — an unsafe URL must not silently fall\n through to submitting the form. Only the navigation itself is refused. */\n if (this.href) {\n const href = sanitizeHref(this.href);\n if (href) window.open(href, this.target, SAFE_WINDOW_FEATURES);\n return;\n }\n\n // Implicit form action, mirroring a native submit/reset button. Uses\n // ElementInternals so the associated <form> is found across the shadow\n // boundary. requestSubmit() (not submit()) so the form's submit event\n // fires and built-in constraint validation runs.\n if (this.type === 'submit') {\n this.internals.form?.requestSubmit();\n } else if (this.type === 'reset') {\n this.internals.form?.reset();\n }\n };\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (!this.isDisabled) {\n this.pressed = true;\n triggerRipple(this.el);\n this.el.click();\n setTimeout(() => { this.pressed = false; }, 150);\n }\n }\n };\n\n private handlePointerDown = () => {\n if (!this.isDisabled) this.pressed = true;\n };\n\n private handlePointerUp = () => {\n this.pressed = false;\n };\n\n render() {\n const isEffectivelyDisabled = this.isDisabled;\n const hasLeadingIcon = !!this.icon;\n const hasTrailingIcon = !!this.trailingIcon;\n\n return (\n <Host\n class={{\n 'md-button': true,\n [`md-button--${this.variant}`]: true,\n [`md-button--${this.size}`]: true,\n [`md-button--${this.shape}`]: true,\n 'md-button--with-leading-icon': hasLeadingIcon || this.hasSlottedLeadingIcon,\n 'md-button--with-trailing-icon': hasTrailingIcon || this.hasSlottedTrailingIcon,\n 'md-button--disabled': this.disabled || this.softDisabled,\n 'md-button--loading': this.loading,\n 'md-button--toggle': this.toggle,\n 'md-button--selected': this.selected,\n 'md-button--shape-morph': this.shapeMorph,\n 'md-button--pressed': this.shapeMorph && this.pressed,\n 'md-button--connected-left': this.connectedLeft,\n 'md-button--connected-right': this.connectedRight,\n 'md-button--full-width': this.fullWidth,\n }}\n role={this.roleOverride || 'button'}\n aria-disabled={isEffectivelyDisabled ? 'true' : 'false'}\n aria-pressed={this.toggle ? String(this.selected) : undefined}\n tabindex={\n this.disabled\n ? '-1'\n : (this.groupTabindex !== null ? String(this.groupTabindex) : '0')\n }\n onClick={this.handleClick}\n onKeyDown={this.handleKeyDown}\n onPointerDown={this.handlePointerDown}\n onPointerUp={this.handlePointerUp}\n onPointerLeave={this.handlePointerUp}\n onPointerCancel={this.handlePointerUp}\n >\n {this.ripple && <md-ripple disabled={isEffectivelyDisabled}></md-ripple>}\n <span class=\"md-button__state-layer\" part=\"state-layer\" aria-hidden=\"true\"></span>\n <slot name=\"leading-icon\">\n {hasLeadingIcon && <span class=\"md-button__icon material-symbols-outlined\" part=\"icon\">{this.icon}</span>}\n </slot>\n <span class=\"md-button__label\" part=\"label\"><slot /></span>\n <slot name=\"trailing-icon\">\n {hasTrailingIcon && <span class=\"md-button__trailing-icon material-symbols-outlined\" part=\"trailing-icon\">{this.trailingIcon}</span>}\n </slot>\n {this.loading && (\n /* md-loading-indicator, not a hand-rolled ring: never ship a custom\n loading affordance where a library component exists. It is\n md-loading-indicator rather than md-progress-indicator because the\n latter clamps its circular variant to a 24dp M3 minimum, while a\n button spinner runs 10-28px -- every tier but xl would clamp up and\n lose the density taper. Same choice md-select made for its trigger.\n\n The `loader` slot lets a consumer swap it (e.g. for a circular\n md-progress-indicator). The size hooks sit on this WRAPPER so they\n cascade to whatever ends up inside it, default or slotted. */\n <span class=\"md-button__loading\" part=\"loading\" aria-hidden=\"true\">\n <slot name=\"loader\">\n <md-loading-indicator class=\"md-button__loading-default\" />\n </slot>\n </span>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|