@material/web 1.1.2-nightly.cef1b74.0 → 1.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/button/internal/button.d.ts +9 -1
- package/button/internal/button.js +9 -1
- package/button/internal/button.js.map +1 -1
- package/checkbox/internal/_checkbox.scss +69 -63
- package/checkbox/internal/checkbox-styles.css.js +1 -1
- package/checkbox/internal/checkbox-styles.css.js.map +1 -1
- package/dialog/internal/_dialog.scss +50 -42
- package/dialog/internal/dialog-styles.css.js +1 -1
- package/dialog/internal/dialog-styles.css.js.map +1 -1
- package/divider/internal/_divider.scss +6 -6
- package/divider/internal/divider-styles.css.js +1 -1
- package/divider/internal/divider-styles.css.js.map +1 -1
- package/elevation/internal/_elevation.scss +10 -4
- package/elevation/internal/elevation-styles.css.js +1 -1
- package/elevation/internal/elevation-styles.css.js.map +1 -1
- package/fab/branded-fab.d.ts +1 -1
- package/fab/branded-fab.js.map +1 -1
- package/fab/fab.d.ts +2 -2
- package/fab/fab.js.map +1 -1
- package/iconbutton/internal/icon-button.d.ts +9 -1
- package/iconbutton/internal/icon-button.js +9 -1
- package/iconbutton/internal/icon-button.js.map +1 -1
- package/labs/behaviors/on-report-validity.d.ts +2 -1
- package/labs/behaviors/on-report-validity.js +171 -67
- package/labs/behaviors/on-report-validity.js.map +1 -1
- package/list/list-item.d.ts +1 -1
- package/list/list-item.js.map +1 -1
- package/menu/internal/menuitem/_menu-item.scss +31 -52
- package/menu/internal/menuitem/menu-item-styles.css.js +1 -1
- package/menu/internal/menuitem/menu-item-styles.css.js.map +1 -1
- package/menu/internal/menuitem/menu-item.d.ts +1 -1
- package/menu/internal/menuitem/menu-item.js.map +1 -1
- package/menu/menu-item.d.ts +2 -2
- package/menu/menu-item.js.map +1 -1
- package/menu/menu.d.ts +3 -3
- package/menu/menu.js.map +1 -1
- package/package.json +5 -3
- package/radio/internal/_radio.scss +34 -34
- package/radio/internal/radio-styles.css.js +1 -1
- package/radio/internal/radio-styles.css.js.map +1 -1
- package/ripple/internal/_ripple.scss +8 -9
- package/ripple/internal/ripple-styles.css.js +1 -1
- package/ripple/internal/ripple-styles.css.js.map +1 -1
- package/select/internal/select.js +3 -10
- package/select/internal/select.js.map +1 -1
- package/select/select-option.d.ts +1 -1
- package/select/select-option.js.map +1 -1
- package/switch/internal/_handle.scss +42 -37
- package/switch/internal/_icon.scss +17 -17
- package/switch/internal/_switch.scss +52 -52
- package/switch/internal/_track.scss +18 -18
- package/switch/internal/switch-styles.css.js +1 -1
- package/switch/internal/switch-styles.css.js.map +1 -1
- package/tabs/internal/tabs.d.ts +1 -0
- package/tabs/internal/tabs.js +7 -2
- package/tabs/internal/tabs.js.map +1 -1
- package/testing/harness.d.ts +371 -0
- package/testing/harness.js +737 -0
- package/testing/harness.js.map +1 -0
- package/testing/transform-pseudo-classes.d.ts +39 -0
- package/testing/transform-pseudo-classes.js +172 -0
- package/testing/transform-pseudo-classes.js.map +1 -0
- package/textfield/filled-text-field.d.ts +1 -1
- package/textfield/filled-text-field.js.map +1 -1
- package/textfield/internal/text-field.d.ts +1 -2
- package/textfield/internal/text-field.js +12 -18
- package/textfield/internal/text-field.js.map +1 -1
- package/textfield/outlined-text-field.d.ts +1 -1
- package/textfield/outlined-text-field.js.map +1 -1
- package/tokens/_index.scss +0 -1
- package/tokens/_md-comp-assist-chip.scss +2 -2
- package/tokens/_md-comp-checkbox.scss +2 -2
- package/tokens/_md-comp-circular-progress.scss +2 -2
- package/tokens/_md-comp-dialog.scss +2 -2
- package/tokens/_md-comp-divider.scss +2 -2
- package/tokens/_md-comp-elevated-button.scss +2 -2
- package/tokens/_md-comp-elevated-card.scss +2 -2
- package/tokens/_md-comp-elevation.scss +2 -2
- package/tokens/_md-comp-fab-branded.scss +2 -2
- package/tokens/_md-comp-fab.scss +2 -2
- package/tokens/_md-comp-filled-button.scss +2 -2
- package/tokens/_md-comp-filled-card.scss +2 -2
- package/tokens/_md-comp-filled-field.scss +2 -2
- package/tokens/_md-comp-filled-icon-button.scss +2 -2
- package/tokens/_md-comp-filled-select.scss +2 -2
- package/tokens/_md-comp-filled-text-field.scss +2 -2
- package/tokens/_md-comp-filled-tonal-button.scss +2 -2
- package/tokens/_md-comp-filled-tonal-icon-button.scss +2 -2
- package/tokens/_md-comp-filter-chip.scss +2 -2
- package/tokens/_md-comp-focus-ring.scss +2 -2
- package/tokens/_md-comp-icon-button.scss +2 -2
- package/tokens/_md-comp-icon.scss +2 -2
- package/tokens/_md-comp-input-chip.scss +2 -2
- package/tokens/_md-comp-item.scss +2 -2
- package/tokens/_md-comp-linear-progress.scss +2 -2
- package/tokens/_md-comp-list-item.scss +4 -4
- package/tokens/_md-comp-list.scss +2 -2
- package/tokens/_md-comp-menu-item.scss +65 -9
- package/tokens/_md-comp-menu.scss +2 -2
- package/tokens/_md-comp-outlined-button.scss +2 -2
- package/tokens/_md-comp-outlined-card.scss +2 -2
- package/tokens/_md-comp-outlined-field.scss +2 -2
- package/tokens/_md-comp-outlined-icon-button.scss +2 -2
- package/tokens/_md-comp-outlined-segmented-button.scss +2 -2
- package/tokens/_md-comp-outlined-select.scss +2 -2
- package/tokens/_md-comp-outlined-text-field.scss +2 -2
- package/tokens/_md-comp-primary-tab.scss +2 -2
- package/tokens/_md-comp-radio.scss +2 -2
- package/tokens/_md-comp-ripple.scss +2 -2
- package/tokens/_md-comp-secondary-tab.scss +2 -2
- package/tokens/_md-comp-slider.scss +2 -2
- package/tokens/_md-comp-suggestion-chip.scss +2 -2
- package/tokens/_md-comp-switch.scss +2 -2
- package/tokens/_md-comp-text-button.scss +2 -2
- package/tokens/_md-ref-palette.scss +2 -2
- package/tokens/_md-ref-typeface.scss +2 -2
- package/tokens/_md-sys-color.scss +3 -3
- package/tokens/_md-sys-typescale.scss +2 -2
- package/tokens/{_values.scss → internal/_validate.scss} +10 -10
- package/tokens/_md-comp-menu-list-item.scss +0 -162
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["harness.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n defaultTransformPseudoClasses,\n getTransformedPseudoClass,\n transformPseudoClasses,\n} from './transform-pseudo-classes.js';\n\n/**\n * Retrieves the element type from a `Harness` type.\n *\n * @template H The harness type.\n */\nexport type HarnessElement<H extends Harness> = H extends Harness<infer E>\n ? ElementWithHarness<E, H>\n : never;\n\n/**\n * Harnesses will attach themselves to their element for convenience.\n *\n * @template E The element type.\n * @template H The harness type.\n */\nexport type ElementWithHarness<\n E extends HTMLElement = HTMLElement,\n H extends Harness<E> = Harness<E>,\n> = E & {\n /**\n * The harness for this element.\n */\n harness: H;\n\n /**\n * Associated form element.\n */\n form?: HTMLFormElement | null;\n};\n\n/**\n * Checks whether or not an element has a Harness attached to it on the\n * `element.harness` property.\n *\n * @param element The element to check.\n * @return True if the element has a harness property.\n */\nexport function isElementWithHarness(\n element: Element,\n): element is ElementWithHarness {\n return (element as unknown as ElementWithHarness).harness instanceof Harness;\n}\n\n/**\n * A test harness class that can be used to simulate interaction with an\n * element.\n *\n * @template E The harness's element type.\n */\nexport class Harness<E extends HTMLElement = HTMLElement> {\n /**\n * The pseudo classes that should be transformed for simulation. Component\n * subclasses may override this to add additional pseudo classes.\n */\n protected transformPseudoClasses = defaultTransformPseudoClasses;\n\n /**\n * The element that this harness controls.\n */\n readonly element: E & ElementWithHarness<E, this>;\n\n /**\n * A set of elements that have already been patched to support transformed\n * pseudo classes.\n */\n private readonly patchedElements = new WeakSet<HTMLElement>();\n\n /**\n * Creates a new harness for the given element.\n *\n * @param element The element that this harness controls.\n */\n constructor(element: E) {\n this.element = element as ElementWithHarness<E, this>;\n this.element.harness = this;\n }\n\n /**\n * Resets the element's simulated classes to the default state.\n */\n async reset() {\n const element = await this.getInteractiveElement();\n for (const pseudoClass of this.transformPseudoClasses) {\n this.forEachNodeFrom(element, (el) => {\n this.removePseudoClass(el, pseudoClass);\n });\n }\n }\n\n /**\n * Hovers and clicks on an element. This will generate a `click` event.\n *\n * @param init Additional event options.\n */\n async clickWithMouse(init: PointerEventInit = {}) {\n await this.startClickWithMouse(init);\n await this.endClickWithMouse(init);\n }\n\n /**\n * Begins a click with a mouse. Use this along with `endClickWithMouse()` to\n * customize the length of the click.\n *\n * @param init Additional event options.\n */\n async startClickWithMouse(init: PointerEventInit = {}) {\n const element = await this.getInteractiveElement();\n await this.startHover();\n this.simulateMousePress(element, init);\n }\n\n /**\n * Finishes a click with a mouse. Use this along with `startClickWithMouse()`\n * to customize the length of the click. This will generate a `click` event.\n *\n * @param init Additional event options.\n */\n async endClickWithMouse(init: PointerEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateMouseRelease(element, init);\n if ((init?.button ?? 0) === 0) {\n // Dispatch a click for left-click only (default).\n this.simulateClick(element, init);\n }\n }\n\n /**\n * Clicks an element with the keyboard (defaults to spacebar). This will\n * generate a `click` event.\n *\n * @param init Additional event options.\n */\n async clickWithKeyboard(init: KeyboardEventInit = {}) {\n const element = await this.getInteractiveElement();\n await this.startClickWithKeyboard(init);\n await this.endClickWithKeyboard(init);\n this.simulateClick(element, init);\n }\n\n /**\n * Begins a click with the keyboard (defaults to spacebar). Use this along\n * with `endClickWithKeyboard()` to customize the length of the click.\n *\n * @param init Additional event options.\n */\n async startClickWithKeyboard(init: KeyboardEventInit = {}) {\n const element = await this.getInteractiveElement();\n await this.focusWithKeyboard(init);\n this.simulateKeydown(element, init.key ?? ' ', init);\n this.simulateClick(element, init);\n }\n\n /**\n * Finishes a click with the keyboard (defaults to spacebar). Use this along\n * with `startClickWithKeyboard()` to customize the length of the click.\n *\n * @param init Additional event options.\n */\n async endClickWithKeyboard(init: KeyboardEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateKeyup(element, init.key ?? ' ', init);\n this.simulateClick(element, init);\n }\n\n /**\n * Right-clicks and opens a context menu. This will generate a `contextmenu`\n * event.\n */\n async rightClickWithMouse() {\n const element = await this.getInteractiveElement();\n const rightMouseButton = {button: 2, buttons: 2};\n await this.startClickWithMouse(rightMouseButton);\n // Note: contextmenu right clicks do not generate the up events\n this.simulateContextmenu(element, rightMouseButton);\n }\n\n /**\n * Taps once on the element with a simulated touch. This will generate a\n * `click` event.\n *\n * @param init Additional event options.\n * @param touchInit Additional touch event options.\n */\n async tap(init: PointerEventInit = {}, touchInit: TouchEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateTouchPress(element, init, touchInit);\n this.simulateTouchRelease(element, init, touchInit);\n if ((init?.isPrimary ?? true) === true) {\n // Dispatch a click for primary touches only (default).\n await this.endTapClick(init);\n }\n }\n\n /**\n * Begins a touch tap. Use this along with `endTap()` to customize the length\n * or number of taps.\n *\n * @param init Additional event options.\n * @param touchInit Additional touch event options.\n */\n async startTap(init: PointerEventInit = {}, touchInit: TouchEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateTouchPress(element, init, touchInit);\n }\n\n /**\n * Simulates a `contextmenu` event for touch. Use this along with `startTap()`\n * to generate a tap-and-hold context menu interaction.\n *\n * @param init Additional event options.\n */\n async startTapContextMenu(init: MouseEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateContextmenu(element, init);\n }\n\n /**\n * Finished a touch tap. Use this along with `startTap()` to customize the\n * length or number of taps.\n *\n * This will NOT generate a `click` event.\n *\n * @param init Additional event options.\n * @param touchInit Additional touch event options.\n */\n async endTap(init: PointerEventInit = {}, touchInit: TouchEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateTouchRelease(element, init, touchInit);\n }\n\n /**\n * Simulates a `click` event for touch. Use this along with `endTap()` to\n * control the timing of tap and click events.\n *\n * @param init Additional event options.\n */\n async endTapClick(init: PointerEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateClick(element, {\n pointerType: 'touch',\n ...init,\n });\n }\n\n /**\n * Cancels a touch tap.\n *\n * @param init Additional event options.\n * @param touchInit Additional touch event options.\n */\n async cancelTap(init: PointerEventInit = {}, touchInit: TouchEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateTouchCancel(element, init, touchInit);\n }\n\n /**\n * Hovers over the element with a simulated mouse.\n */\n async startHover() {\n const element = await this.getInteractiveElement();\n this.simulateStartHover(element);\n }\n\n /**\n * Moves the simulated mouse cursor off of the element.\n */\n async endHover() {\n const element = await this.getInteractiveElement();\n this.simulateEndHover(element);\n }\n\n /**\n * Simulates focusing an element with the keyboard.\n *\n * @param init Additional event options.\n */\n async focusWithKeyboard(init: KeyboardEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateKeyboardFocus(element);\n }\n\n /**\n * Simulates focusing an element with a pointer.\n */\n async focusWithPointer() {\n const element = await this.getInteractiveElement();\n await this.startHover();\n this.simulatePointerFocus(element);\n }\n\n /**\n * Simulates unfocusing an element.\n */\n async blur() {\n const element = await this.getInteractiveElement();\n await this.endHover();\n this.simulateBlur(element);\n }\n\n /**\n * Simulates a keypress on an element.\n *\n * @param key The key to press.\n * @param init Additional event options.\n */\n async keypress(key: string, init: KeyboardEventInit = {}) {\n const element = await this.getInteractiveElement();\n this.simulateKeypress(element, key, init);\n }\n\n /**\n * Simulates submitting the element's associated form element.\n *\n * @param form (Optional) form to submit, defaults to the elemnt's form.\n * @return The submitted form data or null if the element has no associated\n * form.\n */\n submitForm(form = this.element.form) {\n if (!form) {\n return new FormData();\n }\n return new Promise<FormData>((resolve) => {\n const submitListener = (event: SubmitEvent) => {\n event.preventDefault();\n const data = new FormData(form);\n resolve(data);\n return false;\n };\n\n form.addEventListener('submit', submitListener, {once: true});\n form.requestSubmit();\n });\n }\n\n /**\n * Returns the element that should be used for interaction simulation.\n * Defaults to the host element itself.\n *\n * Subclasses should override this if the interactive element is not the host.\n *\n * @return The element to use in simulation.\n */\n protected async getInteractiveElement(): Promise<HTMLElement> {\n return this.element;\n }\n\n /**\n * Adds a pseudo class to an element. The element's shadow root styles (or\n * document if not in a shadow root) will be transformed to support\n * simulated pseudo classes.\n *\n * @param element The element to add a pseudo class to.\n * @param pseudoClass The pseudo class to add.\n */\n protected addPseudoClass(element: HTMLElement, pseudoClass: string) {\n if (!this.transformPseudoClasses.includes(pseudoClass)) {\n return;\n }\n\n const root = element.getRootNode() as Document | ShadowRoot;\n if (element.shadowRoot) {\n transformPseudoClasses(\n element.shadowRoot.adoptedStyleSheets || [],\n this.transformPseudoClasses,\n );\n }\n\n transformPseudoClasses(root.styleSheets, this.transformPseudoClasses);\n transformPseudoClasses(\n root.adoptedStyleSheets || [],\n this.transformPseudoClasses,\n );\n element.classList.add(getTransformedPseudoClass(pseudoClass));\n this.patchForTransformedPseudoClasses(element);\n }\n\n /**\n * Removes a pseudo class from an element.\n *\n * @param element The element to remove a pseudo class from.\n * @param pseudoClass The pseudo class to remove.\n */\n protected removePseudoClass(element: HTMLElement, pseudoClass: string) {\n element.classList.remove(getTransformedPseudoClass(pseudoClass));\n }\n\n /**\n * Simulates a click event.\n *\n * @param element The element to click.\n * @param init Additional event options.\n */\n protected simulateClick(element: HTMLElement, init: MouseEventInit = {}) {\n // Firefox does not support some simulations with PointerEvents, such as\n // selecting an <input type=\"checkbox\">. Use MouseEvent for browser support.\n element.dispatchEvent(\n new MouseEvent('click', {\n ...this.createMouseEventInit(element),\n ...init,\n }),\n );\n }\n\n /**\n * Simulates a contextmenu event.\n *\n * @param element The element to generate an event for.\n * @param init Additional event options.\n */\n protected simulateContextmenu(\n element: HTMLElement,\n init: MouseEventInit = {},\n ) {\n element.dispatchEvent(\n new MouseEvent('contextmenu', {\n ...this.createMouseEventInit(element),\n button: 2,\n buttons: 2,\n ...init,\n }),\n );\n }\n\n /**\n * Simulates focusing with a keyboard. The difference between this and\n * `simulatePointerFocus` is that keyboard focus will include the\n * `:focus-visible` pseudo class.\n *\n * @param element The element to focus with a keyboard.\n */\n protected simulateKeyboardFocus(element: HTMLElement) {\n this.simulateKeydown(element.ownerDocument, 'Tab');\n this.addPseudoClass(element, ':focus-visible');\n this.simulatePointerFocus(element);\n this.simulateKeyup(element, 'Tab');\n }\n\n /**\n * Simulates focusing with a pointer.\n *\n * @param element The element to focus with a pointer.\n */\n protected simulatePointerFocus(element: HTMLElement) {\n this.addPseudoClass(element, ':focus');\n this.forEachNodeFrom(element, (el) => {\n this.addPseudoClass(el, ':focus-within');\n });\n element.dispatchEvent(new FocusEvent('focus', {composed: true}));\n element.dispatchEvent(\n new FocusEvent('focusin', {bubbles: true, composed: true}),\n );\n }\n\n /**\n * Simulates unfocusing an element.\n *\n * @param element The element to blur.\n */\n protected simulateBlur(element: HTMLElement) {\n this.removePseudoClass(element, ':focus');\n this.removePseudoClass(element, ':focus-visible');\n this.forEachNodeFrom(element, (el) => {\n this.removePseudoClass(el, ':focus-within');\n });\n element.dispatchEvent(new FocusEvent('blur', {composed: true}));\n element.dispatchEvent(\n new FocusEvent('focusout', {bubbles: true, composed: true}),\n );\n }\n\n /**\n * Simulates a mouse pointer hovering over an element.\n *\n * @param element The element to hover over.\n * @param init Additional event options.\n */\n protected simulateStartHover(\n element: HTMLElement,\n init: PointerEventInit = {},\n ) {\n this.forEachNodeFrom(element, (el) => {\n this.addPseudoClass(el, ':hover');\n });\n const rect = element.getBoundingClientRect();\n const mouseInit = this.createMouseEventInit(element);\n const mouseEnterInit = {\n ...mouseInit,\n bubbles: false,\n clientX: rect.left,\n clientY: rect.top,\n screenX: rect.left,\n screenY: rect.top,\n };\n\n const pointerInit = {\n ...mouseInit,\n isPrimary: true,\n pointerType: 'mouse',\n };\n\n const pointerEnterInit: PointerEventInit = {\n ...pointerInit,\n ...mouseEnterInit,\n ...init,\n };\n\n element.dispatchEvent(new PointerEvent('pointerover', pointerInit));\n element.dispatchEvent(new PointerEvent('pointerenter', pointerEnterInit));\n element.dispatchEvent(new MouseEvent('mouseover', mouseInit));\n element.dispatchEvent(new MouseEvent('mouseenter', mouseEnterInit));\n }\n\n /**\n * Simulates a mouse pointer leaving the element.\n *\n * @param element The element to stop hovering over.\n * @param init Additional event options.\n */\n protected simulateEndHover(\n element: HTMLElement,\n init: PointerEventInit = {},\n ) {\n this.forEachNodeFrom(element, (el) => {\n this.removePseudoClass(el, ':hover');\n });\n const rect = element.getBoundingClientRect();\n const mouseInit = this.createMouseEventInit(element);\n const mouseLeaveInit = {\n ...mouseInit,\n bubbles: false,\n clientX: rect.left - 1,\n clientY: rect.top - 1,\n screenX: rect.left - 1,\n screenY: rect.top - 1,\n };\n\n const pointerInit: PointerEventInit = {\n ...mouseInit,\n isPrimary: true,\n pointerType: 'mouse',\n ...init,\n };\n\n const pointerLeaveInit: PointerEventInit = {\n ...pointerInit,\n ...mouseLeaveInit,\n };\n\n element.dispatchEvent(new PointerEvent('pointerout', pointerInit));\n element.dispatchEvent(new PointerEvent('pointerleave', pointerLeaveInit));\n element.dispatchEvent(new MouseEvent('pointerout', mouseInit));\n element.dispatchEvent(new MouseEvent('mouseleave', mouseLeaveInit));\n }\n\n /**\n * Simulates a mouse press and hold on an element.\n *\n * @param element The element to press with a mouse.\n * @param init Additional event options.\n */\n protected simulateMousePress(\n element: HTMLElement,\n init: PointerEventInit = {},\n ) {\n this.addPseudoClass(element, ':active');\n this.forEachNodeFrom(element, (el) => {\n this.addPseudoClass(el, ':active');\n });\n const mouseInit = this.createMouseEventInit(element);\n const pointerInit: PointerEventInit = {\n ...mouseInit,\n isPrimary: true,\n pointerType: 'mouse',\n ...init,\n };\n\n element.dispatchEvent(new PointerEvent('pointerdown', pointerInit));\n element.dispatchEvent(new MouseEvent('mousedown', mouseInit));\n this.simulatePointerFocus(element);\n }\n\n /**\n * Simulates a mouse press release from an element.\n *\n * @param element The element to release pressing from.\n * @param init Additional event options.\n */\n protected simulateMouseRelease(\n element: HTMLElement,\n init: PointerEventInit = {},\n ) {\n this.removePseudoClass(element, ':active');\n this.forEachNodeFrom(element, (el) => {\n this.removePseudoClass(el, ':active');\n });\n const mouseInit = this.createMouseEventInit(element);\n const pointerInit: PointerEventInit = {\n ...mouseInit,\n isPrimary: true,\n pointerType: 'mouse',\n ...init,\n };\n\n element.dispatchEvent(new PointerEvent('pointerup', pointerInit));\n element.dispatchEvent(new MouseEvent('mouseup', mouseInit));\n }\n\n /**\n * Simulates a touch press and hold on an element.\n *\n * @param element The element to press with a touch pointer.\n * @param init Additional event options.\n */\n protected simulateTouchPress(\n element: HTMLElement,\n init: PointerEventInit = {},\n touchInit: TouchEventInit = {},\n ) {\n this.addPseudoClass(element, ':active');\n this.forEachNodeFrom(element, (el) => {\n this.addPseudoClass(el, ':active');\n });\n const mouseInit = this.createMouseEventInit(element);\n const pointerInit: PointerEventInit = {\n ...mouseInit,\n isPrimary: true,\n pointerType: 'touch',\n ...init,\n };\n\n element.dispatchEvent(new PointerEvent('pointerdown', pointerInit));\n // Firefox does not support TouchEvent constructor\n if (window.TouchEvent) {\n const touch = this.createTouch(element);\n element.dispatchEvent(\n new TouchEvent('touchstart', {\n touches: [touch],\n targetTouches: [touch],\n changedTouches: [touch],\n ...touchInit,\n }),\n );\n }\n this.simulatePointerFocus(element);\n }\n\n /**\n * Simulates a touch press release from an element.\n *\n * @param element The element to release pressing from.\n * @param init Additional event options.\n */\n protected simulateTouchRelease(\n element: HTMLElement,\n init: PointerEventInit = {},\n touchInit: TouchEventInit = {},\n ) {\n this.removePseudoClass(element, ':active');\n this.forEachNodeFrom(element, (el) => {\n this.removePseudoClass(el, ':active');\n });\n const mouseInit = this.createMouseEventInit(element);\n const pointerInit: PointerEventInit = {\n ...mouseInit,\n isPrimary: true,\n pointerType: 'touch',\n ...init,\n };\n\n element.dispatchEvent(new PointerEvent('pointerup', pointerInit));\n // Firefox does not support TouchEvent constructor\n if (window.TouchEvent) {\n const touch = this.createTouch(element);\n element.dispatchEvent(\n new TouchEvent('touchend', {changedTouches: [touch], ...touchInit}),\n );\n }\n }\n\n /**\n * Simulates a touch cancel from an element.\n *\n * @param element The element to cancel a touch for.\n * @param init Additional event options.\n */\n protected simulateTouchCancel(\n element: HTMLElement,\n init: PointerEventInit = {},\n touchInit: TouchEventInit = {},\n ) {\n this.removePseudoClass(element, ':active');\n this.forEachNodeFrom(element, (el) => {\n this.removePseudoClass(el, ':active');\n });\n const mouseInit = this.createMouseEventInit(element);\n const pointerInit: PointerEventInit = {\n ...mouseInit,\n isPrimary: true,\n pointerType: 'touch',\n ...init,\n };\n\n element.dispatchEvent(new PointerEvent('pointercancel', pointerInit));\n // Firefox does not support TouchEvent constructor\n if (window.TouchEvent) {\n const touch = this.createTouch(element);\n element.dispatchEvent(\n new TouchEvent('touchcancel', {changedTouches: [touch], ...touchInit}),\n );\n }\n }\n\n /**\n * Simulates a keypress on an element.\n *\n * @param element The element to press a key on.\n * @param key The key to press.\n * @param init Additional event options.\n */\n protected simulateKeypress(\n element: EventTarget,\n key: string,\n init: KeyboardEventInit = {},\n ) {\n this.simulateKeydown(element, key, init);\n this.simulateKeyup(element, key, init);\n }\n\n /**\n * Simulates a keydown press on an element.\n *\n * @param element The element to press a key on.\n * @param key The key to press.\n * @param init Additional event options.\n */\n protected simulateKeydown(\n element: EventTarget,\n key: string,\n init: KeyboardEventInit = {},\n ) {\n element.dispatchEvent(\n new KeyboardEvent('keydown', {\n ...init,\n key,\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n }\n\n /**\n * Simulates a keyup release from an element.\n *\n * @param element The element to release a key from.\n * @param key The key to release.\n * @param init Additional keyboard options.\n */\n protected simulateKeyup(\n element: EventTarget,\n key: string,\n init: KeyboardEventInit = {},\n ) {\n element.dispatchEvent(\n new KeyboardEvent('keyup', {\n ...init,\n key,\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n }\n\n /**\n * Creates a MouseEventInit for an element. The default x/y coordinates of the\n * event init will be in the center of the element.\n *\n * @param element The element to create a `MouseEventInit` for.\n * @return The init object for a `MouseEvent`.\n */\n protected createMouseEventInit(element: HTMLElement): MouseEventInit {\n const rect = element.getBoundingClientRect();\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n clientX: (rect.left + rect.right) / 2,\n clientY: (rect.top + rect.bottom) / 2,\n screenX: (rect.left + rect.right) / 2,\n screenY: (rect.top + rect.bottom) / 2,\n // Primary button (usually the left button)\n button: 0,\n buttons: 1,\n };\n }\n\n /**\n * Creates a Touch instance for an element. The default x/y coordinates of the\n * touch will be in the center of the element. This can be used in the\n * `TouchEvent` constructor.\n *\n * @param element The element to create a touch for.\n * @param identifier Optional identifier for the touch. Defaults to 0 for\n * every touch instance.\n * @return The `Touch` instance.\n */\n protected createTouch(element: HTMLElement, identifier = 0): Touch {\n const rect = element.getBoundingClientRect();\n return new Touch({\n identifier,\n target: element,\n clientX: (rect.left + rect.right) / 2,\n clientY: (rect.top + rect.bottom) / 2,\n screenX: (rect.left + rect.right) / 2,\n screenY: (rect.top + rect.bottom) / 2,\n pageX: (rect.left + rect.right) / 2,\n pageY: (rect.top + rect.bottom) / 2,\n touchType: 'direct',\n });\n }\n\n /**\n * Visit each node up the parent tree from the given child until reaching the\n * given parent.\n *\n * This is used to perform logic such as adding/removing recursive pseudo\n * classes like `:hover`.\n *\n * @param child The first child element to start from.\n * @param callback A callback that is invoked with each `HTMLElement` node\n * from the child to the parent.\n * @param parent The last parent element to visit.\n */\n protected forEachNodeFrom(\n child: HTMLElement,\n callback: (node: HTMLElement) => void,\n parent: HTMLElement = this.element,\n ) {\n let nextNode: Node | null = child;\n while (nextNode && nextNode !== this.element) {\n const currentNode: Node = nextNode;\n nextNode = currentNode.parentNode || (currentNode as ShadowRoot).host;\n\n if (!(currentNode instanceof HTMLElement)) {\n continue;\n }\n\n callback(currentNode);\n\n if (nextNode instanceof HTMLElement && nextNode.shadowRoot) {\n const slot = currentNode.getAttribute('slot');\n const slotSelector = slot ? `slot[name=${slot}]` : 'slot:not([name])';\n const slotElement =\n nextNode.shadowRoot.querySelector<HTMLSlotElement>(slotSelector);\n if (slotElement) {\n this.forEachNodeFrom(slotElement, callback, nextNode);\n }\n }\n }\n\n callback(parent);\n }\n\n /**\n * Patch an element's methods, such as `querySelector` and `matches` to\n * handle transformed pseudo classes.\n *\n * For example, `element.matches(':focus')` will return true when the\n * `._focus` class is applied.\n *\n * @param element The element to patch.\n */\n protected patchForTransformedPseudoClasses(element: HTMLElement) {\n if (this.patchedElements.has(element)) {\n return;\n }\n\n // Patch functions to handle pseudo selectors.\n const getSelector = (selector: string) => {\n if (this.transformPseudoClasses.includes(selector)) {\n return `.${getTransformedPseudoClass(selector)}`;\n }\n\n return selector;\n };\n\n const superMatches = this.element.matches;\n element.matches = (selector: string) => {\n return superMatches.call(element, getSelector(selector));\n };\n\n const superQuerySelector = this.element.querySelector;\n element.querySelector = (selector: string) => {\n return superQuerySelector.call(element, getSelector(selector));\n };\n\n const superQuerySelectorAll = this.element.querySelectorAll;\n element.querySelectorAll = (selector: string) => {\n return superQuerySelectorAll.call(element, getSelector(selector));\n };\n\n this.patchedElements.add(element);\n }\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2021 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Array of pseudo classes to transform by default. These pseudo classes
|
|
8
|
+
* represent state interactions from the user (such as :hover) or the browser
|
|
9
|
+
* (such as :autofill) that cannot be reproduced with HTML markup.
|
|
10
|
+
*/
|
|
11
|
+
export declare const defaultTransformPseudoClasses: string[];
|
|
12
|
+
/**
|
|
13
|
+
* Retrieves the transformed class name for a given pseudo class.
|
|
14
|
+
*
|
|
15
|
+
* @param pseudoClass The pseudo class to transform.
|
|
16
|
+
* @return The transform pseudo class string.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getTransformedPseudoClass(pseudoClass: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Transforms a document's stylesheets' pseudo classes into normal classes with
|
|
21
|
+
* a new stylesheet.
|
|
22
|
+
*
|
|
23
|
+
* Pseudo classes are given an underscore in their transformation. For example,
|
|
24
|
+
* `:hover` transforms to `._hover`.
|
|
25
|
+
*
|
|
26
|
+
* ```css
|
|
27
|
+
* .mdc-foo:hover {
|
|
28
|
+
* color: teal;
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
* ```css
|
|
32
|
+
* .mdc-foo._hover {
|
|
33
|
+
* color: teal;
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @param pseudoClasses An optional array of pseudo class names to transform.
|
|
38
|
+
*/
|
|
39
|
+
export declare function transformPseudoClasses(stylesheets: Iterable<CSSStyleSheet>, pseudoClasses?: string[]): void;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2021 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Array of pseudo classes to transform by default. These pseudo classes
|
|
8
|
+
* represent state interactions from the user (such as :hover) or the browser
|
|
9
|
+
* (such as :autofill) that cannot be reproduced with HTML markup.
|
|
10
|
+
*/
|
|
11
|
+
export const defaultTransformPseudoClasses = [
|
|
12
|
+
':active',
|
|
13
|
+
':autofill',
|
|
14
|
+
':focus',
|
|
15
|
+
':focus-visible',
|
|
16
|
+
':focus-within',
|
|
17
|
+
':hover',
|
|
18
|
+
':invalid',
|
|
19
|
+
':link',
|
|
20
|
+
':paused',
|
|
21
|
+
':playing',
|
|
22
|
+
':user-invalid',
|
|
23
|
+
':valid',
|
|
24
|
+
':visited',
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Retrieves the transformed class name for a given pseudo class.
|
|
28
|
+
*
|
|
29
|
+
* @param pseudoClass The pseudo class to transform.
|
|
30
|
+
* @return The transform pseudo class string.
|
|
31
|
+
*/
|
|
32
|
+
export function getTransformedPseudoClass(pseudoClass) {
|
|
33
|
+
return `_${pseudoClass.substring(1)}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A weak set of stylesheets to use as reference for whether or not a stylesheet
|
|
37
|
+
* has been transformed.
|
|
38
|
+
*/
|
|
39
|
+
const transformedStyleSheets = new WeakSet();
|
|
40
|
+
/**
|
|
41
|
+
* Transforms a document's stylesheets' pseudo classes into normal classes with
|
|
42
|
+
* a new stylesheet.
|
|
43
|
+
*
|
|
44
|
+
* Pseudo classes are given an underscore in their transformation. For example,
|
|
45
|
+
* `:hover` transforms to `._hover`.
|
|
46
|
+
*
|
|
47
|
+
* ```css
|
|
48
|
+
* .mdc-foo:hover {
|
|
49
|
+
* color: teal;
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
* ```css
|
|
53
|
+
* .mdc-foo._hover {
|
|
54
|
+
* color: teal;
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @param pseudoClasses An optional array of pseudo class names to transform.
|
|
59
|
+
*/
|
|
60
|
+
export function transformPseudoClasses(stylesheets, pseudoClasses = defaultTransformPseudoClasses) {
|
|
61
|
+
for (const stylesheet of stylesheets) {
|
|
62
|
+
if (transformedStyleSheets.has(stylesheet)) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
let rules;
|
|
66
|
+
try {
|
|
67
|
+
rules = stylesheet.cssRules;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
for (let j = rules.length - 1; j >= 0; j--) {
|
|
73
|
+
visitRule(rules[j], stylesheet, j, pseudoClasses);
|
|
74
|
+
}
|
|
75
|
+
transformedStyleSheets.add(stylesheet);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Determines whether or not the CSSRule is a CSSGroupingRule.
|
|
80
|
+
*
|
|
81
|
+
* Cannot check instanceof because FF treats a CSSStyleRule as a subclass of
|
|
82
|
+
* CSSGroupingRule unlike Chrome and Safari
|
|
83
|
+
*/
|
|
84
|
+
function isCSSGroupingRule(rule) {
|
|
85
|
+
return (!!rule?.cssRules &&
|
|
86
|
+
!rule.selectorText);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Visits a rule for the given stylesheet and adds a rule that replaces any
|
|
90
|
+
* pseudo classes with a regular transformed class for simulation styling.
|
|
91
|
+
*
|
|
92
|
+
* @param rule The CSS rule to transform.
|
|
93
|
+
* @param stylesheet The rule's parent stylesheet to update.
|
|
94
|
+
* @param index The index of the rule in the parent stylesheet.
|
|
95
|
+
* @param pseudoClasses An array of pseudo classes to search for and replace.
|
|
96
|
+
*/
|
|
97
|
+
function visitRule(rule, stylesheet, index, pseudoClasses) {
|
|
98
|
+
if (isCSSGroupingRule(rule)) {
|
|
99
|
+
for (let i = rule.cssRules.length - 1; i >= 0; i--) {
|
|
100
|
+
visitRule(rule.cssRules[i], rule, i, pseudoClasses);
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!(rule instanceof CSSStyleRule)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
let { selectorText } = rule;
|
|
109
|
+
// match :foo, ensuring that it does not have a paren at the end
|
|
110
|
+
// (no pseudo class functions like :foo())
|
|
111
|
+
const regex = /(:(?![\w-]+\()[\w-]+)/g;
|
|
112
|
+
const matches = Array.from(selectorText.matchAll(regex)).filter((match) => {
|
|
113
|
+
// don't match pseudo elements like ::foo
|
|
114
|
+
if (match.index != null && selectorText[match.index - 1] === ':') {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
return pseudoClasses.includes(match[1]);
|
|
118
|
+
});
|
|
119
|
+
if (!matches.length) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
matches.reverse();
|
|
123
|
+
selectorText = rearrangePseudoElements(selectorText);
|
|
124
|
+
for (const match of matches) {
|
|
125
|
+
selectorText =
|
|
126
|
+
selectorText.substring(0, match.index) +
|
|
127
|
+
`.${getTransformedPseudoClass(match[1])}` +
|
|
128
|
+
selectorText.substring(match.index + match[1].length);
|
|
129
|
+
}
|
|
130
|
+
const css = `${selectorText} {${rule.style.cssText}}`;
|
|
131
|
+
stylesheet.insertRule(css, index + 1);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// Catch exception to skip the rule that cannot be parsed.
|
|
135
|
+
console.error(error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Re-arranges a selector's pseudo elements to appear at the end of the
|
|
140
|
+
* selector. This prevents invalid CSS when replacing pseudo classes that
|
|
141
|
+
* appear after a pseudo element.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* // '.foo::before:hover' -> '.foo::before._hover' is invalid
|
|
145
|
+
*
|
|
146
|
+
* rearrangePseudoElements('.foo::before:hover'); // '.foo:hover::before'
|
|
147
|
+
* // '.foo:hover::before' -> '.foo._hover::before' is valid
|
|
148
|
+
*
|
|
149
|
+
* @param selectorText The selector text string to re-arrange.
|
|
150
|
+
* @return The re-arranged selector text.
|
|
151
|
+
*/
|
|
152
|
+
function rearrangePseudoElements(selectorText) {
|
|
153
|
+
const pseudoElementsBeforeClasses = Array.from(selectorText.matchAll(/(?:::[\w-]+)+(?=:[\w-])/g));
|
|
154
|
+
pseudoElementsBeforeClasses.reverse();
|
|
155
|
+
for (const match of pseudoElementsBeforeClasses) {
|
|
156
|
+
const pseudoElement = match[0];
|
|
157
|
+
const pseudoElementIndex = match.index;
|
|
158
|
+
const endOfCompoundSelector = selectorText
|
|
159
|
+
.substring(pseudoElementIndex)
|
|
160
|
+
.match(/(\s(?!([^\s].)*\))|,|$)/);
|
|
161
|
+
const index = endOfCompoundSelector.index + pseudoElementIndex;
|
|
162
|
+
selectorText =
|
|
163
|
+
selectorText.substring(0, index) +
|
|
164
|
+
pseudoElement +
|
|
165
|
+
selectorText.substring(index);
|
|
166
|
+
selectorText =
|
|
167
|
+
selectorText.substring(0, pseudoElementIndex) +
|
|
168
|
+
selectorText.substring(pseudoElementIndex + pseudoElement.length);
|
|
169
|
+
}
|
|
170
|
+
return selectorText;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=transform-pseudo-classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-pseudo-classes.js","sourceRoot":"","sources":["transform-pseudo-classes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Array of pseudo classes to transform by default. These pseudo classes\n * represent state interactions from the user (such as :hover) or the browser\n * (such as :autofill) that cannot be reproduced with HTML markup.\n */\nexport const defaultTransformPseudoClasses = [\n ':active',\n ':autofill',\n ':focus',\n ':focus-visible',\n ':focus-within',\n ':hover',\n ':invalid',\n ':link',\n ':paused',\n ':playing',\n ':user-invalid',\n ':valid',\n ':visited',\n];\n\n/**\n * Retrieves the transformed class name for a given pseudo class.\n *\n * @param pseudoClass The pseudo class to transform.\n * @return The transform pseudo class string.\n */\nexport function getTransformedPseudoClass(pseudoClass: string) {\n return `_${pseudoClass.substring(1)}`;\n}\n\n/**\n * A weak set of stylesheets to use as reference for whether or not a stylesheet\n * has been transformed.\n */\nconst transformedStyleSheets = new WeakSet<CSSStyleSheet>();\n\n/**\n * Transforms a document's stylesheets' pseudo classes into normal classes with\n * a new stylesheet.\n *\n * Pseudo classes are given an underscore in their transformation. For example,\n * `:hover` transforms to `._hover`.\n *\n * ```css\n * .mdc-foo:hover {\n * color: teal;\n * }\n * ```\n * ```css\n * .mdc-foo._hover {\n * color: teal;\n * }\n * ```\n *\n * @param pseudoClasses An optional array of pseudo class names to transform.\n */\nexport function transformPseudoClasses(\n stylesheets: Iterable<CSSStyleSheet>,\n pseudoClasses = defaultTransformPseudoClasses,\n) {\n for (const stylesheet of stylesheets) {\n if (transformedStyleSheets.has(stylesheet)) {\n continue;\n }\n\n let rules: CSSRuleList;\n try {\n rules = stylesheet.cssRules;\n } catch {\n continue;\n }\n\n for (let j = rules.length - 1; j >= 0; j--) {\n visitRule(rules[j], stylesheet, j, pseudoClasses);\n }\n\n transformedStyleSheets.add(stylesheet);\n }\n}\n\n/**\n * Determines whether or not the CSSRule is a CSSGroupingRule.\n *\n * Cannot check instanceof because FF treats a CSSStyleRule as a subclass of\n * CSSGroupingRule unlike Chrome and Safari\n */\nfunction isCSSGroupingRule(rule: CSSRule): rule is CSSGroupingRule {\n return (\n !!(rule as CSSGroupingRule)?.cssRules &&\n !(rule as CSSStyleRule).selectorText\n );\n}\n\n/**\n * Visits a rule for the given stylesheet and adds a rule that replaces any\n * pseudo classes with a regular transformed class for simulation styling.\n *\n * @param rule The CSS rule to transform.\n * @param stylesheet The rule's parent stylesheet to update.\n * @param index The index of the rule in the parent stylesheet.\n * @param pseudoClasses An array of pseudo classes to search for and replace.\n */\nfunction visitRule(\n rule: CSSRule,\n stylesheet: CSSStyleSheet | CSSGroupingRule,\n index: number,\n pseudoClasses: string[],\n) {\n if (isCSSGroupingRule(rule)) {\n for (let i = rule.cssRules.length - 1; i >= 0; i--) {\n visitRule(rule.cssRules[i], rule, i, pseudoClasses);\n }\n return;\n }\n\n if (!(rule instanceof CSSStyleRule)) {\n return;\n }\n\n try {\n let {selectorText} = rule;\n // match :foo, ensuring that it does not have a paren at the end\n // (no pseudo class functions like :foo())\n const regex = /(:(?![\\w-]+\\()[\\w-]+)/g;\n const matches = Array.from(selectorText.matchAll(regex)).filter((match) => {\n // don't match pseudo elements like ::foo\n if (match.index != null && selectorText[match.index - 1] === ':') {\n return false;\n }\n return pseudoClasses.includes(match[1]);\n });\n\n if (!matches.length) {\n return;\n }\n\n matches.reverse();\n selectorText = rearrangePseudoElements(selectorText);\n for (const match of matches) {\n selectorText =\n selectorText.substring(0, match.index!) +\n `.${getTransformedPseudoClass(match[1])}` +\n selectorText.substring(match.index! + match[1].length);\n }\n\n const css = `${selectorText} {${rule.style.cssText}}`;\n stylesheet.insertRule(css, index + 1);\n } catch (error: unknown) {\n // Catch exception to skip the rule that cannot be parsed.\n console.error(error);\n }\n}\n\n/**\n * Re-arranges a selector's pseudo elements to appear at the end of the\n * selector. This prevents invalid CSS when replacing pseudo classes that\n * appear after a pseudo element.\n *\n * @example\n * // '.foo::before:hover' -> '.foo::before._hover' is invalid\n *\n * rearrangePseudoElements('.foo::before:hover'); // '.foo:hover::before'\n * // '.foo:hover::before' -> '.foo._hover::before' is valid\n *\n * @param selectorText The selector text string to re-arrange.\n * @return The re-arranged selector text.\n */\nfunction rearrangePseudoElements(selectorText: string) {\n const pseudoElementsBeforeClasses = Array.from(\n selectorText.matchAll(/(?:::[\\w-]+)+(?=:[\\w-])/g),\n );\n pseudoElementsBeforeClasses.reverse();\n for (const match of pseudoElementsBeforeClasses) {\n const pseudoElement = match[0];\n const pseudoElementIndex = match.index!;\n const endOfCompoundSelector = selectorText\n .substring(pseudoElementIndex)\n .match(/(\\s(?!([^\\s].)*\\))|,|$)/)!;\n const index = endOfCompoundSelector.index! + pseudoElementIndex;\n selectorText =\n selectorText.substring(0, index) +\n pseudoElement +\n selectorText.substring(index);\n selectorText =\n selectorText.substring(0, pseudoElementIndex) +\n selectorText.substring(pseudoElementIndex + pseudoElement.length);\n }\n\n return selectorText;\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import '../field/filled-field.js';
|
|
7
7
|
import { FilledTextField } from './internal/filled-text-field.js';
|
|
8
|
-
export { TextFieldType } from './internal/text-field.js';
|
|
8
|
+
export { type TextFieldType } from './internal/text-field.js';
|
|
9
9
|
declare global {
|
|
10
10
|
interface HTMLElementTagNameMap {
|
|
11
11
|
'md-filled-text-field': MdFilledTextField;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filled-text-field.js","sourceRoot":"","sources":["filled-text-field.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,0BAA0B,CAAC;AAElC,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,iCAAiC,CAAC;AAUvE;;;;GAIG;AAEI,WAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,eAAe;IAA/C;;QAGuB,aAAQ,GAAG,OAAO,CAAA,iBAAiB,CAAC;IAClE,CAAC;;AAHiB,wBAAM,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,AAA/B,CAAgC;AAD3C,iBAAiB;IAD7B,aAAa,CAAC,sBAAsB,CAAC;GACzB,iBAAiB,CAI7B","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../field/filled-field.js';\n\nimport {customElement} from 'lit/decorators.js';\nimport {literal} from 'lit/static-html.js';\n\nimport {styles as filledStyles} from './internal/filled-styles.css.js';\nimport {FilledTextField} from './internal/filled-text-field.js';\nimport {styles as sharedStyles} from './internal/shared-styles.css.js';\n\nexport {TextFieldType} from './internal/text-field.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-filled-text-field': MdFilledTextField;\n }\n}\n\n/**\n * TODO(b/228525797): Add docs\n * @final\n * @suppress {visibility}\n */\n@customElement('md-filled-text-field')\nexport class MdFilledTextField extends FilledTextField {\n static override styles = [sharedStyles, filledStyles];\n\n protected override readonly fieldTag = literal`md-filled-field`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"filled-text-field.js","sourceRoot":"","sources":["filled-text-field.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,0BAA0B,CAAC;AAElC,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,iCAAiC,CAAC;AAUvE;;;;GAIG;AAEI,WAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,eAAe;IAA/C;;QAGuB,aAAQ,GAAG,OAAO,CAAA,iBAAiB,CAAC;IAClE,CAAC;;AAHiB,wBAAM,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,AAA/B,CAAgC;AAD3C,iBAAiB;IAD7B,aAAa,CAAC,sBAAsB,CAAC;GACzB,iBAAiB,CAI7B","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../field/filled-field.js';\n\nimport {customElement} from 'lit/decorators.js';\nimport {literal} from 'lit/static-html.js';\n\nimport {styles as filledStyles} from './internal/filled-styles.css.js';\nimport {FilledTextField} from './internal/filled-text-field.js';\nimport {styles as sharedStyles} from './internal/shared-styles.css.js';\n\nexport {type TextFieldType} from './internal/text-field.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-filled-text-field': MdFilledTextField;\n }\n}\n\n/**\n * TODO(b/228525797): Add docs\n * @final\n * @suppress {visibility}\n */\n@customElement('md-filled-text-field')\nexport class MdFilledTextField extends FilledTextField {\n static override styles = [sharedStyles, filledStyles];\n\n protected override readonly fieldTag = literal`md-filled-field`;\n}\n"]}
|
|
@@ -310,8 +310,7 @@ export declare abstract class TextField extends textFieldBaseClass {
|
|
|
310
310
|
private renderSuffix;
|
|
311
311
|
private renderAffix;
|
|
312
312
|
private getErrorText;
|
|
313
|
-
private
|
|
314
|
-
private handleFocusout;
|
|
313
|
+
private handleFocusChange;
|
|
315
314
|
private handleInput;
|
|
316
315
|
private redispatchEvent;
|
|
317
316
|
private getInputOrTextarea;
|
|
@@ -455,8 +455,8 @@ export class TextField extends textFieldBaseClass {
|
|
|
455
455
|
cols=${this.cols}
|
|
456
456
|
.value=${live(this.value)}
|
|
457
457
|
@change=${this.redispatchEvent}
|
|
458
|
-
@
|
|
459
|
-
@
|
|
458
|
+
@focus=${this.handleFocusChange}
|
|
459
|
+
@blur=${this.handleFocusChange}
|
|
460
460
|
@input=${this.handleInput}
|
|
461
461
|
@select=${this.redispatchEvent}></textarea>
|
|
462
462
|
`;
|
|
@@ -492,8 +492,8 @@ export class TextField extends textFieldBaseClass {
|
|
|
492
492
|
type=${this.type}
|
|
493
493
|
.value=${live(this.value)}
|
|
494
494
|
@change=${this.redispatchEvent}
|
|
495
|
-
@
|
|
496
|
-
@
|
|
495
|
+
@focus=${this.handleFocusChange}
|
|
496
|
+
@blur=${this.handleFocusChange}
|
|
497
497
|
@input=${this.handleInput}
|
|
498
498
|
@select=${this.redispatchEvent} />
|
|
499
499
|
${suffix}
|
|
@@ -519,11 +519,12 @@ export class TextField extends textFieldBaseClass {
|
|
|
519
519
|
getErrorText() {
|
|
520
520
|
return this.error ? this.errorText : this.nativeErrorText;
|
|
521
521
|
}
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
522
|
+
handleFocusChange() {
|
|
523
|
+
// When calling focus() or reportValidity() during change, it's possible
|
|
524
|
+
// for blur to be called after the new focus event. Rather than set
|
|
525
|
+
// `this.focused` to true/false on focus/blur, we always set it to whether
|
|
526
|
+
// or not the input itself is focused.
|
|
527
|
+
this.focused = this.inputOrTextarea?.matches(':focus') ?? false;
|
|
527
528
|
}
|
|
528
529
|
handleInput(event) {
|
|
529
530
|
this.dirty = true;
|
|
@@ -584,15 +585,8 @@ export class TextField extends textFieldBaseClass {
|
|
|
584
585
|
return this.inputOrTextarea;
|
|
585
586
|
}
|
|
586
587
|
[onReportValidity](invalidEvent) {
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
}
|
|
590
|
-
if (invalidEvent) {
|
|
591
|
-
// Prevent default pop-up behavior. This also prevents focusing, so we
|
|
592
|
-
// manually focus.
|
|
593
|
-
invalidEvent.preventDefault();
|
|
594
|
-
this.focus();
|
|
595
|
-
}
|
|
588
|
+
// Prevent default pop-up behavior.
|
|
589
|
+
invalidEvent?.preventDefault();
|
|
596
590
|
const prevMessage = this.getErrorText();
|
|
597
591
|
this.nativeError = !!invalidEvent;
|
|
598
592
|
this.nativeErrorText = this.validationMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-field.js","sourceRoot":"","sources":["text-field.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,EAAC,UAAU,EAAkB,IAAI,EAAE,OAAO,EAAC,MAAM,KAAK,CAAC;AAC9D,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAC,QAAQ,EAAC,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAY,QAAQ,EAAC,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAc,IAAI,IAAI,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAInE,OAAO,EAAC,yBAAyB,EAAC,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAC,eAAe,EAAC,MAAM,+CAA+C,CAAC;AAC9E,OAAO,EAAC,eAAe,EAAC,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAC,qBAAqB,EAAC,MAAM,2CAA2C,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,mBAAmB,GACpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAC,kBAAkB,EAAC,MAAM,yDAAyD,CAAC;AAyC3F,wCAAwC;AACxC,MAAM,kBAAkB,GAAG,qBAAqB,CAC9C,yBAAyB,CACvB,mBAAmB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CACvD,CACF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,OAAgB,SAAU,SAAQ,kBAAkB;IAA1D;;QAWE;;;;;WAKG;QACuC,UAAK,GAAG,KAAK,CAAC;QAExD;;;;;;;WAOG;QACkC,cAAS,GAAG,EAAE,CAAC;QAEpD;;;;;;;;;WASG;QACS,UAAK,GAAG,EAAE,CAAC;QAEvB;;;;;;;WAOG;QACuC,aAAQ,GAAG,KAAK,CAAC;QAE3D;;WAEG;QACS,UAAK,GAAG,EAAE,CAAC;QAEvB;;WAEG;QACmC,eAAU,GAAG,EAAE,CAAC;QAEtD;;WAEG;QACmC,eAAU,GAAG,EAAE,CAAC;QAEtD;;WAEG;QAEH,mBAAc,GAAG,KAAK,CAAC;QAEvB;;WAEG;QAEH,oBAAe,GAAG,KAAK,CAAC;QAExB;;;WAGG;QACuC,mBAAc,GAAG,EAAE,CAAC;QAE9D;;;WAGG;QACsC,kBAAa,GAAG,EAAE,CAAC;QAE5D;;;WAGG;QACuB,SAAI,GAAG,CAAC,CAAC;QAEnC;;;WAGG;QACuB,SAAI,GAAG,EAAE,CAAC;QAEpC,qBAAqB;QACe,cAAS,GAAG,EAAE,CAAC;QAEnD;;;;WAIG;QACS,QAAG,GAAG,EAAE,CAAC;QAErB;;;;;WAKG;QACuB,cAAS,GAAG,CAAC,CAAC,CAAC;QAEzC;;;;WAIG;QACS,QAAG,GAAG,EAAE,CAAC;QAErB;;;;;WAKG;QACuB,cAAS,GAAG,CAAC,CAAC,CAAC;QAEzC;;WAEG;QACiD,cAAS,GAAG,KAAK,CAAC;QAEtE;;;;;WAKG;QACS,YAAO,GAAG,EAAE,CAAC;QAEzB;;;;;;;WAOG;QACoD,gBAAW,GAAG,EAAE,CAAC;QAExE;;;;;WAKG;QACuC,aAAQ,GAAG,KAAK,CAAC;QAE3D;;;;WAIG;QACuC,aAAQ,GAAG,KAAK,CAAC;QAgC3D;;;;;WAKG;QACS,SAAI,GAAG,EAAE,CAAC;QAEtB;;;;;;;;;;;;;;;;;;WAkBG;QAEH,SAAI,GAA6C,MAAM,CAAC;QAExD;;;;;WAKG;QACwB,iBAAY,GAAG,EAAE,CAAC;QA8C7C;;;WAGG;QACc,UAAK,GAAG,KAAK,CAAC;QACd,YAAO,GAAG,KAAK,CAAC;QACjC;;WAEG;QACc,gBAAW,GAAG,KAAK,CAAC;QACrC;;;WAGG;QACc,oBAAe,GAAG,EAAE,CAAC;IAiZxC,CAAC;IA/gBC;;OAEG;IACH,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,kBAAkB,CAAC;IACtD,CAAC;IACD,IAAI,kBAAkB,CAAC,KAA6C;QAClE,IAAI,CAAC,kBAAkB,EAAE,CAAC,kBAAkB,GAAG,KAAK,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,YAAY,CAAC;IAChD,CAAC;IACD,IAAI,YAAY,CAAC,KAAoB;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC;IAClD,CAAC;IACD,IAAI,cAAc,CAAC,KAAoB;QACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC,cAAc,GAAG,KAAK,CAAC;IACnD,CAAC;IAwCD;;OAEG;IACH,IAAI,aAAa;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,GAAG,CAAC;SACZ;QAED,OAAO,KAAK,CAAC,aAAa,CAAC;IAC7B,CAAC;IACD,IAAI,aAAa,CAAC,KAAa;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QAED,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC,WAAW,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,CAAC,KAAkB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QAED,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,CAAC;IAoBD,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC;IACxC,CAAC;IAaD;;;;OAIG;IACH,MAAM;QACJ,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAcD,YAAY,CAAC,GAAG,IAAe;QAC7B,uEAAuE;QACvE,8DAA8D;QAC9D,IAAI,CAAC,kBAAkB,EAAE,CAAC,YAAY,CACpC,GAAI,IAAqD,CAC1D,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC;IAC/C,CAAC;IAED;;;;;;;;OAQG;IACH,iBAAiB,CACf,KAAoB,EACpB,GAAkB,EAClB,SAA2C;QAE3C,IAAI,CAAC,kBAAkB,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAsB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QAED,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,aAAsB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QAED,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAEQ,wBAAwB,CAC/B,SAAiB,EACjB,QAAuB,EACvB,QAAuB;QAEvB,IAAI,SAAS,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE;YACvC,uEAAuE;YACvE,0EAA0E;YAC1E,OAAO;SACR;QAED,KAAK,CAAC,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEkB,MAAM;QACvB,MAAM,OAAO,GAAG;YACd,UAAU,EAAE,IAAI,CAAC,QAAQ;YACzB,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;YACxC,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU;YACpC,YAAY,EAAE,IAAI,CAAC,SAAS;SAC7B,CAAC;QAEF,OAAO,IAAI,CAAA;gCACiB,QAAQ,CAAC,OAAO,CAAC;UACvC,IAAI,CAAC,WAAW,EAAE;;KAEvB,CAAC;IACJ,CAAC;IAEkB,OAAO,CAAC,iBAAiC;QAC1D,4DAA4D;QAE5D,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;YACxB,qEAAqE;YACrE,wEAAwE;YACxE,6BAA6B;YAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACpB;IACH,CAAC;IAEO,WAAW;QACjB,OAAO,UAAU,CAAA,IAAI,IAAI,CAAC,QAAQ;;cAExB,IAAI,CAAC,KAAK,CAAC,MAAM;kBACb,IAAI,CAAC,QAAQ;eAChB,IAAI,CAAC,QAAQ;mBACT,IAAI,CAAC,YAAY,EAAE;iBACrB,IAAI,CAAC,OAAO;iBACZ,IAAI,CAAC,eAAe;mBAClB,IAAI,CAAC,cAAc;cACxB,IAAI,CAAC,KAAK;YACZ,IAAI,CAAC,SAAS;mBACP,CAAC,CAAC,IAAI,CAAC,KAAK;kBACb,IAAI,CAAC,QAAQ;mBACZ,IAAI,CAAC,IAAI,KAAK,UAAU;wBACnB,IAAI,CAAC,cAAc;;QAEnC,IAAI,CAAC,iBAAiB,EAAE;QACxB,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,kBAAkB,EAAE;;QAEzB,IAAI,CAAC,QAAQ,GAAG,CAAC;IACvB,CAAC;IAEO,iBAAiB;QACvB,OAAO,IAAI,CAAA;;gDAEiC,IAAI,CAAC,gBAAgB;;KAEhE,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,OAAO,IAAI,CAAA;;iDAEkC,IAAI,CAAC,gBAAgB;;KAEjE,CAAC;IACJ,CAAC;IAEO,qBAAqB;QAC3B,MAAM,KAAK,GAAc,EAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAC,CAAC;QAC3D,MAAM,SAAS,GACZ,IAAwB,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;QAC/D,mDAAmD;QACnD,kCAAkC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAmB,CAAC;QAE9C,uEAAuE;QACvE,qCAAqC;QACrC,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;YAC5B,OAAO,IAAI,CAAA;;;kBAGC,QAAQ,CAAC,KAAK,CAAC;;yBAER,IAAI,CAAC,QAAQ;uBACf,SAAS;yBACP,YAAY,IAAI,OAAO;sBAC1B,IAAI,CAAC,QAAQ;sBACb,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;sBACvC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;wBACrC,IAAI,CAAC,WAAW,IAAI,OAAO;sBAC7B,IAAI,CAAC,QAAQ;sBACb,IAAI,CAAC,QAAQ;iBAClB,IAAI,CAAC,IAAI;iBACT,IAAI,CAAC,IAAI;mBACP,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;oBACf,IAAI,CAAC,eAAe;qBACnB,IAAI,CAAC,aAAa;sBACjB,IAAI,CAAC,cAAc;mBACtB,IAAI,CAAC,WAAW;oBACf,IAAI,CAAC,eAAe;OACjC,CAAC;SACH;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEnC,yEAAyE;QACzE,oBAAoB;QACpB,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAgB,CAAC;QACxC,OAAO,IAAI,CAAA;;UAEL,MAAM;;;kBAGE,QAAQ,CAAC,KAAK,CAAC;;yBAER,IAAI,CAAC,QAAQ;uBACf,SAAS;yBACP,YAAY,IAAI,OAAO;sBAC1B,IAAI,CAAC,QAAQ;sBACb,SAAS,IAAI,OAAO;gBAC1B,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAsB;sBACpC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;gBAC7C,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAsB;sBACpC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;oBACzC,IAAI,CAAC,OAAO,IAAI,OAAO;wBACnB,IAAI,CAAC,WAAW,IAAI,OAAO;sBAC7B,IAAI,CAAC,QAAQ;sBACb,IAAI,CAAC,QAAQ;sBACb,IAAI,CAAC,QAAQ;iBAClB,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAsB;iBAC3C,IAAI,CAAC,IAAI;mBACP,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;oBACf,IAAI,CAAC,eAAe;qBACnB,IAAI,CAAC,aAAa;sBACjB,IAAI,CAAC,cAAc;mBACtB,IAAI,CAAC,WAAW;oBACf,IAAI,CAAC,eAAe;UAC9B,MAAM;;KAEX,CAAC;IACJ,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IAEO,WAAW,CAAC,IAAY,EAAE,QAAiB;QACjD,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,OAAO,CAAC;SAChB;QAED,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,QAAQ;SACpB,CAAC;QAEF,OAAO,IAAI,CAAA,gBAAgB,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;IACjE,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAC5D,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAEO,WAAW,CAAC,KAAiB;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;IACxD,CAAC;IAEO,eAAe,CAAC,KAAY;QAClC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,yDAAyD;YACzD,OAAO;YACP,sEAAsE;YACtE,wCAAwC;YACxC,6CAA6C;YAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB;QAED,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,yEAAyE;YACzE,qEAAqE;YACrE,0DAA0D;YAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB;QAED,OAAO,IAAI,CAAC,eAAgB,CAAC;IAC/B,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;YAC5B,OAAO,IAAI,CAAC;SACb;QAED,OAAO,IAAI,CAAC,kBAAkB,EAAsB,CAAC;IACvD,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC;IAMQ,CAAC,YAAY,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEQ,iBAAiB;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEQ,wBAAwB,CAAC,KAAa;QAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEQ,KAAK;QACZ,yEAAyE;QACzE,2EAA2E;QAC3E,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,CAAC,eAAe,CAAC;QACf,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YACnC,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,CAAC,iBAAiB,CAAC;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,CAAC,gBAAgB,CAAC,CAAC,YAA0B;QAC3C,IAAI,YAAY,EAAE,gBAAgB,EAAE;YAClC,OAAO;SACR;QAED,IAAI,YAAY,EAAE;YAChB,sEAAsE;YACtE,kBAAkB;YAClB,YAAY,CAAC,cAAc,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAE9C,IAAI,WAAW,KAAK,IAAI,CAAC,YAAY,EAAE,EAAE;YACvC,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC;SAC/B;IACH,CAAC;;AA1rBD;IACE,yBAAyB,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC,GAAA,CAAA;AAED,kBAAkB;AACF,2BAAiB,GAAmB;IAClD,GAAG,UAAU,CAAC,iBAAiB;IAC/B,cAAc,EAAE,IAAI;CACrB,AAHgC,CAG/B;AAQwC;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;wCAAe;AAUnB;IAApC,QAAQ,CAAC,EAAC,SAAS,EAAE,YAAY,EAAC,CAAC;4CAAgB;AAYxC;IAAX,QAAQ,EAAE;wCAAY;AAUmB;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;2CAAkB;AAK/C;IAAX,QAAQ,EAAE;wCAAY;AAKe;IAArC,QAAQ,CAAC,EAAC,SAAS,EAAE,aAAa,EAAC,CAAC;6CAAiB;AAKhB;IAArC,QAAQ,CAAC,EAAC,SAAS,EAAE,aAAa,EAAC,CAAC;6CAAiB;AAMtD;IADC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAC,CAAC;iDAClC;AAMvB;IADC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAC,CAAC;kDAClC;AAMkB;IAAzC,QAAQ,CAAC,EAAC,SAAS,EAAE,iBAAiB,EAAC,CAAC;iDAAqB;AAMrB;IAAxC,QAAQ,CAAC,EAAC,SAAS,EAAE,gBAAgB,EAAC,CAAC;gDAAoB;AAMlC;IAAzB,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC;uCAAU;AAMT;IAAzB,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC;uCAAW;AAGA;IAAnC,QAAQ,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;4CAAyB;AAOvC;IAAX,QAAQ,EAAE;sCAAU;AAQK;IAAzB,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC;4CAAgB;AAO7B;IAAX,QAAQ,EAAE;sCAAU;AAQK;IAAzB,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC;4CAAgB;AAKW;IAAnD,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAC,CAAC;4CAAmB;AAQ1D;IAAX,QAAQ,EAAE;0CAAc;AAU8B;IAAtD,QAAQ,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAC,CAAC;8CAAkB;AAQ9B;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;2CAAkB;AAOjB;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;2CAAkB;AAsC/C;IAAX,QAAQ,EAAE;uCAAW;AAsBtB;IADC,QAAQ,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;uCAC8B;AAQ7B;IAA1B,QAAQ,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;+CAAmB;AAkD5B;IAAhB,KAAK,EAAE;wCAAuB;AACd;IAAhB,KAAK,EAAE;0CAAyB;AAIhB;IAAhB,KAAK,EAAE;8CAA6B;AAKpB;IAAhB,KAAK,EAAE;kDAA8B;AAOrB;IADhB,KAAK,CAAC,QAAQ,CAAC;kDAIP;AACyB;IAAjC,KAAK,CAAC,QAAQ,CAAC;wCAAuC;AAEtC;IADhB,qBAAqB,CAAC,EAAC,IAAI,EAAE,cAAc,EAAC,CAAC;+CACJ;AAEzB;IADhB,qBAAqB,CAAC,EAAC,IAAI,EAAE,eAAe,EAAC,CAAC;gDACJ","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {LitElement, PropertyValues, html, nothing} from 'lit';\nimport {property, query, queryAssignedElements, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport {live} from 'lit/directives/live.js';\nimport {StyleInfo, styleMap} from 'lit/directives/style-map.js';\nimport {StaticValue, html as staticHtml} from 'lit/static-html.js';\n\nimport {Field} from '../../field/internal/field.js';\nimport {ARIAMixinStrict} from '../../internal/aria/aria.js';\nimport {requestUpdateOnAriaChange} from '../../internal/aria/delegate.js';\nimport {stringConverter} from '../../internal/controller/string-converter.js';\nimport {redispatchEvent} from '../../internal/events/redispatch-event.js';\nimport {\n createValidator,\n getValidityAnchor,\n mixinConstraintValidation,\n} from '../../labs/behaviors/constraint-validation.js';\nimport {mixinElementInternals} from '../../labs/behaviors/element-internals.js';\nimport {\n getFormValue,\n mixinFormAssociated,\n} from '../../labs/behaviors/form-associated.js';\nimport {\n mixinOnReportValidity,\n onReportValidity,\n} from '../../labs/behaviors/on-report-validity.js';\nimport {TextFieldValidator} from '../../labs/behaviors/validators/text-field-validator.js';\nimport {Validator} from '../../labs/behaviors/validators/validator.js';\n\n/**\n * Input types that are compatible with the text field.\n */\nexport type TextFieldType =\n | 'email'\n | 'number'\n | 'password'\n | 'search'\n | 'tel'\n | 'text'\n | 'url'\n | 'textarea';\n\n/**\n * Input types that are not fully supported for the text field.\n */\nexport type UnsupportedTextFieldType =\n | 'color'\n | 'date'\n | 'datetime-local'\n | 'file'\n | 'month'\n | 'time'\n | 'week';\n\n/**\n * Input types that are incompatible with the text field.\n */\nexport type InvalidTextFieldType =\n | 'button'\n | 'checkbox'\n | 'hidden'\n | 'image'\n | 'radio'\n | 'range'\n | 'reset'\n | 'submit';\n\n// Separate variable needed for closure.\nconst textFieldBaseClass = mixinOnReportValidity(\n mixinConstraintValidation(\n mixinFormAssociated(mixinElementInternals(LitElement)),\n ),\n);\n\n/**\n * A text field component.\n *\n * @fires select {Event} The native `select` event on\n * [`<input>`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select_event)\n * --bubbles\n * @fires change {Event} The native `change` event on\n * [`<input>`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n * --bubbles\n * @fires input {InputEvent} The native `input` event on\n * [`<input>`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event)\n * --bubbles --composed\n */\nexport abstract class TextField extends textFieldBaseClass {\n static {\n requestUpdateOnAriaChange(TextField);\n }\n\n /** @nocollapse */\n static override shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n /**\n * Gets or sets whether or not the text field is in a visually invalid state.\n *\n * This error state overrides the error state controlled by\n * `reportValidity()`.\n */\n @property({type: Boolean, reflect: true}) error = false;\n\n /**\n * The error message that replaces supporting text when `error` is true. If\n * `errorText` is an empty string, then the supporting text will continue to\n * show.\n *\n * This error message overrides the error message displayed by\n * `reportValidity()`.\n */\n @property({attribute: 'error-text'}) errorText = '';\n\n /**\n * The floating Material label of the textfield component. It informs the user\n * about what information is requested for a text field. It is aligned with\n * the input text, is always visible, and it floats when focused or when text\n * is entered into the textfield. This label also sets accessibilty labels,\n * but the accessible label is overriden by `aria-label`.\n *\n * Learn more about floating labels from the Material Design guidelines:\n * https://m3.material.io/components/text-fields/guidelines\n */\n @property() label = '';\n\n /**\n * Indicates that the user must specify a value for the input before the\n * owning form can be submitted and will render an error state when\n * `reportValidity()` is invoked when value is empty. Additionally the\n * floating label will render an asterisk `\"*\"` when true.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/required\n */\n @property({type: Boolean, reflect: true}) required = false;\n\n /**\n * The current value of the text field. It is always a string.\n */\n @property() value = '';\n\n /**\n * An optional prefix to display before the input value.\n */\n @property({attribute: 'prefix-text'}) prefixText = '';\n\n /**\n * An optional suffix to display after the input value.\n */\n @property({attribute: 'suffix-text'}) suffixText = '';\n\n /**\n * Whether or not the text field has a leading icon. Used for SSR.\n */\n @property({type: Boolean, attribute: 'has-leading-icon'})\n hasLeadingIcon = false;\n\n /**\n * Whether or not the text field has a trailing icon. Used for SSR.\n */\n @property({type: Boolean, attribute: 'has-trailing-icon'})\n hasTrailingIcon = false;\n\n /**\n * Conveys additional information below the text field, such as how it should\n * be used.\n */\n @property({attribute: 'supporting-text'}) supportingText = '';\n\n /**\n * Override the input text CSS `direction`. Useful for RTL languages that use\n * LTR notation for fractions.\n */\n @property({attribute: 'text-direction'}) textDirection = '';\n\n /**\n * The number of rows to display for a `type=\"textarea\"` text field.\n * Defaults to 2.\n */\n @property({type: Number}) rows = 2;\n\n /**\n * The number of cols to display for a `type=\"textarea\"` text field.\n * Defaults to 20.\n */\n @property({type: Number}) cols = 20;\n\n // <input> properties\n @property({reflect: true}) override inputMode = '';\n\n /**\n * Defines the greatest value in the range of permitted values.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#max\n */\n @property() max = '';\n\n /**\n * The maximum number of characters a user can enter into the text field. Set\n * to -1 for none.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#maxlength\n */\n @property({type: Number}) maxLength = -1;\n\n /**\n * Defines the most negative value in the range of permitted values.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#min\n */\n @property() min = '';\n\n /**\n * The minimum number of characters a user can enter into the text field. Set\n * to -1 for none.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#minlength\n */\n @property({type: Number}) minLength = -1;\n\n /**\n * When true, hide the spinner for `type=\"number\"` text fields.\n */\n @property({type: Boolean, attribute: 'no-spinner'}) noSpinner = false;\n\n /**\n * A regular expression that the text field's value must match to pass\n * constraint validation.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#pattern\n */\n @property() pattern = '';\n\n /**\n * Defines the text displayed in the textfield when it has no value. Provides\n * a brief hint to the user as to the expected type of data that should be\n * entered into the control. Unlike `label`, the placeholder is not visible\n * and does not float when the textfield has a value.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/placeholder\n */\n @property({reflect: true, converter: stringConverter}) placeholder = '';\n\n /**\n * Indicates whether or not a user should be able to edit the text field's\n * value.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#readonly\n */\n @property({type: Boolean, reflect: true}) readOnly = false;\n\n /**\n * Indicates that input accepts multiple email addresses.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#multiple\n */\n @property({type: Boolean, reflect: true}) multiple = false;\n\n /**\n * Gets or sets the direction in which selection occurred.\n */\n get selectionDirection() {\n return this.getInputOrTextarea().selectionDirection;\n }\n set selectionDirection(value: 'forward' | 'backward' | 'none' | null) {\n this.getInputOrTextarea().selectionDirection = value;\n }\n\n /**\n * Gets or sets the end position or offset of a text selection.\n */\n get selectionEnd() {\n return this.getInputOrTextarea().selectionEnd;\n }\n set selectionEnd(value: number | null) {\n this.getInputOrTextarea().selectionEnd = value;\n }\n\n /**\n * Gets or sets the starting position or offset of a text selection.\n */\n get selectionStart() {\n return this.getInputOrTextarea().selectionStart;\n }\n set selectionStart(value: number | null) {\n this.getInputOrTextarea().selectionStart = value;\n }\n\n /**\n * Returns or sets the element's step attribute, which works with min and max\n * to limit the increments at which a numeric or date-time value can be set.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#step\n */\n @property() step = '';\n\n /**\n * The `<input>` type to use, defaults to \"text\". The type greatly changes how\n * the text field behaves.\n *\n * Text fields support a limited number of `<input>` types:\n *\n * - text\n * - textarea\n * - email\n * - number\n * - password\n * - search\n * - tel\n * - url\n *\n * See\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#input_types\n * for more details on each input type.\n */\n @property({reflect: true})\n type: TextFieldType | UnsupportedTextFieldType = 'text';\n\n /**\n * Describes what, if any, type of autocomplete functionality the input\n * should provide.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete\n */\n @property({reflect: true}) autocomplete = '';\n\n /**\n * The text field's value as a number.\n */\n get valueAsNumber() {\n const input = this.getInput();\n if (!input) {\n return NaN;\n }\n\n return input.valueAsNumber;\n }\n set valueAsNumber(value: number) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.valueAsNumber = value;\n this.value = input.value;\n }\n\n /**\n * The text field's value as a Date.\n */\n get valueAsDate() {\n const input = this.getInput();\n if (!input) {\n return null;\n }\n\n return input.valueAsDate;\n }\n set valueAsDate(value: Date | null) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.valueAsDate = value;\n this.value = input.value;\n }\n\n protected abstract readonly fieldTag: StaticValue;\n\n /**\n * Returns true when the text field has been interacted with. Native\n * validation errors only display in response to user interactions.\n */\n @state() private dirty = false;\n @state() private focused = false;\n /**\n * Whether or not a native error has been reported via `reportValidity()`.\n */\n @state() private nativeError = false;\n /**\n * The validation message displayed from a native error via\n * `reportValidity()`.\n */\n @state() private nativeErrorText = '';\n\n private get hasError() {\n return this.error || this.nativeError;\n }\n\n @query('.input')\n private readonly inputOrTextarea!:\n | HTMLInputElement\n | HTMLTextAreaElement\n | null;\n @query('.field') private readonly field!: Field | null;\n @queryAssignedElements({slot: 'leading-icon'})\n private readonly leadingIcons!: Element[];\n @queryAssignedElements({slot: 'trailing-icon'})\n private readonly trailingIcons!: Element[];\n\n /**\n * Selects all the text in the text field.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select\n */\n select() {\n this.getInputOrTextarea().select();\n }\n\n /**\n * Replaces a range of text with a new string.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setRangeText\n */\n setRangeText(replacement: string): void;\n setRangeText(\n replacement: string,\n start: number,\n end: number,\n selectionMode?: SelectionMode,\n ): void;\n setRangeText(...args: unknown[]) {\n // Calling setRangeText with 1 vs 3-4 arguments has different behavior.\n // Use spread syntax and type casting to ensure correct usage.\n this.getInputOrTextarea().setRangeText(\n ...(args as Parameters<HTMLInputElement['setRangeText']>),\n );\n this.value = this.getInputOrTextarea().value;\n }\n\n /**\n * Sets the start and end positions of a selection in the text field.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n *\n * @param start The offset into the text field for the start of the selection.\n * @param end The offset into the text field for the end of the selection.\n * @param direction The direction in which the selection is performed.\n */\n setSelectionRange(\n start: number | null,\n end: number | null,\n direction?: 'forward' | 'backward' | 'none',\n ) {\n this.getInputOrTextarea().setSelectionRange(start, end, direction);\n }\n\n /**\n * Decrements the value of a numeric type text field by `step` or `n` `step`\n * number of times.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/stepDown\n *\n * @param stepDecrement The number of steps to decrement, defaults to 1.\n */\n stepDown(stepDecrement?: number) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.stepDown(stepDecrement);\n this.value = input.value;\n }\n\n /**\n * Increments the value of a numeric type text field by `step` or `n` `step`\n * number of times.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/stepUp\n *\n * @param stepIncrement The number of steps to increment, defaults to 1.\n */\n stepUp(stepIncrement?: number) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.stepUp(stepIncrement);\n this.value = input.value;\n }\n\n /**\n * Reset the text field to its default value.\n */\n reset() {\n this.dirty = false;\n this.value = this.getAttribute('value') ?? '';\n this.nativeError = false;\n this.nativeErrorText = '';\n }\n\n override attributeChangedCallback(\n attribute: string,\n newValue: string | null,\n oldValue: string | null,\n ) {\n if (attribute === 'value' && this.dirty) {\n // After user input, changing the value attribute no longer updates the\n // text field's value (until reset). This matches native <input> behavior.\n return;\n }\n\n super.attributeChangedCallback(attribute, newValue, oldValue);\n }\n\n protected override render() {\n const classes = {\n 'disabled': this.disabled,\n 'error': !this.disabled && this.hasError,\n 'textarea': this.type === 'textarea',\n 'no-spinner': this.noSpinner,\n };\n\n return html`\n <span class=\"text-field ${classMap(classes)}\">\n ${this.renderField()}\n </span>\n `;\n }\n\n protected override updated(changedProperties: PropertyValues) {\n // Keep changedProperties arg so that subclasses may call it\n\n // If a property such as `type` changes and causes the internal <input>\n // value to change without dispatching an event, re-sync it.\n const value = this.getInputOrTextarea().value;\n if (this.value !== value) {\n // Note this is typically inefficient in updated() since it schedules\n // another update. However, it is needed for the <input> to fully render\n // before checking its value.\n this.value = value;\n }\n }\n\n private renderField() {\n return staticHtml`<${this.fieldTag}\n class=\"field\"\n count=${this.value.length}\n ?disabled=${this.disabled}\n ?error=${this.hasError}\n error-text=${this.getErrorText()}\n ?focused=${this.focused}\n ?has-end=${this.hasTrailingIcon}\n ?has-start=${this.hasLeadingIcon}\n label=${this.label}\n max=${this.maxLength}\n ?populated=${!!this.value}\n ?required=${this.required}\n ?resizable=${this.type === 'textarea'}\n supporting-text=${this.supportingText}\n >\n ${this.renderLeadingIcon()}\n ${this.renderInputOrTextarea()}\n ${this.renderTrailingIcon()}\n <div id=\"description\" slot=\"aria-describedby\"></div>\n </${this.fieldTag}>`;\n }\n\n private renderLeadingIcon() {\n return html`\n <span class=\"icon leading\" slot=\"start\">\n <slot name=\"leading-icon\" @slotchange=${this.handleIconChange}></slot>\n </span>\n `;\n }\n\n private renderTrailingIcon() {\n return html`\n <span class=\"icon trailing\" slot=\"end\">\n <slot name=\"trailing-icon\" @slotchange=${this.handleIconChange}></slot>\n </span>\n `;\n }\n\n private renderInputOrTextarea() {\n const style: StyleInfo = {'direction': this.textDirection};\n const ariaLabel =\n (this as ARIAMixinStrict).ariaLabel || this.label || nothing;\n // lit-anaylzer `autocomplete` types are too strict\n // tslint:disable-next-line:no-any\n const autocomplete = this.autocomplete as any;\n\n // These properties may be set to null if the attribute is removed, and\n // `null > -1` is incorrectly `true`.\n const hasMaxLength = (this.maxLength ?? -1) > -1;\n const hasMinLength = (this.minLength ?? -1) > -1;\n if (this.type === 'textarea') {\n return html`\n <textarea\n class=\"input\"\n style=${styleMap(style)}\n aria-describedby=\"description\"\n aria-invalid=${this.hasError}\n aria-label=${ariaLabel}\n autocomplete=${autocomplete || nothing}\n ?disabled=${this.disabled}\n maxlength=${hasMaxLength ? this.maxLength : nothing}\n minlength=${hasMinLength ? this.minLength : nothing}\n placeholder=${this.placeholder || nothing}\n ?readonly=${this.readOnly}\n ?required=${this.required}\n rows=${this.rows}\n cols=${this.cols}\n .value=${live(this.value)}\n @change=${this.redispatchEvent}\n @focusin=${this.handleFocusin}\n @focusout=${this.handleFocusout}\n @input=${this.handleInput}\n @select=${this.redispatchEvent}></textarea>\n `;\n }\n\n const prefix = this.renderPrefix();\n const suffix = this.renderSuffix();\n\n // TODO(b/243805848): remove `as unknown as number` and `as any` once lit\n // analyzer is fixed\n // tslint:disable-next-line:no-any\n const inputMode = this.inputMode as any;\n return html`\n <div class=\"input-wrapper\">\n ${prefix}\n <input\n class=\"input\"\n style=${styleMap(style)}\n aria-describedby=\"description\"\n aria-invalid=${this.hasError}\n aria-label=${ariaLabel}\n autocomplete=${autocomplete || nothing}\n ?disabled=${this.disabled}\n inputmode=${inputMode || nothing}\n max=${(this.max || nothing) as unknown as number}\n maxlength=${hasMaxLength ? this.maxLength : nothing}\n min=${(this.min || nothing) as unknown as number}\n minlength=${hasMinLength ? this.minLength : nothing}\n pattern=${this.pattern || nothing}\n placeholder=${this.placeholder || nothing}\n ?readonly=${this.readOnly}\n ?required=${this.required}\n ?multiple=${this.multiple}\n step=${(this.step || nothing) as unknown as number}\n type=${this.type}\n .value=${live(this.value)}\n @change=${this.redispatchEvent}\n @focusin=${this.handleFocusin}\n @focusout=${this.handleFocusout}\n @input=${this.handleInput}\n @select=${this.redispatchEvent} />\n ${suffix}\n </div>\n `;\n }\n\n private renderPrefix() {\n return this.renderAffix(this.prefixText, /* isSuffix */ false);\n }\n\n private renderSuffix() {\n return this.renderAffix(this.suffixText, /* isSuffix */ true);\n }\n\n private renderAffix(text: string, isSuffix: boolean) {\n if (!text) {\n return nothing;\n }\n\n const classes = {\n 'suffix': isSuffix,\n 'prefix': !isSuffix,\n };\n\n return html`<span class=\"${classMap(classes)}\">${text}</span>`;\n }\n\n private getErrorText() {\n return this.error ? this.errorText : this.nativeErrorText;\n }\n\n private handleFocusin() {\n this.focused = true;\n }\n\n private handleFocusout() {\n this.focused = false;\n }\n\n private handleInput(event: InputEvent) {\n this.dirty = true;\n this.value = (event.target as HTMLInputElement).value;\n }\n\n private redispatchEvent(event: Event) {\n redispatchEvent(this, event);\n }\n\n private getInputOrTextarea() {\n if (!this.inputOrTextarea) {\n // If the input is not yet defined, synchronously render.\n // e.g.\n // const textField = document.createElement('md-outlined-text-field');\n // document.body.appendChild(textField);\n // textField.focus(); // synchronously render\n this.connectedCallback();\n this.scheduleUpdate();\n }\n\n if (this.isUpdatePending) {\n // If there are pending updates, synchronously perform them. This ensures\n // that constraint validation properties (like `required`) are synced\n // before interacting with input APIs that depend on them.\n this.scheduleUpdate();\n }\n\n return this.inputOrTextarea!;\n }\n\n private getInput() {\n if (this.type === 'textarea') {\n return null;\n }\n\n return this.getInputOrTextarea() as HTMLInputElement;\n }\n\n private handleIconChange() {\n this.hasLeadingIcon = this.leadingIcons.length > 0;\n this.hasTrailingIcon = this.trailingIcons.length > 0;\n }\n\n // Writable mixin properties for lit-html binding, needed for lit-analyzer\n declare disabled: boolean;\n declare name: string;\n\n override [getFormValue]() {\n return this.value;\n }\n\n override formResetCallback() {\n this.reset();\n }\n\n override formStateRestoreCallback(state: string) {\n this.value = state;\n }\n\n override focus() {\n // Required for the case that the user slots a focusable element into the\n // leading icon slot such as an iconbutton due to how delegatesFocus works.\n this.getInputOrTextarea().focus();\n }\n\n [createValidator](): Validator<unknown> {\n return new TextFieldValidator(() => ({\n state: this,\n renderedControl: this.inputOrTextarea,\n }));\n }\n\n [getValidityAnchor](): HTMLElement | null {\n return this.inputOrTextarea;\n }\n\n [onReportValidity](invalidEvent: Event | null) {\n if (invalidEvent?.defaultPrevented) {\n return;\n }\n\n if (invalidEvent) {\n // Prevent default pop-up behavior. This also prevents focusing, so we\n // manually focus.\n invalidEvent.preventDefault();\n this.focus();\n }\n\n const prevMessage = this.getErrorText();\n this.nativeError = !!invalidEvent;\n this.nativeErrorText = this.validationMessage;\n\n if (prevMessage === this.getErrorText()) {\n this.field?.reannounceError();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"text-field.js","sourceRoot":"","sources":["text-field.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {LitElement, PropertyValues, html, nothing} from 'lit';\nimport {property, query, queryAssignedElements, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport {live} from 'lit/directives/live.js';\nimport {StyleInfo, styleMap} from 'lit/directives/style-map.js';\nimport {StaticValue, html as staticHtml} from 'lit/static-html.js';\n\nimport {Field} from '../../field/internal/field.js';\nimport {ARIAMixinStrict} from '../../internal/aria/aria.js';\nimport {requestUpdateOnAriaChange} from '../../internal/aria/delegate.js';\nimport {stringConverter} from '../../internal/controller/string-converter.js';\nimport {redispatchEvent} from '../../internal/events/redispatch-event.js';\nimport {\n createValidator,\n getValidityAnchor,\n mixinConstraintValidation,\n} from '../../labs/behaviors/constraint-validation.js';\nimport {mixinElementInternals} from '../../labs/behaviors/element-internals.js';\nimport {\n getFormValue,\n mixinFormAssociated,\n} from '../../labs/behaviors/form-associated.js';\nimport {\n mixinOnReportValidity,\n onReportValidity,\n} from '../../labs/behaviors/on-report-validity.js';\nimport {TextFieldValidator} from '../../labs/behaviors/validators/text-field-validator.js';\nimport {Validator} from '../../labs/behaviors/validators/validator.js';\n\n/**\n * Input types that are compatible with the text field.\n */\nexport type TextFieldType =\n | 'email'\n | 'number'\n | 'password'\n | 'search'\n | 'tel'\n | 'text'\n | 'url'\n | 'textarea';\n\n/**\n * Input types that are not fully supported for the text field.\n */\nexport type UnsupportedTextFieldType =\n | 'color'\n | 'date'\n | 'datetime-local'\n | 'file'\n | 'month'\n | 'time'\n | 'week';\n\n/**\n * Input types that are incompatible with the text field.\n */\nexport type InvalidTextFieldType =\n | 'button'\n | 'checkbox'\n | 'hidden'\n | 'image'\n | 'radio'\n | 'range'\n | 'reset'\n | 'submit';\n\n// Separate variable needed for closure.\nconst textFieldBaseClass = mixinOnReportValidity(\n mixinConstraintValidation(\n mixinFormAssociated(mixinElementInternals(LitElement)),\n ),\n);\n\n/**\n * A text field component.\n *\n * @fires select {Event} The native `select` event on\n * [`<input>`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select_event)\n * --bubbles\n * @fires change {Event} The native `change` event on\n * [`<input>`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n * --bubbles\n * @fires input {InputEvent} The native `input` event on\n * [`<input>`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event)\n * --bubbles --composed\n */\nexport abstract class TextField extends textFieldBaseClass {\n static {\n requestUpdateOnAriaChange(TextField);\n }\n\n /** @nocollapse */\n static override shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n /**\n * Gets or sets whether or not the text field is in a visually invalid state.\n *\n * This error state overrides the error state controlled by\n * `reportValidity()`.\n */\n @property({type: Boolean, reflect: true}) error = false;\n\n /**\n * The error message that replaces supporting text when `error` is true. If\n * `errorText` is an empty string, then the supporting text will continue to\n * show.\n *\n * This error message overrides the error message displayed by\n * `reportValidity()`.\n */\n @property({attribute: 'error-text'}) errorText = '';\n\n /**\n * The floating Material label of the textfield component. It informs the user\n * about what information is requested for a text field. It is aligned with\n * the input text, is always visible, and it floats when focused or when text\n * is entered into the textfield. This label also sets accessibilty labels,\n * but the accessible label is overriden by `aria-label`.\n *\n * Learn more about floating labels from the Material Design guidelines:\n * https://m3.material.io/components/text-fields/guidelines\n */\n @property() label = '';\n\n /**\n * Indicates that the user must specify a value for the input before the\n * owning form can be submitted and will render an error state when\n * `reportValidity()` is invoked when value is empty. Additionally the\n * floating label will render an asterisk `\"*\"` when true.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/required\n */\n @property({type: Boolean, reflect: true}) required = false;\n\n /**\n * The current value of the text field. It is always a string.\n */\n @property() value = '';\n\n /**\n * An optional prefix to display before the input value.\n */\n @property({attribute: 'prefix-text'}) prefixText = '';\n\n /**\n * An optional suffix to display after the input value.\n */\n @property({attribute: 'suffix-text'}) suffixText = '';\n\n /**\n * Whether or not the text field has a leading icon. Used for SSR.\n */\n @property({type: Boolean, attribute: 'has-leading-icon'})\n hasLeadingIcon = false;\n\n /**\n * Whether or not the text field has a trailing icon. Used for SSR.\n */\n @property({type: Boolean, attribute: 'has-trailing-icon'})\n hasTrailingIcon = false;\n\n /**\n * Conveys additional information below the text field, such as how it should\n * be used.\n */\n @property({attribute: 'supporting-text'}) supportingText = '';\n\n /**\n * Override the input text CSS `direction`. Useful for RTL languages that use\n * LTR notation for fractions.\n */\n @property({attribute: 'text-direction'}) textDirection = '';\n\n /**\n * The number of rows to display for a `type=\"textarea\"` text field.\n * Defaults to 2.\n */\n @property({type: Number}) rows = 2;\n\n /**\n * The number of cols to display for a `type=\"textarea\"` text field.\n * Defaults to 20.\n */\n @property({type: Number}) cols = 20;\n\n // <input> properties\n @property({reflect: true}) override inputMode = '';\n\n /**\n * Defines the greatest value in the range of permitted values.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#max\n */\n @property() max = '';\n\n /**\n * The maximum number of characters a user can enter into the text field. Set\n * to -1 for none.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#maxlength\n */\n @property({type: Number}) maxLength = -1;\n\n /**\n * Defines the most negative value in the range of permitted values.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#min\n */\n @property() min = '';\n\n /**\n * The minimum number of characters a user can enter into the text field. Set\n * to -1 for none.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#minlength\n */\n @property({type: Number}) minLength = -1;\n\n /**\n * When true, hide the spinner for `type=\"number\"` text fields.\n */\n @property({type: Boolean, attribute: 'no-spinner'}) noSpinner = false;\n\n /**\n * A regular expression that the text field's value must match to pass\n * constraint validation.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#pattern\n */\n @property() pattern = '';\n\n /**\n * Defines the text displayed in the textfield when it has no value. Provides\n * a brief hint to the user as to the expected type of data that should be\n * entered into the control. Unlike `label`, the placeholder is not visible\n * and does not float when the textfield has a value.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/placeholder\n */\n @property({reflect: true, converter: stringConverter}) placeholder = '';\n\n /**\n * Indicates whether or not a user should be able to edit the text field's\n * value.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#readonly\n */\n @property({type: Boolean, reflect: true}) readOnly = false;\n\n /**\n * Indicates that input accepts multiple email addresses.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#multiple\n */\n @property({type: Boolean, reflect: true}) multiple = false;\n\n /**\n * Gets or sets the direction in which selection occurred.\n */\n get selectionDirection() {\n return this.getInputOrTextarea().selectionDirection;\n }\n set selectionDirection(value: 'forward' | 'backward' | 'none' | null) {\n this.getInputOrTextarea().selectionDirection = value;\n }\n\n /**\n * Gets or sets the end position or offset of a text selection.\n */\n get selectionEnd() {\n return this.getInputOrTextarea().selectionEnd;\n }\n set selectionEnd(value: number | null) {\n this.getInputOrTextarea().selectionEnd = value;\n }\n\n /**\n * Gets or sets the starting position or offset of a text selection.\n */\n get selectionStart() {\n return this.getInputOrTextarea().selectionStart;\n }\n set selectionStart(value: number | null) {\n this.getInputOrTextarea().selectionStart = value;\n }\n\n /**\n * Returns or sets the element's step attribute, which works with min and max\n * to limit the increments at which a numeric or date-time value can be set.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#step\n */\n @property() step = '';\n\n /**\n * The `<input>` type to use, defaults to \"text\". The type greatly changes how\n * the text field behaves.\n *\n * Text fields support a limited number of `<input>` types:\n *\n * - text\n * - textarea\n * - email\n * - number\n * - password\n * - search\n * - tel\n * - url\n *\n * See\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#input_types\n * for more details on each input type.\n */\n @property({reflect: true})\n type: TextFieldType | UnsupportedTextFieldType = 'text';\n\n /**\n * Describes what, if any, type of autocomplete functionality the input\n * should provide.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete\n */\n @property({reflect: true}) autocomplete = '';\n\n /**\n * The text field's value as a number.\n */\n get valueAsNumber() {\n const input = this.getInput();\n if (!input) {\n return NaN;\n }\n\n return input.valueAsNumber;\n }\n set valueAsNumber(value: number) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.valueAsNumber = value;\n this.value = input.value;\n }\n\n /**\n * The text field's value as a Date.\n */\n get valueAsDate() {\n const input = this.getInput();\n if (!input) {\n return null;\n }\n\n return input.valueAsDate;\n }\n set valueAsDate(value: Date | null) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.valueAsDate = value;\n this.value = input.value;\n }\n\n protected abstract readonly fieldTag: StaticValue;\n\n /**\n * Returns true when the text field has been interacted with. Native\n * validation errors only display in response to user interactions.\n */\n @state() private dirty = false;\n @state() private focused = false;\n /**\n * Whether or not a native error has been reported via `reportValidity()`.\n */\n @state() private nativeError = false;\n /**\n * The validation message displayed from a native error via\n * `reportValidity()`.\n */\n @state() private nativeErrorText = '';\n\n private get hasError() {\n return this.error || this.nativeError;\n }\n\n @query('.input')\n private readonly inputOrTextarea!:\n | HTMLInputElement\n | HTMLTextAreaElement\n | null;\n @query('.field') private readonly field!: Field | null;\n @queryAssignedElements({slot: 'leading-icon'})\n private readonly leadingIcons!: Element[];\n @queryAssignedElements({slot: 'trailing-icon'})\n private readonly trailingIcons!: Element[];\n\n /**\n * Selects all the text in the text field.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select\n */\n select() {\n this.getInputOrTextarea().select();\n }\n\n /**\n * Replaces a range of text with a new string.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setRangeText\n */\n setRangeText(replacement: string): void;\n setRangeText(\n replacement: string,\n start: number,\n end: number,\n selectionMode?: SelectionMode,\n ): void;\n setRangeText(...args: unknown[]) {\n // Calling setRangeText with 1 vs 3-4 arguments has different behavior.\n // Use spread syntax and type casting to ensure correct usage.\n this.getInputOrTextarea().setRangeText(\n ...(args as Parameters<HTMLInputElement['setRangeText']>),\n );\n this.value = this.getInputOrTextarea().value;\n }\n\n /**\n * Sets the start and end positions of a selection in the text field.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n *\n * @param start The offset into the text field for the start of the selection.\n * @param end The offset into the text field for the end of the selection.\n * @param direction The direction in which the selection is performed.\n */\n setSelectionRange(\n start: number | null,\n end: number | null,\n direction?: 'forward' | 'backward' | 'none',\n ) {\n this.getInputOrTextarea().setSelectionRange(start, end, direction);\n }\n\n /**\n * Decrements the value of a numeric type text field by `step` or `n` `step`\n * number of times.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/stepDown\n *\n * @param stepDecrement The number of steps to decrement, defaults to 1.\n */\n stepDown(stepDecrement?: number) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.stepDown(stepDecrement);\n this.value = input.value;\n }\n\n /**\n * Increments the value of a numeric type text field by `step` or `n` `step`\n * number of times.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/stepUp\n *\n * @param stepIncrement The number of steps to increment, defaults to 1.\n */\n stepUp(stepIncrement?: number) {\n const input = this.getInput();\n if (!input) {\n return;\n }\n\n input.stepUp(stepIncrement);\n this.value = input.value;\n }\n\n /**\n * Reset the text field to its default value.\n */\n reset() {\n this.dirty = false;\n this.value = this.getAttribute('value') ?? '';\n this.nativeError = false;\n this.nativeErrorText = '';\n }\n\n override attributeChangedCallback(\n attribute: string,\n newValue: string | null,\n oldValue: string | null,\n ) {\n if (attribute === 'value' && this.dirty) {\n // After user input, changing the value attribute no longer updates the\n // text field's value (until reset). This matches native <input> behavior.\n return;\n }\n\n super.attributeChangedCallback(attribute, newValue, oldValue);\n }\n\n protected override render() {\n const classes = {\n 'disabled': this.disabled,\n 'error': !this.disabled && this.hasError,\n 'textarea': this.type === 'textarea',\n 'no-spinner': this.noSpinner,\n };\n\n return html`\n <span class=\"text-field ${classMap(classes)}\">\n ${this.renderField()}\n </span>\n `;\n }\n\n protected override updated(changedProperties: PropertyValues) {\n // Keep changedProperties arg so that subclasses may call it\n\n // If a property such as `type` changes and causes the internal <input>\n // value to change without dispatching an event, re-sync it.\n const value = this.getInputOrTextarea().value;\n if (this.value !== value) {\n // Note this is typically inefficient in updated() since it schedules\n // another update. However, it is needed for the <input> to fully render\n // before checking its value.\n this.value = value;\n }\n }\n\n private renderField() {\n return staticHtml`<${this.fieldTag}\n class=\"field\"\n count=${this.value.length}\n ?disabled=${this.disabled}\n ?error=${this.hasError}\n error-text=${this.getErrorText()}\n ?focused=${this.focused}\n ?has-end=${this.hasTrailingIcon}\n ?has-start=${this.hasLeadingIcon}\n label=${this.label}\n max=${this.maxLength}\n ?populated=${!!this.value}\n ?required=${this.required}\n ?resizable=${this.type === 'textarea'}\n supporting-text=${this.supportingText}\n >\n ${this.renderLeadingIcon()}\n ${this.renderInputOrTextarea()}\n ${this.renderTrailingIcon()}\n <div id=\"description\" slot=\"aria-describedby\"></div>\n </${this.fieldTag}>`;\n }\n\n private renderLeadingIcon() {\n return html`\n <span class=\"icon leading\" slot=\"start\">\n <slot name=\"leading-icon\" @slotchange=${this.handleIconChange}></slot>\n </span>\n `;\n }\n\n private renderTrailingIcon() {\n return html`\n <span class=\"icon trailing\" slot=\"end\">\n <slot name=\"trailing-icon\" @slotchange=${this.handleIconChange}></slot>\n </span>\n `;\n }\n\n private renderInputOrTextarea() {\n const style: StyleInfo = {'direction': this.textDirection};\n const ariaLabel =\n (this as ARIAMixinStrict).ariaLabel || this.label || nothing;\n // lit-anaylzer `autocomplete` types are too strict\n // tslint:disable-next-line:no-any\n const autocomplete = this.autocomplete as any;\n\n // These properties may be set to null if the attribute is removed, and\n // `null > -1` is incorrectly `true`.\n const hasMaxLength = (this.maxLength ?? -1) > -1;\n const hasMinLength = (this.minLength ?? -1) > -1;\n if (this.type === 'textarea') {\n return html`\n <textarea\n class=\"input\"\n style=${styleMap(style)}\n aria-describedby=\"description\"\n aria-invalid=${this.hasError}\n aria-label=${ariaLabel}\n autocomplete=${autocomplete || nothing}\n ?disabled=${this.disabled}\n maxlength=${hasMaxLength ? this.maxLength : nothing}\n minlength=${hasMinLength ? this.minLength : nothing}\n placeholder=${this.placeholder || nothing}\n ?readonly=${this.readOnly}\n ?required=${this.required}\n rows=${this.rows}\n cols=${this.cols}\n .value=${live(this.value)}\n @change=${this.redispatchEvent}\n @focus=${this.handleFocusChange}\n @blur=${this.handleFocusChange}\n @input=${this.handleInput}\n @select=${this.redispatchEvent}></textarea>\n `;\n }\n\n const prefix = this.renderPrefix();\n const suffix = this.renderSuffix();\n\n // TODO(b/243805848): remove `as unknown as number` and `as any` once lit\n // analyzer is fixed\n // tslint:disable-next-line:no-any\n const inputMode = this.inputMode as any;\n return html`\n <div class=\"input-wrapper\">\n ${prefix}\n <input\n class=\"input\"\n style=${styleMap(style)}\n aria-describedby=\"description\"\n aria-invalid=${this.hasError}\n aria-label=${ariaLabel}\n autocomplete=${autocomplete || nothing}\n ?disabled=${this.disabled}\n inputmode=${inputMode || nothing}\n max=${(this.max || nothing) as unknown as number}\n maxlength=${hasMaxLength ? this.maxLength : nothing}\n min=${(this.min || nothing) as unknown as number}\n minlength=${hasMinLength ? this.minLength : nothing}\n pattern=${this.pattern || nothing}\n placeholder=${this.placeholder || nothing}\n ?readonly=${this.readOnly}\n ?required=${this.required}\n ?multiple=${this.multiple}\n step=${(this.step || nothing) as unknown as number}\n type=${this.type}\n .value=${live(this.value)}\n @change=${this.redispatchEvent}\n @focus=${this.handleFocusChange}\n @blur=${this.handleFocusChange}\n @input=${this.handleInput}\n @select=${this.redispatchEvent} />\n ${suffix}\n </div>\n `;\n }\n\n private renderPrefix() {\n return this.renderAffix(this.prefixText, /* isSuffix */ false);\n }\n\n private renderSuffix() {\n return this.renderAffix(this.suffixText, /* isSuffix */ true);\n }\n\n private renderAffix(text: string, isSuffix: boolean) {\n if (!text) {\n return nothing;\n }\n\n const classes = {\n 'suffix': isSuffix,\n 'prefix': !isSuffix,\n };\n\n return html`<span class=\"${classMap(classes)}\">${text}</span>`;\n }\n\n private getErrorText() {\n return this.error ? this.errorText : this.nativeErrorText;\n }\n\n private handleFocusChange() {\n // When calling focus() or reportValidity() during change, it's possible\n // for blur to be called after the new focus event. Rather than set\n // `this.focused` to true/false on focus/blur, we always set it to whether\n // or not the input itself is focused.\n this.focused = this.inputOrTextarea?.matches(':focus') ?? false;\n }\n\n private handleInput(event: InputEvent) {\n this.dirty = true;\n this.value = (event.target as HTMLInputElement).value;\n }\n\n private redispatchEvent(event: Event) {\n redispatchEvent(this, event);\n }\n\n private getInputOrTextarea() {\n if (!this.inputOrTextarea) {\n // If the input is not yet defined, synchronously render.\n // e.g.\n // const textField = document.createElement('md-outlined-text-field');\n // document.body.appendChild(textField);\n // textField.focus(); // synchronously render\n this.connectedCallback();\n this.scheduleUpdate();\n }\n\n if (this.isUpdatePending) {\n // If there are pending updates, synchronously perform them. This ensures\n // that constraint validation properties (like `required`) are synced\n // before interacting with input APIs that depend on them.\n this.scheduleUpdate();\n }\n\n return this.inputOrTextarea!;\n }\n\n private getInput() {\n if (this.type === 'textarea') {\n return null;\n }\n\n return this.getInputOrTextarea() as HTMLInputElement;\n }\n\n private handleIconChange() {\n this.hasLeadingIcon = this.leadingIcons.length > 0;\n this.hasTrailingIcon = this.trailingIcons.length > 0;\n }\n\n // Writable mixin properties for lit-html binding, needed for lit-analyzer\n declare disabled: boolean;\n declare name: string;\n\n override [getFormValue]() {\n return this.value;\n }\n\n override formResetCallback() {\n this.reset();\n }\n\n override formStateRestoreCallback(state: string) {\n this.value = state;\n }\n\n override focus() {\n // Required for the case that the user slots a focusable element into the\n // leading icon slot such as an iconbutton due to how delegatesFocus works.\n this.getInputOrTextarea().focus();\n }\n\n [createValidator](): Validator<unknown> {\n return new TextFieldValidator(() => ({\n state: this,\n renderedControl: this.inputOrTextarea,\n }));\n }\n\n [getValidityAnchor](): HTMLElement | null {\n return this.inputOrTextarea;\n }\n\n [onReportValidity](invalidEvent: Event | null) {\n // Prevent default pop-up behavior.\n invalidEvent?.preventDefault();\n\n const prevMessage = this.getErrorText();\n this.nativeError = !!invalidEvent;\n this.nativeErrorText = this.validationMessage;\n\n if (prevMessage === this.getErrorText()) {\n this.field?.reannounceError();\n }\n }\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import '../field/outlined-field.js';
|
|
7
7
|
import { OutlinedTextField } from './internal/outlined-text-field.js';
|
|
8
|
-
export { TextFieldType } from './internal/text-field.js';
|
|
8
|
+
export { type TextFieldType } from './internal/text-field.js';
|
|
9
9
|
declare global {
|
|
10
10
|
interface HTMLElementTagNameMap {
|
|
11
11
|
'md-outlined-text-field': MdOutlinedTextField;
|