@m3e/web 2.1.3 → 2.2.0
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 +3 -0
- package/dist/all.js +2765 -343
- package/dist/all.js.map +1 -1
- package/dist/all.min.js +77 -41
- package/dist/all.min.js.map +1 -1
- package/dist/app-bar.js +14 -7
- package/dist/app-bar.js.map +1 -1
- package/dist/app-bar.min.js +1 -1
- package/dist/app-bar.min.js.map +1 -1
- package/dist/autocomplete.js +5 -9
- package/dist/autocomplete.js.map +1 -1
- package/dist/autocomplete.min.js +1 -1
- package/dist/autocomplete.min.js.map +1 -1
- package/dist/bottom-sheet.js +8 -27
- package/dist/bottom-sheet.js.map +1 -1
- package/dist/bottom-sheet.min.js +1 -1
- package/dist/bottom-sheet.min.js.map +1 -1
- package/dist/calendar.js +1082 -0
- package/dist/calendar.js.map +1 -0
- package/dist/calendar.min.js +43 -0
- package/dist/calendar.min.js.map +1 -0
- package/dist/chips.js +2 -6
- package/dist/chips.js.map +1 -1
- package/dist/chips.min.js +1 -1
- package/dist/chips.min.js.map +1 -1
- package/dist/core-a11y.js +23 -9
- package/dist/core-a11y.js.map +1 -1
- package/dist/core-a11y.min.js +4 -4
- package/dist/core-a11y.min.js.map +1 -1
- package/dist/core-anchoring.js +135 -15
- package/dist/core-anchoring.js.map +1 -1
- package/dist/core-anchoring.min.js +1 -1
- package/dist/core-anchoring.min.js.map +1 -1
- package/dist/core.js +101 -1
- package/dist/core.js.map +1 -1
- package/dist/core.min.js +1 -1
- package/dist/core.min.js.map +1 -1
- package/dist/css-custom-data.json +819 -319
- package/dist/custom-elements.json +16252 -11972
- package/dist/datepicker.js +552 -0
- package/dist/datepicker.js.map +1 -0
- package/dist/datepicker.min.js +7 -0
- package/dist/datepicker.min.js.map +1 -0
- package/dist/fab-menu.js +1 -1
- package/dist/fab-menu.js.map +1 -1
- package/dist/fab-menu.min.js +1 -1
- package/dist/fab-menu.min.js.map +1 -1
- package/dist/form-field.js +2 -6
- package/dist/form-field.js.map +1 -1
- package/dist/form-field.min.js +3 -3
- package/dist/form-field.min.js.map +1 -1
- package/dist/html-custom-data.json +478 -112
- package/dist/menu.js +3 -7
- package/dist/menu.js.map +1 -1
- package/dist/menu.min.js +1 -1
- package/dist/menu.min.js.map +1 -1
- package/dist/nav-menu.js +3 -11
- package/dist/nav-menu.js.map +1 -1
- package/dist/nav-menu.min.js +1 -1
- package/dist/nav-menu.min.js.map +1 -1
- package/dist/nav-rail.js +2 -6
- package/dist/nav-rail.js.map +1 -1
- package/dist/nav-rail.min.js +1 -1
- package/dist/nav-rail.min.js.map +1 -1
- package/dist/option.js +3 -7
- package/dist/option.js.map +1 -1
- package/dist/option.min.js +1 -1
- package/dist/option.min.js.map +1 -1
- package/dist/paginator.js.map +1 -1
- package/dist/paginator.min.js.map +1 -1
- package/dist/search.js +805 -0
- package/dist/search.js.map +1 -0
- package/dist/search.min.js +7 -0
- package/dist/search.min.js.map +1 -0
- package/dist/select.js +3 -14
- package/dist/select.js.map +1 -1
- package/dist/select.min.js +1 -1
- package/dist/select.min.js.map +1 -1
- package/dist/snackbar.js +2 -6
- package/dist/snackbar.js.map +1 -1
- package/dist/snackbar.min.js +1 -1
- package/dist/snackbar.min.js.map +1 -1
- package/dist/src/all.d.ts +3 -0
- package/dist/src/all.d.ts.map +1 -1
- package/dist/src/app-bar/AppBarElement.d.ts +6 -4
- package/dist/src/app-bar/AppBarElement.d.ts.map +1 -1
- package/dist/src/autocomplete/AutocompleteElement.d.ts +2 -2
- package/dist/src/autocomplete/AutocompleteElement.d.ts.map +1 -1
- package/dist/src/autocomplete/AutocompleteQueryEventDetail.d.ts +12 -0
- package/dist/src/autocomplete/AutocompleteQueryEventDetail.d.ts.map +1 -0
- package/dist/src/autocomplete/QueryEventDetail.d.ts +3 -8
- package/dist/src/autocomplete/QueryEventDetail.d.ts.map +1 -1
- package/dist/src/autocomplete/index.d.ts +1 -0
- package/dist/src/autocomplete/index.d.ts.map +1 -1
- package/dist/src/bottom-sheet/BottomSheetElement.d.ts.map +1 -1
- package/dist/src/calendar/CalendarElement.d.ts +213 -0
- package/dist/src/calendar/CalendarElement.d.ts.map +1 -0
- package/dist/src/calendar/CalendarView.d.ts +3 -0
- package/dist/src/calendar/CalendarView.d.ts.map +1 -0
- package/dist/src/calendar/CalendarViewElementBase.d.ts +28 -0
- package/dist/src/calendar/CalendarViewElementBase.d.ts.map +1 -0
- package/dist/src/calendar/MonthViewElement.d.ts +36 -0
- package/dist/src/calendar/MonthViewElement.d.ts.map +1 -0
- package/dist/src/calendar/MultiYearViewElement.d.ts +27 -0
- package/dist/src/calendar/MultiYearViewElement.d.ts.map +1 -0
- package/dist/src/calendar/YearViewElement.d.ts +27 -0
- package/dist/src/calendar/YearViewElement.d.ts.map +1 -0
- package/dist/src/calendar/index.d.ts +7 -0
- package/dist/src/calendar/index.d.ts.map +1 -0
- package/dist/src/calendar/utils.d.ts +24 -0
- package/dist/src/calendar/utils.d.ts.map +1 -0
- package/dist/src/chips/InputChipSetElement.d.ts.map +1 -1
- package/dist/src/core/a11y/FocusTrapElement.d.ts.map +1 -1
- package/dist/src/core/a11y/InteractivityChecker.d.ts.map +1 -1
- package/dist/src/core/anchoring/AnchorOptions.d.ts +1 -1
- package/dist/src/core/anchoring/AnchorOptions.d.ts.map +1 -1
- package/dist/src/core/anchoring/FloatingPanelElement.d.ts +18 -3
- package/dist/src/core/anchoring/FloatingPanelElement.d.ts.map +1 -1
- package/dist/src/core/anchoring/positionAnchor.d.ts.map +1 -1
- package/dist/src/core/shared/controllers/InertController.d.ts +19 -0
- package/dist/src/core/shared/controllers/InertController.d.ts.map +1 -0
- package/dist/src/core/shared/controllers/index.d.ts +1 -0
- package/dist/src/core/shared/controllers/index.d.ts.map +1 -1
- package/dist/src/core/shared/converters/dateConverter.d.ts +4 -0
- package/dist/src/core/shared/converters/dateConverter.d.ts.map +1 -0
- package/dist/src/core/shared/converters/index.d.ts +1 -0
- package/dist/src/core/shared/converters/index.d.ts.map +1 -1
- package/dist/src/core/shared/utils/index.d.ts +1 -0
- package/dist/src/core/shared/utils/index.d.ts.map +1 -1
- package/dist/src/core/shared/utils/registerStyleSheet.d.ts +7 -0
- package/dist/src/core/shared/utils/registerStyleSheet.d.ts.map +1 -0
- package/dist/src/datepicker/DatepickerElement.d.ts +237 -0
- package/dist/src/datepicker/DatepickerElement.d.ts.map +1 -0
- package/dist/src/datepicker/DatepickerToggleElement.d.ts +21 -0
- package/dist/src/datepicker/DatepickerToggleElement.d.ts.map +1 -0
- package/dist/src/datepicker/DatepickerVariant.d.ts +3 -0
- package/dist/src/datepicker/DatepickerVariant.d.ts.map +1 -0
- package/dist/src/datepicker/index.d.ts +4 -0
- package/dist/src/datepicker/index.d.ts.map +1 -0
- package/dist/src/form-field/FormFieldElement.d.ts.map +1 -1
- package/dist/src/menu/MenuElement.d.ts.map +1 -1
- package/dist/src/nav-menu/NavMenuElement.d.ts.map +1 -1
- package/dist/src/nav-menu/NavMenuItemElement.d.ts.map +1 -1
- package/dist/src/nav-rail/NavRailElement.d.ts.map +1 -1
- package/dist/src/option/OptionPanelElement.d.ts.map +1 -1
- package/dist/src/paginator/PageEventDetail.d.ts +6 -11
- package/dist/src/paginator/PageEventDetail.d.ts.map +1 -1
- package/dist/src/paginator/PaginatorElement.d.ts +2 -2
- package/dist/src/paginator/PaginatorElement.d.ts.map +1 -1
- package/dist/src/paginator/PaginatorPageEventDetail.d.ts +12 -0
- package/dist/src/paginator/PaginatorPageEventDetail.d.ts.map +1 -0
- package/dist/src/paginator/index.d.ts +1 -0
- package/dist/src/paginator/index.d.ts.map +1 -1
- package/dist/src/search/SearchBarElement.d.ts +92 -0
- package/dist/src/search/SearchBarElement.d.ts.map +1 -0
- package/dist/src/search/SearchViewElement.d.ts +146 -0
- package/dist/src/search/SearchViewElement.d.ts.map +1 -0
- package/dist/src/search/SearchViewMode.d.ts +3 -0
- package/dist/src/search/SearchViewMode.d.ts.map +1 -0
- package/dist/src/search/SearchViewQueryEventDetail.d.ts +12 -0
- package/dist/src/search/SearchViewQueryEventDetail.d.ts.map +1 -0
- package/dist/src/search/index.d.ts +5 -0
- package/dist/src/search/index.d.ts.map +1 -0
- package/dist/src/search/styles/SearchBarStyle.d.ts +12 -0
- package/dist/src/search/styles/SearchBarStyle.d.ts.map +1 -0
- package/dist/src/search/styles/SearchBarToken.d.ts +27 -0
- package/dist/src/search/styles/SearchBarToken.d.ts.map +1 -0
- package/dist/src/search/styles/SearchViewStyle.d.ts +12 -0
- package/dist/src/search/styles/SearchViewStyle.d.ts.map +1 -0
- package/dist/src/search/styles/SearchViewToken.d.ts +26 -0
- package/dist/src/search/styles/SearchViewToken.d.ts.map +1 -0
- package/dist/src/search/styles/index.d.ts +3 -0
- package/dist/src/search/styles/index.d.ts.map +1 -0
- package/dist/src/select/SelectElement.d.ts.map +1 -1
- package/dist/src/snackbar/SnackbarElement.d.ts.map +1 -1
- package/dist/src/stepper/StepperElement.d.ts.map +1 -1
- package/dist/stepper.js +2 -6
- package/dist/stepper.js.map +1 -1
- package/dist/stepper.min.js +1 -1
- package/dist/stepper.min.js.map +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/tooltip.js.map +1 -1
- package/dist/tooltip.min.js +1 -1
- package/dist/tooltip.min.js.map +1 -1
- package/package.json +16 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.min.js","sources":["../../src/autocomplete/AutocompleteElement.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\r\nimport { css, CSSResultGroup, html, LitElement, PropertyValues } from \"lit\";\r\nimport { property } from \"lit/decorators.js\";\r\n\r\nimport {\r\n HtmlFor,\r\n prefersReducedMotion,\r\n scrollIntoViewIfNeeded,\r\n forcedColorsActive,\r\n setCustomState,\r\n deleteCustomState,\r\n addCustomState,\r\n customElement,\r\n MutationController,\r\n} from \"@m3e/web/core\";\r\n\r\nimport { ListKeyManager, M3eLiveAnnouncer } from \"@m3e/web/core/a11y\";\r\nimport { M3eOptGroupElement, M3eOptionElement, M3eOptionPanelElement } from \"@m3e/web/option\";\r\nimport type { M3eFormFieldElement } from \"@m3e/web/form-field\";\r\n\r\nimport { AutocompleteFilterMode } from \"./AutocompleteFilterMode\";\r\nimport { QueryEventDetail } from \"./QueryEventDetail\";\r\n\r\n/**\r\n * Enhances a text input with suggested options.\r\n *\r\n * @description\r\n * The `m3e-autocomplete` component augments a text input field with a dynamically positioned menu of filterable suggestions,\r\n * following Material Design 3 principles. It provides real-time filtering, keyboard navigation, automatic option activation,\r\n * and text highlighting to guide user selection. The component manages focus, selection state, and menu visibility while\r\n * integrating seamlessly with form field containers and supporting both required and optional selection modes.\r\n *\r\n * @example\r\n * The following example illustrates use of the `m3e-autocomplete` paired with a `m3e-form-field`.\r\n * ```html\r\n * <m3e-form-field>\r\n * <label slot=\"label\" for=\"fruit\">Choose your favorite fruit</label>\r\n * <input id=\"fruit\" />\r\n * </m3e-form-field>\r\n * <m3e-autocomplete for=\"fruit\">\r\n * <m3e-option>Apples</m3e-option>\r\n * <m3e-option>Oranges</m3e-option>\r\n * <m3e-option>Bananas</m3e-option>\r\n * <m3e-option>Grapes</m3e-option>\r\n * </m3e-autocomplete>\r\n * ```\r\n *\r\n * @tag m3e-autocomplete\r\n *\r\n * @attr auto-activate - Whether the first option should be automatically activated.\r\n * @attr case-sensitive - Whether filtering is case sensitive.\r\n * @attr filter - Mode in which to filter options.\r\n * @attr hide-selection-indicator - Whether to hide the selection indicator.\r\n * @attr hide-loading - Whether to hide the menu when loading options.\r\n * @attr hide-no-data - Whether to hide the menu when there are no options to show.\r\n * @attr loading - Whether options are being loaded.\r\n * @attr loading-label - The text announced and presented when loading options.\r\n * @attr no-data-label - The text announced and presented when no options are available for the current term.\r\n * @attr panel-class - Class or list of classes to be applied to the autocomplete's overlay panel.\r\n * @attr required - Whether the user is required to make a selection when interacting with the autocomplete.\r\n * @attr results-label - The text announced when available options change for the current term.\r\n *\r\n * @slot - Renders the options of the autocomplete.\r\n * @slot loading - Renders content when loading options.\r\n * @slot no-data - Renders content when there are no options to show.\r\n *\r\n * @fires toggle - Emitted when the options menu opens or closes.\r\n * @fires query - Emitted when the input is focused or when the user modifies its value.\r\n */\r\n@customElement(\"m3e-autocomplete\")\r\nexport class M3eAutocompleteElement extends HtmlFor(LitElement) {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: contents;\r\n }\r\n .options {\r\n display: none;\r\n }\r\n `;\r\n\r\n /** @private */ private static __nextId = 0;\r\n\r\n /** @private */ readonly #id = `m3e-autocomplete-${M3eAutocompleteElement.__nextId}`;\r\n /** @private */ readonly #menuId = `${this.#id}-menu`;\r\n /** @private */ private _options = new Array<M3eOptionElement>();\r\n /** @private */ #clone?: HTMLElement;\r\n /** @private */ #ignoreFocusVisible = false;\r\n /** @private */ #menu?: M3eOptionPanelElement;\r\n /** @private */ #ignoreHideMenuOnBlur = false;\r\n /** @private */ #inputChanged = false;\r\n /** @private */ #hasFocus = false;\r\n /** @private */ #mutationAbortController?: AbortController;\r\n\r\n /** @private */ readonly #clickHandler = () => this.#handleClick();\r\n /** @private */ readonly #formFieldPointerDownHandler = () => this.#handleFormFieldPointerDown();\r\n /** @private */ readonly #focusHandler = () => this.#handleFocus();\r\n /** @private */ readonly #blurHandler = () => this.#handleBlur();\r\n /** @private */ readonly #keyDownHandler = (e: KeyboardEvent) => this.#handleKeyDown(e);\r\n /** @private */ readonly #inputHandler = (e: Event) => this.#handleInput(e);\r\n /** @private */ readonly #changeHandler = () => this.#handleChange();\r\n /** @private */ readonly #menuToggleHandler = (e: ToggleEvent) => this.#handleMenuToggle(e);\r\n /** @private */ readonly #menuPointerDownHandler = (e: PointerEvent) => this.#handleMenuPointerDown(e);\r\n\r\n /** @private */ private readonly _listKeyManager = new ListKeyManager<M3eOptionElement>()\r\n .withWrap()\r\n .withHomeAndEnd()\r\n .withPageUpAndDown()\r\n .withVerticalOrientation()\r\n .withSkipPredicate((item) => item.disabled || item.hidden)\r\n .onActiveItemChange(() => {\r\n if (this._listKeyManager.activeItem) {\r\n this.#activateOption(this._listKeyManager.activeItem);\r\n }\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n new MutationController(this, {\r\n config: {\r\n childList: true,\r\n subtree: true,\r\n },\r\n callback: () => this.#handleMutation(),\r\n });\r\n }\r\n\r\n /**\r\n * Whether to hide the selection indicator.\r\n * @default false\r\n */\r\n @property({ attribute: \"hide-selection-indicator\", type: Boolean }) hideSelectionIndicator = false;\r\n\r\n /**\r\n * Whether the user is required to make a selection when interacting with the autocomplete.\r\n * @default false\r\n */\r\n @property({ type: Boolean, reflect: true }) required = false;\r\n\r\n /**\r\n * Whether the first option should be automatically activated.\r\n * @default false\r\n */\r\n @property({ attribute: \"auto-activate\", type: Boolean }) autoActivate = false;\r\n\r\n /**\r\n * Whether filtering is case sensitive.\r\n * @default false\r\n */\r\n @property({ attribute: \"case-sensitive\", type: Boolean }) caseSensitive = false;\r\n\r\n /**\r\n * Mode in which to filter options.\r\n * @default \"contains\"\r\n */\r\n @property({\r\n converter: {\r\n fromAttribute(value: string | null): AutocompleteFilterMode {\r\n if (value === null) return \"contains\";\r\n if (value === \"starts-with\" || value === \"ends-with\" || value === \"contains\" || value === \"none\") {\r\n return value;\r\n }\r\n return \"contains\";\r\n },\r\n },\r\n })\r\n filter: AutocompleteFilterMode | ((option: M3eOptionElement, term: string) => boolean) = \"contains\";\r\n\r\n /**\r\n * Whether options are being loaded.\r\n * @default false\r\n */\r\n @property({ type: Boolean }) loading = false;\r\n\r\n /**\r\n * Whether to hide the menu when there are no options to show.\r\n * @default false\r\n */\r\n @property({ attribute: \"hide-no-data\", type: Boolean }) hideNoData = false;\r\n\r\n /**\r\n * Whether to hide the menu when loading options.\r\n * @default false\r\n */\r\n @property({ attribute: \"hide-loading\", type: Boolean }) hideLoading = false;\r\n\r\n /**\r\n * The text announced and presented when loading options.\r\n * @default \"Loading...\"\r\n */\r\n @property({ attribute: \"loading-label\" }) loadingLabel = \"Loading...\";\r\n\r\n /**\r\n * The text announced and presented when no options are available for the current term.\r\n * @default \"No options\"\r\n */\r\n @property({ attribute: \"no-data-label\" }) noDataLabel = \"No options\";\r\n\r\n /**\r\n * The text announced when available options change for the current term.\r\n * @default (count) => `${count} options`\r\n */\r\n @property({ attribute: \"results-label\" }) resultsLabel: string | ((count: number) => string) = (count) =>\r\n `${count} options`;\r\n\r\n /**\r\n * Class or list of classes to be applied to the autocomplete's overlay panel.\r\n * @default \"\"\r\n */\r\n @property({ attribute: \"panel-class\" }) panelClass = \"\";\r\n\r\n /** The options that can be selected. */\r\n get options(): readonly M3eOptionElement[] {\r\n return this._options ?? [];\r\n }\r\n\r\n /** @private */\r\n get #options(): readonly M3eOptionElement[] {\r\n return this._listKeyManager?.items ?? [];\r\n }\r\n\r\n /** @private */\r\n get #input(): HTMLInputElement | null {\r\n return this.control ? <HTMLInputElement>this.control : null;\r\n }\r\n\r\n /** @private */\r\n get #hasNoDataSlot(): boolean {\r\n return (this.#clone?.querySelector(\"[slot='no-data']\") ?? null) !== null;\r\n }\r\n\r\n /** @private */\r\n get #hasLoadingSlot(): boolean {\r\n return (this.#clone?.querySelector(\"[slot='loading']\") ?? null) !== null;\r\n }\r\n\r\n /** @private */\r\n get #shouldShowMenu(): boolean {\r\n return (\r\n this.#options.some((x) => !x.hidden) ||\r\n (this.loading && !this.hideLoading && this.loadingLabel.length > 0) ||\r\n (!this.loading && !this.hideNoData && this.noDataLabel.length > 0)\r\n );\r\n }\r\n\r\n /** @private */\r\n get #minMenuWidth(): string {\r\n const formField = this.#formField;\r\n return `${formField ? formField.menuAnchor.clientWidth : (this.control?.clientWidth ?? 0)}px`;\r\n }\r\n\r\n /** @private */\r\n get #formField(): M3eFormFieldElement | null {\r\n return this.control?.closest(\"m3e-form-field\") ?? null;\r\n }\r\n\r\n /** @inheritdoc */\r\n override attach(control: HTMLElement): void {\r\n if (!(control instanceof HTMLInputElement)) return;\r\n\r\n super.attach(control);\r\n\r\n control.autocomplete = \"off\";\r\n control.role = \"combobox\";\r\n control.ariaAutoComplete = \"list\";\r\n control.ariaExpanded = \"false\";\r\n\r\n control.addEventListener(\"click\", this.#clickHandler);\r\n control.addEventListener(\"focus\", this.#focusHandler);\r\n control.addEventListener(\"blur\", this.#blurHandler);\r\n control.addEventListener(\"keydown\", this.#keyDownHandler);\r\n control.addEventListener(\"input\", this.#inputHandler);\r\n control.addEventListener(\"change\", this.#changeHandler);\r\n\r\n this.#formField?.addEventListener(\"pointerdown\", this.#formFieldPointerDownHandler);\r\n }\r\n\r\n /** @inheritdoc */\r\n override detach(): void {\r\n if (this.control) {\r\n this.#formField?.removeEventListener(\"pointerdown\", this.#formFieldPointerDownHandler);\r\n\r\n this.control.role = null;\r\n this.control.ariaAutoComplete = null;\r\n this.control.ariaExpanded = null;\r\n\r\n this.control.removeEventListener(\"click\", this.#clickHandler);\r\n this.control.removeEventListener(\"focus\", this.#focusHandler);\r\n this.control.removeEventListener(\"blur\", this.#blurHandler);\r\n this.control.removeEventListener(\"keydown\", this.#keyDownHandler);\r\n this.control.removeEventListener(\"input\", this.#inputHandler);\r\n this.control.removeEventListener(\"change\", this.#changeHandler);\r\n }\r\n super.detach();\r\n }\r\n\r\n /**\r\n * Clears the value of the element.\r\n * @param [restoreFocus=false] Whether to restore input focus.\r\n */\r\n clear(restoreFocus = false): void {\r\n if (!this.#input) return;\r\n\r\n this.#input.value = \"\";\r\n this.#filterOptions();\r\n\r\n if (restoreFocus) {\r\n this.#input.focus();\r\n } else {\r\n this.#hideMenu();\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n this.#handleMutation();\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override update(changedProperties: PropertyValues<this>): void {\r\n super.update(changedProperties);\r\n\r\n if (changedProperties.has(\"hideNoData\") && this.hideNoData && this.#menu) {\r\n setCustomState(this.#menu, \"-no-data\", false);\r\n }\r\n\r\n if (changedProperties.has(\"loading\")) {\r\n if (this.loading) {\r\n if (this.#hasFocus) {\r\n if (this.loadingLabel) {\r\n M3eLiveAnnouncer.announce(this.loadingLabel, \"polite\");\r\n }\r\n if (!this.#menu && this.#shouldShowMenu) {\r\n this.#showMenu();\r\n }\r\n }\r\n } else if (this.#menu && !this.#shouldShowMenu) {\r\n this.#hideMenu();\r\n } else if (this.#menu) {\r\n deleteCustomState(this.#menu, \"-loading\");\r\n } else if (this.#hasFocus) {\r\n this.#showMenu();\r\n }\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n return html`<div class=\"options\" aria-hidden=\"true\">\r\n <slot></slot>\r\n </div>`;\r\n }\r\n\r\n /** @private */\r\n async #handleMutation(): Promise<void> {\r\n if (this.#mutationAbortController) {\r\n this.#mutationAbortController.abort();\r\n }\r\n const mutationAbortController = new AbortController();\r\n this.#mutationAbortController = mutationAbortController;\r\n\r\n const options = [...this.querySelectorAll(\"m3e-option\")];\r\n\r\n for (const option of options) {\r\n if (mutationAbortController.signal.aborted) {\r\n break;\r\n }\r\n if (option.isUpdatePending) {\r\n await option.updateComplete;\r\n }\r\n }\r\n\r\n if (mutationAbortController.signal.aborted) {\r\n return;\r\n }\r\n\r\n this._options = options;\r\n\r\n this.#clone = <HTMLElement>this.cloneNode(true);\r\n\r\n const { added } = this._listKeyManager.setItems([...this.#clone.querySelectorAll(\"m3e-option\")]);\r\n added.forEach((x) => {\r\n x.id = x.id || `${this.#id}-option-${this._listKeyManager.items.indexOf(x)}`;\r\n setCustomState(x, \"-hide-selection-indicator\", this.hideSelectionIndicator);\r\n });\r\n\r\n if (this.#menu) {\r\n const count = this.#filterOptions();\r\n this.#projectClone();\r\n if (!this.#shouldShowMenu) {\r\n this.#hideMenu();\r\n } else {\r\n this.#updateMenuState(this.#menu, count);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleClick(): void {\r\n this.#ignoreFocusVisible = true;\r\n this.#showMenu();\r\n }\r\n\r\n /** @private */\r\n #handleFormFieldPointerDown(): void {\r\n this.#ignoreHideMenuOnBlur = true;\r\n }\r\n\r\n /** @private */\r\n #handleFocus(): void {\r\n this.#hasFocus = true;\r\n this.#ignoreFocusVisible = true;\r\n\r\n if (this.options.length == 0 && !(<HTMLInputElement>this.control).readOnly) {\r\n this.dispatchEvent(\r\n new CustomEvent<QueryEventDetail>(\"query\", {\r\n detail: { term: this.#input?.value ?? \"\" },\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n }\r\n\r\n this.#showMenu();\r\n }\r\n\r\n /** @private */\r\n #handleBlur(): void {\r\n this.#hasFocus = false;\r\n if (!this.#ignoreHideMenuOnBlur) {\r\n this.#hideMenu();\r\n }\r\n this.#ignoreHideMenuOnBlur = false;\r\n }\r\n\r\n /** @private */\r\n #handleInput(e: Event): void {\r\n if (!this.#input || e.defaultPrevented) return;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<QueryEventDetail>(\"query\", {\r\n detail: { term: this.#input.value },\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n\r\n this.#inputChanged = true;\r\n try {\r\n if (!this.#menu) {\r\n this.#showMenu();\r\n } else {\r\n this.#filterOptions();\r\n if (!this.#shouldShowMenu) {\r\n this.#hideMenu();\r\n }\r\n }\r\n } finally {\r\n this.#inputChanged = false;\r\n this.#formField?.notifyControlStateChange(true);\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleChange(): void {\r\n if (this.#input && this.required && !this.#options.some((x) => x.selected && !x.disabled)) {\r\n this.#input.value = \"\";\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleKeyDown(e: KeyboardEvent): void {\r\n if (e.defaultPrevented) return;\r\n\r\n this.#ignoreFocusVisible = false;\r\n\r\n switch (e.key) {\r\n case \"Backspace\":\r\n case \"Delete\":\r\n if (this.#input && !this.#input.value) {\r\n this.#hideMenu();\r\n }\r\n break;\r\n\r\n case \"Enter\":\r\n if (this.#menu && this._listKeyManager.activeItem) {\r\n e.preventDefault();\r\n this.#selectOption(this._listKeyManager.activeItem);\r\n if (!prefersReducedMotion()) {\r\n setTimeout(() => this.#hideMenu(), 150);\r\n } else {\r\n this.#hideMenu();\r\n }\r\n } else if (this.#menu) {\r\n setTimeout(() => {\r\n if (this.#input && !this.#input.value) {\r\n this.#hideMenu();\r\n }\r\n });\r\n }\r\n break;\r\n\r\n case \"Escape\":\r\n case \"Tab\":\r\n this.#hideMenu();\r\n break;\r\n\r\n case \"Up\":\r\n case \"ArrowUp\":\r\n if (e.altKey) {\r\n this.#hideMenu();\r\n } else {\r\n this._listKeyManager.onKeyDown(e);\r\n }\r\n break;\r\n\r\n case \"Down\":\r\n case \"ArrowDown\":\r\n if (!this.#menu) {\r\n this.#showMenu();\r\n e.preventDefault();\r\n } else {\r\n this._listKeyManager.onKeyDown(e);\r\n }\r\n break;\r\n\r\n default:\r\n this._listKeyManager.onKeyDown(e);\r\n break;\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleMenuPointerDown(e: PointerEvent): void {\r\n if (e.button === 2) return;\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n\r\n const option = <M3eOptionElement | undefined>(\r\n e.composedPath().find((x) => x instanceof HTMLElement && x.tagName === \"M3E-OPTION\")\r\n );\r\n\r\n if (option && !option.disabled) {\r\n this._listKeyManager.setActiveItem(option);\r\n this.#selectOption(option);\r\n if (!prefersReducedMotion()) {\r\n setTimeout(() => this.#hideMenu(), 150);\r\n } else {\r\n this.#hideMenu();\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleMenuToggle(e: ToggleEvent): void {\r\n if (!this.#menu) return;\r\n\r\n if (e.newState !== \"closed\") {\r\n const option = this.#options.find((x) => x.selected && !x.disabled);\r\n if (option) {\r\n this._listKeyManager.setActiveItem(option);\r\n scrollIntoViewIfNeeded(option, this.#menu);\r\n } else {\r\n this.#autoActivate();\r\n }\r\n\r\n this.dispatchEvent(\r\n new ToggleEvent(\"toggle\", {\r\n oldState: e.oldState,\r\n newState: e.newState,\r\n }),\r\n );\r\n } else {\r\n if (prefersReducedMotion()) {\r\n this.#destroyMenu(e);\r\n } else {\r\n // NOTE: use transitionend is preferred but doesn't fire when used here.\r\n // This is a workaround until that is fixed.\r\n setTimeout(() => this.#destroyMenu(e), 100);\r\n }\r\n }\r\n }\r\n\r\n /** @private*/\r\n #destroyMenu(e: ToggleEvent): void {\r\n if (!this.#menu) return;\r\n\r\n this.#clone?.replaceChildren(...this.#menu.childNodes);\r\n\r\n this.#menu.remove();\r\n this.#menu.removeEventListener(\"toggle\", this.#menuToggleHandler);\r\n this.#menu.removeEventListener(\"pointerdown\", this.#menuPointerDownHandler);\r\n this.#menu = undefined;\r\n\r\n if (this.#input) {\r\n this.#input.ariaExpanded = \"false\";\r\n this.#input.removeAttribute(\"aria-controls\");\r\n this.#input.removeAttribute(\"aria-owns\");\r\n }\r\n this.requestUpdate();\r\n\r\n this.#formField?.notifyControlStateChange();\r\n\r\n this.dispatchEvent(\r\n new ToggleEvent(\"toggle\", {\r\n oldState: e.oldState,\r\n newState: e.newState,\r\n }),\r\n );\r\n }\r\n\r\n /** @private */\r\n #showMenu(): void {\r\n if (this.#menu || !this.#input || this.#input.readOnly || this.#input.disabled) return;\r\n\r\n const count = this.#filterOptions();\r\n\r\n if (!this.#shouldShowMenu) return;\r\n\r\n this.#menu = document.createElement(\"m3e-option-panel\");\r\n this.#menu.id = this.#menuId;\r\n\r\n if (this.panelClass) {\r\n for (const klass of this.panelClass\r\n .split(/\\s+/)\r\n .map((d) => d.trim())\r\n .filter(Boolean)) {\r\n this.#menu.classList.add(klass);\r\n }\r\n }\r\n\r\n this.#menu.scrollStrategy = \"reposition\";\r\n this.#menu.style.overflowX = \"hidden\";\r\n this.#menu.style.minWidth = this.#minMenuWidth;\r\n this.#menu.addEventListener(\"toggle\", this.#menuToggleHandler);\r\n this.#menu.addEventListener(\"pointerdown\", this.#menuPointerDownHandler);\r\n\r\n this.#projectClone();\r\n\r\n this.#updateMenuState(this.#menu, count);\r\n\r\n (this.#formField ?? this.#input).insertAdjacentElement(\"afterend\", this.#menu);\r\n\r\n this.#input.setAttribute(\"aria-controls\", this.#menuId);\r\n this.#input.setAttribute(\"aria-owns\", this.#menuId);\r\n\r\n this.#formField?.notifyControlStateChange();\r\n\r\n if (this._listKeyManager.activeItem && this.autoActivate) {\r\n this.#activateOption(this._listKeyManager.activeItem, true);\r\n }\r\n\r\n const input = this.#input;\r\n setTimeout(() => this.#menu?.show(input, this.#formField?.menuAnchor));\r\n }\r\n\r\n /** @private */\r\n #projectClone(): void {\r\n if (!this.#clone || !this.#menu) return;\r\n const children = [...this.#clone.childNodes];\r\n if (!this.#hasNoDataSlot && this.noDataLabel) {\r\n const noDataSpan = document.createElement(\"span\");\r\n noDataSpan.slot = \"no-data\";\r\n noDataSpan.textContent = this.noDataLabel;\r\n children.push(noDataSpan);\r\n }\r\n if (!this.#hasLoadingSlot && this.loadingLabel) {\r\n const loadingSpan = document.createElement(\"span\");\r\n loadingSpan.slot = \"loading\";\r\n loadingSpan.textContent = this.loadingLabel;\r\n children.push(loadingSpan);\r\n }\r\n this.#menu.replaceChildren(...children);\r\n }\r\n\r\n /** @private */\r\n #updateMenuState(menu: M3eOptionPanelElement, count: number): void {\r\n setCustomState(menu, \"-loading\", this.loading);\r\n setCustomState(menu, \"-no-data\", count == 0);\r\n }\r\n\r\n /** @private */\r\n #hideMenu(): void {\r\n this.#menu?.hide();\r\n this.#input?.removeAttribute(\"aria-activedescendant\");\r\n }\r\n\r\n /** @private */\r\n #activateOption(option: M3eOptionElement, forceFocusVisible = false): void {\r\n if (!this.#input) return;\r\n\r\n this.#input.setAttribute(\"aria-activedescendant\", option.id);\r\n\r\n if (this.#menu) {\r\n scrollIntoViewIfNeeded(option, this.#menu, { block: \"nearest\", behavior: \"instant\" });\r\n\r\n const focusVisible =\r\n forceFocusVisible ||\r\n (!this.#ignoreFocusVisible && (this.#input.matches(\":focus-visible\") || forcedColorsActive()));\r\n\r\n this.#options.forEach((x) => {\r\n const active = x === option && focusVisible;\r\n if (active) {\r\n x.focusRing?.show();\r\n x.stateLayer?.show(\"focused\");\r\n } else {\r\n x.focusRing?.hide();\r\n x.stateLayer?.hide(\"focused\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** @private */\r\n async #updateSelectionState(clone: M3eOptionElement): Promise<void> {\r\n const option = this._options[this._listKeyManager.items.indexOf(clone)];\r\n if (option) {\r\n option.selected = clone.selected;\r\n if (option.isUpdatePending) {\r\n await option.updateComplete;\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n async #selectOption(option: M3eOptionElement): Promise<void> {\r\n if (option.selected) return;\r\n\r\n option.selected = true;\r\n await this.#updateSelectionState(option);\r\n if (option.isUpdatePending) {\r\n await option.updateComplete;\r\n }\r\n\r\n this.requestUpdate();\r\n if (this.isUpdatePending) {\r\n await this.updateComplete;\r\n }\r\n\r\n if (this.#input) {\r\n this.#input.value = option.value;\r\n }\r\n\r\n this.#formField?.notifyControlStateChange(true);\r\n }\r\n\r\n /** @private */\r\n #filterOption(clone: M3eOptionElement, option: M3eOptionElement, term: string, exactTerm: string): boolean {\r\n const value = this.caseSensitive ? option.value : option.value.toLowerCase();\r\n switch (this.filter) {\r\n case \"starts-with\":\r\n clone.term = exactTerm;\r\n clone.highlightMode = this.filter;\r\n return value.startsWith(term);\r\n case \"ends-with\":\r\n clone.term = exactTerm;\r\n clone.highlightMode = this.filter;\r\n return value.endsWith(term);\r\n case \"contains\":\r\n clone.term = exactTerm;\r\n clone.highlightMode = this.filter;\r\n return value.includes(term);\r\n case \"none\":\r\n clone.disableHighlight = true;\r\n return true;\r\n default:\r\n clone.disableHighlight = true;\r\n return this.filter(option, exactTerm);\r\n }\r\n }\r\n\r\n /** @private */\r\n #filterOptions(): number {\r\n if (!this.#input) return 0;\r\n\r\n const oldCount = this.#options.filter((x) => !x.hidden).length;\r\n const shouldAnnounce = !this.loading && this.#inputChanged;\r\n this.#inputChanged = false;\r\n\r\n const exactTerm = this.#input.value;\r\n const term = this.caseSensitive ? exactTerm : exactTerm.toLocaleLowerCase();\r\n\r\n let newCount = 0;\r\n let first = false;\r\n let last: M3eOptionElement | undefined;\r\n\r\n for (let i = 0; i < this.#options.length; i++) {\r\n const clone = this.#options[i];\r\n const option = this._options[i];\r\n clone.hidden = !this.#filterOption(clone, option, term, exactTerm);\r\n\r\n if (clone.hidden) {\r\n this.#deactivateOption(clone);\r\n deleteCustomState(clone, \"-first\");\r\n deleteCustomState(clone, \"-last\");\r\n } else {\r\n newCount++;\r\n if (!first && !(clone.parentElement instanceof M3eOptGroupElement)) {\r\n addCustomState(clone, \"-first\");\r\n first = true;\r\n addCustomState(clone, \"-last\");\r\n last = clone;\r\n } else {\r\n deleteCustomState(clone, \"-first\");\r\n if (last) {\r\n deleteCustomState(last, \"-last\");\r\n }\r\n addCustomState(clone, \"-last\");\r\n last = clone;\r\n }\r\n }\r\n\r\n if (clone.selected && option.value !== exactTerm) {\r\n clone.selected = false;\r\n this.#updateSelectionState(clone);\r\n }\r\n }\r\n\r\n if (this.#menu) {\r\n this.#updateMenuState(this.#menu, newCount);\r\n }\r\n\r\n const groups = this.#menu?.querySelectorAll(\"m3e-optgroup\") ?? this.#clone?.querySelectorAll(\"m3e-optgroup\") ?? [];\r\n for (const group of groups) {\r\n group.hidden = [...group.querySelectorAll(\"m3e-option\")].every((x) => x.hidden);\r\n }\r\n\r\n if (shouldAnnounce) {\r\n this.#announceResults(oldCount, newCount);\r\n }\r\n\r\n this.#autoActivate();\r\n return newCount;\r\n }\r\n\r\n /** @private */\r\n #announceResults(oldCount: number, newCount: number): void {\r\n if (!this.#hasFocus) return;\r\n if (newCount == 0) {\r\n if (oldCount > 0 && this.noDataLabel) {\r\n M3eLiveAnnouncer.announce(this.noDataLabel, \"polite\");\r\n }\r\n } else if (oldCount != newCount) {\r\n const message = this.resultsLabel instanceof Function ? this.resultsLabel(newCount) : this.resultsLabel;\r\n if (message) {\r\n M3eLiveAnnouncer.announce(message, \"polite\");\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #autoActivate(): void {\r\n if (this.autoActivate && (!this._listKeyManager.activeItem || !this._listKeyManager.activeItem.selected)) {\r\n const option = this.#options.find((x) => !x.disabled && !x.hidden);\r\n if (option) {\r\n this._listKeyManager.setActiveItem(option);\r\n if (this.#menu) {\r\n scrollIntoViewIfNeeded(option, this.#menu, { block: \"nearest\", behavior: \"instant\" });\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #deactivateOption(option: M3eOptionElement): void {\r\n option.focusRing?.hide();\r\n option.stateLayer?.hide(\"focused\");\r\n if (option === this._listKeyManager.activeItem) {\r\n this._listKeyManager.updateActiveItem(null);\r\n this.#input?.removeAttribute(\"aria-activedescendant\");\r\n }\r\n }\r\n}\r\n\r\ninterface M3eAutocompleteElementEventMap extends HTMLElementEventMap {\r\n toggle: ToggleEvent;\r\n query: CustomEvent<QueryEventDetail>;\r\n}\r\n\r\nexport interface M3eAutocompleteElement {\r\n addEventListener<K extends keyof M3eAutocompleteElementEventMap>(\r\n type: K,\r\n listener: (this: M3eAutocompleteElement, ev: M3eAutocompleteElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n\r\n removeEventListener<K extends keyof M3eAutocompleteElementEventMap>(\r\n type: K,\r\n listener: (this: M3eAutocompleteElement, ev: M3eAutocompleteElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-autocomplete\": M3eAutocompleteElement;\r\n }\r\n}\r\n"],"names":["M3eAutocompleteElement","HtmlFor","LitElement","constructor","super","_M3eAutocompleteElement_id","set","this","M3eAutocompleteElement_1","__nextId","_M3eAutocompleteElement_menuId","__classPrivateFieldGet","_options","Array","_M3eAutocompleteElement_clone","_M3eAutocompleteElement_ignoreFocusVisible","_M3eAutocompleteElement_menu","_M3eAutocompleteElement_ignoreHideMenuOnBlur","_M3eAutocompleteElement_inputChanged","_M3eAutocompleteElement_hasFocus","_M3eAutocompleteElement_mutationAbortController","_M3eAutocompleteElement_clickHandler","_M3eAutocompleteElement_instances","_M3eAutocompleteElement_handleClick","call","_M3eAutocompleteElement_formFieldPointerDownHandler","_M3eAutocompleteElement_handleFormFieldPointerDown","_M3eAutocompleteElement_focusHandler","_M3eAutocompleteElement_handleFocus","_M3eAutocompleteElement_blurHandler","_M3eAutocompleteElement_handleBlur","_M3eAutocompleteElement_keyDownHandler","e","_M3eAutocompleteElement_inputHandler","_M3eAutocompleteElement_changeHandler","_M3eAutocompleteElement_handleChange","_M3eAutocompleteElement_menuToggleHandler","_M3eAutocompleteElement_menuPointerDownHandler","_listKeyManager","ListKeyManager","withWrap","withHomeAndEnd","withPageUpAndDown","withVerticalOrientation","withSkipPredicate","item","disabled","hidden","onActiveItemChange","activeItem","_M3eAutocompleteElement_activateOption","hideSelectionIndicator","required","autoActivate","caseSensitive","filter","loading","hideNoData","hideLoading","loadingLabel","noDataLabel","resultsLabel","count","panelClass","MutationController","config","childList","subtree","callback","_M3eAutocompleteElement_handleMutation","options","attach","control","HTMLInputElement","autocomplete","role","ariaAutoComplete","ariaExpanded","addEventListener","_M3eAutocompleteElement_formField_get","detach","removeEventListener","clear","restoreFocus","_M3eAutocompleteElement_input_get","value","_M3eAutocompleteElement_filterOptions","focus","_M3eAutocompleteElement_hideMenu","connectedCallback","update","changedProperties","has","setCustomState","M3eLiveAnnouncer","announce","_M3eAutocompleteElement_shouldShowMenu_get","_M3eAutocompleteElement_showMenu","deleteCustomState","render","html","items","querySelector","_M3eAutocompleteElement_options_get","some","x","length","formField","menuAnchor","clientWidth","closest","async","abort","mutationAbortController","AbortController","__classPrivateFieldSet","querySelectorAll","option","signal","aborted","isUpdatePending","updateComplete","cloneNode","added","setItems","forEach","id","indexOf","_M3eAutocompleteElement_projectClone","_M3eAutocompleteElement_updateMenuState","readOnly","dispatchEvent","CustomEvent","detail","term","bubbles","composed","defaultPrevented","notifyControlStateChange","selected","key","preventDefault","_M3eAutocompleteElement_selectOption","prefersReducedMotion","setTimeout","altKey","onKeyDown","button","stopImmediatePropagation","composedPath","find","HTMLElement","tagName","setActiveItem","newState","scrollIntoViewIfNeeded","_M3eAutocompleteElement_autoActivate","ToggleEvent","oldState","_M3eAutocompleteElement_destroyMenu","replaceChildren","childNodes","remove","undefined","removeAttribute","requestUpdate","document","createElement","klass","split","map","d","trim","Boolean","classList","add","scrollStrategy","style","overflowX","minWidth","_M3eAutocompleteElement_minMenuWidth_get","insertAdjacentElement","setAttribute","input","show","children","_M3eAutocompleteElement_hasNoDataSlot_get","noDataSpan","slot","textContent","push","_M3eAutocompleteElement_hasLoadingSlot_get","loadingSpan","menu","hide","forceFocusVisible","block","behavior","focusVisible","matches","forcedColorsActive","focusRing","stateLayer","clone","_M3eAutocompleteElement_updateSelectionState","_M3eAutocompleteElement_filterOption","exactTerm","toLowerCase","highlightMode","startsWith","endsWith","includes","disableHighlight","oldCount","shouldAnnounce","toLocaleLowerCase","last","newCount","first","i","_M3eAutocompleteElement_deactivateOption","parentElement","M3eOptGroupElement","addCustomState","groups","group","every","_M3eAutocompleteElement_announceResults","message","Function","updateActiveItem","styles","css","__decorate","property","attribute","type","prototype","reflect","converter","fromAttribute","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autocomplete.min.js","sources":["../../src/autocomplete/AutocompleteElement.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\r\nimport { css, CSSResultGroup, html, LitElement, PropertyValues } from \"lit\";\r\nimport { property } from \"lit/decorators.js\";\r\n\r\nimport {\r\n HtmlFor,\r\n prefersReducedMotion,\r\n scrollIntoViewIfNeeded,\r\n forcedColorsActive,\r\n setCustomState,\r\n deleteCustomState,\r\n addCustomState,\r\n customElement,\r\n MutationController,\r\n EventAttribute,\r\n} from \"@m3e/web/core\";\r\n\r\nimport { ListKeyManager, M3eLiveAnnouncer } from \"@m3e/web/core/a11y\";\r\nimport { M3eOptGroupElement, M3eOptionElement, M3eOptionPanelElement } from \"@m3e/web/option\";\r\nimport type { M3eFormFieldElement } from \"@m3e/web/form-field\";\r\n\r\nimport { AutocompleteFilterMode } from \"./AutocompleteFilterMode\";\r\nimport { AutocompleteQueryEventDetail } from \"./AutocompleteQueryEventDetail\";\r\n\r\n/**\r\n * Enhances a text input with suggested options.\r\n *\r\n * @description\r\n * The `m3e-autocomplete` component augments a text input field with a dynamically positioned menu of filterable suggestions,\r\n * following Material Design 3 principles. It provides real-time filtering, keyboard navigation, automatic option activation,\r\n * and text highlighting to guide user selection. The component manages focus, selection state, and menu visibility while\r\n * integrating seamlessly with form field containers and supporting both required and optional selection modes.\r\n *\r\n * @example\r\n * The following example illustrates use of the `m3e-autocomplete` paired with a `m3e-form-field`.\r\n * ```html\r\n * <m3e-form-field>\r\n * <label slot=\"label\" for=\"fruit\">Choose your favorite fruit</label>\r\n * <input id=\"fruit\" />\r\n * </m3e-form-field>\r\n * <m3e-autocomplete for=\"fruit\">\r\n * <m3e-option>Apples</m3e-option>\r\n * <m3e-option>Oranges</m3e-option>\r\n * <m3e-option>Bananas</m3e-option>\r\n * <m3e-option>Grapes</m3e-option>\r\n * </m3e-autocomplete>\r\n * ```\r\n *\r\n * @tag m3e-autocomplete\r\n *\r\n * @attr auto-activate - Whether the first option should be automatically activated.\r\n * @attr case-sensitive - Whether filtering is case sensitive.\r\n * @attr filter - Mode in which to filter options.\r\n * @attr hide-selection-indicator - Whether to hide the selection indicator.\r\n * @attr hide-loading - Whether to hide the menu when loading options.\r\n * @attr hide-no-data - Whether to hide the menu when there are no options to show.\r\n * @attr loading - Whether options are being loaded.\r\n * @attr loading-label - The text announced and presented when loading options.\r\n * @attr no-data-label - The text announced and presented when no options are available for the current term.\r\n * @attr panel-class - Class or list of classes to be applied to the autocomplete's overlay panel.\r\n * @attr required - Whether the user is required to make a selection when interacting with the autocomplete.\r\n * @attr results-label - The text announced when available options change for the current term.\r\n *\r\n * @slot - Renders the options of the autocomplete.\r\n * @slot loading - Renders content when loading options.\r\n * @slot no-data - Renders content when there are no options to show.\r\n *\r\n * @fires toggle - Emitted when the options menu opens or closes.\r\n * @fires query - Emitted when the input is focused or when the user modifies its value.\r\n */\r\n@customElement(\"m3e-autocomplete\")\r\nexport class M3eAutocompleteElement extends EventAttribute(HtmlFor(LitElement), \"query\") {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: contents;\r\n }\r\n .options {\r\n display: none;\r\n }\r\n `;\r\n\r\n /** @private */ private static __nextId = 0;\r\n\r\n /** @private */ readonly #id = `m3e-autocomplete-${M3eAutocompleteElement.__nextId}`;\r\n /** @private */ readonly #menuId = `${this.#id}-menu`;\r\n /** @private */ private _options = new Array<M3eOptionElement>();\r\n /** @private */ #clone?: HTMLElement;\r\n /** @private */ #ignoreFocusVisible = false;\r\n /** @private */ #menu?: M3eOptionPanelElement;\r\n /** @private */ #ignoreHideMenuOnBlur = false;\r\n /** @private */ #inputChanged = false;\r\n /** @private */ #hasFocus = false;\r\n /** @private */ #mutationAbortController?: AbortController;\r\n\r\n /** @private */ readonly #clickHandler = () => this.#handleClick();\r\n /** @private */ readonly #formFieldPointerDownHandler = () => this.#handleFormFieldPointerDown();\r\n /** @private */ readonly #focusHandler = () => this.#handleFocus();\r\n /** @private */ readonly #blurHandler = () => this.#handleBlur();\r\n /** @private */ readonly #keyDownHandler = (e: KeyboardEvent) => this.#handleKeyDown(e);\r\n /** @private */ readonly #inputHandler = (e: Event) => this.#handleInput(e);\r\n /** @private */ readonly #changeHandler = () => this.#handleChange();\r\n /** @private */ readonly #menuToggleHandler = (e: ToggleEvent) => this.#handleMenuToggle(e);\r\n /** @private */ readonly #menuPointerDownHandler = (e: PointerEvent) => this.#handleMenuPointerDown(e);\r\n\r\n /** @private */ private readonly _listKeyManager = new ListKeyManager<M3eOptionElement>()\r\n .withWrap()\r\n .withHomeAndEnd()\r\n .withPageUpAndDown()\r\n .withVerticalOrientation()\r\n .withSkipPredicate((item) => item.disabled || item.hidden)\r\n .onActiveItemChange(() => {\r\n if (this._listKeyManager.activeItem) {\r\n this.#activateOption(this._listKeyManager.activeItem);\r\n }\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n new MutationController(this, {\r\n config: {\r\n childList: true,\r\n subtree: true,\r\n },\r\n callback: () => this.#handleMutation(),\r\n });\r\n }\r\n\r\n /**\r\n * Whether to hide the selection indicator.\r\n * @default false\r\n */\r\n @property({ attribute: \"hide-selection-indicator\", type: Boolean }) hideSelectionIndicator = false;\r\n\r\n /**\r\n * Whether the user is required to make a selection when interacting with the autocomplete.\r\n * @default false\r\n */\r\n @property({ type: Boolean, reflect: true }) required = false;\r\n\r\n /**\r\n * Whether the first option should be automatically activated.\r\n * @default false\r\n */\r\n @property({ attribute: \"auto-activate\", type: Boolean }) autoActivate = false;\r\n\r\n /**\r\n * Whether filtering is case sensitive.\r\n * @default false\r\n */\r\n @property({ attribute: \"case-sensitive\", type: Boolean }) caseSensitive = false;\r\n\r\n /**\r\n * Mode in which to filter options.\r\n * @default \"contains\"\r\n */\r\n @property({\r\n converter: {\r\n fromAttribute(value: string | null): AutocompleteFilterMode {\r\n if (value === null) return \"contains\";\r\n if (value === \"starts-with\" || value === \"ends-with\" || value === \"contains\" || value === \"none\") {\r\n return value;\r\n }\r\n return \"contains\";\r\n },\r\n },\r\n })\r\n filter: AutocompleteFilterMode | ((option: M3eOptionElement, term: string) => boolean) = \"contains\";\r\n\r\n /**\r\n * Whether options are being loaded.\r\n * @default false\r\n */\r\n @property({ type: Boolean }) loading = false;\r\n\r\n /**\r\n * Whether to hide the menu when there are no options to show.\r\n * @default false\r\n */\r\n @property({ attribute: \"hide-no-data\", type: Boolean }) hideNoData = false;\r\n\r\n /**\r\n * Whether to hide the menu when loading options.\r\n * @default false\r\n */\r\n @property({ attribute: \"hide-loading\", type: Boolean }) hideLoading = false;\r\n\r\n /**\r\n * The text announced and presented when loading options.\r\n * @default \"Loading...\"\r\n */\r\n @property({ attribute: \"loading-label\" }) loadingLabel = \"Loading...\";\r\n\r\n /**\r\n * The text announced and presented when no options are available for the current term.\r\n * @default \"No options\"\r\n */\r\n @property({ attribute: \"no-data-label\" }) noDataLabel = \"No options\";\r\n\r\n /**\r\n * The text announced when available options change for the current term.\r\n * @default (count) => `${count} options`\r\n */\r\n @property({ attribute: \"results-label\" }) resultsLabel: string | ((count: number) => string) = (count) =>\r\n `${count} options`;\r\n\r\n /**\r\n * Class or list of classes to be applied to the autocomplete's overlay panel.\r\n * @default \"\"\r\n */\r\n @property({ attribute: \"panel-class\" }) panelClass = \"\";\r\n\r\n /** The options that can be selected. */\r\n get options(): readonly M3eOptionElement[] {\r\n return this._options ?? [];\r\n }\r\n\r\n /** @private */\r\n get #options(): readonly M3eOptionElement[] {\r\n return this._listKeyManager?.items ?? [];\r\n }\r\n\r\n /** @private */\r\n get #input(): HTMLInputElement | null {\r\n return this.control ? <HTMLInputElement>this.control : null;\r\n }\r\n\r\n /** @private */\r\n get #hasNoDataSlot(): boolean {\r\n return (this.#clone?.querySelector(\"[slot='no-data']\") ?? null) !== null;\r\n }\r\n\r\n /** @private */\r\n get #hasLoadingSlot(): boolean {\r\n return (this.#clone?.querySelector(\"[slot='loading']\") ?? null) !== null;\r\n }\r\n\r\n /** @private */\r\n get #shouldShowMenu(): boolean {\r\n return (\r\n this.#options.some((x) => !x.hidden) ||\r\n (this.loading && !this.hideLoading && this.loadingLabel.length > 0) ||\r\n (!this.loading && !this.hideNoData && this.noDataLabel.length > 0)\r\n );\r\n }\r\n\r\n /** @private */\r\n get #formField(): M3eFormFieldElement | null {\r\n return this.control?.closest(\"m3e-form-field\") ?? null;\r\n }\r\n\r\n /** @inheritdoc */\r\n override attach(control: HTMLElement): void {\r\n if (!(control instanceof HTMLInputElement)) return;\r\n\r\n super.attach(control);\r\n\r\n control.autocomplete = \"off\";\r\n control.role = \"combobox\";\r\n control.ariaAutoComplete = \"list\";\r\n control.ariaExpanded = \"false\";\r\n\r\n control.addEventListener(\"click\", this.#clickHandler);\r\n control.addEventListener(\"focus\", this.#focusHandler);\r\n control.addEventListener(\"blur\", this.#blurHandler);\r\n control.addEventListener(\"keydown\", this.#keyDownHandler);\r\n control.addEventListener(\"input\", this.#inputHandler);\r\n control.addEventListener(\"change\", this.#changeHandler);\r\n\r\n this.#formField?.addEventListener(\"pointerdown\", this.#formFieldPointerDownHandler);\r\n }\r\n\r\n /** @inheritdoc */\r\n override detach(): void {\r\n if (this.control) {\r\n this.#formField?.removeEventListener(\"pointerdown\", this.#formFieldPointerDownHandler);\r\n\r\n this.control.role = null;\r\n this.control.ariaAutoComplete = null;\r\n this.control.ariaExpanded = null;\r\n\r\n this.control.removeEventListener(\"click\", this.#clickHandler);\r\n this.control.removeEventListener(\"focus\", this.#focusHandler);\r\n this.control.removeEventListener(\"blur\", this.#blurHandler);\r\n this.control.removeEventListener(\"keydown\", this.#keyDownHandler);\r\n this.control.removeEventListener(\"input\", this.#inputHandler);\r\n this.control.removeEventListener(\"change\", this.#changeHandler);\r\n }\r\n super.detach();\r\n }\r\n\r\n /**\r\n * Clears the value of the element.\r\n * @param [restoreFocus=false] Whether to restore input focus.\r\n */\r\n clear(restoreFocus = false): void {\r\n if (!this.#input) return;\r\n\r\n this.#input.value = \"\";\r\n this.#filterOptions();\r\n\r\n if (restoreFocus) {\r\n this.#input.focus();\r\n } else {\r\n this.#hideMenu();\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n this.#handleMutation();\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override update(changedProperties: PropertyValues<this>): void {\r\n super.update(changedProperties);\r\n\r\n if (changedProperties.has(\"hideNoData\") && this.hideNoData && this.#menu) {\r\n setCustomState(this.#menu, \"-no-data\", false);\r\n }\r\n\r\n if (changedProperties.has(\"loading\")) {\r\n if (this.loading) {\r\n if (this.#hasFocus) {\r\n if (this.loadingLabel) {\r\n M3eLiveAnnouncer.announce(this.loadingLabel, \"polite\");\r\n }\r\n if (!this.#menu && this.#shouldShowMenu) {\r\n this.#showMenu();\r\n }\r\n }\r\n } else if (this.#menu && !this.#shouldShowMenu) {\r\n this.#hideMenu();\r\n } else if (this.#menu) {\r\n deleteCustomState(this.#menu, \"-loading\");\r\n } else if (this.#hasFocus) {\r\n this.#showMenu();\r\n }\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n return html`<div class=\"options\" aria-hidden=\"true\">\r\n <slot></slot>\r\n </div>`;\r\n }\r\n\r\n /** @private */\r\n async #handleMutation(): Promise<void> {\r\n if (this.#mutationAbortController) {\r\n this.#mutationAbortController.abort();\r\n }\r\n const mutationAbortController = new AbortController();\r\n this.#mutationAbortController = mutationAbortController;\r\n\r\n const options = [...this.querySelectorAll(\"m3e-option\")];\r\n\r\n for (const option of options) {\r\n if (mutationAbortController.signal.aborted) {\r\n break;\r\n }\r\n if (option.isUpdatePending) {\r\n await option.updateComplete;\r\n }\r\n }\r\n\r\n if (mutationAbortController.signal.aborted) {\r\n return;\r\n }\r\n\r\n this._options = options;\r\n\r\n this.#clone = <HTMLElement>this.cloneNode(true);\r\n\r\n const { added } = this._listKeyManager.setItems([...this.#clone.querySelectorAll(\"m3e-option\")]);\r\n added.forEach((x) => {\r\n x.id = x.id || `${this.#id}-option-${this._listKeyManager.items.indexOf(x)}`;\r\n setCustomState(x, \"-hide-selection-indicator\", this.hideSelectionIndicator);\r\n });\r\n\r\n if (this.#menu) {\r\n const count = this.#filterOptions();\r\n this.#projectClone();\r\n if (!this.#shouldShowMenu) {\r\n this.#hideMenu();\r\n } else {\r\n this.#updateMenuState(this.#menu, count);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleClick(): void {\r\n this.#ignoreFocusVisible = true;\r\n this.#showMenu();\r\n }\r\n\r\n /** @private */\r\n #handleFormFieldPointerDown(): void {\r\n this.#ignoreHideMenuOnBlur = true;\r\n }\r\n\r\n /** @private */\r\n #handleFocus(): void {\r\n this.#hasFocus = true;\r\n this.#ignoreFocusVisible = true;\r\n\r\n if (this.options.length == 0 && !(<HTMLInputElement>this.control).readOnly) {\r\n this.dispatchEvent(\r\n new CustomEvent<AutocompleteQueryEventDetail>(\"query\", {\r\n detail: { term: this.#input?.value ?? \"\" },\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n }\r\n\r\n this.#showMenu();\r\n }\r\n\r\n /** @private */\r\n #handleBlur(): void {\r\n this.#hasFocus = false;\r\n if (!this.#ignoreHideMenuOnBlur) {\r\n this.#hideMenu();\r\n }\r\n this.#ignoreHideMenuOnBlur = false;\r\n }\r\n\r\n /** @private */\r\n #handleInput(e: Event): void {\r\n if (!this.#input || e.defaultPrevented) return;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<AutocompleteQueryEventDetail>(\"query\", {\r\n detail: { term: this.#input.value },\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n\r\n this.#inputChanged = true;\r\n try {\r\n if (!this.#menu) {\r\n this.#showMenu();\r\n } else {\r\n this.#filterOptions();\r\n if (!this.#shouldShowMenu) {\r\n this.#hideMenu();\r\n }\r\n }\r\n } finally {\r\n this.#inputChanged = false;\r\n this.#formField?.notifyControlStateChange(true);\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleChange(): void {\r\n if (this.#input && this.required && !this.#options.some((x) => x.selected && !x.disabled)) {\r\n this.#input.value = \"\";\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleKeyDown(e: KeyboardEvent): void {\r\n if (e.defaultPrevented) return;\r\n\r\n this.#ignoreFocusVisible = false;\r\n\r\n switch (e.key) {\r\n case \"Backspace\":\r\n case \"Delete\":\r\n if (this.#input && !this.#input.value) {\r\n this.#hideMenu();\r\n }\r\n break;\r\n\r\n case \"Enter\":\r\n if (this.#menu && this._listKeyManager.activeItem) {\r\n e.preventDefault();\r\n this.#selectOption(this._listKeyManager.activeItem);\r\n if (!prefersReducedMotion()) {\r\n setTimeout(() => this.#hideMenu(), 150);\r\n } else {\r\n this.#hideMenu();\r\n }\r\n } else if (this.#menu) {\r\n setTimeout(() => {\r\n if (this.#input && !this.#input.value) {\r\n this.#hideMenu();\r\n }\r\n });\r\n }\r\n break;\r\n\r\n case \"Escape\":\r\n case \"Tab\":\r\n this.#hideMenu();\r\n break;\r\n\r\n case \"Up\":\r\n case \"ArrowUp\":\r\n if (e.altKey) {\r\n this.#hideMenu();\r\n } else {\r\n this._listKeyManager.onKeyDown(e);\r\n }\r\n break;\r\n\r\n case \"Down\":\r\n case \"ArrowDown\":\r\n if (!this.#menu) {\r\n this.#showMenu();\r\n e.preventDefault();\r\n } else {\r\n this._listKeyManager.onKeyDown(e);\r\n }\r\n break;\r\n\r\n default:\r\n this._listKeyManager.onKeyDown(e);\r\n break;\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleMenuPointerDown(e: PointerEvent): void {\r\n if (e.button === 2) return;\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n\r\n const option = <M3eOptionElement | undefined>(\r\n e.composedPath().find((x) => x instanceof HTMLElement && x.tagName === \"M3E-OPTION\")\r\n );\r\n\r\n if (option && !option.disabled) {\r\n this._listKeyManager.setActiveItem(option);\r\n this.#selectOption(option);\r\n if (!prefersReducedMotion()) {\r\n setTimeout(() => this.#hideMenu(), 150);\r\n } else {\r\n this.#hideMenu();\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #handleMenuToggle(e: ToggleEvent): void {\r\n if (!this.#menu) return;\r\n\r\n if (e.newState !== \"closed\") {\r\n const option = this.#options.find((x) => x.selected && !x.disabled);\r\n if (option) {\r\n this._listKeyManager.setActiveItem(option);\r\n scrollIntoViewIfNeeded(option, this.#menu);\r\n } else {\r\n this.#autoActivate();\r\n }\r\n\r\n this.dispatchEvent(\r\n new ToggleEvent(\"toggle\", {\r\n oldState: e.oldState,\r\n newState: e.newState,\r\n }),\r\n );\r\n } else {\r\n if (prefersReducedMotion()) {\r\n this.#destroyMenu(e);\r\n } else {\r\n // NOTE: use transitionend is preferred but doesn't fire when used here.\r\n // This is a workaround until that is fixed.\r\n setTimeout(() => this.#destroyMenu(e), 100);\r\n }\r\n }\r\n }\r\n\r\n /** @private*/\r\n #destroyMenu(e: ToggleEvent): void {\r\n if (!this.#menu) return;\r\n\r\n this.#clone?.replaceChildren(...this.#menu.childNodes);\r\n\r\n this.#menu.remove();\r\n this.#menu.removeEventListener(\"toggle\", this.#menuToggleHandler);\r\n this.#menu.removeEventListener(\"pointerdown\", this.#menuPointerDownHandler);\r\n this.#menu = undefined;\r\n\r\n if (this.#input) {\r\n this.#input.ariaExpanded = \"false\";\r\n this.#input.removeAttribute(\"aria-controls\");\r\n this.#input.removeAttribute(\"aria-owns\");\r\n }\r\n this.requestUpdate();\r\n\r\n this.#formField?.notifyControlStateChange();\r\n\r\n this.dispatchEvent(\r\n new ToggleEvent(\"toggle\", {\r\n oldState: e.oldState,\r\n newState: e.newState,\r\n }),\r\n );\r\n }\r\n\r\n /** @private */\r\n #showMenu(): void {\r\n if (this.#menu || !this.#input || this.#input.readOnly || this.#input.disabled) return;\r\n\r\n const count = this.#filterOptions();\r\n\r\n if (!this.#shouldShowMenu) return;\r\n\r\n this.#menu = document.createElement(\"m3e-option-panel\");\r\n this.#menu.id = this.#menuId;\r\n\r\n if (this.panelClass) {\r\n for (const klass of this.panelClass\r\n .split(/\\s+/)\r\n .map((d) => d.trim())\r\n .filter(Boolean)) {\r\n this.#menu.classList.add(klass);\r\n }\r\n }\r\n\r\n this.#menu.style.overflowX = \"hidden\";\r\n this.#menu.scrollStrategy = \"reposition\";\r\n this.#menu.fitAnchorWidth = true;\r\n this.#menu.addEventListener(\"toggle\", this.#menuToggleHandler);\r\n this.#menu.addEventListener(\"pointerdown\", this.#menuPointerDownHandler);\r\n\r\n this.#projectClone();\r\n\r\n this.#updateMenuState(this.#menu, count);\r\n\r\n (this.#formField ?? this.#input).insertAdjacentElement(\"afterend\", this.#menu);\r\n\r\n this.#input.setAttribute(\"aria-controls\", this.#menuId);\r\n this.#input.setAttribute(\"aria-owns\", this.#menuId);\r\n\r\n this.#formField?.notifyControlStateChange();\r\n\r\n if (this._listKeyManager.activeItem && this.autoActivate) {\r\n this.#activateOption(this._listKeyManager.activeItem, true);\r\n }\r\n\r\n const input = this.#input;\r\n setTimeout(() => this.#menu?.show(input, this.#formField?.menuAnchor));\r\n }\r\n\r\n /** @private */\r\n #projectClone(): void {\r\n if (!this.#clone || !this.#menu) return;\r\n const children = [...this.#clone.childNodes];\r\n if (!this.#hasNoDataSlot && this.noDataLabel) {\r\n const noDataSpan = document.createElement(\"span\");\r\n noDataSpan.slot = \"no-data\";\r\n noDataSpan.textContent = this.noDataLabel;\r\n children.push(noDataSpan);\r\n }\r\n if (!this.#hasLoadingSlot && this.loadingLabel) {\r\n const loadingSpan = document.createElement(\"span\");\r\n loadingSpan.slot = \"loading\";\r\n loadingSpan.textContent = this.loadingLabel;\r\n children.push(loadingSpan);\r\n }\r\n this.#menu.replaceChildren(...children);\r\n }\r\n\r\n /** @private */\r\n #updateMenuState(menu: M3eOptionPanelElement, count: number): void {\r\n setCustomState(menu, \"-loading\", this.loading);\r\n setCustomState(menu, \"-no-data\", count == 0);\r\n }\r\n\r\n /** @private */\r\n #hideMenu(): void {\r\n this.#menu?.hide();\r\n this.#input?.removeAttribute(\"aria-activedescendant\");\r\n }\r\n\r\n /** @private */\r\n #activateOption(option: M3eOptionElement, forceFocusVisible = false): void {\r\n if (!this.#input) return;\r\n\r\n this.#input.setAttribute(\"aria-activedescendant\", option.id);\r\n\r\n if (this.#menu) {\r\n scrollIntoViewIfNeeded(option, this.#menu, { block: \"nearest\", behavior: \"instant\" });\r\n\r\n const focusVisible =\r\n forceFocusVisible ||\r\n (!this.#ignoreFocusVisible && (this.#input.matches(\":focus-visible\") || forcedColorsActive()));\r\n\r\n this.#options.forEach((x) => {\r\n const active = x === option && focusVisible;\r\n if (active) {\r\n x.focusRing?.show();\r\n x.stateLayer?.show(\"focused\");\r\n } else {\r\n x.focusRing?.hide();\r\n x.stateLayer?.hide(\"focused\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** @private */\r\n async #updateSelectionState(clone: M3eOptionElement): Promise<void> {\r\n const option = this._options[this._listKeyManager.items.indexOf(clone)];\r\n if (option) {\r\n option.selected = clone.selected;\r\n if (option.isUpdatePending) {\r\n await option.updateComplete;\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n async #selectOption(option: M3eOptionElement): Promise<void> {\r\n if (option.selected) return;\r\n\r\n option.selected = true;\r\n await this.#updateSelectionState(option);\r\n if (option.isUpdatePending) {\r\n await option.updateComplete;\r\n }\r\n\r\n this.requestUpdate();\r\n if (this.isUpdatePending) {\r\n await this.updateComplete;\r\n }\r\n\r\n if (this.#input) {\r\n this.#input.value = option.value;\r\n }\r\n\r\n this.#formField?.notifyControlStateChange(true);\r\n }\r\n\r\n /** @private */\r\n #filterOption(clone: M3eOptionElement, option: M3eOptionElement, term: string, exactTerm: string): boolean {\r\n const value = this.caseSensitive ? option.value : option.value.toLowerCase();\r\n switch (this.filter) {\r\n case \"starts-with\":\r\n clone.term = exactTerm;\r\n clone.highlightMode = this.filter;\r\n return value.startsWith(term);\r\n case \"ends-with\":\r\n clone.term = exactTerm;\r\n clone.highlightMode = this.filter;\r\n return value.endsWith(term);\r\n case \"contains\":\r\n clone.term = exactTerm;\r\n clone.highlightMode = this.filter;\r\n return value.includes(term);\r\n case \"none\":\r\n clone.disableHighlight = true;\r\n return true;\r\n default:\r\n clone.disableHighlight = true;\r\n return this.filter(option, exactTerm);\r\n }\r\n }\r\n\r\n /** @private */\r\n #filterOptions(): number {\r\n if (!this.#input) return 0;\r\n\r\n const oldCount = this.#options.filter((x) => !x.hidden).length;\r\n const shouldAnnounce = !this.loading && this.#inputChanged;\r\n this.#inputChanged = false;\r\n\r\n const exactTerm = this.#input.value;\r\n const term = this.caseSensitive ? exactTerm : exactTerm.toLocaleLowerCase();\r\n\r\n let newCount = 0;\r\n let first = false;\r\n let last: M3eOptionElement | undefined;\r\n\r\n for (let i = 0; i < this.#options.length; i++) {\r\n const clone = this.#options[i];\r\n const option = this._options[i];\r\n clone.hidden = !this.#filterOption(clone, option, term, exactTerm);\r\n\r\n if (clone.hidden) {\r\n this.#deactivateOption(clone);\r\n deleteCustomState(clone, \"-first\");\r\n deleteCustomState(clone, \"-last\");\r\n } else {\r\n newCount++;\r\n if (!first && !(clone.parentElement instanceof M3eOptGroupElement)) {\r\n addCustomState(clone, \"-first\");\r\n first = true;\r\n addCustomState(clone, \"-last\");\r\n last = clone;\r\n } else {\r\n deleteCustomState(clone, \"-first\");\r\n if (last) {\r\n deleteCustomState(last, \"-last\");\r\n }\r\n addCustomState(clone, \"-last\");\r\n last = clone;\r\n }\r\n }\r\n\r\n if (clone.selected && option.value !== exactTerm) {\r\n clone.selected = false;\r\n this.#updateSelectionState(clone);\r\n }\r\n }\r\n\r\n if (this.#menu) {\r\n this.#updateMenuState(this.#menu, newCount);\r\n }\r\n\r\n const groups = this.#menu?.querySelectorAll(\"m3e-optgroup\") ?? this.#clone?.querySelectorAll(\"m3e-optgroup\") ?? [];\r\n for (const group of groups) {\r\n group.hidden = [...group.querySelectorAll(\"m3e-option\")].every((x) => x.hidden);\r\n }\r\n\r\n if (shouldAnnounce) {\r\n this.#announceResults(oldCount, newCount);\r\n }\r\n\r\n this.#autoActivate();\r\n return newCount;\r\n }\r\n\r\n /** @private */\r\n #announceResults(oldCount: number, newCount: number): void {\r\n if (!this.#hasFocus) return;\r\n if (newCount == 0) {\r\n if (oldCount > 0 && this.noDataLabel) {\r\n M3eLiveAnnouncer.announce(this.noDataLabel, \"polite\");\r\n }\r\n } else if (oldCount != newCount) {\r\n const message = this.resultsLabel instanceof Function ? this.resultsLabel(newCount) : this.resultsLabel;\r\n if (message) {\r\n M3eLiveAnnouncer.announce(message, \"polite\");\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #autoActivate(): void {\r\n if (this.autoActivate && (!this._listKeyManager.activeItem || !this._listKeyManager.activeItem.selected)) {\r\n const option = this.#options.find((x) => !x.disabled && !x.hidden);\r\n if (option) {\r\n this._listKeyManager.setActiveItem(option);\r\n if (this.#menu) {\r\n scrollIntoViewIfNeeded(option, this.#menu, { block: \"nearest\", behavior: \"instant\" });\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #deactivateOption(option: M3eOptionElement): void {\r\n option.focusRing?.hide();\r\n option.stateLayer?.hide(\"focused\");\r\n if (option === this._listKeyManager.activeItem) {\r\n this._listKeyManager.updateActiveItem(null);\r\n this.#input?.removeAttribute(\"aria-activedescendant\");\r\n }\r\n }\r\n}\r\n\r\ninterface M3eAutocompleteElementEventMap extends HTMLElementEventMap {\r\n toggle: ToggleEvent;\r\n query: CustomEvent<AutocompleteQueryEventDetail>;\r\n}\r\n\r\nexport interface M3eAutocompleteElement {\r\n addEventListener<K extends keyof M3eAutocompleteElementEventMap>(\r\n type: K,\r\n listener: (this: M3eAutocompleteElement, ev: M3eAutocompleteElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n\r\n removeEventListener<K extends keyof M3eAutocompleteElementEventMap>(\r\n type: K,\r\n listener: (this: M3eAutocompleteElement, ev: M3eAutocompleteElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-autocomplete\": M3eAutocompleteElement;\r\n }\r\n}\r\n"],"names":["M3eAutocompleteElement","M3eAutocompleteElement_1","EventAttribute","HtmlFor","LitElement","constructor","super","_M3eAutocompleteElement_id","set","this","__nextId","_M3eAutocompleteElement_menuId","__classPrivateFieldGet","_options","Array","_M3eAutocompleteElement_clone","_M3eAutocompleteElement_ignoreFocusVisible","_M3eAutocompleteElement_menu","_M3eAutocompleteElement_ignoreHideMenuOnBlur","_M3eAutocompleteElement_inputChanged","_M3eAutocompleteElement_hasFocus","_M3eAutocompleteElement_mutationAbortController","_M3eAutocompleteElement_clickHandler","_M3eAutocompleteElement_instances","_M3eAutocompleteElement_handleClick","call","_M3eAutocompleteElement_formFieldPointerDownHandler","_M3eAutocompleteElement_handleFormFieldPointerDown","_M3eAutocompleteElement_focusHandler","_M3eAutocompleteElement_handleFocus","_M3eAutocompleteElement_blurHandler","_M3eAutocompleteElement_handleBlur","_M3eAutocompleteElement_keyDownHandler","e","_M3eAutocompleteElement_inputHandler","_M3eAutocompleteElement_changeHandler","_M3eAutocompleteElement_handleChange","_M3eAutocompleteElement_menuToggleHandler","_M3eAutocompleteElement_menuPointerDownHandler","_listKeyManager","ListKeyManager","withWrap","withHomeAndEnd","withPageUpAndDown","withVerticalOrientation","withSkipPredicate","item","disabled","hidden","onActiveItemChange","activeItem","_M3eAutocompleteElement_activateOption","hideSelectionIndicator","required","autoActivate","caseSensitive","filter","loading","hideNoData","hideLoading","loadingLabel","noDataLabel","resultsLabel","count","panelClass","MutationController","config","childList","subtree","callback","_M3eAutocompleteElement_handleMutation","options","attach","control","HTMLInputElement","autocomplete","role","ariaAutoComplete","ariaExpanded","addEventListener","_M3eAutocompleteElement_formField_get","detach","removeEventListener","clear","restoreFocus","_M3eAutocompleteElement_input_get","value","_M3eAutocompleteElement_filterOptions","focus","_M3eAutocompleteElement_hideMenu","connectedCallback","update","changedProperties","has","setCustomState","M3eLiveAnnouncer","announce","_M3eAutocompleteElement_shouldShowMenu_get","_M3eAutocompleteElement_showMenu","deleteCustomState","render","html","items","querySelector","_M3eAutocompleteElement_options_get","some","x","length","closest","async","abort","mutationAbortController","AbortController","__classPrivateFieldSet","querySelectorAll","option","signal","aborted","isUpdatePending","updateComplete","cloneNode","added","setItems","forEach","id","indexOf","_M3eAutocompleteElement_projectClone","_M3eAutocompleteElement_updateMenuState","readOnly","dispatchEvent","CustomEvent","detail","term","bubbles","composed","defaultPrevented","notifyControlStateChange","selected","key","preventDefault","_M3eAutocompleteElement_selectOption","prefersReducedMotion","setTimeout","altKey","onKeyDown","button","stopImmediatePropagation","composedPath","find","HTMLElement","tagName","setActiveItem","newState","scrollIntoViewIfNeeded","_M3eAutocompleteElement_autoActivate","ToggleEvent","oldState","_M3eAutocompleteElement_destroyMenu","replaceChildren","childNodes","remove","undefined","removeAttribute","requestUpdate","document","createElement","klass","split","map","d","trim","Boolean","classList","add","style","overflowX","scrollStrategy","fitAnchorWidth","insertAdjacentElement","setAttribute","input","show","menuAnchor","children","_M3eAutocompleteElement_hasNoDataSlot_get","noDataSpan","slot","textContent","push","_M3eAutocompleteElement_hasLoadingSlot_get","loadingSpan","menu","hide","forceFocusVisible","block","behavior","focusVisible","matches","forcedColorsActive","focusRing","stateLayer","clone","_M3eAutocompleteElement_updateSelectionState","_M3eAutocompleteElement_filterOption","exactTerm","toLowerCase","highlightMode","startsWith","endsWith","includes","disableHighlight","oldCount","shouldAnnounce","toLocaleLowerCase","last","newCount","first","i","_M3eAutocompleteElement_deactivateOption","parentElement","M3eOptGroupElement","addCustomState","groups","group","every","_M3eAutocompleteElement_announceResults","message","Function","updateActiveItem","styles","css","__decorate","property","attribute","type","prototype","reflect","converter","fromAttribute","customElement"],"mappings":";;;;;oqBAuEO,IAAMA,GAAsBC,GAA5B,cAAqCC,EAAeC,EAAQC,GAAa,UA8C9EC,WAAAA,GACEC,oBAlCuBC,EAAAC,IAAAC,KAAM,oBAAoBR,GAAuBS,YACjDC,EAAAH,IAAAC,KAAU,GAAGG,EAAAH,KAAIF,EAAA,aAClBE,KAAAI,SAAW,IAAIC,MACvBC,EAAAP,IAAAC,aACAO,EAAAR,IAAAC,MAAsB,GACtBQ,EAAAT,IAAAC,aACAS,EAAAV,IAAAC,MAAwB,GACxBU,EAAAX,IAAAC,MAAgB,GAChBW,EAAAZ,IAAAC,MAAY,GACZY,EAAAb,IAAAC,aAESa,EAAAd,IAAAC,KAAgB,IAAMG,EAAAH,KAAIc,EAAA,IAAAC,GAAaC,KAAjBhB,OACtBiB,EAAAlB,IAAAC,KAA+B,IAAMG,EAAAH,KAAIc,EAAA,IAAAI,GAA4BF,KAAhChB,OACrCmB,EAAApB,IAAAC,KAAgB,IAAMG,EAAAH,KAAIc,EAAA,IAAAM,GAAaJ,KAAjBhB,OACtBqB,EAAAtB,IAAAC,KAAe,IAAMG,EAAAH,KAAIc,EAAA,IAAAQ,GAAYN,KAAhBhB,OACrBuB,EAAAxB,IAAAC,KAAmBwB,GAAqBrB,EAAAH,cAAmBgB,KAAnBhB,KAAoBwB,IAC5DC,EAAA1B,IAAAC,KAAiBwB,GAAarB,EAAAH,cAAiBgB,KAAjBhB,KAAkBwB,IAChDE,EAAA3B,IAAAC,KAAiB,IAAMG,EAAAH,KAAIc,EAAA,IAAAa,GAAcX,KAAlBhB,OACvB4B,EAAA7B,IAAAC,KAAsBwB,GAAmBrB,EAAAH,eAAsBgB,KAAtBhB,KAAuBwB,IAChEK,EAAA9B,IAAAC,KAA2BwB,GAAoBrB,EAAAH,cAA2BgB,KAA3BhB,KAA4BwB,IAEnExB,KAAA8B,iBAAkB,IAAIC,GACpDC,WACAC,iBACAC,oBACAC,0BACAC,kBAAmBC,GAASA,EAAKC,UAAYD,EAAKE,QAClDC,mBAAmB,KACdxC,KAAK8B,gBAAgBW,YACvBtC,EAAAH,KAAIc,EAAA,IAAA4B,IAAgB1B,KAApBhB,KAAqBA,KAAK8B,gBAAgBW,cAoBoBzC,KAAA2C,wBAAyB,EAMjD3C,KAAA4C,UAAW,EAME5C,KAAA6C,cAAe,EAMd7C,KAAA8C,eAAgB,EAiB1E9C,KAAA+C,OAAyF,WAM5D/C,KAAAgD,SAAU,EAMiBhD,KAAAiD,YAAa,EAMbjD,KAAAkD,aAAc,EAM5BlD,KAAAmD,aAAe,aAMfnD,KAAAoD,YAAc,aAMdpD,KAAAqD,aAAsDC,GAC9F,GAAGA,YAMmCtD,KAAAuD,WAAa,GA3FnD,IAAIC,EAAmBxD,KAAM,CAC3ByD,OAAQ,CACNC,WAAW,EACXC,SAAS,GAEXC,SAAUA,IAAMzD,EAAAH,KAAIc,EAAA,IAAA+C,GAAgB7C,KAApBhB,OAEpB,CAuFA,WAAI8D,GACF,OAAO9D,KAAKI,UAAY,EAC1B,CAqCS2D,MAAAA,CAAOC,GACRA,aAAmBC,mBAEzBpE,MAAMkE,OAAOC,GAEbA,EAAQE,aAAe,MACvBF,EAAQG,KAAO,WACfH,EAAQI,iBAAmB,OAC3BJ,EAAQK,aAAe,QAEvBL,EAAQM,iBAAiB,QAASnE,EAAAH,KAAIa,EAAA,MACtCmD,EAAQM,iBAAiB,QAASnE,EAAAH,KAAImB,EAAA,MACtC6C,EAAQM,iBAAiB,OAAQnE,EAAAH,KAAIqB,EAAA,MACrC2C,EAAQM,iBAAiB,UAAWnE,EAAAH,KAAIuB,EAAA,MACxCyC,EAAQM,iBAAiB,QAASnE,EAAAH,KAAIyB,EAAA,MACtCuC,EAAQM,iBAAiB,SAAUnE,EAAAH,KAAI0B,EAAA,MAEvCvB,EAAAH,KAAIc,EAAA,IAAAyD,IAAaD,iBAAiB,cAAenE,EAAAH,KAAIiB,EAAA,MACvD,CAGSuD,MAAAA,GACHxE,KAAKgE,UACP7D,EAAAH,KAAIc,EAAA,IAAAyD,IAAaE,oBAAoB,cAAetE,EAAAH,KAAIiB,EAAA,MAExDjB,KAAKgE,QAAQG,KAAO,KACpBnE,KAAKgE,QAAQI,iBAAmB,KAChCpE,KAAKgE,QAAQK,aAAe,KAE5BrE,KAAKgE,QAAQS,oBAAoB,QAAStE,EAAAH,KAAIa,EAAA,MAC9Cb,KAAKgE,QAAQS,oBAAoB,QAAStE,EAAAH,KAAImB,EAAA,MAC9CnB,KAAKgE,QAAQS,oBAAoB,OAAQtE,EAAAH,KAAIqB,EAAA,MAC7CrB,KAAKgE,QAAQS,oBAAoB,UAAWtE,EAAAH,KAAIuB,EAAA,MAChDvB,KAAKgE,QAAQS,oBAAoB,QAAStE,EAAAH,KAAIyB,EAAA,MAC9CzB,KAAKgE,QAAQS,oBAAoB,SAAUtE,EAAAH,KAAI0B,EAAA,OAEjD7B,MAAM2E,QACR,CAMAE,KAAAA,CAAMC,GAAe,GACdxE,EAAAH,KAAIc,EAAA,IAAA8D,KAETzE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQC,MAAQ,GACpB1E,EAAAH,KAAIc,EAAA,IAAAgE,IAAe9D,KAAnBhB,MAEI2E,EACFxE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQG,QAEZ5E,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAEJ,CAGSiF,iBAAAA,GACPpF,MAAMoF,oBACN9E,EAAAH,KAAIc,EAAA,IAAA+C,GAAgB7C,KAApBhB,KACF,CAGmBkF,MAAAA,CAAOC,GACxBtF,MAAMqF,OAAOC,GAETA,EAAkBC,IAAI,eAAiBpF,KAAKiD,YAAc9C,EAAAH,KAAIQ,EAAA,MAChE6E,EAAelF,EAAAH,KAAIQ,EAAA,KAAQ,YAAY,GAGrC2E,EAAkBC,IAAI,aACpBpF,KAAKgD,QACH7C,EAAAH,KAAIW,EAAA,OACFX,KAAKmD,cACPmC,EAAiBC,SAASvF,KAAKmD,aAAc,WAE1ChD,EAAAH,KAAIQ,EAAA,MAAUL,EAAAH,KAAIc,EAAA,IAAA0E,IACrBrF,EAAAH,KAAIc,EAAA,IAAA2E,IAAUzE,KAAdhB,OAGKG,EAAAH,KAAIQ,EAAA,OAAWL,EAAAH,KAAIc,EAAA,IAAA0E,GAC5BrF,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MACSG,EAAAH,KAAIQ,EAAA,KACbkF,EAAkBvF,EAAAH,YAAY,YACrBG,EAAAH,KAAIW,EAAA,MACbR,EAAAH,KAAIc,EAAA,IAAA2E,IAAUzE,KAAdhB,MAGN,CAGmB2F,MAAAA,GACjB,OAAOC,CAAI,6DAGb,0RAhIE,OAAO5F,KAAK8B,iBAAiB+D,OAAS,EACxC,eAIE,OAAO7F,KAAKgE,QAA4BhE,KAAKgE,QAAU,IACzD,eAIE,OAAoE,QAA5D7D,EAAAH,KAAIM,EAAA,MAASwF,cAAc,qBAAuB,KAC5D,eAIE,OAAoE,QAA5D3F,EAAAH,KAAIM,EAAA,MAASwF,cAAc,qBAAuB,KAC5D,eAIE,OACE3F,EAAAH,KAAIc,EAAA,IAAAiF,GAAUC,KAAMC,IAAOA,EAAE1D,SAC5BvC,KAAKgD,UAAYhD,KAAKkD,aAAelD,KAAKmD,aAAa+C,OAAS,IAC/DlG,KAAKgD,UAAYhD,KAAKiD,YAAcjD,KAAKoD,YAAY8C,OAAS,CAEpE,eAIE,OAAOlG,KAAKgE,SAASmC,QAAQ,mBAAqB,IACpD,IAqGAC,iBACMjG,EAAAH,KAAIY,EAAA,MACNT,EAAAH,KAAIY,EAAA,KAA0ByF,QAEhC,MAAMC,EAA0B,IAAIC,gBACpCC,EAAAxG,KAAIY,EAA4B0F,EAAuB,KAEvD,MAAMxC,EAAU,IAAI9D,KAAKyG,iBAAiB,eAE1C,IAAK,MAAMC,KAAU5C,EAAS,CAC5B,GAAIwC,EAAwBK,OAAOC,QACjC,MAEEF,EAAOG,uBACHH,EAAOI,cAEjB,CAEA,GAAIR,EAAwBK,OAAOC,QACjC,OAGF5G,KAAKI,SAAW0D,EAEhB0C,EAAAxG,OAA2BA,KAAK+G,WAAU,GAAK,KAE/C,MAAMC,MAAEA,GAAUhH,KAAK8B,gBAAgBmF,SAAS,IAAI9G,EAAAH,YAAYyG,iBAAiB,gBAMjF,GALAO,EAAME,QAASjB,IACbA,EAAEkB,GAAKlB,EAAEkB,IAAM,GAAGhH,EAAAH,KAAIF,EAAA,eAAeE,KAAK8B,gBAAgB+D,MAAMuB,QAAQnB,KACxEZ,EAAeY,EAAG,4BAA6BjG,KAAK2C,0BAGlDxC,EAAAH,KAAIQ,EAAA,KAAQ,CACd,MAAM8C,EAAQnD,EAAAH,eAAmBgB,KAAnBhB,MACdG,EAAAH,KAAIc,EAAA,IAAAuG,IAAcrG,KAAlBhB,MACKG,EAAAH,KAAIc,EAAA,IAAA0E,GAGPrF,EAAAH,KAAIc,EAAA,IAAAwG,IAAiBtG,KAArBhB,KAAsBG,EAAAH,KAAIQ,EAAA,KAAQ8C,GAFlCnD,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,KAIJ,CACF,eAIEwG,EAAAxG,KAAIO,GAAuB,EAAI,KAC/BJ,EAAAH,KAAIc,EAAA,IAAA2E,IAAUzE,KAAdhB,KACF,eAIEwG,EAAAxG,KAAIS,GAAyB,EAAI,IACnC,eAIE+F,EAAAxG,KAAIW,GAAa,EAAI,KACrB6F,EAAAxG,KAAIO,GAAuB,EAAI,KAEJ,GAAvBP,KAAK8D,QAAQoC,QAAmClG,KAAKgE,QAASuD,UAChEvH,KAAKwH,cACH,IAAIC,YAA0C,QAAS,CACrDC,OAAQ,CAAEC,KAAMxH,EAAAH,KAAIc,EAAA,IAAA8D,IAASC,OAAS,IACtC+C,SAAS,EACTC,UAAU,KAKhB1H,EAAAH,KAAIc,EAAA,IAAA2E,IAAUzE,KAAdhB,KACF,eAIEwG,EAAAxG,KAAIW,GAAa,EAAK,KACjBR,EAAAH,KAAIS,EAAA,MACPN,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAEFwG,EAAAxG,KAAIS,GAAyB,EAAK,IACpC,aAGae,GACX,GAAKrB,EAAAH,gBAAewB,EAAEsG,iBAAtB,CAEA9H,KAAKwH,cACH,IAAIC,YAA0C,QAAS,CACrDC,OAAQ,CAAEC,KAAMxH,EAAAH,KAAIc,EAAA,IAAA8D,GAAQC,OAC5B+C,SAAS,EACTC,UAAU,KAIdrB,EAAAxG,KAAIU,GAAiB,EAAI,KACzB,IACOP,EAAAH,KAAIQ,EAAA,MAGPL,EAAAH,KAAIc,EAAA,IAAAgE,IAAe9D,KAAnBhB,MACKG,EAAAH,KAAIc,EAAA,IAAA0E,IACPrF,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,OAJFG,EAAAH,KAAIc,EAAA,IAAA2E,IAAUzE,KAAdhB,KAOJ,CAAC,QACCwG,EAAAxG,KAAIU,GAAiB,EAAK,KAC1BP,EAAAH,KAAIc,EAAA,IAAAyD,IAAawD,0BAAyB,EAC5C,CAvBwC,CAwB1C,eAIM5H,EAAAH,KAAIc,EAAA,IAAA8D,IAAW5E,KAAK4C,WAAazC,EAAAH,KAAIc,EAAA,IAAAiF,GAAUC,KAAMC,GAAMA,EAAE+B,WAAa/B,EAAE3D,YAC9EnC,EAAAH,KAAIc,EAAA,IAAA8D,GAAQC,MAAQ,GAExB,aAGerD,GACb,IAAIA,EAAEsG,iBAIN,OAFAtB,EAAAxG,KAAIO,GAAuB,EAAK,KAExBiB,EAAEyG,KACR,IAAK,YACL,IAAK,SACC9H,EAAAH,KAAIc,EAAA,IAAA8D,KAAYzE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQC,OAC9B1E,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAEF,MAEF,IAAK,QACCG,EAAAH,KAAIQ,EAAA,MAAUR,KAAK8B,gBAAgBW,YACrCjB,EAAE0G,iBACF/H,EAAAH,KAAIc,EAAA,IAAAqH,IAAcnH,KAAlBhB,KAAmBA,KAAK8B,gBAAgBW,YACnC2F,IAGHjI,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAFAqI,WAAW,IAAMlI,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAAkB,MAI5BG,EAAAH,KAAIQ,EAAA,MACb6H,WAAW,KACLlI,EAAAH,KAAIc,EAAA,IAAA8D,KAAYzE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQC,OAC9B1E,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,QAIN,MAEF,IAAK,SACL,IAAK,MACHG,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MACA,MAEF,IAAK,KACL,IAAK,UACCwB,EAAE8G,OACJnI,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAEAA,KAAK8B,gBAAgByG,UAAU/G,GAEjC,MAEF,IAAK,OACL,IAAK,YACErB,EAAAH,KAAIQ,EAAA,KAIPR,KAAK8B,gBAAgByG,UAAU/G,IAH/BrB,EAAAH,KAAIc,EAAA,IAAA2E,IAAUzE,KAAdhB,MACAwB,EAAE0G,kBAIJ,MAEF,QACElI,KAAK8B,gBAAgByG,UAAU/G,GAGrC,aAGuBA,GACrB,GAAiB,IAAbA,EAAEgH,OAAc,OACpBhH,EAAE0G,iBACF1G,EAAEiH,2BAEF,MAAM/B,EACJlF,EAAEkH,eAAeC,KAAM1C,GAAMA,aAAa2C,aAA6B,eAAd3C,EAAE4C,SAGzDnC,IAAWA,EAAOpE,WACpBtC,KAAK8B,gBAAgBgH,cAAcpC,GACnCvG,EAAAH,KAAIc,EAAA,IAAAqH,IAAcnH,KAAlBhB,KAAmB0G,GACd0B,IAGHjI,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAFAqI,WAAW,IAAMlI,EAAAH,KAAIc,EAAA,IAAAkE,IAAUhE,KAAdhB,MAAkB,KAKzC,cAGkBwB,GAChB,GAAKrB,EAAAH,KAAIQ,EAAA,KAET,GAAmB,WAAfgB,EAAEuH,SAAuB,CAC3B,MAAMrC,EAASvG,EAAAH,cAAc2I,KAAM1C,GAAMA,EAAE+B,WAAa/B,EAAE3D,UACtDoE,GACF1G,KAAK8B,gBAAgBgH,cAAcpC,GACnCsC,EAAuBtC,EAAQvG,EAAAH,KAAIQ,EAAA,OAEnCL,EAAAH,KAAIc,EAAA,IAAAmI,IAAcjI,KAAlBhB,MAGFA,KAAKwH,cACH,IAAI0B,YAAY,SAAU,CACxBC,SAAU3H,EAAE2H,SACZJ,SAAUvH,EAAEuH,WAGlB,MACMX,IACFjI,EAAAH,KAAIc,EAAA,IAAAsI,IAAapI,KAAjBhB,KAAkBwB,GAIlB6G,WAAW,IAAMlI,EAAAH,KAAIc,EAAA,IAAAsI,IAAapI,KAAjBhB,KAAkBwB,GAAI,IAG7C,cAGaA,GACNrB,EAAAH,KAAIQ,EAAA,OAETL,EAAAH,KAAIM,EAAA,MAAS+I,mBAAmBlJ,EAAAH,KAAIQ,EAAA,KAAO8I,YAE3CnJ,EAAAH,KAAIQ,EAAA,KAAO+I,SACXpJ,EAAAH,KAAIQ,EAAA,KAAOiE,oBAAoB,SAAUtE,EAAAH,KAAI4B,EAAA,MAC7CzB,EAAAH,KAAIQ,EAAA,KAAOiE,oBAAoB,cAAetE,EAAAH,KAAI6B,EAAA,MAClD2E,EAAAxG,KAAIQ,OAASgJ,EAAS,KAElBrJ,EAAAH,KAAIc,EAAA,IAAA8D,KACNzE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQP,aAAe,QAC3BlE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQ6E,gBAAgB,iBAC5BtJ,EAAAH,KAAIc,EAAA,IAAA8D,GAAQ6E,gBAAgB,cAE9BzJ,KAAK0J,gBAELvJ,EAAAH,KAAIc,EAAA,IAAAyD,IAAawD,2BAEjB/H,KAAKwH,cACH,IAAI0B,YAAY,SAAU,CACxBC,SAAU3H,EAAE2H,SACZJ,SAAUvH,EAAEuH,YAGlB,gBAIE,GAAI5I,EAAAH,KAAIQ,EAAA,OAAWL,EAAAH,KAAIc,EAAA,IAAA8D,IAAWzE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQ2C,UAAYpH,EAAAH,KAAIc,EAAA,IAAA8D,GAAQtC,SAAU,OAEhF,MAAMgB,EAAQnD,EAAAH,eAAmBgB,KAAnBhB,MAEd,IAAKG,EAAAH,KAAIc,EAAA,IAAA0E,GAAkB,OAK3B,GAHAgB,EAAAxG,OAAa2J,SAASC,cAAc,oBAAmB,KACvDzJ,EAAAH,YAAWmH,GAAKhH,EAAAH,YAEZA,KAAKuD,WACP,IAAK,MAAMsG,KAAS7J,KAAKuD,WACtBuG,MAAM,OACNC,IAAKC,GAAMA,EAAEC,QACblH,OAAOmH,SACR/J,EAAAH,YAAWmK,UAAUC,IAAIP,GAI7B1J,EAAAH,YAAWqK,MAAMC,UAAY,SAC7BnK,EAAAH,KAAIQ,EAAA,KAAO+J,eAAiB,aAC5BpK,EAAAH,KAAIQ,EAAA,KAAOgK,gBAAiB,EAC5BrK,EAAAH,KAAIQ,EAAA,KAAO8D,iBAAiB,SAAUnE,EAAAH,KAAI4B,EAAA,MAC1CzB,EAAAH,KAAIQ,EAAA,KAAO8D,iBAAiB,cAAenE,EAAAH,KAAI6B,EAAA,MAE/C1B,EAAAH,KAAIc,EAAA,IAAAuG,IAAcrG,KAAlBhB,MAEAG,EAAAH,KAAIc,EAAA,IAAAwG,IAAiBtG,KAArBhB,KAAsBG,EAAAH,KAAIQ,EAAA,KAAQ8C,IAEjCnD,EAAAH,KAAIc,EAAA,IAAAyD,IAAepE,EAAAH,KAAIc,EAAA,IAAA8D,IAAS6F,sBAAsB,WAAYtK,EAAAH,KAAIQ,EAAA,MAEvEL,EAAAH,KAAIc,EAAA,IAAA8D,GAAQ8F,aAAa,gBAAiBvK,EAAAH,KAAIE,EAAA,MAC9CC,EAAAH,KAAIc,EAAA,IAAA8D,GAAQ8F,aAAa,YAAavK,EAAAH,KAAIE,EAAA,MAE1CC,EAAAH,KAAIc,EAAA,IAAAyD,IAAawD,2BAEb/H,KAAK8B,gBAAgBW,YAAczC,KAAK6C,cAC1C1C,EAAAH,KAAIc,EAAA,IAAA4B,IAAgB1B,KAApBhB,KAAqBA,KAAK8B,gBAAgBW,YAAY,GAGxD,MAAMkI,EAAQxK,EAAAH,cACdqI,WAAW,IAAMlI,EAAAH,aAAY4K,KAAKD,EAAOxK,EAAAH,KAAIc,EAAA,IAAAyD,IAAasG,YAC5D,gBAIE,IAAK1K,EAAAH,KAAIM,EAAA,OAAYH,EAAAH,KAAIQ,EAAA,KAAQ,OACjC,MAAMsK,EAAW,IAAI3K,EAAAH,KAAIM,EAAA,KAAQgJ,YACjC,IAAKnJ,EAAAH,KAAIc,EAAA,IAAAiK,IAAmB/K,KAAKoD,YAAa,CAC5C,MAAM4H,EAAarB,SAASC,cAAc,QAC1CoB,EAAWC,KAAO,UAClBD,EAAWE,YAAclL,KAAKoD,YAC9B0H,EAASK,KAAKH,EAChB,CACA,IAAK7K,EAAAH,KAAIc,EAAA,IAAAsK,IAAoBpL,KAAKmD,aAAc,CAC9C,MAAMkI,EAAc1B,SAASC,cAAc,QAC3CyB,EAAYJ,KAAO,UACnBI,EAAYH,YAAclL,KAAKmD,aAC/B2H,EAASK,KAAKE,EAChB,CACAlL,EAAAH,YAAWqJ,mBAAmByB,EAChC,EAGiBxD,GAAA,SAAAgE,EAA6BhI,GAC5C+B,EAAeiG,EAAM,WAAYtL,KAAKgD,SACtCqC,EAAeiG,EAAM,WAAqB,GAAThI,EACnC,gBAIEnD,EAAAH,KAAIQ,EAAA,MAAQ+K,OACZpL,EAAAH,KAAIc,EAAA,IAAA8D,IAAS6E,gBAAgB,wBAC/B,cAGgB/C,EAA0B8E,GAAoB,GAC5D,GAAKrL,EAAAH,KAAIc,EAAA,IAAA8D,KAETzE,EAAAH,KAAIc,EAAA,IAAA8D,GAAQ8F,aAAa,wBAAyBhE,EAAOS,IAErDhH,EAAAH,KAAIQ,EAAA,MAAQ,CACdwI,EAAuBtC,EAAQvG,EAAAH,YAAY,CAAEyL,MAAO,UAAWC,SAAU,YAEzE,MAAMC,EACJH,IACErL,EAAAH,cAA6BG,EAAAH,KAAIc,EAAA,IAAA8D,GAAQgH,QAAQ,mBAAqBC,KAE1E1L,EAAAH,cAAckH,QAASjB,IACNA,IAAMS,GAAUiF,GAE7B1F,EAAE6F,WAAWlB,OACb3E,EAAE8F,YAAYnB,KAAK,aAEnB3E,EAAE6F,WAAWP,OACbtF,EAAE8F,YAAYR,KAAK,aAGzB,CACF,KAGAnF,eAA4B4F,GAC1B,MAAMtF,EAAS1G,KAAKI,SAASJ,KAAK8B,gBAAgB+D,MAAMuB,QAAQ4E,IAC5DtF,IACFA,EAAOsB,SAAWgE,EAAMhE,SACpBtB,EAAOG,uBACHH,EAAOI,eAGnB,KAGAV,eAAoBM,GACdA,EAAOsB,WAEXtB,EAAOsB,UAAW,QACZ7H,EAAAH,KAAIc,EAAA,IAAAmL,IAAsBjL,KAA1BhB,KAA2B0G,GAC7BA,EAAOG,uBACHH,EAAOI,eAGf9G,KAAK0J,gBACD1J,KAAK6G,uBACD7G,KAAK8G,eAGT3G,EAAAH,KAAIc,EAAA,IAAA8D,KACNzE,EAAAH,cAAY6E,MAAQ6B,EAAO7B,OAG7B1E,EAAAH,KAAIc,EAAA,IAAAyD,IAAawD,0BAAyB,GAC5C,EAGcmE,GAAA,SAAAF,EAAyBtF,EAA0BiB,EAAcwE,GAC7E,MAAMtH,EAAQ7E,KAAK8C,cAAgB4D,EAAO7B,MAAQ6B,EAAO7B,MAAMuH,cAC/D,OAAQpM,KAAK+C,QACX,IAAK,cAGH,OAFAiJ,EAAMrE,KAAOwE,EACbH,EAAMK,cAAgBrM,KAAK+C,OACpB8B,EAAMyH,WAAW3E,GAC1B,IAAK,YAGH,OAFAqE,EAAMrE,KAAOwE,EACbH,EAAMK,cAAgBrM,KAAK+C,OACpB8B,EAAM0H,SAAS5E,GACxB,IAAK,WAGH,OAFAqE,EAAMrE,KAAOwE,EACbH,EAAMK,cAAgBrM,KAAK+C,OACpB8B,EAAM2H,SAAS7E,GACxB,IAAK,OAEH,OADAqE,EAAMS,kBAAmB,GAClB,EACT,QAEE,OADAT,EAAMS,kBAAmB,EAClBzM,KAAK+C,OAAO2D,EAAQyF,GAEjC,gBAIE,IAAKhM,EAAAH,KAAIc,EAAA,IAAA8D,GAAS,OAAO,EAEzB,MAAM8H,EAAWvM,EAAAH,cAAc+C,OAAQkD,IAAOA,EAAE1D,QAAQ2D,OAClDyG,GAAkB3M,KAAKgD,SAAW7C,EAAAH,KAAIU,EAAA,KAC5C8F,EAAAxG,KAAIU,GAAiB,EAAK,KAE1B,MAAMyL,EAAYhM,EAAAH,KAAIc,EAAA,IAAA8D,GAAQC,MACxB8C,EAAO3H,KAAK8C,cAAgBqJ,EAAYA,EAAUS,oBAExD,IAEIC,EAFAC,EAAW,EACXC,GAAQ,EAGZ,IAAK,IAAIC,EAAI,EAAGA,EAAI7M,EAAAH,KAAIc,EAAA,IAAAiF,GAAUG,OAAQ8G,IAAK,CAC7C,MAAMhB,EAAQ7L,EAAAH,cAAcgN,GACtBtG,EAAS1G,KAAKI,SAAS4M,GAC7BhB,EAAMzJ,QAAUpC,EAAAH,eAAkBgB,KAAlBhB,KAAmBgM,EAAOtF,EAAQiB,EAAMwE,GAEpDH,EAAMzJ,QACRpC,EAAAH,KAAIc,EAAA,IAAAmM,IAAkBjM,KAAtBhB,KAAuBgM,GACvBtG,EAAkBsG,EAAO,UACzBtG,EAAkBsG,EAAO,WAEzBc,IACKC,GAAWf,EAAMkB,yBAAyBC,GAM7CzH,EAAkBsG,EAAO,UACrBa,GACFnH,EAAkBmH,EAAM,SAE1BO,EAAepB,EAAO,SACtBa,EAAOb,IAVPoB,EAAepB,EAAO,UACtBe,GAAQ,EACRK,EAAepB,EAAO,SACtBa,EAAOb,IAWPA,EAAMhE,UAAYtB,EAAO7B,QAAUsH,IACrCH,EAAMhE,UAAW,EACjB7H,EAAAH,KAAIc,EAAA,IAAAmL,IAAsBjL,KAA1BhB,KAA2BgM,GAE/B,CAEI7L,EAAAH,KAAIQ,EAAA,MACNL,EAAAH,KAAIc,EAAA,IAAAwG,IAAiBtG,KAArBhB,KAAsBG,EAAAH,KAAIQ,EAAA,KAAQsM,GAGpC,MAAMO,EAASlN,EAAAH,aAAYyG,iBAAiB,iBAAmBtG,EAAAH,aAAayG,iBAAiB,iBAAmB,GAChH,IAAK,MAAM6G,KAASD,EAClBC,EAAM/K,OAAS,IAAI+K,EAAM7G,iBAAiB,eAAe8G,MAAOtH,GAAMA,EAAE1D,QAQ1E,OALIoK,GACFxM,EAAAH,eAAqBgB,KAArBhB,KAAsB0M,EAAUI,GAGlC3M,EAAAH,KAAIc,EAAA,IAAAmI,IAAcjI,KAAlBhB,MACO8M,CACT,EAGiBU,GAAA,SAAAd,EAAkBI,GACjC,GAAK3M,EAAAH,KAAIW,EAAA,KACT,GAAgB,GAAZmM,EACEJ,EAAW,GAAK1M,KAAKoD,aACvBkC,EAAiBC,SAASvF,KAAKoD,YAAa,eAEzC,GAAIsJ,GAAYI,EAAU,CAC/B,MAAMW,EAAUzN,KAAKqD,wBAAwBqK,SAAW1N,KAAKqD,aAAayJ,GAAY9M,KAAKqD,aACvFoK,GACFnI,EAAiBC,SAASkI,EAAS,SAEvC,CACF,gBAIE,GAAIzN,KAAK6C,gBAAkB7C,KAAK8B,gBAAgBW,aAAezC,KAAK8B,gBAAgBW,WAAWuF,UAAW,CACxG,MAAMtB,EAASvG,EAAAH,cAAc2I,KAAM1C,IAAOA,EAAE3D,WAAa2D,EAAE1D,QACvDmE,IACF1G,KAAK8B,gBAAgBgH,cAAcpC,GAC/BvG,EAAAH,KAAIQ,EAAA,MACNwI,EAAuBtC,EAAQvG,EAAAH,YAAY,CAAEyL,MAAO,UAAWC,SAAU,YAG/E,CACF,cAGkBhF,GAChBA,EAAOoF,WAAWP,OAClB7E,EAAOqF,YAAYR,KAAK,WACpB7E,IAAW1G,KAAK8B,gBAAgBW,aAClCzC,KAAK8B,gBAAgB6L,iBAAiB,MACtCxN,EAAAH,KAAIc,EAAA,IAAA8D,IAAS6E,gBAAgB,yBAEjC,EA3xBgBlK,GAAAqO,OAAyBC,CAAG,2DASbtO,GAAAU,SAAW,EAmD0B6N,EAAA,CAAnEC,EAAS,CAAEC,UAAW,2BAA4BC,KAAM/D,WAA0C3K,GAAA2O,UAAA,8BAAA,GAMvDJ,EAAA,CAA3CC,EAAS,CAAEE,KAAM/D,QAASiE,SAAS,KAAyB5O,GAAA2O,UAAA,gBAAA,GAMJJ,EAAA,CAAxDC,EAAS,CAAEC,UAAW,gBAAiBC,KAAM/D,WAAgC3K,GAAA2O,UAAA,oBAAA,GAMpBJ,EAAA,CAAzDC,EAAS,CAAEC,UAAW,iBAAkBC,KAAM/D,WAAiC3K,GAAA2O,UAAA,qBAAA,GAiBhFJ,EAAA,CAXCC,EAAS,CACRK,UAAW,CACTC,cAAcxJ,GACE,OAAVA,EAAuB,WACb,gBAAVA,GAAqC,cAAVA,GAAmC,aAAVA,GAAkC,SAAVA,EACvEA,EAEF,eAIuFtF,GAAA2O,UAAA,cAAA,GAMvEJ,EAAA,CAA5BC,EAAS,CAAEE,KAAM/D,WAA2B3K,GAAA2O,UAAA,eAAA,GAMWJ,EAAA,CAAvDC,EAAS,CAAEC,UAAW,eAAgBC,KAAM/D,WAA8B3K,GAAA2O,UAAA,kBAAA,GAMnBJ,EAAA,CAAvDC,EAAS,CAAEC,UAAW,eAAgBC,KAAM/D,WAA+B3K,GAAA2O,UAAA,mBAAA,GAMlCJ,EAAA,CAAzCC,EAAS,CAAEC,UAAW,mBAA+CzO,GAAA2O,UAAA,oBAAA,GAM5BJ,EAAA,CAAzCC,EAAS,CAAEC,UAAW,mBAA8CzO,GAAA2O,UAAA,mBAAA,GAM3BJ,EAAA,CAAzCC,EAAS,CAAEC,UAAW,mBACFzO,GAAA2O,UAAA,oBAAA,GAMmBJ,EAAA,CAAvCC,EAAS,CAAEC,UAAW,iBAAiCzO,GAAA2O,UAAA,kBAAA,GA5I7C3O,GAAsBC,GAAAsO,EAAA,CADlCQ,EAAc,qBACF/O"}
|
package/dist/bottom-sheet.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* See LICENSE file in the project root for full license text.
|
|
5
5
|
*/
|
|
6
6
|
import { __decorate, __classPrivateFieldGet, __classPrivateFieldSet } from 'tslib';
|
|
7
|
-
import { customElement, ActionElementBase, EventAttribute, ReconnectedCallback, SuppressInitialAnimation, AttachInternals, VelocityTracker, ScrollLockController, ResizeController, focusWhenReady, setCustomState, hasAssignedNodes, hasCustomState, computeCssSize, prefersReducedMotion, DesignToken, spaceSeparatedStringConverter, HtmlFor } from '@m3e/web/core';
|
|
7
|
+
import { customElement, ActionElementBase, EventAttribute, ReconnectedCallback, SuppressInitialAnimation, AttachInternals, VelocityTracker, ScrollLockController, InertController, ResizeController, focusWhenReady, setCustomState, hasAssignedNodes, hasCustomState, computeCssSize, prefersReducedMotion, registerStyleSheet, DesignToken, spaceSeparatedStringConverter, HtmlFor } from '@m3e/web/core';
|
|
8
8
|
import { LitElement, nothing, html, css, unsafeCSS } from 'lit';
|
|
9
9
|
import { property } from 'lit/decorators.js';
|
|
10
10
|
import { M3eInteractivityChecker, isModifierAllowed, addAriaReferencedId, removeAriaReferencedId } from '@m3e/web/core/a11y';
|
|
@@ -23,7 +23,7 @@ let M3eBottomSheetActionElement = class M3eBottomSheetActionElement extends Acti
|
|
|
23
23
|
};
|
|
24
24
|
M3eBottomSheetActionElement = __decorate([customElement("m3e-bottom-sheet-action")], M3eBottomSheetActionElement);
|
|
25
25
|
|
|
26
|
-
var _M3eBottomSheetElement_instances, _M3eBottomSheetElement_documentClickHandler, _M3eBottomSheetElement_documentKeyDownHandler, _M3eBottomSheetElement_windowResizeHandler,
|
|
26
|
+
var _M3eBottomSheetElement_instances, _M3eBottomSheetElement_documentClickHandler, _M3eBottomSheetElement_documentKeyDownHandler, _M3eBottomSheetElement_windowResizeHandler, _M3eBottomSheetElement_velocityTracker, _M3eBottomSheetElement_scrollLockController, _M3eBottomSheetElement_inertController, _M3eBottomSheetElement_resizeController, _M3eBottomSheetElement_trigger, _M3eBottomSheetElement_dragState, _M3eBottomSheetElement_dragged, _M3eBottomSheetElement_activeDetent, _M3eBottomSheetElement_requestDetent, _M3eBottomSheetElement_cachedContentHeight, _M3eBottomSheetElement_cachedHeaderHeight, _M3eBottomSheetElement_snapAnimation, _M3eBottomSheetElement_initialize, _M3eBottomSheetElement_handleHeaderSlotChange, _M3eBottomSheetElement_handleHeaderPointerDown, _M3eBottomSheetElement_handleHeaderPointerMove, _M3eBottomSheetElement_handleHeaderPointerUp, _M3eBottomSheetElement_handleDocumentClick, _M3eBottomSheetElement_handleDocumentKeyDown, _M3eBottomSheetElement_handleWindowResize, _M3eBottomSheetElement_handleDragHandleClick, _M3eBottomSheetElement_handleDragHandleKeyDown, _M3eBottomSheetElement_getNextHigherDetent, _M3eBottomSheetElement_getNextLowerDetent, _M3eBottomSheetElement_getClosestDetent, _M3eBottomSheetElement_computeDetentHeight, _M3eBottomSheetElement_computeMaxHeight, _M3eBottomSheetElement_computeMinHeight, _M3eBottomSheetElement_computePeekHeight, _M3eBottomSheetElement_computeFitHeight, _M3eBottomSheetElement_handleSectionResize, _M3eBottomSheetElement_snapToDetent, _M3eBottomSheetElement_snapToHeight, _M3eBottomSheetElement_updateHeight;
|
|
27
27
|
var M3eBottomSheetElement_1;
|
|
28
28
|
/**
|
|
29
29
|
* A sheet used to show secondary content anchored to the bottom of the screen.
|
|
@@ -133,12 +133,12 @@ let M3eBottomSheetElement = M3eBottomSheetElement_1 = class M3eBottomSheetElemen
|
|
|
133
133
|
/** @private */
|
|
134
134
|
_M3eBottomSheetElement_windowResizeHandler.set(this, () => __classPrivateFieldGet(this, _M3eBottomSheetElement_instances, "m", _M3eBottomSheetElement_handleWindowResize).call(this));
|
|
135
135
|
/** @private */
|
|
136
|
-
_M3eBottomSheetElement_inerts.set(this, new Array());
|
|
137
|
-
/** @private */
|
|
138
136
|
_M3eBottomSheetElement_velocityTracker.set(this, new VelocityTracker());
|
|
139
137
|
/** @private */
|
|
140
138
|
_M3eBottomSheetElement_scrollLockController.set(this, new ScrollLockController(this));
|
|
141
139
|
/** @private */
|
|
140
|
+
_M3eBottomSheetElement_inertController.set(this, new InertController(this));
|
|
141
|
+
/** @private */
|
|
142
142
|
_M3eBottomSheetElement_resizeController.set(this, new ResizeController(this, {
|
|
143
143
|
target: null,
|
|
144
144
|
skipInitial: true,
|
|
@@ -308,7 +308,7 @@ let M3eBottomSheetElement = M3eBottomSheetElement_1 = class M3eBottomSheetElemen
|
|
|
308
308
|
if (this.modal) {
|
|
309
309
|
if (this.open) {
|
|
310
310
|
__classPrivateFieldSet(this, _M3eBottomSheetElement_trigger, document.activeElement, "f");
|
|
311
|
-
__classPrivateFieldGet(this,
|
|
311
|
+
__classPrivateFieldGet(this, _M3eBottomSheetElement_inertController, "f").lock();
|
|
312
312
|
__classPrivateFieldGet(this, _M3eBottomSheetElement_scrollLockController, "f").lock();
|
|
313
313
|
this.showPopover();
|
|
314
314
|
requestAnimationFrame(() => {
|
|
@@ -324,7 +324,7 @@ let M3eBottomSheetElement = M3eBottomSheetElement_1 = class M3eBottomSheetElemen
|
|
|
324
324
|
}
|
|
325
325
|
} else {
|
|
326
326
|
__classPrivateFieldGet(this, _M3eBottomSheetElement_instances, "m", _M3eBottomSheetElement_snapToHeight).call(this, 0).then(() => {
|
|
327
|
-
__classPrivateFieldGet(this,
|
|
327
|
+
__classPrivateFieldGet(this, _M3eBottomSheetElement_inertController, "f").unlock();
|
|
328
328
|
__classPrivateFieldGet(this, _M3eBottomSheetElement_scrollLockController, "f").unlock();
|
|
329
329
|
document.removeEventListener("click", __classPrivateFieldGet(this, _M3eBottomSheetElement_documentClickHandler, "f"));
|
|
330
330
|
document.removeEventListener("keydown", __classPrivateFieldGet(this, _M3eBottomSheetElement_documentKeyDownHandler, "f"));
|
|
@@ -347,9 +347,9 @@ let M3eBottomSheetElement = M3eBottomSheetElement_1 = class M3eBottomSheetElemen
|
|
|
347
347
|
_M3eBottomSheetElement_documentClickHandler = new WeakMap();
|
|
348
348
|
_M3eBottomSheetElement_documentKeyDownHandler = new WeakMap();
|
|
349
349
|
_M3eBottomSheetElement_windowResizeHandler = new WeakMap();
|
|
350
|
-
_M3eBottomSheetElement_inerts = new WeakMap();
|
|
351
350
|
_M3eBottomSheetElement_velocityTracker = new WeakMap();
|
|
352
351
|
_M3eBottomSheetElement_scrollLockController = new WeakMap();
|
|
352
|
+
_M3eBottomSheetElement_inertController = new WeakMap();
|
|
353
353
|
_M3eBottomSheetElement_resizeController = new WeakMap();
|
|
354
354
|
_M3eBottomSheetElement_trigger = new WeakMap();
|
|
355
355
|
_M3eBottomSheetElement_dragState = new WeakMap();
|
|
@@ -658,27 +658,8 @@ _M3eBottomSheetElement_updateHeight = function _M3eBottomSheetElement_updateHeig
|
|
|
658
658
|
content.inert = height <= __classPrivateFieldGet(this, _M3eBottomSheetElement_instances, "m", _M3eBottomSheetElement_computePeekHeight).call(this);
|
|
659
659
|
}
|
|
660
660
|
};
|
|
661
|
-
_M3eBottomSheetElement_applyInert = function _M3eBottomSheetElement_applyInert() {
|
|
662
|
-
__classPrivateFieldGet(this, _M3eBottomSheetElement_inerts, "f").length = 0;
|
|
663
|
-
for (let current = this; current.parentNode && current.parentNode !== document.documentElement; current = current.parentNode) {
|
|
664
|
-
for (const sibling of current.parentNode.children) {
|
|
665
|
-
if (sibling instanceof HTMLElement && sibling !== current && !sibling.inert) {
|
|
666
|
-
sibling.inert = true;
|
|
667
|
-
__classPrivateFieldGet(this, _M3eBottomSheetElement_inerts, "f").push(sibling);
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
};
|
|
672
|
-
_M3eBottomSheetElement_restoreInert = function _M3eBottomSheetElement_restoreInert() {
|
|
673
|
-
__classPrivateFieldGet(this, _M3eBottomSheetElement_inerts, "f").forEach(x => x.inert = false);
|
|
674
|
-
__classPrivateFieldGet(this, _M3eBottomSheetElement_inerts, "f").length = 0;
|
|
675
|
-
};
|
|
676
661
|
(() => {
|
|
677
|
-
|
|
678
|
-
const lightDomStyle = new CSSStyleSheet();
|
|
679
|
-
lightDomStyle.replaceSync(css`@property --_bottom-sheet-height { syntax: "<length>"; inherits: false; initial-value: 50vh; } m3e-bottom-sheet > [slot="header"] { margin-block-end: var(--m3e-bottom-sheet-padding-block, 0.5rem); margin-inline: var(--m3e-bottom-sheet-padding-inline, 1rem); }</length>`.toString());
|
|
680
|
-
document.adoptedStyleSheets.push(lightDomStyle);
|
|
681
|
-
}
|
|
662
|
+
registerStyleSheet(css`@property --_bottom-sheet-height { syntax: "<length>"; inherits: false; initial-value: 50vh; } m3e-bottom-sheet > [slot="header"] { margin-block-end: var(--m3e-bottom-sheet-padding-block, 0.5rem); margin-inline: var(--m3e-bottom-sheet-padding-inline, 1rem); }</length>`);
|
|
682
663
|
})();
|
|
683
664
|
/** The styles of the element. */
|
|
684
665
|
M3eBottomSheetElement.styles = css`:host { display: block; position: fixed; left: 50%; top: calc(100vh - var(--_bottom-sheet-height)); margin: 0; padding: 0; outline: none; overflow: hidden; border: none; box-sizing: border-box; width: var(--m3e-bottom-sheet-width, 100%); max-width: var(--m3e-bottom-sheet-max-width, 40rem); height: var(--_bottom-sheet-height); color: var(--m3e-bottom-sheet-color, ${DesignToken.color.onSurface}); background-color: var(--m3e-bottom-sheet-container-color, ${DesignToken.color.surfaceContainerLow}); } :host(:not(:state(-no-animate))) { transition: ${unsafeCSS(`transform ${DesignToken.motion.duration.medium2} ${DesignToken.motion.easing.standardDecelerate},
|