@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["mdAreaChartCss","MdAreaChart","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","label","titleAlign","series","curve","stack","connectNulls","showMarks","legend","tooltip","zoom","locale","noAnimation","animation","fillOpacity","showLine","grid","inverted","seriesLabels","summary","labelEmpty","loading","loadingLabel","labelZoomStart","labelZoomEnd","axisTicks","showLabels","labelPlot","labelPoint","density","mounted","kbIndex","announcement","zoomWin","dragBand","grab","engine","ro","legendHidden","Map","bindChartHost","el","chartHost","bindA11yTableHost","a11yTableHost","onPlotPointerDown","e","zoomInside","button","insidePlot","x","hostX","id","pointerId","kind","win","x1","x2","target","composedPath","setPointerCapture","onPointerMove","g","plot","plotRect","Math","min","max","width","frac","trackFrac","clientX","originFrac","last","dataLength","span","end","start","delta","round","s","applyZoom","onPointerUp","band","abs","a","b","indexAtX","sort","m","n","onPlotDblClick","resetZoom","onZoomPanDown","stopPropagation","preventDefault","onZoomSliderInput","valueStart","valueEnd","detail","onZoomSliderEvent","onPlotKeyDown","scene","getScene","xPositions","length","rtl","getComputedStyle","direction","forward","back","next","key","moveKeyboardCursor","onPlotBlur","seriesKeys","seen","map","i","base","get","set","rememberLegendToggle","seriesIndex","hidden","size","oldest","keys","value","delete","componentDidLoad","initChart","window","matchMedia","themeMql","themeListener","applyEngine","addEventListener","disconnectedCallback","disconnect","dispose","removeEventListener","undefined","onAnyPropChange","rebuildA11yTable","resize","replay","toDataURL","getInstance","makeEngine","mdReady","emit","LineChartEngine","ResizeObserver","observe","buildEngineTheme","t","background","textColor","textColorMuted","axisLineColor","gridLineColor","gridColor","surface","fontFamily","labelSize","titleSize","zoomSliderOn","longest","reduce","acc","range","data","xAxis","w","reset","mdZoom","startIndex","endIndex","setZoom","p","y","height","zoomBandStyle","off","canvasOffset","left","top","canvas","host","getBoundingClientRect","box","best","bestD","Infinity","forEach","px","d","clientY","sliderTrackRect","slider","shadowRoot","querySelector","r","track","f","renderZoomSlider","pct","fmt","String","h","class","part","exportparts","controlled","step","ariaLabelStart","ariaLabelEnd","valueStartText","valueEndText","onMdInput","onMdChange","onMdDragStart","onMdDragEnd","onMdFocus","onMdBlur","style","insetInlineStart","inlineSize","onPointerDown","buildSpec","percentage","yFmt","v","valueFormatter","toLocaleString","zw","cut","arr","slice","rebaseMap","rec","out","k","Object","entries","Number","color","resolveSeriesColor","pickPaletteColor","palette","normalizeRange","fill","stroke","dash","symbol","pointSymbols","lineWidth","markSize","title","subtitle","animationDuration","xValues","xScale","scale","xFormatter","defaultValueFormatter","xLabel","xHidden","xHideTicks","hideTicks","xDash","xGridDash","gridDash","xBands","resolveAxisBands","bands","yBands","yAxis","xBreaks","breaks","yBreaks","yScale","yMin","yMax","yFormatter","yTickFormatter","yLabel","yHidden","yHideTicks","yDash","yGridDash","area","gridY","gridX","readMdChartTheme","setSpec","onHover","idx","mdHover","dataIndex","axisValue","seriesIndices","visibleSeriesIndices","onLegendClick","item","mdLegendClick","seriesId","selected","onPointClick","si","di","clickDetail","mdMarkerClick","onLineClick","mdLineClick","onAreaClick","mdAreaClick","onAxisClick","values","mdAxisClick","seriesValues","nativeEvent","setHoverEnabled","setTooltip","render","tooltipRenderer","missingFormatter","trigger","hp","hoverPoints","_","filter","innerHTML","buildDataTableHtml","xAxisLabel","xAxisData","xValueFormatter","labels","tableLabels","focusIndex","xText","xLabels","pt","byIndex","Boolean","join","replace","buildChartSummary","chartType","seriesCount","xMin","xMax","empty","Host","role","heightProp","blockSize","onPointerCancel","onDblClick","name","ref","tabindex","onKeyDown","onBlur","variant","indeterminate"],"sources":["src/components/md-area-chart/md-area-chart.css?tag=md-area-chart&encapsulation=shadow","src/components/md-area-chart/md-area-chart.tsx"],"sourcesContent":["/* ==========================================================\n md-area-chart — Material Design 3 area / streamgraph chart\n\n PUBLIC CSS CUSTOM PROPERTIES:\n --md-area-chart-block-size Explicit chart height, overriding the aspect ratio (default: auto)\n --md-area-chart-min-block-size Floor the chart height never drops below (density-aware)\n --md-area-chart-aspect-ratio Width:height ratio used when no block-size is set (default: 16 / 9)\n --md-area-chart-background Chart surface fill (default: surface-container-low)\n --md-area-chart-padding Inset between the host edge and the plot canvas (density-aware)\n --md-area-chart-shape Corner radius of the chart surface (density-aware)\n --md-area-chart-zoom-size Height reserved for the zoom slider (default: 28px)\n --md-area-chart-zoom-track-color Zoom slider track colour (md-slider inactive track)\n --md-area-chart-zoom-window-color Zoom slider selected-window colour (md-slider active track)\n --md-area-chart-zoom-handle-color Zoom slider thumb + drag-band edge colour\n --md-area-chart-zoom-band-color Drag-to-zoom selection fill\n --md-area-chart-empty-color Empty-state text colour (default: on-surface-variant)\n --md-area-chart-empty-background Empty-state overlay fill (defaults to the chart background)\n --md-area-chart-empty-font Empty-state font family (default: body-medium)\n --md-area-chart-empty-font-size Empty-state font size (default: body-medium, 14px)\n --md-area-chart-empty-icon-size Size of an icon slotted into the empty state (default: 40px)\n\n CSS PARTS:\n header Header row above the plot (hosts the `header` slot)\n canvas The plot surface the chart draws into\n empty Empty-state overlay, shown when there is no data\n loading Loading overlay, shown while `loading` is set\n footer Footer row below the plot (hosts the `footer` slot)\n zoom Wrapper around the zoom slider\n zoom-slider The zoom range slider itself\n zoom-track Zoom slider's inactive track (forwarded from md-slider)\n zoom-window Zoom slider's selected window (forwarded from md-slider)\n zoom-handle Zoom slider's thumbs (forwarded from md-slider)\n zoom-pan Grip that drags the whole zoom window along the track\n zoom-band Live selection band drawn while dragging across the plot\n tooltip The hover card, including one built by `tooltipRenderer`\n\n SLOTS:\n header Content for the header row, replacing the default title block\n empty Replaces the empty-state message when there is no data\n loading Replaces the built-in spinner while `loading` is set\n footer Content for the footer row below the plot\n ========================================================== */\n\n:host {\n --_block-size: var(--md-area-chart-block-size, auto);\n --_min-block-size: var(--md-area-chart-min-block-size, max(120px, calc(160px + var(--md-sys-density-scale, 0) * 8px)));\n --_aspect-ratio: var(--md-area-chart-aspect-ratio, 16 / 9);\n --_background: var(--md-area-chart-background, var(--md-sys-color-surface-container-low, #F7F2FA));\n --_padding: var(--md-area-chart-padding, max(8px, calc(16px + var(--md-sys-density-scale, 0) * 2px)));\n --_zoom-size: var(--md-area-chart-zoom-size, 28px);\n --_zoom-track-color: var(--md-area-chart-zoom-track-color, var(--md-sys-color-surface-container-highest, #E6E0E9));\n --_zoom-window-color: var(--md-area-chart-zoom-window-color, var(--md-sys-color-secondary-container, #E8DEF8));\n --_zoom-handle-color: var(--md-area-chart-zoom-handle-color, var(--md-sys-color-primary, #6750A4));\n --_zoom-band-color: var(--md-area-chart-zoom-band-color, color-mix(in srgb, var(--md-sys-color-primary, #6750A4) 16%, transparent));\n /* Clearance kept at each end of the pan grip so the thumbs stay grabbable. */\n --_zoom-pan-inset: 10px;\n --_shape: var(--md-area-chart-shape, max(8px, calc(16px + var(--md-sys-density-scale, 0) * 2px)));\n --_empty-color: var(--md-area-chart-empty-color, var(--md-sys-color-on-surface-variant, #49454F));\n --_empty-background: var(--md-area-chart-empty-background, var(--_background));\n --_empty-font: var(--md-area-chart-empty-font, var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif));\n --_empty-font-size: var(--md-area-chart-empty-font-size, var(--md-sys-typescale-body-medium-font-size, 14px));\n --_empty-icon-size: var(--md-area-chart-empty-icon-size, 40px);\n\n display: block;\n position: relative;\n inline-size: 100%;\n block-size: var(--_block-size);\n min-block-size: var(--_min-block-size);\n background: var(--_background);\n padding: var(--_padding);\n border-radius: var(--_shape);\n box-sizing: border-box;\n aspect-ratio: var(--_aspect-ratio);\n}\n\n.md-area-chart__header,\n.md-area-chart__footer { display: contents; }\n\n.md-area-chart__header > slot[name='header']::slotted(*),\n.md-area-chart__footer > slot[name='footer']::slotted(*) {\n display: block;\n margin-block: 8px;\n}\n\n.md-area-chart__canvas {\n position: absolute;\n inset: var(--_padding);\n min-block-size: 0;\n min-inline-size: 0;\n}\n\n.md-area-chart__empty {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n box-sizing: border-box;\n padding: 24px;\n /* Mirrors the chart's own container — same surface and corner radius. The\n engine still draws a phantom 0-1 axis for an empty series, so an OPAQUE\n surface here masks that ghost grid instead of letting it show through\n behind the message. Column layout stacks a slotted icon above the text. */\n background: var(--_empty-background);\n border-radius: var(--_shape);\n color: var(--_empty-color);\n font-family: var(--_empty-font);\n font-size: var(--_empty-font-size);\n line-height: var(--md-sys-typescale-body-medium-line-height, 20px);\n pointer-events: none;\n text-align: center;\n}\n\n/* A slotted icon (e.g. a Material Symbols span) gets a sensible size and the\n muted empty-state colour without the consumer restyling it. */\n.md-area-chart__empty ::slotted(.material-symbols-outlined),\n.md-area-chart__empty ::slotted(.material-symbols-rounded),\n.md-area-chart__empty ::slotted(.material-symbols-sharp),\n.md-area-chart__empty ::slotted(.material-icons) {\n /* Document-level .material-symbols rules outrank ::slotted() in the cascade,\n so the size needs !important to win (same reason md-icon-button does it). */\n font-size: var(--_empty-icon-size) !important;\n line-height: 1;\n opacity: 0.55;\n}\n\n.md-area-chart__a11y-table {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n@media (forced-colors: active) { :host { forced-color-adjust: auto; } }\n\n.md-area-chart__live {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/* Focus ring for keyboard navigation — neutral outline, inset so the canvas\n box doesn't clip it. */\n/* The legend chips are engine-created buttons styled inline, and inline styles\n can't express :focus-visible — so their focus ring comes from here. Same\n neutral outline as the plot's, rather than the browser's blue default. */\n[part='legend'] button:focus-visible {\n /* Same ring md-button uses, so focus looks the same wherever it lands. */\n outline: 3px solid var(--md-sys-color-secondary, #625B71);\n outline-offset: 2px;\n border-radius: 6px;\n}\n\n.md-area-chart__canvas:focus-visible {\n outline: 3px solid var(--md-sys-color-secondary, #625B71);\n outline-offset: -3px;\n border-radius: 4px;\n}\n\n/* Loading state — the same opaque overlay as the empty state (it has to mask\n the phantom 0-1 axis the engine draws while there is no data), with the\n default indicator + label stacked in the middle. Slot `loading` replaces the\n content; the box keeps its size either way. */\n.md-area-chart__loading {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n box-sizing: border-box;\n padding: 24px;\n background: var(--_empty-background);\n border-radius: var(--_shape);\n color: var(--_empty-color);\n font-family: var(--_empty-font);\n font-size: var(--_empty-font-size);\n text-align: center;\n}\n\n.md-area-chart__spinner {\n /* Sized against the empty-state icon so a loading chart and an empty one read\n as the same family. */\n inline-size: var(--_empty-icon-size);\n block-size: var(--_empty-icon-size);\n}\n\n/* ── Zoom ──────────────────────────────────────────────────\n The slider sits inside the host's padding at the bottom, and the plot gives\n up exactly that much height (the canvas is inset by --_padding, so its bottom\n is pushed up by the slider's height). */\n:host(.md-area-chart--zoom-slider) .md-area-chart__canvas {\n bottom: calc(var(--_padding) + var(--_zoom-size));\n}\n\n:host(.md-area-chart--zoom-drag) .md-area-chart__canvas {\n /* Signals the plot is draggable; the band itself is pointer-transparent. */\n cursor: ew-resize;\n}\n\n.md-area-chart__zoom {\n position: absolute;\n inset-inline: var(--_padding);\n bottom: var(--_padding);\n block-size: var(--_zoom-size);\n display: flex;\n align-items: center;\n}\n\n/* The house slider draws the track and thumbs; the chart only maps its own\n public zoom tokens onto the slider's and sizes it to the reserved band. */\n.md-area-chart__zoom-slider {\n --md-slider-active-color: var(--_zoom-window-color);\n --md-slider-inactive-color: var(--_zoom-track-color);\n --md-slider-thumb-color: var(--_zoom-handle-color);\n /* Full-height thumbs in a band shorter than the MD3 default (44px), so the\n slider never overflows into the plot. */\n --md-slider-thumb-height: var(--_zoom-size);\n --md-slider-track-height: 12px;\n}\n\n/* Pan grip over the selected window: drag it to move the window without\n resizing. Inset at both ends (see renderZoomSlider) so a press near a thumb\n still reaches the slider's rail and resizes. */\n.md-area-chart__zoom-pan {\n position: absolute;\n inset-block: 0;\n z-index: 1;\n cursor: grab;\n touch-action: none;\n}\n\n.md-area-chart__zoom-pan:active {\n cursor: grabbing;\n}\n\n/* Live drag selection over the plot. */\n.md-area-chart__zoom-band {\n position: absolute;\n background: var(--_zoom-band-color);\n border-inline: 1px solid var(--_zoom-handle-color);\n pointer-events: none;\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 {\n Component,\n Host,\n h,\n Prop,\n State,\n Event,\n EventEmitter,\n Element,\n Method,\n Watch,\n} from '@stencil/core';\nimport {\n buildChartSummary,\n buildDataTableHtml,\n defaultValueFormatter,\n normalizeRange,\n pickPaletteColor,\n readMdChartTheme,\n resolveAxisBands,\n resolveSeriesColor,\n LineChartEngine,\n type EngineTheme,\n type LineChartSpec,\n type MdChartAnimation,\n type MdChartAxis,\n type MdChartAxisClickDetail,\n type MdChartAxisValue,\n type MdChartClickDetail,\n type MdChartHoverDetail,\n type MdChartLegendPosition,\n type MdChartSeries,\n type MdChartStackMode,\n type MdChartTitleAlign,\n type MdChartTooltipRenderer,\n type MdChartTooltipTrigger,\n} from '../../utils/charts';\n\n/**\n * md-area-chart — Material Design 3 area / streamgraph chart,\n * rendered by the in-house engine (Canvas2D + a DOM text\n * overlay). No ECharts.\n *\n * Differences from `md-line-chart`:\n * • the line is always filled with a gradient\n * • stacking defaults to `'normal'` (areas stack additively)\n * • supports the `silhouette` streamgraph baseline\n * • markers are off by default\n */\n@Component({\n tag: 'md-area-chart',\n styleUrl: 'md-area-chart.css',\n shadow: true,\n})\nexport class MdAreaChart {\n @Element() el!: HTMLElement;\n\n @Prop() label: string = '';\n\n /** Sub-title, drawn under the title in the muted text colour. */\n @Prop() subtitle: string | undefined;\n /** Title alignment over the plot: `start` (left), `center`, or `end` (right). */\n @Prop({ attribute: 'title-align' }) titleAlign: MdChartTitleAlign = 'start';\n @Prop() series: MdChartSeries[] = [];\n @Prop() xAxis: MdChartAxis | undefined;\n @Prop() yAxis: MdChartAxis | undefined;\n @Prop() curve: 'linear' | 'smooth' | 'monotone' | 'step' | 'step-before' | 'step-middle' = 'smooth';\n\n /** Default stacking is `'normal'` (additive). */\n @Prop() stack: MdChartStackMode = 'normal';\n\n @Prop({ attribute: 'connect-nulls' }) connectNulls: boolean = false;\n @Prop({ attribute: 'show-marks' }) showMarks: boolean = false;\n /** Line stroke width in px, for every series. Per-series `series[].lineWidth` wins. */\n @Prop({ attribute: 'line-width' }) lineWidth?: number;\n /** Marker RADIUS in px, for every series. Per-series `series[].markSize` wins. */\n @Prop({ attribute: 'mark-size' }) markSize?: number;\n @Prop({ reflect: true }) legend: MdChartLegendPosition | 'none' = 'top-end';\n @Prop() tooltip: MdChartTooltipTrigger = 'axis';\n @Prop() zoom: 'none' | 'inside' | 'slider' | 'both' = 'none';\n /**\n * Format raw Y values for tooltips / a11y table. The tooltip also asks it\n * about series with NO value at the hovered x — `null` for a null datum,\n * `undefined` for no datum at all — and shows a row for one when it returns\n * a non-empty string.\n */\n /**\n * BCP-47 locale for the DEFAULT number / date formatting (axis ticks,\n * tooltip values, screen-reader table). Empty follows the browser; an\n * explicit `valueFormatter` always wins.\n */\n @Prop() locale: string = '';\n\n @Prop() valueFormatter?: (value: number | null | undefined) => string;\n\n /** Replace the tooltip's content. See `md-line-chart`'s `tooltipRenderer`. */\n @Prop() tooltipRenderer?: MdChartTooltipRenderer;\n @Prop({ attribute: 'height' }) heightProp?: string;\n /** Disable all animation (shorthand for `animation=\"none\"`). */\n @Prop({ attribute: 'no-animation' }) noAnimation: boolean = false;\n /** Entry-animation variant: `expressive` (default), `grow`, `fade`, `draw`, or `none`. */\n @Prop() animation: MdChartAnimation = 'expressive';\n /** Entry-animation duration override in ms (≤ 0 disables). */\n @Prop({ attribute: 'animation-duration' }) animationDuration?: number;\n\n /** Fill opacity for the gradient (0..1). */\n @Prop({ attribute: 'fill-opacity' }) fillOpacity: number = 0.55;\n\n /**\n * Draw the line on top of each area's fill. Default `true`. Set `false` for a\n * fill-only area — useful when `fillOpacity` is high (a fully-opaque fill is the\n * same colour as the line, so the line reads as part of it). A per-series\n * `series[].stroke` still wins over this.\n */\n @Prop({ attribute: 'show-line' }) showLine: boolean = true;\n\n /** Gridlines: horizontal (y ticks), vertical (x ticks), both, or none. */\n @Prop() grid: 'none' | 'horizontal' | 'vertical' | 'both' = 'horizontal';\n\n /**\n * Transpose the axes: the category / time axis runs down the side and values\n * run across the bottom. Suits long category names (they read horizontally\n * instead of rotated) and quantities naturally read as depth — altitude,\n * ocean depth, a drill core. `stack` applies as usual, along the value axis.\n */\n @Prop() inverted: boolean = false;\n\n /** Label each series at its last point, so the name follows the end of the\n * band — for racing / progression charts. */\n @Prop({ attribute: 'series-labels' }) seriesLabels: boolean = false;\n\n /**\n * Replaces the generated `aria-label` outright. The default summary is\n * assembled in English (\"Traffic, Area chart, with 3 series, from Jan to\n * Dec.\"); rather than translate it piecewise, hand over the whole sentence\n * built in your own language.\n */\n @Prop() summary: string = '';\n\n /**\n * Translatable chrome for the screen-reader data table. `%shown%` and\n * `%total%` are substituted in `truncated`.\n */\n @Prop() tableLabels?: { x?: string; index?: string; series?: string; truncated?: string };\n\n /** Message shown when `series` is empty. The `empty` slot overrides it. */\n @Prop({ attribute: 'label-empty' }) labelEmpty: string = 'No data to display';\n\n /** Show the loading overlay instead of the plot. */\n @Prop() loading: boolean = false;\n\n /** Text (and the spinner's accessible name) for the loading overlay. */\n @Prop({ attribute: 'loading-label' }) loadingLabel: string = 'Loading chart…';\n\n /** Accessible name for the zoom slider's start thumb. */\n @Prop({ attribute: 'label-zoom-start' }) labelZoomStart: string = 'Zoom range start';\n /** Accessible name for the zoom slider's end thumb. */\n @Prop({ attribute: 'label-zoom-end' }) labelZoomEnd: string = 'Zoom range end';\n\n /** Draw small perpendicular tick marks on the axes. */\n @Prop({ attribute: 'axis-ticks' }) axisTicks: boolean = false;\n /** Print each point's value as a data label beside its marker. */\n @Prop({ attribute: 'show-labels' }) showLabels: boolean = false;\n\n @Event() mdMarkerClick!: EventEmitter<MdChartClickDetail<MdChartSeries>>;\n\n /** Fires when a series' drawn line is clicked *between* its data points (a\n * click on a point emits `mdMarkerClick` instead). */\n @Event() mdLineClick!: EventEmitter<MdChartClickDetail<MdChartSeries>>;\n\n /** Fires when a series' filled area is clicked — the band between its line\n * and its base (its own band when stacked), excluding its line and points. */\n @Event() mdAreaClick!: EventEmitter<MdChartClickDetail<MdChartSeries>>;\n\n /** Fires when the plot background is clicked (inside the plot, but not on a\n * mark, line or area): the nearest x plus every visible series' value there. */\n @Event() mdAxisClick!: EventEmitter<MdChartAxisClickDetail>;\n\n @Event() mdLegendClick!: EventEmitter<{ seriesIndex: number; seriesId?: string; selected: boolean }>;\n @Event() mdHover!: EventEmitter<MdChartHoverDetail>;\n @Event() mdReady!: EventEmitter<void>;\n\n /** Fires when the zoom window changes (drag, slider or `setZoom`/`resetZoom`). */\n @Event() mdZoom!: EventEmitter<{ startIndex: number; endIndex: number; reset: boolean }>;\n\n /**\n * Instructions announced when the plot receives keyboard focus. The plot is\n * focusable so a keyboard user can walk the data with the arrow keys; this\n * is what tells them so.\n */\n @Prop({ attribute: 'label-plot' }) labelPlot: string =\n 'Chart data. Use the arrow keys to move between points, Home and End for the first and last, Escape to leave.';\n\n /** Template for the live announcement as keyboard focus moves. `%x%` is the\n * axis value, `%values%` the series readings at it. */\n @Prop({ attribute: 'label-point' }) labelPoint: string = '%x%: %values%';\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 @State() private mounted = false;\n /** Index the keyboard cursor sits on, or -1 when the plot isn't focused. */\n @State() private kbIndex = -1;\n /** Text for the aria-live region — what a screen reader speaks on move. */\n @State() private announcement = '';\n\n /** Visible index window, or null for the full range. */\n @State() private zoomWin: { start: number; end: number } | null = null;\n\n /** Live drag rectangle (plot-relative px) while selecting a range to zoom. */\n @State() private dragBand: { x1: number; x2: number } | null = null;\n\n /**\n * Pointer id + origin of an in-progress gesture: `band` is a drag across the\n * plot, `pan` is a drag of the zoom window. (Resizing the window is the\n * slider's own gesture — see `renderZoomSlider`.)\n */\n private grab: { id: number; kind: 'band' | 'pan'; x: number; win: { start: number; end: number } } | null = null;\n\n\n private engine: LineChartEngine | null = null;\n private ro: ResizeObserver | null = null;\n private chartHost?: HTMLDivElement;\n private a11yTableHost?: HTMLDivElement;\n private themeMql?: MediaQueryList;\n private themeListener?: () => void;\n\n /**\n * Legend toggles the USER made, kept across data updates.\n *\n * The engine self-toggles a series on legend click, but that lives on the\n * spec — and the next `series` assignment rebuilds the spec from the prop and\n * takes the toggle with it. A chart re-fed live (a race, a poll) would\n * un-hide whatever the reader had just hidden. Remembered here and re-applied\n * in `buildSpec`, keyed by series identity, so the toggle survives the refeed\n * while an explicit `series[i].hidden` still wins.\n */\n private legendHidden = new Map<string, boolean>();\n\n /** A stable key per series — id, else label, else position. Suffixed on\n * collision so two series sharing a label do not share a toggle. */\n private seriesKeys(): string[] {\n const seen = new Map<string, number>();\n return this.series.map((s, i) => {\n const base = s.id != null ? `id:${s.id}` : s.label != null ? `label:${s.label}` : `pos:${i}`;\n const n = seen.get(base) ?? 0;\n seen.set(base, n + 1);\n return n === 0 ? base : `${base}#${n}`;\n });\n }\n\n /** Record a legend toggle so `buildSpec` re-applies it across series re-feeds. */\n private rememberLegendToggle(seriesIndex: number, hidden: boolean): void {\n const key = this.seriesKeys()[seriesIndex];\n if (key == null) return;\n this.legendHidden.set(key, hidden);\n // Backstop against unbounded growth (only legend clicks add entries, so this\n // realistically never trips): evict the oldest toggle.\n if (this.legendHidden.size > 256) {\n const oldest = this.legendHidden.keys().next().value as string;\n this.legendHidden.delete(oldest);\n }\n }\n\n componentDidLoad() {\n this.initChart();\n if (typeof window !== 'undefined' && window.matchMedia) {\n this.themeMql = window.matchMedia('(prefers-color-scheme: dark)');\n this.themeListener = () => this.applyEngine();\n this.themeMql.addEventListener?.('change', this.themeListener);\n }\n }\n\n disconnectedCallback() {\n this.ro?.disconnect();\n this.ro = null;\n this.engine?.dispose();\n this.engine = null;\n if (this.themeMql && this.themeListener) {\n this.themeMql.removeEventListener?.('change', this.themeListener);\n this.themeListener = undefined;\n this.themeMql = undefined;\n }\n }\n\n @Watch('series') @Watch('xAxis') @Watch('yAxis')\n @Watch('curve') @Watch('stack') @Watch('legend')\n @Watch('tooltip') @Watch('zoom') @Watch('connectNulls')\n @Watch('showMarks') @Watch('lineWidth') @Watch('markSize') @Watch('label') @Watch('subtitle') @Watch('titleAlign') @Watch('fillOpacity') @Watch('showLine') @Watch('grid') @Watch('axisTicks') @Watch('showLabels') @Watch('inverted') @Watch('loading')\n @Watch('animation') @Watch('animationDuration') @Watch('tooltipRenderer') @Watch('valueFormatter')\n onAnyPropChange() {\n this.applyEngine();\n this.rebuildA11yTable();\n }\n\n @Method()\n async resize(): Promise<void> {\n this.engine?.resize();\n }\n\n /** Replay the entry animation from the start (uses the current `animation`). */\n @Method()\n async replay(): Promise<void> {\n this.engine?.replay();\n }\n\n @Method()\n async toDataURL(): Promise<string> {\n return this.engine?.toDataURL('image/png') ?? '';\n }\n\n @Method()\n async getInstance(): Promise<LineChartEngine | null> {\n return this.engine;\n }\n\n private bindChartHost = (el?: HTMLDivElement) => {\n this.chartHost = el;\n };\n\n private bindA11yTableHost = (el?: HTMLDivElement) => {\n this.a11yTableHost = el;\n };\n\n private initChart() {\n this.makeEngine();\n this.applyEngine();\n this.rebuildA11yTable();\n this.mounted = true;\n this.mdReady.emit();\n }\n\n /** (Re)create the engine on the selected backend + wire its ResizeObserver. */\n private makeEngine() {\n if (!this.chartHost) return;\n this.ro?.disconnect();\n this.ro = null;\n this.engine?.dispose();\n try {\n this.engine = new LineChartEngine(this.chartHost);\n } catch {\n this.engine = null;\n }\n if (this.engine && typeof ResizeObserver !== 'undefined') {\n this.ro = new ResizeObserver(() => this.engine?.resize());\n this.ro.observe(this.chartHost);\n }\n }\n\n\n private buildEngineTheme(t: ReturnType<typeof readMdChartTheme>): EngineTheme {\n return {\n background: t.background,\n textColor: t.textColor,\n textColorMuted: t.textColorMuted,\n axisLineColor: t.axisLineColor,\n gridLineColor: t.gridColor,\n surface: t.surface,\n fontFamily: t.fontFamily,\n labelSize: t.labelSize,\n titleSize: t.titleSize,\n };\n }\n\n // ─────────────────── zoom ───────────────────\n\n private get zoomInside(): boolean {\n return this.zoom === 'inside' || this.zoom === 'both';\n }\n\n private get zoomSliderOn(): boolean {\n return this.zoom === 'slider' || this.zoom === 'both';\n }\n\n /** Number of datapoints along x — the longest series, or the axis if longer. */\n private dataLength(): number {\n const longest = this.series.reduce(\n (acc, s) => Math.max(acc, s.range?.length ?? s.data?.length ?? 0),\n 0,\n );\n return Math.max(longest, this.xAxis?.data?.length ?? 0);\n }\n\n /** Current window, defaulted to the full range and clamped to the data. */\n private win(): { start: number; end: number } {\n const last = Math.max(0, this.dataLength() - 1);\n const w = this.zoomWin;\n if (!w) return { start: 0, end: last };\n // Keep at least two points visible, else there is no band to draw.\n const start = Math.min(Math.max(0, w.start), Math.max(0, last - 1));\n return { start, end: Math.min(Math.max(start + 1, w.end), last) };\n }\n\n private applyZoom(start: number, end: number, reset = false): void {\n const last = Math.max(0, this.dataLength() - 1);\n const s = Math.min(Math.max(0, Math.round(start)), Math.max(0, last - 1));\n const e = Math.min(Math.max(s + 1, Math.round(end)), last);\n this.zoomWin = reset ? null : { start: s, end: e };\n this.applyEngine();\n this.rebuildA11yTable();\n this.mdZoom.emit({ startIndex: reset ? 0 : s, endIndex: reset ? last : e, reset });\n }\n\n /** Zoom to an absolute index range. */\n @Method()\n async setZoom(startIndex: number, endIndex: number): Promise<void> {\n this.applyZoom(startIndex, endIndex);\n }\n\n /** Drop the zoom window and show the full range. */\n @Method()\n async resetZoom(): Promise<void> {\n this.applyZoom(0, 0, true);\n }\n\n /**\n * Plot rect in CANVAS coordinates, from the live scene.\n *\n * The engine lays the scene out relative to the canvas box, which the host's\n * padding insets from the host box — so canvas and host space differ by that\n * padding. Everything that compares against the scene (`indexAtX` reads\n * `scene.xPositions`, which is canvas-space too) converts the pointer INTO\n * this space via `plotX`/`plotY`; only the drag band, positioned against the\n * host, converts back out. Reading these as host coordinates drew the band\n * ~16px above the x-axis and shifted the selected range by the same amount.\n */\n private plotRect(): { x: number; y: number; width: number; height: number } | null {\n const p = this.engine?.getScene()?.plot;\n return p ? { x: p.x, y: p.y, width: p.width, height: p.height } : null;\n }\n\n /**\n * Drag-band geometry, converted from canvas space back out to host space\n * (the band is `position: absolute` inside a `position: relative` :host).\n *\n * Physical `left`/`top`, not logical insets: both values are offsets from the\n * host's LEFT edge, which `inset-inline-start` would mirror to the right in\n * RTL. Same idiom as md-line-chart / md-bar-chart.\n */\n private zoomBandStyle(): { [key: string]: string } | undefined {\n const plot = this.plotRect();\n if (!this.dragBand || !plot) return undefined;\n const off = this.canvasOffset();\n const { x1, x2 } = this.dragBand;\n return {\n left: `${off.x + Math.min(x1, x2)}px`,\n width: `${Math.abs(x2 - x1)}px`,\n top: `${off.y + plot.y}px`,\n height: `${plot.height}px`,\n };\n }\n\n /** Offset of the canvas box inside the host box — canvas space → host space. */\n private canvasOffset(): { x: number; y: number } {\n const canvas = this.chartHost;\n if (!canvas) return { x: 0, y: 0 };\n const host = this.el.getBoundingClientRect();\n const box = canvas.getBoundingClientRect();\n return { x: box.left - host.left, y: box.top - host.top };\n }\n\n /** Map a canvas-relative x to the nearest ABSOLUTE data index. */\n private indexAtX(hostX: number): number {\n const scene = this.engine?.getScene();\n const w = this.win();\n if (!scene?.xPositions?.length) return w.start;\n let best = 0;\n let bestD = Infinity;\n scene.xPositions.forEach((px, i) => {\n const d = Math.abs(px - hostX);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n });\n return w.start + best;\n }\n\n /** Pointer x in CANVAS coordinates — the space `plotRect`/`xPositions` use. */\n private hostX(e: MouseEvent): number {\n return e.clientX - (this.chartHost ?? this.el).getBoundingClientRect().left;\n }\n\n /** Is the event over the plot itself (as opposed to the header, slider, footer)? */\n private insidePlot(e: MouseEvent): boolean {\n const plot = this.plotRect();\n if (!plot) return false;\n const box = (this.chartHost ?? this.el).getBoundingClientRect();\n const x = e.clientX - box.left;\n const y = e.clientY - box.top;\n return x >= plot.x && x <= plot.x + plot.width && y >= plot.y && y <= plot.y + plot.height;\n }\n\n private onPlotPointerDown = (e: PointerEvent) => {\n if (!this.zoomInside || e.button !== 0 || this.grab) return;\n if (!this.insidePlot(e)) return;\n const x = this.hostX(e);\n this.grab = { id: e.pointerId, kind: 'band', x, win: this.win() };\n this.dragBand = { x1: x, x2: x };\n // Capture on the element really under the pointer, NOT `e.target`: this\n // listener is on the host, so a shadow-internal target is retargeted to the\n // host, and capturing there would send the whole gesture — including the\n // closing click — to the host, where the plot canvas never sees it.\n const target = (e.composedPath?.()[0] as HTMLElement | undefined) ?? (e.target as HTMLElement);\n target.setPointerCapture?.(e.pointerId);\n };\n\n private onPointerMove = (e: PointerEvent) => {\n const g = this.grab;\n if (!g || g.id !== e.pointerId) return;\n if (g.kind === 'band') {\n const plot = this.plotRect();\n if (!plot) return;\n this.dragBand = { x1: g.x, x2: Math.min(Math.max(this.hostX(e), plot.x), plot.x + plot.width) };\n return;\n }\n // Pan: shift the window by the pointer's travel along the slider track,\n // keeping its span. Fractions of the full range, so it tracks the thumbs.\n const frac = this.trackFrac(e.clientX);\n const originFrac = this.trackFrac(g.x);\n if (frac == null || originFrac == null) return;\n const last = Math.max(1, this.dataLength() - 1);\n const span = g.win.end - g.win.start;\n const delta = Math.round((frac - originFrac) * last);\n const s = Math.min(Math.max(0, g.win.start + delta), last - span);\n this.applyZoom(s, s + span);\n };\n\n private onPointerUp = (e: PointerEvent) => {\n const g = this.grab;\n if (!g || g.id !== e.pointerId) return;\n this.grab = null;\n const band = this.dragBand;\n this.dragBand = null;\n if (g.kind !== 'band' || !band) return;\n // A tiny drag is a click, not a zoom — leave the view alone so marker\n // clicks and tooltips keep working.\n if (Math.abs(band.x2 - band.x1) < 8) return;\n // In RTL the plot is mirrored, so the LEFT edge of the band is the LATER\n // index — order by index, not by pixel, or the window comes out reversed.\n const [a, b] = [this.indexAtX(band.x1), this.indexAtX(band.x2)].sort((m, n) => m - n);\n if (b - a >= 1) this.applyZoom(a, b);\n };\n\n private onPlotDblClick = (e: MouseEvent) => {\n // Plot only: a double-click on the zoom slider is two track clicks, not a\n // request to throw the window away.\n if (this.zoomInside && this.zoomWin && this.insidePlot(e)) this.resetZoom();\n };\n\n /**\n * The zoom slider's track box. `md-slider` maps 0→100% across its own host\n * box, so the host rect *is* the track — measuring it keeps the pan gesture\n * in step with the thumbs.\n */\n private sliderTrackRect(): { left: number; width: number; rtl: boolean } | null {\n const slider = this.el.shadowRoot?.querySelector('.md-area-chart__zoom-slider');\n if (!slider) return null;\n const r = slider.getBoundingClientRect();\n if (!r.width) return null;\n return { left: r.left, width: r.width, rtl: getComputedStyle(this.el).direction === 'rtl' };\n }\n\n /** Client x → fraction along the zoom track (RTL-aware, as md-slider is). */\n private trackFrac(clientX: number): number | null {\n const track = this.sliderTrackRect();\n if (!track) return null;\n const f = (clientX - track.left) / track.width;\n return track.rtl ? 1 - f : f;\n }\n\n private onZoomPanDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n // Keep it away from the plot-drag handler on the host, and from the\n // slider's own rail (which would resize instead of pan).\n e.stopPropagation();\n e.preventDefault();\n this.grab = { id: e.pointerId, kind: 'pan', x: e.clientX, win: this.win() };\n (e.target as HTMLElement).setPointerCapture?.(e.pointerId);\n };\n\n /** md-slider drives the window while a thumb moves (continuous). */\n private onZoomSliderInput = (e: CustomEvent<{ valueStart?: number; valueEnd?: number }>) => {\n // md-slider's events are composed, so they would surface on the chart's own\n // host and look like chart events to a consumer. Stop them here.\n e.stopPropagation();\n const { valueStart, valueEnd } = e.detail ?? {};\n if (valueStart == null || valueEnd == null) return;\n this.applyZoom(valueStart, valueEnd);\n };\n\n /** Swallow the slider's remaining composed events (see above). mdInput has\n * already applied the window, so the commit needs no second applyZoom. */\n private onZoomSliderEvent = (e: Event) => e.stopPropagation();\n\n private renderZoomSlider() {\n const last = Math.max(1, this.dataLength() - 1);\n const w = this.win();\n const pct = (i: number) => (i / last) * 100;\n const fmt = (i: number) => String(this.xAxis?.data?.[i] ?? i);\n return (\n <div class=\"md-area-chart__zoom\" part=\"zoom\">\n <md-slider\n class=\"md-area-chart__zoom-slider\"\n part=\"zoom-slider\"\n exportparts=\"track: zoom-track, track-active: zoom-window, thumb-knob: zoom-handle\"\n range\n controlled\n min={0}\n max={last}\n step={1}\n valueStart={w.start}\n valueEnd={w.end}\n ariaLabelStart={this.labelZoomStart}\n ariaLabelEnd={this.labelZoomEnd}\n valueStartText={fmt(w.start)}\n valueEndText={fmt(w.end)}\n onMdInput={this.onZoomSliderInput}\n onMdChange={this.onZoomSliderEvent}\n onMdDragStart={this.onZoomSliderEvent}\n onMdDragEnd={this.onZoomSliderEvent}\n onMdFocus={this.onZoomSliderEvent}\n onMdBlur={this.onZoomSliderEvent}\n ></md-slider>\n\n {/* Pan grip over the selected window. Inset at both ends so the thumbs\n stay grabbable, and it collapses to nothing on a narrow window. */}\n <div\n class=\"md-area-chart__zoom-pan\"\n part=\"zoom-pan\"\n style={{\n insetInlineStart: `calc(${pct(w.start)}% + var(--_zoom-pan-inset))`,\n inlineSize: `max(0px, calc(${pct(w.end) - pct(w.start)}% - 2 * var(--_zoom-pan-inset)))`,\n }}\n onPointerDown={this.onZoomPanDown}\n ></div>\n </div>\n );\n }\n\n private buildSpec(t: ReturnType<typeof readMdChartTheme>): LineChartSpec {\n const percentage = this.stack === 'percentage';\n const yFmt = (v: number) => (this.valueFormatter ? this.valueFormatter(v) : v.toLocaleString(this.locale || undefined));\n // Zoom is a view: slice what the engine draws, leave `this.series` alone.\n // Index-addressed options (pointSymbols) are rebased into window\n // coordinates, and anything outside the window is dropped.\n const zw = this.zoomWin ? this.win() : null;\n const cut = <T,>(arr: T[] | undefined): T[] | undefined =>\n arr && zw ? arr.slice(zw.start, zw.end + 1) : arr;\n const rebaseMap = <T,>(rec: Record<number, T> | undefined): Record<number, T> | undefined => {\n if (!rec || !zw) return rec;\n const out: Record<number, T> = {};\n for (const [k, v] of Object.entries(rec)) {\n const i = Number(k) - zw.start;\n if (i >= 0 && i <= zw.end - zw.start) out[i] = v;\n }\n return out;\n };\n const keys = this.seriesKeys();\n return {\n series: this.series.map((s, i) => ({\n label: s.label ?? `Series ${i + 1}`,\n color: resolveSeriesColor(this.el, s.color, pickPaletteColor(t.palette, i)),\n // A range series draws from its band; `data` only keeps the row count\n // aligned so the shared x axis and hover index still line up.\n data: cut(s.range ? s.range.map(() => null) : s.data) ?? [],\n range: cut(s.range?.map(normalizeRange)),\n fill: s.fill,\n // A streamgraph rides a free baseline, so a layer's top edge is not a\n // value anyone can read — stroking it just adds noise. Explicit\n // per-series `stroke` still wins.\n stroke: s.stroke ?? (!this.showLine || this.stack === 'wiggle' || this.stack === 'silhouette' ? false : undefined),\n curve: s.curve ?? this.curve,\n connectNulls: s.connectNulls ?? this.connectNulls,\n showMarks: s.showMarks ?? this.showMarks,\n hidden: s.hidden ?? this.legendHidden.get(keys[i]) ?? false,\n dash: s.dash,\n symbol: s.symbol,\n pointSymbols: rebaseMap(s.pointSymbols),\n lineWidth: s.lineWidth ?? this.lineWidth,\n markSize: s.markSize ?? this.markSize,\n })),\n title: this.label || undefined,\n subtitle: this.subtitle || undefined,\n titleAlign: this.titleAlign,\n animation: this.noAnimation ? 'none' : this.animation,\n animationDuration: this.animationDuration,\n xValues: cut(this.xAxis?.data) ?? [],\n xScale: this.xAxis?.scale ?? 'category',\n xFormatter: this.xAxis?.valueFormatter ?? ((v: MdChartAxisValue) => defaultValueFormatter(v, this.locale)),\n xLabel: this.xAxis?.label,\n xHidden: this.xAxis?.hidden,\n xHideTicks: this.xAxis?.hideTicks,\n xDash: this.xAxis?.dash,\n xGridDash: this.xAxis?.gridDash,\n xBands: resolveAxisBands(this.el, this.xAxis?.bands),\n yBands: resolveAxisBands(this.el, this.yAxis?.bands),\n xBreaks: this.xAxis?.breaks,\n yBreaks: this.yAxis?.breaks,\n yScale: this.yAxis?.scale ?? 'value',\n yMin: percentage ? 0 : this.yAxis?.min,\n yMax: percentage ? 100 : this.yAxis?.max,\n yFormatter: percentage ? (v: number) => `${Math.round(v)}%` : yFmt,\n // The axis can format independently of the values (bare numbers on the\n // axis, units in the tooltip); unset → the axis follows `valueFormatter`.\n yTickFormatter:\n !percentage && this.yAxis?.valueFormatter ? (v: number) => this.yAxis!.valueFormatter!(v) : undefined,\n yLabel: this.yAxis?.label,\n yHidden: this.yAxis?.hidden,\n yHideTicks: this.yAxis?.hideTicks,\n yDash: this.yAxis?.dash,\n yGridDash: this.yAxis?.gridDash,\n stack: this.stack,\n inverted: this.inverted,\n area: true,\n fillOpacity: this.fillOpacity,\n legend: this.legend,\n gridY: this.grid === 'horizontal' || this.grid === 'both',\n gridX: this.grid === 'vertical' || this.grid === 'both',\n axisTicks: this.axisTicks,\n showLabels: this.showLabels,\n seriesLabels: this.seriesLabels,\n };\n }\n\n private applyEngine() {\n if (!this.engine) return;\n const t = readMdChartTheme(this.el);\n this.engine.setSpec(this.buildSpec(t), this.buildEngineTheme(t), {\n onHover: (idx) => {\n if (idx < 0) return;\n // The engine indexes the WINDOW; consumers index the data they gave us.\n const abs = idx + (this.zoomWin ? this.win().start : 0);\n this.mdHover.emit({\n dataIndex: abs,\n axisValue: this.xAxis?.data?.[abs],\n seriesIndices: this.visibleSeriesIndices(),\n });\n },\n onLegendClick: (item) => {\n this.rememberLegendToggle(item.seriesIndex, !!item.hidden);\n this.mdLegendClick.emit({\n seriesIndex: item.seriesIndex,\n seriesId: this.series[item.seriesIndex]?.id,\n selected: !item.hidden,\n });\n },\n onPointClick: (si, di, e) => {\n const d = this.clickDetail(si, di, e);\n if (d) this.mdMarkerClick.emit(d);\n },\n onLineClick: (si, di, e) => {\n const d = this.clickDetail(si, di, e);\n if (d) this.mdLineClick.emit(d);\n },\n onAreaClick: (si, di, e) => {\n const d = this.clickDetail(si, di, e);\n if (d) this.mdAreaClick.emit(d);\n },\n onAxisClick: (di, values, e) => {\n const abs = di + (this.zoomWin ? this.win().start : 0);\n this.mdAxisClick.emit({\n dataIndex: abs,\n axisValue: this.xAxis?.data?.[abs],\n seriesValues: values.map((v) => ({\n seriesIndex: v.seriesIndex,\n seriesId: this.series[v.seriesIndex]?.id,\n label: v.label,\n dataIndex: v.value == null ? -1 : abs,\n value: v.value,\n })),\n nativeEvent: e,\n });\n },\n });\n this.engine.setHoverEnabled(this.tooltip !== 'none');\n this.engine.setTooltip({\n render: this.tooltipRenderer,\n missingFormatter: this.valueFormatter,\n // `item` reports only the band under the cursor; `axis` lists them all.\n trigger: this.tooltip === 'item' ? 'item' : 'axis',\n });\n }\n\n /** The payload shared by the three per-series click events (marker / line /\n * area) — same shape, different gesture. */\n private clickDetail(si: number, di: number, e: PointerEvent): MdChartClickDetail<MdChartSeries> | null {\n const s = this.series[si];\n if (!s) return null;\n const abs = di + (this.zoomWin ? this.win().start : 0);\n return {\n seriesIndex: si,\n seriesId: s.id,\n dataIndex: abs,\n value: s.data[abs] ?? null,\n axisValue: this.xAxis?.data?.[abs],\n nativeEvent: e,\n series: s,\n };\n }\n\n private visibleSeriesIndices(): number[] {\n const hp = this.engine?.getScene()?.hoverPoints;\n if (hp) return hp.map((h) => h.seriesIndex);\n return this.series.map((_, i) => i).filter((i) => !this.series[i].hidden);\n }\n\n private rebuildA11yTable() {\n if (!this.a11yTableHost) return;\n this.a11yTableHost.innerHTML = buildDataTableHtml({\n title: this.label,\n xAxisLabel: this.xAxis?.label,\n xAxisData: this.xAxis?.data,\n xValueFormatter: this.xAxis?.valueFormatter ?? ((v: MdChartAxisValue) => defaultValueFormatter(v, this.locale)),\n locale: this.locale,\n series: this.series,\n valueFormatter: this.valueFormatter,\n labels: this.tableLabels,\n });\n }\n\n\n /**\n * Walk the data with the keyboard. Without this the readings are reachable\n * only by hovering, which no keyboard or screen-reader user can do.\n * Arrows follow the READING direction, so in RTL, Left advances.\n */\n private onPlotKeyDown = (e: KeyboardEvent) => {\n const scene = this.engine?.getScene();\n const last = Math.max(0, (scene?.xPositions.length ?? 0) - 1);\n if (!scene || last < 0) return;\n const rtl = typeof getComputedStyle === 'function' && getComputedStyle(this.el).direction === 'rtl';\n const forward = rtl ? 'ArrowLeft' : 'ArrowRight';\n const back = rtl ? 'ArrowRight' : 'ArrowLeft';\n let next = this.kbIndex;\n switch (e.key) {\n case forward:\n next = this.kbIndex < 0 ? 0 : Math.min(last, this.kbIndex + 1);\n break;\n case back:\n next = this.kbIndex < 0 ? last : Math.max(0, this.kbIndex - 1);\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = last;\n break;\n case 'Escape':\n if (this.kbIndex < 0) return;\n next = -1;\n break;\n default:\n return;\n }\n e.preventDefault();\n this.moveKeyboardCursor(next);\n };\n\n private onPlotBlur = () => {\n if (this.kbIndex >= 0) this.moveKeyboardCursor(-1);\n };\n\n /** Move the keyboard cursor, mirroring it into the hover UI and live region. */\n private moveKeyboardCursor(next: number) {\n this.kbIndex = next;\n this.engine?.focusIndex(next);\n if (next < 0) {\n this.announcement = '';\n return;\n }\n const scene = this.engine?.getScene();\n const xText = scene?.xLabels?.[next] ?? String(next + 1);\n const yFmt = (v: number) =>\n this.valueFormatter ? this.valueFormatter(v) : v.toLocaleString(this.locale || undefined);\n const values = (scene?.hoverPoints ?? [])\n .map((hp) => {\n const pt = hp.byIndex[next];\n return pt ? `${hp.label} ${yFmt(pt.value)}` : null;\n })\n .filter(Boolean)\n .join(', ');\n this.announcement = this.labelPoint.replace('%x%', xText).replace('%values%', values);\n }\n\n render() {\n const xValues = this.xAxis?.data ?? [];\n const summary =\n this.summary ||\n buildChartSummary({\n title: this.label,\n chartType: 'area',\n seriesCount: this.series.length,\n locale: this.locale,\n xMin: xValues[0] as MdChartAxisValue | undefined,\n xMax: xValues[xValues.length - 1] as MdChartAxisValue | undefined,\n });\n // While loading, the loader owns the box — an empty-state message under it\n // would just be the wrong answer to \"where is my data?\".\n const empty = this.series.length === 0 && !this.loading;\n\n return (\n <Host\n class={{\n 'md-area-chart': true,\n 'md-area-chart--empty': empty,\n 'md-area-chart--mounted': this.mounted,\n 'md-area-chart--zoom-slider': this.zoomSliderOn,\n 'md-area-chart--zoom-drag': this.zoomInside,\n }}\n role=\"figure\"\n aria-label={summary}\n aria-busy={this.loading ? 'true' : null}\n style={this.heightProp ? { blockSize: this.heightProp } : undefined}\n onPointerDown={this.onPlotPointerDown}\n onPointerMove={this.onPointerMove}\n onPointerUp={this.onPointerUp}\n onPointerCancel={this.onPointerUp}\n onDblClick={this.onPlotDblClick}\n >\n <header class=\"md-area-chart__header\" part=\"header\"><slot name=\"header\"></slot></header>\n <div\n class=\"md-area-chart__canvas\"\n part=\"canvas\"\n ref={el => this.bindChartHost(el as HTMLDivElement)}\n tabindex={empty ? undefined : '0'}\n role={empty ? undefined : 'application'}\n aria-label={empty ? undefined : this.labelPlot}\n onKeyDown={this.onPlotKeyDown}\n onBlur={this.onPlotBlur}\n ></div>\n {empty && (\n <div class=\"md-area-chart__empty\" part=\"empty\">\n <slot name=\"empty\">{this.labelEmpty}</slot>\n </div>\n )}\n\n {/* Loader — same opaque overlay as the empty state, so the phantom axis\n the engine draws for absent data can't show through. */}\n {this.loading && (\n <div class=\"md-area-chart__loading\" part=\"loading\" role=\"status\">\n {/* `loader` is the library-wide name for \"swap the loading affordance\";\n `loading` is kept as the older alias. Nesting them means either\n works — the outer slot falls back to the inner one, which falls\n back to the default below — and `loader` wins if both are given. */}\n <slot name=\"loader\">\n <slot name=\"loading\">\n <md-progress-indicator\n class=\"md-area-chart__spinner\"\n variant=\"circular\"\n indeterminate\n label={this.loadingLabel}\n ></md-progress-indicator>\n <span class=\"md-area-chart__loading-text\">{this.loadingLabel}</span>\n </slot>\n </slot>\n </div>\n )}\n {/* Live drag selection over the plot, while a zoom range is dragged. */}\n {this.dragBand && this.plotRect() && (\n <div\n class=\"md-area-chart__zoom-band\"\n part=\"zoom-band\"\n style={this.zoomBandStyle()}\n ></div>\n )}\n {this.zoomSliderOn && this.renderZoomSlider()}\n <footer class=\"md-area-chart__footer\" part=\"footer\"><slot name=\"footer\"></slot></footer>\n <div class=\"md-area-chart__a11y-table\" ref={el => this.bindA11yTableHost(el as HTMLDivElement)}></div>\n\n {/* Narrates the keyboard cursor, politely. */}\n <div class=\"md-area-chart__live\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {this.announcement}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{p as t,H as i,c as s,f as e,h as o,d as a,t as n}from"./p-bSpXNc5J.js";import{L as h}from"./p-6WgHjhDg.js";import{s as r,g as l,c,r as p}from"./p-DWxN44zD.js";import{V as d,i as m,c as u}from"./p-Bz-JaJcA.js";import{d as f}from"./p-BEmwDSzw.js";import{d as g}from"./p-R_guULjT.js";import{d as y}from"./p-Bkt_X-6v.js";import{d as b}from"./p-CVMM-tdC.js";import{d as v}from"./p-DfcpeJAu.js";import{d as _}from"./p-C3vB0Hd9.js";import{d as x}from"./p-CF7mq5T7.js";const w=()=>`:host{--md-text-field-padding-inline-end:var(--md-sys-spacing-inset-lg, 16px);--_min-width:var(--md-autocomplete-min-width, 220px);--_chip-gap:var(--md-autocomplete-chip-gap, var(--md-sys-spacing-gap-xs, 4px));--_chip-radius:var(--md-autocomplete-chip-radius, 8px);--_caret-color:var(--md-autocomplete-caret-color, var(--md-sys-color-on-surface-variant));--_clear-color:var(--md-autocomplete-clear-color, var(--md-sys-color-on-surface-variant));--_option-icon-size:var(--md-autocomplete-option-icon-size, 20px);--_loading-color:var(--md-autocomplete-loading-color, var(--md-sys-color-on-surface-variant));display:inline-flex;flex-direction:column;inline-size:var(--md-autocomplete-width, 100%);min-inline-size:var(--_min-width);box-sizing:border-box;vertical-align:bottom;position:relative}:host(.md-autocomplete--chips-top) .md-autocomplete__chips{margin-block-start:0;margin-block-end:var(--md-sys-spacing-inset-sm, 8px)}:host(.md-autocomplete--chips-left),:host(.md-autocomplete--chips-right){flex-direction:row;align-items:center;gap:var(--md-sys-spacing-gap-sm, 8px)}:host(.md-autocomplete--chips-left) .md-autocomplete__field,:host(.md-autocomplete--chips-right) .md-autocomplete__field{flex:1 1 auto;inline-size:auto;min-inline-size:0}:host(.md-autocomplete--chips-left) .md-autocomplete__chips,:host(.md-autocomplete--chips-right) .md-autocomplete__chips{contain:none;flex:0 1 auto;max-inline-size:50%;margin-block-start:0}.md-autocomplete__field{display:block;inline-size:100%}.md-autocomplete__chips{display:flex;flex-wrap:wrap;align-items:center;gap:var(--_chip-gap);max-inline-size:100%;margin-block-start:var(--md-sys-spacing-inset-sm, 8px);contain:inline-size}.md-autocomplete__chips md-chip{--md-chip-container-shape:var(--_chip-radius)}.md-autocomplete__inline-chips{display:flex;flex-wrap:wrap;align-items:center;gap:var(--_chip-gap);min-inline-size:0;overflow:visible}.md-autocomplete__inline-chips md-chip{--md-chip-container-shape:var(--_chip-radius);flex-shrink:0}.md-autocomplete__caret{color:var(--_caret-color);font-size:var(--md-autocomplete-caret-size, 24px);line-height:1;display:inline-flex;align-items:center;justify-content:center;inline-size:24px;block-size:24px;cursor:pointer;transition:transform var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1))}:host(.md-autocomplete--open) .md-autocomplete__caret{transform:rotate(180deg)}.md-autocomplete__clear{--md-icon-button-container-width:28px;--md-icon-button-container-height:28px;--md-icon-button-icon-size:18px;color:var(--_clear-color);margin-inline-end:2px}.md-autocomplete__clear--hidden{visibility:hidden;pointer-events:none}.md-autocomplete__loader{display:inline-flex;align-items:center;justify-content:center;inline-size:24px;block-size:24px;--md-loading-indicator-size:var(--md-autocomplete-spinner-size, 22px);--md-loading-indicator-shape-size:var(--md-autocomplete-spinner-size, 22px)}md-menu::part(empty-text){display:flex;justify-content:center;padding:var(--md-sys-spacing-inset-md, 12px) var(--md-sys-spacing-inset-lg, 16px);color:var(--md-sys-color-on-surface-variant);text-align:center}.md-autocomplete__option-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--md-autocomplete-option-icon-color, var(--md-sys-color-on-surface-variant, #49454f));font-size:var(--_option-icon-size);inline-size:var(--_option-icon-size);block-size:var(--_option-icon-size)}.md-autocomplete__listbox{display:block}.md-autocomplete__vspacer{inline-size:100%;pointer-events:none}.md-autocomplete__loading{display:block;padding:var(--md-sys-spacing-inset-md, 12px) var(--md-sys-spacing-inset-lg, 16px);color:var(--_loading-color)}.md-autocomplete__sr-status{position:absolute;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}:host(.md-autocomplete--disabled),:host(.md-autocomplete--soft-disabled){pointer-events:none}:host(.md-autocomplete--soft-disabled) .md-autocomplete__field{pointer-events:auto}@media (prefers-reduced-motion: reduce){.md-autocomplete__caret,.md-autocomplete__clear{transition:none}}@media (forced-colors: active){.md-autocomplete__caret,.md-autocomplete__clear{color:CanvasText}}.material-symbols-outlined{font-family:var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');font-weight:normal;font-style:normal;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;overflow-wrap:normal;direction:ltr;font-feature-settings:'liga';-webkit-font-smoothing:antialiased}:host([density='-1']){--md-sys-density-scale:-1}:host([density='-2']){--md-sys-density-scale:-2}:host([density='-3']){--md-sys-density-scale:-3}:host([density='-4']){--md-sys-density-scale:-4}`;let k=0;const z=200;const M=200;const C=t(class t extends i{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow();this.mdChange=s(this,"mdChange",7);this.mdInput=s(this,"mdInput",7);this.mdOpen=s(this,"mdOpen",7);this.mdClose=s(this,"mdClose",7);this.mdClear=s(this,"mdClear",7);this.mdValidityChange=s(this,"mdValidityChange",5);this.internals=this.attachInternals();this.valueMissingLabel="Please make a selection";this.reserveSupportingSpace=false;this.customValidityMessage="";this.variant="filled";this.label="";this.placeholder="";this.supportingText="";this.error=false;this.errorText="";this.disabled=false;this.softDisabled=false;this.required=false;this.density=0;this.options=[];this.multiple=false;this.chipPosition="below";this.value="";this.inputValue="";this.freeSolo=false;this.maxSelected=0;this.loading=false;this.noOptionsText="No options";this.noResultsText="No results";this.loadingText="Loading…";this.statusTemplate="{count} suggestions available";this.disableCloseOnSelect=false;this.clearOnBlur=false;this.clearable=true;this.clearIcon="close";this.dropdownIcon="arrow_drop_down";this.limitResults=0;this.open=false;this.virtualize="auto";this.filterMode="substring";this.placement="bottom-start";this.matchTriggerWidth=true;this.name="";this.triggerId=`md-autocomplete-${++k}`;this.focused=false;this.optionsData=[];this.labelMap=new Map;this.packing=false;this.typedSinceOpen=false;this.loadGen=0;this.pendingListFocus=null;this.providerSet=false;this.vc=new d({queryItem:t=>this.el.shadowRoot?.querySelector(`md-menu-item[data-vindex="${t}"]`)??null,requestRender:()=>e(this)});this.isSelected=t=>this.selectedArray.includes(t);this.defaultValue="";this.defaultInputValue="";this.lastValidityKey=null;this._syncGuard=false;this._lastEmit=null;this.vpWired=false;this.handleMenuOpen=()=>{this._syncGuard=true;this.open=true;this._syncGuard=false;if(this._lastEmit!=="open"){this._lastEmit="open";this.mdOpen.emit()}if(this.vc.active){this.vc.setQuery(this.query);this.attachMenuViewport()}};this.handleMenuClose=()=>{this._syncGuard=true;this.open=false;this._syncGuard=false;if(this._lastEmit!=="close"){this._lastEmit="close";this.mdClose.emit()}this.typedSinceOpen=false;this.vc.detachViewport();this.vpWired=false;if(!this.multiple&&!this.freeSolo){const t=typeof this.value==="string"&&this.value?this.labelMap.get(this.value)??this.value:"";if(this.inputValue!==t){this.inputValue=t;this.mdInput.emit(t)}}};this.removeChip=t=>i=>{i.stopPropagation();if("preventDefault"in i)i.preventDefault();if(this.disabled||this.softDisabled||!this.multiple)return;this.commitValue(this.selectedArray.filter((i=>i!==t)))};this.handleClear=()=>{if(this.disabled||this.softDisabled)return;this.inputValue="";this.mdInput.emit("");this.typedSinceOpen=false;if(this.vc.active)this.vc.setQuery("");this.commitValue(this.multiple?[]:"");this.mdClear.emit();this.fieldEl?.focus?.()};this.handleFieldInput=t=>{this.applyTyped(t.detail??"")};this.handleListboxKeyDown=t=>{if(t.ctrlKey||t.metaKey||t.altKey)return;const i=t.key.length===1;if(!i&&t.key!=="Backspace")return;t.preventDefault();t.stopPropagation();this.fieldEl?.focus?.();this.applyTyped(t.key==="Backspace"?this.inputValue.slice(0,-1):this.inputValue+t.key)};this.handleFieldKeyDown=t=>{if(this.disabled||this.softDisabled)return;switch(t.key){case"ArrowDown":t.preventDefault();if(!this.open){this.pendingListFocus="first";this.open=true}else{this.firstOptionItem()?.focus()}break;case"ArrowUp":t.preventDefault();if(!this.open){this.pendingListFocus="last";this.open=true}else{const t=this.el.shadowRoot?.querySelectorAll(".md-autocomplete__listbox md-menu-item:not([disabled])");t?.[t.length-1]?.focus()}break;case"Enter":if(this.freeSolo&&this.commitFreeSolo()){t.preventDefault();if(!this.multiple)this.open=false}break;case"Escape":if(this.open){t.preventDefault();this.open=false}break;case"Backspace":if(this.multiple&&!this.inputValue&&this.selectedArray.length>0){this.commitValue(this.selectedArray.slice(0,-1))}break}};this.handleFieldFocus=()=>{this.focused=true};this.handleFieldBlur=()=>{this.focused=false;if(this.open)return;if(this.clearOnBlur&&!this.multiple&&!this.freeSolo){const t=typeof this.value==="string"?this.labelMap.get(this.value):"";if(this.inputValue&&this.inputValue!==t){this.inputValue=t??"";this.mdInput.emit(this.inputValue)}}};this.renderChipItem=t=>o("md-chip",{key:t,part:"chip",exportparts:"remove:chip-remove,label:chip-label",variant:"input",selectable:false,label:this.labelMap.get(t)??t,disabled:this.disabled||this.softDisabled,removable:!this.disabled&&!this.softDisabled,onMdRemove:this.removeChip(t),onClick:t=>t.stopPropagation()})}async focusInput(){this.fieldEl?.focus?.()}async showMenu(){if(this.disabled)return;this.open=true}async closeMenu(){this.open=false}async loadOptions(t){const i=++this.loadGen;if(this.virtualize==="never"||!m()){const i=Array.isArray(t)?t:Array.from({length:t.count},((i,s)=>t.getRow(s)));this.vc.reset();this.optionsData=this.normalize(i);this.refreshLabelMap();return}this.optionsData=[];this.packing=true;try{this.vc.setFixedRowHeight(this.rowHeight);this.vc.setFilterMode(this.filterMode);await this.vc.load(Array.isArray(t)?this.normalize(t):t)}finally{if(i===this.loadGen)this.packing=false}if(i!==this.loadGen)return;if(this.open&&this.typedSinceOpen)this.vc.setQuery(this.query);this.refreshLabelMap();e(this)}async getLabels(t){if(this.vc.active)return Object.fromEntries(this.vc.getLabels(t));const i={};for(const s of t)i[s]=this.labelMap.get(s)??s;return i}normalize(t){return t.map((t=>({value:t.value,label:t.label??t.value,disabled:!!t.disabled,icon:t.icon,iconColor:t.iconColor,supportingText:t.supportingText??t.description,selected:!!t.selected})))}get optionList(){const t=this.options;if(Array.isArray(t))return t;if(typeof t==="string"&&t.trim()){try{const i=JSON.parse(t);return Array.isArray(i)?i:[]}catch{if(typeof console!=="undefined"){console.warn("[md-autocomplete] `options` attribute is not valid JSON:",t)}return[]}}return[]}refreshOptions(){const t=u(this.el,[]);const i=t.length>0?t:this.normalize(this.optionList);const s=this.virtualize==="always"||this.virtualize==="auto"&&i.length>z;const o=++this.loadGen;if(s&&m()&&i.length>0){this.optionsData=[];this.packing=true;this.vc.setFixedRowHeight(this.rowHeight);this.vc.setFilterMode(this.filterMode);void this.vc.load(i).then((t=>{if(o!==this.loadGen)return;if(!t){this.optionsData=i}this.packing=false;if(t&&this.open&&this.typedSinceOpen)this.vc.setQuery(this.query);this.refreshLabelMap();e(this)}))}else{this.vc.reset();this.optionsData=i;this.refreshLabelMap()}}onOptionChange(t){t.stopPropagation();this.refreshOptions()}get busy(){return this.loading||this.packing}get selectedArray(){if(this.multiple)return Array.isArray(this.value)?this.value:[];if(typeof this.value==="string"&&this.value)return[this.value];return[]}get query(){return this.typedSinceOpen?this.inputValue.trim():""}get filteredOptions(){const t=this.selectedArray;const i={inputValue:this.query,selected:t};let s=this.filterer?this.filterer(this.optionsData,i):this.defaultFilter(this.optionsData,i);if(this.limitResults>0)s=s.slice(0,this.limitResults);return s}defaultFilter(t,i){const s=i.inputValue.toLowerCase();if(!s)return t;return t.filter((t=>t.label.toLowerCase().includes(s)||t.value.toLowerCase().includes(s)||(t.supportingText?.toLowerCase().includes(s)??false)))}refreshLabelMap(){const t=this.selectedArray;if(t.length===0){if(this.labelMap.size)this.labelMap=new Map;return}const i=new Map;if(this.vc.active){const s=this.vc.getLabels(t);for(const e of t){i.set(e,s.get(e)??this.labelMap.get(e)??e)}}else{for(const s of t){const t=this.optionsData.find((t=>t.value===s));i.set(s,t?.label??this.labelMap.get(s)??s)}}this.labelMap=i}componentWillLoad(){this.refreshOptions();this.defaultValue=Array.isArray(this.value)?[...this.value]:this.value;this.defaultInputValue=this.inputValue;this.syncFormValue()}componentDidLoad(){if(this.open&&!this.disabled){void this.menuEl?.show?.({autoFocus:false});this.mdOpen.emit()}}disconnectedCallback(){clearTimeout(this.searchDebounce);this.vc.detachViewport()}formResetCallback(){this.value=Array.isArray(this.defaultValue)?[...this.defaultValue]:this.defaultValue;this.inputValue=this.defaultInputValue;this.typedSinceOpen=false;clearTimeout(this.searchDebounce);if(this.vc.active)this.vc.setQuery("")}syncFormValue(){this.updateValidity();this.refreshLabelMap();if(!this.multiple&&!this.open){const t=typeof this.value==="string"&&this.value?this.labelMap.get(this.value)??this.value:"";if(this.inputValue!==t)this.inputValue=t}if(this.multiple){const t=this.selectedArray;if(!t.length){r(this.internals,null);return}const i=new FormData;for(const s of t)i.append(this.name||"",s);r(this.internals,i);return}const t=typeof this.value==="string"?this.value:"";r(this.internals,t||null)}onMultipleFlip(){if(this.multiple){if(typeof this.value==="string")this.value=this.value?[this.value]:[];else this.syncFormValue()}else{if(Array.isArray(this.value))this.value=this.value[0]??"";else this.syncFormValue()}}updateValidity(){if(!this.internals?.setValidity)return;if(this.customValidityMessage){this.internals.setValidity({customError:true},this.customValidityMessage,this.fieldEl??this.el)}else if(this.required&&this.selectedArray.length===0){this.internals.setValidity({valueMissing:true},this.errorText||this.valueMissingLabel,this.fieldEl??this.el)}else{this.internals.setValidity({})}this.emitValidityChange()}async getValidity(){return l(this.internals)}emitValidityChange(){const t=l(this.internals);const i=`${t.valid}|${t.validationMessage}`;if(this.lastValidityKey===i)return;const s=this.lastValidityKey!==null;this.lastValidityKey=i;if(s)this.mdValidityChange.emit(t)}async checkValidity(){return c(this.internals)}async reportValidity(){return p(this.internals)}async setCustomValidity(t){this.customValidityMessage=t;this.updateValidity()}syncMenu(t){if(this._syncGuard||!this.menuEl)return;if(t){this.menuEl.show?.({autoFocus:false})}else{this.menuEl.close?.()}}attachMenuViewport(){void(async()=>{const t=await(this.menuEl?.getScrollViewport?.())??null;if(!t||this.vpWired)return;this.vpWired=true;await this.vc.attachViewport((async()=>t))})()}componentDidRender(){void this.syncComboboxRefs();if(!this.menuEl)return;if(this.vc.active&&!this.providerSet){void this.menuEl.setVirtualProvider?.(this.vc.provider);this.providerSet=true}else if(!this.vc.active&&this.providerSet){void this.menuEl.setVirtualProvider?.(null);this.providerSet=false}if(this.open&&this.vc.active&&!this.vpWired)this.attachMenuViewport();if(this.pendingListFocus&&this.open){const t=this.el.shadowRoot?.querySelectorAll(".md-autocomplete__listbox md-menu-item:not([disabled])");const i=this.pendingListFocus==="first"?t?.[0]:t?.[t.length-1];if(i){this.pendingListFocus=null;i.focus()}}else if(this.pendingListFocus&&!this.open){this.pendingListFocus=null}}async syncComboboxRefs(){const t=this.fieldEl;const i=await(t?.getInputElement?.());if(!i||!("ariaControlsElements"in i))return;const s=this.el.shadowRoot?.querySelector('[role="listbox"]');const e=this.open&&s?[s]:null;const o=i.ariaControlsElements;if(!e&&!o?.length)return;if(e&&o?.length===1&&o[0]===e[0])return;i.ariaControlsElements=e}commitValue(t){this.value=t;this.mdChange.emit(t)}pick(t,i,s,e){e?.stopPropagation();if(s)return;if(this.multiple){const s=this.selectedArray;const o=s.includes(t);const a=!o&&this.maxSelected>0&&s.length>=this.maxSelected;if(a){const t=e?.target;if(t)t.selected=false;return}this.labelMap=new Map(this.labelMap).set(t,i);const n=o?s.filter((i=>i!==t)):[...s,t];this.commitValue(n);this.inputValue="";this.mdInput.emit("");this.typedSinceOpen=false;if(this.vc.active)this.vc.setQuery("");this.fieldEl?.focus?.()}else{this.labelMap=new Map(this.labelMap).set(t,i);this.commitValue(t);this.inputValue=i;this.mdInput.emit(i);this.typedSinceOpen=false;if(this.vc.active)this.vc.setQuery("");if(!this.disableCloseOnSelect)this.open=false;this.fieldEl?.focus?.()}}commitFreeSolo(){if(!this.freeSolo)return false;const t=this.inputValue.trim();if(!t)return false;if(this.multiple){const i=this.selectedArray;if(i.includes(t))return true;if(this.maxSelected>0&&i.length>=this.maxSelected)return false;this.labelMap=new Map(this.labelMap).set(t,t);this.commitValue([...i,t]);this.inputValue="";this.mdInput.emit("")}else{this.commitValue(t)}return true}applyTyped(t){this.inputValue=t;this.typedSinceOpen=true;this.mdInput.emit(t);if(!this.open)this.open=true;if(this.vc.active){clearTimeout(this.searchDebounce);this.searchDebounce=setTimeout((()=>{this.vc.setQuery(this.query)}),M)}}firstOptionItem(){return this.el.shadowRoot?.querySelector(".md-autocomplete__listbox md-menu-item:not([disabled])")??null}get inlineChips(){return this.multiple&&this.chipPosition==="inline"}renderChips(){if(!this.multiple||this.inlineChips)return null;const t=this.selectedArray;if(t.length===0)return null;return o("div",{class:"md-autocomplete__chips",part:"chips",role:"group","aria-label":this.label?`${this.label} — selected`:"Selected"},t.map(this.renderChipItem))}renderInlineChips(){if(!this.inlineChips)return null;const t=this.selectedArray;if(t.length===0)return null;return o("div",{slot:"chips",class:"md-autocomplete__inline-chips",part:"chips",role:"group","aria-label":this.label?`${this.label} — selected`:"Selected"},t.map(this.renderChipItem))}renderClearButton(t=false){if(!this.clearable)return null;const i=this.multiple?this.selectedArray.length>0:!!this.inputValue||!!this.value;const s=t||!i;return o("md-icon-button",{class:{"md-autocomplete__clear":true,"md-autocomplete__clear--hidden":s},slot:"trailing-icon",part:"clear",variant:"standard",size:"xs",icon:this.clearIcon,"aria-label":"Clear value","aria-hidden":s?"true":undefined,onClick:t=>{t.stopPropagation();this.handleClear()}})}renderTrigger(){return o("md-text-field",{ref:t=>this.fieldEl=t,id:this.triggerId,class:"md-autocomplete__field",part:"field",variant:this.variant,label:this.label,placeholder:this.placeholder,value:this.inputValue,disabled:this.disabled,error:this.error,errorText:this.errorText,reserveSupportingSpace:this.reserveSupportingSpace,supportingText:this.supportingText,required:this.required,density:this.density,appearFocused:this.open||this.focused,"aria-haspopup":"listbox",inputRole:"combobox",inputExpanded:this.open,inputAriaAutocomplete:"list",chipsWrap:this.inlineChips,onMdInput:this.handleFieldInput,onClick:()=>{if(!this.disabled&&!this.softDisabled&&!this.open)this.open=true},onKeyDown:this.handleFieldKeyDown,onFocus:this.handleFieldFocus,onBlur:this.handleFieldBlur},this.renderInlineChips(),this.busy?[this.renderClearButton(true),o("span",{slot:"trailing-icon",class:"md-autocomplete__loader",part:"loading-spinner"},o("slot",{name:"loader"},o(h,{label:this.loadingText})))]:[this.renderClearButton(),o("span",{slot:"trailing-icon",class:"md-autocomplete__caret material-symbols-outlined",part:"caret","aria-hidden":"true",onClick:t=>{t.stopPropagation();if(!this.disabled&&!this.softDisabled)this.open=!this.open}},o("slot",{name:"dropdown-icon"},this.dropdownIcon))])}renderOptionIcon(t,i){if(!t)return null;return o("span",{slot:"leading-icon",part:"option-icon",class:"material-symbols-outlined md-autocomplete__option-icon",style:i?{color:i}:undefined,"aria-hidden":"true"},t)}renderVirtualOptions(){return o("div",{class:"md-autocomplete__listbox",role:"listbox",id:`${this.triggerId}-listbox`,"aria-label":this.label||"Options","aria-multiselectable":this.multiple?"true":undefined,onKeyDown:this.handleListboxKeyDown},o("div",{class:"md-autocomplete__vspacer",style:{height:`${this.vc.topPad}px`},"aria-hidden":"true"}),this.vc.windowRows.map(((t,i)=>{const s=this.vc.windowStart+i;const e=this.isSelected(t.value);return o("md-menu-item",{key:t.index,id:`${this.triggerId}-opt-${s}`,"data-vindex":s,presentation:"option",type:this.multiple?"checkbox":"radio","check-position":"start","keep-open":true,part:e?"option option-selected":"option",disabled:t.disabled,selected:e,headline:t.label,"supporting-text":t.supportingText||"","aria-setsize":this.vc.filteredLength,"aria-posinset":s+1,onMdClick:i=>this.pick(t.value,t.label,t.disabled,i)},this.renderOptionIcon(t.icon||undefined))})),o("div",{class:"md-autocomplete__vspacer",style:{height:`${this.vc.bottomPad}px`},"aria-hidden":"true"}))}renderMenu(){const t=this.vc.active;const i=t?[]:this.filteredOptions;const s=t?false:this.optionsData.length===0;const e=this.busy?"":t?this.vc.filteredLength===0?this.noResultsText:"":s?this.noOptionsText:i.length===0?this.noResultsText:"";const a=t?this.maxHeight??320:this.maxHeight;return o("md-menu",{ref:t=>this.menuEl=t,anchor:this.triggerId,placement:this.placement,"match-anchor-width":this.matchTriggerWidth,"max-height":a,persistent:this.disableCloseOnSelect,"empty-text":e,"auto-focus":false,listbox:true,"list-label":this.label||"Options",part:"menu",onMdOpen:this.handleMenuOpen,onMdClose:this.handleMenuClose},this.busy?o("div",{class:"md-autocomplete__loading",part:"loading",role:"status","aria-label":this.loadingText},o("md-progress-indicator",{variant:"linear",indeterminate:true,wave:true,part:"loading-progress",label:this.loadingText})):t?this.renderVirtualOptions():o("div",{class:"md-autocomplete__listbox",role:"listbox",id:`${this.triggerId}-listbox`,"aria-label":this.label||"Options","aria-multiselectable":this.multiple?"true":undefined,onKeyDown:this.handleListboxKeyDown},i.map(((t,i)=>o("md-menu-item",{key:t.value,id:`${this.triggerId}-opt-${i}`,presentation:"option",type:this.multiple?"checkbox":"radio","check-position":"start","keep-open":true,part:this.isSelected(t.value)?"option option-selected":"option",disabled:t.disabled,selected:this.isSelected(t.value),headline:t.label,"supporting-text":t.supportingText||"",onMdClick:i=>this.pick(t.value,t.label,t.disabled,i)},this.renderOptionIcon(t.icon,t.iconColor))))))}render(){const t=this.multiple&&(this.chipPosition==="top"||this.chipPosition==="left");const i=this.vc.active?this.vc.filteredLength:this.filteredOptions.length;const s=this.busy?this.loadingText:this.open?this.statusTemplate.replace("{count}",String(i)):"";return o(a,{key:"95493b711c8d67c0ad5156af5d6b406757003260",class:{"md-autocomplete":true,[`md-autocomplete--${this.variant}`]:true,"md-autocomplete--open":this.open,"md-autocomplete--disabled":this.disabled,"md-autocomplete--soft-disabled":this.softDisabled,"md-autocomplete--multiple":this.multiple,"md-autocomplete--loading":this.busy,[`md-autocomplete--chips-${this.chipPosition}`]:this.multiple},"aria-haspopup":"listbox","aria-busy":this.busy?"true":"false"},t&&this.renderChips(),this.renderTrigger(),!t&&this.renderChips(),this.renderMenu(),o("span",{key:"0f2678b39bb9644696e625623111d5ea73b7a7fa",class:"md-autocomplete__sr-status",role:"status","aria-live":"polite"},s))}static get formAssociated(){return true}get el(){return this}static get watchers(){return{options:[{refreshOptions:0}],value:[{syncFormValue:0}],multiple:[{onMultipleFlip:0}],required:[{updateValidity:0}],valueMissingLabel:[{updateValidity:0}],open:[{syncMenu:0}]}}static get style(){return w()}},[321,"md-autocomplete",{valueMissingLabel:[1,"value-missing-label"],reserveSupportingSpace:[4,"reserve-supporting-space"],variant:[513],label:[1],placeholder:[1],supportingText:[1,"supporting-text"],error:[516],errorText:[1,"error-text"],disabled:[516],softDisabled:[516,"soft-disabled"],required:[516],density:[514],options:[1],multiple:[516],chipPosition:[513,"chip-position"],value:[1025],inputValue:[1025,"input-value"],freeSolo:[516,"free-solo"],maxSelected:[2,"max-selected"],loading:[516],noOptionsText:[1,"no-options-text"],noResultsText:[1,"no-results-text"],loadingText:[1,"loading-text"],statusTemplate:[1,"status-template"],disableCloseOnSelect:[516,"disable-close-on-select"],clearOnBlur:[516,"clear-on-blur"],clearable:[516],clearIcon:[1,"clear-icon"],dropdownIcon:[1,"dropdown-icon"],limitResults:[2,"limit-results"],open:[1540],filterer:[16],virtualize:[1],filterMode:[1,"filter-mode"],rowHeight:[2,"row-height"],placement:[1],matchTriggerWidth:[4,"match-trigger-width"],maxHeight:[2,"max-height"],name:[513],triggerId:[32],focused:[32],optionsData:[32],labelMap:[32],packing:[32],focusInput:[64],showMenu:[64],closeMenu:[64],loadOptions:[64],getLabels:[64],getValidity:[64],checkValidity:[64],reportValidity:[64],setCustomValidity:[64]},[[0,"mdSelectOptionChange","onOptionChange"]],{options:[{refreshOptions:0}],value:[{syncFormValue:0}],multiple:[{onMultipleFlip:0}],required:[{updateValidity:0}],valueMissingLabel:[{updateValidity:0}],open:[{syncMenu:0}]}]);function V(){if(typeof customElements==="undefined"){return}const t=["md-autocomplete","md-chip","md-icon-button","md-menu","md-menu-item","md-progress-indicator","md-ripple","md-text-field"];t.forEach((t=>{switch(t){case"md-autocomplete":if(!customElements.get(n(t))){customElements.define(n(t),C)}break;case"md-chip":if(!customElements.get(n(t))){f()}break;case"md-icon-button":if(!customElements.get(n(t))){g()}break;case"md-menu":if(!customElements.get(n(t))){y()}break;case"md-menu-item":if(!customElements.get(n(t))){b()}break;case"md-progress-indicator":if(!customElements.get(n(t))){v()}break;case"md-ripple":if(!customElements.get(n(t))){_()}break;case"md-text-field":if(!customElements.get(n(t))){x()}break}}))}V();const O=C;const T=V;export{O as MdAutocomplete,T as defineCustomElement};
|
|
2
|
+
//# sourceMappingURL=md-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["mdAutocompleteCss","autocompleteIdCounter","VIRTUALIZE_THRESHOLD","SEARCH_DEBOUNCE_MS","MdAutocomplete","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","valueMissingLabel","reserveSupportingSpace","customValidityMessage","variant","label","placeholder","supportingText","error","errorText","disabled","softDisabled","required","density","options","multiple","chipPosition","value","inputValue","freeSolo","maxSelected","loading","noOptionsText","noResultsText","loadingText","statusTemplate","disableCloseOnSelect","clearOnBlur","clearable","clearIcon","dropdownIcon","limitResults","open","virtualize","filterMode","placement","matchTriggerWidth","name","triggerId","focused","optionsData","labelMap","Map","packing","typedSinceOpen","loadGen","pendingListFocus","providerSet","vc","VirtualSelectController","queryItem","i","el","shadowRoot","querySelector","requestRender","forceUpdate","isSelected","val","selectedArray","includes","defaultValue","defaultInputValue","lastValidityKey","_syncGuard","_lastEmit","vpWired","handleMenuOpen","mdOpen","emit","active","setQuery","query","attachMenuViewport","handleMenuClose","mdClose","detachViewport","committed","get","mdInput","removeChip","e","stopPropagation","preventDefault","commitValue","filter","v","handleClear","mdClear","fieldEl","focus","handleFieldInput","applyTyped","detail","handleListboxKeyDown","ctrlKey","metaKey","altKey","isPrintable","key","length","slice","handleFieldKeyDown","firstOptionItem","all","querySelectorAll","commitFreeSolo","handleFieldFocus","handleFieldBlur","renderChipItem","h","part","exportparts","selectable","removable","onMdRemove","onClick","focusInput","showMenu","closeMenu","loadOptions","source","gen","isWasmSupported","rows","Array","isArray","from","count","_","getRow","reset","normalize","refreshLabelMap","setFixedRowHeight","rowHeight","setFilterMode","load","getLabels","values","Object","fromEntries","out","list","map","o","icon","iconColor","description","selected","optionList","raw","trim","parsed","JSON","parse","console","warn","refreshOptions","slotted","collectOptions","data","shouldVirtualize","then","ok","onOptionChange","busy","filteredOptions","state","results","filterer","defaultFilter","q","toLowerCase","size","next","resolved","set","opt","find","componentWillLoad","syncFormValue","componentDidLoad","menuEl","show","autoFocus","disconnectedCallback","clearTimeout","searchDebounce","formResetCallback","updateValidity","setFormValue","internals","FormData","append","single","onMultipleFlip","setValidity","customError","valueMissing","emitValidityChange","getValidity","getValidityOf","valid","validationMessage","primed","mdValidityChange","checkValidity","checkValidityOf","reportValidity","reportValidityOf","setCustomValidity","message","syncMenu","close","vp","getScrollViewport","attachViewport","async","componentDidRender","syncComboboxRefs","setVirtualProvider","provider","target","field","input","getInputElement","listbox","current","ariaControlsElements","mdChange","pick","exists","blocked","item","setTimeout","inlineChips","renderChips","class","role","renderInlineChips","slot","renderClearButton","forceHidden","hasValue","hidden","undefined","renderTrigger","ref","id","appearFocused","inputRole","inputExpanded","inputAriaAutocomplete","chipsWrap","onMdInput","onKeyDown","onFocus","onBlur","LazyLoadingIndicator","renderOptionIcon","style","color","renderVirtualOptions","height","topPad","windowRows","row","filteredIndex","windowStart","index","presentation","type","headline","filteredLength","onMdClick","bottomPad","renderMenu","virtual","filtered","datasetEmpty","emptyText","menuMaxHeight","maxHeight","anchor","persistent","onMdOpen","onMdClose","indeterminate","wave","render","chipsFirst","optionCount","srStatus","replace","String","Host"],"sources":["src/components/md-autocomplete/md-autocomplete.css?tag=md-autocomplete&encapsulation=shadow","src/components/md-autocomplete/md-autocomplete.tsx"],"sourcesContent":["/* ==========================================================\n md-autocomplete — Material Design 3 free-text + filterable\n dropdown. Composes md-text-field + md-menu.\n\n PUBLIC CSS CUSTOM PROPERTIES (override per-instance):\n --md-autocomplete-width Trigger width (default 100% of container)\n --md-autocomplete-min-width Minimum trigger width\n --md-autocomplete-chip-gap Gap between selected chips\n --md-autocomplete-chip-radius Chip corner radius\n --md-autocomplete-caret-color Trailing caret color\n --md-autocomplete-caret-size Caret glyph size (default 24px)\n --md-autocomplete-clear-color Clear button color\n --md-autocomplete-option-icon-size Leading-icon size in items\n --md-autocomplete-loading-color Color of the loading row\n --md-autocomplete-spinner-size Trigger busy-spinner size (default 22px)\n\n CSS PARTS:\n field Inner md-text-field\n chips Selected chips container\n caret Trailing dropdown caret\n clear Trailing clear button\n menu Popup md-menu\n loading Loading row inside the menu\n loading-spinner Trigger busy spinner (replaces clear/caret)\n\n SLOTS:\n loader Replaces the default trigger busy spinner\n dropdown-icon Replaces the caret glyph\n ========================================================== */\n\n:host {\n /* The text inset already includes the caret's 7px optical bearing (see\n md-text-field --_text-inset). Pull the TRAILING side back to the plain\n box inset so the caret's BOX sits 7px shallower and its INK lands on the\n same column as the text. */\n --md-text-field-padding-inline-end: var(--md-sys-spacing-inset-lg, 16px);\n --_min-width: var(--md-autocomplete-min-width, 220px);\n --_chip-gap: var(--md-autocomplete-chip-gap, var(--md-sys-spacing-gap-xs, 4px));\n --_chip-radius: var(--md-autocomplete-chip-radius, 8px);\n --_caret-color: var(--md-autocomplete-caret-color, var(--md-sys-color-on-surface-variant));\n --_clear-color: var(--md-autocomplete-clear-color, var(--md-sys-color-on-surface-variant));\n --_option-icon-size: var(--md-autocomplete-option-icon-size, 20px);\n --_loading-color: var(--md-autocomplete-loading-color, var(--md-sys-color-on-surface-variant));\n\n /* Fill the container (like md-select) — the trigger width must come from\n layout, never from the typed text (a shrink-to-fit inline-block would\n grow/shrink with the input's content). Flex column so chip-position can\n reorder the chips around the field. */\n display: inline-flex;\n flex-direction: column;\n inline-size: var(--md-autocomplete-width, 100%);\n min-inline-size: var(--_min-width);\n box-sizing: border-box;\n vertical-align: bottom;\n position: relative;\n}\n\n/* ── Chip positions around the field ───────────────────────── */\n\n:host(.md-autocomplete--chips-top) .md-autocomplete__chips {\n /* DOM order puts the chips first for top/left (focus + reading order must\n match the visual order) — no CSS `order` reshuffling. */\n margin-block-start: 0;\n margin-block-end: var(--md-sys-spacing-inset-sm, 8px);\n}\n\n:host(.md-autocomplete--chips-left),\n:host(.md-autocomplete--chips-right) {\n flex-direction: row;\n align-items: center;\n gap: var(--md-sys-spacing-gap-sm, 8px);\n}\n\n:host(.md-autocomplete--chips-left) .md-autocomplete__field,\n:host(.md-autocomplete--chips-right) .md-autocomplete__field {\n flex: 1 1 auto;\n inline-size: auto;\n min-inline-size: 0;\n}\n\n:host(.md-autocomplete--chips-left) .md-autocomplete__chips,\n:host(.md-autocomplete--chips-right) .md-autocomplete__chips {\n /* Beside the field: bounded content width (contain would collapse a row\n flex item to zero), wrapping within it. */\n contain: none;\n flex: 0 1 auto;\n max-inline-size: 50%;\n margin-block-start: 0;\n}\n\n\n.md-autocomplete__field {\n display: block;\n inline-size: 100%;\n}\n\n.md-autocomplete__chips {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--_chip-gap);\n max-inline-size: 100%;\n margin-block-start: var(--md-sys-spacing-inset-sm, 8px);\n /* Chips must not contribute intrinsic width: in a shrink-to-fit layout the\n row's max-content (all chips on one line) would widen the whole host as\n the selection grows. Contained, the trigger field alone sizes the host\n and the chips wrap within it. */\n contain: inline-size;\n}\n\n.md-autocomplete__chips md-chip {\n --md-chip-container-shape: var(--_chip-radius);\n}\n\n/* Chips INSIDE the field (chip-position=\"inline\"): slotted into md-text-field's\n `chips` slot with chips-wrap — they wrap onto new rows and the field grows. */\n.md-autocomplete__inline-chips {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--_chip-gap);\n min-inline-size: 0;\n overflow: visible;\n}\n\n.md-autocomplete__inline-chips md-chip {\n --md-chip-container-shape: var(--_chip-radius);\n flex-shrink: 0;\n}\n\n/* ── Trailing controls (caret + clear) ─────────────────────── */\n\n.md-autocomplete__caret {\n color: var(--_caret-color);\n /* Match the selects: 24px glyph, 200ms/standard rotation (see md-select.css). */\n font-size: var(--md-autocomplete-caret-size, 24px);\n line-height: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 24px;\n block-size: 24px;\n cursor: pointer;\n transition: transform var(--md-sys-motion-duration-short4, 200ms)\n var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n\n:host(.md-autocomplete--open) .md-autocomplete__caret {\n transform: rotate(180deg);\n}\n\n/* The clear affordance is an md-icon-button (ring/ripple/a11y for free);\n sized down to sit inside the field's trailing cluster. */\n.md-autocomplete__clear {\n --md-icon-button-container-width: 28px;\n --md-icon-button-container-height: 28px;\n --md-icon-button-icon-size: 18px;\n color: var(--_clear-color);\n margin-inline-end: 2px;\n}\n\n/* Space stays reserved; the button is just invisible + inert while there is\n nothing to clear (visibility also drops it from the tab order / AT). */\n.md-autocomplete__clear--hidden {\n visibility: hidden;\n pointer-events: none;\n}\n\n/* Busy state: trigger spinner replacing the clear/caret cluster (see the\n selects — same sizing convention). */\n.md-autocomplete__loader {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 24px;\n block-size: 24px;\n --md-loading-indicator-size: var(--md-autocomplete-spinner-size, 22px);\n --md-loading-indicator-shape-size: var(--md-autocomplete-spinner-size, 22px);\n}\n\n/* ── Menu styling ──────────────────────────────────────────── */\n\n/* Centred, like the selects' empty states. */\nmd-menu::part(empty-text) {\n display: flex;\n justify-content: center;\n padding: var(--md-sys-spacing-inset-md, 12px) var(--md-sys-spacing-inset-lg, 16px);\n color: var(--md-sys-color-on-surface-variant);\n text-align: center;\n}\n\n.md-autocomplete__option-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--md-autocomplete-option-icon-color, var(--md-sys-color-on-surface-variant, #49454f));\n font-size: var(--_option-icon-size);\n inline-size: var(--_option-icon-size);\n block-size: var(--_option-icon-size);\n}\n\n/* Listbox wrapper (plain + virtualized) — the spacers preserve the full\n scroll height around the rendered window. */\n.md-autocomplete__listbox {\n display: block;\n}\n\n.md-autocomplete__vspacer {\n inline-size: 100%;\n pointer-events: none;\n}\n\n.md-autocomplete__loading {\n display: block;\n padding: var(--md-sys-spacing-inset-md, 12px) var(--md-sys-spacing-inset-lg, 16px);\n color: var(--_loading-color);\n}\n\n/* Visually-hidden polite status region (expanded count / busy). */\n.md-autocomplete__sr-status {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/* ── Disabled ──────────────────────────────────────────────── */\n\n:host(.md-autocomplete--disabled),\n:host(.md-autocomplete--soft-disabled) {\n pointer-events: none;\n}\n\n:host(.md-autocomplete--soft-disabled) .md-autocomplete__field {\n pointer-events: auto;\n}\n\n/* ── RTL ────────────────────────────────────────────────────── */\n\n/* ── Reduced motion ────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .md-autocomplete__caret,\n .md-autocomplete__clear {\n transition: none;\n }\n}\n\n/* ── Forced colors (Windows High Contrast) ─────────────────── */\n\n@media (forced-colors: active) {\n .md-autocomplete__caret,\n .md-autocomplete__clear {\n color: CanvasText;\n }\n}\n\n/* ── Material Symbols font (shadow-root scope) ─────────────── */\n\n/* Caret, clear, and option icons render inside our shadow root\n (even when slotted into nested md-text-field / md-menu-item),\n so they need the font-family declared locally — shadow DOM\n does not inherit page-level CSS class rules. */\n.material-symbols-outlined {\n font-family: var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n overflow-wrap: normal;\n direction: ltr;\n font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n/* ==========================================================\n DENSITY (local override)\n This component FORWARDS `density` to the md-text-field it embeds, which\n handles the field box — but that forward says nothing about this host, so its\n OWN chrome (dropdown surface, chips, frame gaps) stayed at density-0 whenever\n density came from the local prop rather than a global ancestor. Mapping the\n prop onto the shared signal here fixes that asymmetry; the spacing-token half\n of the rung arrives from the [density=\"-N\"] selector in tokens.css.\n ========================================================== */\n:host([density='-1']) { --md-sys-density-scale: -1; }\n:host([density='-2']) { --md-sys-density-scale: -2; }\n:host([density='-3']) { --md-sys-density-scale: -3; }\n:host([density='-4']) { --md-sys-density-scale: -4; }\n","import { AttachInternals, Component, Element, Event, EventEmitter, Host, Listen, Method, Prop, State, Watch, forceUpdate, h } from '@stencil/core';\nimport { LazyLoadingIndicator } from '../../utils/lazy-loading-indicator';\nimport { setFormValue, checkValidityOf, reportValidityOf, getValidityOf } from '../../utils/form';\nimport {\n collectOptions,\n SelectOptionData,\n SelectOptionInit,\n OptionRowSource,\n} from '../../utils/select-options';\nimport { VirtualSelectController } from '../../utils/virtual-select-controller';\nimport { isWasmSupported, FilterMode } from '../../utils/wasm-option-store';\n\nlet autocompleteIdCounter = 0;\n\n/** Above this many options, `virtualize=\"auto\"` switches to the WASM path. */\nconst VIRTUALIZE_THRESHOLD = 200;\n\n/** Idle time after a keystroke before the virtualized query runs (debounce). */\nconst SEARCH_DEBOUNCE_MS = 200;\n\n/**\n * Programmatic option entry. Extends the shared select model with a\n * legacy `description` alias for `supportingText`.\n */\nexport interface MdAutocompleteOption extends SelectOptionInit {\n /** @deprecated Use `supportingText`. */\n description?: string;\n}\n\ninterface VirtualMenuEl extends HTMLElement {\n show?: (opts?: { autoFocus?: boolean }) => Promise<void>;\n close?: () => Promise<void>;\n setVirtualProvider?: (p: unknown | null) => Promise<void>;\n getScrollViewport?: () => Promise<HTMLElement | null>;\n}\n\n/**\n * `md-autocomplete` — Material Design 3 combobox: a text field that filters\n * a dropdown listbox **as you type in the input** (no separate search row),\n * with single or multiple (chips) selection.\n *\n * Built from the same primitives as `md-select` / `md-multi-select`:\n * - the shared option model (`options` array of `{ value, label,\n * supportingText?, icon?, iconColor?, disabled? }` or slotted\n * `<md-select-option>` children),\n * - `md-text-field` for the trigger (typing filters live),\n * - `md-menu` as a WAI-ARIA listbox popup (options carry `aria-selected`),\n * - `VirtualSelectController` for WASM-virtualized huge datasets\n * (`virtualize`, `loadOptions()`, `filter-mode`) — the same engine as\n * the selects, so tens of thousands of rows filter smoothly.\n *\n * Keyboard: typing filters; ArrowDown moves focus into the listbox (the\n * focus-moves-into-popup combobox variant — option focus is announced\n * directly); Enter selects; Escape closes back to the input; Backspace on an\n * empty multi input removes the last chip.\n *\n * ARIA: the real textbox — the `<input>` inside md-text-field's shadow root —\n * is promoted to `role=\"combobox\"` with `aria-expanded` / `aria-autocomplete`\n * (handed over via `input-role`, since only that component renders the input),\n * and points at this component's listbox through ARIA element reflection. An\n * IDREF could not: it would have to resolve inside md-text-field's tree, where\n * the listbox is not. See `syncComboboxRefs`.\n *\n * Extras kept from the surface this API mirrors: `free-solo` (commit arbitrary text),\n * `max-selected`, `clearable`, `disable-close-on-select`, `clear-on-blur`,\n * a custom `filterer` and `limit-results` (client-side path only).\n */\n@Component({\n tag: 'md-autocomplete',\n styleUrl: 'md-autocomplete.css',\n shadow: true,\n formAssociated: true,\n})\nexport class MdAutocomplete {\n @Element() el!: HTMLElement;\n\n\n /**\n * Localized constraint-validation message shown when `required` is unmet.\n * `errorText` still wins when set, so an app-supplied inline message and the\n * native bubble stay in agreement.\n */\n @Prop({ attribute: 'value-missing-label' }) valueMissingLabel: string = 'Please make a selection';\n\n\n /**\n * Always occupy the supporting-text line, even when there is no message, so a\n * validation error does not push the content below it down. Forwarded to the\n * embedded md-text-field. See that component for why it is opt-in.\n */\n @Prop({ attribute: 'reserve-supporting-space' }) reserveSupportingSpace: boolean = false;\n\n /** Message set via setCustomValidity(); non-empty wins over valueMissing. */\n private customValidityMessage = '';\n\n /**\n * Form-association handle. The selection is submitted under the host's\n * `name` via `setFormValue` (a single string, or repeated pairs when\n * `multiple`), so the control participates in `<form>`/`FormData` natively.\n */\n @AttachInternals() internals!: ElementInternals;\n\n /** Visual variant of the inner text-field. */\n @Prop({ reflect: true }) variant: 'filled' | 'outlined' = 'filled';\n\n /** Floating label / accessible name. */\n @Prop() label: string = '';\n\n /** Placeholder for the input. */\n @Prop() placeholder: string = '';\n\n /** Supporting / helper text below the field. */\n @Prop({ attribute: 'supporting-text' }) supportingText: string = '';\n\n /** Error state — forwarded to the text-field. */\n @Prop({ reflect: true }) error: boolean = false;\n\n /** Error text rendered in place of supporting text when `error` is true. */\n @Prop({ attribute: 'error-text' }) errorText: string = '';\n\n /** Disabled — non-interactive. */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /** Soft-disabled — focusable but non-interactive. */\n @Prop({ reflect: true, attribute: 'soft-disabled' }) softDisabled: boolean = false;\n\n /** Required for native form parity. */\n @Prop({ reflect: true }) required: boolean = false;\n\n /** Density forwarded to the text-field. */\n @Prop({ reflect: true }) density: 0 | -1 | -2 | -3 | -4 = 0;\n\n /**\n * Programmatic options (shared select model; `description` is accepted as\n * a legacy alias for `supportingText`). Slotted `<md-select-option>`\n * children take precedence when present.\n *\n * Accepts either the array (property) or a **JSON string** (attribute), the\n * same contract `md-organization-chart.nodes` uses — so a plain-HTML page can\n * declare its dataset inline instead of reaching for a script:\n *\n * <md-autocomplete options='[{\"value\":\"a\",\"label\":\"Apple\"}]'></md-autocomplete>\n *\n * Malformed JSON degrades to an empty list rather than throwing: a broken\n * attribute must not take the whole field down.\n */\n @Prop() options: MdAutocompleteOption[] | string = [];\n\n /** Multi-select mode — the selection renders as removable chips. */\n @Prop({ reflect: true }) multiple: boolean = false;\n\n /** Where the selection chips live (`multiple` only): around the field\n * (`'below'` default, `'top'`, `'left'`, `'right'`) or `'inline'` inside\n * it, before the input, wrapping onto new rows as the selection grows\n * (the field grows with them). */\n @Prop({ attribute: 'chip-position', reflect: true }) chipPosition:\n | 'below'\n | 'top'\n | 'left'\n | 'right'\n | 'inline' = 'below';\n\n /**\n * Single-mode value — option `value` or free-solo string.\n * Multi-mode value — array of option `value`s.\n */\n @Prop({ mutable: true }) value: string | string[] = '';\n\n /** Live text of the input (separate from `value` so typing never commits). */\n @Prop({ mutable: true, attribute: 'input-value' }) inputValue: string = '';\n\n /** Allow committing arbitrary text (not just options) with Enter. */\n @Prop({ reflect: true, attribute: 'free-solo' }) freeSolo: boolean = false;\n\n /** When `multiple`, the max number of selected items (`0` = no limit). */\n @Prop({ attribute: 'max-selected' }) maxSelected: number = 0;\n\n /** Busy state: progress bar in the menu while an async dataset loads. */\n @Prop({ reflect: true }) loading: boolean = false;\n\n /** Empty-state text when the dataset has no options at all. */\n @Prop({ attribute: 'no-options-text' }) noOptionsText: string = 'No options';\n\n /** Empty-state text when the typed filter matches nothing. */\n @Prop({ attribute: 'no-results-text' }) noResultsText: string = 'No results';\n\n /** Text shown while `loading` is true. */\n @Prop({ attribute: 'loading-text' }) loadingText: string = 'Loading…';\n\n /** Template for the polite screen-reader status while the popup is open\n * (localisable). `{count}` is replaced with the visible option count. */\n @Prop({ attribute: 'status-template' }) statusTemplate: string = '{count} suggestions available';\n\n /**\n * Keep the menu open after a selection in **single** mode.\n *\n * `multiple` already stays open — picking several in a row is the point, and\n * it dismisses on an outside click, on the trigger, or on Escape. This prop\n * gives a single-select the same stickiness when a picker is being used to\n * scan rather than to commit.\n */\n @Prop({ attribute: 'disable-close-on-select', reflect: true }) disableCloseOnSelect: boolean = false;\n\n /** Clear a non-matching input on blur (strict single mode only). */\n @Prop({ attribute: 'clear-on-blur', reflect: true }) clearOnBlur: boolean = false;\n\n /** Show a clear (×) button on the trailing edge. */\n @Prop({ reflect: true }) clearable: boolean = true;\n\n /** Material Symbols glyph for the clear button. */\n @Prop({ attribute: 'clear-icon' }) clearIcon: string = 'close';\n\n /** Caret glyph; rotates 180° when open (matches md-select). Slot\n * `dropdown-icon` overrides it. */\n @Prop({ attribute: 'dropdown-icon' }) dropdownIcon: string = 'arrow_drop_down';\n\n /** Max items shown in the dropdown (`0` = unlimited; client-side path only). */\n @Prop({ attribute: 'limit-results' }) limitResults: number = 0;\n\n /** Open state. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /**\n * Custom client-side filter (ignored while virtualized — the WASM engine\n * filters by `filter-mode` instead).\n */\n @Prop() filterer?: (\n options: SelectOptionData[],\n state: { inputValue: string; selected: string[] },\n ) => SelectOptionData[];\n\n /**\n * Virtualization strategy (same engine as `md-select`):\n * - `'auto'` (default): virtualize above 200 rows.\n * - `'always'`: always virtualize the `options` / `loadOptions` dataset.\n * - `'never'`: plain DOM rendering.\n */\n @Prop() virtualize: 'auto' | 'always' | 'never' = 'auto';\n\n /** Filter strategy for the virtualized (WASM) path. */\n @Prop({ attribute: 'filter-mode' }) filterMode: FilterMode = 'substring';\n\n /** Fixed virtualized row height (px). Auto-measured from the first row if unset. */\n @Prop({ attribute: 'row-height' }) rowHeight?: number;\n\n /** Menu placement. */\n @Prop() placement: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' = 'bottom-start';\n\n /** Match the dropdown width to the trigger. */\n @Prop({ attribute: 'match-trigger-width' }) matchTriggerWidth: boolean = true;\n\n /** Max height of the dropdown menu (px). */\n @Prop({ attribute: 'max-height' }) maxHeight?: number;\n\n /** Form name. Multi-mode submits as repeated `name=value` pairs. */\n @Prop({ reflect: true }) name: string = '';\n\n /** Fires whenever the committed selection changes. */\n @Event() mdChange: EventEmitter<string | string[]>;\n\n /** Fires whenever the live input string changes. */\n @Event() mdInput: EventEmitter<string>;\n\n /** Fires when the menu opens. */\n @Event() mdOpen: EventEmitter<void>;\n\n /** Fires when the menu closes. */\n @Event() mdClose: EventEmitter<void>;\n\n /** Fires when the user clears the value. */\n @Event() mdClear: EventEmitter<void>;\n\n @State() private triggerId: string = `md-autocomplete-${++autocompleteIdCounter}`;\n @State() private focused: boolean = false;\n /** Normalised dataset for the plain-DOM path (empty while virtualized). */\n @State() private optionsData: SelectOptionData[] = [];\n /** value → label cache so chips / the input label survive off-window rows. */\n @State() private labelMap: Map<string, string> = new Map();\n\n /** True while a dataset is packing into the WASM store — presents the same\n * busy UI as `loading` until the rows are ready. */\n @State() private packing = false;\n\n /** True once the user typed since the menu opened — before that the full\n * list shows (reopening a committed single value must not filter to it). */\n private typedSinceOpen = false;\n\n /** Monotonic guard: only the NEWEST load may commit its results (a dataset\n * replaced mid-pack must not interleave or resurrect stale state). */\n private loadGen = 0;\n\n /** Deferred focus target inside the freshly-opened listbox (APG: ArrowDown\n * from a closed combobox opens AND focuses the first option). */\n private pendingListFocus: 'first' | 'last' | null = null;\n\n private fieldEl?: HTMLElement & { focus?: () => void };\n private menuEl?: VirtualMenuEl;\n private searchDebounce?: ReturnType<typeof setTimeout>;\n private providerSet = false;\n\n private vc = new VirtualSelectController({\n queryItem: (i) =>\n (this.el.shadowRoot?.querySelector(\n `md-menu-item[data-vindex=\"${i}\"]`,\n ) as HTMLElement | null) ?? null,\n requestRender: () => forceUpdate(this),\n });\n\n // ── Public API ───────────────────────────────────────────\n\n /** Programmatically focus the input. */\n @Method()\n async focusInput() {\n this.fieldEl?.focus?.();\n }\n\n /** Open the menu. */\n @Method()\n async showMenu() {\n if (this.disabled) return;\n this.open = true;\n }\n\n /** Close the menu. */\n @Method()\n async closeMenu() {\n this.open = false;\n }\n\n /**\n * Load a large dataset into the WASM-backed virtualized list (rows are\n * byte-packed off the JS heap). Accepts an array or a `{ count, getRow }`\n * factory. Falls back to plain DOM when `virtualize=\"never\"` or WASM is\n * unavailable.\n */\n @Method()\n async loadOptions(source: SelectOptionInit[] | OptionRowSource) {\n const gen = ++this.loadGen;\n if (this.virtualize === 'never' || !isWasmSupported()) {\n const rows = Array.isArray(source)\n ? source\n : Array.from({ length: source.count }, (_, i) => source.getRow(i));\n this.vc.reset();\n this.optionsData = this.normalize(rows);\n this.refreshLabelMap();\n return;\n }\n this.optionsData = [];\n this.packing = true;\n try {\n this.vc.setFixedRowHeight(this.rowHeight);\n this.vc.setFilterMode(this.filterMode);\n await this.vc.load(Array.isArray(source) ? this.normalize(source) : source);\n } finally {\n if (gen === this.loadGen) this.packing = false;\n }\n if (gen !== this.loadGen) return; // superseded by a newer load/refresh\n // A filter typed while the pack ran must apply to the fresh dataset.\n if (this.open && this.typedSinceOpen) this.vc.setQuery(this.query);\n this.refreshLabelMap();\n forceUpdate(this);\n }\n\n /** Resolve labels for a set of values (virtual-safe). */\n @Method()\n async getLabels(values: string[]): Promise<Record<string, string>> {\n if (this.vc.active) return Object.fromEntries(this.vc.getLabels(values));\n const out: Record<string, string> = {};\n for (const v of values) out[v] = this.labelMap.get(v) ?? v;\n return out;\n }\n\n // ── Option collection ────────────────────────────────────\n\n /** Accept the legacy `description` alias for `supportingText`. */\n private normalize(list: ReadonlyArray<MdAutocompleteOption>): SelectOptionData[] {\n return list.map((o) => ({\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 ?? o.description,\n selected: !!o.selected,\n }));\n }\n\n /**\n * `options` arrives as an array from a property binding, or as a JSON string\n * from an attribute. Everything downstream wants the array.\n */\n private get optionList(): MdAutocompleteOption[] {\n const raw = this.options;\n if (Array.isArray(raw)) return raw;\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n // A malformed attribute is an authoring mistake, not a reason to break\n // the field — warn once and carry on with nothing.\n if (typeof console !== 'undefined') {\n console.warn('[md-autocomplete] `options` attribute is not valid JSON:', raw);\n }\n return [];\n }\n }\n return [];\n }\n\n @Watch('options')\n refreshOptions() {\n const slotted = collectOptions(this.el, []);\n const data = slotted.length > 0 ? slotted : this.normalize(this.optionList);\n const shouldVirtualize =\n this.virtualize === 'always' ||\n (this.virtualize === 'auto' && data.length > VIRTUALIZE_THRESHOLD);\n const gen = ++this.loadGen;\n\n if (shouldVirtualize && isWasmSupported() && data.length > 0) {\n this.optionsData = [];\n this.packing = true;\n this.vc.setFixedRowHeight(this.rowHeight);\n this.vc.setFilterMode(this.filterMode);\n void this.vc.load(data).then((ok) => {\n if (gen !== this.loadGen) return; // superseded by a newer load/refresh\n if (!ok) {\n this.optionsData = data;\n }\n this.packing = false;\n // A filter typed while the pack ran must apply to the fresh dataset.\n if (ok && this.open && this.typedSinceOpen) this.vc.setQuery(this.query);\n this.refreshLabelMap();\n forceUpdate(this);\n });\n } else {\n this.vc.reset();\n this.optionsData = data;\n this.refreshLabelMap();\n }\n }\n\n /** Slotted `<md-select-option>` mount/unmount/data change → re-read. */\n @Listen('mdSelectOptionChange')\n onOptionChange(e: Event) {\n e.stopPropagation();\n this.refreshOptions();\n }\n\n // ── Selection state ──────────────────────────────────────\n\n /** Effective busy state: consumer-driven `loading` OR an in-flight pack. */\n private get busy(): boolean {\n return this.loading || this.packing;\n }\n\n private get selectedArray(): string[] {\n if (this.multiple) return Array.isArray(this.value) ? this.value : [];\n if (typeof this.value === 'string' && this.value) return [this.value];\n return [];\n }\n\n private isSelected = (val: string) => this.selectedArray.includes(val);\n\n /** The active filter query: only what the user typed since open counts. */\n private get query(): string {\n return this.typedSinceOpen ? this.inputValue.trim() : '';\n }\n\n private get filteredOptions(): SelectOptionData[] {\n const selected = this.selectedArray;\n const state = { inputValue: this.query, selected };\n let results = this.filterer\n ? this.filterer(this.optionsData, state)\n : this.defaultFilter(this.optionsData, state);\n if (this.limitResults > 0) results = results.slice(0, this.limitResults);\n return results;\n }\n\n private defaultFilter(\n options: SelectOptionData[],\n state: { inputValue: string; selected: string[] },\n ): SelectOptionData[] {\n const q = state.inputValue.toLowerCase();\n if (!q) return options;\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q) ||\n (o.supportingText?.toLowerCase().includes(q) ?? false),\n );\n }\n\n /** Rebuild the value→label cache (chips, single-mode input text). */\n private refreshLabelMap() {\n const values = this.selectedArray;\n if (values.length === 0) {\n if (this.labelMap.size) this.labelMap = new Map();\n return;\n }\n const next = new Map<string, string>();\n if (this.vc.active) {\n const resolved = this.vc.getLabels(values);\n for (const v of values) {\n next.set(v, resolved.get(v) ?? this.labelMap.get(v) ?? v);\n }\n } else {\n for (const v of values) {\n const opt = this.optionsData.find((o) => o.value === v);\n next.set(v, opt?.label ?? this.labelMap.get(v) ?? v);\n }\n }\n this.labelMap = next;\n }\n\n // ── Form association ─────────────────────────────────────\n\n private defaultValue: string | string[] = '';\n private defaultInputValue = '';\n\n componentWillLoad() {\n this.refreshOptions();\n this.defaultValue = Array.isArray(this.value) ? [...this.value] : this.value;\n this.defaultInputValue = this.inputValue;\n this.syncFormValue();\n }\n\n componentDidLoad() {\n // @Watch('open') does not fire for the initial value.\n if (this.open && !this.disabled) {\n void this.menuEl?.show?.({ autoFocus: false });\n this.mdOpen.emit();\n }\n }\n\n disconnectedCallback() {\n clearTimeout(this.searchDebounce);\n this.vc.detachViewport();\n }\n\n formResetCallback() {\n this.value = Array.isArray(this.defaultValue) ? [...this.defaultValue] : this.defaultValue;\n this.inputValue = this.defaultInputValue;\n // Stale filter state must not survive a reset.\n this.typedSinceOpen = false;\n clearTimeout(this.searchDebounce);\n if (this.vc.active) this.vc.setQuery('');\n }\n\n @Watch('value')\n syncFormValue() {\n this.updateValidity();\n this.refreshLabelMap();\n // Programmatic single-mode value set (menu closed): reflect the committed\n // label in the visible input — otherwise the field shows stale text until\n // the next interaction. Silent (no mdInput): this is not user typing.\n if (!this.multiple && !this.open) {\n const committed =\n typeof this.value === 'string' && this.value\n ? this.labelMap.get(this.value) ?? this.value\n : '';\n if (this.inputValue !== committed) this.inputValue = committed;\n }\n if (this.multiple) {\n const values = this.selectedArray;\n if (!values.length) {\n setFormValue(this.internals, null);\n return;\n }\n const data = new FormData();\n for (const v of values) data.append(this.name || '', v);\n setFormValue(this.internals, data);\n return;\n }\n const single = typeof this.value === 'string' ? this.value : '';\n setFormValue(this.internals, single || null);\n }\n\n /** Flipping `multiple` at runtime must re-shape the value and re-submit —\n * ElementInternals would otherwise keep the pre-flip payload. */\n @Watch('multiple')\n onMultipleFlip() {\n if (this.multiple) {\n if (typeof this.value === 'string') this.value = this.value ? [this.value] : [];\n else this.syncFormValue();\n } else {\n if (Array.isArray(this.value)) this.value = this.value[0] ?? '';\n else this.syncFormValue();\n }\n }\n\n @Watch('required')\n @Watch('valueMissingLabel')\n updateValidity() {\n if (!this.internals?.setValidity) return;\n // setCustomValidity() takes precedence over valueMissing, matching native.\n if (this.customValidityMessage) {\n this.internals.setValidity(\n { customError: true },\n this.customValidityMessage,\n (this.fieldEl as HTMLElement) ?? this.el,\n );\n } else if (this.required && this.selectedArray.length === 0) {\n this.internals.setValidity(\n { valueMissing: true },\n this.errorText || this.valueMissingLabel,\n (this.fieldEl as HTMLElement) ?? this.el,\n );\n } else {\n this.internals.setValidity({});\n }\n this.emitValidityChange();\n }\n\n /** Current validity: boolean, message and flags. Mirrors md-text-field. */\n @Method()\n async getValidity(): Promise<{\n valid: boolean;\n validationMessage: string;\n flags: Record<string, boolean>;\n }> {\n return getValidityOf(this.internals);\n }\n\n /**\n * Fires when this control's validity CHANGES — never on every keystroke, and\n * never for a re-publish that lands on the same state.\n *\n * `composed: false` is deliberate. Composites like md-select embed an\n * md-text-field, and a composed event escapes that inner shadow root, so a\n * listener on md-select would receive the inner field's event as well as the\n * host's — two events, different payloads, for one logical control. Keeping\n * it uncomposed means each component reports only for itself, while\n * `bubbles: true` still lets a <form> or app root hear every control.\n */\n @Event({ bubbles: true, composed: false }) mdValidityChange: EventEmitter<{\n valid: boolean;\n validationMessage: string;\n flags: Record<string, boolean>;\n }>;\n\n /** Last emitted validity, so a re-publish that changes nothing stays silent. */\n private lastValidityKey: string | null = null;\n\n /**\n * Emit mdValidityChange if validity actually moved.\n *\n * The FIRST call only primes the baseline. Initial state is not a change, and\n * emitting on mount would fire once per control on every page load — noise a\n * consumer would have to filter out, and misleading for anything logging\n * \"field became invalid\".\n */\n private emitValidityChange() {\n const v = getValidityOf(this.internals);\n const key = `${v.valid}|${v.validationMessage}`;\n if (this.lastValidityKey === key) return;\n const primed = this.lastValidityKey !== null;\n this.lastValidityKey = key;\n if (primed) this.mdValidityChange.emit(v);\n }\n\n /** Constraint-validation API, matching md-text-field and the native contract.\n * Validity was already published to the form here, but with no public method\n * a consumer could not ASK this control whether it was valid. */\n @Method()\n async checkValidity(): Promise<boolean> {\n return checkValidityOf(this.internals);\n }\n\n @Method()\n async reportValidity(): Promise<boolean> {\n return reportValidityOf(this.internals);\n }\n\n @Method()\n async setCustomValidity(message: string) {\n this.customValidityMessage = message;\n this.updateValidity();\n }\n\n // ── Menu open/close plumbing (mirrors md-select) ─────────\n\n private _syncGuard = false;\n private _lastEmit: 'open' | 'close' | null = null;\n\n @Watch('open')\n syncMenu(open: boolean) {\n if (this._syncGuard || !this.menuEl) return;\n if (open) {\n // Focus stays in the input — typing keeps filtering.\n this.menuEl.show?.({ autoFocus: false });\n } else {\n this.menuEl.close?.();\n }\n }\n\n /** True once the vc is wired to the menu's live scroll viewport. */\n private vpWired = false;\n\n /** Wire the vc to the menu's scroll viewport (listener + row measure +\n * recompute). The viewport only exists once the CAPPED virtual listbox has\n * rendered (the busy bar renders uncapped, without a scroll viewport), so a\n * null resolve just returns — componentDidRender retries every render\n * while the menu is open until the wiring lands. */\n private attachMenuViewport() {\n void (async () => {\n const vp = (await this.menuEl?.getScrollViewport?.()) ?? null;\n if (!vp || this.vpWired) return;\n this.vpWired = true;\n await this.vc.attachViewport(async () => vp);\n })();\n }\n\n private handleMenuOpen = () => {\n this._syncGuard = true;\n this.open = true;\n this._syncGuard = false;\n if (this._lastEmit !== 'open') {\n this._lastEmit = 'open';\n this.mdOpen.emit();\n }\n if (this.vc.active) {\n // Apply the live query (typing may have just opened the menu — the open\n // event lands after the keystroke, so the filter must be preserved).\n this.vc.setQuery(this.query);\n this.attachMenuViewport();\n }\n };\n\n private handleMenuClose = () => {\n this._syncGuard = true;\n this.open = false;\n this._syncGuard = false;\n if (this._lastEmit !== 'close') {\n this._lastEmit = 'close';\n this.mdClose.emit();\n }\n // Reset the typing gate on close, so REOPENING shows the full list (a\n // committed single value must not filter the list down to itself).\n this.typedSinceOpen = false;\n this.vc.detachViewport();\n this.vpWired = false;\n // Strict single mode: snap the input back to the committed label (or\n // empty) — typed-but-uncommitted text must not linger after the popup\n // closes, and the committed value itself is never touched by typing.\n if (!this.multiple && !this.freeSolo) {\n const committed =\n typeof this.value === 'string' && this.value\n ? this.labelMap.get(this.value) ?? this.value\n : '';\n if (this.inputValue !== committed) {\n this.inputValue = committed;\n this.mdInput.emit(committed);\n }\n }\n };\n\n /** Register/clear the virtual provider on the menu once it's rendered, and\n * (re)try the viewport wiring — the menu may have been opened while the\n * dataset was still packing, before the scroll viewport existed. */\n componentDidRender() {\n void this.syncComboboxRefs();\n if (!this.menuEl) return;\n if (this.vc.active && !this.providerSet) {\n void this.menuEl.setVirtualProvider?.(this.vc.provider);\n this.providerSet = true;\n } else if (!this.vc.active && this.providerSet) {\n void this.menuEl.setVirtualProvider?.(null);\n this.providerSet = false;\n }\n if (this.open && this.vc.active && !this.vpWired) this.attachMenuViewport();\n if (this.pendingListFocus && this.open) {\n const all = this.el.shadowRoot?.querySelectorAll(\n '.md-autocomplete__listbox md-menu-item:not([disabled])',\n );\n const target = (this.pendingListFocus === 'first' ? all?.[0] : all?.[all.length - 1]) as\n | HTMLElement\n | undefined;\n if (target) {\n this.pendingListFocus = null;\n target.focus();\n }\n } else if (this.pendingListFocus && !this.open) {\n this.pendingListFocus = null;\n }\n }\n\n /**\n * Point the combobox at its listbox ACROSS the shadow boundary.\n *\n * The textbox lives in md-text-field's shadow root and the listbox in this\n * one, so `aria-controls` as an IDREF is unusable — an IDREF only resolves\n * inside a single tree. ARIA element reflection takes element references\n * instead, and a reference from a descendant tree to an element in an\n * ancestor tree is in scope: verified in the accessibility tree, where the\n * combobox node gains a real `controls` relation to the listbox.\n *\n * Where reflection is unavailable the component is still a combobox with a\n * truthful expanded state, and ArrowDown moves REAL focus onto an option —\n * the APG variant that does not depend on a reference at all.\n */\n private async syncComboboxRefs() {\n const field = this.fieldEl as (HTMLElement & {\n getInputElement?: () => Promise<HTMLInputElement | null>;\n }) | undefined;\n const input = await field?.getInputElement?.();\n if (!input || !('ariaControlsElements' in input)) return;\n const listbox = this.el.shadowRoot?.querySelector('[role=\"listbox\"]') as HTMLElement | null;\n const next = this.open && listbox ? [listbox] : null;\n const current = (input as unknown as { ariaControlsElements: Element[] | null })\n .ariaControlsElements;\n // Idempotent: reassigning every render would churn the AX tree.\n if (!next && !current?.length) return;\n if (next && current?.length === 1 && current[0] === next[0]) return;\n (input as unknown as { ariaControlsElements: Element[] | null }).ariaControlsElements = next;\n }\n\n // ── Selection ────────────────────────────────────────────\n\n private commitValue(next: string | string[]) {\n this.value = next;\n this.mdChange.emit(next);\n }\n\n private pick(value: string, label: string, disabled: boolean | undefined, e?: CustomEvent) {\n // Composed mdClick would otherwise leak to host listeners.\n e?.stopPropagation();\n if (disabled) return;\n if (this.multiple) {\n const current = this.selectedArray;\n const exists = current.includes(value);\n const blocked = !exists && this.maxSelected > 0 && current.length >= this.maxSelected;\n if (blocked) {\n // md-menu-item self-toggled selected=true before this fired; revert it.\n const item = e?.target as (HTMLElement & { selected?: boolean }) | null;\n if (item) item.selected = false;\n return;\n }\n this.labelMap = new Map(this.labelMap).set(value, label);\n const next = exists ? current.filter((v) => v !== value) : [...current, value];\n this.commitValue(next);\n this.inputValue = '';\n this.mdInput.emit('');\n this.typedSinceOpen = false;\n if (this.vc.active) this.vc.setQuery('');\n // Multi-select stays OPEN on pick — choosing several in a row is the\n // whole point, and md-multi-select already behaves this way. Closing\n // after the first pick forced a reopen per item. It dismisses on an\n // outside click, on the trigger, or on Escape like any other popup.\n this.fieldEl?.focus?.();\n } else {\n this.labelMap = new Map(this.labelMap).set(value, label);\n this.commitValue(value);\n this.inputValue = label;\n this.mdInput.emit(label);\n // The selection ends the query session NOW — not at mdClose time. The\n // close event lands ~150ms later (menu animation); reopening within\n // that window must already show the full list, not a list filtered by\n // the committed label.\n this.typedSinceOpen = false;\n if (this.vc.active) this.vc.setQuery('');\n if (!this.disableCloseOnSelect) this.open = false;\n this.fieldEl?.focus?.();\n }\n }\n\n private commitFreeSolo(): boolean {\n if (!this.freeSolo) return false;\n const raw = this.inputValue.trim();\n if (!raw) return false;\n if (this.multiple) {\n const current = this.selectedArray;\n if (current.includes(raw)) return true;\n if (this.maxSelected > 0 && current.length >= this.maxSelected) return false;\n this.labelMap = new Map(this.labelMap).set(raw, raw);\n this.commitValue([...current, raw]);\n this.inputValue = '';\n this.mdInput.emit('');\n } else {\n this.commitValue(raw);\n }\n return true;\n }\n\n private removeChip = (val: string) => (e: CustomEvent | MouseEvent) => {\n e.stopPropagation();\n if ('preventDefault' in e) e.preventDefault();\n if (this.disabled || this.softDisabled || !this.multiple) return;\n this.commitValue(this.selectedArray.filter((v) => v !== val));\n };\n\n private handleClear = () => {\n if (this.disabled || this.softDisabled) return;\n this.inputValue = '';\n this.mdInput.emit('');\n this.typedSinceOpen = false;\n if (this.vc.active) this.vc.setQuery('');\n this.commitValue(this.multiple ? [] : '');\n this.mdClear.emit();\n this.fieldEl?.focus?.();\n };\n\n // ── Input handlers ───────────────────────────────────────\n\n /** Apply a typed input string (from the field, or a printable key redirected\n * out of the listbox): update state, open, and drive the (virtual) filter. */\n private applyTyped(raw: string) {\n this.inputValue = raw;\n this.typedSinceOpen = true;\n this.mdInput.emit(raw);\n if (!this.open) this.open = true;\n if (this.vc.active) {\n clearTimeout(this.searchDebounce);\n this.searchDebounce = setTimeout(() => {\n this.vc.setQuery(this.query);\n }, SEARCH_DEBOUNCE_MS);\n }\n // NB: typing never uncommits the value in strict single mode — a stray\n // keystroke (even a trailing space) must not deselect the committed\n // option. The input resyncs to the committed label when the popup closes\n // (see handleMenuClose), matching the MUI model.\n }\n\n private handleFieldInput = (e: CustomEvent<string>) => {\n this.applyTyped(e.detail ?? '');\n };\n\n /** Printable keys (and Backspace) pressed while focus is on an option:\n * an editable combobox keeps TYPING in the input — refocus it and extend\n * the query instead of letting md-menu's typeahead swallow the key. */\n private handleListboxKeyDown = (e: KeyboardEvent) => {\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n const isPrintable = e.key.length === 1;\n if (!isPrintable && e.key !== 'Backspace') return;\n e.preventDefault();\n e.stopPropagation();\n this.fieldEl?.focus?.();\n this.applyTyped(\n e.key === 'Backspace' ? this.inputValue.slice(0, -1) : this.inputValue + e.key,\n );\n };\n\n /** First visible, enabled option row in this shadow root (plain or virtual). */\n private firstOptionItem(): HTMLElement | null {\n return (\n (this.el.shadowRoot?.querySelector(\n '.md-autocomplete__listbox md-menu-item:not([disabled])',\n ) as HTMLElement | null) ?? null\n );\n }\n\n private handleFieldKeyDown = (e: KeyboardEvent) => {\n if (this.disabled || this.softDisabled) return;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!this.open) {\n // APG: ArrowDown on a closed combobox opens the popup AND moves\n // focus to the first option (deferred until the list renders).\n this.pendingListFocus = 'first';\n this.open = true;\n } else {\n // Focus-moves-into-popup combobox variant: the option takes real\n // focus (announced by AT); md-menu's roving model handles the rest.\n this.firstOptionItem()?.focus();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!this.open) {\n this.pendingListFocus = 'last';\n this.open = true;\n } else {\n const all = this.el.shadowRoot?.querySelectorAll(\n '.md-autocomplete__listbox md-menu-item:not([disabled])',\n );\n (all?.[all.length - 1] as HTMLElement | undefined)?.focus();\n }\n break;\n case 'Enter':\n if (this.freeSolo && this.commitFreeSolo()) {\n e.preventDefault();\n if (!this.multiple) this.open = false;\n }\n break;\n case 'Escape':\n if (this.open) {\n e.preventDefault();\n this.open = false;\n }\n break;\n case 'Backspace':\n if (this.multiple && !this.inputValue && this.selectedArray.length > 0) {\n this.commitValue(this.selectedArray.slice(0, -1));\n }\n break;\n }\n };\n\n private handleFieldFocus = () => {\n this.focused = true;\n };\n\n private handleFieldBlur = () => {\n this.focused = false;\n // Not while the popup is open — ArrowDown moves focus into the listbox,\n // and resetting the input there would wipe the active filter mid-browse.\n if (this.open) return;\n if (this.clearOnBlur && !this.multiple && !this.freeSolo) {\n const committed = typeof this.value === 'string' ? this.labelMap.get(this.value) : '';\n if (this.inputValue && this.inputValue !== committed) {\n this.inputValue = committed ?? '';\n this.mdInput.emit(this.inputValue);\n }\n }\n };\n\n // ── Render ───────────────────────────────────────────────\n\n /** A single removable value token (shared by the below + inline layouts). */\n private renderChipItem = (val: string) => (\n <md-chip\n key={val}\n part=\"chip\"\n exportparts=\"remove:chip-remove,label:chip-label\"\n variant=\"input\"\n // A display token of a selected value (role=group, not a nested\n // interactive button host) — only its ✕ removes it.\n selectable={false}\n label={this.labelMap.get(val) ?? val}\n disabled={this.disabled || this.softDisabled}\n removable={!this.disabled && !this.softDisabled}\n onMdRemove={this.removeChip(val)}\n onClick={(e: MouseEvent) => e.stopPropagation()}\n ></md-chip>\n );\n\n private get inlineChips(): boolean {\n return this.multiple && this.chipPosition === 'inline';\n }\n\n /** Chips BELOW the field (default layout). */\n private renderChips() {\n if (!this.multiple || this.inlineChips) return null;\n const selected = this.selectedArray;\n if (selected.length === 0) return null;\n return (\n <div\n class=\"md-autocomplete__chips\"\n part=\"chips\"\n role=\"group\"\n aria-label={this.label ? `${this.label} — selected` : 'Selected'}\n >\n {selected.map(this.renderChipItem)}\n </div>\n );\n }\n\n /** Chips INSIDE the field (md-text-field `chips` slot), wrapping onto new\n * rows — the field grows with them (`chips-wrap`). */\n private renderInlineChips() {\n if (!this.inlineChips) return null;\n const selected = this.selectedArray;\n if (selected.length === 0) return null;\n return (\n <div\n slot=\"chips\"\n class=\"md-autocomplete__inline-chips\"\n part=\"chips\"\n role=\"group\"\n aria-label={this.label ? `${this.label} — selected` : 'Selected'}\n >\n {selected.map(this.renderChipItem)}\n </div>\n );\n }\n\n private renderClearButton(forceHidden = false) {\n if (!this.clearable) return null;\n const hasValue = this.multiple\n ? this.selectedArray.length > 0\n : !!this.inputValue || !!this.value;\n // Always rendered (visibility-hidden when empty or busy): the button\n // popping in and out would change the field's intrinsic width, making the\n // trigger jump by its 30px whenever text appears in a shrink-to-fit layout.\n const hidden = forceHidden || !hasValue;\n return (\n <md-icon-button\n class={{\n 'md-autocomplete__clear': true,\n 'md-autocomplete__clear--hidden': hidden,\n }}\n slot=\"trailing-icon\"\n part=\"clear\"\n variant=\"standard\"\n size=\"xs\"\n icon={this.clearIcon}\n aria-label=\"Clear value\"\n aria-hidden={hidden ? 'true' : undefined}\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n this.handleClear();\n }}\n ></md-icon-button>\n );\n }\n\n private renderTrigger() {\n return (\n <md-text-field\n ref={(el) => (this.fieldEl = el as HTMLElement)}\n id={this.triggerId}\n class=\"md-autocomplete__field\"\n part=\"field\"\n variant={this.variant}\n label={this.label}\n placeholder={this.placeholder}\n value={this.inputValue}\n disabled={this.disabled}\n error={this.error}\n errorText={this.errorText}\n reserveSupportingSpace={this.reserveSupportingSpace}\n supportingText={this.supportingText}\n required={this.required}\n density={this.density}\n appearFocused={this.open || this.focused}\n // Mirrored by md-text-field onto the focused input (global ARIA attr,\n // valid on textbox) — the input truthfully announces its listbox popup.\n aria-haspopup=\"listbox\"\n // Promote the real textbox to a combobox: the role, the expanded state\n // and the typing relationship all have to sit on the element AT reads.\n // The listbox reference is wired separately (syncComboboxRefs) because\n // it has to cross md-text-field's shadow boundary.\n inputRole=\"combobox\"\n inputExpanded={this.open}\n inputAriaAutocomplete=\"list\"\n chipsWrap={this.inlineChips}\n onMdInput={this.handleFieldInput}\n onClick={() => {\n if (!this.disabled && !this.softDisabled && !this.open) this.open = true;\n }}\n onKeyDown={this.handleFieldKeyDown}\n onFocus={this.handleFieldFocus}\n onBlur={this.handleFieldBlur}\n >\n {this.renderInlineChips()}\n {this.busy ? (\n // Busy state (consumer `loading` OR a dataset packing into WASM): a\n // spinner replaces the CARET only; the (hidden) clear button keeps\n // its reserved slot so the trailing cluster — and therefore the\n // field width — is identical across idle/typing/busy/loaded.\n [\n this.renderClearButton(true),\n <span slot=\"trailing-icon\" class=\"md-autocomplete__loader\" part=\"loading-spinner\">\n <slot name=\"loader\">\n <LazyLoadingIndicator label={this.loadingText}></LazyLoadingIndicator>\n </slot>\n </span>,\n ]\n ) : (\n [\n this.renderClearButton(),\n <span\n slot=\"trailing-icon\"\n class=\"md-autocomplete__caret material-symbols-outlined\"\n part=\"caret\"\n aria-hidden=\"true\"\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n if (!this.disabled && !this.softDisabled) this.open = !this.open;\n }}\n >\n {/* Static glyph + CSS rotation on open — same caret as the selects\n (a glyph swap would double-flip with the rotate rule). */}\n <slot name=\"dropdown-icon\">{this.dropdownIcon}</slot>\n </span>,\n ]\n )}\n </md-text-field>\n );\n }\n\n private renderOptionIcon(icon?: string, iconColor?: string) {\n if (!icon) return null;\n return (\n <span\n slot=\"leading-icon\"\n part=\"option-icon\"\n class=\"material-symbols-outlined md-autocomplete__option-icon\"\n style={iconColor ? { color: iconColor } : undefined}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n );\n }\n\n private renderVirtualOptions() {\n return (\n <div\n class=\"md-autocomplete__listbox\"\n role=\"listbox\"\n id={`${this.triggerId}-listbox`}\n aria-label={this.label || 'Options'}\n aria-multiselectable={this.multiple ? 'true' : undefined}\n onKeyDown={this.handleListboxKeyDown}\n >\n <div\n class=\"md-autocomplete__vspacer\"\n style={{ height: `${this.vc.topPad}px` }}\n aria-hidden=\"true\"\n ></div>\n {this.vc.windowRows.map((row, i) => {\n const filteredIndex = this.vc.windowStart + i;\n const selected = this.isSelected(row.value);\n return (\n <md-menu-item\n key={row.index}\n id={`${this.triggerId}-opt-${filteredIndex}`}\n data-vindex={filteredIndex}\n presentation=\"option\"\n type={this.multiple ? 'checkbox' : 'radio'}\n check-position=\"start\"\n keep-open\n part={selected ? 'option option-selected' : 'option'}\n disabled={row.disabled}\n selected={selected}\n headline={row.label}\n supporting-text={row.supportingText || ''}\n aria-setsize={this.vc.filteredLength}\n aria-posinset={filteredIndex + 1}\n onMdClick={(e: CustomEvent) => this.pick(row.value, row.label, row.disabled, e)}\n >\n {this.renderOptionIcon(row.icon || undefined)}\n </md-menu-item>\n );\n })}\n <div\n class=\"md-autocomplete__vspacer\"\n style={{ height: `${this.vc.bottomPad}px` }}\n aria-hidden=\"true\"\n ></div>\n </div>\n );\n }\n\n private renderMenu() {\n const virtual = this.vc.active;\n const filtered = virtual ? [] : this.filteredOptions;\n const datasetEmpty = virtual ? false : this.optionsData.length === 0;\n const emptyText = this.busy\n ? ''\n : virtual\n ? this.vc.filteredLength === 0\n ? this.noResultsText\n : ''\n : datasetEmpty\n ? this.noOptionsText\n : filtered.length === 0\n ? this.noResultsText\n : '';\n const menuMaxHeight = virtual ? (this.maxHeight ?? 320) : this.maxHeight;\n\n return (\n <md-menu\n ref={(el) => (this.menuEl = el as VirtualMenuEl)}\n anchor={this.triggerId}\n placement={this.placement}\n match-anchor-width={this.matchTriggerWidth}\n max-height={menuMaxHeight}\n persistent={this.disableCloseOnSelect}\n empty-text={emptyText}\n auto-focus={false}\n listbox\n list-label={this.label || 'Options'}\n part=\"menu\"\n onMdOpen={this.handleMenuOpen}\n onMdClose={this.handleMenuClose}\n >\n {this.busy ? (\n <div class=\"md-autocomplete__loading\" part=\"loading\" role=\"status\" aria-label={this.loadingText}>\n <md-progress-indicator\n variant=\"linear\"\n indeterminate\n wave\n part=\"loading-progress\"\n label={this.loadingText}\n ></md-progress-indicator>\n </div>\n ) : virtual ? (\n this.renderVirtualOptions()\n ) : (\n <div\n class=\"md-autocomplete__listbox\"\n role=\"listbox\"\n id={`${this.triggerId}-listbox`}\n aria-label={this.label || 'Options'}\n aria-multiselectable={this.multiple ? 'true' : undefined}\n onKeyDown={this.handleListboxKeyDown}\n >\n {filtered.map((opt, i) => (\n <md-menu-item\n key={opt.value}\n id={`${this.triggerId}-opt-${i}`}\n presentation=\"option\"\n type={this.multiple ? 'checkbox' : 'radio'}\n check-position=\"start\"\n keep-open\n part={this.isSelected(opt.value) ? 'option option-selected' : 'option'}\n disabled={opt.disabled}\n selected={this.isSelected(opt.value)}\n headline={opt.label}\n supporting-text={opt.supportingText || ''}\n onMdClick={(e: CustomEvent) => this.pick(opt.value, opt.label, opt.disabled, e)}\n >\n {this.renderOptionIcon(opt.icon, opt.iconColor)}\n </md-menu-item>\n ))}\n </div>\n )}\n </md-menu>\n );\n }\n\n render() {\n const chipsFirst =\n this.multiple && (this.chipPosition === 'top' || this.chipPosition === 'left');\n const optionCount = this.vc.active ? this.vc.filteredLength : this.filteredOptions.length;\n const srStatus = this.busy\n ? this.loadingText\n : this.open\n ? this.statusTemplate.replace('{count}', String(optionCount))\n : '';\n return (\n <Host\n class={{\n 'md-autocomplete': true,\n [`md-autocomplete--${this.variant}`]: true,\n 'md-autocomplete--open': this.open,\n 'md-autocomplete--disabled': this.disabled,\n 'md-autocomplete--soft-disabled': this.softDisabled,\n 'md-autocomplete--multiple': this.multiple,\n 'md-autocomplete--loading': this.busy,\n [`md-autocomplete--chips-${this.chipPosition}`]: this.multiple,\n }}\n aria-haspopup=\"listbox\"\n aria-busy={this.busy ? 'true' : 'false'}\n >\n {chipsFirst && this.renderChips()}\n {this.renderTrigger()}\n {!chipsFirst && this.renderChips()}\n {this.renderMenu()}\n {/* Polite live status: the visible option count — which no ARIA\n attribute conveys — plus the busy text. The expanded state itself\n rides on the real textbox (`input-expanded` → aria-expanded, legal\n there because the input carries role=\"combobox\"; see renderTrigger). */}\n <span class=\"md-autocomplete__sr-status\" role=\"status\" aria-live=\"polite\">\n {srStatus}\n </span>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{p as e,H as a,h as t,d as s,t as o}from"./p-bSpXNc5J.js";const i=()=>`:host{--_container-color:var(--md-badge-container-color, var(--md-sys-color-error, #B3261E));--_label-color:var(--md-badge-label-color, var(--md-sys-color-on-error, #FFFFFF));--_shape:var(--md-badge-container-shape, var(--md-sys-shape-corner-full, 9999px));--_icon-color:var(--md-badge-icon-color, var(--md-badge-label-color, var(--md-sys-color-on-error, #FFFFFF)));--_icon-size:var(--md-badge-icon-size, max(8px, calc(10px + var(--md-sys-density-scale, 0) * 0.5px)));--_offset-x:var(--md-badge-offset-x, 50%);--_offset-y:var(--md-badge-offset-y, -50%);--_large-height:var(--md-badge-large-height, max(12px, calc(16px + var(--md-sys-density-scale, 0) * 1px)));--_large-padding:var(--md-badge-large-padding, 0 max(2px, calc(4px + var(--md-sys-density-scale, 0) * 0.5px)));--_small-size:var(--md-badge-small-size, max(4px, calc(6px + var(--md-sys-density-scale, 0) * 0.5px)));display:inline-flex;align-items:center;justify-content:center;position:absolute;top:0;right:0;z-index:1;box-sizing:border-box;pointer-events:none;background-color:var(--_container-color);border-radius:var(--_shape)}:host(.md-badge--small){width:var(--_small-size);height:var(--_small-size);padding:0;transform:translate(var(--_offset-x), var(--_offset-y))}:host(.md-badge--large){min-width:var(--_large-height);height:var(--_large-height);padding:var(--_large-padding);transform:translate(var(--_offset-x), var(--_offset-y));color:var(--_label-color);font-family:var(--md-sys-typescale-label-small-font-family, Roboto, sans-serif);font-size:max(9px, calc(11px + var(--md-sys-density-scale, 0) * 0.5px));font-weight:var(--md-sys-typescale-label-small-font-weight, 500);letter-spacing:var(--md-sys-typescale-label-small-letter-spacing, 0.5px);line-height:1}:host(.md-badge--large:not(.md-badge--has-content)){padding:0}.md-badge__label{display:block;white-space:nowrap;text-align:center}.md-badge__icon{font-size:var(--_icon-size);color:var(--_icon-color);line-height:1;display:flex;align-items:center;justify-content:center}::slotted(*){width:var(--_icon-size) !important;height:var(--_icon-size) !important;font-size:var(--_icon-size) !important;color:var(--_icon-color) !important;fill:var(--_icon-color) !important}.material-symbols-outlined{font-family:var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');font-weight:normal;font-style:normal;font-size:var(--_icon-size, 10px);line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;overflow-wrap:normal;direction:ltr;font-feature-settings:'liga';-webkit-font-smoothing:antialiased}@media (forced-colors: active){:host{forced-color-adjust:none;background-color:Mark;color:MarkText}}:host([density='-1']){--md-sys-density-scale:-1}:host([density='-2']){--md-sys-density-scale:-2}:host([density='-3']){--md-sys-density-scale:-3}:host([density='-4']){--md-sys-density-scale:-4}`;const r=e(class e extends a{constructor(e){super();if(e!==false){this.__registerHost()}this.__attachShadow();this.variant="large";this.value="";this.max=999;this.icon="";this.density=0;this.hasSlottedIcon=false;this.readSlottedIcon=()=>{this.hasSlottedIcon=Array.from(this.el.children).some((e=>e.getAttribute("slot")==="icon"))}}componentWillLoad(){this.readSlottedIcon()}get displayValue(){if(this.variant==="small"||!this.value)return"";const e=Number(this.value);if(!Number.isNaN(e)&&Number.isFinite(e)&&e>this.max){return`${this.max}+`}return this.value.slice(0,4)}get accessibleLabel(){if(this.variant==="small")return"notification";const e=this.displayValue;if(e)return e;if(this.icon)return this.icon;return undefined}render(){const e=this.variant==="small";const a=this.displayValue;const o=!e&&!!a;const i=!e&&(!!this.icon||this.hasSlottedIcon);const r=o||i;return t(s,{key:"81a83dc5494fb90262e948a16795763cbb077410",class:{"md-badge":true,"md-badge--small":e,"md-badge--large":!e,"md-badge--has-content":r},role:"status","aria-label":this.accessibleLabel},!e&&t("slot",{key:"011585801a80562b772518fafdfdb9bf3cdcf6ff",name:"icon",onSlotchange:this.readSlottedIcon},this.icon?t("span",{class:"md-badge__icon material-symbols-outlined",part:"icon","aria-hidden":"true"},this.icon):null),o&&t("span",{key:"20544a829f5cdc2b6a0e564aabcc310ee0bf80bb",class:"md-badge__label",part:"label"},a))}get el(){return this}static get style(){return i()}},[257,"md-badge",{variant:[513],value:[1],max:[2],icon:[1],density:[514],hasSlottedIcon:[32]}]);function n(){if(typeof customElements==="undefined"){return}const e=["md-badge"];e.forEach((e=>{switch(e){case"md-badge":if(!customElements.get(o(e))){customElements.define(o(e),r)}break}}))}n();const l=r;const d=n;export{l as MdBadge,d as defineCustomElement};
|
|
2
|
+
//# sourceMappingURL=md-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["mdBadgeCss","MdBadge","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","variant","value","max","icon","density","hasSlottedIcon","readSlottedIcon","Array","from","el","children","some","c","getAttribute","componentWillLoad","displayValue","num","Number","isNaN","isFinite","slice","accessibleLabel","display","undefined","render","isSmall","hasLabel","hasIcon","hasContent","h","Host","key","class","role","name","onSlotchange","part"],"sources":["src/components/md-badge/md-badge.css?tag=md-badge&encapsulation=shadow","src/components/md-badge/md-badge.tsx"],"sourcesContent":["/* ==========================================================\n md-badge — Material Design 3 Badge\n Spec: https://m3.material.io/components/badges/specs\n\n Two variants:\n small — 6×6px dot, no label\n large — 16px height, label-small typography, 1–4 characters\n\n Positioning:\n The badge is absolutely positioned and expects its parent\n to have position:relative. It anchors at the upper trailing\n edge of the parent (top:0 right:0) using transform to shift\n the badge outward so content grows away from the anchor.\n ========================================================== */\n\n/* ==========================================================\n 1. HOST — shared base & CSS custom properties\n ========================================================== */\n:host {\n --_container-color: var(--md-badge-container-color, var(--md-sys-color-error, #B3261E));\n --_label-color: var(--md-badge-label-color, var(--md-sys-color-on-error, #FFFFFF));\n --_shape: var(--md-badge-container-shape, var(--md-sys-shape-corner-full, 9999px));\n --_icon-color: var(--md-badge-icon-color, var(--md-badge-label-color, var(--md-sys-color-on-error, #FFFFFF)));\n --_icon-size: var(--md-badge-icon-size, max(8px, calc(10px + var(--md-sys-density-scale, 0) * 0.5px)));\n --_offset-x: var(--md-badge-offset-x, 50%);\n --_offset-y: var(--md-badge-offset-y, -50%);\n --_large-height: var(--md-badge-large-height, max(12px, calc(16px + var(--md-sys-density-scale, 0) * 1px)));\n --_large-padding: var(--md-badge-large-padding, 0 max(2px, calc(4px + var(--md-sys-density-scale, 0) * 0.5px)));\n --_small-size: var(--md-badge-small-size, max(4px, calc(6px + var(--md-sys-density-scale, 0) * 0.5px)));\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n box-sizing: border-box;\n pointer-events: none;\n background-color: var(--_container-color);\n border-radius: var(--_shape);\n}\n\n/* ==========================================================\n 2. SMALL VARIANT — 6×6 dot\n Spec: small badge is 6px circle, no label\n ========================================================== */\n:host(.md-badge--small) {\n width: var(--_small-size);\n height: var(--_small-size);\n padding: 0;\n transform: translate(var(--_offset-x), var(--_offset-y));\n}\n\n/* ==========================================================\n 3. LARGE VARIANT — labeled badge\n Spec: 16px height, min-width 16px, 4px horizontal padding\n Uses label-small typography.\n ========================================================== */\n:host(.md-badge--large) {\n min-width: var(--_large-height);\n height: var(--_large-height);\n padding: var(--_large-padding);\n transform: translate(var(--_offset-x), var(--_offset-y));\n\n color: var(--_label-color);\n font-family: var(--md-sys-typescale-label-small-font-family, Roboto, sans-serif);\n font-size: max(9px, calc(11px + var(--md-sys-density-scale, 0) * 0.5px));\n font-weight: var(--md-sys-typescale-label-small-font-weight, 500);\n letter-spacing: var(--md-sys-typescale-label-small-letter-spacing, 0.5px);\n line-height: 1;\n}\n\n/* No content: collapse padding so min-width keeps it circular */\n:host(.md-badge--large:not(.md-badge--has-content)) {\n padding: 0;\n}\n\n/* ==========================================================\n 4. LABEL\n ========================================================== */\n.md-badge__label {\n display: block;\n white-space: nowrap;\n text-align: center;\n}\n\n/* ==========================================================\n 5. ICON\n ========================================================== */\n.md-badge__icon {\n font-size: var(--_icon-size);\n color: var(--_icon-color);\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Slotted icons inherit the token-based size & color */\n::slotted(*) {\n width: var(--_icon-size) !important;\n height: var(--_icon-size) !important;\n font-size: var(--_icon-size) !important;\n color: var(--_icon-color) !important;\n fill: var(--_icon-color) !important;\n}\n\n/* ==========================================================\n 6. MATERIAL SYMBOLS (icon font inside shadow root)\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, 10px);\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 7. FORCED COLORS — Windows High Contrast\n ========================================================== */\n@media (forced-colors: active) {\n :host {\n forced-color-adjust: none;\n background-color: Mark;\n color: MarkText;\n }\n}\n\n/* ==========================================================\n DENSITY (local override)\n Maps the local `density` prop onto the same --md-sys-density-scale signal a\n global `data-density` ancestor sets. Declared on :host, so a local rung wins\n over the inherited global one. Every density-sensitive value in this file\n derives from that single signal by calc — never add a fixed per-rung ladder.\n ========================================================== */\n:host([density='-1']) { --md-sys-density-scale: -1; }\n:host([density='-2']) { --md-sys-density-scale: -2; }\n:host([density='-3']) { --md-sys-density-scale: -3; }\n:host([density='-4']) { --md-sys-density-scale: -4; }\n","import { Component, Element, Host, h, Prop, State } from '@stencil/core';\n\n@Component({\n tag: 'md-badge',\n styleUrl: 'md-badge.css',\n shadow: true,\n})\nexport class MdBadge {\n /** Badge size — small renders a dot; large renders a label */\n @Prop({ reflect: true }) variant: 'small' | 'large' = 'large';\n\n /** Text or number to display (large variant only, max 4 visible characters) */\n @Prop() value: string = '';\n\n /**\n * Numeric threshold. When the parsed value exceeds this, the badge\n * shows `{max}+` (e.g. `999+`). Ignored for non-numeric values.\n */\n @Prop() max: number = 999;\n\n /** Material Symbols icon name (large variant only, e.g. `\"error\"`) */\n @Prop() icon: 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 @Element() el!: HTMLElement;\n\n /**\n * Whether anything is slotted into `icon`. The slot is rendered for every\n * large badge — gating it on the `icon` prop meant a slotted custom icon was\n * never assigned, so it stayed invisible and the badge drew as an empty pill.\n * This only tracks whether the badge counts as *having content*.\n */\n @State() private hasSlottedIcon = false;\n\n componentWillLoad() {\n this.readSlottedIcon();\n }\n\n private readSlottedIcon = () => {\n // Direct children only, and without `:scope` — Stencil's mock-doc cannot\n // parse that pseudo-class, so it throws in spec tests.\n this.hasSlottedIcon = Array.from(this.el.children).some((c) => c.getAttribute('slot') === 'icon');\n };\n\n private get displayValue(): string {\n if (this.variant === 'small' || !this.value) return '';\n\n const num = Number(this.value);\n if (!Number.isNaN(num) && Number.isFinite(num) && num > this.max) {\n return `${this.max}+`;\n }\n\n return this.value.slice(0, 4);\n }\n\n private get accessibleLabel(): string | undefined {\n if (this.variant === 'small') return 'notification';\n const display = this.displayValue;\n if (display) return display;\n if (this.icon) return this.icon;\n return undefined;\n }\n\n render() {\n const isSmall = this.variant === 'small';\n const display = this.displayValue;\n const hasLabel = !isSmall && !!display;\n const hasIcon = !isSmall && (!!this.icon || this.hasSlottedIcon);\n const hasContent = hasLabel || hasIcon;\n\n return (\n <Host\n class={{\n 'md-badge': true,\n 'md-badge--small': isSmall,\n 'md-badge--large': !isSmall,\n 'md-badge--has-content': hasContent,\n }}\n role=\"status\"\n aria-label={this.accessibleLabel}\n >\n {!isSmall && (\n <slot name=\"icon\" onSlotchange={this.readSlottedIcon}>\n {this.icon ? (\n <span class=\"md-badge__icon material-symbols-outlined\" part=\"icon\" aria-hidden=\"true\">\n {this.icon}\n </span>\n ) : null}\n </slot>\n )}\n {hasLabel && (\n <span class=\"md-badge__label\" part=\"label\">\n {display}\n </span>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAa,IAAM,qzF,MCOZC,EAAOC,EAAA,MAAAD,UAAAE,EALpB,WAAAC,CAAAC,G,kEAO2BC,KAAAC,QAA6B,QAG9CD,KAAAE,MAAgB,GAMhBF,KAAAG,IAAc,IAGdH,KAAAI,KAAe,GAOEJ,KAAAK,QAAiC,EAUzCL,KAAAM,eAAiB,MAM1BN,KAAAO,gBAAkB,KAGxBP,KAAKM,eAAiBE,MAAMC,KAAKT,KAAKU,GAAGC,UAAUC,MAAMC,GAAMA,EAAEC,aAAa,UAAY,QAAO,CAyDpG,CAhEC,iBAAAC,GACEf,KAAKO,iB,CASP,gBAAYS,GACV,GAAIhB,KAAKC,UAAY,UAAYD,KAAKE,MAAO,MAAO,GAEpD,MAAMe,EAAMC,OAAOlB,KAAKE,OACxB,IAAKgB,OAAOC,MAAMF,IAAQC,OAAOE,SAASH,IAAQA,EAAMjB,KAAKG,IAAK,CAChE,MAAO,GAAGH,KAAKG,M,CAGjB,OAAOH,KAAKE,MAAMmB,MAAM,EAAG,E,CAG7B,mBAAYC,GACV,GAAItB,KAAKC,UAAY,QAAS,MAAO,eACrC,MAAMsB,EAAUvB,KAAKgB,aACrB,GAAIO,EAAS,OAAOA,EACpB,GAAIvB,KAAKI,KAAM,OAAOJ,KAAKI,KAC3B,OAAOoB,S,CAGT,MAAAC,GACE,MAAMC,EAAU1B,KAAKC,UAAY,QACjC,MAAMsB,EAAUvB,KAAKgB,aACrB,MAAMW,GAAYD,KAAaH,EAC/B,MAAMK,GAAWF,MAAc1B,KAAKI,MAAQJ,KAAKM,gBACjD,MAAMuB,EAAaF,GAAYC,EAE/B,OACEE,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,WAAY,KACZ,kBAAmBP,EACnB,mBAAoBA,EACpB,wBAAyBG,GAE3BK,KAAK,SAAQ,aACDlC,KAAKsB,kBAEfI,GACAI,EAAA,QAAAE,IAAA,2CAAMG,KAAK,OAAOC,aAAcpC,KAAKO,iBAClCP,KAAKI,KACJ0B,EAAA,QAAMG,MAAM,2CAA2CI,KAAK,OAAM,cAAa,QAC5ErC,KAAKI,MAEN,MAGPuB,GACCG,EAAA,QAAAE,IAAA,2CAAMC,MAAM,kBAAkBI,KAAK,SAChCd,G","ignoreList":[]}
|