@universal-material/web 3.3.17 → 3.3.18
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/custom-elements.json +9141 -9061
- package/menu/menu.styles.js +1 -1
- package/menu/menu.styles.js.map +1 -1
- package/package.json +1 -1
- package/select/select.d.ts.map +1 -1
- package/select/select.js +6 -0
- package/select/select.js.map +1 -1
- package/select/select.styles.d.ts.map +1 -1
- package/select/select.styles.js +1 -2
- package/select/select.styles.js.map +1 -1
- package/typeahead/typeahead.d.ts +2 -5
- package/typeahead/typeahead.d.ts.map +1 -1
- package/typeahead/typeahead.js +66 -38
- package/typeahead/typeahead.js.map +1 -1
- package/typeahead/typeahead.styles.d.ts.map +1 -1
- package/typeahead/typeahead.styles.js +4 -0
- package/typeahead/typeahead.styles.js.map +1 -1
- package/vscode.html-custom-data.json +325 -310
package/menu/menu.styles.js
CHANGED
|
@@ -4,6 +4,7 @@ export const styles = css `
|
|
|
4
4
|
--u-elevation-level: var(--u-menu-elevation-level, 2);
|
|
5
5
|
display: block;
|
|
6
6
|
width: 0;
|
|
7
|
+
z-index: var(--u-menu-z-index, 1020);
|
|
7
8
|
}
|
|
8
9
|
|
|
9
10
|
:host([positioning=relative]) {
|
|
@@ -40,7 +41,6 @@ export const styles = css `
|
|
|
40
41
|
transition: transform 350ms cubic-bezier(0.19, 1, 0.22, 1) 350ms, opacity 350ms;
|
|
41
42
|
transform: scale3d(1, 0, 0);
|
|
42
43
|
transform-origin: top;
|
|
43
|
-
z-index: var(--u-menu-z-index, 1020);
|
|
44
44
|
}
|
|
45
45
|
.menu.up {
|
|
46
46
|
transform-origin: bottom;
|
package/menu/menu.styles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.styles.js","sourceRoot":"","sources":["../../src/menu/menu.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n :host {\n --u-elevation-level: var(--u-menu-elevation-level, 2);\n display: block;\n width: 0;\n }\n\n :host([positioning=relative]) {\n position: relative;\n }\n\n :host([positioning=fixed]) {\n position: fixed;\n }\n\n .ref {\n position: absolute;\n inset-inline-start: 0;\n pointer-events: none;\n }\n\n .content {\n width: 100%;\n padding-block: var(--u-menu-padding, 8px);\n opacity: 0;\n transition: opacity 1ms 400ms;\n scroll-padding-block: 32px;\n overflow: auto;\n }\n\n .menu {\n position: absolute;\n display: flex;\n min-width: var(--u-menu-min-width, 112px);\n max-width: var(--u-menu-max-width, 280px);\n background: var(--u-menu-bg-color, var(--u-color-surface-container, rgb(243, 237, 247)));\n border-radius: var(--u-menu-shape-corner, var(--u-shape-corner-extra-small, 4px));\n opacity: 0;\n transition: transform 350ms cubic-bezier(0.19, 1, 0.22, 1) 350ms, opacity 350ms;\n transform: scale3d(1, 0, 0);\n transform-origin: top;\n
|
|
1
|
+
{"version":3,"file":"menu.styles.js","sourceRoot":"","sources":["../../src/menu/menu.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n :host {\n --u-elevation-level: var(--u-menu-elevation-level, 2);\n display: block;\n width: 0;\n z-index: var(--u-menu-z-index, 1020);\n }\n\n :host([positioning=relative]) {\n position: relative;\n }\n\n :host([positioning=fixed]) {\n position: fixed;\n }\n\n .ref {\n position: absolute;\n inset-inline-start: 0;\n pointer-events: none;\n }\n\n .content {\n width: 100%;\n padding-block: var(--u-menu-padding, 8px);\n opacity: 0;\n transition: opacity 1ms 400ms;\n scroll-padding-block: 32px;\n overflow: auto;\n }\n\n .menu {\n position: absolute;\n display: flex;\n min-width: var(--u-menu-min-width, 112px);\n max-width: var(--u-menu-max-width, 280px);\n background: var(--u-menu-bg-color, var(--u-color-surface-container, rgb(243, 237, 247)));\n border-radius: var(--u-menu-shape-corner, var(--u-shape-corner-extra-small, 4px));\n opacity: 0;\n transition: transform 350ms cubic-bezier(0.19, 1, 0.22, 1) 350ms, opacity 350ms;\n transform: scale3d(1, 0, 0);\n transform-origin: top;\n }\n .menu.up {\n transform-origin: bottom;\n }\n .menu.open {\n opacity: 1;\n transition: transform 350ms cubic-bezier(0.19, 1, 0.22, 1), opacity 250ms;\n transform: scale3d(1, 1, 1);\n }\n .menu.open .content {\n opacity: 1;\n transition: opacity 300ms 150ms;\n }\n\n @keyframes menu-open {\n from {\n opacity: 0;\n transform: scale3d(1, 0, 0);\n }\n to {\n opacity: 1;\n transform: scale3d(1, 1, 1);\n }\n }\n`;\n"]}
|
package/package.json
CHANGED
package/select/select.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAIhD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIvC,OAAO,aAAa,CAAC;AAErB,qBACa,QAAS,SAAQ,eAAgB,YAAW,WAAW;;IAClE,OAAgB,MAAM,iCAAoC;IAE1D,aAAa,EAAE,cAAc,CAMxB;
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAIhD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIvC,OAAO,aAAa,CAAC;AAErB,qBACa,QAAS,SAAQ,eAAgB,YAAW,WAAW;;IAClE,OAAgB,MAAM,iCAAoC;IAE1D,aAAa,EAAE,cAAc,CAMxB;IAgBL;;OAEG;IACH,IACI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAQtB;IAEsB,KAAK,EAAG,MAAM,CAAC;IACd,OAAO,EAAG,iBAAiB,CAAC;IAC7B,MAAM,EAAG,WAAW,CAAC;IAEgB,eAAe,EAAE,UAAU,GAAG,OAAO,CAAc;IAE/G;;OAEG;IACH,IACI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,aAAa,CAAC,KAAK,EAAE,MAAM,EAE9B;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,QAAQ,EAAE,CAEhC;IAED,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAIzB;;IAoBD,cAAc;cAsGK,aAAa,IAAI,cAAc;cAW/B,kBAAkB,IAAI,cAAc;cAQpC,yBAAyB,IAAI,cAAc;cAO3C,OAAO,CAAC,iBAAiB,EAAE,cAAc;IAMnD,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUhF,iBAAiB;IAOjB,oBAAoB;IAyE7B,IAAI,UAAU,IAAI,QAAQ,EAAE,CAE3B;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,QAAQ,CAAC;KACtB;CACF"}
|
package/select/select.js
CHANGED
|
@@ -11,6 +11,7 @@ let UmSelect = class UmSelect extends UmTextFieldBase {
|
|
|
11
11
|
static { this.styles = [UmTextFieldBase.styles, styles]; }
|
|
12
12
|
#list;
|
|
13
13
|
#navigationController;
|
|
14
|
+
#resizeObserver;
|
|
14
15
|
#mutationObserver;
|
|
15
16
|
#connected;
|
|
16
17
|
/**
|
|
@@ -85,6 +86,8 @@ let UmSelect = class UmSelect extends UmTextFieldBase {
|
|
|
85
86
|
this._button.setAttribute('aria-expanded', 'false');
|
|
86
87
|
this.#navigationController.blurMenu();
|
|
87
88
|
};
|
|
89
|
+
this.#resizeObserver = new ResizeObserver(() => this.#setMenuWidthProperty());
|
|
90
|
+
this.#resizeObserver.observe(this);
|
|
88
91
|
this.#mutationObserver = new MutationObserver(() => this._updateOptions());
|
|
89
92
|
this.#mutationObserver.observe(this, {
|
|
90
93
|
characterData: true,
|
|
@@ -92,6 +95,9 @@ let UmSelect = class UmSelect extends UmTextFieldBase {
|
|
|
92
95
|
subtree: true,
|
|
93
96
|
});
|
|
94
97
|
}
|
|
98
|
+
#setMenuWidthProperty() {
|
|
99
|
+
this.style.setProperty('--_menu-width', `${this.clientWidth}px`);
|
|
100
|
+
}
|
|
95
101
|
_updateOptions() {
|
|
96
102
|
const options = this._options;
|
|
97
103
|
for (const option of options) {
|
package/select/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select/select.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyValues } from '@lit/reactive-element';\n\nimport { html, svg, TemplateResult } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { html as staticHtml } from 'lit/static-html.js';\n\nimport { UmMenu } from '../menu/menu.js';\nimport { UmMenuField } from '../shared/menu-field/menu-field.js';\nimport { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';\nimport { ExtendedSelect } from './extended-select.js';\nimport { UmOption } from './option.js';\nimport { SelectNavigationController } from './select-navigation-controller.js';\nimport { styles } from './select.styles.js';\n\nimport './option.js';\n\n@customElement('u-select')\nexport class UmSelect extends UmTextFieldBase implements UmMenuField {\n static override styles = [UmTextFieldBase.styles, styles];\n\n _nativeSelect: ExtendedSelect = (() => {\n const select = document.createElement('select') as ExtendedSelect;\n select.setAttribute('tabindex', '-1');\n select.setAttribute('part', 'select');\n\n return select;\n })();\n\n readonly #list: HTMLElement = (() => {\n const list = document.createElement('div');\n list.role = 'listbox';\n list.id = 'list';\n list.className = 'list';\n\n return list;\n })();\n\n readonly #navigationController = new SelectNavigationController(this);\n readonly #mutationObserver: MutationObserver;\n #connected = false;\n\n /**\n * The `value` of the selected option\n */\n @state()\n get value(): string {\n return this._nativeSelect.value;\n }\n\n set value(value: string) {\n this._nativeSelect.value = value;\n\n if (!this.#connected) {\n return;\n }\n\n this.elementInternals.setFormValue(value);\n }\n\n @query('u-menu', true) _menu!: UmMenu;\n @query('.button', true) _button!: HTMLButtonElement;\n @query('.input', true) _input!: HTMLElement;\n\n @property({ reflect: true, attribute: 'menu-positioning' }) menuPositioning: 'relative' | 'fixed' = 'relative';\n\n /**\n * The index of the selected option. When there's no selected option the value is `-1`.\n */\n @state()\n get selectedIndex(): number {\n return this._nativeSelect.selectedIndex;\n }\n\n set selectedIndex(index: number) {\n this._nativeSelect.selectedIndex = index;\n }\n\n /**\n * An `Array` containing the selected `UmOption` or empty if there's no selected option. Multiple selection is not supported.\n */\n get selectedOptions(): UmOption[] {\n return this._nativeSelect.selectedOptions.length ? [this._nativeSelect.selectedOptions[0]._parent] : [];\n }\n\n get _options(): UmOption[] {\n const options = Array.from(this.querySelectorAll<HTMLElement>('u-option'));\n\n return options.filter(o => o instanceof UmOption);\n }\n\n constructor() {\n super();\n\n this.#mutationObserver = new MutationObserver(() => this._updateOptions());\n this.#mutationObserver.observe(this, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n\n _updateOptions() {\n const options = this._options;\n\n for (const option of options) {\n option._select = this;\n }\n\n this.#updateOptions(options);\n this.#updateAccessibilityList(options);\n\n const selectedOption = this.selectedOptions[0];\n\n if (!selectedOption) {\n return;\n }\n\n selectedOption.selected = selectedOption.selected;\n this.empty = !selectedOption.textContent?.trim();\n // this._button.setAttribute('aria-labelledby', selectedOption._listItem.id);\n }\n\n #updateOptions(options: UmOption[]) {\n const maxLength = Math.max(options.length, this._nativeSelect.children.length);\n\n for (let i = 0; i < maxLength; i++) {\n const option = options[i];\n const nativeOption = this._nativeSelect.children[i];\n\n if (!option) {\n nativeOption?.remove();\n continue;\n }\n\n option._nativeOption.textContent = option.textContent;\n\n if (!nativeOption) {\n this._nativeSelect.appendChild(option._nativeOption);\n continue;\n }\n\n nativeOption.insertAdjacentElement('beforebegin', option._nativeOption);\n }\n }\n\n #updateAccessibilityList(options: UmOption[]) {\n const maxLength = Math.max(options.length, this.#list.children.length);\n\n for (let i = 0; i < maxLength; i++) {\n const option = options[i];\n let item = this.#list.children[i];\n\n if (!option) {\n item?.remove();\n continue;\n }\n\n if (!item) {\n item = this.#createListItem(`item-${i + 1}`);\n this.#list.appendChild(item);\n }\n\n item.textContent = option.textContent;\n }\n }\n\n #createListItem(id: string): HTMLElement {\n const item = document.createElement('div');\n item.role = 'option';\n item.id = id;\n\n item.textContent = this.textContent;\n\n return item;\n }\n\n #setSelectedOption() {\n const options = this._options;\n\n const selectedClassOptions = options.filter(o => o.classList.contains('selected'));\n\n let found = false;\n\n for (const option of selectedClassOptions) {\n if (option.selected) {\n found = true;\n continue;\n }\n\n option.classList.remove('selected');\n }\n\n if (found) {\n return;\n }\n\n const selectedOption = this.selectedOptions[0];\n\n if (selectedOption) {\n selectedOption.classList.add('selected');\n }\n }\n\n protected override renderControl(): TemplateResult {\n return staticHtml`\n <button \n class=\"button\"\n role=\"combobox\"\n aria-expanded=\"false\"\n aria-owns=\"select\"\n ?disabled=${this.disabled}></button>\n <div class=\"input\"></div>`;\n }\n\n protected override renderAfterContent(): TemplateResult {\n return html`\n <u-menu positioning=\"${this.menuPositioning}\">\n <slot></slot>\n </u-menu>\n `;\n }\n\n protected override renderDefaultTrailingIcon(): TemplateResult {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\"/>\n </svg>`;\n }\n\n protected override updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n this.empty = !this.selectedOptions[0]?.textContent?.trim();\n this.elementInternals.setFormValue(this._nativeSelect.value || null);\n }\n\n override attributeChangedCallback(name: string, _old: string | null, value: string | null) {\n super.attributeChangedCallback(name, _old, value);\n\n if (name !== 'disabled') {\n return;\n }\n\n this._nativeSelect.disabled = value === null;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n this.#connected = true;\n this.#attach();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n\n this.#detach();\n }\n\n readonly #handleClick = (e: MouseEvent) => {\n this._menu.toggle();\n\n if (!this._menu.open || !this.selectedOptions.length) {\n return;\n }\n\n this.#navigationController.focusMenu(this.selectedOptions[0], 0, e.detail === 0, false);\n };\n\n #handleMenuClick(e: Event) {\n e.stopPropagation();\n }\n\n readonly #handleMenuOpen = () => {\n this._button.setAttribute('aria-expanded', 'true');\n this.#setSelectedOption();\n };\n\n readonly #handleMenuOpened = () => {\n if (!this.selectedOptions.length) {\n return;\n }\n\n const option = this.selectedOptions[0];\n option.scrollIntoView({ block: 'nearest' });\n };\n\n readonly #handleMenuClose = () => {\n this._button.setAttribute('aria-expanded', 'false');\n this.#navigationController.blurMenu();\n };\n\n async #attach(): Promise<void> {\n await this.updateComplete;\n\n this._nativeSelect.disabled = this.hasAttribute('disabled');\n\n this.#navigationController.attach(this);\n this._updateOptions();\n\n if (this._nativeSelect.parentElement !== this._input) {\n this._input.appendChild(this._nativeSelect);\n }\n\n this._input.appendChild(this.#list);\n this._button.addEventListener('click', this.#handleClick);\n\n this._menu.anchorElement = this._container;\n this._menu.addEventListener('click', this.#handleMenuClick);\n this._menu.addEventListener('open', this.#handleMenuOpen);\n this._menu.addEventListener('opened', this.#handleMenuOpened);\n this._menu.addEventListener('close', this.#handleMenuClose);\n }\n\n async #detach(): Promise<void> {\n await this.updateComplete;\n\n this.#navigationController.detach();\n this.#connected = false;\n this._button.removeEventListener('click', this.#handleClick);\n this._menu.removeEventListener('click', this.#handleMenuClick);\n this._menu.removeEventListener('open', this.#handleMenuOpen);\n this._menu.removeEventListener('opened', this.#handleMenuOpened);\n this._menu.removeEventListener('close', this.#handleMenuClose);\n }\n\n get _menuItems(): UmOption[] {\n return this._options;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-select': UmSelect;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select/select.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyValues } from '@lit/reactive-element';\n\nimport { html, svg, TemplateResult } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { html as staticHtml } from 'lit/static-html.js';\n\nimport { UmMenu } from '../menu/menu.js';\nimport { UmMenuField } from '../shared/menu-field/menu-field.js';\nimport { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';\nimport { ExtendedSelect } from './extended-select.js';\nimport { UmOption } from './option.js';\nimport { SelectNavigationController } from './select-navigation-controller.js';\nimport { styles } from './select.styles.js';\n\nimport './option.js';\n\n@customElement('u-select')\nexport class UmSelect extends UmTextFieldBase implements UmMenuField {\n static override styles = [UmTextFieldBase.styles, styles];\n\n _nativeSelect: ExtendedSelect = (() => {\n const select = document.createElement('select') as ExtendedSelect;\n select.setAttribute('tabindex', '-1');\n select.setAttribute('part', 'select');\n\n return select;\n })();\n\n readonly #list: HTMLElement = (() => {\n const list = document.createElement('div');\n list.role = 'listbox';\n list.id = 'list';\n list.className = 'list';\n\n return list;\n })();\n\n readonly #navigationController = new SelectNavigationController(this);\n readonly #resizeObserver: ResizeObserver;\n readonly #mutationObserver: MutationObserver;\n #connected = false;\n\n /**\n * The `value` of the selected option\n */\n @state()\n get value(): string {\n return this._nativeSelect.value;\n }\n\n set value(value: string) {\n this._nativeSelect.value = value;\n\n if (!this.#connected) {\n return;\n }\n\n this.elementInternals.setFormValue(value);\n }\n\n @query('u-menu', true) _menu!: UmMenu;\n @query('.button', true) _button!: HTMLButtonElement;\n @query('.input', true) _input!: HTMLElement;\n\n @property({ reflect: true, attribute: 'menu-positioning' }) menuPositioning: 'relative' | 'fixed' = 'relative';\n\n /**\n * The index of the selected option. When there's no selected option the value is `-1`.\n */\n @state()\n get selectedIndex(): number {\n return this._nativeSelect.selectedIndex;\n }\n\n set selectedIndex(index: number) {\n this._nativeSelect.selectedIndex = index;\n }\n\n /**\n * An `Array` containing the selected `UmOption` or empty if there's no selected option. Multiple selection is not supported.\n */\n get selectedOptions(): UmOption[] {\n return this._nativeSelect.selectedOptions.length ? [this._nativeSelect.selectedOptions[0]._parent] : [];\n }\n\n get _options(): UmOption[] {\n const options = Array.from(this.querySelectorAll<HTMLElement>('u-option'));\n\n return options.filter(o => o instanceof UmOption);\n }\n\n constructor() {\n super();\n\n this.#resizeObserver = new ResizeObserver(() => this.#setMenuWidthProperty());\n this.#resizeObserver.observe(this);\n\n this.#mutationObserver = new MutationObserver(() => this._updateOptions());\n this.#mutationObserver.observe(this, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n\n #setMenuWidthProperty(): void {\n this.style.setProperty('--_menu-width', `${this.clientWidth}px`);\n }\n\n _updateOptions() {\n const options = this._options;\n\n for (const option of options) {\n option._select = this;\n }\n\n this.#updateOptions(options);\n this.#updateAccessibilityList(options);\n\n const selectedOption = this.selectedOptions[0];\n\n if (!selectedOption) {\n return;\n }\n\n selectedOption.selected = selectedOption.selected;\n this.empty = !selectedOption.textContent?.trim();\n // this._button.setAttribute('aria-labelledby', selectedOption._listItem.id);\n }\n\n #updateOptions(options: UmOption[]) {\n const maxLength = Math.max(options.length, this._nativeSelect.children.length);\n\n for (let i = 0; i < maxLength; i++) {\n const option = options[i];\n const nativeOption = this._nativeSelect.children[i];\n\n if (!option) {\n nativeOption?.remove();\n continue;\n }\n\n option._nativeOption.textContent = option.textContent;\n\n if (!nativeOption) {\n this._nativeSelect.appendChild(option._nativeOption);\n continue;\n }\n\n nativeOption.insertAdjacentElement('beforebegin', option._nativeOption);\n }\n }\n\n #updateAccessibilityList(options: UmOption[]) {\n const maxLength = Math.max(options.length, this.#list.children.length);\n\n for (let i = 0; i < maxLength; i++) {\n const option = options[i];\n let item = this.#list.children[i];\n\n if (!option) {\n item?.remove();\n continue;\n }\n\n if (!item) {\n item = this.#createListItem(`item-${i + 1}`);\n this.#list.appendChild(item);\n }\n\n item.textContent = option.textContent;\n }\n }\n\n #createListItem(id: string): HTMLElement {\n const item = document.createElement('div');\n item.role = 'option';\n item.id = id;\n\n item.textContent = this.textContent;\n\n return item;\n }\n\n #setSelectedOption() {\n const options = this._options;\n\n const selectedClassOptions = options.filter(o => o.classList.contains('selected'));\n\n let found = false;\n\n for (const option of selectedClassOptions) {\n if (option.selected) {\n found = true;\n continue;\n }\n\n option.classList.remove('selected');\n }\n\n if (found) {\n return;\n }\n\n const selectedOption = this.selectedOptions[0];\n\n if (selectedOption) {\n selectedOption.classList.add('selected');\n }\n }\n\n protected override renderControl(): TemplateResult {\n return staticHtml`\n <button \n class=\"button\"\n role=\"combobox\"\n aria-expanded=\"false\"\n aria-owns=\"select\"\n ?disabled=${this.disabled}></button>\n <div class=\"input\"></div>`;\n }\n\n protected override renderAfterContent(): TemplateResult {\n return html`\n <u-menu positioning=\"${this.menuPositioning}\">\n <slot></slot>\n </u-menu>\n `;\n }\n\n protected override renderDefaultTrailingIcon(): TemplateResult {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\"/>\n </svg>`;\n }\n\n protected override updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n this.empty = !this.selectedOptions[0]?.textContent?.trim();\n this.elementInternals.setFormValue(this._nativeSelect.value || null);\n }\n\n override attributeChangedCallback(name: string, _old: string | null, value: string | null) {\n super.attributeChangedCallback(name, _old, value);\n\n if (name !== 'disabled') {\n return;\n }\n\n this._nativeSelect.disabled = value === null;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n this.#connected = true;\n this.#attach();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n\n this.#detach();\n }\n\n readonly #handleClick = (e: MouseEvent) => {\n this._menu.toggle();\n\n if (!this._menu.open || !this.selectedOptions.length) {\n return;\n }\n\n this.#navigationController.focusMenu(this.selectedOptions[0], 0, e.detail === 0, false);\n };\n\n #handleMenuClick(e: Event) {\n e.stopPropagation();\n }\n\n readonly #handleMenuOpen = () => {\n this._button.setAttribute('aria-expanded', 'true');\n this.#setSelectedOption();\n };\n\n readonly #handleMenuOpened = () => {\n if (!this.selectedOptions.length) {\n return;\n }\n\n const option = this.selectedOptions[0];\n option.scrollIntoView({ block: 'nearest' });\n };\n\n readonly #handleMenuClose = () => {\n this._button.setAttribute('aria-expanded', 'false');\n this.#navigationController.blurMenu();\n };\n\n async #attach(): Promise<void> {\n await this.updateComplete;\n\n this._nativeSelect.disabled = this.hasAttribute('disabled');\n\n this.#navigationController.attach(this);\n this._updateOptions();\n\n if (this._nativeSelect.parentElement !== this._input) {\n this._input.appendChild(this._nativeSelect);\n }\n\n this._input.appendChild(this.#list);\n this._button.addEventListener('click', this.#handleClick);\n\n this._menu.anchorElement = this._container;\n this._menu.addEventListener('click', this.#handleMenuClick);\n this._menu.addEventListener('open', this.#handleMenuOpen);\n this._menu.addEventListener('opened', this.#handleMenuOpened);\n this._menu.addEventListener('close', this.#handleMenuClose);\n }\n\n async #detach(): Promise<void> {\n await this.updateComplete;\n\n this.#navigationController.detach();\n this.#connected = false;\n this._button.removeEventListener('click', this.#handleClick);\n this._menu.removeEventListener('click', this.#handleMenuClick);\n this._menu.removeEventListener('open', this.#handleMenuOpen);\n this._menu.removeEventListener('opened', this.#handleMenuOpened);\n this._menu.removeEventListener('close', this.#handleMenuClose);\n }\n\n get _menuItems(): UmOption[] {\n return this._options;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-select': UmSelect;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.styles.d.ts","sourceRoot":"","sources":["../../src/select/select.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"select.styles.d.ts","sourceRoot":"","sources":["../../src/select/select.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAmClB,CAAC"}
|
package/select/select.styles.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.styles.js","sourceRoot":"","sources":["../../src/select/select.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"select.styles.js","sourceRoot":"","sources":["../../src/select/select.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n u-menu {\n display: block;\n width: 100%;\n }\n u-menu::part(menu) {\n width: var(--_menu-width);\n }\n\n :host(:not([disabled])) .button {\n cursor: pointer;\n }\n\n .button {\n position: absolute;\n inset: 0;\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n appearance: none;\n }\n\n select {\n pointer-events: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .list {\n width: 2px;\n height: 2px;\n margin: -1px;\n overflow: hidden;\n }\n`;\n"]}
|
package/typeahead/typeahead.d.ts
CHANGED
|
@@ -12,7 +12,6 @@ export declare class UmTypeahead extends LitElement {
|
|
|
12
12
|
#private;
|
|
13
13
|
static readonly formAssociated = true;
|
|
14
14
|
static styles: import("lit").CSSResult;
|
|
15
|
-
private target;
|
|
16
15
|
private results;
|
|
17
16
|
/**
|
|
18
17
|
* The datasource of the typeahead. Accepts an `Array` or a `Promise<[]>`.
|
|
@@ -60,6 +59,8 @@ export declare class UmTypeahead extends LitElement {
|
|
|
60
59
|
* The value for the `spellcheck` attribute for the target element.
|
|
61
60
|
*/
|
|
62
61
|
spellcheck: boolean;
|
|
62
|
+
fitTarget: boolean;
|
|
63
|
+
positioning: 'relative' | 'fixed';
|
|
63
64
|
get form(): HTMLFormElement | null;
|
|
64
65
|
/**
|
|
65
66
|
* Gets or sets the current value of the typeahead.
|
|
@@ -81,10 +82,6 @@ export declare class UmTypeahead extends LitElement {
|
|
|
81
82
|
connectedCallback(): void;
|
|
82
83
|
disconnectedCallback(): void;
|
|
83
84
|
protected render(): HTMLTemplateResult;
|
|
84
|
-
private getTargetValue;
|
|
85
|
-
private setTargetValue;
|
|
86
|
-
private getMenuAnchor;
|
|
87
|
-
private getTextValue;
|
|
88
85
|
}
|
|
89
86
|
declare global {
|
|
90
87
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead.d.ts","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAI3D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAKzC,OAAO,iBAAiB,CAAC;AACzB,OAAO,sBAAsB,CAAC;AAC9B,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,qBACa,WAAY,SAAQ,UAAU;;IACzC,MAAM,CAAC,QAAQ,CAAC,cAAc,QAAQ;IAEtC,OAAgB,MAAM,0BAAU;
|
|
1
|
+
{"version":3,"file":"typeahead.d.ts","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAI3D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAKzC,OAAO,iBAAiB,CAAC;AACzB,OAAO,sBAAsB,CAAC;AAC9B,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,qBACa,WAAY,SAAQ,UAAU;;IACzC,MAAM,CAAC,QAAQ,CAAC,cAAc,QAAQ;IAEtC,OAAgB,MAAM,0BAAU;IAsBvB,OAAO,CAAC,OAAO,CAAS;IAEjC;;OAEG;IACM,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAE1E;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAEhD;;;;OAIG;IACH,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAE7D;;OAEG;IACwC,QAAQ,SAAO;IAE1D;;OAEG;IACwC,KAAK,SAAM;IAEtD;;;;OAIG;IACwC,SAAS,SAAK;IAEzD;;;;OAIG;IAEH,WAAW,UAAS;IAEpB;;OAEG;IACyC,QAAQ,UAAS;IAE7D;;OAEG;IAC0B,YAAY,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAS;IAEzE;;OAEG;IACmC,UAAU,UAAS;IAEY,SAAS,UAAS;IAE1D,WAAW,EAAE,UAAU,GAAG,OAAO,CAAc;IAE5E,IAAI,IAAI,IAAI,eAAe,GAAG,IAAI,CAEjC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,EAOnB;IAEQ,KAAK;IAId,KAAK;IASL;;OAEG;IACH,IACI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAMrC;IAEgB,KAAK,EAAG,MAAM,CAAC;IACP,SAAS,EAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE5D,IAAI,UAAU,IAAI,UAAU,EAAE,CAE7B;;IAOQ,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAgBhF,iBAAiB;IAWjB,oBAAoB;cA2GV,MAAM,IAAI,kBAAkB;CAgKhD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,WAAW,CAAC;KAC5B;CACF"}
|
package/typeahead/typeahead.js
CHANGED
|
@@ -13,7 +13,9 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
13
13
|
static { this.styles = styles; }
|
|
14
14
|
#targetId;
|
|
15
15
|
#connected;
|
|
16
|
+
#target;
|
|
16
17
|
#documentMutationObserver;
|
|
18
|
+
#targetResizeObserver;
|
|
17
19
|
#navigationController;
|
|
18
20
|
#termNormalized;
|
|
19
21
|
#debounceTimeout;
|
|
@@ -36,14 +38,14 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
40
|
focus() {
|
|
39
|
-
this
|
|
41
|
+
this.#target?.focus();
|
|
40
42
|
}
|
|
41
43
|
clear() {
|
|
42
|
-
if (!this
|
|
44
|
+
if (!this.#target) {
|
|
43
45
|
return;
|
|
44
46
|
}
|
|
45
47
|
this.#termNormalized = '';
|
|
46
|
-
this
|
|
48
|
+
this.#setTargetValue('');
|
|
47
49
|
}
|
|
48
50
|
/**
|
|
49
51
|
* The id of the target element to attach the typeahead.
|
|
@@ -63,8 +65,9 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
63
65
|
constructor() {
|
|
64
66
|
super();
|
|
65
67
|
this.#connected = false;
|
|
66
|
-
this
|
|
68
|
+
this.#target = null;
|
|
67
69
|
this.#documentMutationObserver = null;
|
|
70
|
+
this.#targetResizeObserver = null;
|
|
68
71
|
this.#navigationController = new MenuFieldNavigationController(this);
|
|
69
72
|
this.#termNormalized = '';
|
|
70
73
|
this.#debounceTimeout = null;
|
|
@@ -100,6 +103,8 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
100
103
|
* The value for the `spellcheck` attribute for the target element.
|
|
101
104
|
*/
|
|
102
105
|
this.spellcheck = false;
|
|
106
|
+
this.fitTarget = false;
|
|
107
|
+
this.positioning = 'relative';
|
|
103
108
|
this.#handleFocus = async () => {
|
|
104
109
|
if (this.openOnFocus) {
|
|
105
110
|
await this.#updateResults();
|
|
@@ -109,21 +114,21 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
109
114
|
if (this.#debounceTimeout) {
|
|
110
115
|
clearTimeout(this.#debounceTimeout);
|
|
111
116
|
}
|
|
112
|
-
this.#setValueAndDispatchEvents(this.editable ? this
|
|
117
|
+
this.#setValueAndDispatchEvents(this.editable ? this.#getTargetValue() : null, true);
|
|
113
118
|
this.#debounceTimeout = setTimeout(async () => await this.#updateResults(true), this.debounce);
|
|
114
119
|
};
|
|
115
120
|
this.#elementInternals = this.attachInternals();
|
|
116
121
|
}
|
|
117
122
|
attributeChangedCallback(name, _old, value) {
|
|
118
123
|
super.attributeChangedCallback(name, _old, value);
|
|
119
|
-
if (!this
|
|
124
|
+
if (!this.#target) {
|
|
120
125
|
return;
|
|
121
126
|
}
|
|
122
127
|
if (name === 'autocomplete') {
|
|
123
|
-
this
|
|
128
|
+
this.#target.autocomplete = value;
|
|
124
129
|
}
|
|
125
130
|
if (name === 'spellcheck') {
|
|
126
|
-
this
|
|
131
|
+
this.#target.spellcheck = value === 'true';
|
|
127
132
|
}
|
|
128
133
|
}
|
|
129
134
|
connectedCallback() {
|
|
@@ -146,18 +151,20 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
146
151
|
#attach() {
|
|
147
152
|
if (!this.targetId) {
|
|
148
153
|
this.#detach();
|
|
154
|
+
this.#target = null;
|
|
155
|
+
this.#setMenuAnchor();
|
|
149
156
|
return;
|
|
150
157
|
}
|
|
151
158
|
const newTarget = document.getElementById(this.targetId);
|
|
152
|
-
if (newTarget === this
|
|
159
|
+
if (newTarget === this.#target) {
|
|
153
160
|
return;
|
|
154
161
|
}
|
|
155
162
|
this.#detach();
|
|
156
163
|
if (!newTarget) {
|
|
157
164
|
return;
|
|
158
165
|
}
|
|
159
|
-
|
|
160
|
-
this
|
|
166
|
+
this.#target = newTarget;
|
|
167
|
+
this.#setMenuAnchor();
|
|
161
168
|
newTarget.role = 'combobox';
|
|
162
169
|
newTarget.autocomplete = this.autocomplete;
|
|
163
170
|
newTarget.spellcheck = this.spellcheck;
|
|
@@ -166,15 +173,17 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
166
173
|
newTarget.addEventListener('input', this.#handleInput);
|
|
167
174
|
this.#navigationController.attach(newTarget);
|
|
168
175
|
newTarget.addEventListener('focus', this.#handleFocus);
|
|
176
|
+
this.#targetResizeObserver = new ResizeObserver(() => this.#setMenuWidthProperty());
|
|
177
|
+
this.#targetResizeObserver.observe(newTarget);
|
|
169
178
|
if (this.value) {
|
|
170
179
|
this.#setValueOnTarget();
|
|
171
180
|
}
|
|
172
181
|
}
|
|
173
182
|
#detach() {
|
|
174
|
-
this
|
|
175
|
-
this
|
|
183
|
+
this.#target?.removeEventListener('click', this.#handleClick);
|
|
184
|
+
this.#target?.removeEventListener('input', this.#handleInput);
|
|
176
185
|
this.#navigationController.detach();
|
|
177
|
-
this
|
|
186
|
+
this.#target?.removeEventListener('focus', this.#handleFocus);
|
|
178
187
|
}
|
|
179
188
|
#handleItemMouseDown(e) {
|
|
180
189
|
e.preventDefault();
|
|
@@ -213,12 +222,12 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
213
222
|
return html ``;
|
|
214
223
|
}
|
|
215
224
|
setTimeout(() => {
|
|
216
|
-
this
|
|
225
|
+
this.#setMenuAnchor();
|
|
217
226
|
this._menu.open = true;
|
|
218
227
|
this.#navigationController.focusMenu(this._menuItems[0], 0);
|
|
219
228
|
});
|
|
220
229
|
return html `
|
|
221
|
-
<u-menu manualFocus manualClose anchor-corner="auto-start">
|
|
230
|
+
<u-menu manualFocus manualClose anchor-corner="auto-start" positioning="${this.positioning}">
|
|
222
231
|
${this.results.map(result => {
|
|
223
232
|
const content = this.template
|
|
224
233
|
? unsafeHTML(this.template(this.#termNormalized, result.value))
|
|
@@ -238,7 +247,7 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
238
247
|
`;
|
|
239
248
|
}
|
|
240
249
|
async #updateResults(lazy = false) {
|
|
241
|
-
const term = this
|
|
250
|
+
const term = this.#getTargetValue();
|
|
242
251
|
const termNormalized = normalizeText(term).toLowerCase();
|
|
243
252
|
if (lazy && termNormalized === this.#termNormalized && this._menu?.open === true) {
|
|
244
253
|
return;
|
|
@@ -276,51 +285,64 @@ let UmTypeahead = class UmTypeahead extends LitElement {
|
|
|
276
285
|
.includes(this.#termNormalized));
|
|
277
286
|
}
|
|
278
287
|
#setValueOnTarget() {
|
|
279
|
-
if (!this
|
|
288
|
+
if (!this.#target) {
|
|
280
289
|
return;
|
|
281
290
|
}
|
|
282
|
-
const textValue = this
|
|
291
|
+
const textValue = this.#getTextValue();
|
|
283
292
|
this.#termNormalized = normalizeText(textValue)?.toLowerCase();
|
|
284
|
-
if (this
|
|
285
|
-
this
|
|
293
|
+
if (this.#target.tagName === 'U-TEXT-FIELD') {
|
|
294
|
+
this.#target.value = textValue;
|
|
286
295
|
return;
|
|
287
296
|
}
|
|
288
|
-
if (this
|
|
289
|
-
this
|
|
297
|
+
if (this.#target.input) {
|
|
298
|
+
this.#target.input.value = textValue;
|
|
290
299
|
return;
|
|
291
300
|
}
|
|
292
|
-
this
|
|
301
|
+
this.#target.value = textValue;
|
|
293
302
|
}
|
|
294
|
-
getTargetValue() {
|
|
295
|
-
return this
|
|
303
|
+
#getTargetValue() {
|
|
304
|
+
return this.#target.input?.value ?? this.#target.value;
|
|
296
305
|
}
|
|
297
|
-
setTargetValue(value) {
|
|
298
|
-
const targetInput = this
|
|
306
|
+
#setTargetValue(value) {
|
|
307
|
+
const targetInput = this.#target?.input ?? this.#target;
|
|
299
308
|
if (targetInput) {
|
|
300
309
|
targetInput.value = value;
|
|
301
310
|
}
|
|
302
311
|
}
|
|
303
|
-
|
|
304
|
-
if (!this.
|
|
312
|
+
#setMenuAnchor() {
|
|
313
|
+
if (!this._menu) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
this._menu.anchorElement = this.#getMenuAnchor();
|
|
317
|
+
}
|
|
318
|
+
#getMenuAnchor() {
|
|
319
|
+
if (!this.#target) {
|
|
305
320
|
return null;
|
|
306
321
|
}
|
|
307
|
-
if (this
|
|
308
|
-
return this
|
|
322
|
+
if (this.#target.tagName === 'U-CHIP-FIELD') {
|
|
323
|
+
return this.#target.input;
|
|
309
324
|
}
|
|
310
|
-
if (this
|
|
311
|
-
return this
|
|
325
|
+
if (this.#target.tagName === 'U-SEARCH') {
|
|
326
|
+
return this.#target.input;
|
|
312
327
|
}
|
|
313
|
-
if (this
|
|
314
|
-
return this
|
|
328
|
+
if (this.#target.tagName === 'U-TEXT-FIELD') {
|
|
329
|
+
return this.#target._container;
|
|
315
330
|
}
|
|
316
|
-
return this
|
|
331
|
+
return this.#target;
|
|
317
332
|
}
|
|
318
|
-
getTextValue() {
|
|
333
|
+
#getTextValue() {
|
|
319
334
|
if (!this.value) {
|
|
320
335
|
return '';
|
|
321
336
|
}
|
|
322
337
|
return this.formatter ? this.formatter(this.value) : this.value;
|
|
323
338
|
}
|
|
339
|
+
#setMenuWidthProperty() {
|
|
340
|
+
if (!this.fitTarget || !this.#target) {
|
|
341
|
+
this.style.removeProperty('--_menu-width');
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
this.style.setProperty('--_menu-width', `${this.#target.clientWidth}px`);
|
|
345
|
+
}
|
|
324
346
|
};
|
|
325
347
|
__decorate([
|
|
326
348
|
state()
|
|
@@ -349,6 +371,12 @@ __decorate([
|
|
|
349
371
|
__decorate([
|
|
350
372
|
property({ reflect: true })
|
|
351
373
|
], UmTypeahead.prototype, "spellcheck", void 0);
|
|
374
|
+
__decorate([
|
|
375
|
+
property({ type: Boolean, attribute: 'fit-target', reflect: true })
|
|
376
|
+
], UmTypeahead.prototype, "fitTarget", void 0);
|
|
377
|
+
__decorate([
|
|
378
|
+
property({ reflect: true })
|
|
379
|
+
], UmTypeahead.prototype, "positioning", void 0);
|
|
352
380
|
__decorate([
|
|
353
381
|
property({ reflect: true, attribute: 'target-id' })
|
|
354
382
|
], UmTypeahead.prototype, "targetId", null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead.js","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, HTMLTemplateResult, LitElement } from 'lit';\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js';\nimport { customElement, property, query, queryAll, state } from 'lit/decorators.js';\n\nimport { UmMenuItem } from '../menu/menu-item.js';\nimport { UmMenu } from '../menu/menu.js';\nimport { MenuFieldNavigationController } from '../shared/menu-field/menu-field-navigation-controller.js';\nimport { normalizeText } from '../shared/normalize-text.js';\nimport { styles } from './typeahead.styles.js';\n\nimport '../menu/menu.js';\nimport '../menu/menu-item.js';\nimport './highlight.js';\n\nexport interface Data {\n label: string;\n value: any;\n}\n\n@customElement('u-typeahead')\nexport class UmTypeahead extends LitElement {\n static readonly formAssociated = true;\n\n static override styles = styles;\n\n #targetId: string | undefined;\n\n #connected = false;\n private target:\n | (HTMLElement & {\n autocomplete: 'on' | 'off' | string | null;\n input?: HTMLInputElement;\n container?: HTMLElement;\n value: string;\n })\n | null = null;\n #documentMutationObserver: MutationObserver | null = null;\n readonly #navigationController = new MenuFieldNavigationController(this);\n #termNormalized = '';\n #debounceTimeout: number | null = null;\n #value: any;\n readonly #elementInternals: ElementInternals;\n\n // @ts-ignore\n @state() private results: Data[];\n\n /**\n * The datasource of the typeahead. Accepts an `Array` or a `Promise<[]>`.\n */\n @state() source: (any[] | ((term: string) => Promise<any[]>)) | undefined;\n\n /**\n * A function return a string based on a result from the `source`. Useful when the source results are objects.\n */\n formatter: ((value: any) => string) | undefined;\n\n /**\n * A string representing an HTML to be rendered inside the menu item. If set, it will replace the `u-highlight`.\n *\n * _Note:_ Subject to signature change\n */\n template: ((term: string, value: any) => string) | undefined;\n\n /**\n * The time in milliseconds before triggering an update in the results.\n */\n @property({ type: Number, reflect: true }) debounce = 300;\n\n /**\n * The number of suggestions to show\n */\n @property({ type: Number, reflect: true }) limit = 10;\n\n /**\n * How many characters must be typed before show suggestions\n *\n * _Note:_ Not used when the source is a `Promise`\n */\n @property({ type: Number, reflect: true }) minLength = 2;\n\n /**\n * Whether the menu will be show when the target get focus.\n *\n * _Note:_ The `minLength` will still be applied\n */\n @property({ type: Boolean, attribute: 'open-on-focus', reflect: true })\n openOnFocus = false;\n\n /**\n * If `true`, model values will not be restricted only to items selected from the menu.\n */\n @property({ type: Boolean, reflect: true }) editable = false;\n\n /**\n * The value for the `autocomplete` attribute for the target element.\n */\n @property({ reflect: true }) autocomplete: 'on' | 'off' | string = 'off';\n\n /**\n * The value for the `spellcheck` attribute for the target element.\n */\n @property({ reflect: true }) override spellcheck = false;\n\n get form(): HTMLFormElement | null {\n return this.#elementInternals.form;\n }\n\n /**\n * Gets or sets the current value of the typeahead.\n */\n get value(): any {\n return this.#value;\n }\n\n set value(value: any) {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n\n if (this.#connected) {\n this.#setValueOnTarget();\n }\n }\n\n override focus() {\n this.target?.focus();\n }\n\n clear() {\n if (!this.target) {\n return;\n }\n\n this.#termNormalized = '';\n this.setTargetValue('');\n }\n\n /**\n * The id of the target element to attach the typeahead.\n */\n @property({ reflect: true, attribute: 'target-id' })\n get targetId(): string | undefined {\n return this.#targetId;\n }\n\n set targetId(value: string | undefined) {\n this.#targetId = value;\n\n if (this.#connected) {\n this.#attach();\n }\n }\n\n @query('u-menu') _menu!: UmMenu;\n @queryAll('u-menu-item') menuItems!: NodeListOf<UmMenuItem>;\n\n get _menuItems(): UmMenuItem[] {\n return Array.from(this.menuItems);\n }\n\n constructor() {\n super();\n this.#elementInternals = this.attachInternals();\n }\n\n override attributeChangedCallback(name: string, _old: string | null, value: string | null) {\n super.attributeChangedCallback(name, _old, value);\n\n if (!this.target) {\n return;\n }\n\n if (name === 'autocomplete') {\n this.target.autocomplete = value;\n }\n\n if (name === 'spellcheck') {\n this.target.spellcheck = value === 'true';\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.#connected = true;\n this.#attach();\n this.#documentMutationObserver = new MutationObserver(() => this.#attach());\n this.#documentMutationObserver.observe(document, {\n attributes: true,\n childList: true,\n });\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.#connected = false;\n this.#detach();\n this.#documentMutationObserver!.disconnect();\n this.#documentMutationObserver = null;\n }\n\n #attach() {\n if (!this.targetId) {\n this.#detach();\n return;\n }\n\n const newTarget = document.getElementById(this.targetId) as HTMLInputElement;\n\n if (newTarget === this.target) {\n return;\n }\n\n this.#detach();\n\n if (!newTarget) {\n return;\n }\n\n // @ts-ignore\n this.target = newTarget;\n newTarget.role = 'combobox';\n newTarget.autocomplete = this.autocomplete as any;\n newTarget.spellcheck = this.spellcheck;\n newTarget.autocapitalize = 'off';\n\n newTarget.addEventListener('click', this.#handleClick);\n newTarget.addEventListener('input', this.#handleInput);\n this.#navigationController.attach(newTarget);\n newTarget.addEventListener('focus', this.#handleFocus);\n\n if (this.value) {\n this.#setValueOnTarget();\n }\n }\n\n #detach() {\n this.target?.removeEventListener('click', this.#handleClick);\n this.target?.removeEventListener('input', this.#handleInput);\n this.#navigationController.detach();\n this.target?.removeEventListener('focus', this.#handleFocus);\n }\n\n #handleItemMouseDown(e: Event) {\n e.preventDefault();\n }\n\n #handleClick(e: Event) {\n e.stopPropagation();\n }\n\n readonly #handleFocus = async () => {\n if (this.openOnFocus) {\n await this.#updateResults();\n }\n };\n\n readonly #handleInput = () => {\n if (this.#debounceTimeout) {\n clearTimeout(this.#debounceTimeout);\n }\n\n this.#setValueAndDispatchEvents(this.editable ? this.getTargetValue() : null, true);\n\n this.#debounceTimeout = setTimeout(async () => await this.#updateResults(true), this.debounce);\n };\n\n #getItemClickHandler(data: Data) {\n return () => {\n const selectedEvent = new CustomEvent('selected', {\n cancelable: true,\n detail: data.value,\n });\n\n this.dispatchEvent(selectedEvent);\n\n if (selectedEvent.defaultPrevented) {\n return;\n }\n\n this.#setValueAndDispatchEvents(data.value);\n };\n }\n\n #setValueAndDispatchEvents(value: any, direct = false) {\n if (!direct) {\n this.value = value;\n } else {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n }\n\n this.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n protected override render(): HTMLTemplateResult {\n if (!this.results?.length) {\n return html``;\n }\n\n setTimeout(() => {\n this._menu.anchorElement = this.getMenuAnchor();\n this._menu.open = true;\n this.#navigationController.focusMenu(this._menuItems[0], 0);\n });\n\n return html`\n <u-menu manualFocus manualClose anchor-corner=\"auto-start\">\n ${this.results.map(result => {\n const content = this.template\n ? unsafeHTML(this.template(this.#termNormalized, result.value))\n : html`\n <u-highlight .term=${this.#termNormalized} .result=${result.label}></u-highlight>\n `;\n\n return html`\n <u-menu-item\n @mousedown=${this.#handleItemMouseDown}\n @click=${this.#getItemClickHandler(result)}\n tabindex=\"-1\">\n ${content}\n </u-menu-item>\n `;\n })}\n </u-menu>\n `;\n }\n\n async #updateResults(lazy = false) {\n const term = this.getTargetValue();\n\n const termNormalized = normalizeText(term).toLowerCase();\n\n if (lazy && termNormalized === this.#termNormalized && this._menu?.open === true) {\n return;\n }\n\n this.#termNormalized = termNormalized;\n\n if (termNormalized.length < this.minLength) {\n this.results = [];\n return;\n }\n\n this.results = await this.#getData();\n this.results = this.results.slice(0, this.limit || this.results.length);\n }\n\n async #getData(): Promise<Data[]> {\n if (!this.source) {\n return [];\n }\n\n let values: any[];\n\n let filter = false;\n\n if (this.source instanceof Array) {\n values = this.source;\n filter = true;\n } else {\n const source = this.source as (term: string) => Promise<any[]>;\n values = await source(this.#termNormalized);\n }\n\n const result = values.map(source => ({\n label: this.formatter ? this.formatter(source) : source.toString(),\n value: source,\n }));\n\n if (!filter) {\n return result;\n }\n\n return result.filter(t => normalizeText(t.label).toLowerCase()\n .includes(this.#termNormalized));\n }\n\n #setValueOnTarget() {\n if (!this.target) {\n return;\n }\n\n const textValue = this.getTextValue();\n this.#termNormalized = normalizeText(textValue)?.toLowerCase();\n\n if (this.target.tagName === 'U-TEXT-FIELD') {\n this.target.value = textValue;\n return;\n }\n\n if (this.target.input) {\n this.target.input.value = textValue;\n return;\n }\n\n this.target.value = textValue;\n }\n\n private getTargetValue(): string {\n return this.target!.input?.value ?? this.target!.value;\n }\n\n private setTargetValue(value: string): void {\n const targetInput = this.target?.input ?? this.target;\n\n if (targetInput) {\n targetInput.value = value;\n }\n }\n\n private getMenuAnchor() {\n if (!this.target) {\n return null;\n }\n\n if (this.target.tagName === 'U-CHIP-FIELD') {\n return this.target.input;\n }\n\n if (this.target.tagName === 'U-SEARCH') {\n return this.target.input;\n }\n\n if (this.target.tagName === 'U-TEXT-FIELD') {\n return this.target.container;\n }\n\n return this.target;\n }\n\n private getTextValue(): string {\n if (!this.value) {\n return '';\n }\n\n return this.formatter ? this.formatter(this.value) : this.value;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-typeahead': UmTypeahead;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"typeahead.js","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, HTMLTemplateResult, LitElement } from 'lit';\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js';\nimport { customElement, property, query, queryAll, state } from 'lit/decorators.js';\n\nimport { UmMenuItem } from '../menu/menu-item.js';\nimport { UmMenu } from '../menu/menu.js';\nimport { MenuFieldNavigationController } from '../shared/menu-field/menu-field-navigation-controller.js';\nimport { normalizeText } from '../shared/normalize-text.js';\nimport { styles } from './typeahead.styles.js';\n\nimport '../menu/menu.js';\nimport '../menu/menu-item.js';\nimport './highlight.js';\n\nexport interface Data {\n label: string;\n value: any;\n}\n\n@customElement('u-typeahead')\nexport class UmTypeahead extends LitElement {\n static readonly formAssociated = true;\n\n static override styles = styles;\n\n #targetId: string | undefined;\n\n #connected = false;\n #target:\n | (HTMLElement & {\n autocomplete: 'on' | 'off' | string | null;\n input?: HTMLInputElement;\n _container?: HTMLElement;\n value: string;\n })\n | null = null;\n #documentMutationObserver: MutationObserver | null = null;\n #targetResizeObserver: ResizeObserver | null = null;\n readonly #navigationController = new MenuFieldNavigationController(this);\n #termNormalized = '';\n #debounceTimeout: number | null = null;\n #value: any;\n readonly #elementInternals: ElementInternals;\n\n // @ts-ignore\n @state() private results: Data[];\n\n /**\n * The datasource of the typeahead. Accepts an `Array` or a `Promise<[]>`.\n */\n @state() source: (any[] | ((term: string) => Promise<any[]>)) | undefined;\n\n /**\n * A function return a string based on a result from the `source`. Useful when the source results are objects.\n */\n formatter: ((value: any) => string) | undefined;\n\n /**\n * A string representing an HTML to be rendered inside the menu item. If set, it will replace the `u-highlight`.\n *\n * _Note:_ Subject to signature change\n */\n template: ((term: string, value: any) => string) | undefined;\n\n /**\n * The time in milliseconds before triggering an update in the results.\n */\n @property({ type: Number, reflect: true }) debounce = 300;\n\n /**\n * The number of suggestions to show\n */\n @property({ type: Number, reflect: true }) limit = 10;\n\n /**\n * How many characters must be typed before show suggestions\n *\n * _Note:_ Not used when the source is a `Promise`\n */\n @property({ type: Number, reflect: true }) minLength = 2;\n\n /**\n * Whether the menu will be show when the target get focus.\n *\n * _Note:_ The `minLength` will still be applied\n */\n @property({ type: Boolean, attribute: 'open-on-focus', reflect: true })\n openOnFocus = false;\n\n /**\n * If `true`, model values will not be restricted only to items selected from the menu.\n */\n @property({ type: Boolean, reflect: true }) editable = false;\n\n /**\n * The value for the `autocomplete` attribute for the target element.\n */\n @property({ reflect: true }) autocomplete: 'on' | 'off' | string = 'off';\n\n /**\n * The value for the `spellcheck` attribute for the target element.\n */\n @property({ reflect: true }) override spellcheck = false;\n\n @property({ type: Boolean, attribute: 'fit-target', reflect: true }) fitTarget = false;\n\n @property({ reflect: true }) positioning: 'relative' | 'fixed' = 'relative';\n\n get form(): HTMLFormElement | null {\n return this.#elementInternals.form;\n }\n\n /**\n * Gets or sets the current value of the typeahead.\n */\n get value(): any {\n return this.#value;\n }\n\n set value(value: any) {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n\n if (this.#connected) {\n this.#setValueOnTarget();\n }\n }\n\n override focus() {\n this.#target?.focus();\n }\n\n clear() {\n if (!this.#target) {\n return;\n }\n\n this.#termNormalized = '';\n this.#setTargetValue('');\n }\n\n /**\n * The id of the target element to attach the typeahead.\n */\n @property({ reflect: true, attribute: 'target-id' })\n get targetId(): string | undefined {\n return this.#targetId;\n }\n\n set targetId(value: string | undefined) {\n this.#targetId = value;\n\n if (this.#connected) {\n this.#attach();\n }\n }\n\n @query('u-menu') _menu!: UmMenu;\n @queryAll('u-menu-item') menuItems!: NodeListOf<UmMenuItem>;\n\n get _menuItems(): UmMenuItem[] {\n return Array.from(this.menuItems);\n }\n\n constructor() {\n super();\n this.#elementInternals = this.attachInternals();\n }\n\n override attributeChangedCallback(name: string, _old: string | null, value: string | null) {\n super.attributeChangedCallback(name, _old, value);\n\n if (!this.#target) {\n return;\n }\n\n if (name === 'autocomplete') {\n this.#target.autocomplete = value;\n }\n\n if (name === 'spellcheck') {\n this.#target.spellcheck = value === 'true';\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.#connected = true;\n this.#attach();\n this.#documentMutationObserver = new MutationObserver(() => this.#attach());\n this.#documentMutationObserver.observe(document, {\n attributes: true,\n childList: true,\n });\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.#connected = false;\n this.#detach();\n this.#documentMutationObserver!.disconnect();\n this.#documentMutationObserver = null;\n }\n\n #attach() {\n if (!this.targetId) {\n this.#detach();\n this.#target = null;\n this.#setMenuAnchor();\n return;\n }\n\n const newTarget = document.getElementById(this.targetId) as HTMLInputElement;\n\n if (newTarget === this.#target) {\n return;\n }\n\n this.#detach();\n\n if (!newTarget) {\n return;\n }\n\n this.#target = newTarget;\n this.#setMenuAnchor();\n newTarget.role = 'combobox';\n newTarget.autocomplete = this.autocomplete as any;\n newTarget.spellcheck = this.spellcheck;\n newTarget.autocapitalize = 'off';\n\n newTarget.addEventListener('click', this.#handleClick);\n newTarget.addEventListener('input', this.#handleInput);\n this.#navigationController.attach(newTarget);\n newTarget.addEventListener('focus', this.#handleFocus);\n this.#targetResizeObserver = new ResizeObserver(() => this.#setMenuWidthProperty());\n this.#targetResizeObserver.observe(newTarget);\n\n if (this.value) {\n this.#setValueOnTarget();\n }\n }\n\n #detach() {\n this.#target?.removeEventListener('click', this.#handleClick);\n this.#target?.removeEventListener('input', this.#handleInput);\n this.#navigationController.detach();\n this.#target?.removeEventListener('focus', this.#handleFocus);\n }\n\n #handleItemMouseDown(e: Event) {\n e.preventDefault();\n }\n\n #handleClick(e: Event) {\n e.stopPropagation();\n }\n\n readonly #handleFocus = async () => {\n if (this.openOnFocus) {\n await this.#updateResults();\n }\n };\n\n readonly #handleInput = () => {\n if (this.#debounceTimeout) {\n clearTimeout(this.#debounceTimeout);\n }\n\n this.#setValueAndDispatchEvents(this.editable ? this.#getTargetValue() : null, true);\n\n this.#debounceTimeout = setTimeout(async () => await this.#updateResults(true), this.debounce);\n };\n\n #getItemClickHandler(data: Data) {\n return () => {\n const selectedEvent = new CustomEvent('selected', {\n cancelable: true,\n detail: data.value,\n });\n\n this.dispatchEvent(selectedEvent);\n\n if (selectedEvent.defaultPrevented) {\n return;\n }\n\n this.#setValueAndDispatchEvents(data.value);\n };\n }\n\n #setValueAndDispatchEvents(value: any, direct = false) {\n if (!direct) {\n this.value = value;\n } else {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n }\n\n this.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n protected override render(): HTMLTemplateResult {\n if (!this.results?.length) {\n return html``;\n }\n\n setTimeout(() => {\n this.#setMenuAnchor();\n this._menu.open = true;\n this.#navigationController.focusMenu(this._menuItems[0], 0);\n });\n\n return html`\n <u-menu manualFocus manualClose anchor-corner=\"auto-start\" positioning=\"${this.positioning}\">\n ${this.results.map(result => {\n const content = this.template\n ? unsafeHTML(this.template(this.#termNormalized, result.value))\n : html`\n <u-highlight .term=${this.#termNormalized} .result=${result.label}></u-highlight>\n `;\n\n return html`\n <u-menu-item\n @mousedown=${this.#handleItemMouseDown}\n @click=${this.#getItemClickHandler(result)}\n tabindex=\"-1\">\n ${content}\n </u-menu-item>\n `;\n })}\n </u-menu>\n `;\n }\n\n async #updateResults(lazy = false) {\n const term = this.#getTargetValue();\n\n const termNormalized = normalizeText(term).toLowerCase();\n\n if (lazy && termNormalized === this.#termNormalized && this._menu?.open === true) {\n return;\n }\n\n this.#termNormalized = termNormalized;\n\n if (termNormalized.length < this.minLength) {\n this.results = [];\n return;\n }\n\n this.results = await this.#getData();\n this.results = this.results.slice(0, this.limit || this.results.length);\n }\n\n async #getData(): Promise<Data[]> {\n if (!this.source) {\n return [];\n }\n\n let values: any[];\n\n let filter = false;\n\n if (this.source instanceof Array) {\n values = this.source;\n filter = true;\n } else {\n const source = this.source as (term: string) => Promise<any[]>;\n values = await source(this.#termNormalized);\n }\n\n const result = values.map(source => ({\n label: this.formatter ? this.formatter(source) : source.toString(),\n value: source,\n }));\n\n if (!filter) {\n return result;\n }\n\n return result.filter(t => normalizeText(t.label).toLowerCase()\n .includes(this.#termNormalized));\n }\n\n #setValueOnTarget() {\n if (!this.#target) {\n return;\n }\n\n const textValue = this.#getTextValue();\n this.#termNormalized = normalizeText(textValue)?.toLowerCase();\n\n if (this.#target.tagName === 'U-TEXT-FIELD') {\n this.#target.value = textValue;\n return;\n }\n\n if (this.#target.input) {\n this.#target.input.value = textValue;\n return;\n }\n\n this.#target.value = textValue;\n }\n\n #getTargetValue(): string {\n return this.#target!.input?.value ?? this.#target!.value;\n }\n\n #setTargetValue(value: string): void {\n const targetInput = this.#target?.input ?? this.#target;\n\n if (targetInput) {\n targetInput.value = value;\n }\n }\n\n #setMenuAnchor() {\n if (!this._menu) {\n return;\n }\n\n this._menu.anchorElement = this.#getMenuAnchor();\n }\n\n #getMenuAnchor() {\n if (!this.#target) {\n return null;\n }\n\n if (this.#target.tagName === 'U-CHIP-FIELD') {\n return this.#target.input;\n }\n\n if (this.#target.tagName === 'U-SEARCH') {\n return this.#target.input;\n }\n\n if (this.#target.tagName === 'U-TEXT-FIELD') {\n return this.#target._container;\n }\n\n return this.#target;\n }\n\n #getTextValue(): string {\n if (!this.value) {\n return '';\n }\n\n return this.formatter ? this.formatter(this.value) : this.value;\n }\n\n #setMenuWidthProperty(): void {\n if (!this.fitTarget || !this.#target) {\n this.style.removeProperty('--_menu-width');\n return;\n }\n\n this.style.setProperty('--_menu-width', `${this.#target.clientWidth}px`);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-typeahead': UmTypeahead;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead.styles.d.ts","sourceRoot":"","sources":["../../src/typeahead/typeahead.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"typeahead.styles.d.ts","sourceRoot":"","sources":["../../src/typeahead/typeahead.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAYlB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead.styles.js","sourceRoot":"","sources":["../../src/typeahead/typeahead.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"typeahead.styles.js","sourceRoot":"","sources":["../../src/typeahead/typeahead.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;CAYzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n :host {\n display: block;\n }\n\n :host([fit-target]) u-menu::part(menu) {\n width: var(--_menu-width);\n }\n\n u-menu-item {\n font-weight: var(--u-typeahead-item-font-weight, var(--u-font-weight-regular, 400));\n }\n`;\n"]}
|