@spectrum-web-components/button 1.1.0-beta.5 → 1.1.0-beta.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -332,7 +332,7 @@ Events handlers for clicks and other user actions can be registered on a
332
332
  <sp-button onclick="spAlert(this, '<sp-button> clicked!')">Click me</sp-button>
333
333
  ```
334
334
 
335
- In addition to handling events like a native `<button>` HTML element, one can also use a `<sp-button>` in place of the `<a>` element by using the `href` and optional `target` attribute.
335
+ In addition to handling events like a native `<button>` HTML element, one can also use a `<sp-button>` in place of the `<a>` HTML element by using the `href` and optional `target` attribute.
336
336
 
337
337
  ```html
338
338
  <sp-button
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/button",
3
- "version": "1.1.0-beta.5",
3
+ "version": "1.1.0-beta.50",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -83,13 +83,14 @@
83
83
  "lit-html"
84
84
  ],
85
85
  "dependencies": {
86
- "@spectrum-web-components/base": "^1.1.0-beta.5",
87
- "@spectrum-web-components/clear-button": "^1.1.0-beta.5",
88
- "@spectrum-web-components/close-button": "^1.1.0-beta.5",
89
- "@spectrum-web-components/icon": "^1.1.0-beta.5",
90
- "@spectrum-web-components/icons-ui": "^1.1.0-beta.5",
91
- "@spectrum-web-components/progress-circle": "^1.1.0-beta.5",
92
- "@spectrum-web-components/shared": "^1.1.0-beta.5"
86
+ "@spectrum-web-components/base": "^1.1.0-beta.50",
87
+ "@spectrum-web-components/clear-button": "^1.1.0-beta.50",
88
+ "@spectrum-web-components/close-button": "^1.1.0-beta.50",
89
+ "@spectrum-web-components/icon": "^1.1.0-beta.50",
90
+ "@spectrum-web-components/icons-ui": "^1.1.0-beta.50",
91
+ "@spectrum-web-components/progress-circle": "^1.1.0-beta.50",
92
+ "@spectrum-web-components/reactive-controllers": "^1.1.0-beta.50",
93
+ "@spectrum-web-components/shared": "^1.1.0-beta.50"
93
94
  },
94
95
  "devDependencies": {
95
96
  "@spectrum-css/button": "^14.0.0-s2-foundations.18"
@@ -100,5 +101,5 @@
100
101
  "./sp-*.js",
101
102
  "./**/*.dev.js"
102
103
  ],
103
- "gitHead": "4f2d700a57003158f5d240a87b37c162f6a8395c"
104
+ "gitHead": "c62949f86b91708496995babc3db481489fddb14"
104
105
  }
@@ -14,13 +14,19 @@ declare const ButtonBase_base: typeof Focusable & {
14
14
  export declare class ButtonBase extends ButtonBase_base {
15
15
  static get styles(): CSSResultArray;
16
16
  active: boolean;
17
+ /**
18
+ * The default behavior of the button.
19
+ * Possible values are: `button` (default), `submit`, and `reset`.
20
+ */
17
21
  type: 'button' | 'submit' | 'reset';
22
+ /**
23
+ * HTML anchor element that component clicks by proxy
24
+ */
18
25
  private anchorElement;
19
26
  get focusElement(): HTMLElement;
20
27
  protected get hasLabel(): boolean;
21
28
  protected get buttonContent(): TemplateResult[];
22
29
  constructor();
23
- click(): void;
24
30
  private handleClickCapture;
25
31
  private proxyFocus;
26
32
  private shouldProxyClick;
@@ -54,15 +54,6 @@ export class ButtonBase extends ObserveSlotText(LikeAnchor(Focusable), "", [
54
54
  ];
55
55
  return content;
56
56
  }
57
- click() {
58
- if (this.disabled) {
59
- return;
60
- }
61
- if (this.shouldProxyClick()) {
62
- return;
63
- }
64
- super.click();
65
- }
66
57
  handleClickCapture(event) {
67
58
  if (this.disabled) {
68
59
  event.preventDefault();
@@ -70,6 +61,9 @@ export class ButtonBase extends ObserveSlotText(LikeAnchor(Focusable), "", [
70
61
  event.stopPropagation();
71
62
  return false;
72
63
  }
64
+ if (this.shouldProxyClick()) {
65
+ return;
66
+ }
73
67
  }
74
68
  proxyFocus() {
75
69
  this.focus();
@@ -149,12 +143,10 @@ export class ButtonBase extends ObserveSlotText(LikeAnchor(Focusable), "", [
149
143
  if (!this.hasAttribute("role") || this.getAttribute("role") === "button") {
150
144
  this.setAttribute("role", "link");
151
145
  }
152
- this.removeEventListener("click", this.shouldProxyClick);
153
146
  } else {
154
147
  if (!this.hasAttribute("role") || this.getAttribute("role") === "link") {
155
148
  this.setAttribute("role", "button");
156
149
  }
157
- this.addEventListener("click", this.shouldProxyClick);
158
150
  }
159
151
  }
160
152
  firstUpdated(changed) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["ButtonBase.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';\nimport buttonStyles from './button-base.css.js';\n\n/**\n * @slot - text content to be displayed in the Button element\n * @slot icon - icon element(s) to display at the start of the button\n */\nexport class ButtonBase extends ObserveSlotText(LikeAnchor(Focusable), '', [\n 'sp-overlay,sp-tooltip',\n]) {\n public static override get styles(): CSSResultArray {\n return [buttonStyles];\n }\n\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n @property({ type: String })\n public type: 'button' | 'submit' | 'reset' = 'button';\n\n @query('.anchor')\n private anchorElement!: HTMLButtonElement;\n\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasLabel(): boolean {\n return this.slotHasContent;\n }\n\n protected get buttonContent(): TemplateResult[] {\n const content = [\n html`\n <slot name=\"icon\" ?icon-only=${!this.hasLabel}></slot>\n `,\n html`\n <span id=\"label\">\n <slot @slotchange=${this.manageTextObservedSlot}></slot>\n </span>\n `,\n ];\n return content;\n }\n\n constructor() {\n super();\n this.proxyFocus = this.proxyFocus.bind(this);\n\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n }\n\n public override click(): void {\n if (this.disabled) {\n return;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n\n super.click();\n }\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n return false;\n }\n }\n\n private proxyFocus(): void {\n this.focus();\n }\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n this.anchorElement.click();\n handled = true;\n } else if (this.type !== 'button') {\n const proxy = document.createElement('button');\n proxy.type = this.type;\n this.insertAdjacentElement('afterend', proxy);\n proxy.click();\n proxy.remove();\n handled = true;\n }\n return handled;\n }\n\n public override renderAnchor(): TemplateResult {\n return html`\n ${this.buttonContent}\n ${super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })}\n `;\n }\n\n protected renderButton(): TemplateResult {\n return html`\n ${this.buttonContent}\n `;\n }\n\n protected override render(): TemplateResult {\n return this.href && this.href.length > 0\n ? this.renderAnchor()\n : this.renderButton();\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n event.preventDefault();\n if (typeof this.href === 'undefined') {\n this.addEventListener('keyup', this.handleKeyup);\n this.active = true;\n }\n break;\n default:\n break;\n }\n }\n\n private handleKeypress(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Enter':\n case 'NumpadEnter':\n this.click();\n break;\n default:\n break;\n }\n }\n\n protected handleKeyup(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n this.removeEventListener('keyup', this.handleKeyup);\n this.active = false;\n this.click();\n break;\n default:\n break;\n }\n }\n\n private manageAnchor(): void {\n if (this.href && this.href.length > 0) {\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'button'\n ) {\n this.setAttribute('role', 'link');\n }\n this.removeEventListener('click', this.shouldProxyClick);\n } else {\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'link'\n ) {\n this.setAttribute('role', 'button');\n }\n this.addEventListener('click', this.shouldProxyClick);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n if (changed.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n this.manageAnchor();\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('keypress', this.handleKeypress);\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has('href')) {\n this.manageAnchor();\n }\n\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n }\n protected override update(changes: PropertyValues): void {\n super.update(changes);\n if (changes.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';\nimport buttonStyles from './button-base.css.js';\n\n/**\n * @slot - text content to be displayed in the Button element\n * @slot icon - icon element(s) to display at the start of the button\n */\nexport class ButtonBase extends ObserveSlotText(LikeAnchor(Focusable), '', [\n 'sp-overlay,sp-tooltip',\n]) {\n public static override get styles(): CSSResultArray {\n return [buttonStyles];\n }\n\n // TODO we need to document this property for consumers,\n // as it's not a 1:1 equivalent to active\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n /**\n * The default behavior of the button.\n * Possible values are: `button` (default), `submit`, and `reset`.\n */\n @property({ type: String })\n public type: 'button' | 'submit' | 'reset' = 'button';\n\n /**\n * HTML anchor element that component clicks by proxy\n */\n @query('.anchor')\n private anchorElement!: HTMLAnchorElement;\n\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasLabel(): boolean {\n return this.slotHasContent;\n }\n\n protected get buttonContent(): TemplateResult[] {\n const content = [\n html`\n <slot name=\"icon\" ?icon-only=${!this.hasLabel}></slot>\n `,\n html`\n <span id=\"label\">\n <slot @slotchange=${this.manageTextObservedSlot}></slot>\n </span>\n `,\n ];\n return content;\n }\n\n constructor() {\n super();\n this.proxyFocus = this.proxyFocus.bind(this);\n\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n }\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n return false;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n }\n\n private proxyFocus(): void {\n this.focus();\n }\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n // click HTML anchor element by proxy\n this.anchorElement.click();\n handled = true;\n // if the button type is `submit` or `reset`\n } else if (this.type !== 'button') {\n // create an HTML Button Element by proxy, click it, and remove it\n const proxy = document.createElement('button');\n proxy.type = this.type;\n this.insertAdjacentElement('afterend', proxy);\n proxy.click();\n proxy.remove();\n handled = true;\n }\n return handled;\n }\n\n public override renderAnchor(): TemplateResult {\n return html`\n ${this.buttonContent}\n ${super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })}\n `;\n }\n\n protected renderButton(): TemplateResult {\n return html`\n ${this.buttonContent}\n `;\n }\n\n protected override render(): TemplateResult {\n return this.href && this.href.length > 0\n ? this.renderAnchor()\n : this.renderButton();\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n event.preventDefault();\n // allows button to activate when `Space` is pressed\n if (typeof this.href === 'undefined') {\n this.addEventListener('keyup', this.handleKeyup);\n this.active = true;\n }\n break;\n default:\n break;\n }\n }\n\n private handleKeypress(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Enter':\n case 'NumpadEnter':\n // allows button or link to be activated with `Enter` and `NumpadEnter`\n this.click();\n break;\n default:\n break;\n }\n }\n\n protected handleKeyup(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n this.removeEventListener('keyup', this.handleKeyup);\n this.active = false;\n this.click();\n break;\n default:\n break;\n }\n }\n\n private manageAnchor(): void {\n // for a link\n if (this.href && this.href.length > 0) {\n // if the role is set to button\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'button'\n ) {\n // change role to link\n this.setAttribute('role', 'link');\n }\n // else for a button\n } else {\n // if the role is set to link\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'link'\n ) {\n // change role to button\n this.setAttribute('role', 'button');\n }\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n if (changed.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n this.manageAnchor();\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('keypress', this.handleKeypress);\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has('href')) {\n this.manageAnchor();\n }\n\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n }\n protected override update(changes: PropertyValues): void {\n super.update(changes);\n if (changes.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/src/ButtonBase.js CHANGED
@@ -1,13 +1,13 @@
1
- "use strict";var d=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var s=(a,i,e,t)=>{for(var r=t>1?void 0:t?u(i,e):i,n=a.length-1,l;n>=0;n--)(l=a[n])&&(r=(t?l(i,e,r):l(r))||r);return t&&r&&d(i,e,r),r};import{html as o}from"@spectrum-web-components/base";import{property as h,query as c}from"@spectrum-web-components/base/src/decorators.js";import{LikeAnchor as p}from"@spectrum-web-components/shared/src/like-anchor.js";import{Focusable as b}from"@spectrum-web-components/shared/src/focusable.js";import{ObserveSlotText as f}from"@spectrum-web-components/shared/src/observe-slot-text.js";import v from"./button-base.css.js";export class ButtonBase extends f(p(b),"",["sp-overlay,sp-tooltip"]){constructor(){super();this.active=!1;this.type="button";this.proxyFocus=this.proxyFocus.bind(this),this.addEventListener("click",this.handleClickCapture,{capture:!0})}static get styles(){return[v]}get focusElement(){return this}get hasLabel(){return this.slotHasContent}get buttonContent(){return[o`
1
+ "use strict";var d=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var s=(a,i,e,t)=>{for(var r=t>1?void 0:t?u(i,e):i,n=a.length-1,l;n>=0;n--)(l=a[n])&&(r=(t?l(i,e,r):l(r))||r);return t&&r&&d(i,e,r),r};import{html as o}from"@spectrum-web-components/base";import{property as h,query as p}from"@spectrum-web-components/base/src/decorators.js";import{LikeAnchor as c}from"@spectrum-web-components/shared/src/like-anchor.js";import{Focusable as b}from"@spectrum-web-components/shared/src/focusable.js";import{ObserveSlotText as f}from"@spectrum-web-components/shared/src/observe-slot-text.js";import m from"./button-base.css.js";export class ButtonBase extends f(c(b),"",["sp-overlay,sp-tooltip"]){constructor(){super();this.active=!1;this.type="button";this.proxyFocus=this.proxyFocus.bind(this),this.addEventListener("click",this.handleClickCapture,{capture:!0})}static get styles(){return[m]}get focusElement(){return this}get hasLabel(){return this.slotHasContent}get buttonContent(){return[o`
2
2
  <slot name="icon" ?icon-only=${!this.hasLabel}></slot>
3
3
  `,o`
4
4
  <span id="label">
5
5
  <slot @slotchange=${this.manageTextObservedSlot}></slot>
6
6
  </span>
7
- `]}click(){this.disabled||this.shouldProxyClick()||super.click()}handleClickCapture(e){if(this.disabled)return e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),!1}proxyFocus(){this.focus()}shouldProxyClick(){let e=!1;if(this.anchorElement)this.anchorElement.click(),e=!0;else if(this.type!=="button"){const t=document.createElement("button");t.type=this.type,this.insertAdjacentElement("afterend",t),t.click(),t.remove(),e=!0}return e}renderAnchor(){return o`
7
+ `]}handleClickCapture(e){if(this.disabled)return e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),!1;this.shouldProxyClick()}proxyFocus(){this.focus()}shouldProxyClick(){let e=!1;if(this.anchorElement)this.anchorElement.click(),e=!0;else if(this.type!=="button"){const t=document.createElement("button");t.type=this.type,this.insertAdjacentElement("afterend",t),t.click(),t.remove(),e=!0}return e}renderAnchor(){return o`
8
8
  ${this.buttonContent}
9
9
  ${super.renderAnchor({id:"button",ariaHidden:!0,className:"button anchor hidden"})}
10
10
  `}renderButton(){return o`
11
11
  ${this.buttonContent}
12
- `}render(){return this.href&&this.href.length>0?this.renderAnchor():this.renderButton()}handleKeydown(e){const{code:t}=e;switch(t){case"Space":e.preventDefault(),typeof this.href=="undefined"&&(this.addEventListener("keyup",this.handleKeyup),this.active=!0);break;default:break}}handleKeypress(e){const{code:t}=e;switch(t){case"Enter":case"NumpadEnter":this.click();break;default:break}}handleKeyup(e){const{code:t}=e;switch(t){case"Space":this.removeEventListener("keyup",this.handleKeyup),this.active=!1,this.click();break;default:break}}manageAnchor(){this.href&&this.href.length>0?((!this.hasAttribute("role")||this.getAttribute("role")==="button")&&this.setAttribute("role","link"),this.removeEventListener("click",this.shouldProxyClick)):((!this.hasAttribute("role")||this.getAttribute("role")==="link")&&this.setAttribute("role","button"),this.addEventListener("click",this.shouldProxyClick))}firstUpdated(e){super.firstUpdated(e),this.hasAttribute("tabindex")||this.setAttribute("tabindex","0"),e.has("label")&&(this.label?this.setAttribute("aria-label",this.label):this.removeAttribute("aria-label")),this.manageAnchor(),this.addEventListener("keydown",this.handleKeydown),this.addEventListener("keypress",this.handleKeypress)}updated(e){super.updated(e),e.has("href")&&this.manageAnchor(),this.anchorElement&&(this.anchorElement.addEventListener("focus",this.proxyFocus),this.anchorElement.tabIndex=-1)}update(e){super.update(e),e.has("label")&&(this.label?this.setAttribute("aria-label",this.label):this.removeAttribute("aria-label"))}}s([h({type:Boolean,reflect:!0})],ButtonBase.prototype,"active",2),s([h({type:String})],ButtonBase.prototype,"type",2),s([c(".anchor")],ButtonBase.prototype,"anchorElement",2);
12
+ `}render(){return this.href&&this.href.length>0?this.renderAnchor():this.renderButton()}handleKeydown(e){const{code:t}=e;switch(t){case"Space":e.preventDefault(),typeof this.href=="undefined"&&(this.addEventListener("keyup",this.handleKeyup),this.active=!0);break;default:break}}handleKeypress(e){const{code:t}=e;switch(t){case"Enter":case"NumpadEnter":this.click();break;default:break}}handleKeyup(e){const{code:t}=e;switch(t){case"Space":this.removeEventListener("keyup",this.handleKeyup),this.active=!1,this.click();break;default:break}}manageAnchor(){this.href&&this.href.length>0?(!this.hasAttribute("role")||this.getAttribute("role")==="button")&&this.setAttribute("role","link"):(!this.hasAttribute("role")||this.getAttribute("role")==="link")&&this.setAttribute("role","button")}firstUpdated(e){super.firstUpdated(e),this.hasAttribute("tabindex")||this.setAttribute("tabindex","0"),e.has("label")&&(this.label?this.setAttribute("aria-label",this.label):this.removeAttribute("aria-label")),this.manageAnchor(),this.addEventListener("keydown",this.handleKeydown),this.addEventListener("keypress",this.handleKeypress)}updated(e){super.updated(e),e.has("href")&&this.manageAnchor(),this.anchorElement&&(this.anchorElement.addEventListener("focus",this.proxyFocus),this.anchorElement.tabIndex=-1)}update(e){super.update(e),e.has("label")&&(this.label?this.setAttribute("aria-label",this.label):this.removeAttribute("aria-label"))}}s([h({type:Boolean,reflect:!0})],ButtonBase.prototype,"active",2),s([h({type:String})],ButtonBase.prototype,"type",2),s([p(".anchor")],ButtonBase.prototype,"anchorElement",2);
13
13
  //# sourceMappingURL=ButtonBase.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["ButtonBase.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';\nimport buttonStyles from './button-base.css.js';\n\n/**\n * @slot - text content to be displayed in the Button element\n * @slot icon - icon element(s) to display at the start of the button\n */\nexport class ButtonBase extends ObserveSlotText(LikeAnchor(Focusable), '', [\n 'sp-overlay,sp-tooltip',\n]) {\n public static override get styles(): CSSResultArray {\n return [buttonStyles];\n }\n\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n @property({ type: String })\n public type: 'button' | 'submit' | 'reset' = 'button';\n\n @query('.anchor')\n private anchorElement!: HTMLButtonElement;\n\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasLabel(): boolean {\n return this.slotHasContent;\n }\n\n protected get buttonContent(): TemplateResult[] {\n const content = [\n html`\n <slot name=\"icon\" ?icon-only=${!this.hasLabel}></slot>\n `,\n html`\n <span id=\"label\">\n <slot @slotchange=${this.manageTextObservedSlot}></slot>\n </span>\n `,\n ];\n return content;\n }\n\n constructor() {\n super();\n this.proxyFocus = this.proxyFocus.bind(this);\n\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n }\n\n public override click(): void {\n if (this.disabled) {\n return;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n\n super.click();\n }\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n return false;\n }\n }\n\n private proxyFocus(): void {\n this.focus();\n }\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n this.anchorElement.click();\n handled = true;\n } else if (this.type !== 'button') {\n const proxy = document.createElement('button');\n proxy.type = this.type;\n this.insertAdjacentElement('afterend', proxy);\n proxy.click();\n proxy.remove();\n handled = true;\n }\n return handled;\n }\n\n public override renderAnchor(): TemplateResult {\n return html`\n ${this.buttonContent}\n ${super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })}\n `;\n }\n\n protected renderButton(): TemplateResult {\n return html`\n ${this.buttonContent}\n `;\n }\n\n protected override render(): TemplateResult {\n return this.href && this.href.length > 0\n ? this.renderAnchor()\n : this.renderButton();\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n event.preventDefault();\n if (typeof this.href === 'undefined') {\n this.addEventListener('keyup', this.handleKeyup);\n this.active = true;\n }\n break;\n default:\n break;\n }\n }\n\n private handleKeypress(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Enter':\n case 'NumpadEnter':\n this.click();\n break;\n default:\n break;\n }\n }\n\n protected handleKeyup(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n this.removeEventListener('keyup', this.handleKeyup);\n this.active = false;\n this.click();\n break;\n default:\n break;\n }\n }\n\n private manageAnchor(): void {\n if (this.href && this.href.length > 0) {\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'button'\n ) {\n this.setAttribute('role', 'link');\n }\n this.removeEventListener('click', this.shouldProxyClick);\n } else {\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'link'\n ) {\n this.setAttribute('role', 'button');\n }\n this.addEventListener('click', this.shouldProxyClick);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n if (changed.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n this.manageAnchor();\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('keypress', this.handleKeypress);\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has('href')) {\n this.manageAnchor();\n }\n\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n }\n protected override update(changes: PropertyValues): void {\n super.update(changes);\n if (changes.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';\nimport buttonStyles from './button-base.css.js';\n\n/**\n * @slot - text content to be displayed in the Button element\n * @slot icon - icon element(s) to display at the start of the button\n */\nexport class ButtonBase extends ObserveSlotText(LikeAnchor(Focusable), '', [\n 'sp-overlay,sp-tooltip',\n]) {\n public static override get styles(): CSSResultArray {\n return [buttonStyles];\n }\n\n // TODO we need to document this property for consumers,\n // as it's not a 1:1 equivalent to active\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n /**\n * The default behavior of the button.\n * Possible values are: `button` (default), `submit`, and `reset`.\n */\n @property({ type: String })\n public type: 'button' | 'submit' | 'reset' = 'button';\n\n /**\n * HTML anchor element that component clicks by proxy\n */\n @query('.anchor')\n private anchorElement!: HTMLAnchorElement;\n\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get hasLabel(): boolean {\n return this.slotHasContent;\n }\n\n protected get buttonContent(): TemplateResult[] {\n const content = [\n html`\n <slot name=\"icon\" ?icon-only=${!this.hasLabel}></slot>\n `,\n html`\n <span id=\"label\">\n <slot @slotchange=${this.manageTextObservedSlot}></slot>\n </span>\n `,\n ];\n return content;\n }\n\n constructor() {\n super();\n this.proxyFocus = this.proxyFocus.bind(this);\n\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n }\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n return false;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n }\n\n private proxyFocus(): void {\n this.focus();\n }\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n // click HTML anchor element by proxy\n this.anchorElement.click();\n handled = true;\n // if the button type is `submit` or `reset`\n } else if (this.type !== 'button') {\n // create an HTML Button Element by proxy, click it, and remove it\n const proxy = document.createElement('button');\n proxy.type = this.type;\n this.insertAdjacentElement('afterend', proxy);\n proxy.click();\n proxy.remove();\n handled = true;\n }\n return handled;\n }\n\n public override renderAnchor(): TemplateResult {\n return html`\n ${this.buttonContent}\n ${super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })}\n `;\n }\n\n protected renderButton(): TemplateResult {\n return html`\n ${this.buttonContent}\n `;\n }\n\n protected override render(): TemplateResult {\n return this.href && this.href.length > 0\n ? this.renderAnchor()\n : this.renderButton();\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n event.preventDefault();\n // allows button to activate when `Space` is pressed\n if (typeof this.href === 'undefined') {\n this.addEventListener('keyup', this.handleKeyup);\n this.active = true;\n }\n break;\n default:\n break;\n }\n }\n\n private handleKeypress(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Enter':\n case 'NumpadEnter':\n // allows button or link to be activated with `Enter` and `NumpadEnter`\n this.click();\n break;\n default:\n break;\n }\n }\n\n protected handleKeyup(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n this.removeEventListener('keyup', this.handleKeyup);\n this.active = false;\n this.click();\n break;\n default:\n break;\n }\n }\n\n private manageAnchor(): void {\n // for a link\n if (this.href && this.href.length > 0) {\n // if the role is set to button\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'button'\n ) {\n // change role to link\n this.setAttribute('role', 'link');\n }\n // else for a button\n } else {\n // if the role is set to link\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'link'\n ) {\n // change role to button\n this.setAttribute('role', 'button');\n }\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n if (changed.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n this.manageAnchor();\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('keypress', this.handleKeypress);\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has('href')) {\n this.manageAnchor();\n }\n\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n }\n protected override update(changes: PropertyValues): void {\n super.update(changes);\n if (changes.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["html", "property", "query", "LikeAnchor", "Focusable", "ObserveSlotText", "buttonStyles", "event", "handled", "proxy", "code", "changed", "changes", "__decorateClass"]
7
7
  }
@@ -14,6 +14,7 @@ import {
14
14
  findAccessibilityNode,
15
15
  sendKeys
16
16
  } from "@web/test-runner-commands";
17
+ import { sendMouse } from "../../../test/plugins/browser.js";
17
18
  import { spy, stub } from "sinon";
18
19
  describe("Button", () => {
19
20
  testForLitDevWarnings(
@@ -172,6 +173,32 @@ describe("Button", () => {
172
173
  expect(el).to.not.be.undefined;
173
174
  expect(el.textContent).to.include("With Target");
174
175
  });
176
+ it("allows link click", async () => {
177
+ var _a, _b;
178
+ let clicked = false;
179
+ const el = await fixture(html`
180
+ <sp-button href="#top">Button as link</sp-button>
181
+ `);
182
+ await elementUpdated(el);
183
+ (_b = (_a = el.shadowRoot) == null ? void 0 : _a.querySelector(".anchor")) == null ? void 0 : _b.addEventListener("click", (event) => {
184
+ event.preventDefault();
185
+ clicked = true;
186
+ });
187
+ const rect = el.getBoundingClientRect();
188
+ await sendMouse({
189
+ steps: [
190
+ {
191
+ position: [
192
+ rect.left + rect.width / 2,
193
+ rect.top + rect.height / 2
194
+ ],
195
+ type: "click"
196
+ }
197
+ ]
198
+ });
199
+ await elementUpdated(el);
200
+ expect(clicked).to.be.true;
201
+ });
175
202
  it("accepts shift+tab interactions", async () => {
176
203
  let focusedCount = 0;
177
204
  const el = await fixture(html`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["button.test.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport '@spectrum-web-components/button/sp-button.js';\nimport { Button } from '@spectrum-web-components/button';\nimport {\n elementUpdated,\n expect,\n fixture,\n html,\n nextFrame,\n waitUntil,\n} from '@open-wc/testing';\nimport { testForLitDevWarnings } from '../../../test/testing-helpers.js';\nimport {\n a11ySnapshot,\n findAccessibilityNode,\n sendKeys,\n} from '@web/test-runner-commands';\nimport { spy, stub } from 'sinon';\n\ntype TestableButtonType = {\n hasLabel: boolean;\n};\n\ndescribe('Button', () => {\n testForLitDevWarnings(\n async () =>\n await fixture<Button>(html`\n <sp-button>Button</sp-button>\n `)\n );\n describe('dev mode', () => {\n let consoleWarnStub!: ReturnType<typeof stub>;\n before(() => {\n window.__swc.verbose = true;\n consoleWarnStub = stub(console, 'warn');\n });\n afterEach(() => {\n consoleWarnStub.resetHistory();\n });\n after(() => {\n window.__swc.verbose = false;\n consoleWarnStub.restore();\n });\n\n it('warns in devMode when white/black variant is provided', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"white\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(consoleWarnStub.called).to.be.true;\n\n const spyCall = consoleWarnStub.getCall(0);\n expect(\n (spyCall.args.at(0) as string).includes('deprecated'),\n 'confirm deprecated variant warning'\n ).to.be.true;\n expect(spyCall.args.at(-1), 'confirm `data` shape').to.deep.equal({\n data: {\n localName: 'sp-button',\n type: 'api',\n level: 'deprecation',\n },\n });\n });\n\n it('loads default', async () => {\n const el = await fixture<Button>(html`\n <sp-button>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('Button');\n await expect(el).to.be.accessible();\n\n // Applies a default variant as an stylable attribute\n expect(el.variant).to.equal('accent');\n expect(el.getAttribute('variant')).to.equal('accent');\n });\n it('loads default w/ an icon', async () => {\n const el = await fixture<Button>(html`\n <sp-button label=\"\">\n Button\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('Button');\n expect(!(el as unknown as { hasIcon: boolean }).hasIcon);\n await expect(el).to.be.accessible();\n });\n it('loads default only icon', async () => {\n const el = await fixture<Button>(html`\n <sp-button label=\"Button\" icon-only>\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n await expect(el).to.be.accessible();\n });\n it('has a stable/predictable `updateComplete`', async () => {\n const test = await fixture<HTMLDivElement>(html`\n <div></div>\n `);\n\n let keydownTime = -1;\n let updateComplete1 = -1;\n let updateComplete2 = -1;\n\n const el = document.createElement('sp-button');\n el.autofocus = true;\n el.addEventListener('keydown', () => {\n keydownTime = performance.now();\n });\n el.updateComplete.then(() => {\n updateComplete1 = performance.now();\n });\n el.updateComplete.then(() => {\n updateComplete2 = performance.now();\n });\n test.append(el);\n // don't use elementUpdated(), as it is under test...\n await nextFrame();\n await nextFrame();\n await nextFrame();\n await nextFrame();\n\n expect(keydownTime, 'keydown happened').to.not.eq(-1);\n expect(updateComplete1, 'first update complete happened').to.not.eq(\n -1\n );\n expect(updateComplete2, 'first update complete happened').to.not.eq(\n -1\n );\n expect(updateComplete1).lte(updateComplete2);\n expect(updateComplete2).lte(keydownTime);\n });\n it('manages \"role\"', async () => {\n const el = await fixture<Button>(html`\n <sp-button>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.getAttribute('role')).to.equal('button');\n\n el.setAttribute('href', '#');\n\n await elementUpdated(el);\n expect(el.getAttribute('role')).to.equal('link');\n\n el.removeAttribute('href');\n\n await elementUpdated(el);\n expect(el.getAttribute('role')).to.equal('button');\n });\n it('allows label to be toggled', async () => {\n const testNode = document.createTextNode('Button');\n const el = await fixture<Button>(html`\n <sp-button>\n ${testNode}\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n const labelTestableEl = el as unknown as TestableButtonType;\n\n expect(labelTestableEl.hasLabel, 'starts with label').to.be.true;\n\n testNode.textContent = '';\n\n await elementUpdated(el);\n\n await waitUntil(\n () => !labelTestableEl.hasLabel,\n 'label is removed'\n );\n\n testNode.textContent = 'Button';\n\n await elementUpdated(el);\n\n expect(labelTestableEl.hasLabel, 'label is returned').to.be.true;\n });\n it('loads with href', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\">With Href</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('With Href');\n });\n it('loads with href and target', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('With Target');\n });\n it('accepts shift+tab interactions', async () => {\n let focusedCount = 0;\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n const input = document.createElement('input');\n el.insertAdjacentElement('beforebegin', input);\n input.focus();\n expect(document.activeElement === input).to.be.true;\n\n el.addEventListener('focus', () => {\n focusedCount += 1;\n });\n expect(focusedCount).to.equal(0);\n\n await sendKeys({\n press: 'Tab',\n });\n await elementUpdated(el);\n\n expect(document.activeElement === el).to.be.true;\n expect(focusedCount).to.equal(1);\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n await elementUpdated(el);\n\n expect(focusedCount).to.equal(1);\n expect(document.activeElement === input).to.be.true;\n });\n it('manages `disabled`', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button @click=${() => clickSpy()}>Button</sp-button>\n `);\n\n await elementUpdated(el);\n el.click();\n await elementUpdated(el);\n expect(clickSpy.calledOnce).to.be.true;\n\n clickSpy.resetHistory();\n el.disabled = true;\n await elementUpdated(el);\n el.click();\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n clickSpy.resetHistory();\n await elementUpdated(el);\n el.dispatchEvent(new Event('click', {}));\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n clickSpy.resetHistory();\n el.disabled = false;\n el.click();\n await elementUpdated(el);\n expect(clickSpy.calledOnce).to.be.true;\n });\n it('`disabled` manages `tabindex`', async () => {\n const el = await fixture<Button>(html`\n <sp-button disabled>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.tabIndex).to.equal(-1);\n expect(el.getAttribute('tabindex')).to.equal('-1');\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(0);\n expect(el.getAttribute('tabindex')).to.equal('0');\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n expect(el.getAttribute('tabindex')).to.equal('-1');\n });\n it('manages `aria-disabled`', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n expect(el.hasAttribute('aria-disabled'), 'initially not').to.be\n .false;\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.getAttribute('aria-disabled')).to.equal('true');\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.hasAttribute('aria-disabled'), 'finally not').to.be.false;\n });\n it('manages aria-label from disabled state', async () => {\n const el = await fixture<Button>(html`\n <sp-button\n href=\"test_url\"\n target=\"_blank\"\n label=\"clickable\"\n disabled\n pending-label=\"Pending Button\"\n >\n Click me\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // button set to pending while disabled and the aria-label should stay the same\n el.pending = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // button set to enabled while pending is true and the aria-label should update\n el.disabled = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending Button');\n\n // pending is removed and the aria-label should be back to the original\n el.pending = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n });\n\n it('manages aria-label from pending state', async () => {\n const el = await fixture<Button>(html`\n <sp-button\n href=\"test_url\"\n target=\"_blank\"\n label=\"clickable\"\n pending\n >\n Click me\n </sp-button>\n `);\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending');\n\n // button set to disabled while pending is true and the aria-label should be original\n el.disabled = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // pending is removed and the aria-label should not change as the button is disabled\n el.pending = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // button is enabled and the aria-label should not change\n el.disabled = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n });\n\n it('manages aria-label set from outside', async () => {\n const el = await fixture<Button>(html`\n <sp-button\n href=\"test_url\"\n target=\"_blank\"\n aria-label=\"test\"\n pending-label=\"Pending Button\"\n >\n Click me\n </sp-button>\n `);\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('test');\n\n // button set to pending and aria-label should update\n el.pending = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending Button');\n\n // button set to disabled while pending and aria-label should update\n el.disabled = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('test');\n\n // button set to enabled while pending and aria-label should update\n el.disabled = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending Button');\n\n // pending removed and aria-label should update\n el.pending = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('test');\n });\n\n it('updates pending label accessibly', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n el.pending = true;\n await elementUpdated(el);\n\n await nextFrame();\n\n type NamedNode = { name: string };\n let snapshot = (await a11ySnapshot({})) as unknown as NamedNode & {\n children: NamedNode[];\n };\n expect(\n findAccessibilityNode<NamedNode>(\n snapshot,\n (node) => node.name === 'Pending'\n ),\n '`Pending` is the label text'\n ).to.not.be.null;\n\n expect(el.pending).to.be.true;\n\n // remove pending state\n el.pending = false;\n await elementUpdated(el);\n\n await nextFrame();\n\n snapshot = (await a11ySnapshot({})) as unknown as NamedNode & {\n children: NamedNode[];\n };\n\n // check label returns to previous value\n expect(\n findAccessibilityNode<NamedNode>(\n snapshot,\n (node) => node.name === 'Button'\n ),\n '`Button` is the label text'\n ).to.not.be.null;\n\n expect(el.pending).to.be.false;\n });\n\n it('manages tabIndex while disabled', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(0);\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.tabIndex = 2;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(2);\n });\n it('swallows `click` interaction when `[disabled]`', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button disabled @click=${() => clickSpy()}>\n Button\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n el.click();\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n });\n it('translates keyboard interactions to click', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button @click=${() => clickSpy()}>Button</sp-button>\n `);\n\n await elementUpdated(el);\n\n el.dispatchEvent(\n new KeyboardEvent('keypress', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Enter',\n key: 'Enter',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keypress', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'NumpadEnter',\n key: 'NumpadEnter',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keypress', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'KeyG',\n key: 'g',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'KeyG',\n key: 'g',\n })\n );\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n });\n it('proxies clicks by \"type\"', async () => {\n const submitSpy = spy();\n const resetSpy = spy();\n const test = await fixture<HTMLFormElement>(html`\n <form\n @submit=${(event: Event): void => {\n event.preventDefault();\n submitSpy();\n }}\n @reset=${(event: Event): void => {\n event.preventDefault();\n resetSpy();\n }}\n >\n <sp-button>Button</sp-button>\n </form>\n `);\n const el = test.querySelector('sp-button') as Button;\n\n await elementUpdated(el);\n el.type = 'submit';\n\n await elementUpdated(el);\n el.click();\n\n expect(submitSpy.callCount).to.equal(1);\n expect(resetSpy.callCount).to.equal(0);\n\n el.type = 'reset';\n\n await elementUpdated(el);\n el.click();\n\n expect(submitSpy.callCount).to.equal(1);\n expect(resetSpy.callCount).to.equal(1);\n\n el.type = 'button';\n\n await elementUpdated(el);\n el.click();\n\n expect(submitSpy.callCount).to.equal(1);\n expect(resetSpy.callCount).to.equal(1);\n });\n it('proxies click by [href]', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\">With Href</sp-button>\n `);\n\n await elementUpdated(el);\n (\n el as unknown as {\n anchorElement: HTMLAnchorElement;\n }\n ).anchorElement.addEventListener('click', (event: Event): void => {\n event.preventDefault();\n event.stopPropagation();\n clickSpy();\n });\n expect(clickSpy.callCount).to.equal(0);\n\n el.click();\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n });\n it('manages \"active\" while focused', async () => {\n const el = await fixture<Button>(html`\n <sp-button label=\"Button\">\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n el.focus();\n await elementUpdated(el);\n await sendKeys({\n down: 'Space',\n });\n await elementUpdated(el);\n expect(el.active).to.be.true;\n await sendKeys({\n up: 'Space',\n });\n await elementUpdated(el);\n expect(el.active).to.be.false;\n });\n describe('deprecated variants and attributes', () => {\n it('manages [quiet]', async () => {\n const el = await fixture<Button>(html`\n <sp-button quiet>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.treatment).to.equal('outline');\n\n el.quiet = false;\n\n await elementUpdated(el);\n expect(el.treatment).to.equal('fill');\n });\n it('upgrades [variant=\"cta\"] to [variant=\"accent\"]', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"cta\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.variant).to.equal('accent');\n });\n it('manages [variant=\"overBackground\"]', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"overBackground\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.getAttribute('variant')).to.not.equal(\n 'overBackground'\n );\n expect(el.treatment).to.equal('outline');\n expect(el.staticColor).to.equal('white');\n });\n ['white', 'black'].forEach((variant) => {\n it(`manages [variant=\"${variant}\"]`, async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"${variant as 'white' | 'black'}\">\n Button\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.hasAttribute('variant')).to.not.equal(variant);\n expect(el.staticColor).to.equal(variant);\n expect(el.getAttribute('static-color')).to.equal(variant);\n });\n });\n it('forces [variant=\"accent\"]', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"not-supported\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.variant).to.equal('accent');\n });\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport '@spectrum-web-components/button/sp-button.js';\nimport { Button } from '@spectrum-web-components/button';\nimport {\n elementUpdated,\n expect,\n fixture,\n html,\n nextFrame,\n waitUntil,\n} from '@open-wc/testing';\nimport { testForLitDevWarnings } from '../../../test/testing-helpers.js';\nimport {\n a11ySnapshot,\n findAccessibilityNode,\n sendKeys,\n} from '@web/test-runner-commands';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport { spy, stub } from 'sinon';\n\ntype TestableButtonType = {\n hasLabel: boolean;\n};\n\ndescribe('Button', () => {\n testForLitDevWarnings(\n async () =>\n await fixture<Button>(html`\n <sp-button>Button</sp-button>\n `)\n );\n describe('dev mode', () => {\n let consoleWarnStub!: ReturnType<typeof stub>;\n before(() => {\n window.__swc.verbose = true;\n consoleWarnStub = stub(console, 'warn');\n });\n afterEach(() => {\n consoleWarnStub.resetHistory();\n });\n after(() => {\n window.__swc.verbose = false;\n consoleWarnStub.restore();\n });\n\n it('warns in devMode when white/black variant is provided', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"white\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(consoleWarnStub.called).to.be.true;\n\n const spyCall = consoleWarnStub.getCall(0);\n expect(\n (spyCall.args.at(0) as string).includes('deprecated'),\n 'confirm deprecated variant warning'\n ).to.be.true;\n expect(spyCall.args.at(-1), 'confirm `data` shape').to.deep.equal({\n data: {\n localName: 'sp-button',\n type: 'api',\n level: 'deprecation',\n },\n });\n });\n\n it('loads default', async () => {\n const el = await fixture<Button>(html`\n <sp-button>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('Button');\n await expect(el).to.be.accessible();\n\n // Applies a default variant as an stylable attribute\n expect(el.variant).to.equal('accent');\n expect(el.getAttribute('variant')).to.equal('accent');\n });\n it('loads default w/ an icon', async () => {\n const el = await fixture<Button>(html`\n <sp-button label=\"\">\n Button\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('Button');\n expect(!(el as unknown as { hasIcon: boolean }).hasIcon);\n await expect(el).to.be.accessible();\n });\n it('loads default only icon', async () => {\n const el = await fixture<Button>(html`\n <sp-button label=\"Button\" icon-only>\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n await expect(el).to.be.accessible();\n });\n it('has a stable/predictable `updateComplete`', async () => {\n const test = await fixture<HTMLDivElement>(html`\n <div></div>\n `);\n\n let keydownTime = -1;\n let updateComplete1 = -1;\n let updateComplete2 = -1;\n\n const el = document.createElement('sp-button');\n el.autofocus = true;\n el.addEventListener('keydown', () => {\n keydownTime = performance.now();\n });\n el.updateComplete.then(() => {\n updateComplete1 = performance.now();\n });\n el.updateComplete.then(() => {\n updateComplete2 = performance.now();\n });\n test.append(el);\n // don't use elementUpdated(), as it is under test...\n await nextFrame();\n await nextFrame();\n await nextFrame();\n await nextFrame();\n\n expect(keydownTime, 'keydown happened').to.not.eq(-1);\n expect(updateComplete1, 'first update complete happened').to.not.eq(\n -1\n );\n expect(updateComplete2, 'first update complete happened').to.not.eq(\n -1\n );\n expect(updateComplete1).lte(updateComplete2);\n expect(updateComplete2).lte(keydownTime);\n });\n it('manages \"role\"', async () => {\n const el = await fixture<Button>(html`\n <sp-button>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.getAttribute('role')).to.equal('button');\n\n el.setAttribute('href', '#');\n\n await elementUpdated(el);\n expect(el.getAttribute('role')).to.equal('link');\n\n el.removeAttribute('href');\n\n await elementUpdated(el);\n expect(el.getAttribute('role')).to.equal('button');\n });\n it('allows label to be toggled', async () => {\n const testNode = document.createTextNode('Button');\n const el = await fixture<Button>(html`\n <sp-button>\n ${testNode}\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n const labelTestableEl = el as unknown as TestableButtonType;\n\n expect(labelTestableEl.hasLabel, 'starts with label').to.be.true;\n\n testNode.textContent = '';\n\n await elementUpdated(el);\n\n await waitUntil(\n () => !labelTestableEl.hasLabel,\n 'label is removed'\n );\n\n testNode.textContent = 'Button';\n\n await elementUpdated(el);\n\n expect(labelTestableEl.hasLabel, 'label is returned').to.be.true;\n });\n it('loads with href', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\">With Href</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('With Href');\n });\n it('loads with href and target', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n expect(el.textContent).to.include('With Target');\n });\n it('allows link click', async () => {\n let clicked = false;\n const el = await fixture<Button>(html`\n <sp-button href=\"#top\">Button as link</sp-button>\n `);\n\n await elementUpdated(el);\n\n // prevents browser from activating link but records the proxy click\n el.shadowRoot\n ?.querySelector('.anchor')\n ?.addEventListener('click', (event: Event) => {\n event.preventDefault();\n clicked = true;\n });\n const rect = el.getBoundingClientRect();\n\n // tests mouse click events, and by extension VoiceOver CRTL+Option+Space click\n await sendMouse({\n steps: [\n {\n position: [\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n ],\n type: 'click',\n },\n ],\n });\n await elementUpdated(el);\n expect(clicked).to.be.true;\n });\n it('accepts shift+tab interactions', async () => {\n let focusedCount = 0;\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n const input = document.createElement('input');\n el.insertAdjacentElement('beforebegin', input);\n input.focus();\n expect(document.activeElement === input).to.be.true;\n\n el.addEventListener('focus', () => {\n focusedCount += 1;\n });\n expect(focusedCount).to.equal(0);\n\n await sendKeys({\n press: 'Tab',\n });\n await elementUpdated(el);\n\n expect(document.activeElement === el).to.be.true;\n expect(focusedCount).to.equal(1);\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n await elementUpdated(el);\n\n expect(focusedCount).to.equal(1);\n expect(document.activeElement === input).to.be.true;\n });\n it('manages `disabled`', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button @click=${() => clickSpy()}>Button</sp-button>\n `);\n\n await elementUpdated(el);\n el.click();\n await elementUpdated(el);\n expect(clickSpy.calledOnce).to.be.true;\n\n clickSpy.resetHistory();\n el.disabled = true;\n await elementUpdated(el);\n el.click();\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n clickSpy.resetHistory();\n await elementUpdated(el);\n el.dispatchEvent(new Event('click', {}));\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n clickSpy.resetHistory();\n el.disabled = false;\n el.click();\n await elementUpdated(el);\n expect(clickSpy.calledOnce).to.be.true;\n });\n it('`disabled` manages `tabindex`', async () => {\n const el = await fixture<Button>(html`\n <sp-button disabled>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.tabIndex).to.equal(-1);\n expect(el.getAttribute('tabindex')).to.equal('-1');\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(0);\n expect(el.getAttribute('tabindex')).to.equal('0');\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n expect(el.getAttribute('tabindex')).to.equal('-1');\n });\n it('manages `aria-disabled`', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n expect(el.hasAttribute('aria-disabled'), 'initially not').to.be\n .false;\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.getAttribute('aria-disabled')).to.equal('true');\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.hasAttribute('aria-disabled'), 'finally not').to.be.false;\n });\n it('manages aria-label from disabled state', async () => {\n const el = await fixture<Button>(html`\n <sp-button\n href=\"test_url\"\n target=\"_blank\"\n label=\"clickable\"\n disabled\n pending-label=\"Pending Button\"\n >\n Click me\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // button set to pending while disabled and the aria-label should stay the same\n el.pending = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // button set to enabled while pending is true and the aria-label should update\n el.disabled = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending Button');\n\n // pending is removed and the aria-label should be back to the original\n el.pending = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n });\n\n it('manages aria-label from pending state', async () => {\n const el = await fixture<Button>(html`\n <sp-button\n href=\"test_url\"\n target=\"_blank\"\n label=\"clickable\"\n pending\n >\n Click me\n </sp-button>\n `);\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending');\n\n // button set to disabled while pending is true and the aria-label should be original\n el.disabled = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // pending is removed and the aria-label should not change as the button is disabled\n el.pending = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n\n // button is enabled and the aria-label should not change\n el.disabled = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('clickable');\n });\n\n it('manages aria-label set from outside', async () => {\n const el = await fixture<Button>(html`\n <sp-button\n href=\"test_url\"\n target=\"_blank\"\n aria-label=\"test\"\n pending-label=\"Pending Button\"\n >\n Click me\n </sp-button>\n `);\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('test');\n\n // button set to pending and aria-label should update\n el.pending = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending Button');\n\n // button set to disabled while pending and aria-label should update\n el.disabled = true;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('test');\n\n // button set to enabled while pending and aria-label should update\n el.disabled = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('Pending Button');\n\n // pending removed and aria-label should update\n el.pending = false;\n await elementUpdated(el);\n expect(el.getAttribute('aria-label')).to.equal('test');\n });\n\n it('updates pending label accessibly', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n el.pending = true;\n await elementUpdated(el);\n\n await nextFrame();\n\n type NamedNode = { name: string };\n let snapshot = (await a11ySnapshot({})) as unknown as NamedNode & {\n children: NamedNode[];\n };\n expect(\n findAccessibilityNode<NamedNode>(\n snapshot,\n (node) => node.name === 'Pending'\n ),\n '`Pending` is the label text'\n ).to.not.be.null;\n\n expect(el.pending).to.be.true;\n\n // remove pending state\n el.pending = false;\n await elementUpdated(el);\n\n await nextFrame();\n\n snapshot = (await a11ySnapshot({})) as unknown as NamedNode & {\n children: NamedNode[];\n };\n\n // check label returns to previous value\n expect(\n findAccessibilityNode<NamedNode>(\n snapshot,\n (node) => node.name === 'Button'\n ),\n '`Button` is the label text'\n ).to.not.be.null;\n\n expect(el.pending).to.be.false;\n });\n\n it('manages tabIndex while disabled', async () => {\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `);\n\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(0);\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.tabIndex = 2;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(2);\n });\n it('swallows `click` interaction when `[disabled]`', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button disabled @click=${() => clickSpy()}>\n Button\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n el.click();\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n });\n it('translates keyboard interactions to click', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button @click=${() => clickSpy()}>Button</sp-button>\n `);\n\n await elementUpdated(el);\n\n el.dispatchEvent(\n new KeyboardEvent('keypress', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Enter',\n key: 'Enter',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keypress', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'NumpadEnter',\n key: 'NumpadEnter',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keypress', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'KeyG',\n key: 'g',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n clickSpy.resetHistory();\n\n el.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'KeyG',\n key: 'g',\n })\n );\n el.dispatchEvent(\n new KeyboardEvent('keyup', {\n bubbles: true,\n composed: true,\n cancelable: true,\n code: 'Space',\n key: 'Space',\n })\n );\n\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(0);\n });\n it('proxies clicks by \"type\"', async () => {\n const submitSpy = spy();\n const resetSpy = spy();\n const test = await fixture<HTMLFormElement>(html`\n <form\n @submit=${(event: Event): void => {\n event.preventDefault();\n submitSpy();\n }}\n @reset=${(event: Event): void => {\n event.preventDefault();\n resetSpy();\n }}\n >\n <sp-button>Button</sp-button>\n </form>\n `);\n const el = test.querySelector('sp-button') as Button;\n\n await elementUpdated(el);\n el.type = 'submit';\n\n await elementUpdated(el);\n el.click();\n\n expect(submitSpy.callCount).to.equal(1);\n expect(resetSpy.callCount).to.equal(0);\n\n el.type = 'reset';\n\n await elementUpdated(el);\n el.click();\n\n expect(submitSpy.callCount).to.equal(1);\n expect(resetSpy.callCount).to.equal(1);\n\n el.type = 'button';\n\n await elementUpdated(el);\n el.click();\n\n expect(submitSpy.callCount).to.equal(1);\n expect(resetSpy.callCount).to.equal(1);\n });\n it('proxies click by [href]', async () => {\n const clickSpy = spy();\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\">With Href</sp-button>\n `);\n\n await elementUpdated(el);\n (\n el as unknown as {\n anchorElement: HTMLAnchorElement;\n }\n ).anchorElement.addEventListener('click', (event: Event): void => {\n event.preventDefault();\n event.stopPropagation();\n clickSpy();\n });\n expect(clickSpy.callCount).to.equal(0);\n\n el.click();\n await elementUpdated(el);\n expect(clickSpy.callCount).to.equal(1);\n });\n it('manages \"active\" while focused', async () => {\n const el = await fixture<Button>(html`\n <sp-button label=\"Button\">\n <svg slot=\"icon\"></svg>\n </sp-button>\n `);\n\n await elementUpdated(el);\n el.focus();\n await elementUpdated(el);\n await sendKeys({\n down: 'Space',\n });\n await elementUpdated(el);\n expect(el.active).to.be.true;\n await sendKeys({\n up: 'Space',\n });\n await elementUpdated(el);\n expect(el.active).to.be.false;\n });\n describe('deprecated variants and attributes', () => {\n it('manages [quiet]', async () => {\n const el = await fixture<Button>(html`\n <sp-button quiet>Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.treatment).to.equal('outline');\n\n el.quiet = false;\n\n await elementUpdated(el);\n expect(el.treatment).to.equal('fill');\n });\n it('upgrades [variant=\"cta\"] to [variant=\"accent\"]', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"cta\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.variant).to.equal('accent');\n });\n it('manages [variant=\"overBackground\"]', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"overBackground\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.getAttribute('variant')).to.not.equal(\n 'overBackground'\n );\n expect(el.treatment).to.equal('outline');\n expect(el.staticColor).to.equal('white');\n });\n ['white', 'black'].forEach((variant) => {\n it(`manages [variant=\"${variant}\"]`, async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"${variant as 'white' | 'black'}\">\n Button\n </sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.hasAttribute('variant')).to.not.equal(variant);\n expect(el.staticColor).to.equal(variant);\n expect(el.getAttribute('static-color')).to.equal(variant);\n });\n });\n it('forces [variant=\"accent\"]', async () => {\n const el = await fixture<Button>(html`\n <sp-button variant=\"not-supported\">Button</sp-button>\n `);\n\n await elementUpdated(el);\n expect(el.variant).to.equal('accent');\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }