@crowdstrike/glide-core 0.5.0 → 0.5.2

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 (208) hide show
  1. package/dist/accordion.js +1 -1
  2. package/dist/accordion.styles.js +4 -4
  3. package/dist/accordion.test.basics.js +109 -0
  4. package/dist/accordion.test.events.js +39 -0
  5. package/dist/button-group.button.js +1 -1
  6. package/dist/button-group.button.styles.js +4 -4
  7. package/dist/button-group.button.test.basics.js +169 -0
  8. package/dist/button-group.button.test.events.js +73 -0
  9. package/dist/button-group.js +1 -1
  10. package/dist/button-group.styles.js +3 -3
  11. package/dist/button-group.test.basics.js +268 -0
  12. package/dist/button-group.test.events.js +291 -0
  13. package/dist/button.js +1 -1
  14. package/dist/button.styles.js +4 -4
  15. package/dist/button.test.basics.js +196 -0
  16. package/dist/button.test.events.js +25 -0
  17. package/dist/button.test.form.js +49 -0
  18. package/dist/checkbox-group.js +1 -1
  19. package/dist/checkbox-group.styles.js +2 -2
  20. package/dist/checkbox-group.test.basics.js +119 -0
  21. package/dist/checkbox-group.test.events.js +110 -0
  22. package/dist/checkbox-group.test.focus.js +45 -0
  23. package/dist/checkbox-group.test.form.js +130 -0
  24. package/dist/checkbox-group.test.validity.js +75 -0
  25. package/dist/checkbox.js +1 -1
  26. package/dist/checkbox.styles.js +3 -3
  27. package/dist/checkbox.test.basics.js +89 -0
  28. package/dist/checkbox.test.events.js +87 -0
  29. package/dist/checkbox.test.focus.js +38 -0
  30. package/dist/checkbox.test.form.js +115 -0
  31. package/dist/checkbox.test.states.js +62 -0
  32. package/dist/checkbox.test.validity.js +51 -0
  33. package/dist/drawer.d.ts +2 -2
  34. package/dist/drawer.js +1 -15
  35. package/dist/drawer.styles.js +18 -3
  36. package/dist/drawer.test.accessibility.js +22 -0
  37. package/dist/drawer.test.basics.js +43 -0
  38. package/dist/drawer.test.closing.js +37 -0
  39. package/dist/drawer.test.events.js +52 -0
  40. package/dist/drawer.test.methods.js +34 -0
  41. package/dist/dropdown.d.ts +4 -2
  42. package/dist/dropdown.js +1 -1
  43. package/dist/dropdown.option.d.ts +1 -3
  44. package/dist/dropdown.option.js +1 -1
  45. package/dist/dropdown.option.styles.js +2 -2
  46. package/dist/dropdown.option.test.basics.js +59 -0
  47. package/dist/dropdown.option.test.basics.multiple.js +26 -0
  48. package/dist/dropdown.option.test.basics.single.js +20 -0
  49. package/dist/dropdown.option.test.events.js +27 -0
  50. package/dist/dropdown.option.test.focus.js +11 -0
  51. package/dist/dropdown.option.test.interactions.multiple.js +87 -0
  52. package/dist/dropdown.option.test.interactions.single.js +22 -0
  53. package/dist/dropdown.styles.js +28 -9
  54. package/dist/dropdown.test.basics.filterable.js +84 -0
  55. package/dist/dropdown.test.basics.js +233 -0
  56. package/dist/dropdown.test.basics.multiple.js +270 -0
  57. package/dist/dropdown.test.basics.single.js +79 -0
  58. package/dist/dropdown.test.events.js +268 -0
  59. package/dist/dropdown.test.events.multiple.js +130 -0
  60. package/dist/dropdown.test.focus.d.ts +1 -0
  61. package/dist/dropdown.test.focus.filterable.js +154 -0
  62. package/dist/dropdown.test.focus.js +18 -0
  63. package/dist/dropdown.test.focus.multiple.js +181 -0
  64. package/dist/dropdown.test.focus.single.js +53 -0
  65. package/dist/dropdown.test.form.js +140 -0
  66. package/dist/dropdown.test.form.multiple.js +149 -0
  67. package/dist/dropdown.test.form.single.js +128 -0
  68. package/dist/dropdown.test.interactions.filterable.js +385 -0
  69. package/dist/dropdown.test.interactions.js +446 -0
  70. package/dist/dropdown.test.interactions.multiple.js +908 -0
  71. package/dist/dropdown.test.interactions.single.js +466 -0
  72. package/dist/dropdown.test.validity.js +46 -0
  73. package/dist/icon-button.js +1 -1
  74. package/dist/icon-button.styles.js +3 -3
  75. package/dist/icon-button.test.basics.js +103 -0
  76. package/dist/icons/checked.js +1 -1
  77. package/dist/icons/magnifying-glass.js +1 -1
  78. package/dist/input.js +1 -1
  79. package/dist/input.styles.js +3 -3
  80. package/dist/input.test.basics.js +169 -0
  81. package/dist/input.test.events.js +97 -0
  82. package/dist/input.test.focus.js +54 -0
  83. package/dist/input.test.form.js +56 -0
  84. package/dist/input.test.validity.js +50 -0
  85. package/dist/label.js +1 -1
  86. package/dist/label.styles.js +3 -3
  87. package/dist/label.test.basics.js +129 -0
  88. package/dist/library/expect-argument-error.js +1 -1
  89. package/dist/library/ow.js +1 -1
  90. package/dist/library/ow.test.js +55 -0
  91. package/dist/menu.button.d.ts +1 -2
  92. package/dist/menu.button.js +1 -1
  93. package/dist/menu.button.styles.js +3 -3
  94. package/dist/menu.button.test.basics.js +42 -0
  95. package/dist/menu.d.ts +4 -0
  96. package/dist/menu.js +1 -1
  97. package/dist/menu.link.d.ts +1 -2
  98. package/dist/menu.link.js +1 -1
  99. package/dist/menu.link.styles.js +3 -3
  100. package/dist/menu.link.test.basics.js +46 -0
  101. package/dist/menu.styles.js +13 -6
  102. package/dist/menu.test.basics.js +161 -0
  103. package/dist/menu.test.focus.d.ts +0 -1
  104. package/dist/menu.test.focus.js +66 -0
  105. package/dist/menu.test.interactions.d.ts +0 -1
  106. package/dist/menu.test.interactions.js +522 -0
  107. package/dist/modal.icon-button.js +1 -1
  108. package/dist/modal.icon-button.styles.js +2 -2
  109. package/dist/modal.icon-button.test.basics.js +45 -0
  110. package/dist/modal.js +1 -15
  111. package/dist/modal.styles.js +4 -4
  112. package/dist/modal.tertiary-icon.js +1 -1
  113. package/dist/modal.tertiary-icon.test.basics.js +59 -0
  114. package/dist/modal.test.accessibility.js +48 -0
  115. package/dist/modal.test.basics.js +203 -0
  116. package/dist/modal.test.close.js +38 -0
  117. package/dist/modal.test.events.js +110 -0
  118. package/dist/modal.test.lock-scroll.js +76 -0
  119. package/dist/modal.test.methods.js +23 -0
  120. package/dist/modal.test.scrollbars.js +19 -0
  121. package/dist/radio-group.js +1 -1
  122. package/dist/radio-group.styles.js +2 -2
  123. package/dist/radio-group.test.basics.js +323 -0
  124. package/dist/radio-group.test.events.js +277 -0
  125. package/dist/radio-group.test.focus.js +75 -0
  126. package/dist/radio-group.test.form.js +104 -0
  127. package/dist/radio-group.test.validity.js +228 -0
  128. package/dist/radio.js +1 -1
  129. package/dist/radio.styles.js +4 -4
  130. package/dist/split-button.d.ts +24 -0
  131. package/dist/split-button.js +1 -0
  132. package/dist/split-button.stories.d.ts +17 -0
  133. package/dist/split-button.styles.d.ts +2 -0
  134. package/dist/split-button.styles.js +103 -0
  135. package/dist/split-button.test.basics.d.ts +1 -0
  136. package/dist/split-button.test.basics.js +84 -0
  137. package/dist/split-container.d.ts +30 -0
  138. package/dist/split-container.js +1 -0
  139. package/dist/split-container.styles.d.ts +2 -0
  140. package/dist/split-container.styles.js +132 -0
  141. package/dist/split-container.test.basics.d.ts +3 -0
  142. package/dist/split-container.test.basics.js +445 -0
  143. package/dist/split-container.test.interactions.d.ts +1 -0
  144. package/dist/split-container.test.interactions.js +20 -0
  145. package/dist/split-link.d.ts +25 -0
  146. package/dist/split-link.js +1 -0
  147. package/dist/split-link.test.basics.d.ts +1 -0
  148. package/dist/split-link.test.basics.js +92 -0
  149. package/dist/split-link.test.interactions.d.ts +1 -0
  150. package/dist/split-link.test.interactions.js +19 -0
  151. package/dist/status-indicator.js +1 -1
  152. package/dist/status-indicator.styles.js +2 -2
  153. package/dist/status-indicator.test.basics.js +102 -0
  154. package/dist/styles/focus-outline.js +1 -4
  155. package/dist/styles/visually-hidden.js +1 -11
  156. package/dist/tab.group.js +1 -1
  157. package/dist/tab.group.styles.js +2 -2
  158. package/dist/tab.group.test.basics.js +185 -0
  159. package/dist/tab.js +1 -1
  160. package/dist/tab.panel.js +1 -1
  161. package/dist/tab.panel.styles.js +3 -3
  162. package/dist/tab.styles.js +2 -2
  163. package/dist/tab.test.basics.js +71 -0
  164. package/dist/tag.js +1 -1
  165. package/dist/tag.styles.js +3 -3
  166. package/dist/tag.test.basics.js +118 -0
  167. package/dist/tag.test.events.js +16 -0
  168. package/dist/tag.test.focus.js +11 -0
  169. package/dist/textarea.js +2 -2
  170. package/dist/textarea.styles.js +3 -3
  171. package/dist/textarea.test.basics.js +140 -0
  172. package/dist/textarea.test.events.js +204 -0
  173. package/dist/textarea.test.form.js +70 -0
  174. package/dist/textarea.test.validity.js +83 -0
  175. package/dist/toasts.js +1 -1
  176. package/dist/toasts.styles.js +2 -2
  177. package/dist/toasts.test.basics.js +94 -0
  178. package/dist/toasts.toast.js +1 -1
  179. package/dist/toasts.toast.styles.js +5 -2
  180. package/dist/toasts.toast.test.basics.js +139 -0
  181. package/dist/toggle.js +1 -1
  182. package/dist/toggle.styles.js +3 -3
  183. package/dist/toggle.test.basics.js +64 -0
  184. package/dist/toggle.test.events.js +29 -0
  185. package/dist/toggle.test.focus.js +9 -0
  186. package/dist/toggle.test.states.js +35 -0
  187. package/dist/tooltip.js +1 -1
  188. package/dist/tooltip.styles.js +3 -3
  189. package/dist/tooltip.test.basics.js +64 -0
  190. package/dist/tooltip.test.interactions.js +78 -0
  191. package/dist/tree.item.icon-button.js +1 -1
  192. package/dist/tree.item.icon-button.styles.js +2 -2
  193. package/dist/tree.item.icon-button.test.basics.js +13 -0
  194. package/dist/tree.item.js +1 -1
  195. package/dist/tree.item.menu.js +1 -1
  196. package/dist/tree.item.menu.styles.js +2 -2
  197. package/dist/tree.item.menu.test.basics.js +34 -0
  198. package/dist/tree.item.styles.js +2 -2
  199. package/dist/tree.item.test.basics.js +102 -0
  200. package/dist/tree.js +1 -1
  201. package/dist/tree.styles.js +2 -2
  202. package/dist/tree.test.aria.js +86 -0
  203. package/dist/tree.test.basics.js +123 -0
  204. package/dist/tree.test.events.js +19 -0
  205. package/dist/tree.test.focus.js +261 -0
  206. package/package.json +20 -18
  207. /package/dist/{dropdown.option.test.focus.multiple.d.ts → dropdown.option.test.focus.d.ts} +0 -0
  208. /package/dist/{dropdown.option.test.focus.single.d.ts → dropdown.test.events.multiple.d.ts} +0 -0
@@ -0,0 +1,446 @@
1
+ import { assert, expect, fixture, html } from '@open-wc/testing';
2
+ import { sendKeys, sendMouse } from '@web/test-runner-commands';
3
+ import GlideCoreDropdown from './dropdown.js';
4
+ import GlideCoreDropdownOption from './dropdown.option.js';
5
+ GlideCoreDropdown.shadowRootOptions.mode = 'open';
6
+ GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
7
+ it('opens on ArrowUp', async () => {
8
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
9
+ <glide-core-dropdown-option
10
+ label="Label"
11
+ value="value"
12
+ ></glide-core-dropdown-option>
13
+ </glide-core-dropdown>`);
14
+ component.focus();
15
+ await sendKeys({ press: 'ArrowUp' });
16
+ const option = component.querySelector('glide-core-dropdown-option');
17
+ expect(component.open).to.be.true;
18
+ expect(option?.privateActive).to.be.true;
19
+ });
20
+ it('does not open on ArrowUp when `disabled`', async () => {
21
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
22
+ <glide-core-dropdown-option
23
+ label="Label"
24
+ value="value"
25
+ ></glide-core-dropdown-option>
26
+ </glide-core-dropdown>`);
27
+ component.focus();
28
+ await sendKeys({ press: 'ArrowUp' });
29
+ expect(component.open).to.be.false;
30
+ });
31
+ it('does not open on ArrowUp when `readonly`', async () => {
32
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
33
+ <glide-core-dropdown-option
34
+ label="Label"
35
+ value="value"
36
+ ></glide-core-dropdown-option>
37
+ </glide-core-dropdown>`);
38
+ component.focus();
39
+ await sendKeys({ press: 'ArrowUp' });
40
+ expect(component.open).to.be.false;
41
+ });
42
+ it('opens on ArrowDown', async () => {
43
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
44
+ <glide-core-dropdown-option
45
+ label="One"
46
+ value="one"
47
+ ></glide-core-dropdown-option>
48
+
49
+ <glide-core-dropdown-option
50
+ label="Two"
51
+ value="two"
52
+ ></glide-core-dropdown-option>
53
+ </glide-core-dropdown>`);
54
+ component.focus();
55
+ await sendKeys({ press: 'ArrowDown' });
56
+ const option = component.querySelector('glide-core-dropdown-option');
57
+ expect(component.open).to.be.true;
58
+ expect(option?.privateActive).to.be.true;
59
+ });
60
+ it('does not open on ArrowDown when `disabled`', async () => {
61
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
62
+ <glide-core-dropdown-option
63
+ label="One"
64
+ value="one"
65
+ ></glide-core-dropdown-option>
66
+
67
+ <glide-core-dropdown-option
68
+ label="Two"
69
+ value="two"
70
+ ></glide-core-dropdown-option>
71
+ </glide-core-dropdown>`);
72
+ component.focus();
73
+ await sendKeys({ press: 'ArrowDown' });
74
+ expect(component.open).to.be.false;
75
+ });
76
+ it('does not open on ArrowDown when `readonly`', async () => {
77
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
78
+ <glide-core-dropdown-option
79
+ label="One"
80
+ value="one"
81
+ ></glide-core-dropdown-option>
82
+
83
+ <glide-core-dropdown-option
84
+ label="Two"
85
+ value="two"
86
+ ></glide-core-dropdown-option>
87
+ </glide-core-dropdown>`);
88
+ component.focus();
89
+ await sendKeys({ press: 'ArrowDown' });
90
+ expect(component.open).to.be.false;
91
+ });
92
+ it('opens on Space', async () => {
93
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
94
+ <glide-core-dropdown-option
95
+ label="Label"
96
+ value="value"
97
+ ></glide-core-dropdown-option>
98
+ </glide-core-dropdown>`);
99
+ component.focus();
100
+ await sendKeys({ press: ' ' });
101
+ expect(component.open).to.be.true;
102
+ });
103
+ it('does not open on Space when `disabled`', async () => {
104
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
105
+ <glide-core-dropdown-option
106
+ label="Label"
107
+ value="value"
108
+ ></glide-core-dropdown-option>
109
+ </glide-core-dropdown>`);
110
+ component.focus();
111
+ await sendKeys({ press: ' ' });
112
+ expect(component.open).to.be.false;
113
+ });
114
+ it('does not open on Space when `readonly`', async () => {
115
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
116
+ <glide-core-dropdown-option
117
+ label="Label"
118
+ value="value"
119
+ ></glide-core-dropdown-option>
120
+ </glide-core-dropdown>`);
121
+ component.focus();
122
+ await sendKeys({ press: ' ' });
123
+ expect(component.open).to.be.false;
124
+ });
125
+ // See the `document` click listener comment in `dropdown.ts` for an explanation.
126
+ it('opens when opened programmatically via the click handler of another element', async () => {
127
+ const div = document.createElement('div');
128
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
129
+ <glide-core-dropdown-option
130
+ label="Label"
131
+ value="value"
132
+ ></glide-core-dropdown-option>
133
+ </glide-core-dropdown>`, { parentNode: div });
134
+ const button = document.createElement('button');
135
+ button.addEventListener('click', () => (component.open = true));
136
+ div.append(button);
137
+ button.click();
138
+ expect(component.open).to.be.true;
139
+ });
140
+ it('closes when something outside of it is clicked', async () => {
141
+ const component = await fixture(html `<glide-core-dropdown
142
+ label="Label"
143
+ placeholder="Placeholder"
144
+ open
145
+ multiple
146
+ >
147
+ <glide-core-dropdown-option
148
+ label="One"
149
+ value="one"
150
+ selected
151
+ ></glide-core-dropdown-option>
152
+
153
+ <glide-core-dropdown-option
154
+ label="Two"
155
+ value="two"
156
+ ></glide-core-dropdown-option>
157
+ </glide-core-dropdown>`);
158
+ document.body.click();
159
+ expect(component.open).to.be.false;
160
+ });
161
+ it('closes on Escape', async () => {
162
+ const component = await fixture(html `<glide-core-dropdown
163
+ label="Label"
164
+ placeholder="Placeholder"
165
+ open
166
+ multiple
167
+ >
168
+ <glide-core-dropdown-option
169
+ label="One"
170
+ value="one"
171
+ selected
172
+ ></glide-core-dropdown-option>
173
+
174
+ <glide-core-dropdown-option
175
+ label="Two"
176
+ value="two"
177
+ ></glide-core-dropdown-option>
178
+ </glide-core-dropdown>`);
179
+ component.focus();
180
+ await sendKeys({ press: 'Escape' });
181
+ expect(component.open).to.be.false;
182
+ });
183
+ it('activates an option on "mouseover"', async () => {
184
+ const component = await fixture(html `<glide-core-dropdown open>
185
+ <glide-core-dropdown-option
186
+ label="One"
187
+ value="one"
188
+ ></glide-core-dropdown-option>
189
+
190
+ <glide-core-dropdown-option
191
+ label="Two"
192
+ value="two"
193
+ ></glide-core-dropdown-option>
194
+ </glide-core-dropdown>`);
195
+ const options = component.querySelectorAll('glide-core-dropdown-option');
196
+ options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
197
+ expect(options[1]?.privateActive).to.be.true;
198
+ });
199
+ it('activates the next option on ArrowDown', async () => {
200
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
201
+ <glide-core-dropdown-option
202
+ label="One"
203
+ value="one"
204
+ ></glide-core-dropdown-option>
205
+
206
+ <glide-core-dropdown-option
207
+ label="Two"
208
+ value="two"
209
+ ></glide-core-dropdown-option>
210
+ </glide-core-dropdown>`);
211
+ const options = component.querySelectorAll('glide-core-dropdown-option');
212
+ options[0]?.focus();
213
+ await sendKeys({ press: 'ArrowDown' });
214
+ expect(options[0]?.privateActive).to.be.false;
215
+ expect(options[1]?.privateActive).to.be.true;
216
+ });
217
+ it('activates the previous option on ArrowUp', async () => {
218
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
219
+ <glide-core-dropdown-option
220
+ label="One"
221
+ value="one"
222
+ ></glide-core-dropdown-option>
223
+
224
+ <glide-core-dropdown-option
225
+ label="Two"
226
+ value="two"
227
+ ></glide-core-dropdown-option>
228
+ </glide-core-dropdown>`);
229
+ const options = component.querySelectorAll('glide-core-dropdown-option');
230
+ options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
231
+ options[1]?.focus();
232
+ expect(options[1]?.privateActive).to.be.true;
233
+ await sendKeys({ press: 'ArrowUp' });
234
+ expect(options[0]?.privateActive).to.be.true;
235
+ expect(options[1]?.privateActive).to.be.false;
236
+ });
237
+ it('activates the first option on Home', async () => {
238
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
239
+ <glide-core-dropdown-option
240
+ label="One"
241
+ value="one"
242
+ ></glide-core-dropdown-option>
243
+
244
+ <glide-core-dropdown-option
245
+ label="Two"
246
+ value="two"
247
+ ></glide-core-dropdown-option>
248
+ </glide-core-dropdown>`);
249
+ const options = component.querySelectorAll('glide-core-dropdown-option');
250
+ options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
251
+ expect(options[1].privateActive).to.be.true;
252
+ options[1].focus();
253
+ await sendKeys({ press: 'Home' });
254
+ expect(options[0]?.privateActive).to.be.true;
255
+ expect(options[1]?.privateActive).to.be.false;
256
+ });
257
+ it('activates the first option on PageUp', async () => {
258
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
259
+ <glide-core-dropdown-option
260
+ label="One"
261
+ value="one"
262
+ ></glide-core-dropdown-option>
263
+
264
+ <glide-core-dropdown-option
265
+ label="Two"
266
+ value="two"
267
+ ></glide-core-dropdown-option>
268
+ </glide-core-dropdown>`);
269
+ const options = component.querySelectorAll('glide-core-dropdown-option');
270
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
271
+ options[1].focus();
272
+ expect(options[1]?.privateActive).to.be.true;
273
+ await sendKeys({ press: 'PageUp' });
274
+ expect(options[0]?.privateActive).to.be.true;
275
+ expect(options[1]?.privateActive).to.be.false;
276
+ });
277
+ it('activates the first option on ArrowUp + Meta', async () => {
278
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
279
+ <glide-core-dropdown-option
280
+ label="One"
281
+ value="one"
282
+ ></glide-core-dropdown-option>
283
+
284
+ <glide-core-dropdown-option
285
+ label="Two"
286
+ value="two"
287
+ ></glide-core-dropdown-option>
288
+ </glide-core-dropdown>`);
289
+ const options = component.querySelectorAll('glide-core-dropdown-option');
290
+ options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
291
+ expect(options[1]?.privateActive).to.be.true;
292
+ options[1].focus();
293
+ await sendKeys({ down: 'Meta' });
294
+ await sendKeys({ press: 'ArrowUp' });
295
+ await sendKeys({ up: 'Meta' });
296
+ expect(options[0]?.privateActive).to.be.true;
297
+ expect(options[1]?.privateActive).to.be.false;
298
+ });
299
+ it('activates the last option on End', async () => {
300
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
301
+ <glide-core-dropdown-option
302
+ label="One"
303
+ value="one"
304
+ ></glide-core-dropdown-option>
305
+
306
+ <glide-core-dropdown-option
307
+ label="Two"
308
+ value="two"
309
+ ></glide-core-dropdown-option>
310
+ </glide-core-dropdown>`);
311
+ const options = component.querySelectorAll('glide-core-dropdown-option');
312
+ options[0]?.focus();
313
+ await sendKeys({ press: 'End' });
314
+ expect(options[0]?.privateActive).to.be.false;
315
+ expect(options[1]?.privateActive).to.be.true;
316
+ });
317
+ it('activates the last option on PageDown', async () => {
318
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
319
+ <glide-core-dropdown-option
320
+ label="One"
321
+ value="one"
322
+ ></glide-core-dropdown-option>
323
+
324
+ <glide-core-dropdown-option
325
+ label="Two"
326
+ value="two"
327
+ ></glide-core-dropdown-option>
328
+ </glide-core-dropdown>`);
329
+ const options = component.querySelectorAll('glide-core-dropdown-option');
330
+ options[0]?.focus();
331
+ await sendKeys({ press: 'PageDown' });
332
+ expect(options[0]?.privateActive).to.be.false;
333
+ expect(options[1]?.privateActive).to.be.true;
334
+ });
335
+ it('activates the last option on Meta + ArrowDown', async () => {
336
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
337
+ <glide-core-dropdown-option
338
+ label="One"
339
+ value="one"
340
+ ></glide-core-dropdown-option>
341
+
342
+ <glide-core-dropdown-option
343
+ label="Two"
344
+ value="two"
345
+ ></glide-core-dropdown-option>
346
+ </glide-core-dropdown>`);
347
+ const options = component.querySelectorAll('glide-core-dropdown-option');
348
+ options[0]?.focus();
349
+ await sendKeys({ down: 'Meta' });
350
+ await sendKeys({ press: 'ArrowDown' });
351
+ await sendKeys({ up: 'Meta' });
352
+ expect(options[0]?.privateActive).to.be.false;
353
+ expect(options[1]?.privateActive).to.be.true;
354
+ });
355
+ it('does not wrap on ArrowUp', async () => {
356
+ const component = await fixture(html `<glide-core-dropdown open>
357
+ <glide-core-dropdown-option
358
+ label="One"
359
+ value="one"
360
+ ></glide-core-dropdown-option>
361
+
362
+ <glide-core-dropdown-option
363
+ label="Two"
364
+ value="two"
365
+ ></glide-core-dropdown-option>
366
+ </glide-core-dropdown>`);
367
+ const options = component.querySelectorAll('glide-core-dropdown-option');
368
+ options[0]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
369
+ options[0]?.focus();
370
+ await sendKeys({ press: 'ArrowUp' });
371
+ expect(options[0]?.privateActive).to.be.true;
372
+ expect(options[1]?.privateActive).to.be.false;
373
+ });
374
+ it('does not wrap on ArrowDown', async () => {
375
+ const component = await fixture(html `<glide-core-dropdown open>
376
+ <glide-core-dropdown-option
377
+ label="One"
378
+ value="one"
379
+ ></glide-core-dropdown-option>
380
+
381
+ <glide-core-dropdown-option
382
+ label="Two"
383
+ value="two"
384
+ ></glide-core-dropdown-option>
385
+ </glide-core-dropdown>`);
386
+ const options = component.querySelectorAll('glide-core-dropdown-option');
387
+ options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
388
+ expect(options[1].privateActive).to.be.true;
389
+ options[1]?.focus();
390
+ await sendKeys({ press: 'ArrowDown' });
391
+ expect(options[0]?.privateActive).to.be.false;
392
+ expect(options[1]?.privateActive).to.be.true;
393
+ });
394
+ it('updates `privateSize` on every option when `size` is changed programmatically', async () => {
395
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
396
+ <glide-core-dropdown-option
397
+ label="One"
398
+ value="one"
399
+ ></glide-core-dropdown-option>
400
+
401
+ <glide-core-dropdown-option
402
+ label="Two"
403
+ value="two"
404
+ ></glide-core-dropdown-option>
405
+ </glide-core-dropdown>`);
406
+ component.size = 'small';
407
+ const options = component.querySelectorAll('glide-core-dropdown-option');
408
+ expect(options[0].privateSize).to.equal('small');
409
+ expect(options[1].privateSize).to.equal('small');
410
+ });
411
+ it('opens when something other than the button is clicked', async () => {
412
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
413
+ <glide-core-dropdown-option
414
+ label="Label"
415
+ value="value"
416
+ ></glide-core-dropdown-option>
417
+ </glide-core-dropdown>`);
418
+ const internalLabel = component.shadowRoot?.querySelector('[data-test="internal-label"]');
419
+ assert(internalLabel);
420
+ const { x, y } = internalLabel.getBoundingClientRect();
421
+ // A simple `option.click()` won't do because we need a "mousedown" so that
422
+ // `#onDropdownMousedown` gets covered.
423
+ await sendMouse({
424
+ type: 'click',
425
+ position: [Math.ceil(x), Math.ceil(y)],
426
+ });
427
+ expect(component.open).to.be.true;
428
+ });
429
+ it('remains open when something other than the button is clicked', async () => {
430
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
431
+ <glide-core-dropdown-option
432
+ label="Label"
433
+ value="value"
434
+ ></glide-core-dropdown-option>
435
+ </glide-core-dropdown>`);
436
+ const internalLabel = component.shadowRoot?.querySelector('[data-test="internal-label"]');
437
+ assert(internalLabel);
438
+ const { x, y } = internalLabel.getBoundingClientRect();
439
+ // A simple `option.click()` won't do because we need a "mousedown" so that
440
+ // `#onDropdownMousedown` gets covered.
441
+ await sendMouse({
442
+ type: 'click',
443
+ position: [Math.ceil(x), Math.ceil(y)],
444
+ });
445
+ expect(component.open).to.be.true;
446
+ });