@spectrum-web-components/button 0.42.4 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +10 -10
- package/test/button.test.js +161 -193
- package/test/button.test.js.map +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/button",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -82,16 +82,16 @@
|
|
|
82
82
|
"lit-html"
|
|
83
83
|
],
|
|
84
84
|
"dependencies": {
|
|
85
|
-
"@spectrum-web-components/base": "^0.
|
|
86
|
-
"@spectrum-web-components/clear-button": "^0.
|
|
87
|
-
"@spectrum-web-components/close-button": "^0.
|
|
88
|
-
"@spectrum-web-components/icon": "^0.
|
|
89
|
-
"@spectrum-web-components/icons-ui": "^0.
|
|
90
|
-
"@spectrum-web-components/progress-circle": "^0.
|
|
91
|
-
"@spectrum-web-components/shared": "^0.
|
|
85
|
+
"@spectrum-web-components/base": "^0.43.0",
|
|
86
|
+
"@spectrum-web-components/clear-button": "^0.43.0",
|
|
87
|
+
"@spectrum-web-components/close-button": "^0.43.0",
|
|
88
|
+
"@spectrum-web-components/icon": "^0.43.0",
|
|
89
|
+
"@spectrum-web-components/icons-ui": "^0.43.0",
|
|
90
|
+
"@spectrum-web-components/progress-circle": "^0.43.0",
|
|
91
|
+
"@spectrum-web-components/shared": "^0.43.0"
|
|
92
92
|
},
|
|
93
93
|
"devDependencies": {
|
|
94
|
-
"@spectrum-css/button": "^13.1.
|
|
94
|
+
"@spectrum-css/button": "^13.1.1"
|
|
95
95
|
},
|
|
96
96
|
"types": "./src/index.d.ts",
|
|
97
97
|
"customElements": "custom-elements.json",
|
|
@@ -99,5 +99,5 @@
|
|
|
99
99
|
"./sp-*.js",
|
|
100
100
|
"./**/*.dev.js"
|
|
101
101
|
],
|
|
102
|
-
"gitHead": "
|
|
102
|
+
"gitHead": "dd5179a5eae5fe69ac77c5e10faed912d0e780e3"
|
|
103
103
|
}
|
package/test/button.test.js
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
waitUntil
|
|
10
10
|
} from "@open-wc/testing";
|
|
11
11
|
import { testForLitDevWarnings } from "../../../test/testing-helpers.js";
|
|
12
|
+
import { stub } from "sinon";
|
|
12
13
|
import {
|
|
13
14
|
a11ySnapshot,
|
|
14
15
|
findAccessibilityNode,
|
|
@@ -17,18 +18,47 @@ import {
|
|
|
17
18
|
import { spy } from "sinon";
|
|
18
19
|
describe("Button", () => {
|
|
19
20
|
testForLitDevWarnings(
|
|
20
|
-
async () => await fixture(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
`
|
|
24
|
-
)
|
|
21
|
+
async () => await fixture(html`
|
|
22
|
+
<sp-button tabindex="0">Button</sp-button>
|
|
23
|
+
`)
|
|
25
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 tabindex="0" 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: "default"
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
26
58
|
it("loads default", async () => {
|
|
27
|
-
const el = await fixture(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
`
|
|
31
|
-
);
|
|
59
|
+
const el = await fixture(html`
|
|
60
|
+
<sp-button tabindex="0">Button</sp-button>
|
|
61
|
+
`);
|
|
32
62
|
await elementUpdated(el);
|
|
33
63
|
expect(el).to.not.be.undefined;
|
|
34
64
|
expect(el.textContent).to.include("Button");
|
|
@@ -37,24 +67,20 @@ describe("Button", () => {
|
|
|
37
67
|
expect(el.getAttribute("variant")).to.equal("accent");
|
|
38
68
|
});
|
|
39
69
|
it("loads default w/ element content", async () => {
|
|
40
|
-
const el = await fixture(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
`
|
|
44
|
-
);
|
|
70
|
+
const el = await fixture(html`
|
|
71
|
+
<sp-button label="Button"><svg></svg></sp-button>
|
|
72
|
+
`);
|
|
45
73
|
await elementUpdated(el);
|
|
46
74
|
expect(el).to.not.be.undefined;
|
|
47
75
|
await expect(el).to.be.accessible();
|
|
48
76
|
});
|
|
49
77
|
it("loads default w/ an icon", async () => {
|
|
50
|
-
const el = await fixture(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
`
|
|
57
|
-
);
|
|
78
|
+
const el = await fixture(html`
|
|
79
|
+
<sp-button label="">
|
|
80
|
+
Button
|
|
81
|
+
<svg slot="icon"></svg>
|
|
82
|
+
</sp-button>
|
|
83
|
+
`);
|
|
58
84
|
await elementUpdated(el);
|
|
59
85
|
expect(el).to.not.be.undefined;
|
|
60
86
|
expect(el.textContent).to.include("Button");
|
|
@@ -62,23 +88,19 @@ describe("Button", () => {
|
|
|
62
88
|
await expect(el).to.be.accessible();
|
|
63
89
|
});
|
|
64
90
|
it("loads default only icon", async () => {
|
|
65
|
-
const el = await fixture(
|
|
66
|
-
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
`
|
|
71
|
-
);
|
|
91
|
+
const el = await fixture(html`
|
|
92
|
+
<sp-button label="Button" icon-only>
|
|
93
|
+
<svg slot="icon"></svg>
|
|
94
|
+
</sp-button>
|
|
95
|
+
`);
|
|
72
96
|
await elementUpdated(el);
|
|
73
97
|
expect(el).to.not.be.undefined;
|
|
74
98
|
await expect(el).to.be.accessible();
|
|
75
99
|
});
|
|
76
100
|
it("has a stable/predictable `updateComplete`", async () => {
|
|
77
|
-
const test = await fixture(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
`
|
|
81
|
-
);
|
|
101
|
+
const test = await fixture(html`
|
|
102
|
+
<div></div>
|
|
103
|
+
`);
|
|
82
104
|
let keydownTime = -1;
|
|
83
105
|
let updateComplete1 = -1;
|
|
84
106
|
let updateComplete2 = -1;
|
|
@@ -105,11 +127,9 @@ describe("Button", () => {
|
|
|
105
127
|
expect(updateComplete2).lte(keydownTime);
|
|
106
128
|
});
|
|
107
129
|
it('manages "role"', async () => {
|
|
108
|
-
const el = await fixture(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
`
|
|
112
|
-
);
|
|
130
|
+
const el = await fixture(html`
|
|
131
|
+
<sp-button>Button</sp-button>
|
|
132
|
+
`);
|
|
113
133
|
await elementUpdated(el);
|
|
114
134
|
expect(el.getAttribute("role")).to.equal("button");
|
|
115
135
|
el.setAttribute("href", "#");
|
|
@@ -121,14 +141,12 @@ describe("Button", () => {
|
|
|
121
141
|
});
|
|
122
142
|
it("allows label to be toggled", async () => {
|
|
123
143
|
const testNode = document.createTextNode("Button");
|
|
124
|
-
const el = await fixture(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
`
|
|
131
|
-
);
|
|
144
|
+
const el = await fixture(html`
|
|
145
|
+
<sp-button>
|
|
146
|
+
${testNode}
|
|
147
|
+
<svg slot="icon"></svg>
|
|
148
|
+
</sp-button>
|
|
149
|
+
`);
|
|
132
150
|
await elementUpdated(el);
|
|
133
151
|
const labelTestableEl = el;
|
|
134
152
|
expect(labelTestableEl.hasLabel, "starts with label").to.be.true;
|
|
@@ -140,36 +158,26 @@ describe("Button", () => {
|
|
|
140
158
|
expect(labelTestableEl.hasLabel, "label is returned").to.be.true;
|
|
141
159
|
});
|
|
142
160
|
it("loads with href", async () => {
|
|
143
|
-
const el = await fixture(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
`
|
|
147
|
-
);
|
|
161
|
+
const el = await fixture(html`
|
|
162
|
+
<sp-button href="test_url">With Href</sp-button>
|
|
163
|
+
`);
|
|
148
164
|
await elementUpdated(el);
|
|
149
165
|
expect(el).to.not.be.undefined;
|
|
150
166
|
expect(el.textContent).to.include("With Href");
|
|
151
167
|
});
|
|
152
168
|
it("loads with href and target", async () => {
|
|
153
|
-
const el = await fixture(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
With Target
|
|
157
|
-
</sp-button>
|
|
158
|
-
`
|
|
159
|
-
);
|
|
169
|
+
const el = await fixture(html`
|
|
170
|
+
<sp-button href="test_url" target="_blank">With Target</sp-button>
|
|
171
|
+
`);
|
|
160
172
|
await elementUpdated(el);
|
|
161
173
|
expect(el).to.not.be.undefined;
|
|
162
174
|
expect(el.textContent).to.include("With Target");
|
|
163
175
|
});
|
|
164
176
|
it("accepts shit+tab interactions", async () => {
|
|
165
177
|
let focusedCount = 0;
|
|
166
|
-
const el = await fixture(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
With Target
|
|
170
|
-
</sp-button>
|
|
171
|
-
`
|
|
172
|
-
);
|
|
178
|
+
const el = await fixture(html`
|
|
179
|
+
<sp-button href="test_url" target="_blank">With Target</sp-button>
|
|
180
|
+
`);
|
|
173
181
|
await elementUpdated(el);
|
|
174
182
|
const input = document.createElement("input");
|
|
175
183
|
el.insertAdjacentElement("beforebegin", input);
|
|
@@ -194,11 +202,9 @@ describe("Button", () => {
|
|
|
194
202
|
});
|
|
195
203
|
it("manages `disabled`", async () => {
|
|
196
204
|
const clickSpy = spy();
|
|
197
|
-
const el = await fixture(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
`
|
|
201
|
-
);
|
|
205
|
+
const el = await fixture(html`
|
|
206
|
+
<sp-button @click=${() => clickSpy()}>Button</sp-button>
|
|
207
|
+
`);
|
|
202
208
|
await elementUpdated(el);
|
|
203
209
|
el.click();
|
|
204
210
|
await elementUpdated(el);
|
|
@@ -221,11 +227,9 @@ describe("Button", () => {
|
|
|
221
227
|
expect(clickSpy.calledOnce).to.be.true;
|
|
222
228
|
});
|
|
223
229
|
it("`disabled` manages `tabindex`", async () => {
|
|
224
|
-
const el = await fixture(
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
`
|
|
228
|
-
);
|
|
230
|
+
const el = await fixture(html`
|
|
231
|
+
<sp-button disabled>Button</sp-button>
|
|
232
|
+
`);
|
|
229
233
|
await elementUpdated(el);
|
|
230
234
|
expect(el.tabIndex).to.equal(-1);
|
|
231
235
|
expect(el.getAttribute("tabindex")).to.equal("-1");
|
|
@@ -239,13 +243,9 @@ describe("Button", () => {
|
|
|
239
243
|
expect(el.getAttribute("tabindex")).to.equal("-1");
|
|
240
244
|
});
|
|
241
245
|
it("manages `aria-disabled`", async () => {
|
|
242
|
-
const el = await fixture(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
With Target
|
|
246
|
-
</sp-button>
|
|
247
|
-
`
|
|
248
|
-
);
|
|
246
|
+
const el = await fixture(html`
|
|
247
|
+
<sp-button href="test_url" target="_blank">With Target</sp-button>
|
|
248
|
+
`);
|
|
249
249
|
await elementUpdated(el);
|
|
250
250
|
expect(el.hasAttribute("aria-disabled"), "initially not").to.be.false;
|
|
251
251
|
el.disabled = true;
|
|
@@ -256,19 +256,17 @@ describe("Button", () => {
|
|
|
256
256
|
expect(el.hasAttribute("aria-disabled"), "finally not").to.be.false;
|
|
257
257
|
});
|
|
258
258
|
it("manages aria-label from disabled state", async () => {
|
|
259
|
-
const el = await fixture(
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
`
|
|
271
|
-
);
|
|
259
|
+
const el = await fixture(html`
|
|
260
|
+
<sp-button
|
|
261
|
+
href="test_url"
|
|
262
|
+
target="_blank"
|
|
263
|
+
label="clickable"
|
|
264
|
+
disabled
|
|
265
|
+
pending-label="Pending Button"
|
|
266
|
+
>
|
|
267
|
+
Click me
|
|
268
|
+
</sp-button>
|
|
269
|
+
`);
|
|
272
270
|
await elementUpdated(el);
|
|
273
271
|
expect(el.getAttribute("aria-label")).to.equal("clickable");
|
|
274
272
|
el.pending = true;
|
|
@@ -282,18 +280,16 @@ describe("Button", () => {
|
|
|
282
280
|
expect(el.getAttribute("aria-label")).to.equal("clickable");
|
|
283
281
|
});
|
|
284
282
|
it("manages aria-label from pending state", async () => {
|
|
285
|
-
const el = await fixture(
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
`
|
|
296
|
-
);
|
|
283
|
+
const el = await fixture(html`
|
|
284
|
+
<sp-button
|
|
285
|
+
href="test_url"
|
|
286
|
+
target="_blank"
|
|
287
|
+
label="clickable"
|
|
288
|
+
pending
|
|
289
|
+
>
|
|
290
|
+
Click me
|
|
291
|
+
</sp-button>
|
|
292
|
+
`);
|
|
297
293
|
await elementUpdated(el);
|
|
298
294
|
expect(el.getAttribute("aria-label")).to.equal("Pending");
|
|
299
295
|
el.disabled = true;
|
|
@@ -307,18 +303,16 @@ describe("Button", () => {
|
|
|
307
303
|
expect(el.getAttribute("aria-label")).to.equal("clickable");
|
|
308
304
|
});
|
|
309
305
|
it("manages aria-label set from outside", async () => {
|
|
310
|
-
const el = await fixture(
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
`
|
|
321
|
-
);
|
|
306
|
+
const el = await fixture(html`
|
|
307
|
+
<sp-button
|
|
308
|
+
href="test_url"
|
|
309
|
+
target="_blank"
|
|
310
|
+
aria-label="test"
|
|
311
|
+
pending-label="Pending Button"
|
|
312
|
+
>
|
|
313
|
+
Click me
|
|
314
|
+
</sp-button>
|
|
315
|
+
`);
|
|
322
316
|
await elementUpdated(el);
|
|
323
317
|
expect(el.getAttribute("aria-label")).to.equal("test");
|
|
324
318
|
el.pending = true;
|
|
@@ -335,11 +329,9 @@ describe("Button", () => {
|
|
|
335
329
|
expect(el.getAttribute("aria-label")).to.equal("test");
|
|
336
330
|
});
|
|
337
331
|
it("updates pending label accessibly", async () => {
|
|
338
|
-
const el = await fixture(
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
`
|
|
342
|
-
);
|
|
332
|
+
const el = await fixture(html`
|
|
333
|
+
<sp-button href="test_url" target="_blank">Button</sp-button>
|
|
334
|
+
`);
|
|
343
335
|
await elementUpdated(el);
|
|
344
336
|
el.pending = true;
|
|
345
337
|
await elementUpdated(el);
|
|
@@ -367,13 +359,9 @@ describe("Button", () => {
|
|
|
367
359
|
expect(el.pending).to.be.false;
|
|
368
360
|
});
|
|
369
361
|
it("manages tabIndex while disabled", async () => {
|
|
370
|
-
const el = await fixture(
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
With Target
|
|
374
|
-
</sp-button>
|
|
375
|
-
`
|
|
376
|
-
);
|
|
362
|
+
const el = await fixture(html`
|
|
363
|
+
<sp-button href="test_url" target="_blank">With Target</sp-button>
|
|
364
|
+
`);
|
|
377
365
|
await elementUpdated(el);
|
|
378
366
|
expect(el.tabIndex).to.equal(0);
|
|
379
367
|
el.disabled = true;
|
|
@@ -388,13 +376,9 @@ describe("Button", () => {
|
|
|
388
376
|
});
|
|
389
377
|
it("swallows `click` interaction when `[disabled]`", async () => {
|
|
390
378
|
const clickSpy = spy();
|
|
391
|
-
const el = await fixture(
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
Button
|
|
395
|
-
</sp-button>
|
|
396
|
-
`
|
|
397
|
-
);
|
|
379
|
+
const el = await fixture(html`
|
|
380
|
+
<sp-button disabled @click=${() => clickSpy()}>Button</sp-button>
|
|
381
|
+
`);
|
|
398
382
|
await elementUpdated(el);
|
|
399
383
|
expect(clickSpy.callCount).to.equal(0);
|
|
400
384
|
el.click();
|
|
@@ -403,11 +387,9 @@ describe("Button", () => {
|
|
|
403
387
|
});
|
|
404
388
|
it("translates keyboard interactions to click", async () => {
|
|
405
389
|
const clickSpy = spy();
|
|
406
|
-
const el = await fixture(
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
`
|
|
410
|
-
);
|
|
390
|
+
const el = await fixture(html`
|
|
391
|
+
<sp-button @click=${() => clickSpy()}>Button</sp-button>
|
|
392
|
+
`);
|
|
411
393
|
await elementUpdated(el);
|
|
412
394
|
el.dispatchEvent(
|
|
413
395
|
new KeyboardEvent("keypress", {
|
|
@@ -520,22 +502,20 @@ describe("Button", () => {
|
|
|
520
502
|
it('proxies clicks by "type"', async () => {
|
|
521
503
|
const submitSpy = spy();
|
|
522
504
|
const resetSpy = spy();
|
|
523
|
-
const test = await fixture(
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
>
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
`
|
|
538
|
-
);
|
|
505
|
+
const test = await fixture(html`
|
|
506
|
+
<form
|
|
507
|
+
@submit=${(event) => {
|
|
508
|
+
event.preventDefault();
|
|
509
|
+
submitSpy();
|
|
510
|
+
}}
|
|
511
|
+
@reset=${(event) => {
|
|
512
|
+
event.preventDefault();
|
|
513
|
+
resetSpy();
|
|
514
|
+
}}
|
|
515
|
+
>
|
|
516
|
+
<sp-button>Button</sp-button>
|
|
517
|
+
</form>
|
|
518
|
+
`);
|
|
539
519
|
const el = test.querySelector("sp-button");
|
|
540
520
|
await elementUpdated(el);
|
|
541
521
|
el.type = "submit";
|
|
@@ -556,11 +536,9 @@ describe("Button", () => {
|
|
|
556
536
|
});
|
|
557
537
|
it("proxies click by [href]", async () => {
|
|
558
538
|
const clickSpy = spy();
|
|
559
|
-
const el = await fixture(
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
`
|
|
563
|
-
);
|
|
539
|
+
const el = await fixture(html`
|
|
540
|
+
<sp-button href="test_url">With Href</sp-button>
|
|
541
|
+
`);
|
|
564
542
|
await elementUpdated(el);
|
|
565
543
|
el.anchorElement.addEventListener("click", (event) => {
|
|
566
544
|
event.preventDefault();
|
|
@@ -573,13 +551,11 @@ describe("Button", () => {
|
|
|
573
551
|
expect(clickSpy.callCount).to.equal(1);
|
|
574
552
|
});
|
|
575
553
|
it('manages "active" while focused', async () => {
|
|
576
|
-
const el = await fixture(
|
|
577
|
-
|
|
578
|
-
<
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
`
|
|
582
|
-
);
|
|
554
|
+
const el = await fixture(html`
|
|
555
|
+
<sp-button label="Button">
|
|
556
|
+
<svg slot="icon"></svg>
|
|
557
|
+
</sp-button>
|
|
558
|
+
`);
|
|
583
559
|
await elementUpdated(el);
|
|
584
560
|
el.focus();
|
|
585
561
|
await elementUpdated(el);
|
|
@@ -596,11 +572,9 @@ describe("Button", () => {
|
|
|
596
572
|
});
|
|
597
573
|
describe("deprecated variants and attributes", () => {
|
|
598
574
|
it("manages [quiet]", async () => {
|
|
599
|
-
const el = await fixture(
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
`
|
|
603
|
-
);
|
|
575
|
+
const el = await fixture(html`
|
|
576
|
+
<sp-button quiet>Button</sp-button>
|
|
577
|
+
`);
|
|
604
578
|
await elementUpdated(el);
|
|
605
579
|
expect(el.treatment).to.equal("outline");
|
|
606
580
|
el.quiet = false;
|
|
@@ -608,31 +582,25 @@ describe("Button", () => {
|
|
|
608
582
|
expect(el.treatment).to.equal("fill");
|
|
609
583
|
});
|
|
610
584
|
it('upgrades [variant="cta"] to [variant="accent"]', async () => {
|
|
611
|
-
const el = await fixture(
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
`
|
|
615
|
-
);
|
|
585
|
+
const el = await fixture(html`
|
|
586
|
+
<sp-button variant="cta">Button</sp-button>
|
|
587
|
+
`);
|
|
616
588
|
await elementUpdated(el);
|
|
617
589
|
expect(el.variant).to.equal("accent");
|
|
618
590
|
});
|
|
619
591
|
it('manages [variant="overBackground"]', async () => {
|
|
620
|
-
const el = await fixture(
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
`
|
|
624
|
-
);
|
|
592
|
+
const el = await fixture(html`
|
|
593
|
+
<sp-button variant="overBackground">Button</sp-button>
|
|
594
|
+
`);
|
|
625
595
|
await elementUpdated(el);
|
|
626
596
|
expect(el.hasAttribute("variant")).to.not.equal("overBackground");
|
|
627
597
|
expect(el.treatment).to.equal("outline");
|
|
628
598
|
expect(el.static).to.equal("white");
|
|
629
599
|
});
|
|
630
600
|
it('forces [variant="accent"]', async () => {
|
|
631
|
-
const el = await fixture(
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
`
|
|
635
|
-
);
|
|
601
|
+
const el = await fixture(html`
|
|
602
|
+
<sp-button variant="not-supported">Button</sp-button>
|
|
603
|
+
`);
|
|
636
604
|
await elementUpdated(el);
|
|
637
605
|
expect(el.variant).to.equal("accent");
|
|
638
606
|
});
|
package/test/button.test.js.map
CHANGED
|
@@ -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 } from 'sinon';\n\ntype TestableButtonType = {\n hasLabel: boolean;\n};\n\ndescribe('Button', () => {\n testForLitDevWarnings(\n async () =>\n await fixture<Button>(\n html`\n <sp-button tabindex=\"0\">Button</sp-button>\n `\n )\n );\n it('loads default', async () => {\n const el = await fixture<Button>(\n html`\n <sp-button tabindex=\"0\">Button</sp-button>\n `\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/ element content', async () => {\n const el = await fixture<Button>(\n html`\n <sp-button label=\"Button\"><svg></svg></sp-button>\n `\n );\n\n await elementUpdated(el);\n expect(el).to.not.be.undefined;\n await expect(el).to.be.accessible();\n });\n it('loads default w/ an icon', async () => {\n const el = await fixture<Button>(\n html`\n <sp-button label=\"\">\n Button\n <svg slot=\"icon\"></svg>\n </sp-button>\n `\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>(\n html`\n <sp-button label=\"Button\" icon-only>\n <svg slot=\"icon\"></svg>\n </sp-button>\n `\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>(\n html`\n <div></div>\n `\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(-1);\n expect(updateComplete2, 'first update complete happened').to.not.eq(-1);\n expect(updateComplete1).lte(updateComplete2);\n expect(updateComplete2).lte(keydownTime);\n });\n it('manages \"role\"', async () => {\n const el = await fixture<Button>(\n html`\n <sp-button>Button</sp-button>\n `\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>(\n html`\n <sp-button>\n ${testNode}\n <svg slot=\"icon\"></svg>\n </sp-button>\n `\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(() => !labelTestableEl.hasLabel, 'label is removed');\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>(\n html`\n <sp-button href=\"test_url\">With Href</sp-button>\n `\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>(\n html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `\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 shit+tab interactions', async () => {\n let focusedCount = 0;\n const el = await fixture<Button>(\n html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `\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>(\n html`\n <sp-button @click=${() => clickSpy()}>Button</sp-button>\n `\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>(\n html`\n <sp-button disabled>Button</sp-button>\n `\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>(\n html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `\n );\n\n await elementUpdated(el);\n\n expect(el.hasAttribute('aria-disabled'), 'initially not').to.be.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>(\n 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\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>(\n 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 );\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>(\n 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 );\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>(\n html`\n <sp-button href=\"test_url\" target=\"_blank\">Button</sp-button>\n `\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>(\n html`\n <sp-button href=\"test_url\" target=\"_blank\">\n With Target\n </sp-button>\n `\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>(\n html`\n <sp-button disabled @click=${() => clickSpy()}>\n Button\n </sp-button>\n `\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>(\n html`\n <sp-button @click=${() => clickSpy()}>Button</sp-button>\n `\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>(\n 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 );\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>(\n html`\n <sp-button href=\"test_url\">With Href</sp-button>\n `\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>(\n html`\n <sp-button label=\"Button\">\n <svg slot=\"icon\"></svg>\n </sp-button>\n `\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>(\n html`\n <sp-button quiet>Button</sp-button>\n `\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>(\n html`\n <sp-button variant=\"cta\">Button</sp-button>\n `\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>(\n html`\n <sp-button variant=\"overBackground\">Button</sp-button>\n `\n );\n\n await elementUpdated(el);\n expect(el.hasAttribute('variant')).to.not.equal('overBackground');\n expect(el.treatment).to.equal('outline');\n expect(el.static).to.equal('white');\n });\n it('forces [variant=\"accent\"]', async () => {\n const el = await fixture<Button>(\n html`\n <sp-button variant=\"not-supported\">Button</sp-button>\n `\n );\n\n await elementUpdated(el);\n expect(el.variant).to.equal('accent');\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 { stub } from 'sinon';\nimport {\n a11ySnapshot,\n findAccessibilityNode,\n sendKeys,\n} from '@web/test-runner-commands';\nimport { spy } from 'sinon';\n\ntype TestableButtonType = {\n hasLabel: boolean;\n};\n\ndescribe('Button', () => {\n testForLitDevWarnings(\n async () =>\n await fixture<Button>(html`\n <sp-button tabindex=\"0\">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 tabindex=\"0\" 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: 'default',\n },\n });\n });\n });\n it('loads default', async () => {\n const el = await fixture<Button>(html`\n <sp-button tabindex=\"0\">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/ element content', async () => {\n const el = await fixture<Button>(html`\n <sp-button label=\"Button\"><svg></svg></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('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(-1);\n expect(updateComplete2, 'first update complete happened').to.not.eq(-1);\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(() => !labelTestableEl.hasLabel, 'label is removed');\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\">With Target</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 shit+tab interactions', async () => {\n let focusedCount = 0;\n const el = await fixture<Button>(html`\n <sp-button href=\"test_url\" target=\"_blank\">With Target</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\">With Target</sp-button>\n `);\n\n await elementUpdated(el);\n\n expect(el.hasAttribute('aria-disabled'), 'initially not').to.be.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\">With Target</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()}>Button</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.hasAttribute('variant')).to.not.equal('overBackground');\n expect(el.treatment).to.equal('outline');\n expect(el.static).to.equal('white');\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|