@crowdstrike/glide-core 0.12.1 → 0.12.3

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 (61) hide show
  1. package/dist/checkbox-group.styles.js +1 -1
  2. package/dist/dropdown.d.ts +5 -1
  3. package/dist/dropdown.js +126 -58
  4. package/dist/dropdown.option.d.ts +3 -0
  5. package/dist/dropdown.option.js +1 -1
  6. package/dist/dropdown.option.styles.js +81 -16
  7. package/dist/dropdown.option.test.basics.js +4 -33
  8. package/dist/dropdown.option.test.basics.multiple.js +9 -0
  9. package/dist/dropdown.option.test.basics.single.js +8 -0
  10. package/dist/dropdown.option.test.interactions.multiple.js +12 -0
  11. package/dist/dropdown.option.test.interactions.single.js +11 -0
  12. package/dist/dropdown.styles.js +127 -29
  13. package/dist/dropdown.test.basics.filterable.js +11 -54
  14. package/dist/dropdown.test.basics.js +24 -244
  15. package/dist/dropdown.test.basics.multiple.js +13 -60
  16. package/dist/dropdown.test.basics.single.js +2 -8
  17. package/dist/dropdown.test.events.filterable.js +12 -54
  18. package/dist/dropdown.test.events.js +139 -46
  19. package/dist/dropdown.test.events.multiple.js +17 -87
  20. package/dist/dropdown.test.events.single.js +99 -60
  21. package/dist/dropdown.test.focus.filterable.js +13 -60
  22. package/dist/dropdown.test.focus.js +64 -11
  23. package/dist/dropdown.test.focus.multiple.js +36 -46
  24. package/dist/dropdown.test.focus.single.js +28 -23
  25. package/dist/dropdown.test.form.js +22 -0
  26. package/dist/dropdown.test.interactions.filterable.js +86 -72
  27. package/dist/dropdown.test.interactions.js +361 -207
  28. package/dist/dropdown.test.interactions.multiple.js +152 -279
  29. package/dist/dropdown.test.interactions.single.js +62 -98
  30. package/dist/dropdown.test.validity.js +12 -49
  31. package/dist/icons/pencil.d.ts +2 -0
  32. package/dist/icons/pencil.js +1 -0
  33. package/dist/label.js +1 -1
  34. package/dist/label.styles.js +7 -3
  35. package/dist/library/localize.d.ts +2 -0
  36. package/dist/menu.js +1 -1
  37. package/dist/menu.options.js +1 -1
  38. package/dist/menu.options.test.events.d.ts +1 -0
  39. package/dist/menu.options.test.events.js +19 -0
  40. package/dist/menu.test.interactions.d.ts +1 -0
  41. package/dist/menu.test.interactions.js +38 -0
  42. package/dist/radio-group.styles.js +1 -1
  43. package/dist/tab.group.d.ts +8 -1
  44. package/dist/tab.group.js +1 -1
  45. package/dist/tab.group.styles.js +4 -0
  46. package/dist/tab.group.test.basics.js +77 -1
  47. package/dist/tab.panel.js +1 -1
  48. package/dist/tab.panel.styles.js +15 -0
  49. package/dist/tag.d.ts +2 -0
  50. package/dist/tag.js +1 -1
  51. package/dist/tag.styles.js +46 -5
  52. package/dist/tag.test.basics.js +1 -1
  53. package/dist/tag.test.events.js +76 -3
  54. package/dist/tag.test.focus.js +1 -1
  55. package/dist/textarea.styles.js +1 -1
  56. package/dist/translations/en.js +1 -1
  57. package/dist/translations/fr.d.ts +1 -1
  58. package/dist/translations/fr.js +1 -1
  59. package/dist/translations/ja.d.ts +1 -1
  60. package/dist/translations/ja.js +1 -1
  61. package/package.json +1 -1
@@ -7,14 +7,10 @@ import GlideCoreDropdown from './dropdown.js';
7
7
  GlideCoreDropdown.shadowRootOptions.mode = 'open';
8
8
  it('dispatches one "change" event when an option is selected via click', async () => {
9
9
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
10
- <glide-core-dropdown-option
11
- label="One"
12
- value="one"
13
- ></glide-core-dropdown-option>
10
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
14
11
 
15
12
  <glide-core-dropdown-option
16
13
  label="Two"
17
- value="two"
18
14
  selected
19
15
  ></glide-core-dropdown-option>
20
16
  </glide-core-dropdown>`);
@@ -30,14 +26,10 @@ it('dispatches one "change" event when an option is selected via click', async (
30
26
  });
31
27
  it('dispatches one "change" event when an option is selected via Enter', async () => {
32
28
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
33
- <glide-core-dropdown-option
34
- label="One"
35
- value="one"
36
- ></glide-core-dropdown-option>
29
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
37
30
 
38
31
  <glide-core-dropdown-option
39
32
  label="Two"
40
- value="two"
41
33
  selected
42
34
  ></glide-core-dropdown-option>
43
35
  </glide-core-dropdown>`);
@@ -57,14 +49,10 @@ it('dispatches one "change" event when an option is selected via Enter', async (
57
49
  });
58
50
  it('dispatches one "change" event when an option is selected via Space', async () => {
59
51
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
60
- <glide-core-dropdown-option
61
- label="One"
62
- value="one"
63
- ></glide-core-dropdown-option>
52
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
64
53
 
65
54
  <glide-core-dropdown-option
66
55
  label="Two"
67
- value="two"
68
56
  selected
69
57
  ></glide-core-dropdown-option>
70
58
  </glide-core-dropdown>`);
@@ -82,16 +70,99 @@ it('dispatches one "change" event when an option is selected via Space', async (
82
70
  expect(event.bubbles).to.be.true;
83
71
  expect(spy.callCount).to.equal(1);
84
72
  });
85
- it('dispatches one "input" event when an option is selected via click', async () => {
86
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
73
+ it('dispatches an "edit" event on click', async () => {
74
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
87
75
  <glide-core-dropdown-option
88
- label="One"
89
- value="one"
76
+ label="Label"
77
+ editable
78
+ selected
90
79
  ></glide-core-dropdown-option>
80
+ </glide-core-dropdown>`);
81
+ setTimeout(() => {
82
+ component?.shadowRoot
83
+ ?.querySelector('[data-test="edit-button"]')
84
+ ?.click();
85
+ });
86
+ const event = await oneEvent(component, 'edit');
87
+ const option = component.querySelector('glide-core-dropdown-option');
88
+ expect(event instanceof Event).to.be.true;
89
+ expect(event.bubbles).to.be.true;
90
+ expect(event.composed).to.be.true;
91
+ expect(event.target).to.equal(option);
92
+ });
93
+ it('dispatches an "edit" event on Enter', async () => {
94
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
95
+ <glide-core-dropdown-option
96
+ label="Label"
97
+ editable
98
+ selected
99
+ ></glide-core-dropdown-option>
100
+ </glide-core-dropdown>`);
101
+ component?.shadowRoot
102
+ ?.querySelector('[data-test="edit-button"]')
103
+ ?.focus();
104
+ sendKeys({ press: 'Enter' });
105
+ const event = await oneEvent(component, 'edit');
106
+ const option = component.querySelector('glide-core-dropdown-option');
107
+ expect(event instanceof Event).to.be.true;
108
+ expect(event.bubbles).to.be.true;
109
+ expect(event.composed).to.be.true;
110
+ expect(event.target).to.equal(option);
111
+ });
112
+ it('dispatches an "edit" event on Space', async () => {
113
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
114
+ <glide-core-dropdown-option
115
+ label="Label"
116
+ editable
117
+ selected
118
+ ></glide-core-dropdown-option>
119
+ </glide-core-dropdown>`);
120
+ component?.shadowRoot
121
+ ?.querySelector('[data-test="edit-button"]')
122
+ ?.focus();
123
+ sendKeys({ press: ' ' });
124
+ const event = await oneEvent(component, 'edit');
125
+ const option = component.querySelector('glide-core-dropdown-option');
126
+ expect(event instanceof Event).to.be.true;
127
+ expect(event.bubbles).to.be.true;
128
+ expect(event.target).to.equal(option);
129
+ });
130
+ it('does not dispatch an "edit" event when `disabled`', async () => {
131
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
132
+ <glide-core-dropdown-option
133
+ label="Label"
134
+ editable
135
+ selected
136
+ ></glide-core-dropdown-option>
137
+ </glide-core-dropdown>`);
138
+ const spy = sinon.spy();
139
+ component.addEventListener('edit', spy);
140
+ component?.shadowRoot
141
+ ?.querySelector('[data-test="edit-button"]')
142
+ ?.click();
143
+ expect(spy.callCount).to.equal(0);
144
+ });
145
+ it('does not dispatch an "edit" event when `readonly`', async () => {
146
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
147
+ <glide-core-dropdown-option
148
+ label="Label"
149
+ editable
150
+ selected
151
+ ></glide-core-dropdown-option>
152
+ </glide-core-dropdown>`);
153
+ const spy = sinon.spy();
154
+ component.addEventListener('edit', spy);
155
+ component?.shadowRoot
156
+ ?.querySelector('[data-test="edit-button"]')
157
+ ?.click();
158
+ expect(spy.callCount).to.equal(0);
159
+ });
160
+ it('dispatches one "input" event when an option is selected via click', async () => {
161
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
162
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
91
163
 
92
164
  <glide-core-dropdown-option
93
165
  label="Two"
94
- value="two"
95
166
  selected
96
167
  ></glide-core-dropdown-option>
97
168
  </glide-core-dropdown>`);
@@ -107,14 +178,10 @@ it('dispatches one "input" event when an option is selected via click', async ()
107
178
  });
108
179
  it('dispatches one "input" event when an option is selected via Enter', async () => {
109
180
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
110
- <glide-core-dropdown-option
111
- label="One"
112
- value="one"
113
- ></glide-core-dropdown-option>
181
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
114
182
 
115
183
  <glide-core-dropdown-option
116
184
  label="Two"
117
- value="two"
118
185
  selected
119
186
  ></glide-core-dropdown-option>
120
187
  </glide-core-dropdown>`);
@@ -134,14 +201,10 @@ it('dispatches one "input" event when an option is selected via Enter', async ()
134
201
  });
135
202
  it('dispatches one "input" event when an option is selected via Space', async () => {
136
203
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
137
- <glide-core-dropdown-option
138
- label="One"
139
- value="one"
140
- ></glide-core-dropdown-option>
204
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
141
205
 
142
206
  <glide-core-dropdown-option
143
207
  label="Two"
144
- value="two"
145
208
  selected
146
209
  ></glide-core-dropdown-option>
147
210
  </glide-core-dropdown>`);
@@ -180,14 +243,10 @@ it('does not dispatch a "change" event when an already selected option is clicke
180
243
  });
181
244
  it('does not dispatch a "change" event when `value` is changed programmatically', async () => {
182
245
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
183
- <glide-core-dropdown-option
184
- label="One"
185
- value="one"
186
- ></glide-core-dropdown-option>
246
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
187
247
 
188
248
  <glide-core-dropdown-option
189
249
  label="Two"
190
- value="two"
191
250
  selected
192
251
  ></glide-core-dropdown-option>
193
252
  </glide-core-dropdown>`);
@@ -201,14 +260,10 @@ it('does not dispatch a "change" event when `value` is changed programmatically'
201
260
  });
202
261
  it('continues to dispatch "change" events upon selection after `value` is changed programmatically', async () => {
203
262
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
204
- <glide-core-dropdown-option
205
- label="One"
206
- value="one"
207
- ></glide-core-dropdown-option>
263
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
208
264
 
209
265
  <glide-core-dropdown-option
210
266
  label="Two"
211
- value="two"
212
267
  selected
213
268
  ></glide-core-dropdown-option>
214
269
  </glide-core-dropdown>`);
@@ -221,14 +276,10 @@ it('continues to dispatch "change" events upon selection after `value` is change
221
276
  });
222
277
  it('does not dispatch an "input" event when `value` is changed programmatically', async () => {
223
278
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
224
- <glide-core-dropdown-option
225
- label="One"
226
- value="one"
227
- ></glide-core-dropdown-option>
279
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
228
280
 
229
281
  <glide-core-dropdown-option
230
282
  label="Two"
231
- value="two"
232
283
  selected
233
284
  ></glide-core-dropdown-option>
234
285
  </glide-core-dropdown>`);
@@ -244,14 +295,10 @@ it('does not dispatch a "change" event when an already selected option is select
244
295
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
245
296
  <glide-core-dropdown-option
246
297
  label="One"
247
- value="one"
248
298
  selected
249
299
  ></glide-core-dropdown-option>
250
300
 
251
- <glide-core-dropdown-option
252
- label="Two"
253
- value="two"
254
- ></glide-core-dropdown-option>
301
+ <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
255
302
  </glide-core-dropdown>`);
256
303
  const spy = sinon.spy();
257
304
  component.addEventListener('change', spy);
@@ -265,14 +312,10 @@ it('does not dispatch an "input" event when an already selected option is select
265
312
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
266
313
  <glide-core-dropdown-option
267
314
  label="One"
268
- value="one"
269
315
  selected
270
316
  ></glide-core-dropdown-option>
271
317
 
272
- <glide-core-dropdown-option
273
- label="Two"
274
- value="two"
275
- ></glide-core-dropdown-option>
318
+ <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
276
319
  </glide-core-dropdown>`);
277
320
  const spy = sinon.spy();
278
321
  component.addEventListener('input', spy);
@@ -284,14 +327,10 @@ it('does not dispatch an "input" event when an already selected option is select
284
327
  });
285
328
  it('continues to dispatch "input" events upon selection after `value` is changed programmatically', async () => {
286
329
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
287
- <glide-core-dropdown-option
288
- label="One"
289
- value="one"
290
- ></glide-core-dropdown-option>
330
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
291
331
 
292
332
  <glide-core-dropdown-option
293
333
  label="Two"
294
- value="two"
295
334
  selected
296
335
  ></glide-core-dropdown-option>
297
336
  </glide-core-dropdown>`);
@@ -7,60 +7,17 @@ import GlideCoreDropdownOption from './dropdown.option.js';
7
7
  GlideCoreDropdown.shadowRootOptions.mode = 'open';
8
8
  GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
9
9
  const defaultSlot = html `
10
- <glide-core-dropdown-option
11
- label="One"
12
- value="one"
13
- ></glide-core-dropdown-option>
14
-
15
- <glide-core-dropdown-option
16
- label="Two"
17
- value="two"
18
- ></glide-core-dropdown-option>
19
-
20
- <glide-core-dropdown-option
21
- label="Three"
22
- value="three"
23
- ></glide-core-dropdown-option>
24
-
25
- <glide-core-dropdown-option
26
- label="Four"
27
- value="four"
28
- ></glide-core-dropdown-option>
29
-
30
- <glide-core-dropdown-option
31
- label="Five"
32
- value="five"
33
- ></glide-core-dropdown-option>
34
-
35
- <glide-core-dropdown-option
36
- label="Six"
37
- value="six"
38
- ></glide-core-dropdown-option>
39
-
40
- <glide-core-dropdown-option
41
- label="Seven"
42
- value="seven"
43
- ></glide-core-dropdown-option>
44
-
45
- <glide-core-dropdown-option
46
- label="Eight"
47
- value="eight"
48
- ></glide-core-dropdown-option>
49
-
50
- <glide-core-dropdown-option
51
- label="Nine"
52
- value="nine"
53
- ></glide-core-dropdown-option>
54
-
55
- <glide-core-dropdown-option
56
- label="Ten"
57
- value="ten"
58
- ></glide-core-dropdown-option>
59
-
60
- <glide-core-dropdown-option
61
- label="Eleven"
62
- value="eleven"
63
- ></glide-core-dropdown-option>
10
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
11
+ <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
12
+ <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
13
+ <glide-core-dropdown-option label="Four"></glide-core-dropdown-option>
14
+ <glide-core-dropdown-option label="Five"></glide-core-dropdown-option>
15
+ <glide-core-dropdown-option label="Six"></glide-core-dropdown-option>
16
+ <glide-core-dropdown-option label="Seven"></glide-core-dropdown-option>
17
+ <glide-core-dropdown-option label="Eight"></glide-core-dropdown-option>
18
+ <glide-core-dropdown-option label="Nine"></glide-core-dropdown-option>
19
+ <glide-core-dropdown-option label="Ten"></glide-core-dropdown-option>
20
+ <glide-core-dropdown-option label="Eleven"></glide-core-dropdown-option>
64
21
  `;
65
22
  it('focuses the input when `focus()` is called', async () => {
66
23
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
@@ -109,12 +66,12 @@ it('retains focus on the the input when an option is selected via Enter', async
109
66
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
110
67
  expect(component.shadowRoot?.activeElement).to.equal(input);
111
68
  });
112
- it('retains focus on the the input when the button is clicked', async () => {
69
+ it('retains focus on the the input when the primary button is clicked', async () => {
113
70
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
114
71
  ${defaultSlot}
115
72
  </glide-core-dropdown>`);
116
73
  component.focus();
117
- const button = component.shadowRoot?.querySelector('[data-test="button"]');
74
+ const button = component.shadowRoot?.querySelector('[data-test="primary-button"]');
118
75
  assert(button);
119
76
  const { x, y } = button.getBoundingClientRect();
120
77
  // A simple `option.click()` won't do because we need a "mousedown" so that
@@ -130,10 +87,6 @@ it('focuses the input on submit when required and no option is selected', async
130
87
  const form = document.createElement('form');
131
88
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" required>
132
89
  ${defaultSlot}
133
- <glide-core-dropdown-option
134
- label="Label"
135
- value="value"
136
- ></glide-core-dropdown-option>
137
90
  </glide-core-dropdown>`, {
138
91
  parentNode: form,
139
92
  });
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-expressions */
2
2
  import './dropdown.option.js';
3
- import { expect, fixture, html } from '@open-wc/testing';
3
+ import { aTimeout, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
4
4
  import { sendKeys } from '@web/test-runner-commands';
5
5
  import GlideCoreDropdown from './dropdown.js';
6
6
  import GlideCoreDropdownOption from './dropdown.option.js';
@@ -14,10 +14,7 @@ it('closes and reports validity when it loses focus', async () => {
14
14
  open
15
15
  required
16
16
  >
17
- <glide-core-dropdown-option
18
- label="Label"
19
- value="value"
20
- ></glide-core-dropdown-option>
17
+ <glide-core-dropdown-option label="Label"></glide-core-dropdown-option>
21
18
  </glide-core-dropdown>`, { parentNode: div });
22
19
  const button = document.createElement('button');
23
20
  div.prepend(button);
@@ -27,7 +24,7 @@ it('closes and reports validity when it loses focus', async () => {
27
24
  expect(component.open).to.be.false;
28
25
  component.open = true;
29
26
  component.focus();
30
- // Move focus to the button.
27
+ // Move focus to the primary button.
31
28
  await sendKeys({ down: 'Shift' });
32
29
  await sendKeys({ press: 'Tab' });
33
30
  await sendKeys({ up: 'Shift' });
@@ -39,16 +36,72 @@ it('closes and reports validity when it loses focus', async () => {
39
36
  });
40
37
  it('is focused when clicked', async () => {
41
38
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
42
- <glide-core-dropdown-option
43
- label="Label"
44
- value="value"
45
- ></glide-core-dropdown-option>
39
+ <glide-core-dropdown-option label="Label"></glide-core-dropdown-option>
46
40
  </glide-core-dropdown>`);
47
41
  // Calling `click()` would be sweet. The problem is it sets `event.detail` to `0`,
48
42
  // which puts us in a guard in the event handler. `Event` has no `detail` property
49
43
  // and would work. `CustomEvent` is used for completeness and to get us as close as
50
44
  // possible to a real click. See the comment in the handler for more information.
51
- const button = component.shadowRoot?.querySelector('[data-test="button"]');
45
+ const button = component.shadowRoot?.querySelector('[data-test="primary-button"]');
52
46
  button?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
53
47
  expect(component.shadowRoot?.activeElement).to.equal(button);
54
48
  });
49
+ it('focuses the Add button on ArrowDown', async () => {
50
+ const component = await fixture(html `<glide-core-dropdown
51
+ add-button-label="Add"
52
+ label="Label"
53
+ placeholder="Placeholder"
54
+ open
55
+ >
56
+ <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
57
+ <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
58
+ </glide-core-dropdown>`);
59
+ // Wait for it to open.
60
+ await aTimeout(0);
61
+ const options = component.querySelectorAll('glide-core-dropdown-option');
62
+ component.focus();
63
+ await sendKeys({ press: 'ArrowDown' }); // Two
64
+ await sendKeys({ press: 'ArrowDown' }); // Add button
65
+ const addButton = component.shadowRoot?.querySelector('[data-test="add-button"]');
66
+ expect(options[0]?.privateActive).to.be.false;
67
+ expect(options[0]?.privateActive).to.be.false;
68
+ expect(options[1]?.privateActive).to.be.false;
69
+ expect(options[1]?.privateIsEditActive).to.be.false;
70
+ expect(options[1]?.privateIsOpenTooltip).to.be.false;
71
+ expect(component.shadowRoot?.activeElement).to.equal(addButton);
72
+ });
73
+ it('returns focus to itself on Escape when the Add button has focus', async () => {
74
+ const component = await fixture(html `<glide-core-dropdown
75
+ add-button-label="Add"
76
+ label="Label"
77
+ placeholder="Placeholder"
78
+ open
79
+ >
80
+ <glide-core-dropdown-option label="Label"></glide-core-dropdown-option>
81
+ </glide-core-dropdown>`);
82
+ // Wait for it to open.
83
+ await aTimeout(0);
84
+ component.focus();
85
+ await sendKeys({ press: 'Tab' });
86
+ await sendKeys({ press: 'Escape' });
87
+ expect(document.activeElement).to.equal(component);
88
+ });
89
+ it('returns focus to itself when an option is activated and the Add button has focus', async () => {
90
+ const component = await fixture(html `<glide-core-dropdown
91
+ add-button-label="Add"
92
+ label="Label"
93
+ placeholder="Placeholder"
94
+ open
95
+ >
96
+ <glide-core-dropdown-option label="Label"></glide-core-dropdown-option>
97
+ </glide-core-dropdown>`);
98
+ // Wait for it to open.
99
+ await aTimeout(0);
100
+ component.focus();
101
+ await sendKeys({ press: 'Tab' });
102
+ component
103
+ .querySelector('glide-core-dropdown-option')
104
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
105
+ await elementUpdated(component);
106
+ expect(document.activeElement).to.equal(component);
107
+ });