@material/web 1.1.2-nightly.c97362c.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 +8 -0
- package/button/internal/button.js +9 -1
- package/button/internal/button.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/iconbutton/internal/icon-button.d.ts +8 -0
- package/iconbutton/internal/icon-button.js +9 -1
- package/iconbutton/internal/icon-button.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/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/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/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/tokens/_index.scss +0 -1
- package/tokens/_md-comp-list-item.scss +2 -2
- package/tokens/_md-comp-menu-item.scss +63 -7
- 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"]}
|
package/tokens/_index.scss
CHANGED
|
@@ -36,7 +36,6 @@
|
|
|
36
36
|
@forward './md-comp-list-item' as md-comp-list-item-*;
|
|
37
37
|
@forward './md-comp-menu' as md-comp-menu-*;
|
|
38
38
|
@forward './md-comp-menu-item' as md-comp-menu-item-*;
|
|
39
|
-
@forward './md-comp-menu-list-item' as md-comp-menu-list-item-*;
|
|
40
39
|
@forward './md-comp-navigation-bar' as md-comp-navigation-bar-*;
|
|
41
40
|
@forward './md-comp-navigation-drawer' as md-comp-navigation-drawer-*;
|
|
42
41
|
@forward './md-comp-outlined-button' as md-comp-outlined-button-*;
|
|
@@ -20,8 +20,6 @@ $supported-tokens: (
|
|
|
20
20
|
// go/keep-sorted start
|
|
21
21
|
'bottom-space',
|
|
22
22
|
'disabled-opacity',
|
|
23
|
-
'focus-state-layer-color',
|
|
24
|
-
'focus-state-layer-opacity',
|
|
25
23
|
'hover-state-layer-color',
|
|
26
24
|
'hover-state-layer-opacity',
|
|
27
25
|
'label-text-color',
|
|
@@ -74,6 +72,8 @@ $unsupported-tokens: (
|
|
|
74
72
|
'dragged-trailing-icon-icon-color',
|
|
75
73
|
'focus-label-text-color',
|
|
76
74
|
'focus-leading-icon-icon-color',
|
|
75
|
+
'focus-state-layer-color',
|
|
76
|
+
'focus-state-layer-opacity',
|
|
77
77
|
'focus-trailing-icon-icon-color',
|
|
78
78
|
'hover-label-text-color',
|
|
79
79
|
'hover-leading-icon-icon-color',
|
|
@@ -10,17 +10,48 @@
|
|
|
10
10
|
// go/keep-sorted end
|
|
11
11
|
// go/keep-sorted start
|
|
12
12
|
@use './internal/validate';
|
|
13
|
+
@use './md-comp-list-item';
|
|
13
14
|
@use './md-sys-color';
|
|
14
15
|
@use './md-sys-elevation';
|
|
15
16
|
@use './md-sys-shape';
|
|
17
|
+
@use './md-sys-state';
|
|
18
|
+
@use './md-sys-typescale';
|
|
16
19
|
@use './v0_192/md-comp-menu';
|
|
17
20
|
// go/keep-sorted end
|
|
18
21
|
|
|
19
22
|
$supported-tokens: (
|
|
20
23
|
// go/keep-sorted start
|
|
24
|
+
'bottom-space',
|
|
21
25
|
'container-color',
|
|
26
|
+
'disabled-opacity',
|
|
27
|
+
'hover-state-layer-color',
|
|
28
|
+
'hover-state-layer-opacity',
|
|
29
|
+
'label-text-color',
|
|
30
|
+
'label-text-font',
|
|
31
|
+
'label-text-line-height',
|
|
32
|
+
'label-text-size',
|
|
33
|
+
'label-text-weight',
|
|
34
|
+
'leading-icon-color',
|
|
35
|
+
'leading-space',
|
|
36
|
+
'one-line-container-height',
|
|
37
|
+
'pressed-state-layer-color',
|
|
38
|
+
'pressed-state-layer-opacity',
|
|
22
39
|
'selected-container-color',
|
|
23
40
|
'selected-label-text-color',
|
|
41
|
+
'supporting-text-color',
|
|
42
|
+
'supporting-text-font',
|
|
43
|
+
'supporting-text-line-height',
|
|
44
|
+
'supporting-text-size',
|
|
45
|
+
'supporting-text-weight',
|
|
46
|
+
'top-space',
|
|
47
|
+
'trailing-icon-color',
|
|
48
|
+
'trailing-space',
|
|
49
|
+
'trailing-supporting-text-color',
|
|
50
|
+
'trailing-supporting-text-font',
|
|
51
|
+
'trailing-supporting-text-line-height',
|
|
52
|
+
'trailing-supporting-text-size',
|
|
53
|
+
'trailing-supporting-text-weight',
|
|
54
|
+
'two-line-container-height',
|
|
24
55
|
// go/keep-sorted end
|
|
25
56
|
);
|
|
26
57
|
|
|
@@ -29,8 +60,8 @@ $unsupported-tokens: (
|
|
|
29
60
|
'container-elevation',
|
|
30
61
|
'container-shadow-color',
|
|
31
62
|
'container-shape',
|
|
32
|
-
'
|
|
33
|
-
'
|
|
63
|
+
'selected-with-leading-icon-trailing-icon-color',
|
|
64
|
+
'with-leading-icon-icon-color',
|
|
34
65
|
// go/keep-sorted end
|
|
35
66
|
);
|
|
36
67
|
|
|
@@ -38,18 +69,43 @@ $_default: (
|
|
|
38
69
|
'md-sys-color': md-sys-color.values-light(),
|
|
39
70
|
'md-sys-elevation': md-sys-elevation.values(),
|
|
40
71
|
'md-sys-shape': md-sys-shape.values(),
|
|
72
|
+
'md-sys-state': md-sys-state.values(),
|
|
73
|
+
'md-sys-typescale': md-sys-typescale.values(),
|
|
41
74
|
);
|
|
42
75
|
|
|
43
76
|
@function values($deps: $_default, $exclude-hardcoded-values: false) {
|
|
77
|
+
$tokens: md-comp-menu.values($deps);
|
|
78
|
+
|
|
79
|
+
// Like list items, menu items use their parent menu for their container
|
|
80
|
+
// color. However, menu items can have a selected background color, so we
|
|
81
|
+
// change its default unselected background color to transparent to inherit
|
|
82
|
+
// from its parent menu.
|
|
83
|
+
$tokens: map.set($tokens, 'container-color', transparent);
|
|
84
|
+
|
|
44
85
|
$tokens: validate.values(
|
|
45
|
-
|
|
86
|
+
$tokens,
|
|
46
87
|
$supported-tokens: $supported-tokens,
|
|
47
88
|
$unsupported-tokens: $unsupported-tokens,
|
|
48
|
-
$
|
|
49
|
-
|
|
50
|
-
'list-item-selected-label-text-color': 'selected-label-text-color',
|
|
51
|
-
)
|
|
89
|
+
$new-tokens: md-comp-list-item.values($deps),
|
|
90
|
+
$renamed-tokens: _get-renamed-tokens($tokens)
|
|
52
91
|
);
|
|
53
92
|
|
|
54
93
|
@return $tokens;
|
|
55
94
|
}
|
|
95
|
+
|
|
96
|
+
// remove list-item prefix from tokens
|
|
97
|
+
@function _get-renamed-tokens($tokens) {
|
|
98
|
+
$keys: map.keys($tokens);
|
|
99
|
+
$renamed-tokens: ();
|
|
100
|
+
|
|
101
|
+
@each $key in $keys {
|
|
102
|
+
@each $prefix in ('list-item-', 'menu-list-item-') {
|
|
103
|
+
@if string.index($key, $prefix) == 1 {
|
|
104
|
+
$renamed-key: string.slice($key, string.length($prefix) + 1);
|
|
105
|
+
$renamed-tokens: map.set($renamed-tokens, $key, $renamed-key);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@return $renamed-tokens;
|
|
111
|
+
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 Google LLC
|
|
3
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
// TODO: delete this file when we merge the list-item fixes
|
|
7
|
-
|
|
8
|
-
// go/keep-sorted start
|
|
9
|
-
@use 'sass:list';
|
|
10
|
-
@use 'sass:map';
|
|
11
|
-
@use 'sass:string';
|
|
12
|
-
// go/keep-sorted end
|
|
13
|
-
// go/keep-sorted start
|
|
14
|
-
@use './internal/validate';
|
|
15
|
-
@use './md-sys-color';
|
|
16
|
-
@use './md-sys-state';
|
|
17
|
-
@use './md-sys-typescale';
|
|
18
|
-
@use './v0_192/md-comp-list';
|
|
19
|
-
// go/keep-sorted end
|
|
20
|
-
|
|
21
|
-
$supported-tokens: (
|
|
22
|
-
// go/keep-sorted start
|
|
23
|
-
'bottom-space',
|
|
24
|
-
'disabled-opacity',
|
|
25
|
-
'focus-state-layer-color',
|
|
26
|
-
'focus-state-layer-opacity',
|
|
27
|
-
'hover-state-layer-color',
|
|
28
|
-
'hover-state-layer-opacity',
|
|
29
|
-
'label-text-color',
|
|
30
|
-
'label-text-font',
|
|
31
|
-
'label-text-line-height',
|
|
32
|
-
'label-text-size',
|
|
33
|
-
'label-text-weight',
|
|
34
|
-
'leading-icon-color',
|
|
35
|
-
'leading-space',
|
|
36
|
-
'one-line-container-height',
|
|
37
|
-
'pressed-state-layer-color',
|
|
38
|
-
'pressed-state-layer-opacity',
|
|
39
|
-
'supporting-text-color',
|
|
40
|
-
'supporting-text-font',
|
|
41
|
-
'supporting-text-line-height',
|
|
42
|
-
'supporting-text-size',
|
|
43
|
-
'supporting-text-weight',
|
|
44
|
-
'top-space',
|
|
45
|
-
'trailing-icon-color',
|
|
46
|
-
'trailing-space',
|
|
47
|
-
'trailing-supporting-text-color',
|
|
48
|
-
'trailing-supporting-text-font',
|
|
49
|
-
'trailing-supporting-text-line-height',
|
|
50
|
-
'trailing-supporting-text-size',
|
|
51
|
-
'trailing-supporting-text-weight',
|
|
52
|
-
'two-line-container-height',
|
|
53
|
-
// go/keep-sorted end
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
$unsupported-tokens: (
|
|
57
|
-
// go/keep-sorted start
|
|
58
|
-
'container-color',
|
|
59
|
-
'container-elevation',
|
|
60
|
-
'container-shape',
|
|
61
|
-
'disabled-label-text-color',
|
|
62
|
-
'disabled-label-text-opacity',
|
|
63
|
-
'disabled-leading-icon-color',
|
|
64
|
-
'disabled-leading-icon-opacity',
|
|
65
|
-
'disabled-state-layer-color',
|
|
66
|
-
'disabled-state-layer-opacity',
|
|
67
|
-
'disabled-trailing-icon-color',
|
|
68
|
-
'disabled-trailing-icon-opacity',
|
|
69
|
-
'divider-leading-space',
|
|
70
|
-
'divider-trailing-space',
|
|
71
|
-
'dragged-container-elevation',
|
|
72
|
-
'dragged-label-text-color',
|
|
73
|
-
'dragged-leading-icon-icon-color',
|
|
74
|
-
'dragged-state-layer-color',
|
|
75
|
-
'dragged-state-layer-opacity',
|
|
76
|
-
'dragged-trailing-icon-icon-color',
|
|
77
|
-
'focus-label-text-color',
|
|
78
|
-
'focus-leading-icon-icon-color',
|
|
79
|
-
'focus-trailing-icon-icon-color',
|
|
80
|
-
'hover-label-text-color',
|
|
81
|
-
'hover-leading-icon-icon-color',
|
|
82
|
-
'hover-trailing-icon-icon-color',
|
|
83
|
-
'label-text-tracking',
|
|
84
|
-
'label-text-type',
|
|
85
|
-
'large-leading-video-height',
|
|
86
|
-
'leading-avatar-color',
|
|
87
|
-
'leading-avatar-label-color',
|
|
88
|
-
'leading-avatar-label-font',
|
|
89
|
-
'leading-avatar-label-line-height',
|
|
90
|
-
'leading-avatar-label-size',
|
|
91
|
-
'leading-avatar-label-tracking',
|
|
92
|
-
'leading-avatar-label-type',
|
|
93
|
-
'leading-avatar-label-weight',
|
|
94
|
-
'leading-avatar-shape',
|
|
95
|
-
'leading-avatar-size',
|
|
96
|
-
'leading-icon-size',
|
|
97
|
-
'leading-image-height',
|
|
98
|
-
'leading-image-shape',
|
|
99
|
-
'leading-image-width',
|
|
100
|
-
'leading-video-shape',
|
|
101
|
-
'leading-video-width',
|
|
102
|
-
'overline-color',
|
|
103
|
-
'overline-font',
|
|
104
|
-
'overline-line-height',
|
|
105
|
-
'overline-size',
|
|
106
|
-
'overline-tracking',
|
|
107
|
-
'overline-type',
|
|
108
|
-
'overline-weight',
|
|
109
|
-
'pressed-label-text-color',
|
|
110
|
-
'pressed-leading-icon-icon-color',
|
|
111
|
-
'pressed-trailing-icon-icon-color',
|
|
112
|
-
'selected-trailing-icon-color',
|
|
113
|
-
'small-leading-video-height',
|
|
114
|
-
'supporting-text-tracking',
|
|
115
|
-
'supporting-text-type',
|
|
116
|
-
'three-line-container-height',
|
|
117
|
-
'trailing-icon-size',
|
|
118
|
-
'trailing-supporting-text-tracking',
|
|
119
|
-
'trailing-supporting-text-type',
|
|
120
|
-
'unselected-trailing-icon-color',
|
|
121
|
-
// go/keep-sorted end
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
$_default: (
|
|
125
|
-
'md-sys-color': md-sys-color.values-light(),
|
|
126
|
-
'md-sys-state': md-sys-state.values(),
|
|
127
|
-
'md-sys-typescale': md-sys-typescale.values(),
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
@function values($deps: $_default, $exclude-hardcoded-values: false) {
|
|
131
|
-
$original-tokens: md-comp-list.values($deps, $exclude-hardcoded-values);
|
|
132
|
-
|
|
133
|
-
$tokens: validate.values(
|
|
134
|
-
$original-tokens,
|
|
135
|
-
$supported-tokens: $supported-tokens,
|
|
136
|
-
$unsupported-tokens: $unsupported-tokens,
|
|
137
|
-
$new-tokens: (
|
|
138
|
-
'top-space': if($exclude-hardcoded-values, null, 12px),
|
|
139
|
-
'bottom-space': if($exclude-hardcoded-values, null, 12px),
|
|
140
|
-
'disabled-opacity':
|
|
141
|
-
map.get($original-tokens, 'list-item-disabled-label-text-opacity'),
|
|
142
|
-
),
|
|
143
|
-
$renamed-tokens: _get-renamed-tokens($original-tokens)
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
@return $tokens;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// remove list-item prefix from tokens
|
|
150
|
-
@function _get-renamed-tokens($tokens) {
|
|
151
|
-
$keys: map.keys($tokens);
|
|
152
|
-
$renamed-tokens: ();
|
|
153
|
-
|
|
154
|
-
@each $key in $keys {
|
|
155
|
-
@if string.index($key, 'list-item-') == 1 {
|
|
156
|
-
$renamed-key: string.slice($key, string.length('list-item-') + 1);
|
|
157
|
-
$renamed-tokens: map.set($renamed-tokens, $key, $renamed-key);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
@return $renamed-tokens;
|
|
162
|
-
}
|