@spectrum-web-components/button 1.1.0 → 1.1.1

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.
Files changed (229) hide show
  1. package/package.json +10 -10
  2. package/sp-button.d.ts +6 -0
  3. package/sp-button.dev.js +5 -0
  4. package/sp-button.dev.js.map +7 -0
  5. package/sp-button.js +2 -0
  6. package/sp-button.js.map +7 -0
  7. package/sp-clear-button.d.ts +6 -0
  8. package/sp-clear-button.dev.js +5 -0
  9. package/sp-clear-button.dev.js.map +7 -0
  10. package/sp-clear-button.js +2 -0
  11. package/sp-clear-button.js.map +7 -0
  12. package/sp-close-button.d.ts +6 -0
  13. package/sp-close-button.dev.js +5 -0
  14. package/sp-close-button.dev.js.map +7 -0
  15. package/sp-close-button.js +2 -0
  16. package/sp-close-button.js.map +7 -0
  17. package/src/Button.d.ts +60 -0
  18. package/src/Button.dev.js +162 -0
  19. package/src/Button.dev.js.map +7 -0
  20. package/src/Button.js +5 -0
  21. package/src/Button.js.map +7 -0
  22. package/src/ButtonBase.d.ts +44 -0
  23. package/src/ButtonBase.dev.js +198 -0
  24. package/src/ButtonBase.dev.js.map +7 -0
  25. package/src/ButtonBase.js +13 -0
  26. package/src/ButtonBase.js.map +7 -0
  27. package/src/ClearButton.d.ts +26 -0
  28. package/src/ClearButton.dev.js +78 -0
  29. package/src/ClearButton.dev.js.map +7 -0
  30. package/src/ClearButton.js +24 -0
  31. package/src/ClearButton.js.map +7 -0
  32. package/src/CloseButton.d.ts +27 -0
  33. package/src/CloseButton.dev.js +76 -0
  34. package/src/CloseButton.dev.js.map +7 -0
  35. package/src/CloseButton.js +22 -0
  36. package/src/CloseButton.js.map +7 -0
  37. package/src/StyledButton.d.ts +3 -0
  38. package/src/StyledButton.dev.js +5 -0
  39. package/src/StyledButton.dev.js.map +7 -0
  40. package/src/StyledButton.js +2 -0
  41. package/src/StyledButton.js.map +7 -0
  42. package/src/button-base.css.d.ts +2 -0
  43. package/src/button-base.css.dev.js +7 -0
  44. package/src/button-base.css.dev.js.map +7 -0
  45. package/src/button-base.css.js +4 -0
  46. package/src/button-base.css.js.map +7 -0
  47. package/src/button-overrides.css.d.ts +2 -0
  48. package/src/button-overrides.css.dev.js +7 -0
  49. package/src/button-overrides.css.dev.js.map +7 -0
  50. package/src/button-overrides.css.js +4 -0
  51. package/src/button-overrides.css.js.map +7 -0
  52. package/src/button.css.d.ts +2 -0
  53. package/src/button.css.dev.js +7 -0
  54. package/src/button.css.dev.js.map +7 -0
  55. package/src/button.css.js +4 -0
  56. package/src/button.css.js.map +7 -0
  57. package/src/index.d.ts +5 -0
  58. package/src/index.dev.js +7 -0
  59. package/src/index.dev.js.map +7 -0
  60. package/src/index.js +2 -0
  61. package/src/index.js.map +7 -0
  62. package/src/spectrum-button-base.css.d.ts +2 -0
  63. package/src/spectrum-button-base.css.dev.js +7 -0
  64. package/src/spectrum-button-base.css.dev.js.map +7 -0
  65. package/src/spectrum-button-base.css.js +4 -0
  66. package/src/spectrum-button-base.css.js.map +7 -0
  67. package/src/spectrum-button.css.d.ts +2 -0
  68. package/src/spectrum-button.css.dev.js +7 -0
  69. package/src/spectrum-button.css.dev.js.map +7 -0
  70. package/src/spectrum-button.css.js +4 -0
  71. package/src/spectrum-button.css.js.map +7 -0
  72. package/stories/button-accent-fill-pending.stories.js +34 -0
  73. package/stories/button-accent-fill-pending.stories.js.map +7 -0
  74. package/stories/button-accent-fill-sizes.stories.js +32 -0
  75. package/stories/button-accent-fill-sizes.stories.js.map +7 -0
  76. package/stories/button-accent-fill.stories.js +33 -0
  77. package/stories/button-accent-fill.stories.js.map +7 -0
  78. package/stories/button-accent-outline-pending.stories.js +34 -0
  79. package/stories/button-accent-outline-pending.stories.js.map +7 -0
  80. package/stories/button-accent-outline-sizes.stories.js +32 -0
  81. package/stories/button-accent-outline-sizes.stories.js.map +7 -0
  82. package/stories/button-accent-outline.stories.js +33 -0
  83. package/stories/button-accent-outline.stories.js.map +7 -0
  84. package/stories/button-black-fill-pending.stories.js +34 -0
  85. package/stories/button-black-fill-pending.stories.js.map +7 -0
  86. package/stories/button-black-fill-sizes.stories.js +33 -0
  87. package/stories/button-black-fill-sizes.stories.js.map +7 -0
  88. package/stories/button-black-fill.stories.js +35 -0
  89. package/stories/button-black-fill.stories.js.map +7 -0
  90. package/stories/button-black-outline-pending.stories.js +34 -0
  91. package/stories/button-black-outline-pending.stories.js.map +7 -0
  92. package/stories/button-black-outline-sizes.stories.js +33 -0
  93. package/stories/button-black-outline-sizes.stories.js.map +7 -0
  94. package/stories/button-black-outline.stories.js +35 -0
  95. package/stories/button-black-outline.stories.js.map +7 -0
  96. package/stories/button-negative-fill-pending.stories.js +34 -0
  97. package/stories/button-negative-fill-pending.stories.js.map +7 -0
  98. package/stories/button-negative-fill-sizes.stories.js +32 -0
  99. package/stories/button-negative-fill-sizes.stories.js.map +7 -0
  100. package/stories/button-negative-fill.stories.js +33 -0
  101. package/stories/button-negative-fill.stories.js.map +7 -0
  102. package/stories/button-negative-outline-pending.stories.js +34 -0
  103. package/stories/button-negative-outline-pending.stories.js.map +7 -0
  104. package/stories/button-negative-outline-sizes.stories.js +32 -0
  105. package/stories/button-negative-outline-sizes.stories.js.map +7 -0
  106. package/stories/button-negative-outline.stories.js +33 -0
  107. package/stories/button-negative-outline.stories.js.map +7 -0
  108. package/stories/button-primary-fill-pending.stories.js +34 -0
  109. package/stories/button-primary-fill-pending.stories.js.map +7 -0
  110. package/stories/button-primary-fill-sizes.stories.js +32 -0
  111. package/stories/button-primary-fill-sizes.stories.js.map +7 -0
  112. package/stories/button-primary-fill.stories.js +46 -0
  113. package/stories/button-primary-fill.stories.js.map +7 -0
  114. package/stories/button-primary-outline-pending.stories.js +34 -0
  115. package/stories/button-primary-outline-pending.stories.js.map +7 -0
  116. package/stories/button-primary-outline-sizes.stories.js +32 -0
  117. package/stories/button-primary-outline-sizes.stories.js.map +7 -0
  118. package/stories/button-primary-outline.stories.js +33 -0
  119. package/stories/button-primary-outline.stories.js.map +7 -0
  120. package/stories/button-secondary-fill-pending.stories.js +34 -0
  121. package/stories/button-secondary-fill-pending.stories.js.map +7 -0
  122. package/stories/button-secondary-fill-sizes.stories.js +32 -0
  123. package/stories/button-secondary-fill-sizes.stories.js.map +7 -0
  124. package/stories/button-secondary-fill.stories.js +33 -0
  125. package/stories/button-secondary-fill.stories.js.map +7 -0
  126. package/stories/button-secondary-outline-pending.stories.js +34 -0
  127. package/stories/button-secondary-outline-pending.stories.js.map +7 -0
  128. package/stories/button-secondary-outline-sizes.stories.js +32 -0
  129. package/stories/button-secondary-outline-sizes.stories.js.map +7 -0
  130. package/stories/button-secondary-outline.stories.js +33 -0
  131. package/stories/button-secondary-outline.stories.js.map +7 -0
  132. package/stories/button-white-fill-pending.stories.js +34 -0
  133. package/stories/button-white-fill-pending.stories.js.map +7 -0
  134. package/stories/button-white-fill-sizes.stories.js +33 -0
  135. package/stories/button-white-fill-sizes.stories.js.map +7 -0
  136. package/stories/button-white-fill.stories.js +35 -0
  137. package/stories/button-white-fill.stories.js.map +7 -0
  138. package/stories/button-white-outline-pending.stories.js +34 -0
  139. package/stories/button-white-outline-pending.stories.js.map +7 -0
  140. package/stories/button-white-outline-sizes.stories.js +33 -0
  141. package/stories/button-white-outline-sizes.stories.js.map +7 -0
  142. package/stories/button-white-outline.stories.js +35 -0
  143. package/stories/button-white-outline.stories.js.map +7 -0
  144. package/stories/index.js +198 -0
  145. package/stories/index.js.map +7 -0
  146. package/stories/template.js +21 -0
  147. package/stories/template.js.map +7 -0
  148. package/test/benchmark/test-basic.js +14 -0
  149. package/test/benchmark/test-basic.js.map +7 -0
  150. package/test/button-accent-fill-pending.test-vrt.js +5 -0
  151. package/test/button-accent-fill-pending.test-vrt.js.map +7 -0
  152. package/test/button-accent-fill-sizes.test-vrt.js +5 -0
  153. package/test/button-accent-fill-sizes.test-vrt.js.map +7 -0
  154. package/test/button-accent-fill.test-vrt.js +5 -0
  155. package/test/button-accent-fill.test-vrt.js.map +7 -0
  156. package/test/button-accent-outline-pending.test-vrt.js +5 -0
  157. package/test/button-accent-outline-pending.test-vrt.js.map +7 -0
  158. package/test/button-accent-outline-sizes.test-vrt.js +5 -0
  159. package/test/button-accent-outline-sizes.test-vrt.js.map +7 -0
  160. package/test/button-accent-outline.test-vrt.js +5 -0
  161. package/test/button-accent-outline.test-vrt.js.map +7 -0
  162. package/test/button-black-fill-pending.test-vrt.js +5 -0
  163. package/test/button-black-fill-pending.test-vrt.js.map +7 -0
  164. package/test/button-black-fill-sizes.test-vrt.js +5 -0
  165. package/test/button-black-fill-sizes.test-vrt.js.map +7 -0
  166. package/test/button-black-fill.test-vrt.js +5 -0
  167. package/test/button-black-fill.test-vrt.js.map +7 -0
  168. package/test/button-black-outline-pending.test-vrt.js +5 -0
  169. package/test/button-black-outline-pending.test-vrt.js.map +7 -0
  170. package/test/button-black-outline-sizes.test-vrt.js +5 -0
  171. package/test/button-black-outline-sizes.test-vrt.js.map +7 -0
  172. package/test/button-black-outline.test-vrt.js +5 -0
  173. package/test/button-black-outline.test-vrt.js.map +7 -0
  174. package/test/button-memory.test.js +5 -0
  175. package/test/button-memory.test.js.map +7 -0
  176. package/test/button-negative-fill-pending.test-vrt.js +5 -0
  177. package/test/button-negative-fill-pending.test-vrt.js.map +7 -0
  178. package/test/button-negative-fill-sizes.test-vrt.js +5 -0
  179. package/test/button-negative-fill-sizes.test-vrt.js.map +7 -0
  180. package/test/button-negative-fill.test-vrt.js +5 -0
  181. package/test/button-negative-fill.test-vrt.js.map +7 -0
  182. package/test/button-negative-outline-pending.test-vrt.js +5 -0
  183. package/test/button-negative-outline-pending.test-vrt.js.map +7 -0
  184. package/test/button-negative-outline-sizes.test-vrt.js +5 -0
  185. package/test/button-negative-outline-sizes.test-vrt.js.map +7 -0
  186. package/test/button-negative-outline.test-vrt.js +5 -0
  187. package/test/button-negative-outline.test-vrt.js.map +7 -0
  188. package/test/button-primary-fill-pending.test-vrt.js +5 -0
  189. package/test/button-primary-fill-pending.test-vrt.js.map +7 -0
  190. package/test/button-primary-fill-sizes.test-vrt.js +5 -0
  191. package/test/button-primary-fill-sizes.test-vrt.js.map +7 -0
  192. package/test/button-primary-fill.test-vrt.js +5 -0
  193. package/test/button-primary-fill.test-vrt.js.map +7 -0
  194. package/test/button-primary-outline-pending.test-vrt.js +5 -0
  195. package/test/button-primary-outline-pending.test-vrt.js.map +7 -0
  196. package/test/button-primary-outline-sizes.test-vrt.js +5 -0
  197. package/test/button-primary-outline-sizes.test-vrt.js.map +7 -0
  198. package/test/button-primary-outline.test-vrt.js +5 -0
  199. package/test/button-primary-outline.test-vrt.js.map +7 -0
  200. package/test/button-secondary-fill-pending.test-vrt.js +5 -0
  201. package/test/button-secondary-fill-pending.test-vrt.js.map +7 -0
  202. package/test/button-secondary-fill-sizes.test-vrt.js +5 -0
  203. package/test/button-secondary-fill-sizes.test-vrt.js.map +7 -0
  204. package/test/button-secondary-fill.test-vrt.js +5 -0
  205. package/test/button-secondary-fill.test-vrt.js.map +7 -0
  206. package/test/button-secondary-outline-pending.test-vrt.js +5 -0
  207. package/test/button-secondary-outline-pending.test-vrt.js.map +7 -0
  208. package/test/button-secondary-outline-sizes.test-vrt.js +5 -0
  209. package/test/button-secondary-outline-sizes.test-vrt.js.map +7 -0
  210. package/test/button-secondary-outline.test-vrt.js +5 -0
  211. package/test/button-secondary-outline.test-vrt.js.map +7 -0
  212. package/test/button-white-fill-pending.test-vrt.js +5 -0
  213. package/test/button-white-fill-pending.test-vrt.js.map +7 -0
  214. package/test/button-white-fill-sizes.test-vrt.js +5 -0
  215. package/test/button-white-fill-sizes.test-vrt.js.map +7 -0
  216. package/test/button-white-fill.test-vrt.js +5 -0
  217. package/test/button-white-fill.test-vrt.js.map +7 -0
  218. package/test/button-white-outline-pending.test-vrt.js +5 -0
  219. package/test/button-white-outline-pending.test-vrt.js.map +7 -0
  220. package/test/button-white-outline-sizes.test-vrt.js +5 -0
  221. package/test/button-white-outline-sizes.test-vrt.js.map +7 -0
  222. package/test/button-white-outline.test-vrt.js +5 -0
  223. package/test/button-white-outline.test-vrt.js.map +7 -0
  224. package/test/button.test.js +659 -0
  225. package/test/button.test.js.map +7 -0
  226. package/test/clear-button.test.js +27 -0
  227. package/test/clear-button.test.js.map +7 -0
  228. package/test/close-button.test.js +27 -0
  229. package/test/close-button.test.js.map +7 -0
@@ -0,0 +1,659 @@
1
+ "use strict";
2
+ import "@spectrum-web-components/button/sp-button.js";
3
+ import {
4
+ elementUpdated,
5
+ expect,
6
+ fixture,
7
+ html,
8
+ nextFrame,
9
+ waitUntil
10
+ } from "@open-wc/testing";
11
+ import { testForLitDevWarnings } from "../../../test/testing-helpers.js";
12
+ import {
13
+ a11ySnapshot,
14
+ findAccessibilityNode,
15
+ sendKeys
16
+ } from "@web/test-runner-commands";
17
+ import { sendMouse } from "../../../test/plugins/browser.js";
18
+ import { spy, stub } from "sinon";
19
+ describe("Button", () => {
20
+ testForLitDevWarnings(
21
+ async () => await fixture(html`
22
+ <sp-button>Button</sp-button>
23
+ `)
24
+ );
25
+ describe("dev mode", () => {
26
+ let consoleWarnStub;
27
+ before(() => {
28
+ window.__swc.verbose = true;
29
+ consoleWarnStub = stub(console, "warn");
30
+ });
31
+ afterEach(() => {
32
+ consoleWarnStub.resetHistory();
33
+ });
34
+ after(() => {
35
+ window.__swc.verbose = false;
36
+ consoleWarnStub.restore();
37
+ });
38
+ it("warns in devMode when white/black variant is provided", async () => {
39
+ const el = await fixture(html`
40
+ <sp-button variant="white">Button</sp-button>
41
+ `);
42
+ await elementUpdated(el);
43
+ expect(consoleWarnStub.called).to.be.true;
44
+ const spyCall = consoleWarnStub.getCall(0);
45
+ expect(
46
+ spyCall.args.at(0).includes("deprecated"),
47
+ "confirm deprecated variant warning"
48
+ ).to.be.true;
49
+ expect(spyCall.args.at(-1), "confirm `data` shape").to.deep.equal({
50
+ data: {
51
+ localName: "sp-button",
52
+ type: "api",
53
+ level: "deprecation"
54
+ }
55
+ });
56
+ });
57
+ it("loads default", async () => {
58
+ const el = await fixture(html`
59
+ <sp-button>Button</sp-button>
60
+ `);
61
+ await elementUpdated(el);
62
+ expect(el).to.not.be.undefined;
63
+ expect(el.textContent).to.include("Button");
64
+ await expect(el).to.be.accessible();
65
+ expect(el.variant).to.equal("accent");
66
+ expect(el.getAttribute("variant")).to.equal("accent");
67
+ });
68
+ it("loads default w/ an icon", async () => {
69
+ const el = await fixture(html`
70
+ <sp-button label="">
71
+ Button
72
+ <svg slot="icon"></svg>
73
+ </sp-button>
74
+ `);
75
+ await elementUpdated(el);
76
+ expect(el).to.not.be.undefined;
77
+ expect(el.textContent).to.include("Button");
78
+ expect(!el.hasIcon);
79
+ await expect(el).to.be.accessible();
80
+ });
81
+ it("loads default only icon", async () => {
82
+ const el = await fixture(html`
83
+ <sp-button label="Button" icon-only>
84
+ <svg slot="icon"></svg>
85
+ </sp-button>
86
+ `);
87
+ await elementUpdated(el);
88
+ expect(el).to.not.be.undefined;
89
+ await expect(el).to.be.accessible();
90
+ });
91
+ it("has a stable/predictable `updateComplete`", async () => {
92
+ const test = await fixture(html`
93
+ <div></div>
94
+ `);
95
+ let keydownTime = -1;
96
+ let updateComplete1 = -1;
97
+ let updateComplete2 = -1;
98
+ const el = document.createElement("sp-button");
99
+ el.autofocus = true;
100
+ el.addEventListener("keydown", () => {
101
+ keydownTime = performance.now();
102
+ });
103
+ el.updateComplete.then(() => {
104
+ updateComplete1 = performance.now();
105
+ });
106
+ el.updateComplete.then(() => {
107
+ updateComplete2 = performance.now();
108
+ });
109
+ test.append(el);
110
+ await nextFrame();
111
+ await nextFrame();
112
+ await nextFrame();
113
+ await nextFrame();
114
+ expect(keydownTime, "keydown happened").to.not.eq(-1);
115
+ expect(updateComplete1, "first update complete happened").to.not.eq(
116
+ -1
117
+ );
118
+ expect(updateComplete2, "first update complete happened").to.not.eq(
119
+ -1
120
+ );
121
+ expect(updateComplete1).lte(updateComplete2);
122
+ expect(updateComplete2).lte(keydownTime);
123
+ });
124
+ it('manages "role"', async () => {
125
+ const el = await fixture(html`
126
+ <sp-button>Button</sp-button>
127
+ `);
128
+ await elementUpdated(el);
129
+ expect(el.getAttribute("role")).to.equal("button");
130
+ el.setAttribute("href", "#");
131
+ await elementUpdated(el);
132
+ expect(el.getAttribute("role")).to.equal("link");
133
+ el.removeAttribute("href");
134
+ await elementUpdated(el);
135
+ expect(el.getAttribute("role")).to.equal("button");
136
+ });
137
+ it("allows label to be toggled", async () => {
138
+ const testNode = document.createTextNode("Button");
139
+ const el = await fixture(html`
140
+ <sp-button>
141
+ ${testNode}
142
+ <svg slot="icon"></svg>
143
+ </sp-button>
144
+ `);
145
+ await elementUpdated(el);
146
+ const labelTestableEl = el;
147
+ expect(labelTestableEl.hasLabel, "starts with label").to.be.true;
148
+ testNode.textContent = "";
149
+ await elementUpdated(el);
150
+ await waitUntil(
151
+ () => !labelTestableEl.hasLabel,
152
+ "label is removed"
153
+ );
154
+ testNode.textContent = "Button";
155
+ await elementUpdated(el);
156
+ expect(labelTestableEl.hasLabel, "label is returned").to.be.true;
157
+ });
158
+ it("loads with href", async () => {
159
+ const el = await fixture(html`
160
+ <sp-button href="test_url">With Href</sp-button>
161
+ `);
162
+ await elementUpdated(el);
163
+ expect(el).to.not.be.undefined;
164
+ expect(el.textContent).to.include("With Href");
165
+ });
166
+ it("loads with href and target", async () => {
167
+ const el = await fixture(html`
168
+ <sp-button href="test_url" target="_blank">
169
+ With Target
170
+ </sp-button>
171
+ `);
172
+ await elementUpdated(el);
173
+ expect(el).to.not.be.undefined;
174
+ expect(el.textContent).to.include("With Target");
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
+ });
202
+ it("accepts shift+tab interactions", async () => {
203
+ let focusedCount = 0;
204
+ const el = await fixture(html`
205
+ <sp-button href="test_url" target="_blank">
206
+ With Target
207
+ </sp-button>
208
+ `);
209
+ await elementUpdated(el);
210
+ const input = document.createElement("input");
211
+ el.insertAdjacentElement("beforebegin", input);
212
+ input.focus();
213
+ expect(document.activeElement === input).to.be.true;
214
+ el.addEventListener("focus", () => {
215
+ focusedCount += 1;
216
+ });
217
+ expect(focusedCount).to.equal(0);
218
+ await sendKeys({
219
+ press: "Tab"
220
+ });
221
+ await elementUpdated(el);
222
+ expect(document.activeElement === el).to.be.true;
223
+ expect(focusedCount).to.equal(1);
224
+ await sendKeys({
225
+ press: "Shift+Tab"
226
+ });
227
+ await elementUpdated(el);
228
+ expect(focusedCount).to.equal(1);
229
+ expect(document.activeElement === input).to.be.true;
230
+ });
231
+ it("manages `disabled`", async () => {
232
+ const clickSpy = spy();
233
+ const el = await fixture(html`
234
+ <sp-button @click=${() => clickSpy()}>Button</sp-button>
235
+ `);
236
+ await elementUpdated(el);
237
+ el.click();
238
+ await elementUpdated(el);
239
+ expect(clickSpy.calledOnce).to.be.true;
240
+ clickSpy.resetHistory();
241
+ el.disabled = true;
242
+ await elementUpdated(el);
243
+ el.click();
244
+ await elementUpdated(el);
245
+ expect(clickSpy.callCount).to.equal(0);
246
+ clickSpy.resetHistory();
247
+ await elementUpdated(el);
248
+ el.dispatchEvent(new Event("click", {}));
249
+ await elementUpdated(el);
250
+ expect(clickSpy.callCount).to.equal(0);
251
+ clickSpy.resetHistory();
252
+ el.disabled = false;
253
+ el.click();
254
+ await elementUpdated(el);
255
+ expect(clickSpy.calledOnce).to.be.true;
256
+ });
257
+ it("`disabled` manages `tabindex`", async () => {
258
+ const el = await fixture(html`
259
+ <sp-button disabled>Button</sp-button>
260
+ `);
261
+ await elementUpdated(el);
262
+ expect(el.tabIndex).to.equal(-1);
263
+ expect(el.getAttribute("tabindex")).to.equal("-1");
264
+ el.disabled = false;
265
+ await elementUpdated(el);
266
+ expect(el.tabIndex).to.equal(0);
267
+ expect(el.getAttribute("tabindex")).to.equal("0");
268
+ el.disabled = true;
269
+ await elementUpdated(el);
270
+ expect(el.tabIndex).to.equal(-1);
271
+ expect(el.getAttribute("tabindex")).to.equal("-1");
272
+ });
273
+ it("manages `aria-disabled`", async () => {
274
+ const el = await fixture(html`
275
+ <sp-button href="test_url" target="_blank">
276
+ With Target
277
+ </sp-button>
278
+ `);
279
+ await elementUpdated(el);
280
+ expect(el.hasAttribute("aria-disabled"), "initially not").to.be.false;
281
+ el.disabled = true;
282
+ await elementUpdated(el);
283
+ expect(el.getAttribute("aria-disabled")).to.equal("true");
284
+ el.disabled = false;
285
+ await elementUpdated(el);
286
+ expect(el.hasAttribute("aria-disabled"), "finally not").to.be.false;
287
+ });
288
+ it("manages aria-label from disabled state", async () => {
289
+ const el = await fixture(html`
290
+ <sp-button
291
+ href="test_url"
292
+ target="_blank"
293
+ label="clickable"
294
+ disabled
295
+ pending-label="Pending Button"
296
+ >
297
+ Click me
298
+ </sp-button>
299
+ `);
300
+ await elementUpdated(el);
301
+ expect(el.getAttribute("aria-label")).to.equal("clickable");
302
+ el.pending = true;
303
+ await elementUpdated(el);
304
+ expect(el.getAttribute("aria-label")).to.equal("clickable");
305
+ el.disabled = false;
306
+ await elementUpdated(el);
307
+ expect(el.getAttribute("aria-label")).to.equal("Pending Button");
308
+ el.pending = false;
309
+ await elementUpdated(el);
310
+ expect(el.getAttribute("aria-label")).to.equal("clickable");
311
+ });
312
+ it("manages aria-label from pending state", async () => {
313
+ const el = await fixture(html`
314
+ <sp-button
315
+ href="test_url"
316
+ target="_blank"
317
+ label="clickable"
318
+ pending
319
+ >
320
+ Click me
321
+ </sp-button>
322
+ `);
323
+ await elementUpdated(el);
324
+ expect(el.getAttribute("aria-label")).to.equal("Pending");
325
+ el.disabled = true;
326
+ await elementUpdated(el);
327
+ expect(el.getAttribute("aria-label")).to.equal("clickable");
328
+ el.pending = false;
329
+ await elementUpdated(el);
330
+ expect(el.getAttribute("aria-label")).to.equal("clickable");
331
+ el.disabled = false;
332
+ await elementUpdated(el);
333
+ expect(el.getAttribute("aria-label")).to.equal("clickable");
334
+ });
335
+ it("manages aria-label set from outside", async () => {
336
+ const el = await fixture(html`
337
+ <sp-button
338
+ href="test_url"
339
+ target="_blank"
340
+ aria-label="test"
341
+ pending-label="Pending Button"
342
+ >
343
+ Click me
344
+ </sp-button>
345
+ `);
346
+ await elementUpdated(el);
347
+ expect(el.getAttribute("aria-label")).to.equal("test");
348
+ el.pending = true;
349
+ await elementUpdated(el);
350
+ expect(el.getAttribute("aria-label")).to.equal("Pending Button");
351
+ el.disabled = true;
352
+ await elementUpdated(el);
353
+ expect(el.getAttribute("aria-label")).to.equal("test");
354
+ el.disabled = false;
355
+ await elementUpdated(el);
356
+ expect(el.getAttribute("aria-label")).to.equal("Pending Button");
357
+ el.pending = false;
358
+ await elementUpdated(el);
359
+ expect(el.getAttribute("aria-label")).to.equal("test");
360
+ });
361
+ it("updates pending label accessibly", async () => {
362
+ const el = await fixture(html`
363
+ <sp-button href="test_url" target="_blank">Button</sp-button>
364
+ `);
365
+ await elementUpdated(el);
366
+ el.pending = true;
367
+ await elementUpdated(el);
368
+ await nextFrame();
369
+ let snapshot = await a11ySnapshot({});
370
+ expect(
371
+ findAccessibilityNode(
372
+ snapshot,
373
+ (node) => node.name === "Pending"
374
+ ),
375
+ "`Pending` is the label text"
376
+ ).to.not.be.null;
377
+ expect(el.pending).to.be.true;
378
+ el.pending = false;
379
+ await elementUpdated(el);
380
+ await nextFrame();
381
+ snapshot = await a11ySnapshot({});
382
+ expect(
383
+ findAccessibilityNode(
384
+ snapshot,
385
+ (node) => node.name === "Button"
386
+ ),
387
+ "`Button` is the label text"
388
+ ).to.not.be.null;
389
+ expect(el.pending).to.be.false;
390
+ });
391
+ it("manages tabIndex while disabled", async () => {
392
+ const el = await fixture(html`
393
+ <sp-button href="test_url" target="_blank">
394
+ With Target
395
+ </sp-button>
396
+ `);
397
+ await elementUpdated(el);
398
+ expect(el.tabIndex).to.equal(0);
399
+ el.disabled = true;
400
+ await elementUpdated(el);
401
+ expect(el.tabIndex).to.equal(-1);
402
+ el.tabIndex = 2;
403
+ await elementUpdated(el);
404
+ expect(el.tabIndex).to.equal(-1);
405
+ el.disabled = false;
406
+ await elementUpdated(el);
407
+ expect(el.tabIndex).to.equal(2);
408
+ });
409
+ it("swallows `click` interaction when `[disabled]`", async () => {
410
+ const clickSpy = spy();
411
+ const el = await fixture(html`
412
+ <sp-button disabled @click=${() => clickSpy()}>
413
+ Button
414
+ </sp-button>
415
+ `);
416
+ await elementUpdated(el);
417
+ expect(clickSpy.callCount).to.equal(0);
418
+ el.click();
419
+ await elementUpdated(el);
420
+ expect(clickSpy.callCount).to.equal(0);
421
+ });
422
+ it("translates keyboard interactions to click", async () => {
423
+ const clickSpy = spy();
424
+ const el = await fixture(html`
425
+ <sp-button @click=${() => clickSpy()}>Button</sp-button>
426
+ `);
427
+ await elementUpdated(el);
428
+ el.dispatchEvent(
429
+ new KeyboardEvent("keypress", {
430
+ bubbles: true,
431
+ composed: true,
432
+ cancelable: true,
433
+ code: "Enter",
434
+ key: "Enter"
435
+ })
436
+ );
437
+ await elementUpdated(el);
438
+ expect(clickSpy.callCount).to.equal(1);
439
+ clickSpy.resetHistory();
440
+ el.dispatchEvent(
441
+ new KeyboardEvent("keypress", {
442
+ bubbles: true,
443
+ composed: true,
444
+ cancelable: true,
445
+ code: "NumpadEnter",
446
+ key: "NumpadEnter"
447
+ })
448
+ );
449
+ await elementUpdated(el);
450
+ expect(clickSpy.callCount).to.equal(1);
451
+ clickSpy.resetHistory();
452
+ el.dispatchEvent(
453
+ new KeyboardEvent("keypress", {
454
+ bubbles: true,
455
+ composed: true,
456
+ cancelable: true,
457
+ code: "Space",
458
+ key: "Space"
459
+ })
460
+ );
461
+ await elementUpdated(el);
462
+ expect(clickSpy.callCount).to.equal(0);
463
+ clickSpy.resetHistory();
464
+ el.dispatchEvent(
465
+ new KeyboardEvent("keydown", {
466
+ bubbles: true,
467
+ composed: true,
468
+ cancelable: true,
469
+ code: "Space",
470
+ key: "Space"
471
+ })
472
+ );
473
+ el.dispatchEvent(
474
+ new KeyboardEvent("keyup", {
475
+ bubbles: true,
476
+ composed: true,
477
+ cancelable: true,
478
+ code: "Space",
479
+ key: "Space"
480
+ })
481
+ );
482
+ await elementUpdated(el);
483
+ expect(clickSpy.callCount).to.equal(1);
484
+ clickSpy.resetHistory();
485
+ el.dispatchEvent(
486
+ new KeyboardEvent("keydown", {
487
+ bubbles: true,
488
+ composed: true,
489
+ cancelable: true,
490
+ code: "Space",
491
+ key: "Space"
492
+ })
493
+ );
494
+ el.dispatchEvent(
495
+ new KeyboardEvent("keyup", {
496
+ bubbles: true,
497
+ composed: true,
498
+ cancelable: true,
499
+ code: "KeyG",
500
+ key: "g"
501
+ })
502
+ );
503
+ await elementUpdated(el);
504
+ expect(clickSpy.callCount).to.equal(0);
505
+ el.dispatchEvent(
506
+ new KeyboardEvent("keyup", {
507
+ bubbles: true,
508
+ composed: true,
509
+ cancelable: true,
510
+ code: "Space",
511
+ key: "Space"
512
+ })
513
+ );
514
+ clickSpy.resetHistory();
515
+ el.dispatchEvent(
516
+ new KeyboardEvent("keydown", {
517
+ bubbles: true,
518
+ composed: true,
519
+ cancelable: true,
520
+ code: "KeyG",
521
+ key: "g"
522
+ })
523
+ );
524
+ el.dispatchEvent(
525
+ new KeyboardEvent("keyup", {
526
+ bubbles: true,
527
+ composed: true,
528
+ cancelable: true,
529
+ code: "Space",
530
+ key: "Space"
531
+ })
532
+ );
533
+ await elementUpdated(el);
534
+ expect(clickSpy.callCount).to.equal(0);
535
+ });
536
+ it('proxies clicks by "type"', async () => {
537
+ const submitSpy = spy();
538
+ const resetSpy = spy();
539
+ const test = await fixture(html`
540
+ <form
541
+ @submit=${(event) => {
542
+ event.preventDefault();
543
+ submitSpy();
544
+ }}
545
+ @reset=${(event) => {
546
+ event.preventDefault();
547
+ resetSpy();
548
+ }}
549
+ >
550
+ <sp-button>Button</sp-button>
551
+ </form>
552
+ `);
553
+ const el = test.querySelector("sp-button");
554
+ await elementUpdated(el);
555
+ el.type = "submit";
556
+ await elementUpdated(el);
557
+ el.click();
558
+ expect(submitSpy.callCount).to.equal(1);
559
+ expect(resetSpy.callCount).to.equal(0);
560
+ el.type = "reset";
561
+ await elementUpdated(el);
562
+ el.click();
563
+ expect(submitSpy.callCount).to.equal(1);
564
+ expect(resetSpy.callCount).to.equal(1);
565
+ el.type = "button";
566
+ await elementUpdated(el);
567
+ el.click();
568
+ expect(submitSpy.callCount).to.equal(1);
569
+ expect(resetSpy.callCount).to.equal(1);
570
+ });
571
+ it("proxies click by [href]", async () => {
572
+ const clickSpy = spy();
573
+ const el = await fixture(html`
574
+ <sp-button href="test_url">With Href</sp-button>
575
+ `);
576
+ await elementUpdated(el);
577
+ el.anchorElement.addEventListener("click", (event) => {
578
+ event.preventDefault();
579
+ event.stopPropagation();
580
+ clickSpy();
581
+ });
582
+ expect(clickSpy.callCount).to.equal(0);
583
+ el.click();
584
+ await elementUpdated(el);
585
+ expect(clickSpy.callCount).to.equal(1);
586
+ });
587
+ it('manages "active" while focused', async () => {
588
+ const el = await fixture(html`
589
+ <sp-button label="Button">
590
+ <svg slot="icon"></svg>
591
+ </sp-button>
592
+ `);
593
+ await elementUpdated(el);
594
+ el.focus();
595
+ await elementUpdated(el);
596
+ await sendKeys({
597
+ down: "Space"
598
+ });
599
+ await elementUpdated(el);
600
+ expect(el.active).to.be.true;
601
+ await sendKeys({
602
+ up: "Space"
603
+ });
604
+ await elementUpdated(el);
605
+ expect(el.active).to.be.false;
606
+ });
607
+ describe("deprecated variants and attributes", () => {
608
+ it("manages [quiet]", async () => {
609
+ const el = await fixture(html`
610
+ <sp-button quiet>Button</sp-button>
611
+ `);
612
+ await elementUpdated(el);
613
+ expect(el.treatment).to.equal("outline");
614
+ el.quiet = false;
615
+ await elementUpdated(el);
616
+ expect(el.treatment).to.equal("fill");
617
+ });
618
+ it('upgrades [variant="cta"] to [variant="accent"]', async () => {
619
+ const el = await fixture(html`
620
+ <sp-button variant="cta">Button</sp-button>
621
+ `);
622
+ await elementUpdated(el);
623
+ expect(el.variant).to.equal("accent");
624
+ });
625
+ it('manages [variant="overBackground"]', async () => {
626
+ const el = await fixture(html`
627
+ <sp-button variant="overBackground">Button</sp-button>
628
+ `);
629
+ await elementUpdated(el);
630
+ expect(el.getAttribute("variant")).to.not.equal(
631
+ "overBackground"
632
+ );
633
+ expect(el.treatment).to.equal("outline");
634
+ expect(el.staticColor).to.equal("white");
635
+ });
636
+ ["white", "black"].forEach((variant) => {
637
+ it(`manages [variant="${variant}"]`, async () => {
638
+ const el = await fixture(html`
639
+ <sp-button variant="${variant}">
640
+ Button
641
+ </sp-button>
642
+ `);
643
+ await elementUpdated(el);
644
+ expect(el.hasAttribute("variant")).to.not.equal(variant);
645
+ expect(el.staticColor).to.equal(variant);
646
+ expect(el.getAttribute("static-color")).to.equal(variant);
647
+ });
648
+ });
649
+ it('forces [variant="accent"]', async () => {
650
+ const el = await fixture(html`
651
+ <sp-button variant="not-supported">Button</sp-button>
652
+ `);
653
+ await elementUpdated(el);
654
+ expect(el.variant).to.equal("accent");
655
+ });
656
+ });
657
+ });
658
+ });
659
+ //# sourceMappingURL=button.test.js.map