@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,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
1
2
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -7,7 +8,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
8
  import './menu.link.js';
8
9
  import './menu.options.js';
9
10
  import { LitElement } from 'lit';
10
- import { assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
11
+ import { aTimeout, assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
11
12
  import { customElement } from 'lit/decorators.js';
12
13
  import { sendKeys } from '@web/test-runner-commands';
13
14
  import GlideCoreMenu from './menu.js';
@@ -40,24 +41,114 @@ it('opens on click', async () => {
40
41
  </glide-core-menu-options>
41
42
  </glide-core-menu>`);
42
43
  component.querySelector('button')?.click();
43
- await elementUpdated(component);
44
+ // Wait for Floating UI.
45
+ await aTimeout(0);
44
46
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
45
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');
46
70
  expect(component.open).to.be.true;
47
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).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);
48
95
  expect(target?.ariaExpanded).to.equal('true');
49
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');
114
+ expect(component.open).to.be.true;
115
+ expect(defaultSlot?.checkVisibility()).to.be.true;
116
+ expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
117
+ expect(target?.ariaExpanded).to.equal('true');
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
+ });
50
139
  it('does not open on click when there are no options', async () => {
51
140
  const component = await fixture(html `<glide-core-menu>
52
141
  <button slot="target">Target</button>
53
142
  <glide-core-menu-options> </glide-core-menu-options>
54
143
  </glide-core-menu>`);
55
144
  component.querySelector('button')?.click();
145
+ // Wait for Floating UI.
146
+ await aTimeout(0);
56
147
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
57
148
  const options = component.querySelector('glide-core-menu-options');
58
149
  const target = component.querySelector('button');
59
150
  expect(component.open).to.be.false;
60
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.not.ok;
151
+ expect(defaultSlot?.checkVisibility()).to.be.false;
61
152
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
62
153
  expect(target?.ariaExpanded).to.equal('false');
63
154
  });
@@ -70,11 +161,13 @@ it('does not open when `disabled` is set on its target', async () => {
70
161
  </glide-core-menu-options>
71
162
  </glide-core-menu>`);
72
163
  component.querySelector('button')?.click();
164
+ // Wait for Floating UI.
165
+ await aTimeout(0);
73
166
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
74
167
  const options = component.querySelector('glide-core-menu-options');
75
168
  const target = component.querySelector('button');
76
169
  expect(component.open).to.be.false;
77
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
170
+ expect(defaultSlot?.checkVisibility()).to.be.false;
78
171
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
79
172
  expect(target?.ariaExpanded).to.equal('false');
80
173
  });
@@ -88,13 +181,14 @@ it('does not open when `disabled` is set programmatically on its target', async
88
181
  </glide-core-menu>`);
89
182
  const target = component.querySelector('button');
90
183
  assert(target);
91
- target.click();
92
184
  target.disabled = true;
93
- await elementUpdated(component);
185
+ target.click();
186
+ // Wait for Floating UI.
187
+ await aTimeout(0);
94
188
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
95
189
  const options = component.querySelector('glide-core-menu-options');
96
190
  expect(component.open).to.be.false;
97
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
191
+ expect(defaultSlot?.checkVisibility()).to.be.false;
98
192
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
99
193
  expect(target?.ariaExpanded).to.equal('false');
100
194
  });
@@ -108,10 +202,12 @@ it('does not open when `aria-disabled` is set on its target', async () => {
108
202
  </glide-core-menu>`);
109
203
  const target = component.querySelector('button');
110
204
  target?.click();
205
+ // Wait for Floating UI.
206
+ await aTimeout(0);
111
207
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
112
208
  const options = component.querySelector('glide-core-menu-options');
113
209
  expect(component.open).to.be.false;
114
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
210
+ expect(defaultSlot?.checkVisibility()).to.be.false;
115
211
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
116
212
  expect(target?.ariaExpanded).to.equal('false');
117
213
  });
@@ -125,14 +221,12 @@ it('does not open when `aria-disabled` is set programmatically on its target', a
125
221
  </glide-core-menu>`);
126
222
  const button = component.querySelector('button');
127
223
  assert(button);
128
- button?.click();
129
224
  button.ariaDisabled = 'true';
130
- await elementUpdated(component);
225
+ button?.click();
131
226
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
132
227
  const options = component.querySelector('glide-core-menu-options');
133
228
  const target = component.querySelector('button');
134
- expect(component.open).to.be.false;
135
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
229
+ expect(defaultSlot?.checkVisibility()).to.be.false;
136
230
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
137
231
  expect(target?.ariaExpanded).to.equal('false');
138
232
  });
@@ -151,7 +245,7 @@ it('opens on Enter', async () => {
151
245
  const target = component.querySelector('button');
152
246
  const link = component.querySelector('glide-core-menu-link');
153
247
  expect(component.open).to.be.true;
154
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
248
+ expect(defaultSlot?.checkVisibility()).to.be.true;
155
249
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
156
250
  expect(target?.ariaExpanded).to.equal('true');
157
251
  });
@@ -170,7 +264,7 @@ it('opens on ArrowUp', async () => {
170
264
  const target = component.querySelector('button');
171
265
  const link = component.querySelector('glide-core-menu-link');
172
266
  expect(component.open).to.be.true;
173
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
267
+ expect(defaultSlot?.checkVisibility()).to.be.true;
174
268
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
175
269
  expect(target?.ariaExpanded).to.equal('true');
176
270
  });
@@ -189,7 +283,7 @@ it('opens on ArrowDown', async () => {
189
283
  const target = component.querySelector('button');
190
284
  const link = component.querySelector('glide-core-menu-link');
191
285
  expect(component.open).to.be.true;
192
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
286
+ expect(defaultSlot?.checkVisibility()).to.be.true;
193
287
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
194
288
  expect(target?.ariaExpanded).to.equal('true');
195
289
  });
@@ -208,7 +302,7 @@ it('opens on Space', async () => {
208
302
  const target = component.querySelector('button');
209
303
  const link = component.querySelector('glide-core-menu-link');
210
304
  expect(component.open).to.be.true;
211
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
305
+ expect(defaultSlot?.checkVisibility()).to.be.true;
212
306
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
213
307
  expect(target?.ariaExpanded).to.equal('true');
214
308
  });
@@ -223,7 +317,7 @@ it('does not open on Space when there are no options', async () => {
223
317
  const options = component.querySelector('glide-core-menu-options');
224
318
  const target = component.querySelector('button');
225
319
  expect(component.open).to.be.false;
226
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.not.ok;
320
+ expect(defaultSlot?.checkVisibility()).to.be.false;
227
321
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
228
322
  expect(target?.ariaExpanded).to.equal('false');
229
323
  });
@@ -236,12 +330,13 @@ it('opens when opened programmatically', async () => {
236
330
  </glide-core-menu-options>
237
331
  </glide-core-menu>`);
238
332
  component.open = true;
239
- await elementUpdated(component);
333
+ // Wait for Floating UI.
334
+ await aTimeout(0);
240
335
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
241
336
  const options = component.querySelector('glide-core-menu-options');
242
337
  const target = component.querySelector('button');
243
338
  const link = component.querySelector('glide-core-menu-link');
244
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
339
+ expect(defaultSlot?.checkVisibility()).to.be.true;
245
340
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
246
341
  expect(target?.ariaExpanded).to.equal('true');
247
342
  });
@@ -259,13 +354,14 @@ it('opens when opened programmatically via the click handler of another element'
259
354
  anotherElement.addEventListener('click', () => (component.open = true));
260
355
  div.append(anotherElement);
261
356
  anotherElement.click();
262
- await elementUpdated(component);
357
+ // Wait for Floating UI.
358
+ await aTimeout(0);
263
359
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
264
360
  const options = component.querySelector('glide-core-menu-options');
265
361
  const target = component.querySelector('button');
266
362
  const link = component.querySelector('glide-core-menu-link');
267
363
  expect(component.open).to.be.true;
268
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
364
+ expect(defaultSlot?.checkVisibility()).to.be.true;
269
365
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
270
366
  expect(target?.ariaExpanded).to.equal('true');
271
367
  });
@@ -290,12 +386,11 @@ it('closes when clicked', async () => {
290
386
  </glide-core-menu-options>
291
387
  </glide-core-menu>`);
292
388
  component.querySelector('button')?.click();
293
- await elementUpdated(component);
294
389
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
295
390
  const options = component.querySelector('glide-core-menu-options');
296
391
  const target = component.querySelector('button');
297
392
  expect(component.open).to.be.false;
298
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
393
+ expect(defaultSlot?.checkVisibility()).to.be.false;
299
394
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
300
395
  expect(target?.ariaExpanded).to.equal('false');
301
396
  });
@@ -313,7 +408,7 @@ it('closes when something outside of it is clicked', async () => {
313
408
  const options = component.querySelector('glide-core-menu-options');
314
409
  const target = component.querySelector('button');
315
410
  expect(component.open).to.be.false;
316
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
411
+ expect(defaultSlot?.checkVisibility()).to.be.false;
317
412
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
318
413
  expect(target?.ariaExpanded).to.equal('false');
319
414
  });
@@ -325,13 +420,15 @@ it('closes on Escape when the button has focus', async () => {
325
420
  <glide-core-menu-link label="Link"></glide-core-menu-link>
326
421
  </glide-core-menu-options>
327
422
  </glide-core-menu>`);
423
+ // Wait for it to open
424
+ await aTimeout(0);
328
425
  component.querySelector('button')?.click();
329
426
  await sendKeys({ press: 'Escape' });
330
427
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
331
428
  const options = component.querySelector('glide-core-menu-options');
332
429
  const target = component.querySelector('button');
333
430
  expect(component.open).to.be.false;
334
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
431
+ expect(defaultSlot?.checkVisibility()).to.be.false;
335
432
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
336
433
  expect(target?.ariaExpanded).to.equal('false');
337
434
  });
@@ -344,12 +441,11 @@ it('closes when an option is selected via click', async () => {
344
441
  </glide-core-menu-options>
345
442
  </glide-core-menu>`);
346
443
  component.querySelector('glide-core-menu-link')?.click();
347
- await elementUpdated(component);
348
444
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
349
445
  const options = component.querySelector('glide-core-menu-options');
350
446
  const target = component.querySelector('button');
351
447
  expect(component.open).to.be.false;
352
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
448
+ expect(defaultSlot?.checkVisibility()).to.be.false;
353
449
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
354
450
  expect(target?.ariaExpanded).to.equal('false');
355
451
  });
@@ -366,12 +462,11 @@ it('closes when an option is selected via Enter', async () => {
366
462
  .querySelector('glide-core-menu-link')
367
463
  ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
368
464
  await sendKeys({ press: 'Enter' });
369
- await elementUpdated(component);
370
465
  const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
371
466
  const options = component.querySelector('glide-core-menu-options');
372
467
  const target = component.querySelector('button');
373
468
  expect(component.open).to.be.false;
374
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
469
+ expect(defaultSlot?.checkVisibility()).to.be.false;
375
470
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
376
471
  expect(target?.ariaExpanded).to.equal('false');
377
472
  });
@@ -389,13 +484,13 @@ it('closes when an option is selected via Space', async () => {
389
484
  const options = component.querySelector('glide-core-menu-options');
390
485
  const target = component.querySelector('button');
391
486
  expect(component.open).to.be.false;
392
- expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
487
+ expect(defaultSlot?.checkVisibility()).to.be.false;
393
488
  expect(options?.getAttribute('aria-activedescendant')).to.equal('');
394
489
  expect(target?.ariaExpanded).to.equal('false');
395
490
  });
396
491
  it('activates the first menu link by default', async () => {
397
492
  const component = await fixture(html `
398
- <glide-core-menu>
493
+ <glide-core-menu open>
399
494
  <button slot="target">Target</button>
400
495
 
401
496
  <glide-core-menu-options>
@@ -404,15 +499,15 @@ it('activates the first menu link by default', async () => {
404
499
  </glide-core-menu-options>
405
500
  </glide-core-menu>
406
501
  `);
407
- component.querySelector('button')?.click();
408
- await elementUpdated(component);
502
+ // Wait for Floating UI.
503
+ await aTimeout(0);
409
504
  const links = component.querySelectorAll('glide-core-menu-link');
410
505
  const options = component.querySelector('glide-core-menu-options');
411
506
  expect(links[0].privateActive).to.be.true;
412
507
  expect(links[1].privateActive).to.be.false;
413
508
  expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0]?.id);
414
509
  });
415
- it('activates the first menu button by default', async () => {
510
+ it('activates the first menu button by default when opened via click', async () => {
416
511
  const component = await fixture(html `
417
512
  <glide-core-menu>
418
513
  <button slot="target">Target</button>
@@ -424,7 +519,8 @@ it('activates the first menu button by default', async () => {
424
519
  </glide-core-menu>
425
520
  `);
426
521
  component.querySelector('button')?.click();
427
- await elementUpdated(component);
522
+ // Wait for Floating UI.
523
+ await aTimeout(0);
428
524
  const buttons = component.querySelectorAll('glide-core-menu-button');
429
525
  const options = component.querySelector('glide-core-menu-options');
430
526
  expect(buttons[0].privateActive).to.be.true;
@@ -442,6 +538,8 @@ it('activates a menu link on "mouseover"', async () => {
442
538
  </glide-core-menu-options>
443
539
  </glide-core-menu>
444
540
  `);
541
+ // Wait for Floating UI.
542
+ await aTimeout(0);
445
543
  const links = component.querySelectorAll('glide-core-menu-link');
446
544
  const options = component.querySelector('glide-core-menu-options');
447
545
  links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -457,6 +555,8 @@ it('activates a menu link on "mouseover" when the link is in a nested slot', asy
457
555
  <glide-core-menu-link label="Two"></glide-core-menu-link>
458
556
  </glide-core-nested-slot>
459
557
  `);
558
+ // Wait for Floating UI.
559
+ await aTimeout(0);
460
560
  const links = component.querySelectorAll('glide-core-menu-link');
461
561
  const options = component.shadowRoot?.querySelector('glide-core-menu-options');
462
562
  links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -476,6 +576,8 @@ it('activates a menu button on "mouseover"', async () => {
476
576
  </glide-core-menu-options>
477
577
  </glide-core-menu>
478
578
  `);
579
+ // Wait for Floating UI.
580
+ await aTimeout(0);
479
581
  const buttons = component.querySelectorAll('glide-core-menu-button');
480
582
  const options = component.querySelector('glide-core-menu-options');
481
583
  buttons[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -491,6 +593,8 @@ it('activates a menu button on "mouseover" when the button is in a nested slot',
491
593
  <glide-core-menu-button label="Two"></glide-core-menu-button>
492
594
  </glide-core-nested-slot>
493
595
  `);
596
+ // Wait for Floating UI.
597
+ await aTimeout(0);
494
598
  const links = component.querySelectorAll('glide-core-menu-button');
495
599
  const options = component.shadowRoot?.querySelector('glide-core-menu-options');
496
600
  links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
@@ -501,7 +605,7 @@ it('activates a menu button on "mouseover" when the button is in a nested slot',
501
605
  });
502
606
  it('activates the next option on ArrowDown', async () => {
503
607
  const component = await fixture(html `
504
- <glide-core-menu>
608
+ <glide-core-menu open>
505
609
  <button slot="target">Target</button>
506
610
 
507
611
  <glide-core-menu-options>
@@ -511,7 +615,8 @@ it('activates the next option on ArrowDown', async () => {
511
615
  </glide-core-menu-options>
512
616
  </glide-core-menu>
513
617
  `);
514
- component.querySelector('button')?.click();
618
+ // Wait for Floating UI.
619
+ await aTimeout(0);
515
620
  component.focus();
516
621
  const links = component.querySelectorAll('glide-core-menu-link');
517
622
  const options = component.querySelector('glide-core-menu-options');
@@ -524,7 +629,7 @@ it('activates the next option on ArrowDown', async () => {
524
629
  });
525
630
  it('activates the previous option on ArrowUp', async () => {
526
631
  const component = await fixture(html `
527
- <glide-core-menu>
632
+ <glide-core-menu open>
528
633
  <button slot="target">Target</button>
529
634
 
530
635
  <glide-core-menu-options>
@@ -533,7 +638,8 @@ it('activates the previous option on ArrowUp', async () => {
533
638
  </glide-core-menu-options>
534
639
  </glide-core-menu>
535
640
  `);
536
- component.querySelector('button')?.click();
641
+ // Wait for Floating UI.
642
+ await aTimeout(0);
537
643
  component.focus();
538
644
  const links = component.querySelectorAll('glide-core-menu-link');
539
645
  const options = component.querySelector('glide-core-menu-options');
@@ -545,7 +651,7 @@ it('activates the previous option on ArrowUp', async () => {
545
651
  });
546
652
  it('activates the first option on Home', async () => {
547
653
  const component = await fixture(html `
548
- <glide-core-menu>
654
+ <glide-core-menu open>
549
655
  <button slot="target">Target</button>
550
656
 
551
657
  <glide-core-menu-options>
@@ -554,7 +660,8 @@ it('activates the first option on Home', async () => {
554
660
  </glide-core-menu-options>
555
661
  </glide-core-menu>
556
662
  `);
557
- component.querySelector('button')?.click();
663
+ // Wait for Floating UI.
664
+ await aTimeout(0);
558
665
  component.focus();
559
666
  const links = component.querySelectorAll('glide-core-menu-link');
560
667
  const options = component.querySelector('glide-core-menu-options');
@@ -566,7 +673,7 @@ it('activates the first option on Home', async () => {
566
673
  });
567
674
  it('activates the first option on PageUp', async () => {
568
675
  const component = await fixture(html `
569
- <glide-core-menu>
676
+ <glide-core-menu open>
570
677
  <button slot="target">Target</button>
571
678
 
572
679
  <glide-core-menu-options>
@@ -575,7 +682,8 @@ it('activates the first option on PageUp', async () => {
575
682
  </glide-core-menu-options>
576
683
  </glide-core-menu>
577
684
  `);
578
- component.querySelector('button')?.click();
685
+ // Wait for Floating UI.
686
+ await aTimeout(0);
579
687
  component.focus();
580
688
  const links = component.querySelectorAll('glide-core-menu-link');
581
689
  const options = component.querySelector('glide-core-menu-options');
@@ -585,9 +693,9 @@ it('activates the first option on PageUp', async () => {
585
693
  expect(links[1].privateActive).to.be.false;
586
694
  expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
587
695
  });
588
- it('activates the first option on ArrowUp + Meta', async () => {
696
+ it('activates the first option on Meta + ArrowUp', async () => {
589
697
  const component = await fixture(html `
590
- <glide-core-menu>
698
+ <glide-core-menu open>
591
699
  <button slot="target">Target</button>
592
700
 
593
701
  <glide-core-menu-options>
@@ -596,7 +704,8 @@ it('activates the first option on ArrowUp + Meta', async () => {
596
704
  </glide-core-menu-options>
597
705
  </glide-core-menu>
598
706
  `);
599
- component.querySelector('button')?.click();
707
+ // Wait for Floating UI.
708
+ await aTimeout(0);
600
709
  component.focus();
601
710
  const links = component.querySelectorAll('glide-core-menu-link');
602
711
  const options = component.querySelector('glide-core-menu-options');
@@ -609,7 +718,7 @@ it('activates the first option on ArrowUp + Meta', async () => {
609
718
  });
610
719
  it('activates the last option on End', async () => {
611
720
  const component = await fixture(html `
612
- <glide-core-menu>
721
+ <glide-core-menu open>
613
722
  <button slot="target">Target</button>
614
723
 
615
724
  <glide-core-menu-options>
@@ -618,7 +727,8 @@ it('activates the last option on End', async () => {
618
727
  </glide-core-menu-options>
619
728
  </glide-core-menu>
620
729
  `);
621
- component.querySelector('button')?.click();
730
+ // Wait for Floating UI.
731
+ await aTimeout(0);
622
732
  component.focus();
623
733
  await sendKeys({ press: 'End' });
624
734
  const links = component.querySelectorAll('glide-core-menu-link');
@@ -639,6 +749,8 @@ it('activates the last option on PageDown', async () => {
639
749
  </glide-core-menu>
640
750
  `);
641
751
  component.querySelector('button')?.click();
752
+ // Wait for Floating UI.
753
+ await aTimeout(0);
642
754
  component.focus();
643
755
  const links = component.querySelectorAll('glide-core-menu-link');
644
756
  const options = component.querySelector('glide-core-menu-options');
@@ -650,7 +762,7 @@ it('activates the last option on PageDown', async () => {
650
762
  });
651
763
  it('activates the last option on Meta + ArrowDown', async () => {
652
764
  const component = await fixture(html `
653
- <glide-core-menu>
765
+ <glide-core-menu open>
654
766
  <button slot="target">Target</button>
655
767
 
656
768
  <glide-core-menu-options>
@@ -659,7 +771,8 @@ it('activates the last option on Meta + ArrowDown', async () => {
659
771
  </glide-core-menu-options>
660
772
  </glide-core-menu>
661
773
  `);
662
- component.querySelector('button')?.click();
774
+ // Wait for Floating UI.
775
+ await aTimeout(0);
663
776
  component.focus();
664
777
  const links = component.querySelectorAll('glide-core-menu-link');
665
778
  const options = component.querySelector('glide-core-menu-options');
@@ -680,7 +793,8 @@ it('sets `aria-activedescendant` on open', async () => {
680
793
  </glide-core-menu-options>
681
794
  </glide-core-menu>`);
682
795
  component.querySelector('button')?.click();
683
- await elementUpdated(component);
796
+ // Wait for Floating UI.
797
+ await aTimeout(0);
684
798
  const link = component.querySelector('glide-core-menu-link');
685
799
  const options = component.querySelector('glide-core-menu-options');
686
800
  expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
@@ -693,6 +807,8 @@ it('sets `aria-activedescendant` on close', async () => {
693
807
  <glide-core-menu-link label="Link"></glide-core-menu-link>
694
808
  </glide-core-menu-options>
695
809
  </glide-core-menu>`);
810
+ // Wait for Floating UI.
811
+ await aTimeout(0);
696
812
  component.querySelector('button')?.click();
697
813
  await elementUpdated(component);
698
814
  const options = component.querySelector('glide-core-menu-options');
@@ -707,6 +823,8 @@ it('sets `aria-expanded` on open', async () => {
707
823
  </glide-core-menu-options>
708
824
  </glide-core-menu>`);
709
825
  component.querySelector('button')?.click();
826
+ // Wait for Floating UI.
827
+ await aTimeout(0);
710
828
  const button = component.querySelector('button');
711
829
  expect(button?.getAttribute('aria-expanded')).to.equal('true');
712
830
  });
@@ -724,7 +842,7 @@ it('sets `aria-expanded` on close', async () => {
724
842
  });
725
843
  it('does not wrap on ArrowUp', async () => {
726
844
  const component = await fixture(html `
727
- <glide-core-menu>
845
+ <glide-core-menu open>
728
846
  <button slot="target">Target</button>
729
847
 
730
848
  <glide-core-menu-options>
@@ -733,14 +851,33 @@ it('does not wrap on ArrowUp', async () => {
733
851
  </glide-core-menu-options>
734
852
  </glide-core-menu>
735
853
  `);
736
- 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' });
737
874
  await sendKeys({ press: 'ArrowUp' });
738
875
  const link = component.querySelector('glide-core-menu-link');
739
876
  expect(link?.privateActive).to.be.true;
740
877
  });
741
878
  it('does not wrap on ArrowDown', async () => {
742
879
  const component = await fixture(html `
743
- <glide-core-menu>
880
+ <glide-core-menu open>
744
881
  <button slot="target">Target</button>
745
882
 
746
883
  <glide-core-menu-options>
@@ -749,9 +886,29 @@ it('does not wrap on ArrowDown', async () => {
749
886
  </glide-core-menu-options>
750
887
  </glide-core-menu>
751
888
  `);
752
- 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);
753
909
  const options = component.querySelectorAll('glide-core-menu-link');
754
910
  options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
911
+ await sendKeys({ down: 'Meta' });
755
912
  await sendKeys({ press: 'ArrowDown' });
756
913
  expect(options[1].privateActive).to.be.true;
757
914
  });
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
1
2
  import { ArgumentError } from 'ow';
2
3
  import { expect, fixture, html } from '@open-wc/testing';
3
4
  import GlideCoreModalIconButton from './modal.icon-button.js';
@@ -41,5 +42,5 @@ it('throws if it does not have a default slot', async () => {
41
42
  spy();
42
43
  }
43
44
  }
44
- expect(spy.called).to.be.true;
45
+ expect(spy.callCount).to.equal(1);
45
46
  });