@material/web 2.2.1-nightly.c27bdee.0 → 2.2.1-nightly.d69f2f2.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/elevated-button.js +2 -1
- package/button/elevated-button.js.map +1 -1
- package/button/filled-button.js +2 -1
- package/button/filled-button.js.map +1 -1
- package/button/filled-tonal-button.js +2 -1
- package/button/filled-tonal-button.js.map +1 -1
- package/button/internal/button.js.map +1 -1
- package/button/outlined-button.js +2 -1
- package/button/outlined-button.js.map +1 -1
- package/button/text-button.js +2 -1
- package/button/text-button.js.map +1 -1
- package/checkbox/checkbox.js +2 -1
- package/checkbox/checkbox.js.map +1 -1
- package/checkbox/internal/checkbox.d.ts +1 -0
- package/checkbox/internal/checkbox.js.map +1 -1
- package/chips/assist-chip.js +2 -1
- package/chips/assist-chip.js.map +1 -1
- package/chips/chip-set.js +2 -1
- package/chips/chip-set.js.map +1 -1
- package/chips/filter-chip.js +2 -1
- package/chips/filter-chip.js.map +1 -1
- package/chips/harness.js.map +1 -1
- package/chips/input-chip.js +2 -1
- package/chips/input-chip.js.map +1 -1
- package/chips/internal/assist-chip.js.map +1 -1
- package/chips/internal/chip-set.js.map +1 -1
- package/chips/internal/chip.d.ts +1 -0
- package/chips/internal/chip.js.map +1 -1
- package/chips/internal/filter-chip.js.map +1 -1
- package/chips/internal/input-chip.js.map +1 -1
- package/chips/internal/multi-action-chip.js.map +1 -1
- package/chips/internal/trailing-icons.js.map +1 -1
- package/chips/suggestion-chip.js +2 -1
- package/chips/suggestion-chip.js.map +1 -1
- package/dialog/dialog.js +2 -1
- package/dialog/dialog.js.map +1 -1
- package/dialog/internal/dialog.js.map +1 -1
- package/divider/divider.js +2 -1
- package/divider/divider.js.map +1 -1
- package/elevation/elevation.js +2 -1
- package/elevation/elevation.js.map +1 -1
- package/fab/branded-fab.js +2 -1
- package/fab/branded-fab.js.map +1 -1
- package/fab/fab.js +2 -1
- package/fab/fab.js.map +1 -1
- package/field/filled-field.js +2 -1
- package/field/filled-field.js.map +1 -1
- package/field/internal/field.js.map +1 -1
- package/field/outlined-field.js +2 -1
- package/field/outlined-field.js.map +1 -1
- package/focus/internal/focus-ring.js.map +1 -1
- package/focus/md-focus-ring.js +2 -1
- package/focus/md-focus-ring.js.map +1 -1
- package/icon/icon.js +2 -1
- package/icon/icon.js.map +1 -1
- package/icon/internal/icon.js.map +1 -1
- package/iconbutton/filled-icon-button.js +2 -1
- package/iconbutton/filled-icon-button.js.map +1 -1
- package/iconbutton/filled-tonal-icon-button.js +2 -1
- package/iconbutton/filled-tonal-icon-button.js.map +1 -1
- package/iconbutton/harness.js.map +1 -1
- package/iconbutton/icon-button.js +2 -1
- package/iconbutton/icon-button.js.map +1 -1
- package/iconbutton/internal/_shared.scss +2 -0
- package/iconbutton/internal/icon-button.js +4 -3
- package/iconbutton/internal/icon-button.js.map +1 -1
- package/iconbutton/internal/shared-styles.css +1 -1
- package/iconbutton/internal/shared-styles.css.map +1 -1
- package/iconbutton/internal/shared-styles.js +1 -1
- package/iconbutton/internal/shared-styles.js.map +1 -1
- package/iconbutton/outlined-icon-button.js +2 -1
- package/iconbutton/outlined-icon-button.js.map +1 -1
- package/internal/aria/aria.d.ts +1 -1
- package/internal/aria/delegate.js.map +1 -1
- package/internal/controller/attachable-controller.js.map +1 -1
- package/internal/controller/form-submitter.js.map +1 -1
- package/internal/events/dispatch-hooks.js.map +1 -1
- package/internal/events/form-label-activation.js.map +1 -1
- package/internal/events/redispatch-event.js.map +1 -1
- package/internal/motion/animation.js.map +1 -1
- package/labs/badge/badge.js +2 -1
- package/labs/badge/badge.js.map +1 -1
- package/labs/behaviors/constraint-validation.js.map +1 -1
- package/labs/behaviors/custom-state-set.d.ts +107 -0
- package/labs/behaviors/custom-state-set.js +121 -0
- package/labs/behaviors/custom-state-set.js.map +1 -0
- package/labs/behaviors/element-internals.js.map +1 -1
- package/labs/behaviors/focusable.js.map +1 -1
- package/labs/behaviors/form-associated.js.map +1 -1
- package/labs/behaviors/on-report-validity.js.map +1 -1
- package/labs/behaviors/validators/checkbox-validator.js.map +1 -1
- package/labs/behaviors/validators/radio-validator.js.map +1 -1
- package/labs/behaviors/validators/select-validator.js.map +1 -1
- package/labs/behaviors/validators/text-field-validator.js.map +1 -1
- package/labs/behaviors/validators/validator.js.map +1 -1
- package/labs/card/elevated-card.js +2 -1
- package/labs/card/elevated-card.js.map +1 -1
- package/labs/card/filled-card.js +2 -1
- package/labs/card/filled-card.js.map +1 -1
- package/labs/card/outlined-card.js +2 -1
- package/labs/card/outlined-card.js.map +1 -1
- package/labs/item/internal/item.js.map +1 -1
- package/labs/item/item.js +2 -1
- package/labs/item/item.js.map +1 -1
- package/labs/navigationbar/internal/navigation-bar.js.map +1 -1
- package/labs/navigationbar/navigation-bar.js +2 -1
- package/labs/navigationbar/navigation-bar.js.map +1 -1
- package/labs/navigationdrawer/internal/navigation-drawer-modal.js.map +1 -1
- package/labs/navigationdrawer/internal/navigation-drawer.js.map +1 -1
- package/labs/navigationdrawer/navigation-drawer-modal.js +2 -1
- package/labs/navigationdrawer/navigation-drawer-modal.js.map +1 -1
- package/labs/navigationdrawer/navigation-drawer.js +2 -1
- package/labs/navigationdrawer/navigation-drawer.js.map +1 -1
- package/labs/navigationtab/internal/navigation-tab.js.map +1 -1
- package/labs/navigationtab/navigation-tab.js +2 -1
- package/labs/navigationtab/navigation-tab.js.map +1 -1
- package/labs/segmentedbutton/internal/segmented-button.js.map +1 -1
- package/labs/segmentedbutton/outlined-segmented-button.js +2 -1
- package/labs/segmentedbutton/outlined-segmented-button.js.map +1 -1
- package/labs/segmentedbuttonset/internal/segmented-button-set.js.map +1 -1
- package/labs/segmentedbuttonset/outlined-segmented-button-set.js +2 -1
- package/labs/segmentedbuttonset/outlined-segmented-button-set.js.map +1 -1
- package/list/internal/list-controller.js.map +1 -1
- package/list/internal/list-navigation-helpers.js.map +1 -1
- package/list/internal/list.js.map +1 -1
- package/list/internal/listitem/list-item.d.ts +1 -0
- package/list/internal/listitem/list-item.js.map +1 -1
- package/list/list-item.js +2 -1
- package/list/list-item.js.map +1 -1
- package/list/list.js +2 -1
- package/list/list.js.map +1 -1
- package/menu/harness.js.map +1 -1
- package/menu/internal/controllers/menuItemController.js.map +1 -1
- package/menu/internal/controllers/surfacePositionController.js.map +1 -1
- package/menu/internal/controllers/typeaheadController.js.map +1 -1
- package/menu/internal/menu.js.map +1 -1
- package/menu/internal/menuitem/menu-item.d.ts +1 -0
- package/menu/internal/menuitem/menu-item.js.map +1 -1
- package/menu/internal/submenu/sub-menu.js.map +1 -1
- package/menu/menu-item.js +2 -1
- package/menu/menu-item.js.map +1 -1
- package/menu/menu.js +2 -1
- package/menu/menu.js.map +1 -1
- package/menu/sub-menu.js +2 -1
- package/menu/sub-menu.js.map +1 -1
- package/migrations/v2/query-selector-aria.js.map +1 -1
- package/package.json +5 -3
- package/progress/circular-progress.js +2 -1
- package/progress/circular-progress.js.map +1 -1
- package/progress/internal/circular-progress.js.map +1 -1
- package/progress/linear-progress.js +2 -1
- package/progress/linear-progress.js.map +1 -1
- package/radio/internal/radio.js.map +1 -1
- package/radio/internal/single-selection-controller.js.map +1 -1
- package/radio/radio.js +2 -1
- package/radio/radio.js.map +1 -1
- package/ripple/internal/ripple.js.map +1 -1
- package/ripple/ripple.js +2 -1
- package/ripple/ripple.js.map +1 -1
- package/select/filled-select.js +2 -1
- package/select/filled-select.js.map +1 -1
- package/select/harness.js.map +1 -1
- package/select/internal/select.d.ts +1 -0
- package/select/internal/select.js +2 -1
- package/select/internal/select.js.map +1 -1
- package/select/internal/selectoption/select-option.d.ts +1 -0
- package/select/internal/selectoption/selectOptionController.js.map +1 -1
- package/select/internal/shared.js.map +1 -1
- package/select/outlined-select.js +2 -1
- package/select/outlined-select.js.map +1 -1
- package/select/select-option.js +2 -1
- package/select/select-option.js.map +1 -1
- package/slider/harness.js.map +1 -1
- package/slider/internal/slider.js.map +1 -1
- package/slider/slider.js +2 -1
- package/slider/slider.js.map +1 -1
- package/switch/internal/switch.js.map +1 -1
- package/switch/switch.js +2 -1
- package/switch/switch.js.map +1 -1
- package/tabs/harness.js.map +1 -1
- package/tabs/internal/tab.js.map +1 -1
- package/tabs/internal/tabs.js.map +1 -1
- package/tabs/primary-tab.js +2 -1
- package/tabs/primary-tab.js.map +1 -1
- package/tabs/secondary-tab.js +2 -1
- package/tabs/secondary-tab.js.map +1 -1
- package/tabs/tabs.js +2 -1
- package/tabs/tabs.js.map +1 -1
- package/testing/harness.js.map +1 -1
- package/testing/transform-pseudo-classes.js.map +1 -1
- package/textfield/filled-text-field.js +2 -1
- package/textfield/filled-text-field.js.map +1 -1
- package/textfield/harness.js.map +1 -1
- package/textfield/internal/text-field.js.map +1 -1
- package/textfield/outlined-text-field.js +2 -1
- package/textfield/outlined-text-field.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch.js","sourceRoot":"","sources":["switch.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 '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing, TemplateResult} from 'lit';\nimport {property, query} from 'lit/decorators.js';\nimport {ClassInfo, classMap} from 'lit/directives/class-map.js';\n\nimport {mixinDelegatesAria} from '../../internal/aria/delegate.js';\nimport {\n afterDispatch,\n setupDispatchHooks,\n} from '../../internal/events/dispatch-hooks.js';\nimport {\n dispatchActivationClick,\n isActivationClick,\n} from '../../internal/events/form-label-activation.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 getFormState,\n getFormValue,\n mixinFormAssociated,\n} from '../../labs/behaviors/form-associated.js';\nimport {CheckboxValidator} from '../../labs/behaviors/validators/checkbox-validator.js';\n\n// Separate variable needed for closure.\nconst switchBaseClass = mixinDelegatesAria(\n mixinConstraintValidation(\n mixinFormAssociated(mixinElementInternals(LitElement)),\n ),\n);\n\n/**\n * @fires input {InputEvent} Fired whenever `selected` changes due to user\n * interaction (bubbles and composed).\n * @fires change {Event} Fired whenever `selected` changes due to user\n * interaction (bubbles).\n */\nexport class Switch extends switchBaseClass {\n /** @nocollapse */\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n };\n\n /**\n * Puts the switch in the selected state and sets the form submission value to\n * the `value` property.\n */\n @property({type: Boolean}) selected = false;\n\n /**\n * Shows both the selected and deselected icons.\n */\n @property({type: Boolean}) icons = false;\n\n /**\n * Shows only the selected icon, and not the deselected icon. If `true`,\n * overrides the behavior of the `icons` property.\n */\n @property({type: Boolean, attribute: 'show-only-selected-icon'})\n showOnlySelectedIcon = false;\n\n /**\n * When true, require the switch to be selected when participating in\n * form submission.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#validation\n */\n @property({type: Boolean}) required = false;\n\n /**\n * The value associated with this switch on form submission. `null` is\n * submitted when `selected` is `false`.\n */\n @property() value = 'on';\n\n @query('input') private readonly input!: HTMLInputElement | null;\n\n constructor() {\n super();\n if (isServer) {\n return;\n }\n\n // This click listener does not currently need dispatch hooks since it does\n // not check `event.defaultPrevented`.\n this.addEventListener('click', (event: MouseEvent) => {\n if (!isActivationClick(event) || !this.input) {\n return;\n }\n this.focus();\n dispatchActivationClick(this.input);\n });\n\n // Add the aria keyboard interaction pattern for switch and the Enter key.\n // See https://www.w3.org/WAI/ARIA/apg/patterns/switch/.\n setupDispatchHooks(this, 'keydown');\n this.addEventListener('keydown', (event: KeyboardEvent) => {\n afterDispatch(event, () => {\n const ignoreEvent = event.defaultPrevented || event.key !== 'Enter';\n if (ignoreEvent || this.disabled || !this.input) {\n return;\n }\n\n this.input.click();\n });\n });\n }\n\n protected override render(): TemplateResult {\n return html`\n <div class=\"switch ${classMap(this.getRenderClasses())}\">\n <input\n id=\"switch\"\n class=\"touch\"\n type=\"checkbox\"\n role=\"switch\"\n aria-label=${(this as ARIAMixin).ariaLabel || nothing}\n ?checked=${this.selected}\n ?disabled=${this.disabled}\n ?required=${this.required}\n @input=${this.handleInput}\n @change=${this.handleChange} />\n\n <md-focus-ring part=\"focus-ring\" for=\"switch\"></md-focus-ring>\n <span class=\"track\"> ${this.renderHandle()} </span>\n </div>\n `;\n }\n\n private getRenderClasses(): ClassInfo {\n return {\n 'selected': this.selected,\n 'unselected': !this.selected,\n 'disabled': this.disabled,\n };\n }\n\n private renderHandle() {\n const classes = {\n 'with-icon': this.showOnlySelectedIcon ? this.selected : this.icons,\n };\n return html`\n ${this.renderTouchTarget()}\n <span class=\"handle-container\">\n <md-ripple for=\"switch\" ?disabled=\"${this.disabled}\"></md-ripple>\n <span class=\"handle ${classMap(classes)}\">\n ${this.shouldShowIcons() ? this.renderIcons() : html``}\n </span>\n </span>\n `;\n }\n\n private renderIcons() {\n return html`\n <div class=\"icons\">\n ${this.renderOnIcon()}\n ${this.showOnlySelectedIcon ? html`` : this.renderOffIcon()}\n </div>\n `;\n }\n\n /**\n * https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Acheck%3AFILL%400%3Bwght%40500%3BGRAD%400%3Bopsz%4024\n */\n private renderOnIcon() {\n return html`\n <slot class=\"icon icon--on\" name=\"on-icon\">\n <svg viewBox=\"0 0 24 24\">\n <path\n d=\"M9.55 18.2 3.65 12.3 5.275 10.675 9.55 14.95 18.725 5.775 20.35 7.4Z\" />\n </svg>\n </slot>\n `;\n }\n\n /**\n * https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Aclose%3AFILL%400%3Bwght%40500%3BGRAD%400%3Bopsz%4024\n */\n private renderOffIcon() {\n return html`\n <slot class=\"icon icon--off\" name=\"off-icon\">\n <svg viewBox=\"0 0 24 24\">\n <path\n d=\"M6.4 19.2 4.8 17.6 10.4 12 4.8 6.4 6.4 4.8 12 10.4 17.6 4.8 19.2 6.4 13.6 12 19.2 17.6 17.6 19.2 12 13.6Z\" />\n </svg>\n </slot>\n `;\n }\n\n private renderTouchTarget() {\n return html`<span class=\"touch\"></span>`;\n }\n\n private shouldShowIcons(): boolean {\n return this.icons || this.showOnlySelectedIcon;\n }\n\n private handleInput(event: Event) {\n const target = event.target as HTMLInputElement;\n this.selected = target.checked;\n // <input> 'input' event bubbles and is composed, don't re-dispatch it.\n }\n\n private handleChange(event: Event) {\n // <input> 'change' event is not composed, re-dispatch it.\n redispatchEvent(this, event);\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.selected ? this.value : null;\n }\n\n override [getFormState]() {\n return String(this.selected);\n }\n\n override formResetCallback() {\n // The selected property does not reflect, so the original attribute set by\n // the user is used to determine the default value.\n this.selected = this.hasAttribute('selected');\n }\n\n override formStateRestoreCallback(state: string) {\n this.selected = state === 'true';\n }\n\n override [createValidator]() {\n return new CheckboxValidator(() => ({\n checked: this.selected,\n required: this.required,\n }));\n }\n\n override [getValidityAnchor]() {\n return this.input;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"switch.js","sourceRoot":"","sources":["switch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,8BAA8B,CAAC;AACtC,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAiB,MAAM,KAAK,CAAC;AACxE,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAY,QAAQ,EAAC,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACL,aAAa,EACb,kBAAkB,GACnB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,gDAAgD,CAAC;AACxD,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,YAAY,EACZ,mBAAmB,GACpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAC,iBAAiB,EAAC,MAAM,uDAAuD,CAAC;AAExF,wCAAwC;AACxC,MAAM,eAAe,GAAG,kBAAkB,CACxC,yBAAyB,CACvB,mBAAmB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CACvD,CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,OAAO,MAAO,SAAQ,eAAe;IAyCzC;QACE,KAAK,EAAE,CAAC;QAnCV;;;WAGG;QACwB,aAAQ,GAAG,KAAK,CAAC;QAE5C;;WAEG;QACwB,UAAK,GAAG,KAAK,CAAC;QAEzC;;;WAGG;QAEH,yBAAoB,GAAG,KAAK,CAAC;QAE7B;;;;;WAKG;QACwB,aAAQ,GAAG,KAAK,CAAC;QAE5C;;;WAGG;QACS,UAAK,GAAG,IAAI,CAAC;QAMvB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,sCAAsC;QACtC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE;YACnD,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,0EAA0E;QAC1E,wDAAwD;QACxD,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAoB,EAAE,EAAE;YACxD,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE;gBACxB,MAAM,WAAW,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC;gBACpE,IAAI,WAAW,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChD,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEkB,MAAM;QACvB,OAAO,IAAI,CAAA;2BACY,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;;;;;;uBAMpC,IAAkB,CAAC,SAAS,IAAI,OAAO;qBAC1C,IAAI,CAAC,QAAQ;sBACZ,IAAI,CAAC,QAAQ;sBACb,IAAI,CAAC,QAAQ;mBAChB,IAAI,CAAC,WAAW;oBACf,IAAI,CAAC,YAAY;;;+BAGN,IAAI,CAAC,YAAY,EAAE;;KAE7C,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,QAAQ;YACzB,YAAY,EAAE,CAAC,IAAI,CAAC,QAAQ;YAC5B,UAAU,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAC;IACJ,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAAG;YACd,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;SACpE,CAAC;QACF,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,iBAAiB,EAAE;;6CAEa,IAAI,CAAC,QAAQ;8BAC5B,QAAQ,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE;;;KAG3D,CAAC;IACJ,CAAC;IAEO,WAAW;QACjB,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,YAAY,EAAE;UACnB,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE;;KAE9D,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,OAAO,IAAI,CAAA;;;;;;;KAOV,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,OAAO,IAAI,CAAA;;;;;;;KAOV,CAAC;IACJ,CAAC;IAEO,iBAAiB;QACvB,OAAO,IAAI,CAAA,6BAA6B,CAAC;IAC3C,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC;IACjD,CAAC;IAEO,WAAW,CAAC,KAAY;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,uEAAuE;IACzE,CAAC;IAEO,YAAY,CAAC,KAAY;QAC/B,0DAA0D;QAC1D,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAMQ,CAAC,YAAY,CAAC;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAEQ,CAAC,YAAY,CAAC;QACrB,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAEQ,iBAAiB;QACxB,2EAA2E;QAC3E,mDAAmD;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAEQ,wBAAwB,CAAC,KAAa;QAC7C,IAAI,CAAC,QAAQ,GAAG,KAAK,KAAK,MAAM,CAAC;IACnC,CAAC;IAEQ,CAAC,eAAe,CAAC;QACxB,OAAO,IAAI,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAEQ,CAAC,iBAAiB,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;;AA1MD,kBAAkB;AACF,wBAAiB,GAAmB;IAClD,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,IAAI;CACrB,AAHgC,CAG/B;AAMyB;IAA1B,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;wCAAkB;AAKjB;IAA1B,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;qCAAe;AAOzC;IADC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAC,CAAC;oDACnC;AAQF;IAA1B,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;wCAAkB;AAMhC;IAAX,QAAQ,EAAE;qCAAc;AAEQ;IAAhC,KAAK,CAAC,OAAO,CAAC;qCAAkD","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing, TemplateResult} from 'lit';\nimport {property, query} from 'lit/decorators.js';\nimport {ClassInfo, classMap} from 'lit/directives/class-map.js';\n\nimport {mixinDelegatesAria} from '../../internal/aria/delegate.js';\nimport {\n afterDispatch,\n setupDispatchHooks,\n} from '../../internal/events/dispatch-hooks.js';\nimport {\n dispatchActivationClick,\n isActivationClick,\n} from '../../internal/events/form-label-activation.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 getFormState,\n getFormValue,\n mixinFormAssociated,\n} from '../../labs/behaviors/form-associated.js';\nimport {CheckboxValidator} from '../../labs/behaviors/validators/checkbox-validator.js';\n\n// Separate variable needed for closure.\nconst switchBaseClass = mixinDelegatesAria(\n mixinConstraintValidation(\n mixinFormAssociated(mixinElementInternals(LitElement)),\n ),\n);\n\n/**\n * @fires input {InputEvent} Fired whenever `selected` changes due to user\n * interaction (bubbles and composed).\n * @fires change {Event} Fired whenever `selected` changes due to user\n * interaction (bubbles).\n */\nexport class Switch extends switchBaseClass {\n /** @nocollapse */\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n };\n\n /**\n * Puts the switch in the selected state and sets the form submission value to\n * the `value` property.\n */\n @property({type: Boolean}) selected = false;\n\n /**\n * Shows both the selected and deselected icons.\n */\n @property({type: Boolean}) icons = false;\n\n /**\n * Shows only the selected icon, and not the deselected icon. If `true`,\n * overrides the behavior of the `icons` property.\n */\n @property({type: Boolean, attribute: 'show-only-selected-icon'})\n showOnlySelectedIcon = false;\n\n /**\n * When true, require the switch to be selected when participating in\n * form submission.\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#validation\n */\n @property({type: Boolean}) required = false;\n\n /**\n * The value associated with this switch on form submission. `null` is\n * submitted when `selected` is `false`.\n */\n @property() value = 'on';\n\n @query('input') private readonly input!: HTMLInputElement | null;\n\n constructor() {\n super();\n if (isServer) {\n return;\n }\n\n // This click listener does not currently need dispatch hooks since it does\n // not check `event.defaultPrevented`.\n this.addEventListener('click', (event: MouseEvent) => {\n if (!isActivationClick(event) || !this.input) {\n return;\n }\n this.focus();\n dispatchActivationClick(this.input);\n });\n\n // Add the aria keyboard interaction pattern for switch and the Enter key.\n // See https://www.w3.org/WAI/ARIA/apg/patterns/switch/.\n setupDispatchHooks(this, 'keydown');\n this.addEventListener('keydown', (event: KeyboardEvent) => {\n afterDispatch(event, () => {\n const ignoreEvent = event.defaultPrevented || event.key !== 'Enter';\n if (ignoreEvent || this.disabled || !this.input) {\n return;\n }\n\n this.input.click();\n });\n });\n }\n\n protected override render(): TemplateResult {\n return html`\n <div class=\"switch ${classMap(this.getRenderClasses())}\">\n <input\n id=\"switch\"\n class=\"touch\"\n type=\"checkbox\"\n role=\"switch\"\n aria-label=${(this as ARIAMixin).ariaLabel || nothing}\n ?checked=${this.selected}\n ?disabled=${this.disabled}\n ?required=${this.required}\n @input=${this.handleInput}\n @change=${this.handleChange} />\n\n <md-focus-ring part=\"focus-ring\" for=\"switch\"></md-focus-ring>\n <span class=\"track\"> ${this.renderHandle()} </span>\n </div>\n `;\n }\n\n private getRenderClasses(): ClassInfo {\n return {\n 'selected': this.selected,\n 'unselected': !this.selected,\n 'disabled': this.disabled,\n };\n }\n\n private renderHandle() {\n const classes = {\n 'with-icon': this.showOnlySelectedIcon ? this.selected : this.icons,\n };\n return html`\n ${this.renderTouchTarget()}\n <span class=\"handle-container\">\n <md-ripple for=\"switch\" ?disabled=\"${this.disabled}\"></md-ripple>\n <span class=\"handle ${classMap(classes)}\">\n ${this.shouldShowIcons() ? this.renderIcons() : html``}\n </span>\n </span>\n `;\n }\n\n private renderIcons() {\n return html`\n <div class=\"icons\">\n ${this.renderOnIcon()}\n ${this.showOnlySelectedIcon ? html`` : this.renderOffIcon()}\n </div>\n `;\n }\n\n /**\n * https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Acheck%3AFILL%400%3Bwght%40500%3BGRAD%400%3Bopsz%4024\n */\n private renderOnIcon() {\n return html`\n <slot class=\"icon icon--on\" name=\"on-icon\">\n <svg viewBox=\"0 0 24 24\">\n <path\n d=\"M9.55 18.2 3.65 12.3 5.275 10.675 9.55 14.95 18.725 5.775 20.35 7.4Z\" />\n </svg>\n </slot>\n `;\n }\n\n /**\n * https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Aclose%3AFILL%400%3Bwght%40500%3BGRAD%400%3Bopsz%4024\n */\n private renderOffIcon() {\n return html`\n <slot class=\"icon icon--off\" name=\"off-icon\">\n <svg viewBox=\"0 0 24 24\">\n <path\n d=\"M6.4 19.2 4.8 17.6 10.4 12 4.8 6.4 6.4 4.8 12 10.4 17.6 4.8 19.2 6.4 13.6 12 19.2 17.6 17.6 19.2 12 13.6Z\" />\n </svg>\n </slot>\n `;\n }\n\n private renderTouchTarget() {\n return html`<span class=\"touch\"></span>`;\n }\n\n private shouldShowIcons(): boolean {\n return this.icons || this.showOnlySelectedIcon;\n }\n\n private handleInput(event: Event) {\n const target = event.target as HTMLInputElement;\n this.selected = target.checked;\n // <input> 'input' event bubbles and is composed, don't re-dispatch it.\n }\n\n private handleChange(event: Event) {\n // <input> 'change' event is not composed, re-dispatch it.\n redispatchEvent(this, event);\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.selected ? this.value : null;\n }\n\n override [getFormState]() {\n return String(this.selected);\n }\n\n override formResetCallback() {\n // The selected property does not reflect, so the original attribute set by\n // the user is used to determine the default value.\n this.selected = this.hasAttribute('selected');\n }\n\n override formStateRestoreCallback(state: string) {\n this.selected = state === 'true';\n }\n\n override [createValidator]() {\n return new CheckboxValidator(() => ({\n checked: this.selected,\n required: this.required,\n }));\n }\n\n override [getValidityAnchor]() {\n return this.input;\n }\n}\n"]}
|
package/switch/switch.js
CHANGED
|
@@ -17,10 +17,11 @@ import { styles } from './internal/switch-styles.js';
|
|
|
17
17
|
* @final
|
|
18
18
|
* @suppress {visibility}
|
|
19
19
|
*/
|
|
20
|
-
|
|
20
|
+
let MdSwitch = class MdSwitch extends Switch {
|
|
21
21
|
};
|
|
22
22
|
MdSwitch.styles = [styles];
|
|
23
23
|
MdSwitch = __decorate([
|
|
24
24
|
customElement('md-switch')
|
|
25
25
|
], MdSwitch);
|
|
26
|
+
export { MdSwitch };
|
|
26
27
|
//# sourceMappingURL=switch.js.map
|
package/switch/switch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch.js","sourceRoot":"","sources":["switch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAC,MAAM,EAAC,MAAM,6BAA6B,CAAC;AAQnD;;;;;;;;;GASG;AAEI,
|
|
1
|
+
{"version":3,"file":"switch.js","sourceRoot":"","sources":["switch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAC,MAAM,EAAC,MAAM,6BAA6B,CAAC;AAQnD;;;;;;;;;GASG;AAEI,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,MAAM;;AAClB,eAAM,GAAwB,CAAC,MAAM,CAAC,AAAhC,CAAiC;AAD5C,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CAEpB","sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {CSSResultOrNative} from 'lit';\nimport {customElement} from 'lit/decorators.js';\n\nimport {Switch} from './internal/switch.js';\nimport {styles} from './internal/switch-styles.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-switch': MdSwitch;\n }\n}\n\n/**\n * @summary Switches toggle the state of a single item on or off.\n *\n * @description\n * There's one type of switch in Material. Use this selection control when the\n * user needs to toggle a single item on or off.\n *\n * @final\n * @suppress {visibility}\n */\n@customElement('md-switch')\nexport class MdSwitch extends Switch {\n static override styles: CSSResultOrNative[] = [styles];\n}\n"]}
|
package/tabs/harness.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness.js","sourceRoot":"","sources":["harness.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAqB,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAKlE;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAY;IACjC,KAAK,CAAC,qBAAqB;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,OAAO,IAAI,CAAC,OAAsB,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,0BAA0B;QACtC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAE,CAAC;QACvE,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;QAC7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["harness.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAqB,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAKlE;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAY;IACjC,KAAK,CAAC,qBAAqB;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,OAAO,IAAI,CAAC,OAAsB,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,0BAA0B;QACtC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAE,CAAC;QACvE,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;QAC7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,SAAS,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAE,CAAC;QACvE,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;QACvD,OAAO,OAAO,KAAK,GAAG,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,OAAa;IAC5C,mEAAmE;IACnE,gBAAgB;IACP,KAAK,CAAC,qBAAqB;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,OAAsB,CAAC;QACrC,CAAC;QAED,MAAM,mBAAmB,GACrB,IAAI,CAAC,OAAO,CAAC,SAAqC;aACjD,OAAsB,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtE,OAAO,MAAM,mBAAmB,CAAC,qBAAqB,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,cAAc;QAChB,OAAQ,IAAI,CAAC,OAAO,CAAC,IAAuC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACxE,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAe,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {ElementWithHarness, Harness} from '../testing/harness.js';\n\nimport {Tab} from './internal/tab.js';\nimport {Tabs} from './internal/tabs.js';\n\n/**\n * Test harness for Tab.\n */\nexport class TabHarness extends Harness<Tab> {\n override async getInteractiveElement() {\n await this.element.updateComplete;\n return this.element as HTMLElement;\n }\n\n private async completeIndicatorAnimation() {\n await this.element.updateComplete;\n const indicator = this.element.renderRoot.querySelector('.indicator')!;\n const animations = indicator.getAnimations();\n for (const animation of animations) {\n animation.finish();\n }\n }\n\n async isIndicatorShowing() {\n await this.completeIndicatorAnimation();\n const indicator = this.element.renderRoot.querySelector('.indicator')!;\n const opacity = getComputedStyle(indicator)['opacity'];\n return opacity === '1';\n }\n}\n\n/**\n * Test harness for Tabs.\n */\nexport class TabsHarness extends Harness<Tabs> {\n // Note, Tabs interactive element is the interactive element of the\n // selected tab.\n override async getInteractiveElement() {\n await this.element.updateComplete;\n if (!this.element.activeTab) {\n return this.element as HTMLElement;\n }\n\n const selectedItemHarness =\n ((this.element.activeTab as ElementWithHarness<Tab>)\n .harness as TabHarness) ?? new TabHarness(this.element.activeTab);\n return await selectedItemHarness.getInteractiveElement();\n }\n\n get harnessedItems() {\n return (this.element.tabs as Array<ElementWithHarness<Tab>>).map((item) => {\n return (item.harness ?? new TabHarness(item)) as TabHarness;\n });\n }\n}\n"]}
|
package/tabs/internal/tab.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab.js","sourceRoot":"","sources":["tab.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;;AAEH,OAAO,8BAA8B,CAAC;AACtC,OAAO,8BAA8B,CAAC;AACtC,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAC,MAAM,KAAK,CAAC;AACxD,OAAO,EACL,QAAQ,EACR,KAAK,EACL,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,GACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAY,QAAQ,EAAC,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAC,MAAM,EAAC,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAC,cAAc,EAAC,MAAM,mCAAmC,CAAC;AAEjE;;;GAGG;AACH,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE5D,wCAAwC;AACxC,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,GAAI,SAAQ,YAAY;IAcnC;;OAEG;IAEH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,IAAI,QAAQ,CAAC,MAAe;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAsBD;QACE,KAAK,EAAE,CAAC;QA7CV;;;;WAIG;QAEM,UAAK,GAAG,IAAI,CAAC;QAEtB;;YAEI;QACsC,WAAM,GAAG,KAAK,CAAC;QAazD;;WAEG;QAC+C,YAAO,GAAG,KAAK,CAAC;QAElE;;WAEG;QACgD,aAAQ,GAAG,KAAK,CAAC;QAGjD,uBAAkB,GAAG,KAAK,CAAC;QAK7B,cAAS;QACxB,0BAA0B;QACzB,IAAoB,CAAC,eAAe,EAAE,CAAC;QAIxC,IAAI,CAAC,QAAQ,EAAE;YACb,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACjE;IACH,CAAC;IAEkB,MAAM;QACvB,MAAM,SAAS,GAAG,IAAI,CAAA,+BAA+B,CAAC;QACtD,OAAO,IAAI,CAAA;;;eAGA,IAAI,CAAC,kBAAkB;yDACmB,IAAI;;4BAEjC,IAAI;;yBAEP,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;;wCAEnB,IAAI,CAAC,oBAAoB;4BACrC,IAAI,CAAC,gBAAgB;UACvC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;;QAE/C,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;WAC1C,CAAC;IACV,CAAC;IAES,iBAAiB;QACzB,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,OAAO;YACxB,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ;SAC5B,CAAC;IACJ,CAAC;IAEkB,OAAO;QACxB,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,KAAoB;QAC9C,yBAAyB;QACzB,MAAM,CAAC,CAAC;QACR,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC1B,OAAO;SACR;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,qEAAqE;YACrE,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAEO,kBAAkB,CAAC,KAAY;QACrC,4EAA4E;QAC5E,0DAA0D;QAC1D,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,OAtE+B,SAAS,EAsEvC,iBAAiB,EAAC,CAAC,WAAgB;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACpB,OAAO;SACR;QAED,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5C,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC9B,QAAQ,EAAE,GAAG;gBACb,MAAM,EAAE,MAAM,CAAC,UAAU;aAC1B,CAAC,CAAC;SACJ;IACH,CAAC;IAEO,YAAY,CAAC,WAAgB;QACnC,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,EAAC,SAAS,EAAE,CAAC,EAAC,EAAE,EAAC,WAAW,EAAE,MAAM,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SACtE;QAED,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,QAAQ,GACZ,WAAW,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,IAAK,EAAc,CAAC;QACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAE,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9B,MAAM,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;QACpC,IACE,CAAC,YAAY;YACb,OAAO,KAAK,SAAS;YACrB,KAAK,KAAK,SAAS;YACnB,CAAC,KAAK,CAAC,KAAK,CAAC,EACb;YACA,IAAI,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CACzD,CAAC,CACF,cAAc,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;SACpC;aAAM;YACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;SACrB;QACD,kEAAkE;QAClE,+BAA+B;QAC/B,OAAO,CAAC,IAAI,EAAE,EAAC,WAAW,EAAE,MAAM,EAAC,CAAC,CAAC;IACvC,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,0EAA0E;QAC1E,WAAW;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC5C,MAAM,cAAc,GAClB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS;gBAChC,CAAC,CAAE,IAAa,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,IAAI,cAAc,EAAE;gBACzD,OAAO;aACR;SACF;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;CACF;AAtKU;IADR,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAC,CAAC;kCACxC;AAKoB;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;mCAAgB;AAMzD;IADC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;mCAGzB;AAQiD;IAAjD,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAC,CAAC;oCAAiB;AAKf;IAAlD,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAC,CAAC;qCAAkB;AAEtC;IAA7B,KAAK,CAAC,YAAY,CAAC;6BAA2C;AAC5C;IAAlB,KAAK,EAAE;+CAAsC;AAE7B;IADhB,kBAAkB,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;iDACW;AAE9B;IADhB,qBAAqB,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;0CACN;AAuIjD,SAAS,kBAAkB;IACzB,OAAO,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;AACvE,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../elevation/elevation.js';\nimport '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing} from 'lit';\nimport {\n property,\n query,\n queryAssignedElements,\n queryAssignedNodes,\n state,\n} from 'lit/decorators.js';\nimport {ClassInfo, classMap} from 'lit/directives/class-map.js';\n\nimport {EASING} from '../../internal/motion/animation.js';\nimport {mixinFocusable} from '../../labs/behaviors/focusable.js';\n\n/**\n * Symbol for tabs to use to animate their indicators based off another tab's\n * indicator.\n */\nconst INDICATOR = Symbol('indicator');\n\n/**\n * Symbol used by the tab bar to request a tab to animate its indicator from a\n * previously selected tab.\n */\nexport const ANIMATE_INDICATOR = Symbol('animateIndicator');\n\n// Separate variable needed for closure.\nconst tabBaseClass = mixinFocusable(LitElement);\n\n/**\n * Tab component.\n */\nexport class Tab extends tabBaseClass {\n /**\n * The attribute `md-tab` indicates that the element is a tab for the parent\n * element, `<md-tabs>`. Make sure if you're implementing your own `md-tab`\n * component that you have an `md-tab` attribute set.\n */\n @property({type: Boolean, reflect: true, attribute: 'md-tab'})\n readonly isTab = true;\n\n /**\n * Whether or not the tab is selected.\n **/\n @property({type: Boolean, reflect: true}) active = false;\n\n /**\n * @deprecated use `active`\n */\n @property({type: Boolean})\n get selected() {\n return this.active;\n }\n set selected(active: boolean) {\n this.active = active;\n }\n\n /**\n * In SSR, set this to true when an icon is present.\n */\n @property({type: Boolean, attribute: 'has-icon'}) hasIcon = false;\n\n /**\n * In SSR, set this to true when there is no label and only an icon.\n */\n @property({type: Boolean, attribute: 'icon-only'}) iconOnly = false;\n\n @query('.indicator') readonly [INDICATOR]!: HTMLElement | null;\n @state() protected fullWidthIndicator = false;\n @queryAssignedNodes({flatten: true})\n private readonly assignedDefaultNodes!: Node[];\n @queryAssignedElements({slot: 'icon', flatten: true})\n private readonly assignedIcons!: HTMLElement[];\n private readonly internals =\n // Cast needed for closure\n (this as HTMLElement).attachInternals();\n\n constructor() {\n super();\n if (!isServer) {\n this.internals.role = 'tab';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n }\n }\n\n protected override render() {\n const indicator = html`<div class=\"indicator\"></div>`;\n return html`<div\n class=\"button\"\n role=\"presentation\"\n @click=${this.handleContentClick}>\n <md-focus-ring part=\"focus-ring\" inward .control=${this}></md-focus-ring>\n <md-elevation part=\"elevation\"></md-elevation>\n <md-ripple .control=${this}></md-ripple>\n <div\n class=\"content ${classMap(this.getContentClasses())}\"\n role=\"presentation\">\n <slot name=\"icon\" @slotchange=${this.handleIconSlotChange}></slot>\n <slot @slotchange=${this.handleSlotChange}></slot>\n ${this.fullWidthIndicator ? nothing : indicator}\n </div>\n ${this.fullWidthIndicator ? indicator : nothing}\n </div>`;\n }\n\n protected getContentClasses(): ClassInfo {\n return {\n 'has-icon': this.hasIcon,\n 'has-label': !this.iconOnly,\n };\n }\n\n protected override updated() {\n this.internals.ariaSelected = String(this.active);\n }\n\n private async handleKeydown(event: KeyboardEvent) {\n // Allow event to bubble.\n await 0;\n if (event.defaultPrevented) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n // Prevent default behavior such as scrolling when pressing spacebar.\n event.preventDefault();\n this.click();\n }\n }\n\n private handleContentClick(event: Event) {\n // Ensure the \"click\" target is always the tab, and not content, by stopping\n // propagation of content clicks and re-clicking the host.\n event.stopPropagation();\n this.click();\n }\n\n [ANIMATE_INDICATOR](previousTab: Tab) {\n if (!this[INDICATOR]) {\n return;\n }\n\n this[INDICATOR].getAnimations().forEach((a) => {\n a.cancel();\n });\n const frames = this.getKeyframes(previousTab);\n if (frames !== null) {\n this[INDICATOR].animate(frames, {\n duration: 250,\n easing: EASING.EMPHASIZED,\n });\n }\n }\n\n private getKeyframes(previousTab: Tab) {\n const reduceMotion = shouldReduceMotion();\n if (!this.active) {\n return reduceMotion ? [{'opacity': 1}, {'transform': 'none'}] : null;\n }\n\n const from: Keyframe = {};\n const fromRect =\n previousTab[INDICATOR]?.getBoundingClientRect() ?? ({} as DOMRect);\n const fromPos = fromRect.left;\n const fromExtent = fromRect.width;\n const toRect = this[INDICATOR]!.getBoundingClientRect();\n const toPos = toRect.left;\n const toExtent = toRect.width;\n const scale = fromExtent / toExtent;\n if (\n !reduceMotion &&\n fromPos !== undefined &&\n toPos !== undefined &&\n !isNaN(scale)\n ) {\n from['transform'] = `translateX(${(fromPos - toPos).toFixed(\n 4,\n )}px) scaleX(${scale.toFixed(4)})`;\n } else {\n from['opacity'] = 0;\n }\n // note, including `transform: none` avoids quirky Safari behavior\n // that can hide the animation.\n return [from, {'transform': 'none'}];\n }\n\n private handleSlotChange() {\n this.iconOnly = false;\n // Check if there's any label text or elements. If not, then there is only\n // an icon.\n for (const node of this.assignedDefaultNodes) {\n const hasTextContent =\n node.nodeType === Node.TEXT_NODE &&\n !!(node as Text).wholeText.match(/\\S/);\n if (node.nodeType === Node.ELEMENT_NODE || hasTextContent) {\n return;\n }\n }\n\n this.iconOnly = true;\n }\n\n private handleIconSlotChange() {\n this.hasIcon = this.assignedIcons.length > 0;\n }\n}\n\nfunction shouldReduceMotion() {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tab.js","sourceRoot":"","sources":["tab.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../elevation/elevation.js';\nimport '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing} from 'lit';\nimport {\n property,\n query,\n queryAssignedElements,\n queryAssignedNodes,\n state,\n} from 'lit/decorators.js';\nimport {ClassInfo, classMap} from 'lit/directives/class-map.js';\n\nimport {EASING} from '../../internal/motion/animation.js';\nimport {mixinFocusable} from '../../labs/behaviors/focusable.js';\n\n/**\n * Symbol for tabs to use to animate their indicators based off another tab's\n * indicator.\n */\nconst INDICATOR = Symbol('indicator');\n\n/**\n * Symbol used by the tab bar to request a tab to animate its indicator from a\n * previously selected tab.\n */\nexport const ANIMATE_INDICATOR = Symbol('animateIndicator');\n\n// Separate variable needed for closure.\nconst tabBaseClass = mixinFocusable(LitElement);\n\n/**\n * Tab component.\n */\nexport class Tab extends tabBaseClass {\n /**\n * The attribute `md-tab` indicates that the element is a tab for the parent\n * element, `<md-tabs>`. Make sure if you're implementing your own `md-tab`\n * component that you have an `md-tab` attribute set.\n */\n @property({type: Boolean, reflect: true, attribute: 'md-tab'})\n readonly isTab = true;\n\n /**\n * Whether or not the tab is selected.\n **/\n @property({type: Boolean, reflect: true}) active = false;\n\n /**\n * @deprecated use `active`\n */\n @property({type: Boolean})\n get selected() {\n return this.active;\n }\n set selected(active: boolean) {\n this.active = active;\n }\n\n /**\n * In SSR, set this to true when an icon is present.\n */\n @property({type: Boolean, attribute: 'has-icon'}) hasIcon = false;\n\n /**\n * In SSR, set this to true when there is no label and only an icon.\n */\n @property({type: Boolean, attribute: 'icon-only'}) iconOnly = false;\n\n @query('.indicator') readonly [INDICATOR]!: HTMLElement | null;\n @state() protected fullWidthIndicator = false;\n @queryAssignedNodes({flatten: true})\n private readonly assignedDefaultNodes!: Node[];\n @queryAssignedElements({slot: 'icon', flatten: true})\n private readonly assignedIcons!: HTMLElement[];\n private readonly internals =\n // Cast needed for closure\n (this as HTMLElement).attachInternals();\n\n constructor() {\n super();\n if (!isServer) {\n this.internals.role = 'tab';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n }\n }\n\n protected override render() {\n const indicator = html`<div class=\"indicator\"></div>`;\n return html`<div\n class=\"button\"\n role=\"presentation\"\n @click=${this.handleContentClick}>\n <md-focus-ring part=\"focus-ring\" inward .control=${this}></md-focus-ring>\n <md-elevation part=\"elevation\"></md-elevation>\n <md-ripple .control=${this}></md-ripple>\n <div\n class=\"content ${classMap(this.getContentClasses())}\"\n role=\"presentation\">\n <slot name=\"icon\" @slotchange=${this.handleIconSlotChange}></slot>\n <slot @slotchange=${this.handleSlotChange}></slot>\n ${this.fullWidthIndicator ? nothing : indicator}\n </div>\n ${this.fullWidthIndicator ? indicator : nothing}\n </div>`;\n }\n\n protected getContentClasses(): ClassInfo {\n return {\n 'has-icon': this.hasIcon,\n 'has-label': !this.iconOnly,\n };\n }\n\n protected override updated() {\n this.internals.ariaSelected = String(this.active);\n }\n\n private async handleKeydown(event: KeyboardEvent) {\n // Allow event to bubble.\n await 0;\n if (event.defaultPrevented) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n // Prevent default behavior such as scrolling when pressing spacebar.\n event.preventDefault();\n this.click();\n }\n }\n\n private handleContentClick(event: Event) {\n // Ensure the \"click\" target is always the tab, and not content, by stopping\n // propagation of content clicks and re-clicking the host.\n event.stopPropagation();\n this.click();\n }\n\n [ANIMATE_INDICATOR](previousTab: Tab) {\n if (!this[INDICATOR]) {\n return;\n }\n\n this[INDICATOR].getAnimations().forEach((a) => {\n a.cancel();\n });\n const frames = this.getKeyframes(previousTab);\n if (frames !== null) {\n this[INDICATOR].animate(frames, {\n duration: 250,\n easing: EASING.EMPHASIZED,\n });\n }\n }\n\n private getKeyframes(previousTab: Tab) {\n const reduceMotion = shouldReduceMotion();\n if (!this.active) {\n return reduceMotion ? [{'opacity': 1}, {'transform': 'none'}] : null;\n }\n\n const from: Keyframe = {};\n const fromRect =\n previousTab[INDICATOR]?.getBoundingClientRect() ?? ({} as DOMRect);\n const fromPos = fromRect.left;\n const fromExtent = fromRect.width;\n const toRect = this[INDICATOR]!.getBoundingClientRect();\n const toPos = toRect.left;\n const toExtent = toRect.width;\n const scale = fromExtent / toExtent;\n if (\n !reduceMotion &&\n fromPos !== undefined &&\n toPos !== undefined &&\n !isNaN(scale)\n ) {\n from['transform'] = `translateX(${(fromPos - toPos).toFixed(\n 4,\n )}px) scaleX(${scale.toFixed(4)})`;\n } else {\n from['opacity'] = 0;\n }\n // note, including `transform: none` avoids quirky Safari behavior\n // that can hide the animation.\n return [from, {'transform': 'none'}];\n }\n\n private handleSlotChange() {\n this.iconOnly = false;\n // Check if there's any label text or elements. If not, then there is only\n // an icon.\n for (const node of this.assignedDefaultNodes) {\n const hasTextContent =\n node.nodeType === Node.TEXT_NODE &&\n !!(node as Text).wholeText.match(/\\S/);\n if (node.nodeType === Node.ELEMENT_NODE || hasTextContent) {\n return;\n }\n }\n\n this.iconOnly = true;\n }\n\n private handleIconSlotChange() {\n this.hasIcon = this.assignedIcons.length > 0;\n }\n}\n\nfunction shouldReduceMotion() {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["tabs.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../divider/divider.js';\n\nimport {html, isServer, LitElement} from 'lit';\nimport {property, query, queryAssignedElements} from 'lit/decorators.js';\n\nimport {ANIMATE_INDICATOR, Tab} from './tab.js';\n\n/**\n * @fires change {Event} Fired when the selected tab changes. The target's\n * `activeTabIndex` or `activeTab` provide information about the selection\n * change. The change event is fired when a user interaction like a space/enter\n * key or click cause a selection change. The tab selection based on these\n * actions can be cancelled by calling preventDefault on the triggering\n * `keydown` or `click` event. --bubbles\n *\n * @example\n * // perform an action if a tab is clicked\n * tabs.addEventListener('change', (event: Event) => {\n * if (event.target.activeTabIndex === 2)\n * takeAction();\n * }\n * });\n *\n * // prevent a click from triggering tab selection under some condition\n * tabs.addEventListener('click', (event: Event) => {\n * if (notReady)\n * event.preventDefault();\n * }\n * });\n *\n */\nexport class Tabs extends LitElement {\n /**\n * The tabs of this tab bar.\n */\n @queryAssignedElements({flatten: true, selector: '[md-tab]'})\n readonly tabs!: Tab[];\n\n /**\n * The currently selected tab, `null` only when there are no tab children.\n *\n * @export\n */\n get activeTab() {\n return this.tabs.find((tab) => tab.active) ?? null;\n }\n set activeTab(tab: Tab | null) {\n // Ignore setting activeTab to null. As long as there are children, one tab\n // must be selected.\n if (tab) {\n this.activateTab(tab);\n }\n }\n\n /**\n * The index of the currently selected tab.\n *\n * @export\n */\n @property({type: Number, attribute: 'active-tab-index'})\n get activeTabIndex() {\n return this.tabs.findIndex((tab) => tab.active);\n }\n set activeTabIndex(index: number) {\n const activateTabAtIndex = () => {\n const tab = this.tabs[index];\n // Ignore out-of-bound indices.\n if (tab) {\n this.activateTab(tab);\n }\n };\n\n if (!this.slotElement) {\n // This is needed to support setting the activeTabIndex via a lit property\n // binding.\n //\n // ```ts\n // html`\n // <md-tabs .activeTabIndex=${1}>\n // <md-tab>First</md-tab>\n // <md-tab>Second</md-tab>\n // </md-tabs>\n // `;\n // ```\n //\n // It's needed since lit's rendering lifecycle is asynchronous, and the\n // `<slot>` element hasn't rendered, so `tabs` is empty.\n this.updateComplete.then(activateTabAtIndex);\n return;\n }\n\n activateTabAtIndex();\n }\n\n /**\n * Whether or not to automatically select a tab when it is focused.\n */\n @property({type: Boolean, attribute: 'auto-activate'}) autoActivate = false;\n\n @query('.tabs') private readonly tabsScrollerElement!: HTMLElement | null;\n @query('slot') private readonly slotElement!: HTMLSlotElement | null;\n\n private get focusedTab() {\n return this.tabs.find((tab) => tab.matches(':focus-within'));\n }\n\n private readonly internals =\n // Cast needed for closure\n (this as HTMLElement).attachInternals();\n\n constructor() {\n super();\n if (!isServer) {\n this.internals.role = 'tablist';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n this.addEventListener('keyup', this.handleKeyup.bind(this));\n this.addEventListener('focusout', this.handleFocusout.bind(this));\n }\n }\n\n /**\n * Scrolls the toolbar, if overflowing, to the active tab, or the provided\n * tab.\n *\n * @param tabToScrollTo The tab that should be scrolled to. Defaults to the\n * active tab.\n * @return A Promise that resolves after the tab has been scrolled to.\n */\n async scrollToTab(tabToScrollTo?: Tab | null) {\n await this.updateComplete;\n const {tabs} = this;\n tabToScrollTo ??= this.activeTab;\n if (\n !tabToScrollTo ||\n !tabs.includes(tabToScrollTo) ||\n !this.tabsScrollerElement\n ) {\n return;\n }\n\n // wait for tabs to render.\n for (const tab of this.tabs) {\n await tab.updateComplete;\n }\n\n const offset = tabToScrollTo.offsetLeft;\n const extent = tabToScrollTo.offsetWidth;\n const scroll = this.scrollLeft;\n const hostExtent = this.offsetWidth;\n const scrollMargin = 48;\n const min = offset - scrollMargin;\n const max = offset + extent - hostExtent + scrollMargin;\n const to = Math.min(min, Math.max(max, scroll));\n // When a tab is focused, use 'auto' to use the CSS `scroll-behavior`. The\n // default behavior is smooth scrolling. However, when there is not a tab\n // focused on initialization, use 'instant' to immediately bring the focused\n // tab into view.\n const behavior: ScrollBehavior = !this.focusedTab ? 'instant' : 'auto';\n this.tabsScrollerElement.scrollTo({behavior, top: 0, left: to});\n }\n\n protected override render() {\n return html`\n <div class=\"tabs\">\n <slot\n @slotchange=${this.handleSlotChange}\n @click=${this.handleTabClick}></slot>\n </div>\n <md-divider part=\"divider\"></md-divider>\n `;\n }\n\n private async handleTabClick(event: Event) {\n const tab = event.target;\n // Allow event to bubble\n await 0;\n if (event.defaultPrevented || !isTab(tab) || tab.active) {\n return;\n }\n\n this.activateTab(tab);\n }\n\n private activateTab(activeTab: Tab) {\n const {tabs} = this;\n const previousTab = this.activeTab;\n if (!tabs.includes(activeTab) || previousTab === activeTab) {\n // Ignore setting activeTab to a tab element that is not a child.\n return;\n }\n\n for (const tab of tabs) {\n tab.active = tab === activeTab;\n }\n\n if (previousTab) {\n // Don't dispatch a change event if activating a tab when no previous tabs\n // were selected, such as when md-tabs auto-selects the first tab.\n const defaultPrevented = !this.dispatchEvent(\n new Event('change', {bubbles: true, cancelable: true}),\n );\n if (defaultPrevented) {\n for (const tab of tabs) {\n tab.active = tab === previousTab;\n }\n return;\n }\n\n activeTab[ANIMATE_INDICATOR](previousTab);\n }\n\n this.updateFocusableTab(activeTab);\n this.scrollToTab(activeTab);\n }\n\n private updateFocusableTab(focusableTab: Tab) {\n for (const tab of this.tabs) {\n tab.tabIndex = tab === focusableTab ? 0 : -1;\n }\n }\n\n // focus item on keydown and optionally select it\n private async handleKeydown(event: KeyboardEvent) {\n // Allow event to bubble.\n await 0;\n const isLeft = event.key === 'ArrowLeft';\n const isRight = event.key === 'ArrowRight';\n const isHome = event.key === 'Home';\n const isEnd = event.key === 'End';\n // Ignore non-navigation keys\n if (event.defaultPrevented || (!isLeft && !isRight && !isHome && !isEnd)) {\n return;\n }\n\n const {tabs} = this;\n // Don't try to select another tab if there aren't any.\n if (tabs.length < 2) {\n return;\n }\n\n // Prevent default interactions, such as scrolling.\n event.preventDefault();\n\n let indexToFocus: number;\n if (isHome || isEnd) {\n indexToFocus = isHome ? 0 : tabs.length - 1;\n } else {\n // Check if moving forwards or backwards\n const isRtl = getComputedStyle(this).direction === 'rtl';\n const forwards = isRtl ? isLeft : isRight;\n const {focusedTab} = this;\n if (!focusedTab) {\n // If there is not already a tab focused, select the first or last tab\n // based on the direction we're traveling.\n indexToFocus = forwards ? 0 : tabs.length - 1;\n } else {\n const focusedIndex = this.tabs.indexOf(focusedTab);\n indexToFocus = forwards ? focusedIndex + 1 : focusedIndex - 1;\n if (indexToFocus >= tabs.length) {\n // Return to start if moving past the last item.\n indexToFocus = 0;\n } else if (indexToFocus < 0) {\n // Go to end if moving before the first item.\n indexToFocus = tabs.length - 1;\n }\n }\n }\n\n const tabToFocus = tabs[indexToFocus];\n tabToFocus.focus();\n if (this.autoActivate) {\n this.activateTab(tabToFocus);\n } else {\n this.updateFocusableTab(tabToFocus);\n }\n }\n\n // scroll to item on keyup.\n private handleKeyup() {\n this.scrollToTab(this.focusedTab ?? this.activeTab);\n }\n\n private handleFocusout() {\n // restore focus to selected item when blurring the tab bar.\n if (this.matches(':focus-within')) {\n return;\n }\n\n const {activeTab} = this;\n if (activeTab) {\n this.updateFocusableTab(activeTab);\n }\n }\n\n private handleSlotChange() {\n const firstTab = this.tabs[0];\n if (!this.activeTab && firstTab) {\n // If the active tab was removed, auto-select the first one. There should\n // always be a selected tab while the bar has children.\n this.activateTab(firstTab);\n }\n\n // When children shift, ensure the active tab is visible. For example, if\n // many children are added before the active tab, it'd be pushed off screen.\n // This ensures it stays visible.\n this.scrollToTab(this.activeTab);\n }\n}\n\nfunction isTab(element: unknown): element is Tab {\n return element instanceof HTMLElement && element.hasAttribute('md-tab');\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["tabs.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../divider/divider.js';\n\nimport {html, isServer, LitElement} from 'lit';\nimport {property, query, queryAssignedElements} from 'lit/decorators.js';\n\nimport {ANIMATE_INDICATOR, Tab} from './tab.js';\n\n/**\n * @fires change {Event} Fired when the selected tab changes. The target's\n * `activeTabIndex` or `activeTab` provide information about the selection\n * change. The change event is fired when a user interaction like a space/enter\n * key or click cause a selection change. The tab selection based on these\n * actions can be cancelled by calling preventDefault on the triggering\n * `keydown` or `click` event. --bubbles\n *\n * @example\n * // perform an action if a tab is clicked\n * tabs.addEventListener('change', (event: Event) => {\n * if (event.target.activeTabIndex === 2)\n * takeAction();\n * }\n * });\n *\n * // prevent a click from triggering tab selection under some condition\n * tabs.addEventListener('click', (event: Event) => {\n * if (notReady)\n * event.preventDefault();\n * }\n * });\n *\n */\nexport class Tabs extends LitElement {\n /**\n * The tabs of this tab bar.\n */\n @queryAssignedElements({flatten: true, selector: '[md-tab]'})\n readonly tabs!: Tab[];\n\n /**\n * The currently selected tab, `null` only when there are no tab children.\n *\n * @export\n */\n get activeTab() {\n return this.tabs.find((tab) => tab.active) ?? null;\n }\n set activeTab(tab: Tab | null) {\n // Ignore setting activeTab to null. As long as there are children, one tab\n // must be selected.\n if (tab) {\n this.activateTab(tab);\n }\n }\n\n /**\n * The index of the currently selected tab.\n *\n * @export\n */\n @property({type: Number, attribute: 'active-tab-index'})\n get activeTabIndex() {\n return this.tabs.findIndex((tab) => tab.active);\n }\n set activeTabIndex(index: number) {\n const activateTabAtIndex = () => {\n const tab = this.tabs[index];\n // Ignore out-of-bound indices.\n if (tab) {\n this.activateTab(tab);\n }\n };\n\n if (!this.slotElement) {\n // This is needed to support setting the activeTabIndex via a lit property\n // binding.\n //\n // ```ts\n // html`\n // <md-tabs .activeTabIndex=${1}>\n // <md-tab>First</md-tab>\n // <md-tab>Second</md-tab>\n // </md-tabs>\n // `;\n // ```\n //\n // It's needed since lit's rendering lifecycle is asynchronous, and the\n // `<slot>` element hasn't rendered, so `tabs` is empty.\n this.updateComplete.then(activateTabAtIndex);\n return;\n }\n\n activateTabAtIndex();\n }\n\n /**\n * Whether or not to automatically select a tab when it is focused.\n */\n @property({type: Boolean, attribute: 'auto-activate'}) autoActivate = false;\n\n @query('.tabs') private readonly tabsScrollerElement!: HTMLElement | null;\n @query('slot') private readonly slotElement!: HTMLSlotElement | null;\n\n private get focusedTab() {\n return this.tabs.find((tab) => tab.matches(':focus-within'));\n }\n\n private readonly internals =\n // Cast needed for closure\n (this as HTMLElement).attachInternals();\n\n constructor() {\n super();\n if (!isServer) {\n this.internals.role = 'tablist';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n this.addEventListener('keyup', this.handleKeyup.bind(this));\n this.addEventListener('focusout', this.handleFocusout.bind(this));\n }\n }\n\n /**\n * Scrolls the toolbar, if overflowing, to the active tab, or the provided\n * tab.\n *\n * @param tabToScrollTo The tab that should be scrolled to. Defaults to the\n * active tab.\n * @return A Promise that resolves after the tab has been scrolled to.\n */\n async scrollToTab(tabToScrollTo?: Tab | null) {\n await this.updateComplete;\n const {tabs} = this;\n tabToScrollTo ??= this.activeTab;\n if (\n !tabToScrollTo ||\n !tabs.includes(tabToScrollTo) ||\n !this.tabsScrollerElement\n ) {\n return;\n }\n\n // wait for tabs to render.\n for (const tab of this.tabs) {\n await tab.updateComplete;\n }\n\n const offset = tabToScrollTo.offsetLeft;\n const extent = tabToScrollTo.offsetWidth;\n const scroll = this.scrollLeft;\n const hostExtent = this.offsetWidth;\n const scrollMargin = 48;\n const min = offset - scrollMargin;\n const max = offset + extent - hostExtent + scrollMargin;\n const to = Math.min(min, Math.max(max, scroll));\n // When a tab is focused, use 'auto' to use the CSS `scroll-behavior`. The\n // default behavior is smooth scrolling. However, when there is not a tab\n // focused on initialization, use 'instant' to immediately bring the focused\n // tab into view.\n const behavior: ScrollBehavior = !this.focusedTab ? 'instant' : 'auto';\n this.tabsScrollerElement.scrollTo({behavior, top: 0, left: to});\n }\n\n protected override render() {\n return html`\n <div class=\"tabs\">\n <slot\n @slotchange=${this.handleSlotChange}\n @click=${this.handleTabClick}></slot>\n </div>\n <md-divider part=\"divider\"></md-divider>\n `;\n }\n\n private async handleTabClick(event: Event) {\n const tab = event.target;\n // Allow event to bubble\n await 0;\n if (event.defaultPrevented || !isTab(tab) || tab.active) {\n return;\n }\n\n this.activateTab(tab);\n }\n\n private activateTab(activeTab: Tab) {\n const {tabs} = this;\n const previousTab = this.activeTab;\n if (!tabs.includes(activeTab) || previousTab === activeTab) {\n // Ignore setting activeTab to a tab element that is not a child.\n return;\n }\n\n for (const tab of tabs) {\n tab.active = tab === activeTab;\n }\n\n if (previousTab) {\n // Don't dispatch a change event if activating a tab when no previous tabs\n // were selected, such as when md-tabs auto-selects the first tab.\n const defaultPrevented = !this.dispatchEvent(\n new Event('change', {bubbles: true, cancelable: true}),\n );\n if (defaultPrevented) {\n for (const tab of tabs) {\n tab.active = tab === previousTab;\n }\n return;\n }\n\n activeTab[ANIMATE_INDICATOR](previousTab);\n }\n\n this.updateFocusableTab(activeTab);\n this.scrollToTab(activeTab);\n }\n\n private updateFocusableTab(focusableTab: Tab) {\n for (const tab of this.tabs) {\n tab.tabIndex = tab === focusableTab ? 0 : -1;\n }\n }\n\n // focus item on keydown and optionally select it\n private async handleKeydown(event: KeyboardEvent) {\n // Allow event to bubble.\n await 0;\n const isLeft = event.key === 'ArrowLeft';\n const isRight = event.key === 'ArrowRight';\n const isHome = event.key === 'Home';\n const isEnd = event.key === 'End';\n // Ignore non-navigation keys\n if (event.defaultPrevented || (!isLeft && !isRight && !isHome && !isEnd)) {\n return;\n }\n\n const {tabs} = this;\n // Don't try to select another tab if there aren't any.\n if (tabs.length < 2) {\n return;\n }\n\n // Prevent default interactions, such as scrolling.\n event.preventDefault();\n\n let indexToFocus: number;\n if (isHome || isEnd) {\n indexToFocus = isHome ? 0 : tabs.length - 1;\n } else {\n // Check if moving forwards or backwards\n const isRtl = getComputedStyle(this).direction === 'rtl';\n const forwards = isRtl ? isLeft : isRight;\n const {focusedTab} = this;\n if (!focusedTab) {\n // If there is not already a tab focused, select the first or last tab\n // based on the direction we're traveling.\n indexToFocus = forwards ? 0 : tabs.length - 1;\n } else {\n const focusedIndex = this.tabs.indexOf(focusedTab);\n indexToFocus = forwards ? focusedIndex + 1 : focusedIndex - 1;\n if (indexToFocus >= tabs.length) {\n // Return to start if moving past the last item.\n indexToFocus = 0;\n } else if (indexToFocus < 0) {\n // Go to end if moving before the first item.\n indexToFocus = tabs.length - 1;\n }\n }\n }\n\n const tabToFocus = tabs[indexToFocus];\n tabToFocus.focus();\n if (this.autoActivate) {\n this.activateTab(tabToFocus);\n } else {\n this.updateFocusableTab(tabToFocus);\n }\n }\n\n // scroll to item on keyup.\n private handleKeyup() {\n this.scrollToTab(this.focusedTab ?? this.activeTab);\n }\n\n private handleFocusout() {\n // restore focus to selected item when blurring the tab bar.\n if (this.matches(':focus-within')) {\n return;\n }\n\n const {activeTab} = this;\n if (activeTab) {\n this.updateFocusableTab(activeTab);\n }\n }\n\n private handleSlotChange() {\n const firstTab = this.tabs[0];\n if (!this.activeTab && firstTab) {\n // If the active tab was removed, auto-select the first one. There should\n // always be a selected tab while the bar has children.\n this.activateTab(firstTab);\n }\n\n // When children shift, ensure the active tab is visible. For example, if\n // many children are added before the active tab, it'd be pushed off screen.\n // This ensures it stays visible.\n this.scrollToTab(this.activeTab);\n }\n}\n\nfunction isTab(element: unknown): element is Tab {\n return element instanceof HTMLElement && element.hasAttribute('md-tab');\n}\n"]}
|
package/tabs/primary-tab.js
CHANGED
|
@@ -15,10 +15,11 @@ import { styles as sharedStyles } from './internal/tab-styles.js';
|
|
|
15
15
|
* @final
|
|
16
16
|
* @suppress {visibility}
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
let MdPrimaryTab = class MdPrimaryTab extends PrimaryTab {
|
|
19
19
|
};
|
|
20
20
|
MdPrimaryTab.styles = [sharedStyles, primaryStyles];
|
|
21
21
|
MdPrimaryTab = __decorate([
|
|
22
22
|
customElement('md-primary-tab')
|
|
23
23
|
], MdPrimaryTab);
|
|
24
|
+
export { MdPrimaryTab };
|
|
24
25
|
//# sourceMappingURL=primary-tab.js.map
|
package/tabs/primary-tab.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primary-tab.js","sourceRoot":"","sources":["primary-tab.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,UAAU,EAAC,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAC,MAAM,IAAI,aAAa,EAAC,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAQhE,8BAA8B;AAC9B;;;;;GAKG;AAEI,
|
|
1
|
+
{"version":3,"file":"primary-tab.js","sourceRoot":"","sources":["primary-tab.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,UAAU,EAAC,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAC,MAAM,IAAI,aAAa,EAAC,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAQhE,8BAA8B;AAC9B;;;;;GAKG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;;AAC1B,mBAAM,GAAwB,CAAC,YAAY,EAAE,aAAa,CAAC,AAArD,CAAsD;AADjE,YAAY;IADxB,aAAa,CAAC,gBAAgB,CAAC;GACnB,YAAY,CAExB","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {CSSResultOrNative} from 'lit';\nimport {customElement} from 'lit/decorators.js';\n\nimport {PrimaryTab} from './internal/primary-tab.js';\nimport {styles as primaryStyles} from './internal/primary-tab-styles.js';\nimport {styles as sharedStyles} from './internal/tab-styles.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-primary-tab': MdPrimaryTab;\n }\n}\n\n// TODO(b/267336507): add docs\n/**\n * @summary Tab allow users to display a tab within a Tabs.\n *\n * @final\n * @suppress {visibility}\n */\n@customElement('md-primary-tab')\nexport class MdPrimaryTab extends PrimaryTab {\n static override styles: CSSResultOrNative[] = [sharedStyles, primaryStyles];\n}\n"]}
|
package/tabs/secondary-tab.js
CHANGED
|
@@ -15,10 +15,11 @@ import { styles as sharedStyles } from './internal/tab-styles.js';
|
|
|
15
15
|
* @final
|
|
16
16
|
* @suppress {visibility}
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
let MdSecondaryTab = class MdSecondaryTab extends SecondaryTab {
|
|
19
19
|
};
|
|
20
20
|
MdSecondaryTab.styles = [sharedStyles, secondaryStyles];
|
|
21
21
|
MdSecondaryTab = __decorate([
|
|
22
22
|
customElement('md-secondary-tab')
|
|
23
23
|
], MdSecondaryTab);
|
|
24
|
+
export { MdSecondaryTab };
|
|
24
25
|
//# sourceMappingURL=secondary-tab.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secondary-tab.js","sourceRoot":"","sources":["secondary-tab.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAC,MAAM,IAAI,eAAe,EAAC,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAQhE,8BAA8B;AAC9B;;;;;GAKG;AAEI,
|
|
1
|
+
{"version":3,"file":"secondary-tab.js","sourceRoot":"","sources":["secondary-tab.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAC,MAAM,IAAI,eAAe,EAAC,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAQhE,8BAA8B;AAC9B;;;;;GAKG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,YAAY;;AAC9B,qBAAM,GAAwB,CAAC,YAAY,EAAE,eAAe,CAAC,AAAvD,CAAwD;AADnE,cAAc;IAD1B,aAAa,CAAC,kBAAkB,CAAC;GACrB,cAAc,CAE1B","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {CSSResultOrNative} from 'lit';\nimport {customElement} from 'lit/decorators.js';\n\nimport {SecondaryTab} from './internal/secondary-tab.js';\nimport {styles as secondaryStyles} from './internal/secondary-tab-styles.js';\nimport {styles as sharedStyles} from './internal/tab-styles.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-secondary-tab': MdSecondaryTab;\n }\n}\n\n// TODO(b/267336507): add docs\n/**\n * @summary Tab allow users to display a tab within a Tabs.\n *\n * @final\n * @suppress {visibility}\n */\n@customElement('md-secondary-tab')\nexport class MdSecondaryTab extends SecondaryTab {\n static override styles: CSSResultOrNative[] = [sharedStyles, secondaryStyles];\n}\n"]}
|
package/tabs/tabs.js
CHANGED
|
@@ -14,10 +14,11 @@ import { styles } from './internal/tabs-styles.js';
|
|
|
14
14
|
* @final
|
|
15
15
|
* @suppress {visibility}
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
let MdTabs = class MdTabs extends Tabs {
|
|
18
18
|
};
|
|
19
19
|
MdTabs.styles = [styles];
|
|
20
20
|
MdTabs = __decorate([
|
|
21
21
|
customElement('md-tabs')
|
|
22
22
|
], MdTabs);
|
|
23
|
+
export { MdTabs };
|
|
23
24
|
//# sourceMappingURL=tabs.js.map
|
package/tabs/tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["tabs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AAQjD,8BAA8B;AAC9B;;;;;GAKG;AAEI,
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["tabs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AAQjD,8BAA8B;AAC9B;;;;;GAKG;AAEI,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,IAAI;;AACd,aAAM,GAAwB,CAAC,MAAM,CAAC,AAAhC,CAAiC;AAD5C,MAAM;IADlB,aAAa,CAAC,SAAS,CAAC;GACZ,MAAM,CAElB","sourcesContent":["/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {CSSResultOrNative} from 'lit';\nimport {customElement} from 'lit/decorators.js';\n\nimport {Tabs} from './internal/tabs.js';\nimport {styles} from './internal/tabs-styles.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-tabs': MdTabs;\n }\n}\n\n// TODO(b/267336507): add docs\n/**\n * @summary Tabs displays a list of selectable tabs.\n *\n * @final\n * @suppress {visibility}\n */\n@customElement('md-tabs')\nexport class MdTabs extends Tabs {\n static override styles: CSSResultOrNative[] = [styles];\n}\n"]}
|
package/testing/harness.js.map
CHANGED
|
@@ -1 +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"]}
|
|
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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-pseudo-classes.js","sourceRoot":"","sources":["transform-pseudo-classes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,SAAS;IACT,WAAW;IACX,QAAQ;IACR,gBAAgB;IAChB,eAAe;IACf,QAAQ;IACR,UAAU;IACV,OAAO;IACP,SAAS;IACT,UAAU;IACV,eAAe;IACf,QAAQ;IACR,UAAU;CACX,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAmB;IAC3D,OAAO,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,sBAAsB,GAAG,IAAI,OAAO,EAAiB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAAoC,EACpC,aAAa,GAAG,6BAA6B;IAE7C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;
|
|
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"]}
|