@crowdstrike/glide-core 0.8.0 → 0.9.1

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 (181) hide show
  1. package/dist/accordion.d.ts +7 -3
  2. package/dist/button-group.button.d.ts +12 -16
  3. package/dist/button-group.button.js +1 -1
  4. package/dist/button-group.button.styles.js +76 -52
  5. package/dist/button-group.button.test.basics.d.ts +1 -1
  6. package/dist/button-group.button.test.basics.js +83 -147
  7. package/dist/button-group.button.test.events.js +8 -67
  8. package/dist/button-group.button.test.focus.js +13 -0
  9. package/dist/button-group.button.test.interactions.d.ts +1 -0
  10. package/dist/button-group.button.test.interactions.js +42 -0
  11. package/dist/button-group.d.ts +10 -10
  12. package/dist/button-group.js +1 -1
  13. package/dist/button-group.stories.d.ts +1 -5
  14. package/dist/button-group.styles.js +18 -6
  15. package/dist/button-group.test.basics.js +113 -234
  16. package/dist/button-group.test.events.js +210 -263
  17. package/dist/button-group.test.focus.d.ts +1 -0
  18. package/dist/button-group.test.focus.js +39 -0
  19. package/dist/button-group.test.interactions.d.ts +1 -0
  20. package/dist/button-group.test.interactions.js +91 -0
  21. package/dist/button.d.ts +3 -0
  22. package/dist/button.test.basics.js +1 -1
  23. package/dist/checkbox-group.d.ts +6 -2
  24. package/dist/checkbox-group.js +1 -1
  25. package/dist/checkbox-group.stories.d.ts +1 -1
  26. package/dist/checkbox-group.styles.js +1 -1
  27. package/dist/checkbox-group.test.basics.js +1 -1
  28. package/dist/checkbox-group.test.events.js +4 -4
  29. package/dist/checkbox-group.test.focus.js +4 -3
  30. package/dist/checkbox.d.ts +12 -5
  31. package/dist/checkbox.js +1 -1
  32. package/dist/checkbox.stories.d.ts +1 -1
  33. package/dist/checkbox.styles.js +10 -0
  34. package/dist/checkbox.test.basics.js +15 -6
  35. package/dist/checkbox.test.events.js +16 -8
  36. package/dist/checkbox.test.focus.js +3 -3
  37. package/dist/checkbox.test.form.js +1 -0
  38. package/dist/checkbox.test.interactions.js +123 -0
  39. package/dist/drawer.d.ts +5 -5
  40. package/dist/drawer.js +1 -1
  41. package/dist/drawer.stories.d.ts +0 -1
  42. package/dist/dropdown.d.ts +9 -6
  43. package/dist/dropdown.js +1 -1
  44. package/dist/dropdown.option.d.ts +6 -2
  45. package/dist/dropdown.option.js +1 -1
  46. package/dist/dropdown.option.styles.js +13 -0
  47. package/dist/dropdown.option.test.basics.js +6 -3
  48. package/dist/dropdown.option.test.events.js +1 -1
  49. package/dist/dropdown.option.test.focus.js +1 -1
  50. package/dist/dropdown.option.test.interactions.multiple.js +1 -54
  51. package/dist/dropdown.option.test.interactions.single.js +51 -9
  52. package/dist/dropdown.styles.js +20 -19
  53. package/dist/dropdown.test.basics.js +143 -2
  54. package/dist/dropdown.test.basics.multiple.js +5 -2
  55. package/dist/dropdown.test.events.filterable.js +74 -0
  56. package/dist/dropdown.test.events.js +49 -160
  57. package/dist/dropdown.test.events.multiple.js +265 -8
  58. package/dist/dropdown.test.events.single.js +199 -2
  59. package/dist/dropdown.test.focus.filterable.js +9 -5
  60. package/dist/dropdown.test.focus.js +1 -1
  61. package/dist/dropdown.test.focus.multiple.js +1 -1
  62. package/dist/dropdown.test.focus.single.js +1 -1
  63. package/dist/dropdown.test.interactions.filterable.js +68 -11
  64. package/dist/dropdown.test.interactions.js +94 -5
  65. package/dist/dropdown.test.interactions.multiple.js +202 -5
  66. package/dist/dropdown.test.interactions.single.js +68 -6
  67. package/dist/form-controls-layout.test.basics.js +1 -1
  68. package/dist/icon-button.d.ts +2 -0
  69. package/dist/icon-button.test.basics.js +1 -1
  70. package/dist/icons/checked.d.ts +1 -1
  71. package/dist/icons/checked.js +1 -1
  72. package/dist/icons/magnifying-glass.js +1 -1
  73. package/dist/input.d.ts +4 -9
  74. package/dist/input.js +1 -1
  75. package/dist/input.styles.js +7 -2
  76. package/dist/input.test.basics.js +19 -5
  77. package/dist/input.test.events.js +4 -4
  78. package/dist/input.test.focus.js +4 -4
  79. package/dist/input.test.translations.d.ts +1 -0
  80. package/dist/input.test.translations.js +38 -0
  81. package/dist/input.test.validity.js +133 -4
  82. package/dist/label.d.ts +1 -1
  83. package/dist/label.js +1 -1
  84. package/dist/label.styles.js +25 -13
  85. package/dist/label.test.basics.js +26 -24
  86. package/dist/library/expect-argument-error.js +1 -1
  87. package/dist/library/localize.d.ts +4 -1
  88. package/dist/menu.d.ts +3 -5
  89. package/dist/menu.js +1 -1
  90. package/dist/menu.options.test.basics.js +2 -2
  91. package/dist/menu.styles.js +1 -15
  92. package/dist/menu.test.basics.d.ts +1 -2
  93. package/dist/menu.test.basics.js +22 -6
  94. package/dist/menu.test.events.js +197 -7
  95. package/dist/menu.test.focus.d.ts +1 -0
  96. package/dist/menu.test.focus.js +13 -6
  97. package/dist/menu.test.interactions.js +214 -58
  98. package/dist/modal.icon-button.test.basics.js +1 -1
  99. package/dist/modal.js +1 -1
  100. package/dist/modal.stories.d.ts +1 -0
  101. package/dist/modal.styles.js +18 -13
  102. package/dist/modal.tertiary-icon.d.ts +0 -1
  103. package/dist/modal.tertiary-icon.js +1 -1
  104. package/dist/modal.tertiary-icon.test.basics.js +3 -3
  105. package/dist/modal.test.basics.js +1 -1
  106. package/dist/modal.test.events.js +10 -10
  107. package/dist/radio-group.d.ts +4 -3
  108. package/dist/radio-group.js +1 -1
  109. package/dist/radio-group.stories.d.ts +1 -1
  110. package/dist/radio-group.styles.js +1 -1
  111. package/dist/radio-group.test.focus.js +3 -3
  112. package/dist/radio.d.ts +2 -2
  113. package/dist/radio.js +1 -1
  114. package/dist/radio.styles.js +33 -0
  115. package/dist/split-container.d.ts +1 -1
  116. package/dist/split-container.test.basics.js +4 -0
  117. package/dist/split-link.test.interactions.js +1 -1
  118. package/dist/status-indicator.d.ts +1 -1
  119. package/dist/styles/variables.css +1 -1
  120. package/dist/tab.d.ts +1 -1
  121. package/dist/tab.group.js +1 -1
  122. package/dist/tab.group.test.basics.js +1 -1
  123. package/dist/tab.group.test.interactions.js +198 -2
  124. package/dist/tab.js +1 -1
  125. package/dist/tab.panel.d.ts +1 -0
  126. package/dist/tab.panel.js +1 -1
  127. package/dist/tab.panel.styles.js +11 -1
  128. package/dist/tabs.stories.d.ts +1 -0
  129. package/dist/tag.d.ts +3 -6
  130. package/dist/tag.test.basics.js +2 -2
  131. package/dist/textarea.d.ts +4 -4
  132. package/dist/textarea.js +2 -2
  133. package/dist/textarea.stories.d.ts +3 -4
  134. package/dist/textarea.styles.js +14 -3
  135. package/dist/textarea.test.basics.js +80 -44
  136. package/dist/textarea.test.events.js +56 -41
  137. package/dist/textarea.test.translations.d.ts +1 -0
  138. package/dist/textarea.test.translations.js +34 -0
  139. package/dist/textarea.test.validity.js +104 -20
  140. package/dist/toasts.js +1 -1
  141. package/dist/toasts.styles.js +8 -1
  142. package/dist/toasts.test.basics.js +20 -0
  143. package/dist/toggle.d.ts +3 -3
  144. package/dist/toggle.js +1 -1
  145. package/dist/toggle.stories.d.ts +1 -1
  146. package/dist/toggle.test.focus.js +1 -1
  147. package/dist/toggle.test.interactions.d.ts +1 -0
  148. package/dist/{toggle.test.states.js → toggle.test.interactions.js} +26 -0
  149. package/dist/tooltip.d.ts +9 -7
  150. package/dist/tooltip.js +1 -1
  151. package/dist/tooltip.styles.js +90 -25
  152. package/dist/tooltip.test.basics.js +38 -3
  153. package/dist/tooltip.test.interactions.js +136 -34
  154. package/dist/translations/en.js +1 -1
  155. package/dist/translations/fr.js +1 -1
  156. package/dist/translations/ja.js +1 -1
  157. package/dist/tree.d.ts +1 -2
  158. package/dist/tree.item.d.ts +1 -5
  159. package/dist/tree.item.icon-button.d.ts +1 -0
  160. package/dist/tree.item.icon-button.js +1 -1
  161. package/dist/tree.item.icon-button.test.basics.js +9 -0
  162. package/dist/tree.item.js +1 -1
  163. package/dist/tree.item.menu.d.ts +2 -1
  164. package/dist/tree.item.menu.js +1 -1
  165. package/dist/tree.item.menu.test.basics.js +15 -0
  166. package/dist/tree.item.styles.js +2 -0
  167. package/dist/tree.item.test.basics.d.ts +2 -1
  168. package/dist/tree.item.test.basics.js +46 -4
  169. package/dist/tree.js +1 -1
  170. package/dist/tree.test.basics.js +1 -1
  171. package/dist/tree.test.focus.js +91 -4
  172. package/package.json +3 -4
  173. package/dist/checkbox.test.states.js +0 -63
  174. package/dist/drawer.test.floating-components.d.ts +0 -1
  175. package/dist/drawer.test.floating-components.js +0 -52
  176. package/dist/library/set-containing-block.d.ts +0 -15
  177. package/dist/library/set-containing-block.js +0 -1
  178. package/dist/modal.test.floating-components.js +0 -63
  179. /package/dist/{checkbox.test.states.d.ts → button-group.button.test.focus.d.ts} +0 -0
  180. /package/dist/{modal.test.floating-components.d.ts → checkbox.test.interactions.d.ts} +0 -0
  181. /package/dist/{toggle.test.states.d.ts → dropdown.test.events.filterable.d.ts} +0 -0
@@ -8,7 +8,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  import './menu.link.js';
9
9
  import './menu.options.js';
10
10
  import { LitElement } from 'lit';
11
- import { assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
11
+ import { aTimeout, assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
12
12
  import { customElement } from 'lit/decorators.js';
13
13
  import { sendKeys } from '@web/test-runner-commands';
14
14
  import GlideCoreMenu from './menu.js';
@@ -41,24 +41,114 @@ it('opens on click', async () => {
41
41
  </glide-core-menu-options>
42
42
  </glide-core-menu>`);
43
43
  component.querySelector('button')?.click();
44
- await elementUpdated(component);
44
+ // Wait for Floating UI.
45
+ await aTimeout(0);
45
46
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
46
47
  const target = component.querySelector('button');
48
+ const options = component.querySelector('glide-core-menu-options');
49
+ const link = component.querySelector('glide-core-menu-link');
50
+ expect(component.open).to.be.true;
51
+ expect(defaultSlot?.checkVisibility()).to.be.true;
52
+ expect(target?.ariaExpanded).to.equal('true');
53
+ expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
54
+ });
55
+ it('opens when `open` is set programmatically', async () => {
56
+ const component = await fixture(html `<glide-core-menu>
57
+ <button slot="target">Target</button>
58
+
59
+ <glide-core-menu-options>
60
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
61
+ </glide-core-menu-options>
62
+ </glide-core-menu>`);
63
+ component.open = true;
64
+ // Wait for Floating UI.
65
+ await aTimeout(0);
66
+ const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
67
+ const target = component.querySelector('button');
68
+ const options = component.querySelector('glide-core-menu-options');
69
+ const link = component.querySelector('glide-core-menu-link');
70
+ expect(component.open).to.be.true;
71
+ expect(defaultSlot?.checkVisibility()).to.be.true;
72
+ expect(target?.ariaExpanded).to.equal('true');
73
+ expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
74
+ });
75
+ it('opens when `disabled` is set programmatically on its target', async () => {
76
+ const component = await fixture(html `<glide-core-menu>
77
+ <button slot="target" disabled>Target</button>
78
+
79
+ <glide-core-menu-options>
80
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
81
+ </glide-core-menu-options>
82
+ </glide-core-menu>`);
83
+ const target = component.querySelector('button');
84
+ assert(target);
85
+ target.disabled = false;
86
+ target.click();
87
+ // Wait for Floating UI.
88
+ await aTimeout(0);
89
+ const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
90
+ const options = component.querySelector('glide-core-menu-options');
91
+ const link = component.querySelector('glide-core-menu-link');
92
+ expect(component.open).to.be.true;
93
+ expect(defaultSlot?.checkVisibility()).to.be.true;
94
+ expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
95
+ expect(target?.ariaExpanded).to.equal('true');
96
+ });
97
+ it('opens when `aria-disabled` is set programmatically on its target', async () => {
98
+ const component = await fixture(html `<glide-core-menu>
99
+ <button slot="target" aria-disabled="true">Target</button>
100
+
101
+ <glide-core-menu-options>
102
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
103
+ </glide-core-menu-options>
104
+ </glide-core-menu>`);
105
+ const target = component.querySelector('button');
106
+ assert(target);
107
+ target.ariaDisabled = 'false';
108
+ target.click();
109
+ // Wait for Floating UI.
110
+ await aTimeout(0);
111
+ const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
112
+ const options = component.querySelector('glide-core-menu-options');
113
+ const link = component.querySelector('glide-core-menu-link');
47
114
  expect(component.open).to.be.true;
48
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
115
+ expect(defaultSlot?.checkVisibility()).to.be.true;
116
+ expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
49
117
  expect(target?.ariaExpanded).to.equal('true');
50
118
  });
119
+ it('closes when `open` is set programmatically', async () => {
120
+ const component = await fixture(html `<glide-core-menu open>
121
+ <button slot="target">Target</button>
122
+
123
+ <glide-core-menu-options>
124
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
125
+ </glide-core-menu-options>
126
+ </glide-core-menu>`);
127
+ // Wait for Floating UI.
128
+ await aTimeout(0);
129
+ component.open = false;
130
+ await elementUpdated(component);
131
+ const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
132
+ const target = component.querySelector('button');
133
+ const options = component.querySelector('glide-core-menu-options');
134
+ expect(component.open).to.be.false;
135
+ expect(defaultSlot?.checkVisibility()).to.be.false;
136
+ expect(target?.ariaExpanded).to.equal('false');
137
+ expect(options?.getAttribute('aria-activedescendant')).to.equal('');
138
+ });
51
139
  it('does not open on click when there are no options', async () => {
52
140
  const component = await fixture(html `<glide-core-menu>
53
141
  <button slot="target">Target</button>
54
142
  <glide-core-menu-options> </glide-core-menu-options>
55
143
  </glide-core-menu>`);
56
144
  component.querySelector('button')?.click();
145
+ // Wait for Floating UI.
146
+ await aTimeout(0);
57
147
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
58
148
  const options = component.querySelector('glide-core-menu-options');
59
149
  const target = component.querySelector('button');
60
150
  expect(component.open).to.be.false;
61
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.not.ok;
151
+ expect(defaultSlot?.checkVisibility()).to.be.false;
62
152
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
63
153
  expect(target?.ariaExpanded).to.equal('false');
64
154
  });
@@ -71,11 +161,13 @@ it('does not open when `disabled` is set on its target', async () => {
71
161
  </glide-core-menu-options>
72
162
  </glide-core-menu>`);
73
163
  component.querySelector('button')?.click();
164
+ // Wait for Floating UI.
165
+ await aTimeout(0);
74
166
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
75
167
  const options = component.querySelector('glide-core-menu-options');
76
168
  const target = component.querySelector('button');
77
169
  expect(component.open).to.be.false;
78
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
170
+ expect(defaultSlot?.checkVisibility()).to.be.false;
79
171
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
80
172
  expect(target?.ariaExpanded).to.equal('false');
81
173
  });
@@ -89,13 +181,14 @@ it('does not open when `disabled` is set programmatically on its target', async
89
181
  </glide-core-menu>`);
90
182
  const target = component.querySelector('button');
91
183
  assert(target);
92
- target.click();
93
184
  target.disabled = true;
94
- await elementUpdated(component);
185
+ target.click();
186
+ // Wait for Floating UI.
187
+ await aTimeout(0);
95
188
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
96
189
  const options = component.querySelector('glide-core-menu-options');
97
190
  expect(component.open).to.be.false;
98
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
191
+ expect(defaultSlot?.checkVisibility()).to.be.false;
99
192
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
100
193
  expect(target?.ariaExpanded).to.equal('false');
101
194
  });
@@ -109,10 +202,12 @@ it('does not open when `aria-disabled` is set on its target', async () => {
109
202
  </glide-core-menu>`);
110
203
  const target = component.querySelector('button');
111
204
  target?.click();
205
+ // Wait for Floating UI.
206
+ await aTimeout(0);
112
207
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
113
208
  const options = component.querySelector('glide-core-menu-options');
114
209
  expect(component.open).to.be.false;
115
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
210
+ expect(defaultSlot?.checkVisibility()).to.be.false;
116
211
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
117
212
  expect(target?.ariaExpanded).to.equal('false');
118
213
  });
@@ -126,14 +221,12 @@ it('does not open when `aria-disabled` is set programmatically on its target', a
126
221
  </glide-core-menu>`);
127
222
  const button = component.querySelector('button');
128
223
  assert(button);
129
- button?.click();
130
224
  button.ariaDisabled = 'true';
131
- await elementUpdated(component);
225
+ button?.click();
132
226
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
133
227
  const options = component.querySelector('glide-core-menu-options');
134
228
  const target = component.querySelector('button');
135
- expect(component.open).to.be.false;
136
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
229
+ expect(defaultSlot?.checkVisibility()).to.be.false;
137
230
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
138
231
  expect(target?.ariaExpanded).to.equal('false');
139
232
  });
@@ -152,7 +245,7 @@ it('opens on Enter', async () => {
152
245
  const target = component.querySelector('button');
153
246
  const link = component.querySelector('glide-core-menu-link');
154
247
  expect(component.open).to.be.true;
155
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
248
+ expect(defaultSlot?.checkVisibility()).to.be.true;
156
249
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
157
250
  expect(target?.ariaExpanded).to.equal('true');
158
251
  });
@@ -171,7 +264,7 @@ it('opens on ArrowUp', async () => {
171
264
  const target = component.querySelector('button');
172
265
  const link = component.querySelector('glide-core-menu-link');
173
266
  expect(component.open).to.be.true;
174
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
267
+ expect(defaultSlot?.checkVisibility()).to.be.true;
175
268
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
176
269
  expect(target?.ariaExpanded).to.equal('true');
177
270
  });
@@ -190,7 +283,7 @@ it('opens on ArrowDown', async () => {
190
283
  const target = component.querySelector('button');
191
284
  const link = component.querySelector('glide-core-menu-link');
192
285
  expect(component.open).to.be.true;
193
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
286
+ expect(defaultSlot?.checkVisibility()).to.be.true;
194
287
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
195
288
  expect(target?.ariaExpanded).to.equal('true');
196
289
  });
@@ -209,7 +302,7 @@ it('opens on Space', async () => {
209
302
  const target = component.querySelector('button');
210
303
  const link = component.querySelector('glide-core-menu-link');
211
304
  expect(component.open).to.be.true;
212
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
305
+ expect(defaultSlot?.checkVisibility()).to.be.true;
213
306
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
214
307
  expect(target?.ariaExpanded).to.equal('true');
215
308
  });
@@ -224,7 +317,7 @@ it('does not open on Space when there are no options', async () => {
224
317
  const options = component.querySelector('glide-core-menu-options');
225
318
  const target = component.querySelector('button');
226
319
  expect(component.open).to.be.false;
227
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.not.ok;
320
+ expect(defaultSlot?.checkVisibility()).to.be.false;
228
321
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
229
322
  expect(target?.ariaExpanded).to.equal('false');
230
323
  });
@@ -237,12 +330,13 @@ it('opens when opened programmatically', async () => {
237
330
  </glide-core-menu-options>
238
331
  </glide-core-menu>`);
239
332
  component.open = true;
240
- await elementUpdated(component);
333
+ // Wait for Floating UI.
334
+ await aTimeout(0);
241
335
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
242
336
  const options = component.querySelector('glide-core-menu-options');
243
337
  const target = component.querySelector('button');
244
338
  const link = component.querySelector('glide-core-menu-link');
245
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
339
+ expect(defaultSlot?.checkVisibility()).to.be.true;
246
340
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
247
341
  expect(target?.ariaExpanded).to.equal('true');
248
342
  });
@@ -260,13 +354,14 @@ it('opens when opened programmatically via the click handler of another element'
260
354
  anotherElement.addEventListener('click', () => (component.open = true));
261
355
  div.append(anotherElement);
262
356
  anotherElement.click();
263
- await elementUpdated(component);
357
+ // Wait for Floating UI.
358
+ await aTimeout(0);
264
359
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
265
360
  const options = component.querySelector('glide-core-menu-options');
266
361
  const target = component.querySelector('button');
267
362
  const link = component.querySelector('glide-core-menu-link');
268
363
  expect(component.open).to.be.true;
269
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
364
+ expect(defaultSlot?.checkVisibility()).to.be.true;
270
365
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
271
366
  expect(target?.ariaExpanded).to.equal('true');
272
367
  });
@@ -291,12 +386,11 @@ it('closes when clicked', async () => {
291
386
  </glide-core-menu-options>
292
387
  </glide-core-menu>`);
293
388
  component.querySelector('button')?.click();
294
- await elementUpdated(component);
295
389
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
296
390
  const options = component.querySelector('glide-core-menu-options');
297
391
  const target = component.querySelector('button');
298
392
  expect(component.open).to.be.false;
299
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
393
+ expect(defaultSlot?.checkVisibility()).to.be.false;
300
394
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
301
395
  expect(target?.ariaExpanded).to.equal('false');
302
396
  });
@@ -314,11 +408,11 @@ it('closes when something outside of it is clicked', async () => {
314
408
  const options = component.querySelector('glide-core-menu-options');
315
409
  const target = component.querySelector('button');
316
410
  expect(component.open).to.be.false;
317
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
411
+ expect(defaultSlot?.checkVisibility()).to.be.false;
318
412
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
319
413
  expect(target?.ariaExpanded).to.equal('false');
320
414
  });
321
- it('closes on Escape when the button has focus', async () => {
415
+ it('closes on Escape', async () => {
322
416
  const component = await fixture(html `<glide-core-menu open>
323
417
  <button slot="target">Target</button>
324
418
 
@@ -326,13 +420,15 @@ it('closes on Escape when the button has focus', async () => {
326
420
  <glide-core-menu-link label="Link"></glide-core-menu-link>
327
421
  </glide-core-menu-options>
328
422
  </glide-core-menu>`);
329
- component.querySelector('button')?.click();
423
+ // Wait for it to open
424
+ await aTimeout(0);
425
+ component.focus();
330
426
  await sendKeys({ press: 'Escape' });
331
427
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
332
428
  const options = component.querySelector('glide-core-menu-options');
333
429
  const target = component.querySelector('button');
334
430
  expect(component.open).to.be.false;
335
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
431
+ expect(defaultSlot?.checkVisibility()).to.be.false;
336
432
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
337
433
  expect(target?.ariaExpanded).to.equal('false');
338
434
  });
@@ -345,12 +441,11 @@ it('closes when an option is selected via click', async () => {
345
441
  </glide-core-menu-options>
346
442
  </glide-core-menu>`);
347
443
  component.querySelector('glide-core-menu-link')?.click();
348
- await elementUpdated(component);
349
444
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
350
445
  const options = component.querySelector('glide-core-menu-options');
351
446
  const target = component.querySelector('button');
352
447
  expect(component.open).to.be.false;
353
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
448
+ expect(defaultSlot?.checkVisibility()).to.be.false;
354
449
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
355
450
  expect(target?.ariaExpanded).to.equal('false');
356
451
  });
@@ -367,12 +462,11 @@ it('closes when an option is selected via Enter', async () => {
367
462
  .querySelector('glide-core-menu-link')
368
463
  ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
369
464
  await sendKeys({ press: 'Enter' });
370
- await elementUpdated(component);
371
465
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
372
466
  const options = component.querySelector('glide-core-menu-options');
373
467
  const target = component.querySelector('button');
374
468
  expect(component.open).to.be.false;
375
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
469
+ expect(defaultSlot?.checkVisibility()).to.be.false;
376
470
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
377
471
  expect(target?.ariaExpanded).to.equal('false');
378
472
  });
@@ -390,13 +484,13 @@ it('closes when an option is selected via Space', async () => {
390
484
  const options = component.querySelector('glide-core-menu-options');
391
485
  const target = component.querySelector('button');
392
486
  expect(component.open).to.be.false;
393
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
487
+ expect(defaultSlot?.checkVisibility()).to.be.false;
394
488
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
395
489
  expect(target?.ariaExpanded).to.equal('false');
396
490
  });
397
491
  it('activates the first menu link by default', async () => {
398
492
  const component = await fixture(html `
399
- <glide-core-menu>
493
+ <glide-core-menu open>
400
494
  <button slot="target">Target</button>
401
495
 
402
496
  <glide-core-menu-options>
@@ -405,15 +499,15 @@ it('activates the first menu link by default', async () => {
405
499
  </glide-core-menu-options>
406
500
  </glide-core-menu>
407
501
  `);
408
- component.querySelector('button')?.click();
409
- await elementUpdated(component);
502
+ // Wait for Floating UI.
503
+ await aTimeout(0);
410
504
  const links = component.querySelectorAll('glide-core-menu-link');
411
505
  const options = component.querySelector('glide-core-menu-options');
412
506
  expect(links[0].privateActive).to.be.true;
413
507
  expect(links[1].privateActive).to.be.false;
414
508
  expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0]?.id);
415
509
  });
416
- it('activates the first menu button by default', async () => {
510
+ it('activates the first menu button by default when opened via click', async () => {
417
511
  const component = await fixture(html `
418
512
  <glide-core-menu>
419
513
  <button slot="target">Target</button>
@@ -425,7 +519,8 @@ it('activates the first menu button by default', async () => {
425
519
  </glide-core-menu>
426
520
  `);
427
521
  component.querySelector('button')?.click();
428
- await elementUpdated(component);
522
+ // Wait for Floating UI.
523
+ await aTimeout(0);
429
524
  const buttons = component.querySelectorAll('glide-core-menu-button');
430
525
  const options = component.querySelector('glide-core-menu-options');
431
526
  expect(buttons[0].privateActive).to.be.true;
@@ -443,6 +538,8 @@ it('activates a menu link on "mouseover"', async () => {
443
538
  </glide-core-menu-options>
444
539
  </glide-core-menu>
445
540
  `);
541
+ // Wait for Floating UI.
542
+ await aTimeout(0);
446
543
  const links = component.querySelectorAll('glide-core-menu-link');
447
544
  const options = component.querySelector('glide-core-menu-options');
448
545
  links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -458,6 +555,8 @@ it('activates a menu link on "mouseover" when the link is in a nested slot', asy
458
555
  <glide-core-menu-link label="Two"></glide-core-menu-link>
459
556
  </glide-core-nested-slot>
460
557
  `);
558
+ // Wait for Floating UI.
559
+ await aTimeout(0);
461
560
  const links = component.querySelectorAll('glide-core-menu-link');
462
561
  const options = component.shadowRoot?.querySelector('glide-core-menu-options');
463
562
  links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -477,6 +576,8 @@ it('activates a menu button on "mouseover"', async () => {
477
576
  </glide-core-menu-options>
478
577
  </glide-core-menu>
479
578
  `);
579
+ // Wait for Floating UI.
580
+ await aTimeout(0);
480
581
  const buttons = component.querySelectorAll('glide-core-menu-button');
481
582
  const options = component.querySelector('glide-core-menu-options');
482
583
  buttons[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -492,6 +593,8 @@ it('activates a menu button on "mouseover" when the button is in a nested slot',
492
593
  <glide-core-menu-button label="Two"></glide-core-menu-button>
493
594
  </glide-core-nested-slot>
494
595
  `);
596
+ // Wait for Floating UI.
597
+ await aTimeout(0);
495
598
  const links = component.querySelectorAll('glide-core-menu-button');
496
599
  const options = component.shadowRoot?.querySelector('glide-core-menu-options');
497
600
  links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -502,7 +605,7 @@ it('activates a menu button on "mouseover" when the button is in a nested slot',
502
605
  });
503
606
  it('activates the next option on ArrowDown', async () => {
504
607
  const component = await fixture(html `
505
- <glide-core-menu>
608
+ <glide-core-menu open>
506
609
  <button slot="target">Target</button>
507
610
 
508
611
  <glide-core-menu-options>
@@ -512,7 +615,8 @@ it('activates the next option on ArrowDown', async () => {
512
615
  </glide-core-menu-options>
513
616
  </glide-core-menu>
514
617
  `);
515
- component.querySelector('button')?.click();
618
+ // Wait for Floating UI.
619
+ await aTimeout(0);
516
620
  component.focus();
517
621
  const links = component.querySelectorAll('glide-core-menu-link');
518
622
  const options = component.querySelector('glide-core-menu-options');
@@ -525,7 +629,7 @@ it('activates the next option on ArrowDown', async () => {
525
629
  });
526
630
  it('activates the previous option on ArrowUp', async () => {
527
631
  const component = await fixture(html `
528
- <glide-core-menu>
632
+ <glide-core-menu open>
529
633
  <button slot="target">Target</button>
530
634
 
531
635
  <glide-core-menu-options>
@@ -534,7 +638,8 @@ it('activates the previous option on ArrowUp', async () => {
534
638
  </glide-core-menu-options>
535
639
  </glide-core-menu>
536
640
  `);
537
- component.querySelector('button')?.click();
641
+ // Wait for Floating UI.
642
+ await aTimeout(0);
538
643
  component.focus();
539
644
  const links = component.querySelectorAll('glide-core-menu-link');
540
645
  const options = component.querySelector('glide-core-menu-options');
@@ -546,7 +651,7 @@ it('activates the previous option on ArrowUp', async () => {
546
651
  });
547
652
  it('activates the first option on Home', async () => {
548
653
  const component = await fixture(html `
549
- <glide-core-menu>
654
+ <glide-core-menu open>
550
655
  <button slot="target">Target</button>
551
656
 
552
657
  <glide-core-menu-options>
@@ -555,7 +660,8 @@ it('activates the first option on Home', async () => {
555
660
  </glide-core-menu-options>
556
661
  </glide-core-menu>
557
662
  `);
558
- component.querySelector('button')?.click();
663
+ // Wait for Floating UI.
664
+ await aTimeout(0);
559
665
  component.focus();
560
666
  const links = component.querySelectorAll('glide-core-menu-link');
561
667
  const options = component.querySelector('glide-core-menu-options');
@@ -567,7 +673,7 @@ it('activates the first option on Home', async () => {
567
673
  });
568
674
  it('activates the first option on PageUp', async () => {
569
675
  const component = await fixture(html `
570
- <glide-core-menu>
676
+ <glide-core-menu open>
571
677
  <button slot="target">Target</button>
572
678
 
573
679
  <glide-core-menu-options>
@@ -576,7 +682,8 @@ it('activates the first option on PageUp', async () => {
576
682
  </glide-core-menu-options>
577
683
  </glide-core-menu>
578
684
  `);
579
- component.querySelector('button')?.click();
685
+ // Wait for Floating UI.
686
+ await aTimeout(0);
580
687
  component.focus();
581
688
  const links = component.querySelectorAll('glide-core-menu-link');
582
689
  const options = component.querySelector('glide-core-menu-options');
@@ -586,9 +693,9 @@ it('activates the first option on PageUp', async () => {
586
693
  expect(links[1].privateActive).to.be.false;
587
694
  expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
588
695
  });
589
- it('activates the first option on ArrowUp + Meta', async () => {
696
+ it('activates the first option on Meta + ArrowUp', async () => {
590
697
  const component = await fixture(html `
591
- <glide-core-menu>
698
+ <glide-core-menu open>
592
699
  <button slot="target">Target</button>
593
700
 
594
701
  <glide-core-menu-options>
@@ -597,7 +704,8 @@ it('activates the first option on ArrowUp + Meta', async () => {
597
704
  </glide-core-menu-options>
598
705
  </glide-core-menu>
599
706
  `);
600
- component.querySelector('button')?.click();
707
+ // Wait for Floating UI.
708
+ await aTimeout(0);
601
709
  component.focus();
602
710
  const links = component.querySelectorAll('glide-core-menu-link');
603
711
  const options = component.querySelector('glide-core-menu-options');
@@ -610,7 +718,7 @@ it('activates the first option on ArrowUp + Meta', async () => {
610
718
  });
611
719
  it('activates the last option on End', async () => {
612
720
  const component = await fixture(html `
613
- <glide-core-menu>
721
+ <glide-core-menu open>
614
722
  <button slot="target">Target</button>
615
723
 
616
724
  <glide-core-menu-options>
@@ -619,7 +727,8 @@ it('activates the last option on End', async () => {
619
727
  </glide-core-menu-options>
620
728
  </glide-core-menu>
621
729
  `);
622
- component.querySelector('button')?.click();
730
+ // Wait for Floating UI.
731
+ await aTimeout(0);
623
732
  component.focus();
624
733
  await sendKeys({ press: 'End' });
625
734
  const links = component.querySelectorAll('glide-core-menu-link');
@@ -640,6 +749,8 @@ it('activates the last option on PageDown', async () => {
640
749
  </glide-core-menu>
641
750
  `);
642
751
  component.querySelector('button')?.click();
752
+ // Wait for Floating UI.
753
+ await aTimeout(0);
643
754
  component.focus();
644
755
  const links = component.querySelectorAll('glide-core-menu-link');
645
756
  const options = component.querySelector('glide-core-menu-options');
@@ -651,7 +762,7 @@ it('activates the last option on PageDown', async () => {
651
762
  });
652
763
  it('activates the last option on Meta + ArrowDown', async () => {
653
764
  const component = await fixture(html `
654
- <glide-core-menu>
765
+ <glide-core-menu open>
655
766
  <button slot="target">Target</button>
656
767
 
657
768
  <glide-core-menu-options>
@@ -660,7 +771,8 @@ it('activates the last option on Meta + ArrowDown', async () => {
660
771
  </glide-core-menu-options>
661
772
  </glide-core-menu>
662
773
  `);
663
- component.querySelector('button')?.click();
774
+ // Wait for Floating UI.
775
+ await aTimeout(0);
664
776
  component.focus();
665
777
  const links = component.querySelectorAll('glide-core-menu-link');
666
778
  const options = component.querySelector('glide-core-menu-options');
@@ -681,7 +793,8 @@ it('sets `aria-activedescendant` on open', async () => {
681
793
  </glide-core-menu-options>
682
794
  </glide-core-menu>`);
683
795
  component.querySelector('button')?.click();
684
- await elementUpdated(component);
796
+ // Wait for Floating UI.
797
+ await aTimeout(0);
685
798
  const link = component.querySelector('glide-core-menu-link');
686
799
  const options = component.querySelector('glide-core-menu-options');
687
800
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
@@ -694,6 +807,8 @@ it('sets `aria-activedescendant` on close', async () => {
694
807
  <glide-core-menu-link label="Link"></glide-core-menu-link>
695
808
  </glide-core-menu-options>
696
809
  </glide-core-menu>`);
810
+ // Wait for Floating UI.
811
+ await aTimeout(0);
697
812
  component.querySelector('button')?.click();
698
813
  await elementUpdated(component);
699
814
  const options = component.querySelector('glide-core-menu-options');
@@ -708,6 +823,8 @@ it('sets `aria-expanded` on open', async () => {
708
823
  </glide-core-menu-options>
709
824
  </glide-core-menu>`);
710
825
  component.querySelector('button')?.click();
826
+ // Wait for Floating UI.
827
+ await aTimeout(0);
711
828
  const button = component.querySelector('button');
712
829
  expect(button?.getAttribute('aria-expanded')).to.equal('true');
713
830
  });
@@ -725,7 +842,7 @@ it('sets `aria-expanded` on close', async () => {
725
842
  });
726
843
  it('does not wrap on ArrowUp', async () => {
727
844
  const component = await fixture(html `
728
- <glide-core-menu>
845
+ <glide-core-menu open>
729
846
  <button slot="target">Target</button>
730
847
 
731
848
  <glide-core-menu-options>
@@ -734,14 +851,33 @@ it('does not wrap on ArrowUp', async () => {
734
851
  </glide-core-menu-options>
735
852
  </glide-core-menu>
736
853
  `);
737
- component.querySelector('button')?.click();
854
+ // Wait for Floating UI.
855
+ await aTimeout(0);
856
+ await sendKeys({ press: 'ArrowUp' });
857
+ const link = component.querySelector('glide-core-menu-link');
858
+ expect(link?.privateActive).to.be.true;
859
+ });
860
+ it('does not wrap on Meta + ArrowUp', async () => {
861
+ const component = await fixture(html `
862
+ <glide-core-menu open>
863
+ <button slot="target">Target</button>
864
+
865
+ <glide-core-menu-options>
866
+ <glide-core-menu-link label="One"></glide-core-menu-link>
867
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
868
+ </glide-core-menu-options>
869
+ </glide-core-menu>
870
+ `);
871
+ // Wait for Floating UI.
872
+ await aTimeout(0);
873
+ await sendKeys({ down: 'Meta' });
738
874
  await sendKeys({ press: 'ArrowUp' });
739
875
  const link = component.querySelector('glide-core-menu-link');
740
876
  expect(link?.privateActive).to.be.true;
741
877
  });
742
878
  it('does not wrap on ArrowDown', async () => {
743
879
  const component = await fixture(html `
744
- <glide-core-menu>
880
+ <glide-core-menu open>
745
881
  <button slot="target">Target</button>
746
882
 
747
883
  <glide-core-menu-options>
@@ -750,9 +886,29 @@ it('does not wrap on ArrowDown', async () => {
750
886
  </glide-core-menu-options>
751
887
  </glide-core-menu>
752
888
  `);
753
- component.querySelector('button')?.click();
889
+ // Wait for Floating UI.
890
+ await aTimeout(0);
891
+ const options = component.querySelectorAll('glide-core-menu-link');
892
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
893
+ await sendKeys({ press: 'ArrowDown' });
894
+ expect(options[1].privateActive).to.be.true;
895
+ });
896
+ it('does not wrap on ArrowDown', async () => {
897
+ const component = await fixture(html `
898
+ <glide-core-menu open>
899
+ <button slot="target">Target</button>
900
+
901
+ <glide-core-menu-options>
902
+ <glide-core-menu-link label="One"></glide-core-menu-link>
903
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
904
+ </glide-core-menu-options>
905
+ </glide-core-menu>
906
+ `);
907
+ // Wait for Floating UI.
908
+ await aTimeout(0);
754
909
  const options = component.querySelectorAll('glide-core-menu-link');
755
910
  options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
911
+ await sendKeys({ down: 'Meta' });
756
912
  await sendKeys({ press: 'ArrowDown' });
757
913
  expect(options[1].privateActive).to.be.true;
758
914
  });
@@ -42,5 +42,5 @@ it('throws if it does not have a default slot', async () => {
42
42
  spy();
43
43
  }
44
44
  }
45
- expect(spy.called).to.be.true;
45
+ expect(spy.callCount).to.equal(1);
46
46
  });