@crowdstrike/glide-core 0.7.0 → 0.9.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.
Files changed (203) hide show
  1. package/README.md +44 -5
  2. package/dist/accordion.test.basics.js +1 -0
  3. package/dist/accordion.test.events.js +1 -0
  4. package/dist/button-group.button.d.ts +14 -15
  5. package/dist/button-group.button.js +1 -1
  6. package/dist/button-group.button.styles.js +75 -52
  7. package/dist/button-group.button.test.basics.d.ts +1 -1
  8. package/dist/button-group.button.test.basics.js +84 -147
  9. package/dist/button-group.button.test.events.js +9 -67
  10. package/dist/button-group.button.test.focus.js +13 -0
  11. package/dist/button-group.button.test.interactions.d.ts +1 -0
  12. package/dist/button-group.button.test.interactions.js +42 -0
  13. package/dist/button-group.d.ts +7 -10
  14. package/dist/button-group.js +1 -1
  15. package/dist/button-group.stories.d.ts +1 -5
  16. package/dist/button-group.styles.js +18 -6
  17. package/dist/button-group.test.basics.js +114 -234
  18. package/dist/button-group.test.events.js +211 -263
  19. package/dist/button-group.test.focus.d.ts +1 -0
  20. package/dist/button-group.test.focus.js +39 -0
  21. package/dist/button-group.test.interactions.d.ts +1 -0
  22. package/dist/button-group.test.interactions.js +91 -0
  23. package/dist/button.test.basics.js +2 -1
  24. package/dist/button.test.events.js +1 -0
  25. package/dist/button.test.form.js +1 -0
  26. package/dist/checkbox-group.js +1 -1
  27. package/dist/checkbox-group.styles.js +1 -1
  28. package/dist/checkbox-group.test.basics.js +2 -1
  29. package/dist/checkbox-group.test.events.js +5 -4
  30. package/dist/checkbox-group.test.focus.js +5 -3
  31. package/dist/checkbox-group.test.form.js +1 -0
  32. package/dist/checkbox-group.test.validity.js +1 -0
  33. package/dist/checkbox.d.ts +7 -1
  34. package/dist/checkbox.js +1 -1
  35. package/dist/checkbox.styles.js +11 -3
  36. package/dist/checkbox.test.basics.js +1 -0
  37. package/dist/checkbox.test.events.js +5 -4
  38. package/dist/checkbox.test.focus.js +2 -2
  39. package/dist/checkbox.test.form.js +1 -0
  40. package/dist/{checkbox.test.states.js → checkbox.test.interactions.js} +25 -1
  41. package/dist/checkbox.test.validity.js +1 -0
  42. package/dist/drawer.js +1 -1
  43. package/dist/drawer.test.basics.js +1 -0
  44. package/dist/drawer.test.closing.js +1 -0
  45. package/dist/drawer.test.events.js +1 -0
  46. package/dist/drawer.test.methods.js +1 -0
  47. package/dist/dropdown.d.ts +6 -4
  48. package/dist/dropdown.js +1 -1
  49. package/dist/dropdown.option.d.ts +7 -2
  50. package/dist/dropdown.option.js +1 -1
  51. package/dist/dropdown.option.styles.js +13 -0
  52. package/dist/dropdown.option.test.basics.js +7 -3
  53. package/dist/dropdown.option.test.basics.multiple.js +1 -0
  54. package/dist/dropdown.option.test.basics.single.js +1 -0
  55. package/dist/dropdown.option.test.events.js +2 -1
  56. package/dist/dropdown.option.test.focus.js +1 -1
  57. package/dist/dropdown.option.test.interactions.multiple.js +2 -54
  58. package/dist/dropdown.option.test.interactions.single.js +52 -9
  59. package/dist/dropdown.styles.js +20 -19
  60. package/dist/dropdown.test.basics.filterable.js +1 -0
  61. package/dist/dropdown.test.basics.js +144 -2
  62. package/dist/dropdown.test.basics.multiple.js +6 -3
  63. package/dist/dropdown.test.basics.single.js +1 -1
  64. package/dist/dropdown.test.events.filterable.js +74 -0
  65. package/dist/dropdown.test.events.js +50 -160
  66. package/dist/dropdown.test.events.multiple.js +268 -10
  67. package/dist/dropdown.test.events.single.js +202 -4
  68. package/dist/dropdown.test.focus.filterable.js +9 -5
  69. package/dist/dropdown.test.focus.js +2 -1
  70. package/dist/dropdown.test.focus.multiple.js +1 -2
  71. package/dist/dropdown.test.focus.single.js +1 -1
  72. package/dist/dropdown.test.form.js +1 -0
  73. package/dist/dropdown.test.form.multiple.js +1 -0
  74. package/dist/dropdown.test.form.single.js +1 -0
  75. package/dist/dropdown.test.interactions.filterable.js +69 -11
  76. package/dist/dropdown.test.interactions.js +95 -5
  77. package/dist/dropdown.test.interactions.multiple.js +203 -6
  78. package/dist/dropdown.test.interactions.single.js +69 -6
  79. package/dist/dropdown.test.validity.js +1 -0
  80. package/dist/form-controls-layout.test.basics.js +2 -1
  81. package/dist/icon-button.test.basics.js +2 -1
  82. package/dist/icons/checked.d.ts +1 -1
  83. package/dist/icons/checked.js +1 -1
  84. package/dist/icons/magnifying-glass.js +1 -1
  85. package/dist/input.d.ts +0 -6
  86. package/dist/input.js +1 -1
  87. package/dist/input.styles.js +7 -2
  88. package/dist/input.test.basics.js +20 -5
  89. package/dist/input.test.events.js +5 -4
  90. package/dist/input.test.focus.js +5 -4
  91. package/dist/input.test.form.js +1 -0
  92. package/dist/input.test.translations.d.ts +1 -0
  93. package/dist/input.test.translations.js +38 -0
  94. package/dist/input.test.validity.js +134 -4
  95. package/dist/label.d.ts +1 -1
  96. package/dist/label.js +1 -1
  97. package/dist/label.styles.js +29 -20
  98. package/dist/label.test.basics.js +27 -24
  99. package/dist/library/expect-argument-error.js +1 -1
  100. package/dist/library/localize.d.ts +5 -1
  101. package/dist/library/ow.test.d.ts +2 -1
  102. package/dist/library/ow.test.js +8 -3
  103. package/dist/menu.button.test.basics.js +1 -0
  104. package/dist/menu.d.ts +3 -5
  105. package/dist/menu.js +1 -1
  106. package/dist/menu.link.test.basics.js +1 -0
  107. package/dist/menu.options.test.basics.js +3 -2
  108. package/dist/menu.styles.js +1 -15
  109. package/dist/menu.test.basics.d.ts +1 -2
  110. package/dist/menu.test.basics.js +23 -6
  111. package/dist/menu.test.events.d.ts +1 -0
  112. package/dist/menu.test.events.js +2 -1
  113. package/dist/menu.test.focus.d.ts +1 -0
  114. package/dist/menu.test.focus.js +14 -6
  115. package/dist/menu.test.interactions.js +213 -56
  116. package/dist/modal.icon-button.test.basics.js +2 -1
  117. package/dist/modal.js +1 -1
  118. package/dist/modal.styles.js +18 -13
  119. package/dist/modal.tertiary-icon.d.ts +0 -1
  120. package/dist/modal.tertiary-icon.js +1 -1
  121. package/dist/modal.tertiary-icon.test.basics.js +2 -1
  122. package/dist/modal.test.accessibility.js +1 -0
  123. package/dist/modal.test.basics.js +2 -1
  124. package/dist/modal.test.close.js +1 -0
  125. package/dist/modal.test.events.js +11 -10
  126. package/dist/modal.test.lock-scroll.js +1 -0
  127. package/dist/modal.test.methods.js +1 -0
  128. package/dist/modal.test.scrollbars.js +1 -0
  129. package/dist/radio-group.js +1 -1
  130. package/dist/radio-group.styles.js +1 -1
  131. package/dist/radio-group.test.basics.js +1 -0
  132. package/dist/radio-group.test.events.js +1 -0
  133. package/dist/radio-group.test.focus.js +4 -3
  134. package/dist/radio-group.test.form.js +1 -0
  135. package/dist/radio-group.test.validity.js +1 -0
  136. package/dist/radio.d.ts +1 -0
  137. package/dist/radio.js +1 -1
  138. package/dist/radio.styles.js +33 -0
  139. package/dist/split-button.test.basics.js +1 -0
  140. package/dist/split-container.test.basics.js +5 -0
  141. package/dist/split-link.test.basics.js +1 -0
  142. package/dist/split-link.test.interactions.js +2 -1
  143. package/dist/styles/variables.css +1 -1
  144. package/dist/tab.d.ts +1 -3
  145. package/dist/tab.group.d.ts +3 -5
  146. package/dist/tab.group.js +1 -1
  147. package/dist/tab.group.styles.js +27 -13
  148. package/dist/tab.group.test.basics.js +8 -57
  149. package/dist/tab.group.test.interactions.d.ts +3 -0
  150. package/dist/tab.group.test.interactions.js +454 -0
  151. package/dist/tab.js +1 -1
  152. package/dist/tab.panel.d.ts +1 -0
  153. package/dist/tab.panel.js +1 -1
  154. package/dist/tab.panel.styles.js +11 -1
  155. package/dist/tab.styles.js +7 -68
  156. package/dist/tab.test.basics.js +0 -20
  157. package/dist/tabs.stories.d.ts +1 -2
  158. package/dist/tag.test.basics.js +3 -2
  159. package/dist/textarea.d.ts +0 -1
  160. package/dist/textarea.js +2 -2
  161. package/dist/textarea.stories.d.ts +3 -4
  162. package/dist/textarea.styles.js +14 -3
  163. package/dist/textarea.test.basics.js +81 -44
  164. package/dist/textarea.test.events.js +57 -41
  165. package/dist/textarea.test.form.js +1 -0
  166. package/dist/textarea.test.translations.d.ts +1 -0
  167. package/dist/textarea.test.translations.js +34 -0
  168. package/dist/textarea.test.validity.js +105 -20
  169. package/dist/toasts.js +1 -1
  170. package/dist/toasts.styles.js +8 -1
  171. package/dist/toasts.test.basics.js +20 -0
  172. package/dist/toggle.js +1 -1
  173. package/dist/toggle.test.basics.js +1 -0
  174. package/dist/toggle.test.events.js +1 -0
  175. package/dist/toggle.test.focus.js +1 -1
  176. package/dist/toggle.test.interactions.d.ts +1 -0
  177. package/dist/{toggle.test.states.js → toggle.test.interactions.js} +1 -0
  178. package/dist/tooltip.d.ts +7 -5
  179. package/dist/tooltip.js +1 -1
  180. package/dist/tooltip.styles.js +90 -25
  181. package/dist/tooltip.test.basics.js +39 -3
  182. package/dist/tooltip.test.interactions.js +137 -34
  183. package/dist/translations/en.js +1 -1
  184. package/dist/translations/fr.js +1 -1
  185. package/dist/translations/ja.js +1 -1
  186. package/dist/tree.d.ts +0 -1
  187. package/dist/tree.item.d.ts +2 -3
  188. package/dist/tree.item.js +1 -1
  189. package/dist/tree.item.menu.d.ts +0 -1
  190. package/dist/tree.item.menu.js +1 -1
  191. package/dist/tree.item.test.basics.js +1 -0
  192. package/dist/tree.js +1 -1
  193. package/dist/tree.test.basics.js +2 -1
  194. package/dist/tree.test.events.js +1 -1
  195. package/package.json +40 -29
  196. package/dist/drawer.test.floating-components.d.ts +0 -1
  197. package/dist/drawer.test.floating-components.js +0 -51
  198. package/dist/library/set-containing-block.d.ts +0 -15
  199. package/dist/library/set-containing-block.js +0 -1
  200. package/dist/modal.test.floating-components.js +0 -62
  201. /package/dist/{checkbox.test.states.d.ts → button-group.button.test.focus.d.ts} +0 -0
  202. /package/dist/{modal.test.floating-components.d.ts → checkbox.test.interactions.d.ts} +0 -0
  203. /package/dist/{toggle.test.states.d.ts → dropdown.test.events.filterable.d.ts} +0 -0
@@ -1,9 +1,22 @@
1
- import { assert, expect, fixture, html } from '@open-wc/testing';
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ import { aTimeout, assert, expect, fixture, html } from '@open-wc/testing';
2
3
  import { sendKeys, sendMouse } from '@web/test-runner-commands';
3
4
  import GlideCoreDropdown from './dropdown.js';
4
5
  import GlideCoreDropdownOption from './dropdown.option.js';
5
6
  GlideCoreDropdown.shadowRootOptions.mode = 'open';
6
7
  GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
8
+ it('opens when opened programmatically', async () => {
9
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
10
+ <glide-core-dropdown-option
11
+ label="Label"
12
+ value="value"
13
+ ></glide-core-dropdown-option>
14
+ </glide-core-dropdown>`);
15
+ component.open = true;
16
+ await aTimeout(0);
17
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
18
+ expect(options?.checkVisibility()).to.be.true;
19
+ });
7
20
  it('opens on ArrowUp', async () => {
8
21
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
9
22
  <glide-core-dropdown-option
@@ -13,9 +26,9 @@ it('opens on ArrowUp', async () => {
13
26
  </glide-core-dropdown>`);
14
27
  component.focus();
15
28
  await sendKeys({ press: 'ArrowUp' });
16
- const option = component.querySelector('glide-core-dropdown-option');
29
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
17
30
  expect(component.open).to.be.true;
18
- expect(option?.privateActive).to.be.true;
31
+ expect(options?.checkVisibility()).to.be.true;
19
32
  });
20
33
  it('does not open on ArrowUp when `disabled`', async () => {
21
34
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
@@ -26,7 +39,9 @@ it('does not open on ArrowUp when `disabled`', async () => {
26
39
  </glide-core-dropdown>`);
27
40
  component.focus();
28
41
  await sendKeys({ press: 'ArrowUp' });
42
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
29
43
  expect(component.open).to.be.false;
44
+ expect(options?.checkVisibility()).to.be.false;
30
45
  });
31
46
  it('does not open on ArrowUp when `readonly`', async () => {
32
47
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
@@ -37,7 +52,9 @@ it('does not open on ArrowUp when `readonly`', async () => {
37
52
  </glide-core-dropdown>`);
38
53
  component.focus();
39
54
  await sendKeys({ press: 'ArrowUp' });
55
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
40
56
  expect(component.open).to.be.false;
57
+ expect(options?.checkVisibility()).to.be.false;
41
58
  });
42
59
  it('opens on ArrowDown', async () => {
43
60
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
@@ -53,9 +70,9 @@ it('opens on ArrowDown', async () => {
53
70
  </glide-core-dropdown>`);
54
71
  component.focus();
55
72
  await sendKeys({ press: 'ArrowDown' });
56
- const option = component.querySelector('glide-core-dropdown-option');
73
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
57
74
  expect(component.open).to.be.true;
58
- expect(option?.privateActive).to.be.true;
75
+ expect(options?.checkVisibility()).to.be.true;
59
76
  });
60
77
  it('does not open on ArrowDown when `disabled`', async () => {
61
78
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
@@ -71,7 +88,9 @@ it('does not open on ArrowDown when `disabled`', async () => {
71
88
  </glide-core-dropdown>`);
72
89
  component.focus();
73
90
  await sendKeys({ press: 'ArrowDown' });
91
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
74
92
  expect(component.open).to.be.false;
93
+ expect(options?.checkVisibility()).to.be.false;
75
94
  });
76
95
  it('does not open on ArrowDown when `readonly`', async () => {
77
96
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
@@ -87,7 +106,9 @@ it('does not open on ArrowDown when `readonly`', async () => {
87
106
  </glide-core-dropdown>`);
88
107
  component.focus();
89
108
  await sendKeys({ press: 'ArrowDown' });
109
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
90
110
  expect(component.open).to.be.false;
111
+ expect(options?.checkVisibility()).to.be.false;
91
112
  });
92
113
  it('opens on Space', async () => {
93
114
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
@@ -98,7 +119,9 @@ it('opens on Space', async () => {
98
119
  </glide-core-dropdown>`);
99
120
  component.focus();
100
121
  await sendKeys({ press: ' ' });
122
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
101
123
  expect(component.open).to.be.true;
124
+ expect(options?.checkVisibility()).to.be.true;
102
125
  });
103
126
  it('does not open on Space when `disabled`', async () => {
104
127
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
@@ -109,7 +132,9 @@ it('does not open on Space when `disabled`', async () => {
109
132
  </glide-core-dropdown>`);
110
133
  component.focus();
111
134
  await sendKeys({ press: ' ' });
135
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
112
136
  expect(component.open).to.be.false;
137
+ expect(options?.checkVisibility()).to.be.false;
113
138
  });
114
139
  it('does not open on Space when `readonly`', async () => {
115
140
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
@@ -120,7 +145,9 @@ it('does not open on Space when `readonly`', async () => {
120
145
  </glide-core-dropdown>`);
121
146
  component.focus();
122
147
  await sendKeys({ press: ' ' });
148
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
123
149
  expect(component.open).to.be.false;
150
+ expect(options?.checkVisibility()).to.be.false;
124
151
  });
125
152
  // See the `document` click listener comment in `dropdown.ts` for an explanation.
126
153
  it('opens when opened programmatically via the click handler of another element', async () => {
@@ -135,7 +162,11 @@ it('opens when opened programmatically via the click handler of another element'
135
162
  button.addEventListener('click', () => (component.open = true));
136
163
  div.append(button);
137
164
  button.click();
165
+ // Wait for it to open.
166
+ await aTimeout(0);
167
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
138
168
  expect(component.open).to.be.true;
169
+ expect(options?.checkVisibility()).to.be.true;
139
170
  });
140
171
  it('closes when something outside of it is clicked', async () => {
141
172
  const component = await fixture(html `<glide-core-dropdown
@@ -180,6 +211,49 @@ it('closes on Escape', async () => {
180
211
  await sendKeys({ press: 'Escape' });
181
212
  expect(component.open).to.be.false;
182
213
  });
214
+ it('opens when open and enabled programmatically', async () => {
215
+ const component = await fixture(html `<glide-core-dropdown
216
+ label="Label"
217
+ placeholder="Placeholder"
218
+ open
219
+ disabled
220
+ >
221
+ <glide-core-dropdown-option
222
+ label="One"
223
+ value="one"
224
+ selected
225
+ ></glide-core-dropdown-option>
226
+
227
+ <glide-core-dropdown-option
228
+ label="Two"
229
+ value="two"
230
+ ></glide-core-dropdown-option>
231
+ </glide-core-dropdown>`);
232
+ component.disabled = false;
233
+ // Wait for it to open.
234
+ await aTimeout(0);
235
+ const options = component?.shadowRoot?.querySelector('[data-test="options"]');
236
+ expect(options?.checkVisibility()).to.be.true;
237
+ });
238
+ it('closes when open and disabled programmatically', async () => {
239
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
240
+ <glide-core-dropdown-option
241
+ label="One"
242
+ value="one"
243
+ selected
244
+ ></glide-core-dropdown-option>
245
+
246
+ <glide-core-dropdown-option
247
+ label="Two"
248
+ value="two"
249
+ ></glide-core-dropdown-option>
250
+ </glide-core-dropdown>`);
251
+ // Wait for it to open.
252
+ await aTimeout(0);
253
+ component.disabled = true;
254
+ const options = component?.shadowRoot?.querySelector('[data-test="options"]');
255
+ expect(options?.checkVisibility()).to.be.false;
256
+ });
183
257
  it('activates an option on "mouseover"', async () => {
184
258
  const component = await fixture(html `<glide-core-dropdown open>
185
259
  <glide-core-dropdown-option
@@ -208,6 +282,8 @@ it('activates the next option on ArrowDown', async () => {
208
282
  value="two"
209
283
  ></glide-core-dropdown-option>
210
284
  </glide-core-dropdown>`);
285
+ // Wait for it to open.
286
+ await aTimeout(0);
211
287
  const options = component.querySelectorAll('glide-core-dropdown-option');
212
288
  options[0]?.focus();
213
289
  await sendKeys({ press: 'ArrowDown' });
@@ -226,6 +302,8 @@ it('activates the previous option on ArrowUp', async () => {
226
302
  value="two"
227
303
  ></glide-core-dropdown-option>
228
304
  </glide-core-dropdown>`);
305
+ // Wait for it to open.
306
+ await aTimeout(0);
229
307
  const options = component.querySelectorAll('glide-core-dropdown-option');
230
308
  options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
231
309
  options[1]?.focus();
@@ -246,6 +324,8 @@ it('activates the first option on Home', async () => {
246
324
  value="two"
247
325
  ></glide-core-dropdown-option>
248
326
  </glide-core-dropdown>`);
327
+ // Wait for it to open.
328
+ await aTimeout(0);
249
329
  const options = component.querySelectorAll('glide-core-dropdown-option');
250
330
  options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
251
331
  expect(options[1].privateActive).to.be.true;
@@ -266,6 +346,8 @@ it('activates the first option on PageUp', async () => {
266
346
  value="two"
267
347
  ></glide-core-dropdown-option>
268
348
  </glide-core-dropdown>`);
349
+ // Wait for it to open.
350
+ await aTimeout(0);
269
351
  const options = component.querySelectorAll('glide-core-dropdown-option');
270
352
  options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
271
353
  options[1].focus();
@@ -286,6 +368,8 @@ it('activates the first option on ArrowUp + Meta', async () => {
286
368
  value="two"
287
369
  ></glide-core-dropdown-option>
288
370
  </glide-core-dropdown>`);
371
+ // Wait for it to open.
372
+ await aTimeout(0);
289
373
  const options = component.querySelectorAll('glide-core-dropdown-option');
290
374
  options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
291
375
  expect(options[1]?.privateActive).to.be.true;
@@ -308,6 +392,8 @@ it('activates the last option on End', async () => {
308
392
  value="two"
309
393
  ></glide-core-dropdown-option>
310
394
  </glide-core-dropdown>`);
395
+ // Wait for it to open.
396
+ await aTimeout(0);
311
397
  const options = component.querySelectorAll('glide-core-dropdown-option');
312
398
  options[0]?.focus();
313
399
  await sendKeys({ press: 'End' });
@@ -326,6 +412,8 @@ it('activates the last option on PageDown', async () => {
326
412
  value="two"
327
413
  ></glide-core-dropdown-option>
328
414
  </glide-core-dropdown>`);
415
+ // Wait for it to open.
416
+ await aTimeout(0);
329
417
  const options = component.querySelectorAll('glide-core-dropdown-option');
330
418
  options[0]?.focus();
331
419
  await sendKeys({ press: 'PageDown' });
@@ -344,6 +432,8 @@ it('activates the last option on Meta + ArrowDown', async () => {
344
432
  value="two"
345
433
  ></glide-core-dropdown-option>
346
434
  </glide-core-dropdown>`);
435
+ // Wait for it to open.
436
+ await aTimeout(0);
347
437
  const options = component.querySelectorAll('glide-core-dropdown-option');
348
438
  options[0]?.focus();
349
439
  await sendKeys({ down: 'Meta' });
@@ -1,9 +1,9 @@
1
- import { assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ import { aTimeout, assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
2
3
  import { sendKeys } from '@web/test-runner-commands';
3
4
  import { sendMouse } from '@web/test-runner-commands';
4
5
  import GlideCoreDropdown from './dropdown.js';
5
6
  import GlideCoreDropdownOption from './dropdown.option.js';
6
- import GlideCoreTag from './tag.js';
7
7
  GlideCoreDropdown.shadowRootOptions.mode = 'open';
8
8
  GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
9
9
  it('opens on click', async () => {
@@ -25,7 +25,11 @@ it('opens on click', async () => {
25
25
  component.shadowRoot
26
26
  ?.querySelector('[data-test="button"]')
27
27
  ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
28
+ // Wait for it to open.
29
+ await aTimeout(0);
30
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
28
31
  expect(component.open).to.be.true;
32
+ expect(options?.checkVisibility()).to.be.true;
29
33
  });
30
34
  it('toggles open and closed when the button is clicked', async () => {
31
35
  const component = await fixture(html `<glide-core-dropdown
@@ -51,7 +55,10 @@ it('toggles open and closed when the button is clicked', async () => {
51
55
  component.shadowRoot
52
56
  ?.querySelector('[data-test="button"]')
53
57
  ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
58
+ await elementUpdated(component);
59
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
54
60
  expect(component.open).to.be.false;
61
+ expect(options?.checkVisibility()).to.be.false;
55
62
  });
56
63
  it('does not toggle open and closed when the button overflow text is clicked', async () => {
57
64
  const component = await fixture(html `<glide-core-dropdown
@@ -77,7 +84,11 @@ it('does not toggle open and closed when the button overflow text is clicked', a
77
84
  component.shadowRoot
78
85
  ?.querySelector('[data-test="tag-overflow-text"]')
79
86
  ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
87
+ // Wait for it to open.
88
+ await aTimeout(0);
89
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
80
90
  expect(component.open).to.be.true;
91
+ expect(options?.checkVisibility()).to.be.true;
81
92
  });
82
93
  it('selects options on click', async () => {
83
94
  const component = await fixture(html `<glide-core-dropdown
@@ -123,6 +134,8 @@ it('selects options on Space', async () => {
123
134
  value="two"
124
135
  ></glide-core-dropdown-option>
125
136
  </glide-core-dropdown>`);
137
+ // Wait for it to open.
138
+ await aTimeout(0);
126
139
  const options = component.querySelectorAll('glide-core-dropdown-option');
127
140
  options[0]?.focus();
128
141
  await sendKeys({ press: ' ' });
@@ -153,6 +166,8 @@ it('selects options on Enter', async () => {
153
166
  value="two"
154
167
  ></glide-core-dropdown-option>
155
168
  </glide-core-dropdown>`);
169
+ // Wait for it to open.
170
+ await aTimeout(0);
156
171
  const options = component.querySelectorAll('glide-core-dropdown-option');
157
172
  options[0]?.focus();
158
173
  await sendKeys({ press: 'Enter' });
@@ -398,6 +413,8 @@ it('updates `value` when a option is selected or deselected via Enter', async ()
398
413
 
399
414
  <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
400
415
  </glide-core-dropdown>`);
416
+ // Wait for it to open.
417
+ await aTimeout(0);
401
418
  const options = component.querySelectorAll('glide-core-dropdown-option');
402
419
  options[1].focus();
403
420
  await sendKeys({ press: 'Enter' });
@@ -424,6 +441,8 @@ it('updates `value` when an option is selected or deselected via Space', async (
424
441
 
425
442
  <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
426
443
  </glide-core-dropdown>`);
444
+ // Wait for it to open.
445
+ await aTimeout(0);
427
446
  const options = component.querySelectorAll('glide-core-dropdown-option');
428
447
  options[1].focus();
429
448
  await sendKeys({ press: ' ' });
@@ -626,7 +645,7 @@ it('deselects all but the last selected option when `multiple` is changed to `fa
626
645
  expect(options[0].selected).be.false;
627
646
  expect(options[1].selected).be.true;
628
647
  });
629
- it('selects all options when none are selected and Select All is clicked', async () => {
648
+ it('selects all options when none are selected and Select All is selected via click', async () => {
630
649
  const component = await fixture(html `<glide-core-dropdown
631
650
  label="Label"
632
651
  placeholder="Placeholder"
@@ -650,7 +669,7 @@ it('selects all options when none are selected and Select All is clicked', async
650
669
  expect(options[0].selected).to.be.true;
651
670
  expect(options[1].selected).to.be.true;
652
671
  });
653
- it('selects all options when some are selected and Select All is clicked', async () => {
672
+ it('selects all options when some are selected and Select All is selected via click', async () => {
654
673
  const component = await fixture(html `<glide-core-dropdown
655
674
  label="Label"
656
675
  placeholder="Placeholder"
@@ -675,7 +694,7 @@ it('selects all options when some are selected and Select All is clicked', async
675
694
  expect(options[0].selected).to.be.true;
676
695
  expect(options[1].selected).to.be.true;
677
696
  });
678
- it('deelects all options when all are selected and Select All is clicked', async () => {
697
+ it('deselects all options when all are selected and Select All is selected via click', async () => {
679
698
  const component = await fixture(html `<glide-core-dropdown
680
699
  label="Label"
681
700
  placeholder="Placeholder"
@@ -701,8 +720,181 @@ it('deelects all options when all are selected and Select All is clicked', async
701
720
  expect(options[0].selected).to.be.false;
702
721
  expect(options[1].selected).to.be.false;
703
722
  });
723
+ it('selects all options when none are selected and Select All is selected via Space', async () => {
724
+ const component = await fixture(html `<glide-core-dropdown
725
+ label="Label"
726
+ placeholder="Placeholder"
727
+ multiple
728
+ open
729
+ select-all
730
+ >
731
+ <glide-core-dropdown-option
732
+ label="One"
733
+ value="one"
734
+ ></glide-core-dropdown-option>
735
+
736
+ <glide-core-dropdown-option
737
+ label="Two"
738
+ value="two"
739
+ ></glide-core-dropdown-option>
740
+ </glide-core-dropdown>`);
741
+ component?.shadowRoot
742
+ ?.querySelector('[data-test="select-all"]')
743
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
744
+ component.focus();
745
+ await sendKeys({ press: ' ' });
746
+ const options = component.querySelectorAll('glide-core-dropdown-option');
747
+ expect(options[0].selected).to.be.true;
748
+ expect(options[1].selected).to.be.true;
749
+ });
750
+ it('selects all options when some are selected and Select All is selected via Space', async () => {
751
+ const component = await fixture(html `<glide-core-dropdown
752
+ label="Label"
753
+ placeholder="Placeholder"
754
+ multiple
755
+ open
756
+ select-all
757
+ >
758
+ <glide-core-dropdown-option
759
+ label="One"
760
+ value="one"
761
+ selected
762
+ ></glide-core-dropdown-option>
763
+
764
+ <glide-core-dropdown-option
765
+ label="Two"
766
+ value="two"
767
+ ></glide-core-dropdown-option>
768
+ </glide-core-dropdown>`);
769
+ component?.shadowRoot
770
+ ?.querySelector('[data-test="select-all"]')
771
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
772
+ component.focus();
773
+ await sendKeys({ press: ' ' });
774
+ const options = component.querySelectorAll('glide-core-dropdown-option');
775
+ expect(options[0].selected).to.be.true;
776
+ expect(options[1].selected).to.be.true;
777
+ });
778
+ it('deselects all options when all are selected and Select All is selected via Space', async () => {
779
+ const component = await fixture(html `<glide-core-dropdown
780
+ label="Label"
781
+ placeholder="Placeholder"
782
+ multiple
783
+ open
784
+ select-all
785
+ >
786
+ <glide-core-dropdown-option
787
+ label="One"
788
+ value="one"
789
+ selected
790
+ ></glide-core-dropdown-option>
791
+
792
+ <glide-core-dropdown-option
793
+ label="Two"
794
+ value="two"
795
+ selected
796
+ ></glide-core-dropdown-option>
797
+ </glide-core-dropdown>`);
798
+ component?.shadowRoot
799
+ ?.querySelector('[data-test="select-all"]')
800
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
801
+ component.focus();
802
+ await sendKeys({ press: ' ' });
803
+ const options = component.querySelectorAll('glide-core-dropdown-option');
804
+ expect(options[0].selected).to.be.false;
805
+ expect(options[1].selected).to.be.false;
806
+ });
807
+ it('selects all options when none are selected and Select All is selected via Enter', async () => {
808
+ const component = await fixture(html `<glide-core-dropdown
809
+ label="Label"
810
+ placeholder="Placeholder"
811
+ multiple
812
+ open
813
+ select-all
814
+ >
815
+ <glide-core-dropdown-option
816
+ label="One"
817
+ value="one"
818
+ ></glide-core-dropdown-option>
819
+
820
+ <glide-core-dropdown-option
821
+ label="Two"
822
+ value="two"
823
+ ></glide-core-dropdown-option>
824
+ </glide-core-dropdown>`);
825
+ component?.shadowRoot
826
+ ?.querySelector('[data-test="select-all"]')
827
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
828
+ component.focus();
829
+ await sendKeys({ press: 'Enter' });
830
+ const options = component.querySelectorAll('glide-core-dropdown-option');
831
+ expect(options[0].selected).to.be.true;
832
+ expect(options[1].selected).to.be.true;
833
+ });
834
+ it('selects all options when some are selected and Select All is selected via Enter', async () => {
835
+ const component = await fixture(html `<glide-core-dropdown
836
+ label="Label"
837
+ placeholder="Placeholder"
838
+ multiple
839
+ open
840
+ select-all
841
+ >
842
+ <glide-core-dropdown-option
843
+ label="One"
844
+ value="one"
845
+ selected
846
+ ></glide-core-dropdown-option>
847
+
848
+ <glide-core-dropdown-option
849
+ label="Two"
850
+ value="two"
851
+ ></glide-core-dropdown-option>
852
+ </glide-core-dropdown>`);
853
+ component?.shadowRoot
854
+ ?.querySelector('[data-test="select-all"]')
855
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
856
+ component.focus();
857
+ await sendKeys({ press: 'Enter' });
858
+ const options = component.querySelectorAll('glide-core-dropdown-option');
859
+ expect(options[0].selected).to.be.true;
860
+ expect(options[1].selected).to.be.true;
861
+ });
862
+ it('deselects all options when all are selected and Select All is selected via Enter', async () => {
863
+ const component = await fixture(html `<glide-core-dropdown
864
+ label="Label"
865
+ placeholder="Placeholder"
866
+ multiple
867
+ open
868
+ select-all
869
+ >
870
+ <glide-core-dropdown-option
871
+ label="One"
872
+ value="one"
873
+ selected
874
+ ></glide-core-dropdown-option>
875
+
876
+ <glide-core-dropdown-option
877
+ label="Two"
878
+ value="two"
879
+ selected
880
+ ></glide-core-dropdown-option>
881
+ </glide-core-dropdown>`);
882
+ component?.shadowRoot
883
+ ?.querySelector('[data-test="select-all"]')
884
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
885
+ component.focus();
886
+ await sendKeys({ press: 'Enter' });
887
+ const options = component.querySelectorAll('glide-core-dropdown-option');
888
+ expect(options[0].selected).to.be.false;
889
+ expect(options[1].selected).to.be.false;
890
+ });
704
891
  it('shows Select All', async () => {
705
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
892
+ const component = await fixture(html `<glide-core-dropdown
893
+ label="Label"
894
+ placeholder="Placeholder"
895
+ open
896
+ multiple
897
+ >
706
898
  <glide-core-dropdown-option
707
899
  label="One"
708
900
  value="one"
@@ -714,6 +906,8 @@ it('shows Select All', async () => {
714
906
  value="two"
715
907
  ></glide-core-dropdown-option>
716
908
  </glide-core-dropdown>`);
909
+ // Wait for it to open.
910
+ await aTimeout(0);
717
911
  component.selectAll = true;
718
912
  await elementUpdated(component);
719
913
  const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
@@ -786,6 +980,7 @@ it('sets Select All as indeterminate when not all options are selected', async (
786
980
  </glide-core-dropdown>`);
787
981
  const options = component.querySelectorAll('glide-core-dropdown-option');
788
982
  options[0].click();
983
+ await elementUpdated(component);
789
984
  const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
790
985
  expect(selectAll?.privateIndeterminate).to.be.true;
791
986
  });
@@ -878,6 +1073,8 @@ it('does not select an option on Enter when the option is not focused', async ()
878
1073
  value="two"
879
1074
  ></glide-core-dropdown-option>
880
1075
  </glide-core-dropdown>`);
1076
+ // Wait for it to open.
1077
+ await aTimeout(0);
881
1078
  const option = component.querySelector('glide-core-dropdown-option');
882
1079
  option?.focus();
883
1080
  await sendKeys({ down: 'Tab' });