@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,196 @@
|
|
1
|
+
import './button.js';
|
2
|
+
import { ArgumentError } from 'ow';
|
3
|
+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
|
4
|
+
import GlideCoreButton from './button.js';
|
5
|
+
import sinon from 'sinon';
|
6
|
+
GlideCoreButton.shadowRootOptions.mode = 'open';
|
7
|
+
it('registers', async () => {
|
8
|
+
expect(window.customElements.get('glide-core-button')).to.equal(GlideCoreButton);
|
9
|
+
});
|
10
|
+
it('is accessible', async () => {
|
11
|
+
const component = await fixture(html `<glide-core-button>Button</glide-core-button>`);
|
12
|
+
await expect(component).to.be.accessible();
|
13
|
+
});
|
14
|
+
it('has defaults', async () => {
|
15
|
+
const component = await fixture(html `
|
16
|
+
<glide-core-button>Button</glide-core-button>
|
17
|
+
`);
|
18
|
+
expect(component.type).to.equal('button');
|
19
|
+
expect(component.disabled).to.equal(false);
|
20
|
+
expect(component.textContent).to.equal('Button');
|
21
|
+
const button = component.shadowRoot?.querySelector('button');
|
22
|
+
expect(button?.getAttribute('type')).to.equal('button');
|
23
|
+
expect(button?.disabled).to.equal(false);
|
24
|
+
expect([...button.classList]).to.deep.equal([
|
25
|
+
'component',
|
26
|
+
'primary',
|
27
|
+
'large',
|
28
|
+
]);
|
29
|
+
});
|
30
|
+
it('delegates focus', async () => {
|
31
|
+
const component = await fixture(html `<glide-core-button>Button</glide-core-button>`);
|
32
|
+
component.focus();
|
33
|
+
expect(component.shadowRoot?.activeElement).to.equal(component.shadowRoot?.querySelector('button'));
|
34
|
+
});
|
35
|
+
it('renders a secondary variant', async () => {
|
36
|
+
const component = await fixture(html `
|
37
|
+
<glide-core-button variant="secondary">Button</glide-core-button>
|
38
|
+
`);
|
39
|
+
expect([
|
40
|
+
...component.shadowRoot.querySelector('button').classList,
|
41
|
+
]).to.deep.equal(['component', 'secondary', 'large']);
|
42
|
+
});
|
43
|
+
it('renders a tertiary variant', async () => {
|
44
|
+
const component = await fixture(html `
|
45
|
+
<glide-core-button variant="tertiary">Button</glide-core-button>
|
46
|
+
`);
|
47
|
+
expect([
|
48
|
+
...component.shadowRoot.querySelector('button').classList,
|
49
|
+
]).to.deep.equal(['component', 'tertiary', 'large']);
|
50
|
+
});
|
51
|
+
it('sets the size to "large" by default', async () => {
|
52
|
+
const component = await fixture(html `
|
53
|
+
<glide-core-button>Button</glide-core-button>
|
54
|
+
`);
|
55
|
+
expect(component.size).to.equal('large');
|
56
|
+
expect([
|
57
|
+
...component.shadowRoot.querySelector('button').classList,
|
58
|
+
]).to.deep.equal(['component', 'primary', 'large']);
|
59
|
+
});
|
60
|
+
it('sets the size attribute to "large"', async () => {
|
61
|
+
const component = await fixture(html `
|
62
|
+
<glide-core-button size="large">Button</glide-core-button>
|
63
|
+
`);
|
64
|
+
expect(component.size).to.equal('large');
|
65
|
+
expect([
|
66
|
+
...component.shadowRoot.querySelector('button').classList,
|
67
|
+
]).to.deep.equal(['component', 'primary', 'large']);
|
68
|
+
});
|
69
|
+
it('sets the size attribute to "small"', async () => {
|
70
|
+
const component = await fixture(html `
|
71
|
+
<glide-core-button size="small">Button</glide-core-button>
|
72
|
+
`);
|
73
|
+
expect(component.size).to.equal('small');
|
74
|
+
expect([
|
75
|
+
...component.shadowRoot.querySelector('button').classList,
|
76
|
+
]).to.deep.equal(['component', 'primary', 'small']);
|
77
|
+
});
|
78
|
+
it('sets the disabled attribute', async () => {
|
79
|
+
const component = await fixture(html `
|
80
|
+
<glide-core-button disabled>Button</glide-core-button>
|
81
|
+
`);
|
82
|
+
expect(component.disabled).to.equal(true);
|
83
|
+
expect(component.shadowRoot.querySelector('button')?.disabled).to.equal(true);
|
84
|
+
});
|
85
|
+
it('sets the type attribute to "submit"', async () => {
|
86
|
+
const component = await fixture(html `
|
87
|
+
<glide-core-button type="submit">Button</glide-core-button>
|
88
|
+
`);
|
89
|
+
expect(component.type).to.equal('submit');
|
90
|
+
expect(component.shadowRoot.querySelector('button')?.getAttribute('type')).to.equal('submit');
|
91
|
+
});
|
92
|
+
it('sets the type attribute to "reset"', async () => {
|
93
|
+
const component = await fixture(html `
|
94
|
+
<glide-core-button type="reset">Button</glide-core-button>
|
95
|
+
`);
|
96
|
+
expect(component.type).to.equal('reset');
|
97
|
+
expect(component.shadowRoot?.querySelector('button')?.getAttribute('type')).to.equal('reset');
|
98
|
+
});
|
99
|
+
it('renders with a prefix slot', async () => {
|
100
|
+
const component = await fixture(html `
|
101
|
+
<glide-core-button>
|
102
|
+
<span slot="prefix" data-prefix>prefix</span>
|
103
|
+
Button
|
104
|
+
</glide-core-button>
|
105
|
+
`);
|
106
|
+
expect([
|
107
|
+
...component.shadowRoot.querySelector('button').classList,
|
108
|
+
]).to.deep.equal(['component', 'primary', 'large', 'has-prefix']);
|
109
|
+
expect(document.querySelector('[data-prefix]')).to.be.ok;
|
110
|
+
});
|
111
|
+
it('renders with a suffix slot', async () => {
|
112
|
+
const component = await fixture(html `
|
113
|
+
<glide-core-button>
|
114
|
+
Button
|
115
|
+
<span slot="suffix" data-suffix>suffix</span>
|
116
|
+
</glide-core-button>
|
117
|
+
`);
|
118
|
+
expect([
|
119
|
+
...component.shadowRoot.querySelector('button').classList,
|
120
|
+
]).to.deep.equal(['component', 'primary', 'large', 'has-suffix']);
|
121
|
+
expect(document.querySelector('[data-suffix]')).to.be.ok;
|
122
|
+
});
|
123
|
+
it('renders with a prefix and suffix slot when both are present initially', async () => {
|
124
|
+
const component = await fixture(html `
|
125
|
+
<glide-core-button>
|
126
|
+
<span slot="prefix" data-prefix>prefix</span>
|
127
|
+
Button
|
128
|
+
<span slot="suffix" data-suffix>suffix</span>
|
129
|
+
</glide-core-button>
|
130
|
+
`);
|
131
|
+
expect([
|
132
|
+
...component.shadowRoot.querySelector('button').classList,
|
133
|
+
]).to.deep.equal([
|
134
|
+
'component',
|
135
|
+
'primary',
|
136
|
+
'large',
|
137
|
+
'has-prefix',
|
138
|
+
'has-suffix',
|
139
|
+
]);
|
140
|
+
expect(document.querySelector('[data-prefix]')).to.be.ok;
|
141
|
+
expect(document.querySelector('[data-suffix]')).to.be.ok;
|
142
|
+
});
|
143
|
+
it('renders with prefix and suffix classes when both are dynamically added', async () => {
|
144
|
+
const component = await fixture(html `
|
145
|
+
<glide-core-button>Button</glide-core-button>
|
146
|
+
`);
|
147
|
+
const prefix = document.createElement('span');
|
148
|
+
prefix.setAttribute('slot', 'prefix');
|
149
|
+
prefix.dataset.prefix = undefined;
|
150
|
+
prefix.textContent = 'prefix';
|
151
|
+
component.append(prefix);
|
152
|
+
const suffix = document.createElement('span');
|
153
|
+
suffix.setAttribute('slot', 'suffix');
|
154
|
+
prefix.dataset.suffix = undefined;
|
155
|
+
suffix.textContent = 'suffix';
|
156
|
+
component.append(suffix);
|
157
|
+
await elementUpdated(component);
|
158
|
+
expect([
|
159
|
+
...component.shadowRoot.querySelector('button').classList,
|
160
|
+
]).to.deep.equal([
|
161
|
+
'component',
|
162
|
+
'primary',
|
163
|
+
'large',
|
164
|
+
'has-prefix',
|
165
|
+
'has-suffix',
|
166
|
+
]);
|
167
|
+
expect(document.querySelector('[data-prefix]')).to.be.ok;
|
168
|
+
expect(document.querySelector('[data-suffix]')).to.be.ok;
|
169
|
+
});
|
170
|
+
it('renders without prefix and suffix classes after both are removed', async () => {
|
171
|
+
const component = await fixture(html `
|
172
|
+
<glide-core-button>
|
173
|
+
<span slot="prefix">prefix</span>
|
174
|
+
Button
|
175
|
+
<span slot="suffix">suffix</span>
|
176
|
+
</glide-core-button>
|
177
|
+
`);
|
178
|
+
component.querySelector('[slot="prefix"]')?.remove();
|
179
|
+
component.querySelector('[slot="suffix"]')?.remove();
|
180
|
+
await elementUpdated(component);
|
181
|
+
expect([
|
182
|
+
...component.shadowRoot.querySelector('button').classList,
|
183
|
+
]).to.deep.equal(['component', 'primary', 'large']);
|
184
|
+
});
|
185
|
+
it('throws if it does not have a default slot', async () => {
|
186
|
+
const spy = sinon.spy();
|
187
|
+
try {
|
188
|
+
await fixture(html `<glide-core-button></glide-core-button>`);
|
189
|
+
}
|
190
|
+
catch (error) {
|
191
|
+
if (error instanceof ArgumentError) {
|
192
|
+
spy();
|
193
|
+
}
|
194
|
+
}
|
195
|
+
expect(spy.called).to.be.true;
|
196
|
+
});
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import './button.js';
|
2
|
+
import { expect, fixture, html, oneEvent } from '@open-wc/testing';
|
3
|
+
import { sendKeys } from '@web/test-runner-commands';
|
4
|
+
import GlideCoreButton from './button.js';
|
5
|
+
GlideCoreButton.shadowRootOptions.mode = 'open';
|
6
|
+
it('dispatches an event when clicked and type="button"', async () => {
|
7
|
+
const component = await fixture(html `
|
8
|
+
<glide-core-button type="button">Button</glide-core-button>
|
9
|
+
`);
|
10
|
+
const clickEvent = oneEvent(component, 'click');
|
11
|
+
component.shadowRoot?.querySelector('button')?.click();
|
12
|
+
const event = await clickEvent;
|
13
|
+
expect(event instanceof Event).to.be.true;
|
14
|
+
});
|
15
|
+
it('dispatches an event when hitting "enter" and type="button"', async () => {
|
16
|
+
const component = await fixture(html `
|
17
|
+
<glide-core-button type="button">Button</glide-core-button>
|
18
|
+
`);
|
19
|
+
const keyDownEvent = oneEvent(component, 'keydown');
|
20
|
+
component.focus();
|
21
|
+
await sendKeys({ press: 'Enter' });
|
22
|
+
const event = await keyDownEvent;
|
23
|
+
expect(event instanceof Event).to.be.true;
|
24
|
+
expect(event.key).to.equal('Enter');
|
25
|
+
});
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import './button.js';
|
2
|
+
import { expect, fixture, html, oneEvent } from '@open-wc/testing';
|
3
|
+
import { sendKeys } from '@web/test-runner-commands';
|
4
|
+
import GlideCoreButton from './button.js';
|
5
|
+
GlideCoreButton.shadowRootOptions.mode = 'open';
|
6
|
+
it('participates in a form when type="reset"', async () => {
|
7
|
+
const form = document.createElement('form');
|
8
|
+
const component = await fixture(html ` <glide-core-button type="reset">Button</glide-core-button> `, {
|
9
|
+
parentNode: form,
|
10
|
+
});
|
11
|
+
const formResetEvent = oneEvent(form, 'reset');
|
12
|
+
component.shadowRoot?.querySelector('button')?.click();
|
13
|
+
const event = await formResetEvent;
|
14
|
+
expect(event instanceof Event).to.be.true;
|
15
|
+
});
|
16
|
+
it('participates in a form when hitting "enter" and type="reset"', async () => {
|
17
|
+
const form = document.createElement('form');
|
18
|
+
const component = await fixture(html ` <glide-core-button type="reset">Button</glide-core-button> `, {
|
19
|
+
parentNode: form,
|
20
|
+
});
|
21
|
+
const formResetEvent = oneEvent(form, 'reset');
|
22
|
+
component.focus();
|
23
|
+
await sendKeys({ press: 'Enter' });
|
24
|
+
const event = await formResetEvent;
|
25
|
+
expect(event instanceof Event).to.be.true;
|
26
|
+
});
|
27
|
+
it('participates in a form when type="submit"', async () => {
|
28
|
+
const form = document.createElement('form');
|
29
|
+
const component = await fixture(html ` <glide-core-button type="submit">Button</glide-core-button> `, {
|
30
|
+
parentNode: form,
|
31
|
+
});
|
32
|
+
form.addEventListener('submit', (event) => event.preventDefault());
|
33
|
+
const formSubmitEvent = oneEvent(form, 'submit');
|
34
|
+
component.shadowRoot?.querySelector('button')?.click();
|
35
|
+
const event = await formSubmitEvent;
|
36
|
+
expect(event instanceof Event).to.be.true;
|
37
|
+
});
|
38
|
+
it('participates in a form when hitting "enter" and type="submit"', async () => {
|
39
|
+
const form = document.createElement('form');
|
40
|
+
const component = await fixture(html ` <glide-core-button type="submit">Button</glide-core-button> `, {
|
41
|
+
parentNode: form,
|
42
|
+
});
|
43
|
+
form.addEventListener('submit', (event) => event.preventDefault());
|
44
|
+
const formSubmitEvent = oneEvent(form, 'submit');
|
45
|
+
component.focus();
|
46
|
+
await sendKeys({ press: 'Enter' });
|
47
|
+
const event = await formSubmitEvent;
|
48
|
+
expect(event instanceof Event).to.be.true;
|
49
|
+
});
|
package/dist/checkbox-group.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,i,o){var r,l=arguments.length,s=l<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,o);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(l<3?r(s):l>3?r(t,i,s):r(t,i))||s);return l>3&&s&&Object.defineProperty(t,i,s),s};import"./label.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import GlideCoreCheckbox from"./checkbox.js";import styles from"./checkbox-group.styles.js";let GlideCoreCheckboxGroup=class GlideCoreCheckboxGroup extends LitElement{static{this.formAssociated=!0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}get disabled(){return this.#e}set disabled(e){this.#e=e;for(const t of this.#t)t.disabled=e}get required(){return this.#i}set required(e){this.#i=e;for(const t of this.#t)e?t.setValidity(this.#o.validity," "):t.setValidity({}),t.requestUpdate()}checkValidity(){return this.isCheckingValidity=!0,this.#o.checkValidity()}disconnectedCallback(){super.disconnectedCallback(),this.form?.removeEventListener("formdata",this.#r)}firstUpdated(){if(owSlot(this.#l.value),owSlotType(this.#l.value,[GlideCoreCheckbox]),this.disabled)for(const e of this.#t)e.disabled=!0;this.value=this.#t.filter((({checked:e,disabled:t})=>e&&!t)).map((({value:e})=>e)).filter((e=>Boolean(e)));for(const e of this.#t)e.privateVariant="minimal"}get form(){return this.#o.form}get validity(){const e=this.#t.some((({checked:e})=>e));this.required&&!e?this.#o.setValidity({valueMissing:!0}," ",this.#s.value):this.#o.setValidity({});for(const e of this.#t)e.setValidity(this.#o.validity," "),e.requestUpdate();return this.#o.validity}get willValidate(){return this.#o.willValidate}focus(e){this.#t.at(0)?.focus(e)}formAssociatedCallback(){this.form?.addEventListener("formdata",this.#r)}formResetCallback(){for(const e of this.#t)e.formResetCallback()}render(){return html`<div class="component" data-test="component" ${ref(this.#s)}><glide-core-label ?hide="${this.hideLabel}" ?disabled="${this.disabled}" ?error="${this.#a}" ?required="${this.required}"><slot name="tooltip" slot="tooltip"></slot><label id="label">${this.label}</label><div aria-labelledby="label description" role="group" slot="control"><slot class="checkboxes" @change="${this.#d}" @slotchange="${this.#c}" ${ref(this.#l)}></slot></div><slot id="description" name="description" slot="description"></slot></glide-core-label></div>`}reportValidity(){return this.#o.reportValidity()}constructor(){super(),this.hideLabel=!1,this.value=[],this.isCheckingValidity=!1,this.isReportValidityOrSubmit=!1,this.#s=createRef(),this.#l=createRef(),this.#e=!1,this.#i=!1,this.#r=({formData:e})=>{this.name&&this.value.length>0&&!this.disabled&&e.append(this.name,JSON.stringify(this.value))},this.#o=this.attachInternals(),this.addEventListener("invalid",(e=>{e?.preventDefault(),this.isCheckingValidity||(this.isReportValidityOrSubmit=!0,this.focus())}))}#s;#l;#o;#e;#i;get#t(){return this.#l.value?this.#l.value.assignedElements().filter((e=>e instanceof GlideCoreCheckbox)):[]}#r;get#a(){return this.required&&!this.disabled&&!this.validity.valid&&this.isReportValidityOrSubmit}#d(){this.value=this.#t.filter((({checked:e,disabled:t})=>e&&!t)).map((({value:e})=>e)).filter((e=>Boolean(e)))}#c(){owSlot(this.#l.value),owSlotType(this.#l.value,[GlideCoreCheckbox])}};__decorate([property({reflect:!0,type:Boolean})],GlideCoreCheckboxGroup.prototype,"disabled",null),__decorate([property({attribute:"hide-label",type:Boolean})],GlideCoreCheckboxGroup.prototype,"hideLabel",void 0),__decorate([property({reflect:!0})],GlideCoreCheckboxGroup.prototype,"label",void 0),__decorate([property({reflect:!0})],GlideCoreCheckboxGroup.prototype,"name",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreCheckboxGroup.prototype,"required",null),__decorate([property({reflect:!0})],GlideCoreCheckboxGroup.prototype,"summary",void 0),__decorate([property({type:Array})],GlideCoreCheckboxGroup.prototype,"value",void 0),__decorate([state()],GlideCoreCheckboxGroup.prototype,"isCheckingValidity",void 0),__decorate([state()],GlideCoreCheckboxGroup.prototype,"isReportValidityOrSubmit",void 0),GlideCoreCheckboxGroup=__decorate([customElement("glide-core-checkbox-group")],GlideCoreCheckboxGroup);export default GlideCoreCheckboxGroup;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
import{css}from"lit";export default[css`
|
2
2
|
:host(:not(:disabled)) .component {
|
3
3
|
&.error {
|
4
4
|
.checkbox {
|
@@ -17,4 +17,4 @@
|
|
17
17
|
grid-column: 2;
|
18
18
|
row-gap: var(--glide-core-spacing-xxs);
|
19
19
|
}
|
20
|
-
`];
|
20
|
+
`];
|
@@ -0,0 +1,119 @@
|
|
1
|
+
import './checkbox.js';
|
2
|
+
import { ArgumentError } from 'ow';
|
3
|
+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
|
4
|
+
import GlideCoreCheckboxGroup from './checkbox-group.js';
|
5
|
+
import expectArgumentError from './library/expect-argument-error.js';
|
6
|
+
import sinon from 'sinon';
|
7
|
+
GlideCoreCheckboxGroup.shadowRootOptions.mode = 'open';
|
8
|
+
it('registers', async () => {
|
9
|
+
expect(window.customElements.get('glide-core-checkbox-group')).to.equal(GlideCoreCheckboxGroup);
|
10
|
+
});
|
11
|
+
it('has defaults', async () => {
|
12
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
13
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
14
|
+
</glide-core-checkbox-group>`);
|
15
|
+
expect(component.hasAttribute('disabled')).to.be.false;
|
16
|
+
expect(component.disabled).to.be.false;
|
17
|
+
expect(component.hasAttribute('hide-label')).to.be.false;
|
18
|
+
expect(component.hideLabel).to.be.false;
|
19
|
+
expect(component.getAttribute('name')).to.be.null;
|
20
|
+
expect(component.name).to.equal(undefined);
|
21
|
+
expect(component.hasAttribute('required')).to.be.false;
|
22
|
+
expect(component.required).to.be.false;
|
23
|
+
// Not reflected, so no attribute assertion is necessary.
|
24
|
+
expect(component.value).to.deep.equal([]);
|
25
|
+
});
|
26
|
+
it('is accessible', async () => {
|
27
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
28
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
29
|
+
<div slot="tooltip">Tooltip</div>
|
30
|
+
<div slot="description">Description</div>
|
31
|
+
</glide-core-checkbox-group>`);
|
32
|
+
await expect(component).to.be.accessible();
|
33
|
+
});
|
34
|
+
it('can have a label', async () => {
|
35
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
36
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
37
|
+
</glide-core-checkbox-group>`);
|
38
|
+
expect(component.getAttribute('label')).to.equal('Checkbox Group');
|
39
|
+
expect(component.label).to.equal('Checkbox Group');
|
40
|
+
});
|
41
|
+
it('can have a description', async () => {
|
42
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
43
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
44
|
+
<div slot="description">Description</div>
|
45
|
+
</glide-core-checkbox-group>`);
|
46
|
+
const assignedElements = component.shadowRoot
|
47
|
+
?.querySelector('slot[name="description"]')
|
48
|
+
?.assignedElements();
|
49
|
+
expect(assignedElements?.at(0)?.textContent).to.equal('Description');
|
50
|
+
});
|
51
|
+
it('can have a name', async () => {
|
52
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" name="name">
|
53
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
54
|
+
</glide-core-checkbox-group>`);
|
55
|
+
expect(component.getAttribute('name')).to.equal('name');
|
56
|
+
expect(component.name).to.equal('name');
|
57
|
+
});
|
58
|
+
it('can have a tooltip', async () => {
|
59
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
60
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
61
|
+
<div slot="tooltip">Tooltip</div>
|
62
|
+
</glide-core-checkbox-group>`);
|
63
|
+
const assignedElements = component.shadowRoot
|
64
|
+
?.querySelector('slot[name="tooltip"]')
|
65
|
+
?.assignedElements();
|
66
|
+
expect(assignedElements?.at(0)?.textContent).to.equal('Tooltip');
|
67
|
+
});
|
68
|
+
it('can be disabled initially', async () => {
|
69
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" disabled>
|
70
|
+
<glide-core-checkbox label="One"></glide-core-checkbox>
|
71
|
+
<glide-core-checkbox label="Two"></glide-core-checkbox>
|
72
|
+
</glide-core-checkbox-group>`);
|
73
|
+
const checkboxes = component.querySelectorAll('glide-core-checkbox');
|
74
|
+
expect(checkboxes[0].disabled).to.equal(true);
|
75
|
+
expect(checkboxes[1].disabled).to.equal(true);
|
76
|
+
expect(component.hasAttribute('disabled')).to.be.true;
|
77
|
+
expect(component.disabled).to.equal(true);
|
78
|
+
});
|
79
|
+
it('can be disabled dynamically', async () => {
|
80
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
81
|
+
<glide-core-checkbox label="One"></glide-core-checkbox>
|
82
|
+
<glide-core-checkbox label="Two"></glide-core-checkbox>
|
83
|
+
</glide-core-checkbox-group>`);
|
84
|
+
component.disabled = true;
|
85
|
+
await elementUpdated(component);
|
86
|
+
const checkboxes = component.querySelectorAll('glide-core-checkbox');
|
87
|
+
expect(checkboxes[0].disabled).to.equal(true);
|
88
|
+
expect(checkboxes[1].disabled).to.equal(true);
|
89
|
+
expect(component.hasAttribute('disabled')).to.be.true;
|
90
|
+
expect(component.disabled).to.equal(true);
|
91
|
+
});
|
92
|
+
it('can be required', async () => {
|
93
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
94
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
95
|
+
</glide-core-checkbox-group>`);
|
96
|
+
expect(component.hasAttribute('required')).to.be.true;
|
97
|
+
expect(component.required).to.equal(true);
|
98
|
+
});
|
99
|
+
it('throws if it does not have a default slot', async () => {
|
100
|
+
const spy = sinon.spy();
|
101
|
+
try {
|
102
|
+
await fixture(html `<glide-core-checkbox-group
|
103
|
+
label="Checkbox Group"
|
104
|
+
></glide-core-checkbox-group>`);
|
105
|
+
}
|
106
|
+
catch (error) {
|
107
|
+
if (error instanceof ArgumentError) {
|
108
|
+
spy();
|
109
|
+
}
|
110
|
+
}
|
111
|
+
expect(spy.called).to.be.true;
|
112
|
+
});
|
113
|
+
it('throws if the default slot is the incorrect type', async () => {
|
114
|
+
await expectArgumentError(() => {
|
115
|
+
return fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
116
|
+
<button>Button</button>
|
117
|
+
</glide-core-checkbox-group>`);
|
118
|
+
});
|
119
|
+
});
|
@@ -0,0 +1,110 @@
|
|
1
|
+
import './checkbox.js';
|
2
|
+
import * as sinon from 'sinon';
|
3
|
+
import { aTimeout, expect, fixture, html, oneEvent } from '@open-wc/testing';
|
4
|
+
import GlideCoreCheckboxGroup from './checkbox-group.js';
|
5
|
+
GlideCoreCheckboxGroup.shadowRootOptions.mode = 'open';
|
6
|
+
// `await aTimeout(0)` is used throughout. Using `oneEvent` instead and
|
7
|
+
// expecting it to throw would work. But it wouldn't throw until its
|
8
|
+
// timeout, which would make for a slow test. Its timeout can likely be
|
9
|
+
// configured. But waiting a turn of the event loop, after which the event
|
10
|
+
// will have been dispatched, gets the job done as well.
|
11
|
+
it('dispatches a "click" event when clicked', async () => {
|
12
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
13
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
14
|
+
</glide-core-checkbox-group>`);
|
15
|
+
setTimeout(() => component.click());
|
16
|
+
const event = await oneEvent(component, 'click');
|
17
|
+
expect(event instanceof PointerEvent).to.be.true;
|
18
|
+
expect(event.bubbles).to.be.true;
|
19
|
+
});
|
20
|
+
it('dispatches a "change" event when clicked', async () => {
|
21
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
22
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
23
|
+
</glide-core-checkbox-group>`);
|
24
|
+
const checkbox = component.querySelector('glide-core-checkbox');
|
25
|
+
setTimeout(() => checkbox?.click());
|
26
|
+
const event = await oneEvent(component, 'change');
|
27
|
+
expect(event instanceof Event).to.be.true;
|
28
|
+
expect(event.bubbles).to.be.true;
|
29
|
+
});
|
30
|
+
it('dispatches an "input" event when clicked', async () => {
|
31
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
32
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
33
|
+
</glide-core-checkbox-group>`);
|
34
|
+
const checkbox = component.querySelector('glide-core-checkbox');
|
35
|
+
setTimeout(() => checkbox?.click());
|
36
|
+
const event = await oneEvent(component, 'input');
|
37
|
+
expect(event instanceof Event).to.be.true;
|
38
|
+
expect(event.bubbles).to.be.true;
|
39
|
+
});
|
40
|
+
it('dispatches an "invalid" event on submit when required and the checkbox is unchecked', async () => {
|
41
|
+
const form = document.createElement('form');
|
42
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
43
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
44
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
45
|
+
setTimeout(() => form.requestSubmit());
|
46
|
+
const event = await oneEvent(component, 'invalid');
|
47
|
+
expect(event instanceof Event).to.be.true;
|
48
|
+
});
|
49
|
+
it('dispatches an "invalid" event after `checkValidity` is called when required and the checkbox is unchecked', async () => {
|
50
|
+
const form = document.createElement('form');
|
51
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
52
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
53
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
54
|
+
setTimeout(() => component.checkValidity());
|
55
|
+
const event = await oneEvent(component, 'invalid');
|
56
|
+
expect(event instanceof Event).to.be.true;
|
57
|
+
});
|
58
|
+
it('dispatches an "invalid" event after `reportValidity` is called when required and the checkbox is unchecked', async () => {
|
59
|
+
const form = document.createElement('form');
|
60
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
61
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
62
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
63
|
+
setTimeout(() => component.reportValidity());
|
64
|
+
const event = await oneEvent(component, 'invalid');
|
65
|
+
expect(event instanceof Event).to.be.true;
|
66
|
+
});
|
67
|
+
it('does not dispatch an "invalid" event after `checkValidity` is called when not required', async () => {
|
68
|
+
const form = document.createElement('form');
|
69
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
70
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
71
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
72
|
+
const spy = sinon.spy();
|
73
|
+
component.addEventListener('invalid', spy);
|
74
|
+
component.checkValidity();
|
75
|
+
await aTimeout(0);
|
76
|
+
expect(spy.notCalled).to.be.true;
|
77
|
+
});
|
78
|
+
it('does not dispatch an "invalid" event after `checkValidity` is called when disabled but required and the checkbox is unchecked', async () => {
|
79
|
+
const form = document.createElement('form');
|
80
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" disabled required>
|
81
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
82
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
83
|
+
const spy = sinon.spy();
|
84
|
+
component.addEventListener('invalid', spy);
|
85
|
+
component.checkValidity();
|
86
|
+
await aTimeout(0);
|
87
|
+
expect(spy.notCalled).to.be.true;
|
88
|
+
});
|
89
|
+
it('does not dispatch an "invalid" event when `reportValidity` is called when not required,', async () => {
|
90
|
+
const form = document.createElement('form');
|
91
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
92
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
93
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
94
|
+
const spy = sinon.spy();
|
95
|
+
component.addEventListener('invalid', spy);
|
96
|
+
component.reportValidity();
|
97
|
+
await aTimeout(0);
|
98
|
+
expect(spy.notCalled).to.be.true;
|
99
|
+
});
|
100
|
+
it('does not dispatch an "invalid" event when `reportValidity` is called when disabled but required and the checkbox is unchecked', async () => {
|
101
|
+
const form = document.createElement('form');
|
102
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" disabled required>
|
103
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
104
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
105
|
+
const spy = sinon.spy();
|
106
|
+
component.addEventListener('invalid', spy);
|
107
|
+
component.reportValidity();
|
108
|
+
await aTimeout(0);
|
109
|
+
expect(spy.notCalled).to.be.true;
|
110
|
+
});
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import './checkbox.js';
|
2
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreCheckboxGroup from './checkbox-group.js';
|
4
|
+
GlideCoreCheckboxGroup.shadowRootOptions.mode = 'open';
|
5
|
+
it('focuses the first checkbox when `focus` is called', async () => {
|
6
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
7
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
8
|
+
</glide-core-checkbox-group>`);
|
9
|
+
component.focus();
|
10
|
+
expect(document.activeElement).to.equal(component.querySelector('glide-core-checkbox'));
|
11
|
+
});
|
12
|
+
it('focuses the first checkbox after submit when required but the checkbox is unchecked', async () => {
|
13
|
+
const form = document.createElement('form');
|
14
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
15
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
16
|
+
</glide-core-checkbox-group>`, {
|
17
|
+
parentNode: form,
|
18
|
+
});
|
19
|
+
form.requestSubmit();
|
20
|
+
expect(document.activeElement).to.equal(component.querySelector('glide-core-checkbox'));
|
21
|
+
});
|
22
|
+
it('focuses the first checkbox after `reportValidity` is called when required but the checkbox is unchecked', async () => {
|
23
|
+
const form = document.createElement('form');
|
24
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
25
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
26
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
27
|
+
component.reportValidity();
|
28
|
+
expect(document.activeElement).to.equal(component.querySelector('glide-core-checkbox'));
|
29
|
+
});
|
30
|
+
it('focuses the first checkbox after `requestSubmit` is called when required but the checkbox is unchecked', async () => {
|
31
|
+
const form = document.createElement('form');
|
32
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
33
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
34
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
35
|
+
form.requestSubmit();
|
36
|
+
expect(document.activeElement).to.equal(component.querySelector('glide-core-checkbox'));
|
37
|
+
});
|
38
|
+
it('does not focus the input after `checkValidity` is called', async () => {
|
39
|
+
const form = document.createElement('form');
|
40
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group" required>
|
41
|
+
<glide-core-checkbox label="Checkbox"></glide-core-checkbox>
|
42
|
+
</glide-core-checkbox-group>`, { parentNode: form });
|
43
|
+
component.checkValidity();
|
44
|
+
expect(document.activeElement).to.not.equal(component.querySelector('glide-core-checkbox'));
|
45
|
+
});
|