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