@spectrum-web-components/tabs 0.8.13 → 0.8.15-devmode.7

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 (71) hide show
  1. package/package.json +41 -14
  2. package/sp-tab-panel.dev.js +3 -0
  3. package/sp-tab-panel.dev.js.map +7 -0
  4. package/sp-tab-panel.js +3 -14
  5. package/sp-tab-panel.js.map +7 -1
  6. package/sp-tab.dev.js +3 -0
  7. package/sp-tab.dev.js.map +7 -0
  8. package/sp-tab.js +3 -14
  9. package/sp-tab.js.map +7 -1
  10. package/sp-tabs.dev.js +3 -0
  11. package/sp-tabs.dev.js.map +7 -0
  12. package/sp-tabs.js +3 -14
  13. package/sp-tabs.js.map +7 -1
  14. package/src/Tab.dev.js +101 -0
  15. package/src/Tab.dev.js.map +7 -0
  16. package/src/Tab.js +92 -103
  17. package/src/Tab.js.map +7 -1
  18. package/src/TabPanel.dev.js +58 -0
  19. package/src/TabPanel.dev.js.map +7 -0
  20. package/src/TabPanel.js +51 -57
  21. package/src/TabPanel.js.map +7 -1
  22. package/src/Tabs.dev.js +304 -0
  23. package/src/Tabs.dev.js.map +7 -0
  24. package/src/Tabs.js +275 -302
  25. package/src/Tabs.js.map +7 -1
  26. package/src/index.dev.js +4 -0
  27. package/src/index.dev.js.map +7 -0
  28. package/src/index.js +4 -15
  29. package/src/index.js.map +7 -1
  30. package/src/spectrum-tab.css.dev.js +40 -0
  31. package/src/spectrum-tab.css.dev.js.map +7 -0
  32. package/src/spectrum-tab.css.js +3 -14
  33. package/src/spectrum-tab.css.js.map +7 -1
  34. package/src/spectrum-tabs.css.dev.js +392 -0
  35. package/src/spectrum-tabs.css.dev.js.map +7 -0
  36. package/src/spectrum-tabs.css.js +3 -14
  37. package/src/spectrum-tabs.css.js.map +7 -1
  38. package/src/tab-panel.css.dev.js +6 -0
  39. package/src/tab-panel.css.dev.js.map +7 -0
  40. package/src/tab-panel.css.js +3 -14
  41. package/src/tab-panel.css.js.map +7 -1
  42. package/src/tab.css.dev.js +54 -0
  43. package/src/tab.css.dev.js.map +7 -0
  44. package/src/tab.css.js +3 -14
  45. package/src/tab.css.js.map +7 -1
  46. package/src/tabs.css.dev.js +406 -0
  47. package/src/tabs.css.dev.js.map +7 -0
  48. package/src/tabs.css.js +3 -14
  49. package/src/tabs.css.js.map +7 -1
  50. package/stories/tabs-horizontal-sizes.stories.js +53 -64
  51. package/stories/tabs-horizontal-sizes.stories.js.map +7 -1
  52. package/stories/tabs-vertical-right-sizes.stories.js +50 -61
  53. package/stories/tabs-vertical-right-sizes.stories.js.map +7 -1
  54. package/stories/tabs-vertical-sizes.stories.js +50 -61
  55. package/stories/tabs-vertical-sizes.stories.js.map +7 -1
  56. package/stories/tabs.stories.js +79 -81
  57. package/stories/tabs.stories.js.map +7 -1
  58. package/test/benchmark/basic-test.js +6 -17
  59. package/test/benchmark/basic-test.js.map +7 -1
  60. package/test/tab.test.js +21 -34
  61. package/test/tab.test.js.map +7 -1
  62. package/test/tabs-horizontal-sizes.test-vrt.js +4 -15
  63. package/test/tabs-horizontal-sizes.test-vrt.js.map +7 -1
  64. package/test/tabs-vertical-right-sizes.test-vrt.js +4 -15
  65. package/test/tabs-vertical-right-sizes.test-vrt.js.map +7 -1
  66. package/test/tabs-vertical-sizes.test-vrt.js +4 -15
  67. package/test/tabs-vertical-sizes.test-vrt.js.map +7 -1
  68. package/test/tabs.test-vrt.js +4 -15
  69. package/test/tabs.test-vrt.js.map +7 -1
  70. package/test/tabs.test.js +375 -383
  71. package/test/tabs.test.js.map +7 -1
package/test/tabs.test.js CHANGED
@@ -1,26 +1,28 @@
1
- /*
2
- Copyright 2020 Adobe. All rights reserved.
3
- This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License. You may obtain a copy
5
- of the License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- Unless required by applicable law or agreed to in writing, software distributed under
8
- the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- OF ANY KIND, either express or implied. See the License for the specific language
10
- governing permissions and limitations under the License.
11
- */
12
- import '../sp-tabs.js';
13
- import '../sp-tab.js';
14
- import '../sp-tab-panel.js';
15
- import { Tab } from '../';
16
- import '@spectrum-web-components/icons-workflow/icons/sp-icon-checkmark.js';
17
- import { elementUpdated, expect, fixture, oneEvent, waitUntil, } from '@open-wc/testing';
18
- import { html } from 'lit/static-html.js';
19
- import { LitElement } from '@spectrum-web-components/base';
20
- import { arrowDownEvent, arrowLeftEvent, arrowRightEvent, arrowUpEvent, enterEvent, spaceEvent, } from '../../../test/testing-helpers.js';
21
- import { sendKeys } from '@web/test-runner-commands';
1
+ import "@spectrum-web-components/tabs/sp-tabs.js";
2
+ import "@spectrum-web-components/tabs/sp-tab.js";
3
+ import "@spectrum-web-components/tabs/sp-tab-panel.js";
4
+ import { Tab } from "@spectrum-web-components/tabs";
5
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-checkmark.js";
6
+ import {
7
+ elementUpdated,
8
+ expect,
9
+ fixture,
10
+ oneEvent,
11
+ waitUntil
12
+ } from "@open-wc/testing";
13
+ import { html } from "lit/static-html.js";
14
+ import { LitElement } from "@spectrum-web-components/base";
15
+ import {
16
+ arrowDownEvent,
17
+ arrowLeftEvent,
18
+ arrowRightEvent,
19
+ arrowUpEvent,
20
+ enterEvent,
21
+ spaceEvent
22
+ } from "../../../test/testing-helpers.js";
23
+ import { sendKeys } from "@web/test-runner-commands";
22
24
  const createTabs = async () => {
23
- const tabs = await fixture(html `
25
+ const tabs = await fixture(html`
24
26
  <sp-tabs selected="first">
25
27
  <sp-tab label="Tab 1" value="first"></sp-tab>
26
28
  <sp-tab label="Tab 2" value="second"></sp-tab>
@@ -30,255 +32,253 @@ const createTabs = async () => {
30
32
  <sp-tab-panel value="third">Third tab content</sp-tab-panel>
31
33
  </sp-tabs>
32
34
  `);
33
- await elementUpdated(tabs);
34
- return tabs;
35
+ await elementUpdated(tabs);
36
+ return tabs;
35
37
  };
36
- describe('Tabs', () => {
37
- it('loads accessibly', async () => {
38
- const tabs = await createTabs();
39
- const tabList = tabs.querySelectorAll('sp-tab');
40
- expect(tabList).to.exist;
41
- expect(tabList.length).to.equal(3);
42
- await expect(tabs).to.be.accessible();
43
- });
44
- it('loads accessibly w/o panels', async () => {
45
- const tabs = await fixture(html `
38
+ describe("Tabs", () => {
39
+ it("loads accessibly", async () => {
40
+ const tabs = await createTabs();
41
+ const tabList = tabs.querySelectorAll("sp-tab");
42
+ expect(tabList).to.exist;
43
+ expect(tabList.length).to.equal(3);
44
+ await expect(tabs).to.be.accessible();
45
+ });
46
+ it("loads accessibly w/o panels", async () => {
47
+ const tabs = await fixture(html`
46
48
  <sp-tabs selected="first">
47
49
  <sp-tab value="first">Tab 1</sp-tab>
48
50
  <sp-tab value="second">Tab 2</sp-tab>
49
51
  <sp-tab value="third">Tab 3</sp-tab>
50
52
  </sp-tabs>
51
53
  `);
52
- const tabList = tabs.querySelectorAll('sp-tab');
53
- expect(tabList).to.exist;
54
- expect(tabList.length).to.equal(3);
55
- await expect(tabs).to.be.accessible();
56
- });
57
- it('can be disabled', async () => {
58
- const tabs = await createTabs();
59
- const tab = tabs.querySelector('[label="Tab 3"]');
60
- tabs.disabled = true;
61
- await elementUpdated(tabs);
62
- expect(tabs.selected).to.equal('first');
63
- tab.click();
64
- await elementUpdated(tabs);
65
- expect(tabs.selected).to.equal('first');
66
- });
67
- it('can have disabled sp-tab children', async () => {
68
- const tabs = await createTabs();
69
- const tab2 = tabs.querySelector('[label="Tab 2"]');
70
- const tab3 = tabs.querySelector('[label="Tab 3"]');
71
- tab3.disabled = true;
72
- await elementUpdated(tab3);
73
- expect(tabs.selected).to.equal('first');
74
- tab3.click();
75
- await elementUpdated(tabs);
76
- expect(tabs.selected).to.equal('first');
77
- tab2.click();
78
- await elementUpdated(tabs);
79
- expect(tabs.selected).to.equal('second');
80
- });
81
- it('reflects selected tab with selected property', async () => {
82
- const tabs = await createTabs();
83
- const firstTab = tabs.querySelector('sp-tab[value=first]');
84
- const secondTab = tabs.querySelector('sp-tab[value=second]');
85
- const thirdTab = tabs.querySelector('sp-tab[value=third]');
86
- const firstPanel = tabs.querySelector('sp-tab-panel[value=first]');
87
- const secondPanel = tabs.querySelector('sp-tab-panel[value=second]');
88
- const thirdPanel = tabs.querySelector('sp-tab-panel[value=third]');
89
- expect(firstTab.selected, 'first: 1, selected').to.be.true;
90
- expect(firstPanel.selected, 'first panel: 1, selected').to.be.true;
91
- expect(secondTab.selected, 'second: 1, not selected').to.be.false;
92
- expect(secondPanel.selected, 'second panel: 1, not selected').to.be
93
- .false;
94
- expect(thirdTab.selected, 'third: 1, not selected').to.be.false;
95
- expect(thirdPanel.selected, 'third panel: 1, not selected').to.be.false;
96
- expect(tabs.selected).to.equal(firstTab.value);
97
- secondTab.click();
98
- await elementUpdated(tabs);
99
- expect(firstTab.selected, 'first: 2, not selected').to.be.false;
100
- expect(firstPanel.selected, 'first panel: 2, not selected').to.be.false;
101
- expect(secondTab.selected, 'second: 2, selected').to.be.true;
102
- expect(secondTab.selected, 'first panel: 2, selected').to.be.true;
103
- expect(thirdTab.selected, 'third: 2, not selected').to.be.false;
104
- expect(thirdTab.selected, 'first panel: 2, not selected').to.be.false;
105
- expect(tabs.selected).to.equal(secondTab.value);
106
- thirdTab.click();
107
- await elementUpdated(tabs);
108
- expect(firstTab.selected, 'first: 3, not selected').to.be.false;
109
- expect(firstPanel.selected, 'first panel: 3, not selected').to.be.false;
110
- expect(secondTab.selected, 'second: 3, not selected').to.be.false;
111
- expect(secondPanel.selected, 'second panel: 3, not selected').to.be
112
- .false;
113
- expect(thirdTab.selected, 'third: 3, selected').to.be.true;
114
- expect(thirdTab.selected, 'first panel: 3, selected').to.be.true;
115
- expect(tabs.selected).to.equal(thirdTab.value);
116
- });
117
- it('autofocuses', async () => {
118
- const tabs = await fixture(html `
54
+ const tabList = tabs.querySelectorAll("sp-tab");
55
+ expect(tabList).to.exist;
56
+ expect(tabList.length).to.equal(3);
57
+ await expect(tabs).to.be.accessible();
58
+ });
59
+ it("can be disabled", async () => {
60
+ const tabs = await createTabs();
61
+ const tab = tabs.querySelector('[label="Tab 3"]');
62
+ tabs.disabled = true;
63
+ await elementUpdated(tabs);
64
+ expect(tabs.selected).to.equal("first");
65
+ tab.click();
66
+ await elementUpdated(tabs);
67
+ expect(tabs.selected).to.equal("first");
68
+ });
69
+ it("can have disabled sp-tab children", async () => {
70
+ const tabs = await createTabs();
71
+ const tab2 = tabs.querySelector('[label="Tab 2"]');
72
+ const tab3 = tabs.querySelector('[label="Tab 3"]');
73
+ tab3.disabled = true;
74
+ await elementUpdated(tab3);
75
+ expect(tabs.selected).to.equal("first");
76
+ tab3.click();
77
+ await elementUpdated(tabs);
78
+ expect(tabs.selected).to.equal("first");
79
+ tab2.click();
80
+ await elementUpdated(tabs);
81
+ expect(tabs.selected).to.equal("second");
82
+ });
83
+ it("reflects selected tab with selected property", async () => {
84
+ const tabs = await createTabs();
85
+ const firstTab = tabs.querySelector("sp-tab[value=first]");
86
+ const secondTab = tabs.querySelector("sp-tab[value=second]");
87
+ const thirdTab = tabs.querySelector("sp-tab[value=third]");
88
+ const firstPanel = tabs.querySelector("sp-tab-panel[value=first]");
89
+ const secondPanel = tabs.querySelector("sp-tab-panel[value=second]");
90
+ const thirdPanel = tabs.querySelector("sp-tab-panel[value=third]");
91
+ expect(firstTab.selected, "first: 1, selected").to.be.true;
92
+ expect(firstPanel.selected, "first panel: 1, selected").to.be.true;
93
+ expect(secondTab.selected, "second: 1, not selected").to.be.false;
94
+ expect(secondPanel.selected, "second panel: 1, not selected").to.be.false;
95
+ expect(thirdTab.selected, "third: 1, not selected").to.be.false;
96
+ expect(thirdPanel.selected, "third panel: 1, not selected").to.be.false;
97
+ expect(tabs.selected).to.equal(firstTab.value);
98
+ secondTab.click();
99
+ await elementUpdated(tabs);
100
+ expect(firstTab.selected, "first: 2, not selected").to.be.false;
101
+ expect(firstPanel.selected, "first panel: 2, not selected").to.be.false;
102
+ expect(secondTab.selected, "second: 2, selected").to.be.true;
103
+ expect(secondTab.selected, "first panel: 2, selected").to.be.true;
104
+ expect(thirdTab.selected, "third: 2, not selected").to.be.false;
105
+ expect(thirdTab.selected, "first panel: 2, not selected").to.be.false;
106
+ expect(tabs.selected).to.equal(secondTab.value);
107
+ thirdTab.click();
108
+ await elementUpdated(tabs);
109
+ expect(firstTab.selected, "first: 3, not selected").to.be.false;
110
+ expect(firstPanel.selected, "first panel: 3, not selected").to.be.false;
111
+ expect(secondTab.selected, "second: 3, not selected").to.be.false;
112
+ expect(secondPanel.selected, "second panel: 3, not selected").to.be.false;
113
+ expect(thirdTab.selected, "third: 3, selected").to.be.true;
114
+ expect(thirdTab.selected, "first panel: 3, selected").to.be.true;
115
+ expect(tabs.selected).to.equal(thirdTab.value);
116
+ });
117
+ it("autofocuses", async () => {
118
+ const tabs = await fixture(html`
119
119
  <sp-tabs selected="second" autofocus>
120
120
  <sp-tab label="Tab 1" value="first"></sp-tab>
121
121
  <sp-tab label="Tab 2" value="second"></sp-tab>
122
122
  <sp-tab label="Tab 3" value="third"></sp-tab>
123
123
  </sp-tabs>
124
124
  `);
125
- await elementUpdated(tabs);
126
- const autoElement = tabs.querySelector('[label="Tab 2"]');
127
- await waitUntil(() => document.activeElement === autoElement, 'Autofocused');
128
- });
129
- it('auto', async () => {
130
- const el = await fixture(html `
125
+ await elementUpdated(tabs);
126
+ const autoElement = tabs.querySelector('[label="Tab 2"]');
127
+ await waitUntil(() => document.activeElement === autoElement, "Autofocused");
128
+ });
129
+ it("auto", async () => {
130
+ const el = await fixture(html`
131
131
  <sp-tabs selected="second" auto>
132
132
  <sp-tab label="Tab 1" value="first"></sp-tab>
133
133
  <sp-tab label="Tab 2" value="second"></sp-tab>
134
134
  <sp-tab label="Tab 3" value="third"></sp-tab>
135
135
  </sp-tabs>
136
136
  `);
137
- await elementUpdated(el);
138
- expect(el.selected).to.equal('second');
139
- el.focus();
140
- await sendKeys({
141
- press: 'ArrowLeft',
142
- });
143
- expect(el.selected).to.equal('first');
144
- await sendKeys({
145
- press: 'ArrowLeft',
146
- });
147
- expect(el.selected).to.equal('third');
148
- await sendKeys({
149
- press: 'ArrowRight',
150
- });
151
- expect(el.selected).to.equal('first');
152
- });
153
- it('forces only one tab to be selected', async () => {
154
- const tabs = await createTabs();
155
- const selectedTabs = tabs.querySelectorAll('sp-tab[selected]');
156
- expect(tabs.selected).to.equal('first');
157
- expect(selectedTabs.length).to.equal(1);
158
- });
159
- it('de-selects all but first selected tab if multiple selected', async () => {
160
- const tabs = await createTabs();
161
- const tab1 = tabs.querySelector('sp-tab[value=first]');
162
- const tab2 = tabs.querySelector('sp-tab[value=second]');
163
- if (!(tab1 instanceof Tab))
164
- throw new Error('tab1 not of type Tab');
165
- if (!(tab2 instanceof Tab))
166
- throw new Error('tab2 not of type Tab');
167
- expect(tabs.selected).to.equal('first');
168
- expect(tab1.selected).to.be.true;
169
- expect(tab2.selected).to.be.false;
137
+ await elementUpdated(el);
138
+ expect(el.selected).to.equal("second");
139
+ el.focus();
140
+ await sendKeys({
141
+ press: "ArrowLeft"
170
142
  });
171
- it('ensures setting selection updates selected tab', async () => {
172
- const tabs = await createTabs();
173
- const tab1 = tabs.querySelector('sp-tab[value=first]');
174
- const tab2 = tabs.querySelector('sp-tab[value=second]');
175
- const tab3 = tabs.querySelector('sp-tab[value=third]');
176
- if (!(tab1 instanceof Tab))
177
- throw new Error('tab1 not of type Tab');
178
- if (!(tab2 instanceof Tab))
179
- throw new Error('tab2 not of type Tab');
180
- if (!(tab3 instanceof Tab))
181
- throw new Error('tab3 not of type Tab');
182
- expect(tabs.selected).to.equal('first');
183
- expect(tab1.selected, 'first: 1, selected').to.be.true;
184
- expect(tab2.selected, 'second: 1, not selected').to.be.false;
185
- expect(tab3.selected, 'thurd: 1, not selected').to.be.false;
186
- tabs.selected = 'second';
187
- await elementUpdated(tabs);
188
- expect(tabs.selected).to.equal('second');
189
- expect(tab1.selected, 'first: 2, not selected').to.be.false;
190
- expect(tab2.selected, 'second: 2, selected').to.be.true;
191
- expect(tab3.selected, 'third: 2, not selected').to.be.false;
192
- tabs.selected = 'third';
193
- await elementUpdated(tabs);
194
- expect(tabs.selected).to.equal('third');
195
- expect(tab1.selected, 'first: 3, not selected').to.be.false;
196
- expect(tab2.selected, 'second: 3, not selected').to.be.false;
197
- expect(tab3.selected, 'third: 3, selected').to.be.true;
143
+ expect(el.selected).to.equal("first");
144
+ await sendKeys({
145
+ press: "ArrowLeft"
198
146
  });
199
- it('ensures setting selected and clicking on tab both work together', async () => {
200
- const tabs = await createTabs();
201
- const tab1 = tabs.querySelector('sp-tab[value=first]');
202
- const tab2 = tabs.querySelector('sp-tab[value=second]');
203
- const tab3 = tabs.querySelector('sp-tab[value=third]');
204
- if (!(tab1 instanceof Tab))
205
- throw new Error('tab1 not of type Tab');
206
- if (!(tab2 instanceof Tab))
207
- throw new Error('tab2 not of type Tab');
208
- if (!(tab3 instanceof Tab))
209
- throw new Error('tab3 not of type Tab');
210
- tab2.click();
211
- await elementUpdated(tabs);
212
- expect(tabs.selected).to.equal('second');
213
- expect(tab1.selected).to.be.false;
214
- expect(tab2.selected).to.be.true;
215
- expect(tab3.selected).to.be.false;
216
- tabs.selected = 'first';
217
- await elementUpdated(tabs);
218
- expect(tabs.selected).to.equal('first');
219
- expect(tab1.selected).to.be.true;
220
- expect(tab2.selected).to.be.false;
221
- expect(tab3.selected).to.be.false;
147
+ expect(el.selected).to.equal("third");
148
+ await sendKeys({
149
+ press: "ArrowRight"
222
150
  });
223
- it('displays `vertical`', async () => {
224
- const el = await fixture(html `
151
+ expect(el.selected).to.equal("first");
152
+ });
153
+ it("forces only one tab to be selected", async () => {
154
+ const tabs = await createTabs();
155
+ const selectedTabs = tabs.querySelectorAll("sp-tab[selected]");
156
+ expect(tabs.selected).to.equal("first");
157
+ expect(selectedTabs.length).to.equal(1);
158
+ });
159
+ it("de-selects all but first selected tab if multiple selected", async () => {
160
+ const tabs = await createTabs();
161
+ const tab1 = tabs.querySelector("sp-tab[value=first]");
162
+ const tab2 = tabs.querySelector("sp-tab[value=second]");
163
+ if (!(tab1 instanceof Tab))
164
+ throw new Error("tab1 not of type Tab");
165
+ if (!(tab2 instanceof Tab))
166
+ throw new Error("tab2 not of type Tab");
167
+ expect(tabs.selected).to.equal("first");
168
+ expect(tab1.selected).to.be.true;
169
+ expect(tab2.selected).to.be.false;
170
+ });
171
+ it("ensures setting selection updates selected tab", async () => {
172
+ const tabs = await createTabs();
173
+ const tab1 = tabs.querySelector("sp-tab[value=first]");
174
+ const tab2 = tabs.querySelector("sp-tab[value=second]");
175
+ const tab3 = tabs.querySelector("sp-tab[value=third]");
176
+ if (!(tab1 instanceof Tab))
177
+ throw new Error("tab1 not of type Tab");
178
+ if (!(tab2 instanceof Tab))
179
+ throw new Error("tab2 not of type Tab");
180
+ if (!(tab3 instanceof Tab))
181
+ throw new Error("tab3 not of type Tab");
182
+ expect(tabs.selected).to.equal("first");
183
+ expect(tab1.selected, "first: 1, selected").to.be.true;
184
+ expect(tab2.selected, "second: 1, not selected").to.be.false;
185
+ expect(tab3.selected, "thurd: 1, not selected").to.be.false;
186
+ tabs.selected = "second";
187
+ await elementUpdated(tabs);
188
+ expect(tabs.selected).to.equal("second");
189
+ expect(tab1.selected, "first: 2, not selected").to.be.false;
190
+ expect(tab2.selected, "second: 2, selected").to.be.true;
191
+ expect(tab3.selected, "third: 2, not selected").to.be.false;
192
+ tabs.selected = "third";
193
+ await elementUpdated(tabs);
194
+ expect(tabs.selected).to.equal("third");
195
+ expect(tab1.selected, "first: 3, not selected").to.be.false;
196
+ expect(tab2.selected, "second: 3, not selected").to.be.false;
197
+ expect(tab3.selected, "third: 3, selected").to.be.true;
198
+ });
199
+ it("ensures setting selected and clicking on tab both work together", async () => {
200
+ const tabs = await createTabs();
201
+ const tab1 = tabs.querySelector("sp-tab[value=first]");
202
+ const tab2 = tabs.querySelector("sp-tab[value=second]");
203
+ const tab3 = tabs.querySelector("sp-tab[value=third]");
204
+ if (!(tab1 instanceof Tab))
205
+ throw new Error("tab1 not of type Tab");
206
+ if (!(tab2 instanceof Tab))
207
+ throw new Error("tab2 not of type Tab");
208
+ if (!(tab3 instanceof Tab))
209
+ throw new Error("tab3 not of type Tab");
210
+ tab2.click();
211
+ await elementUpdated(tabs);
212
+ expect(tabs.selected).to.equal("second");
213
+ expect(tab1.selected).to.be.false;
214
+ expect(tab2.selected).to.be.true;
215
+ expect(tab3.selected).to.be.false;
216
+ tabs.selected = "first";
217
+ await elementUpdated(tabs);
218
+ expect(tabs.selected).to.equal("first");
219
+ expect(tab1.selected).to.be.true;
220
+ expect(tab2.selected).to.be.false;
221
+ expect(tab3.selected).to.be.false;
222
+ });
223
+ it("displays `vertical`", async () => {
224
+ const el = await fixture(html`
225
225
  <sp-tabs selected="first" direction="vertical">
226
226
  <sp-tab label="Tab 1" value="first"></sp-tab>
227
227
  <sp-tab label="Tab 2" value="second"></sp-tab>
228
228
  <sp-tab label="Tab 3" value="third"></sp-tab>
229
229
  </sp-tabs>
230
230
  `);
231
- await elementUpdated(el);
232
- expect(el.selected).to.be.equal('first');
233
- el.selected = 'first';
234
- await elementUpdated(el);
235
- expect(el.selected).to.be.equal('first');
236
- });
237
- it('displays with nothing `selected`', async () => {
238
- const el = await fixture(html `
231
+ await elementUpdated(el);
232
+ expect(el.selected).to.be.equal("first");
233
+ el.selected = "first";
234
+ await elementUpdated(el);
235
+ expect(el.selected).to.be.equal("first");
236
+ });
237
+ it("displays with nothing `selected`", async () => {
238
+ const el = await fixture(html`
239
239
  <sp-tabs>
240
240
  <sp-tab label="Tab 1" value="first"></sp-tab>
241
241
  <sp-tab label="Tab 2" value="second"></sp-tab>
242
242
  <sp-tab label="Tab 3" value="third"></sp-tab>
243
243
  </sp-tabs>
244
244
  `);
245
- await elementUpdated(el);
246
- expect(el.selected).to.be.equal('');
247
- el.selected = 'first';
248
- await elementUpdated(el);
249
- expect(el.selected).to.be.equal('first');
250
- });
251
- it('ignores children with no `value`', async () => {
252
- const el = await fixture(html `
245
+ await elementUpdated(el);
246
+ expect(el.selected).to.be.equal("");
247
+ el.selected = "first";
248
+ await elementUpdated(el);
249
+ expect(el.selected).to.be.equal("first");
250
+ });
251
+ it("ignores children with no `value`", async () => {
252
+ const el = await fixture(html`
253
253
  <sp-tabs selected="first">
254
254
  <sp-tab label="Tab 1" value="first"></sp-tab>
255
255
  <div id="other">Other thing</div>
256
256
  </sp-tabs>
257
257
  `);
258
- await elementUpdated(el);
259
- expect(el.selected).to.be.equal('first');
260
- const otherThing = el.querySelector('#other');
261
- otherThing.click();
262
- await elementUpdated(el);
263
- expect(el.selected).to.be.equal('first');
264
- });
265
- it('allows selection to be cancellable', async () => {
266
- const cancelSelection = (event) => event.preventDefault();
267
- const el = await fixture(html `
258
+ await elementUpdated(el);
259
+ expect(el.selected).to.be.equal("first");
260
+ const otherThing = el.querySelector("#other");
261
+ otherThing.click();
262
+ await elementUpdated(el);
263
+ expect(el.selected).to.be.equal("first");
264
+ });
265
+ it("allows selection to be cancellable", async () => {
266
+ const cancelSelection = (event) => event.preventDefault();
267
+ const el = await fixture(html`
268
268
  <sp-tabs selected="first" @change=${cancelSelection}>
269
269
  <sp-tab label="Tab 1" value="first"></sp-tab>
270
270
  <sp-tab label="Tab 2" value="second"></sp-tab>
271
271
  </sp-tabs>
272
272
  `);
273
- await elementUpdated(el);
274
- expect(el.selected).to.be.equal('first');
275
- const secondTab = el.querySelector('[value="second"]');
276
- secondTab.click();
277
- await elementUpdated(el);
278
- expect(el.selected).to.be.equal('first');
279
- });
280
- it('prevents [tabindex=0] while `focusin`', async () => {
281
- const el = await fixture(html `
273
+ await elementUpdated(el);
274
+ expect(el.selected).to.be.equal("first");
275
+ const secondTab = el.querySelector('[value="second"]');
276
+ secondTab.click();
277
+ await elementUpdated(el);
278
+ expect(el.selected).to.be.equal("first");
279
+ });
280
+ it("prevents [tabindex=0] while `focusin`", async () => {
281
+ const el = await fixture(html`
282
282
  <sp-tabs>
283
283
  <sp-tab label="Tab 1" value="first" selected>
284
284
  <sp-icon-checkmark slot="icon"></sp-icon-checkmark>
@@ -288,27 +288,27 @@ describe('Tabs', () => {
288
288
  </sp-tab>
289
289
  </sp-tabs>
290
290
  `);
291
- const selected = el.querySelector('[value="first"]');
292
- const toBeSelected = el.querySelector('[value="second"]');
293
- await elementUpdated(el);
294
- await waitUntil(() => el.selected === 'first', 'wait for selection');
295
- expect(el.selected).to.equal('first');
296
- expect(selected.tabIndex).to.equal(0);
297
- toBeSelected.dispatchEvent(new Event('focusin', { bubbles: true }));
298
- await elementUpdated(el);
299
- expect(el.selected).to.equal('first');
300
- expect(selected.tabIndex).to.equal(-1);
301
- toBeSelected.dispatchEvent(new Event('focusout', { bubbles: true }));
302
- await elementUpdated(el);
303
- expect(el.selected).to.equal('first');
304
- expect(selected.tabIndex).to.equal(0);
305
- toBeSelected.click();
306
- await elementUpdated(el);
307
- expect(el.selected).to.equal('second');
308
- expect(toBeSelected.tabIndex).to.equal(0);
309
- });
310
- it('accepts keyboard based selection', async () => {
311
- const el = await fixture(html `
291
+ const selected = el.querySelector('[value="first"]');
292
+ const toBeSelected = el.querySelector('[value="second"]');
293
+ await elementUpdated(el);
294
+ await waitUntil(() => el.selected === "first", "wait for selection");
295
+ expect(el.selected).to.equal("first");
296
+ expect(selected.tabIndex).to.equal(0);
297
+ toBeSelected.dispatchEvent(new Event("focusin", { bubbles: true }));
298
+ await elementUpdated(el);
299
+ expect(el.selected).to.equal("first");
300
+ expect(selected.tabIndex).to.equal(-1);
301
+ toBeSelected.dispatchEvent(new Event("focusout", { bubbles: true }));
302
+ await elementUpdated(el);
303
+ expect(el.selected).to.equal("first");
304
+ expect(selected.tabIndex).to.equal(0);
305
+ toBeSelected.click();
306
+ await elementUpdated(el);
307
+ expect(el.selected).to.equal("second");
308
+ expect(toBeSelected.tabIndex).to.equal(0);
309
+ });
310
+ it("accepts keyboard based selection", async () => {
311
+ const el = await fixture(html`
312
312
  <sp-tabs selected="Unknown">
313
313
  <sp-tab label="Tab 1" value="first">
314
314
  <sp-icon-checkmark slot="icon"></sp-icon-checkmark>
@@ -318,35 +318,32 @@ describe('Tabs', () => {
318
318
  </sp-tab>
319
319
  </sp-tabs>
320
320
  `);
321
- await elementUpdated(el);
322
- expect(el.selected).to.be.equal('');
323
- const firstTab = el.querySelector('[value="first"]');
324
- const secondTab = el.querySelector('[value="second"]');
325
- firstTab.dispatchEvent(new FocusEvent('focusin', { bubbles: true }));
326
- firstTab.focus();
327
- await elementUpdated(el);
328
- expect(document.activeElement === firstTab, 'Focus first tab').to.be
329
- .true;
330
- firstTab.dispatchEvent(arrowLeftEvent());
331
- firstTab.dispatchEvent(arrowUpEvent());
332
- await elementUpdated(el);
333
- expect(document.activeElement === secondTab, 'Focus second tab').to.be
334
- .true;
335
- secondTab.dispatchEvent(enterEvent());
336
- await elementUpdated(el);
337
- expect(el.selected).to.be.equal('second');
338
- secondTab.dispatchEvent(arrowRightEvent());
339
- await elementUpdated(el);
340
- expect(document.activeElement === firstTab, 'Focus first tab').to.be
341
- .true;
342
- firstTab.dispatchEvent(spaceEvent());
343
- await elementUpdated(el);
344
- expect(el.selected).to.be.equal('first');
345
- });
346
- it('accepts keyboard based selection through shadow DOM', async () => {
347
- class TabTestEl extends LitElement {
348
- render() {
349
- return html `
321
+ await elementUpdated(el);
322
+ expect(el.selected).to.be.equal("");
323
+ const firstTab = el.querySelector('[value="first"]');
324
+ const secondTab = el.querySelector('[value="second"]');
325
+ firstTab.dispatchEvent(new FocusEvent("focusin", { bubbles: true }));
326
+ firstTab.focus();
327
+ await elementUpdated(el);
328
+ expect(document.activeElement === firstTab, "Focus first tab").to.be.true;
329
+ firstTab.dispatchEvent(arrowLeftEvent());
330
+ firstTab.dispatchEvent(arrowUpEvent());
331
+ await elementUpdated(el);
332
+ expect(document.activeElement === secondTab, "Focus second tab").to.be.true;
333
+ secondTab.dispatchEvent(enterEvent());
334
+ await elementUpdated(el);
335
+ expect(el.selected).to.be.equal("second");
336
+ secondTab.dispatchEvent(arrowRightEvent());
337
+ await elementUpdated(el);
338
+ expect(document.activeElement === firstTab, "Focus first tab").to.be.true;
339
+ firstTab.dispatchEvent(spaceEvent());
340
+ await elementUpdated(el);
341
+ expect(el.selected).to.be.equal("first");
342
+ });
343
+ it("accepts keyboard based selection through shadow DOM", async () => {
344
+ class TabTestEl extends LitElement {
345
+ render() {
346
+ return html`
350
347
  <sp-tabs selected="Unknown">
351
348
  <sp-tab label="Tab 1" value="first">
352
349
  <sp-icon-checkmark slot="icon"></sp-icon-checkmark>
@@ -356,42 +353,42 @@ describe('Tabs', () => {
356
353
  </sp-tab>
357
354
  </sp-tabs>
358
355
  `;
359
- }
360
- }
361
- customElements.define('tab-test-el', TabTestEl);
362
- const el = await fixture(html `
356
+ }
357
+ }
358
+ customElements.define("tab-test-el", TabTestEl);
359
+ const el = await fixture(html`
363
360
  <tab-test-el></tab-test-el>
364
361
  `);
365
- await elementUpdated(el);
366
- const rootNode = el.shadowRoot;
367
- const tabsEl = rootNode.querySelector('sp-tabs');
368
- await elementUpdated(tabsEl);
369
- expect(tabsEl.selected).to.be.equal('');
370
- const firstTab = tabsEl.querySelector('[value="first"]');
371
- const secondTab = tabsEl.querySelector('[value="second"]');
372
- firstTab.dispatchEvent(new FocusEvent('focusin', { bubbles: true }));
373
- firstTab.focus();
374
- await elementUpdated(el);
375
- let activeElement = rootNode.activeElement;
376
- expect(activeElement === firstTab, 'Focus first tab').to.be.true;
377
- firstTab.dispatchEvent(arrowLeftEvent());
378
- firstTab.dispatchEvent(arrowUpEvent());
379
- await elementUpdated(el);
380
- activeElement = rootNode.activeElement;
381
- expect(activeElement === secondTab, 'Focus second tab').to.be.true;
382
- secondTab.dispatchEvent(enterEvent());
383
- await elementUpdated(el);
384
- expect(tabsEl.selected).to.be.equal('second');
385
- secondTab.dispatchEvent(arrowRightEvent());
386
- await elementUpdated(el);
387
- activeElement = rootNode.activeElement;
388
- expect(activeElement === firstTab, 'Focus first tab').to.be.true;
389
- firstTab.dispatchEvent(spaceEvent());
390
- await elementUpdated(el);
391
- expect(tabsEl.selected).to.be.equal('first');
392
- });
393
- it('accepts keyboard based selection - [direction="vertical"]', async () => {
394
- const el = await fixture(html `
362
+ await elementUpdated(el);
363
+ const rootNode = el.shadowRoot;
364
+ const tabsEl = rootNode.querySelector("sp-tabs");
365
+ await elementUpdated(tabsEl);
366
+ expect(tabsEl.selected).to.be.equal("");
367
+ const firstTab = tabsEl.querySelector('[value="first"]');
368
+ const secondTab = tabsEl.querySelector('[value="second"]');
369
+ firstTab.dispatchEvent(new FocusEvent("focusin", { bubbles: true }));
370
+ firstTab.focus();
371
+ await elementUpdated(el);
372
+ let activeElement = rootNode.activeElement;
373
+ expect(activeElement === firstTab, "Focus first tab").to.be.true;
374
+ firstTab.dispatchEvent(arrowLeftEvent());
375
+ firstTab.dispatchEvent(arrowUpEvent());
376
+ await elementUpdated(el);
377
+ activeElement = rootNode.activeElement;
378
+ expect(activeElement === secondTab, "Focus second tab").to.be.true;
379
+ secondTab.dispatchEvent(enterEvent());
380
+ await elementUpdated(el);
381
+ expect(tabsEl.selected).to.be.equal("second");
382
+ secondTab.dispatchEvent(arrowRightEvent());
383
+ await elementUpdated(el);
384
+ activeElement = rootNode.activeElement;
385
+ expect(activeElement === firstTab, "Focus first tab").to.be.true;
386
+ firstTab.dispatchEvent(spaceEvent());
387
+ await elementUpdated(el);
388
+ expect(tabsEl.selected).to.be.equal("first");
389
+ });
390
+ it('accepts keyboard based selection - [direction="vertical"]', async () => {
391
+ const el = await fixture(html`
395
392
  <sp-tabs selected="Unknown" direction="vertical">
396
393
  <sp-tab label="Tab 1" value="first">
397
394
  <sp-icon-checkmark slot="icon"></sp-icon-checkmark>
@@ -401,86 +398,81 @@ describe('Tabs', () => {
401
398
  </sp-tab>
402
399
  </sp-tabs>
403
400
  `);
404
- await elementUpdated(el);
405
- expect(el.selected).to.be.equal('');
406
- const firstTab = el.querySelector('[value="first"]');
407
- const secondTab = el.querySelector('[value="second"]');
408
- firstTab.dispatchEvent(new FocusEvent('focusin', { bubbles: true }));
409
- firstTab.focus();
410
- await elementUpdated(el);
411
- expect(document.activeElement === firstTab, 'Focus first tab').to.be
412
- .true;
413
- firstTab.dispatchEvent(arrowLeftEvent());
414
- firstTab.dispatchEvent(arrowUpEvent());
415
- await elementUpdated(el);
416
- expect(document.activeElement === secondTab, 'Focus second tab').to.be
417
- .true;
418
- secondTab.dispatchEvent(enterEvent());
419
- await elementUpdated(el);
420
- expect(el.selected).to.be.equal('second');
421
- secondTab.dispatchEvent(arrowDownEvent());
422
- await elementUpdated(el);
423
- expect(document.activeElement === firstTab, 'Focus first tab').to.be
424
- .true;
425
- firstTab.dispatchEvent(spaceEvent());
426
- await elementUpdated(el);
427
- expect(el.selected).to.be.equal('first');
428
- });
429
- it('selects through slotted DOM', async () => {
430
- const el = await fixture(html `
401
+ await elementUpdated(el);
402
+ expect(el.selected).to.be.equal("");
403
+ const firstTab = el.querySelector('[value="first"]');
404
+ const secondTab = el.querySelector('[value="second"]');
405
+ firstTab.dispatchEvent(new FocusEvent("focusin", { bubbles: true }));
406
+ firstTab.focus();
407
+ await elementUpdated(el);
408
+ expect(document.activeElement === firstTab, "Focus first tab").to.be.true;
409
+ firstTab.dispatchEvent(arrowLeftEvent());
410
+ firstTab.dispatchEvent(arrowUpEvent());
411
+ await elementUpdated(el);
412
+ expect(document.activeElement === secondTab, "Focus second tab").to.be.true;
413
+ secondTab.dispatchEvent(enterEvent());
414
+ await elementUpdated(el);
415
+ expect(el.selected).to.be.equal("second");
416
+ secondTab.dispatchEvent(arrowDownEvent());
417
+ await elementUpdated(el);
418
+ expect(document.activeElement === firstTab, "Focus first tab").to.be.true;
419
+ firstTab.dispatchEvent(spaceEvent());
420
+ await elementUpdated(el);
421
+ expect(el.selected).to.be.equal("first");
422
+ });
423
+ it("selects through slotted DOM", async () => {
424
+ const el = await fixture(html`
431
425
  <sp-tabs selected="first">
432
426
  <sp-tab value="first">Tab 1</sp-tab>
433
427
  <sp-tab value="second"><span>Tab 2</span></sp-tab>
434
428
  </sp-tabs>
435
429
  `);
436
- const span = el.querySelector('span');
437
- await elementUpdated(el);
438
- expect(el.selected).to.equal('first');
439
- span.click();
440
- await elementUpdated(el);
441
- expect(el.selected).to.equal('second');
442
- });
443
- it('updates selection indicator in response to tab updates', async () => {
444
- const el = await fixture(html `
430
+ const span = el.querySelector("span");
431
+ await elementUpdated(el);
432
+ expect(el.selected).to.equal("first");
433
+ span.click();
434
+ await elementUpdated(el);
435
+ expect(el.selected).to.equal("second");
436
+ });
437
+ it("updates selection indicator in response to tab updates", async () => {
438
+ const el = await fixture(html`
445
439
  <sp-tabs selected="first">
446
440
  <sp-tab value="first">Tab 1</sp-tab>
447
441
  <sp-tab value="second">Tab 2</sp-tab>
448
442
  </sp-tabs>
449
443
  `);
450
- const selected = el.querySelector('[value="first"]');
451
- await elementUpdated(el);
452
- const extractScaleX = /scaleX\((.+)\)/;
453
- const initialExec = extractScaleX.exec(el.selectionIndicatorStyle);
454
- const initialWidth = parseFloat(initialExec[1]);
455
- let contentchanged = oneEvent(el, 'sp-tab-contentchange');
456
- selected.textContent = 'WWWWWWWWWWWWWWWWWWWWWWWWW';
457
- await contentchanged;
458
- await elementUpdated(el);
459
- const longerExec = extractScaleX.exec(el.selectionIndicatorStyle);
460
- const longerWidth = parseFloat(longerExec[1]);
461
- expect(initialWidth).to.be.lessThan(longerWidth);
462
- contentchanged = oneEvent(el, 'sp-tab-contentchange');
463
- selected.textContent = 'W';
464
- await contentchanged;
465
- await elementUpdated(el);
466
- const shorterExec = extractScaleX.exec(el.selectionIndicatorStyle);
467
- const shorterWidth = parseFloat(shorterExec[1]);
468
- expect(initialWidth).to.be.greaterThan(shorterWidth);
469
- expect(longerWidth).to.be.greaterThan(shorterWidth);
470
- });
471
- it('clicks on #list do not throw', async () => {
472
- const tabs = await createTabs();
473
- const tabList = tabs.shadowRoot.querySelector('#list');
474
- // exceptions thrown in event listeners do not propagate to caller
475
- // we must catch them with window.onerror
476
- let hasError = false;
477
- const oldOnerror = window.onerror;
478
- window.onerror = () => {
479
- hasError = true;
480
- };
481
- tabList.dispatchEvent(new MouseEvent('click'));
482
- expect(hasError, 'it should not error').to.be.false;
483
- window.onerror = oldOnerror;
484
- });
444
+ const selected = el.querySelector('[value="first"]');
445
+ await elementUpdated(el);
446
+ const extractScaleX = /scaleX\((.+)\)/;
447
+ const initialExec = extractScaleX.exec(el.selectionIndicatorStyle);
448
+ const initialWidth = parseFloat(initialExec[1]);
449
+ let contentchanged = oneEvent(el, "sp-tab-contentchange");
450
+ selected.textContent = "WWWWWWWWWWWWWWWWWWWWWWWWW";
451
+ await contentchanged;
452
+ await elementUpdated(el);
453
+ const longerExec = extractScaleX.exec(el.selectionIndicatorStyle);
454
+ const longerWidth = parseFloat(longerExec[1]);
455
+ expect(initialWidth).to.be.lessThan(longerWidth);
456
+ contentchanged = oneEvent(el, "sp-tab-contentchange");
457
+ selected.textContent = "W";
458
+ await contentchanged;
459
+ await elementUpdated(el);
460
+ const shorterExec = extractScaleX.exec(el.selectionIndicatorStyle);
461
+ const shorterWidth = parseFloat(shorterExec[1]);
462
+ expect(initialWidth).to.be.greaterThan(shorterWidth);
463
+ expect(longerWidth).to.be.greaterThan(shorterWidth);
464
+ });
465
+ it("clicks on #list do not throw", async () => {
466
+ const tabs = await createTabs();
467
+ const tabList = tabs.shadowRoot.querySelector("#list");
468
+ let hasError = false;
469
+ const oldOnerror = window.onerror;
470
+ window.onerror = () => {
471
+ hasError = true;
472
+ };
473
+ tabList.dispatchEvent(new MouseEvent("click"));
474
+ expect(hasError, "it should not error").to.be.false;
475
+ window.onerror = oldOnerror;
476
+ });
485
477
  });
486
- //# sourceMappingURL=tabs.test.js.map
478
+ //# sourceMappingURL=tabs.test.js.map