@crowdstrike/glide-core 0.8.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.
- package/dist/button-group.button.d.ts +14 -15
- package/dist/button-group.button.js +1 -1
- package/dist/button-group.button.styles.js +75 -52
- package/dist/button-group.button.test.basics.d.ts +1 -1
- package/dist/button-group.button.test.basics.js +83 -147
- package/dist/button-group.button.test.events.js +8 -67
- package/dist/button-group.button.test.focus.js +13 -0
- package/dist/button-group.button.test.interactions.d.ts +1 -0
- package/dist/button-group.button.test.interactions.js +42 -0
- package/dist/button-group.d.ts +7 -10
- package/dist/button-group.js +1 -1
- package/dist/button-group.stories.d.ts +1 -5
- package/dist/button-group.styles.js +18 -6
- package/dist/button-group.test.basics.js +113 -234
- package/dist/button-group.test.events.js +210 -263
- package/dist/button-group.test.focus.d.ts +1 -0
- package/dist/button-group.test.focus.js +39 -0
- package/dist/button-group.test.interactions.d.ts +1 -0
- package/dist/button-group.test.interactions.js +91 -0
- package/dist/button.test.basics.js +1 -1
- package/dist/checkbox-group.js +1 -1
- package/dist/checkbox-group.styles.js +1 -1
- package/dist/checkbox-group.test.basics.js +1 -1
- package/dist/checkbox-group.test.events.js +4 -4
- package/dist/checkbox-group.test.focus.js +4 -3
- package/dist/checkbox.d.ts +7 -1
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.styles.js +10 -0
- package/dist/checkbox.test.events.js +4 -4
- package/dist/checkbox.test.focus.js +2 -2
- package/dist/{checkbox.test.states.js → checkbox.test.interactions.js} +24 -1
- package/dist/drawer.js +1 -1
- package/dist/dropdown.d.ts +6 -4
- package/dist/dropdown.js +1 -1
- package/dist/dropdown.option.d.ts +6 -2
- package/dist/dropdown.option.js +1 -1
- package/dist/dropdown.option.styles.js +13 -0
- package/dist/dropdown.option.test.basics.js +6 -3
- package/dist/dropdown.option.test.events.js +1 -1
- package/dist/dropdown.option.test.focus.js +1 -1
- package/dist/dropdown.option.test.interactions.multiple.js +1 -54
- package/dist/dropdown.option.test.interactions.single.js +51 -9
- package/dist/dropdown.styles.js +20 -19
- package/dist/dropdown.test.basics.js +143 -2
- package/dist/dropdown.test.basics.multiple.js +5 -2
- package/dist/dropdown.test.events.filterable.js +74 -0
- package/dist/dropdown.test.events.js +49 -160
- package/dist/dropdown.test.events.multiple.js +265 -8
- package/dist/dropdown.test.events.single.js +199 -2
- package/dist/dropdown.test.focus.filterable.js +9 -5
- package/dist/dropdown.test.focus.js +1 -1
- package/dist/dropdown.test.focus.multiple.js +1 -1
- package/dist/dropdown.test.focus.single.js +1 -1
- package/dist/dropdown.test.interactions.filterable.js +68 -11
- package/dist/dropdown.test.interactions.js +94 -5
- package/dist/dropdown.test.interactions.multiple.js +202 -5
- package/dist/dropdown.test.interactions.single.js +68 -6
- package/dist/form-controls-layout.test.basics.js +1 -1
- package/dist/icon-button.test.basics.js +1 -1
- package/dist/icons/checked.d.ts +1 -1
- package/dist/icons/checked.js +1 -1
- package/dist/icons/magnifying-glass.js +1 -1
- package/dist/input.d.ts +0 -6
- package/dist/input.js +1 -1
- package/dist/input.styles.js +7 -2
- package/dist/input.test.basics.js +19 -5
- package/dist/input.test.events.js +4 -4
- package/dist/input.test.focus.js +4 -4
- package/dist/input.test.translations.d.ts +1 -0
- package/dist/input.test.translations.js +38 -0
- package/dist/input.test.validity.js +133 -4
- package/dist/label.d.ts +1 -1
- package/dist/label.js +1 -1
- package/dist/label.styles.js +22 -13
- package/dist/label.test.basics.js +26 -24
- package/dist/library/expect-argument-error.js +1 -1
- package/dist/library/localize.d.ts +3 -1
- package/dist/menu.d.ts +3 -5
- package/dist/menu.js +1 -1
- package/dist/menu.options.test.basics.js +2 -2
- package/dist/menu.styles.js +1 -15
- package/dist/menu.test.basics.d.ts +1 -2
- package/dist/menu.test.basics.js +22 -6
- package/dist/menu.test.focus.d.ts +1 -0
- package/dist/menu.test.focus.js +13 -6
- package/dist/menu.test.interactions.js +212 -56
- package/dist/modal.icon-button.test.basics.js +1 -1
- package/dist/modal.js +1 -1
- package/dist/modal.styles.js +18 -13
- package/dist/modal.tertiary-icon.d.ts +0 -1
- package/dist/modal.tertiary-icon.js +1 -1
- package/dist/modal.tertiary-icon.test.basics.js +1 -1
- package/dist/modal.test.basics.js +1 -1
- package/dist/modal.test.events.js +10 -10
- package/dist/radio-group.js +1 -1
- package/dist/radio-group.styles.js +1 -1
- package/dist/radio-group.test.focus.js +3 -3
- package/dist/radio.d.ts +1 -0
- package/dist/radio.js +1 -1
- package/dist/radio.styles.js +33 -0
- package/dist/split-container.test.basics.js +4 -0
- package/dist/split-link.test.interactions.js +1 -1
- package/dist/styles/variables.css +1 -1
- package/dist/tab.d.ts +1 -1
- package/dist/tab.group.js +1 -1
- package/dist/tab.group.test.basics.js +1 -1
- package/dist/tab.group.test.interactions.js +198 -2
- package/dist/tab.js +1 -1
- package/dist/tab.panel.d.ts +1 -0
- package/dist/tab.panel.js +1 -1
- package/dist/tab.panel.styles.js +11 -1
- package/dist/tag.test.basics.js +2 -2
- package/dist/textarea.d.ts +0 -1
- package/dist/textarea.js +2 -2
- package/dist/textarea.stories.d.ts +3 -4
- package/dist/textarea.styles.js +14 -3
- package/dist/textarea.test.basics.js +80 -44
- package/dist/textarea.test.events.js +56 -41
- package/dist/textarea.test.translations.d.ts +1 -0
- package/dist/textarea.test.translations.js +34 -0
- package/dist/textarea.test.validity.js +104 -20
- package/dist/toasts.js +1 -1
- package/dist/toasts.styles.js +8 -1
- package/dist/toasts.test.basics.js +20 -0
- package/dist/toggle.js +1 -1
- package/dist/toggle.test.focus.js +1 -1
- package/dist/toggle.test.interactions.d.ts +1 -0
- package/dist/tooltip.d.ts +7 -5
- package/dist/tooltip.js +1 -1
- package/dist/tooltip.styles.js +90 -25
- package/dist/tooltip.test.basics.js +38 -3
- package/dist/tooltip.test.interactions.js +136 -34
- package/dist/translations/en.js +1 -1
- package/dist/translations/fr.js +1 -1
- package/dist/translations/ja.js +1 -1
- package/dist/tree.d.ts +0 -1
- package/dist/tree.item.d.ts +1 -2
- package/dist/tree.item.js +1 -1
- package/dist/tree.item.menu.d.ts +0 -1
- package/dist/tree.item.menu.js +1 -1
- package/dist/tree.js +1 -1
- package/dist/tree.test.basics.js +1 -1
- package/package.json +2 -4
- package/dist/drawer.test.floating-components.d.ts +0 -1
- package/dist/drawer.test.floating-components.js +0 -52
- package/dist/library/set-containing-block.d.ts +0 -15
- package/dist/library/set-containing-block.js +0 -1
- package/dist/modal.test.floating-components.js +0 -63
- /package/dist/{checkbox.test.states.d.ts → button-group.button.test.focus.d.ts} +0 -0
- /package/dist/{modal.test.floating-components.d.ts → checkbox.test.interactions.d.ts} +0 -0
- /package/dist/{toggle.test.states.d.ts → dropdown.test.events.filterable.d.ts} +0 -0
- /package/dist/{toggle.test.states.js → toggle.test.interactions.js} +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
|
-
|
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');
|
47
70
|
expect(component.open).to.be.true;
|
48
|
-
expect(defaultSlot?.checkVisibility(
|
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);
|
49
95
|
expect(target?.ariaExpanded).to.equal('true');
|
50
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
|
+
});
|
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(
|
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(
|
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
|
-
|
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(
|
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(
|
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
|
-
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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
|
-
|
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(
|
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
|
-
|
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(
|
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(
|
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,7 +408,7 @@ 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(
|
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
|
});
|
@@ -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>`);
|
423
|
+
// Wait for it to open
|
424
|
+
await aTimeout(0);
|
329
425
|
component.querySelector('button')?.click();
|
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(
|
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(
|
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(
|
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(
|
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
|
-
|
409
|
-
await
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
});
|