@crowdstrike/glide-core 0.5.1 → 0.6.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/README.md +11 -1
- package/dist/accordion.js +1 -1
- package/dist/accordion.styles.js +5 -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 +6 -5
- 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.d.ts +3 -2
- package/dist/button.js +1 -1
- package/dist/button.styles.js +5 -5
- package/dist/button.test.basics.js +202 -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 +7 -4
- 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 +14 -4
- 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.floating-components.d.ts +1 -0
- package/dist/drawer.test.floating-components.js +51 -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 +0 -2
- 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 +82 -0
- package/dist/dropdown.option.test.interactions.single.js +22 -0
- package/dist/dropdown.styles.js +26 -6
- 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 +28 -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 +449 -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.d.ts +3 -2
- package/dist/icon-button.js +1 -1
- package/dist/icon-button.styles.js +12 -12
- package/dist/icon-button.test.basics.js +110 -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 +4 -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 +13 -15
- package/dist/label.test.basics.js +129 -0
- package/dist/library/expect-argument-error.js +1 -1
- package/dist/library/localize.d.ts +17 -0
- package/dist/library/localize.js +1 -0
- package/dist/library/ow.js +1 -1
- package/dist/library/ow.test.js +55 -0
- package/dist/library/set-containing-block.d.ts +15 -0
- package/dist/library/set-containing-block.js +1 -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 +7 -2
- 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.options.d.ts +22 -0
- package/dist/menu.options.js +1 -0
- package/dist/menu.options.styles.d.ts +2 -0
- package/dist/menu.options.styles.js +33 -0
- package/dist/menu.options.test.basics.d.ts +2 -0
- package/dist/menu.options.test.basics.js +43 -0
- package/dist/menu.stories.d.ts +1 -0
- package/dist/menu.styles.js +7 -31
- package/dist/menu.test.basics.d.ts +1 -0
- package/dist/menu.test.basics.js +183 -0
- package/dist/menu.test.focus.d.ts +0 -1
- package/dist/menu.test.focus.js +84 -0
- package/dist/menu.test.interactions.d.ts +1 -1
- package/dist/menu.test.interactions.js +664 -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 -7
- package/dist/modal.tertiary-icon.d.ts +1 -0
- 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.floating-components.d.ts +1 -0
- package/dist/modal.test.floating-components.js +62 -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 +20 -24
- 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 +14 -31
- package/dist/split-button.d.ts +27 -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 +102 -0
- package/dist/split-button.test.basics.d.ts +1 -0
- package/dist/split-button.test.basics.js +99 -0
- package/dist/split-container.d.ts +31 -0
- package/dist/split-container.js +1 -0
- package/dist/split-container.styles.d.ts +2 -0
- package/dist/split-container.styles.js +134 -0
- package/dist/split-container.test.basics.d.ts +3 -0
- package/dist/split-container.test.basics.js +440 -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/variables.css +1 -1
- 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 +80 -55
- package/dist/tab.test.basics.js +71 -0
- package/dist/tag.js +1 -1
- package/dist/tag.styles.js +4 -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/tag.test.translations.d.ts +1 -0
- package/dist/tag.test.translations.js +25 -0
- package/dist/textarea.js +2 -2
- package/dist/textarea.styles.js +5 -4
- 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 +68 -0
- package/dist/toggle.test.events.js +29 -0
- package/dist/toggle.test.focus.js +9 -0
- package/dist/toggle.test.states.js +43 -0
- package/dist/tooltip.d.ts +2 -0
- package/dist/tooltip.js +1 -1
- package/dist/tooltip.styles.js +5 -3
- package/dist/tooltip.test.basics.js +64 -0
- package/dist/tooltip.test.interactions.js +78 -0
- package/dist/translations/en.d.ts +3 -0
- package/dist/translations/en.js +1 -0
- package/dist/translations/fr.d.ts +3 -0
- package/dist/translations/fr.js +1 -0
- package/dist/translations/ja.d.ts +3 -0
- package/dist/translations/ja.js +1 -0
- package/dist/tree.d.ts +1 -0
- package/dist/tree.item.d.ts +3 -1
- 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.d.ts +2 -0
- 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 +33 -0
- package/dist/tree.item.styles.js +23 -8
- package/dist/tree.item.test.basics.js +102 -0
- package/dist/tree.js +1 -1
- package/dist/tree.stories.d.ts +1 -0
- 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 +25 -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,664 @@
|
|
1
|
+
import './menu.link.js';
|
2
|
+
import './menu.options.js';
|
3
|
+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
|
4
|
+
import { sendKeys } from '@web/test-runner-commands';
|
5
|
+
import GlideCoreMenu from './menu.js';
|
6
|
+
GlideCoreMenu.shadowRootOptions.mode = 'open';
|
7
|
+
it('opens when clicked', async () => {
|
8
|
+
const component = await fixture(html `<glide-core-menu>
|
9
|
+
<button slot="target">Target</button>
|
10
|
+
|
11
|
+
<glide-core-menu-options>
|
12
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
13
|
+
</glide-core-menu-options>
|
14
|
+
</glide-core-menu>`);
|
15
|
+
component.querySelector('button')?.click();
|
16
|
+
await elementUpdated(component);
|
17
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
18
|
+
const target = component.querySelector('button');
|
19
|
+
expect(component.open).to.be.true;
|
20
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
|
21
|
+
expect(target?.ariaExpanded).to.equal('true');
|
22
|
+
});
|
23
|
+
it('does not open when clicked when its target is `disabled`', async () => {
|
24
|
+
const component = await fixture(html `<glide-core-menu>
|
25
|
+
<button slot="target" disabled>Target</button>
|
26
|
+
|
27
|
+
<glide-core-menu-options>
|
28
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
29
|
+
</glide-core-menu-options>
|
30
|
+
</glide-core-menu>`);
|
31
|
+
component.querySelector('button')?.click();
|
32
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
33
|
+
const options = component.querySelector('glide-core-menu-options');
|
34
|
+
const target = component.querySelector('button');
|
35
|
+
expect(component.open).to.be.false;
|
36
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
37
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
38
|
+
expect(target?.ariaExpanded).to.equal('false');
|
39
|
+
});
|
40
|
+
it('does not open when clicked when its target is `aria-disabled`', async () => {
|
41
|
+
const component = await fixture(html `<glide-core-menu>
|
42
|
+
<button aria-disabled="true" slot="target">Target</button>
|
43
|
+
|
44
|
+
<glide-core-menu-options>
|
45
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
46
|
+
</glide-core-menu-options>
|
47
|
+
</glide-core-menu>`);
|
48
|
+
component.querySelector('button')?.click();
|
49
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
50
|
+
const options = component.querySelector('glide-core-menu-options');
|
51
|
+
const target = component.querySelector('button');
|
52
|
+
expect(component.open).to.be.false;
|
53
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
54
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
55
|
+
expect(target?.ariaExpanded).to.equal('false');
|
56
|
+
});
|
57
|
+
it('opens on Enter', async () => {
|
58
|
+
const component = await fixture(html `<glide-core-menu>
|
59
|
+
<button slot="target">Target</button>
|
60
|
+
|
61
|
+
<glide-core-menu-options>
|
62
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
63
|
+
</glide-core-menu-options>
|
64
|
+
</glide-core-menu>`);
|
65
|
+
component.querySelector('button')?.focus();
|
66
|
+
await sendKeys({ press: 'Enter' });
|
67
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
68
|
+
const options = component.querySelector('glide-core-menu-options');
|
69
|
+
const target = component.querySelector('button');
|
70
|
+
const link = component.querySelector('glide-core-menu-link');
|
71
|
+
expect(component.open).to.be.true;
|
72
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
|
73
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
|
74
|
+
expect(target?.ariaExpanded).to.equal('true');
|
75
|
+
});
|
76
|
+
it('opens on ArrowUp', async () => {
|
77
|
+
const component = await fixture(html `<glide-core-menu>
|
78
|
+
<button slot="target">Target</button>
|
79
|
+
|
80
|
+
<glide-core-menu-options>
|
81
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
82
|
+
</glide-core-menu-options>
|
83
|
+
</glide-core-menu>`);
|
84
|
+
component.querySelector('button')?.focus();
|
85
|
+
await sendKeys({ press: 'ArrowUp' });
|
86
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
87
|
+
const options = component.querySelector('glide-core-menu-options');
|
88
|
+
const target = component.querySelector('button');
|
89
|
+
const link = component.querySelector('glide-core-menu-link');
|
90
|
+
expect(component.open).to.be.true;
|
91
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
|
92
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
|
93
|
+
expect(target?.ariaExpanded).to.equal('true');
|
94
|
+
});
|
95
|
+
it('opens on ArrowDown', async () => {
|
96
|
+
const component = await fixture(html `<glide-core-menu>
|
97
|
+
<button slot="target">Target</button>
|
98
|
+
|
99
|
+
<glide-core-menu-options>
|
100
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
101
|
+
</glide-core-menu-options>
|
102
|
+
</glide-core-menu>`);
|
103
|
+
component.querySelector('button')?.focus();
|
104
|
+
await sendKeys({ press: 'ArrowDown' });
|
105
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
106
|
+
const options = component.querySelector('glide-core-menu-options');
|
107
|
+
const target = component.querySelector('button');
|
108
|
+
const link = component.querySelector('glide-core-menu-link');
|
109
|
+
expect(component.open).to.be.true;
|
110
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
|
111
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
|
112
|
+
expect(target?.ariaExpanded).to.equal('true');
|
113
|
+
});
|
114
|
+
it('opens on Space', async () => {
|
115
|
+
const component = await fixture(html `<glide-core-menu>
|
116
|
+
<button slot="target">Target</button>
|
117
|
+
|
118
|
+
<glide-core-menu-options>
|
119
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
120
|
+
</glide-core-menu-options>
|
121
|
+
</glide-core-menu>`);
|
122
|
+
component.querySelector('button')?.focus();
|
123
|
+
await sendKeys({ press: ' ' });
|
124
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
125
|
+
const options = component.querySelector('glide-core-menu-options');
|
126
|
+
const target = component.querySelector('button');
|
127
|
+
const link = component.querySelector('glide-core-menu-link');
|
128
|
+
expect(component.open).to.be.true;
|
129
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
|
130
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
|
131
|
+
expect(target?.ariaExpanded).to.equal('true');
|
132
|
+
});
|
133
|
+
it('opens when opened programmatically', async () => {
|
134
|
+
const component = await fixture(html `<glide-core-menu>
|
135
|
+
<button slot="target">Target</button>
|
136
|
+
|
137
|
+
<glide-core-menu-options>
|
138
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
139
|
+
</glide-core-menu-options>
|
140
|
+
</glide-core-menu>`);
|
141
|
+
component.open = true;
|
142
|
+
await elementUpdated(component);
|
143
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
144
|
+
const options = component.querySelector('glide-core-menu-options');
|
145
|
+
const target = component.querySelector('button');
|
146
|
+
const link = component.querySelector('glide-core-menu-link');
|
147
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
|
148
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
|
149
|
+
expect(target?.ariaExpanded).to.equal('true');
|
150
|
+
});
|
151
|
+
it('does not open when opened programmatically and its target is `disabled`', async () => {
|
152
|
+
const component = await fixture(html `<glide-core-menu>
|
153
|
+
<button slot="target" disabled>Target</button>
|
154
|
+
|
155
|
+
<glide-core-menu-options>
|
156
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
157
|
+
</glide-core-menu-options>
|
158
|
+
</glide-core-menu>`);
|
159
|
+
component.open = true;
|
160
|
+
await elementUpdated(component);
|
161
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
162
|
+
const options = component.querySelector('glide-core-menu-options');
|
163
|
+
const target = component.querySelector('button');
|
164
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
165
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
166
|
+
expect(target?.ariaExpanded).to.equal('false');
|
167
|
+
});
|
168
|
+
it('does not open when opened programmatically and its target is `aria-disabled`', async () => {
|
169
|
+
const component = await fixture(html `<glide-core-menu>
|
170
|
+
<button aria-disabled="true" slot="target">Target</button>
|
171
|
+
|
172
|
+
<glide-core-menu-options>
|
173
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
174
|
+
</glide-core-menu-options>
|
175
|
+
</glide-core-menu>`);
|
176
|
+
component.open = true;
|
177
|
+
await elementUpdated(component);
|
178
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
179
|
+
const options = component.querySelector('glide-core-menu-options');
|
180
|
+
const target = component.querySelector('button');
|
181
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
182
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
183
|
+
expect(target?.ariaExpanded).to.equal('false');
|
184
|
+
});
|
185
|
+
// See the `document` click listener comment in `menu.ts` for an explanation.
|
186
|
+
it('opens when opened programmatically via the click handler of another element', async () => {
|
187
|
+
const div = document.createElement('div');
|
188
|
+
const component = await fixture(html `<glide-core-menu>
|
189
|
+
<button slot="target">Target</button>
|
190
|
+
|
191
|
+
<glide-core-menu-options>
|
192
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
193
|
+
</glide-core-menu-options>
|
194
|
+
</glide-core-menu>`, { parentNode: div });
|
195
|
+
const anotherElement = document.createElement('button');
|
196
|
+
anotherElement.addEventListener('click', () => (component.open = true));
|
197
|
+
div.append(anotherElement);
|
198
|
+
anotherElement.click();
|
199
|
+
await elementUpdated(component);
|
200
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
201
|
+
const options = component.querySelector('glide-core-menu-options');
|
202
|
+
const target = component.querySelector('button');
|
203
|
+
const link = component.querySelector('glide-core-menu-link');
|
204
|
+
expect(component.open).to.be.true;
|
205
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
|
206
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
|
207
|
+
expect(target?.ariaExpanded).to.equal('true');
|
208
|
+
});
|
209
|
+
it('sets `privateSize` on the options component when `size` is changed programmatically', async () => {
|
210
|
+
const component = await fixture(html `<glide-core-menu>
|
211
|
+
<button slot="target">Target</button>
|
212
|
+
|
213
|
+
<glide-core-menu-options>
|
214
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
215
|
+
</glide-core-menu-options>
|
216
|
+
</glide-core-menu>`);
|
217
|
+
component.size = 'small';
|
218
|
+
const options = component.querySelector('glide-core-menu-options');
|
219
|
+
expect(options?.privateSize).to.equal('small');
|
220
|
+
});
|
221
|
+
it('closes when clicked', async () => {
|
222
|
+
const component = await fixture(html `<glide-core-menu open>
|
223
|
+
<button slot="target">Target</button>
|
224
|
+
|
225
|
+
<glide-core-menu-options>
|
226
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
227
|
+
</glide-core-menu-options>
|
228
|
+
</glide-core-menu>`);
|
229
|
+
component.querySelector('button')?.click();
|
230
|
+
await elementUpdated(component);
|
231
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
232
|
+
const options = component.querySelector('glide-core-menu-options');
|
233
|
+
const target = component.querySelector('button');
|
234
|
+
expect(component.open).to.be.false;
|
235
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
236
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
237
|
+
expect(target?.ariaExpanded).to.equal('false');
|
238
|
+
});
|
239
|
+
it('closes when something outside of it is clicked', async () => {
|
240
|
+
const component = await fixture(html `<glide-core-menu>
|
241
|
+
<button slot="target">Target</button>
|
242
|
+
|
243
|
+
<glide-core-menu-options>
|
244
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
245
|
+
</glide-core-menu-options>
|
246
|
+
</glide-core-menu>`);
|
247
|
+
component.querySelector('button')?.click();
|
248
|
+
document.body.click();
|
249
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
250
|
+
const options = component.querySelector('glide-core-menu-options');
|
251
|
+
const target = component.querySelector('button');
|
252
|
+
expect(component.open).to.be.false;
|
253
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
254
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
255
|
+
expect(target?.ariaExpanded).to.equal('false');
|
256
|
+
});
|
257
|
+
it('closes on Escape when the button has focus', async () => {
|
258
|
+
const component = await fixture(html `<glide-core-menu open>
|
259
|
+
<button slot="target">Target</button>
|
260
|
+
|
261
|
+
<glide-core-menu-options>
|
262
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
263
|
+
</glide-core-menu-options>
|
264
|
+
</glide-core-menu>`);
|
265
|
+
component.querySelector('button')?.click();
|
266
|
+
await sendKeys({ press: 'Escape' });
|
267
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
268
|
+
const options = component.querySelector('glide-core-menu-options');
|
269
|
+
const target = component.querySelector('button');
|
270
|
+
expect(component.open).to.be.false;
|
271
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
272
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
273
|
+
expect(target?.ariaExpanded).to.equal('false');
|
274
|
+
});
|
275
|
+
it('closes when an option is selected via click', async () => {
|
276
|
+
const component = await fixture(html `<glide-core-menu open>
|
277
|
+
<button slot="target">Target</button>
|
278
|
+
|
279
|
+
<glide-core-menu-options>
|
280
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
281
|
+
</glide-core-menu-options>
|
282
|
+
</glide-core-menu>`);
|
283
|
+
component.querySelector('glide-core-menu-link')?.click();
|
284
|
+
await elementUpdated(component);
|
285
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
286
|
+
const options = component.querySelector('glide-core-menu-options');
|
287
|
+
const target = component.querySelector('button');
|
288
|
+
expect(component.open).to.be.false;
|
289
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
290
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
291
|
+
expect(target?.ariaExpanded).to.equal('false');
|
292
|
+
});
|
293
|
+
it('closes when an option is selected via Enter', async () => {
|
294
|
+
const component = await fixture(html `<glide-core-menu open>
|
295
|
+
<button slot="target">Target</button>
|
296
|
+
|
297
|
+
<glide-core-menu-options>
|
298
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
299
|
+
</glide-core-menu-options>
|
300
|
+
</glide-core-menu>`);
|
301
|
+
component.focus();
|
302
|
+
component
|
303
|
+
.querySelector('glide-core-menu-link')
|
304
|
+
?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
305
|
+
await sendKeys({ press: 'Enter' });
|
306
|
+
await elementUpdated(component);
|
307
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
308
|
+
const options = component.querySelector('glide-core-menu-options');
|
309
|
+
const target = component.querySelector('button');
|
310
|
+
expect(component.open).to.be.false;
|
311
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
312
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
313
|
+
expect(target?.ariaExpanded).to.equal('false');
|
314
|
+
});
|
315
|
+
it('closes when an option is selected via Space', async () => {
|
316
|
+
const component = await fixture(html `<glide-core-menu open>
|
317
|
+
<button slot="target">Target</button>
|
318
|
+
|
319
|
+
<glide-core-menu-options>
|
320
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
321
|
+
</glide-core-menu-options>
|
322
|
+
</glide-core-menu>`);
|
323
|
+
component.focus();
|
324
|
+
await sendKeys({ press: ' ' });
|
325
|
+
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
326
|
+
const options = component.querySelector('glide-core-menu-options');
|
327
|
+
const target = component.querySelector('button');
|
328
|
+
expect(component.open).to.be.false;
|
329
|
+
expect(defaultSlot?.checkVisibility({ checkVisibilityCSS: true })).not.ok;
|
330
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
331
|
+
expect(target?.ariaExpanded).to.equal('false');
|
332
|
+
});
|
333
|
+
it('activates the first menu link by default', async () => {
|
334
|
+
const component = await fixture(html `
|
335
|
+
<glide-core-menu>
|
336
|
+
<button slot="target">Target</button>
|
337
|
+
|
338
|
+
<glide-core-menu-options>
|
339
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
340
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
341
|
+
</glide-core-menu-options>
|
342
|
+
</glide-core-menu>
|
343
|
+
`);
|
344
|
+
component.querySelector('button')?.click();
|
345
|
+
await elementUpdated(component);
|
346
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
347
|
+
const options = component.querySelector('glide-core-menu-options');
|
348
|
+
expect(links[0].privateActive).to.be.true;
|
349
|
+
expect(links[1].privateActive).to.be.false;
|
350
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0]?.id);
|
351
|
+
});
|
352
|
+
it('activates the first menu button by default', async () => {
|
353
|
+
const component = await fixture(html `
|
354
|
+
<glide-core-menu>
|
355
|
+
<button slot="target">Target</button>
|
356
|
+
|
357
|
+
<glide-core-menu-options>
|
358
|
+
<glide-core-menu-button label="One"></glide-core-menu-button>
|
359
|
+
<glide-core-menu-button label="Two"></glide-core-menu-button>
|
360
|
+
</glide-core-menu-options>
|
361
|
+
</glide-core-menu>
|
362
|
+
`);
|
363
|
+
component.querySelector('button')?.click();
|
364
|
+
await elementUpdated(component);
|
365
|
+
const buttons = component.querySelectorAll('glide-core-menu-button');
|
366
|
+
const options = component.querySelector('glide-core-menu-options');
|
367
|
+
expect(buttons[0].privateActive).to.be.true;
|
368
|
+
expect(buttons[1].privateActive).to.be.false;
|
369
|
+
expect(options?.getAttribute('aria-activedescendant')).equal(buttons[0]?.id);
|
370
|
+
});
|
371
|
+
it('activates a menu link on "mouseover"', async () => {
|
372
|
+
const component = await fixture(html `
|
373
|
+
<glide-core-menu open>
|
374
|
+
<button slot="target">Target</button>
|
375
|
+
|
376
|
+
<glide-core-menu-options>
|
377
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
378
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
379
|
+
</glide-core-menu-options>
|
380
|
+
</glide-core-menu>
|
381
|
+
`);
|
382
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
383
|
+
const options = component.querySelector('glide-core-menu-options');
|
384
|
+
links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
385
|
+
await elementUpdated(component);
|
386
|
+
expect(links[0].privateActive).to.be.false;
|
387
|
+
expect(links[1].privateActive).to.be.true;
|
388
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
|
389
|
+
});
|
390
|
+
it('activates a menu button on "mouseover"', async () => {
|
391
|
+
const component = await fixture(html `
|
392
|
+
<glide-core-menu open>
|
393
|
+
<button slot="target">Target</button>
|
394
|
+
|
395
|
+
<glide-core-menu-options>
|
396
|
+
<glide-core-menu-button label="One"></glide-core-menu-button>
|
397
|
+
<glide-core-menu-button label="Two"></glide-core-menu-button>
|
398
|
+
</glide-core-menu-options>
|
399
|
+
</glide-core-menu>
|
400
|
+
`);
|
401
|
+
const buttons = component.querySelectorAll('glide-core-menu-button');
|
402
|
+
const options = component.querySelector('glide-core-menu-options');
|
403
|
+
buttons[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
404
|
+
await elementUpdated(component);
|
405
|
+
expect(buttons[0].privateActive).to.be.false;
|
406
|
+
expect(buttons[1].privateActive).to.be.true;
|
407
|
+
expect(options?.getAttribute('aria-activedescendant')).equal(buttons[1].id);
|
408
|
+
});
|
409
|
+
it('activates the next option on ArrowDown', async () => {
|
410
|
+
const component = await fixture(html `
|
411
|
+
<glide-core-menu>
|
412
|
+
<button slot="target">Target</button>
|
413
|
+
|
414
|
+
<glide-core-menu-options>
|
415
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
416
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
417
|
+
<glide-core-menu-link label="Three"></glide-core-menu-link>
|
418
|
+
</glide-core-menu-options>
|
419
|
+
</glide-core-menu>
|
420
|
+
`);
|
421
|
+
component.querySelector('button')?.click();
|
422
|
+
component.focus();
|
423
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
424
|
+
const options = component.querySelector('glide-core-menu-options');
|
425
|
+
links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
426
|
+
await sendKeys({ press: 'ArrowDown' });
|
427
|
+
expect(links[0].privateActive).to.be.false;
|
428
|
+
expect(links[1].privateActive).to.be.false;
|
429
|
+
expect(links[2].privateActive).to.be.true;
|
430
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[2].id);
|
431
|
+
});
|
432
|
+
it('activates the previous option on ArrowUp', async () => {
|
433
|
+
const component = await fixture(html `
|
434
|
+
<glide-core-menu>
|
435
|
+
<button slot="target">Target</button>
|
436
|
+
|
437
|
+
<glide-core-menu-options>
|
438
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
439
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
440
|
+
</glide-core-menu-options>
|
441
|
+
</glide-core-menu>
|
442
|
+
`);
|
443
|
+
component.querySelector('button')?.click();
|
444
|
+
component.focus();
|
445
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
446
|
+
const options = component.querySelector('glide-core-menu-options');
|
447
|
+
links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
448
|
+
await sendKeys({ press: 'ArrowUp' });
|
449
|
+
expect(links[0].privateActive).to.be.true;
|
450
|
+
expect(links[1].privateActive).to.be.false;
|
451
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
|
452
|
+
});
|
453
|
+
it('activates the first option on Home', async () => {
|
454
|
+
const component = await fixture(html `
|
455
|
+
<glide-core-menu>
|
456
|
+
<button slot="target">Target</button>
|
457
|
+
|
458
|
+
<glide-core-menu-options>
|
459
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
460
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
461
|
+
</glide-core-menu-options>
|
462
|
+
</glide-core-menu>
|
463
|
+
`);
|
464
|
+
component.querySelector('button')?.click();
|
465
|
+
component.focus();
|
466
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
467
|
+
const options = component.querySelector('glide-core-menu-options');
|
468
|
+
links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
469
|
+
await sendKeys({ press: 'Home' });
|
470
|
+
expect(links[0].privateActive).to.be.true;
|
471
|
+
expect(links[1].privateActive).to.be.false;
|
472
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
|
473
|
+
});
|
474
|
+
it('activates the first option on PageUp', async () => {
|
475
|
+
const component = await fixture(html `
|
476
|
+
<glide-core-menu>
|
477
|
+
<button slot="target">Target</button>
|
478
|
+
|
479
|
+
<glide-core-menu-options>
|
480
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
481
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
482
|
+
</glide-core-menu-options>
|
483
|
+
</glide-core-menu>
|
484
|
+
`);
|
485
|
+
component.querySelector('button')?.click();
|
486
|
+
component.focus();
|
487
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
488
|
+
const options = component.querySelector('glide-core-menu-options');
|
489
|
+
links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
490
|
+
await sendKeys({ press: 'PageUp' });
|
491
|
+
expect(links[0].privateActive).to.be.true;
|
492
|
+
expect(links[1].privateActive).to.be.false;
|
493
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
|
494
|
+
});
|
495
|
+
it('activates the first option on ArrowUp + Meta', async () => {
|
496
|
+
const component = await fixture(html `
|
497
|
+
<glide-core-menu>
|
498
|
+
<button slot="target">Target</button>
|
499
|
+
|
500
|
+
<glide-core-menu-options>
|
501
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
502
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
503
|
+
</glide-core-menu-options>
|
504
|
+
</glide-core-menu>
|
505
|
+
`);
|
506
|
+
component.querySelector('button')?.click();
|
507
|
+
component.focus();
|
508
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
509
|
+
const options = component.querySelector('glide-core-menu-options');
|
510
|
+
links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
511
|
+
await sendKeys({ down: 'Meta' });
|
512
|
+
await sendKeys({ press: 'ArrowUp' });
|
513
|
+
expect(links[0].privateActive).to.be.true;
|
514
|
+
expect(links[1].privateActive).to.be.false;
|
515
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
|
516
|
+
});
|
517
|
+
it('activates the last option on End', async () => {
|
518
|
+
const component = await fixture(html `
|
519
|
+
<glide-core-menu>
|
520
|
+
<button slot="target">Target</button>
|
521
|
+
|
522
|
+
<glide-core-menu-options>
|
523
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
524
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
525
|
+
</glide-core-menu-options>
|
526
|
+
</glide-core-menu>
|
527
|
+
`);
|
528
|
+
component.querySelector('button')?.click();
|
529
|
+
component.focus();
|
530
|
+
await sendKeys({ press: 'End' });
|
531
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
532
|
+
const options = component.querySelector('glide-core-menu-options');
|
533
|
+
expect(links[0].privateActive).to.be.false;
|
534
|
+
expect(links[1].privateActive).to.be.true;
|
535
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
|
536
|
+
});
|
537
|
+
it('activates the last option on PageDown', async () => {
|
538
|
+
const component = await fixture(html `
|
539
|
+
<glide-core-menu>
|
540
|
+
<button slot="target">Target</button>
|
541
|
+
|
542
|
+
<glide-core-menu-options>
|
543
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
544
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
545
|
+
</glide-core-menu-options>
|
546
|
+
</glide-core-menu>
|
547
|
+
`);
|
548
|
+
component.querySelector('button')?.click();
|
549
|
+
component.focus();
|
550
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
551
|
+
const options = component.querySelector('glide-core-menu-options');
|
552
|
+
links[0].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
553
|
+
await sendKeys({ press: 'PageDown' });
|
554
|
+
expect(links[0].privateActive).to.be.false;
|
555
|
+
expect(links[1].privateActive).to.be.true;
|
556
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
|
557
|
+
});
|
558
|
+
it('activates the last option on Meta + ArrowDown', async () => {
|
559
|
+
const component = await fixture(html `
|
560
|
+
<glide-core-menu>
|
561
|
+
<button slot="target">Target</button>
|
562
|
+
|
563
|
+
<glide-core-menu-options>
|
564
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
565
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
566
|
+
</glide-core-menu-options>
|
567
|
+
</glide-core-menu>
|
568
|
+
`);
|
569
|
+
component.querySelector('button')?.click();
|
570
|
+
component.focus();
|
571
|
+
const links = component.querySelectorAll('glide-core-menu-link');
|
572
|
+
const options = component.querySelector('glide-core-menu-options');
|
573
|
+
links[0].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
574
|
+
await sendKeys({ down: 'Meta' });
|
575
|
+
await sendKeys({ press: 'ArrowDown' });
|
576
|
+
await sendKeys({ up: 'Meta' });
|
577
|
+
expect(links[0].privateActive).to.be.false;
|
578
|
+
expect(links[1].privateActive).to.be.true;
|
579
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
|
580
|
+
});
|
581
|
+
it('sets `aria-activedescendant` on open', async () => {
|
582
|
+
const component = await fixture(html `<glide-core-menu>
|
583
|
+
<button slot="target">Target</button>
|
584
|
+
|
585
|
+
<glide-core-menu-options>
|
586
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
587
|
+
</glide-core-menu-options>
|
588
|
+
</glide-core-menu>`);
|
589
|
+
component.querySelector('button')?.click();
|
590
|
+
await elementUpdated(component);
|
591
|
+
const link = component.querySelector('glide-core-menu-link');
|
592
|
+
const options = component.querySelector('glide-core-menu-options');
|
593
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
|
594
|
+
});
|
595
|
+
it('sets `aria-activedescendant` on close', async () => {
|
596
|
+
const component = await fixture(html `<glide-core-menu open>
|
597
|
+
<button slot="target">Target</button>
|
598
|
+
|
599
|
+
<glide-core-menu-options>
|
600
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
601
|
+
</glide-core-menu-options>
|
602
|
+
</glide-core-menu>`);
|
603
|
+
component.querySelector('button')?.click();
|
604
|
+
await elementUpdated(component);
|
605
|
+
const options = component.querySelector('glide-core-menu-options');
|
606
|
+
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
607
|
+
});
|
608
|
+
it('sets `aria-expanded` on open', async () => {
|
609
|
+
const component = await fixture(html `<glide-core-menu>
|
610
|
+
<button slot="target">Target</button>
|
611
|
+
|
612
|
+
<glide-core-menu-options>
|
613
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
614
|
+
</glide-core-menu-options>
|
615
|
+
</glide-core-menu>`);
|
616
|
+
component.querySelector('button')?.click();
|
617
|
+
const button = component.querySelector('button');
|
618
|
+
expect(button?.getAttribute('aria-expanded')).to.equal('true');
|
619
|
+
});
|
620
|
+
it('sets `aria-expanded` on close', async () => {
|
621
|
+
const component = await fixture(html `<glide-core-menu open>
|
622
|
+
<button slot="target">Target</button>
|
623
|
+
|
624
|
+
<glide-core-menu-options>
|
625
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
626
|
+
</glide-core-menu-options>
|
627
|
+
</glide-core-menu>`);
|
628
|
+
component.querySelector('button')?.click();
|
629
|
+
const button = component.querySelector('button');
|
630
|
+
expect(button?.getAttribute('aria-expanded')).to.equal('false');
|
631
|
+
});
|
632
|
+
it('does not wrap on ArrowUp', async () => {
|
633
|
+
const component = await fixture(html `
|
634
|
+
<glide-core-menu>
|
635
|
+
<button slot="target">Target</button>
|
636
|
+
|
637
|
+
<glide-core-menu-options>
|
638
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
639
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
640
|
+
</glide-core-menu-options>
|
641
|
+
</glide-core-menu>
|
642
|
+
`);
|
643
|
+
component.querySelector('button')?.click();
|
644
|
+
await sendKeys({ press: 'ArrowUp' });
|
645
|
+
const link = component.querySelector('glide-core-menu-link');
|
646
|
+
expect(link?.privateActive).to.be.true;
|
647
|
+
});
|
648
|
+
it('does not wrap on ArrowDown', async () => {
|
649
|
+
const component = await fixture(html `
|
650
|
+
<glide-core-menu>
|
651
|
+
<button slot="target">Target</button>
|
652
|
+
|
653
|
+
<glide-core-menu-options>
|
654
|
+
<glide-core-menu-link label="One"></glide-core-menu-link>
|
655
|
+
<glide-core-menu-link label="Two"></glide-core-menu-link>
|
656
|
+
</glide-core-menu-options>
|
657
|
+
</glide-core-menu>
|
658
|
+
`);
|
659
|
+
component.querySelector('button')?.click();
|
660
|
+
const options = component.querySelectorAll('glide-core-menu-link');
|
661
|
+
options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
662
|
+
await sendKeys({ press: 'ArrowDown' });
|
663
|
+
expect(options[1].privateActive).to.be.true;
|
664
|
+
});
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
var __decorate=this&&this.__decorate||function(t,e,o,l){var r,i=arguments.length,n=i<3?e:null===l?l=Object.getOwnPropertyDescriptor(e,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,o,l);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(n=(i<3?r(n):i>3?r(e,o,n):r(e,o))||n);return i>3&&n&&Object.defineProperty(e,o,n),n};import"./icon-button.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{owSlot}from"./library/ow.js";import styles from"./modal.icon-button.styles.js";let GlideCoreModalIconButton=class GlideCoreModalIconButton extends LitElement{constructor(){super(...arguments),this.label="",this.#t=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#t.value)}render(){return html`<glide-core-icon-button label="${ifDefined(this.label)}" variant="tertiary"><slot @slotchange="${this.#e}" ${ref(this.#t)}></slot></glide-core-icon-button>`}#t;#e(){owSlot(this.#t.value)}};__decorate([property()],GlideCoreModalIconButton.prototype,"label",void 0),GlideCoreModalIconButton=__decorate([customElement("glide-core-modal-icon-button")],GlideCoreModalIconButton);export default GlideCoreModalIconButton;
|