@crowdstrike/glide-core 0.5.1 → 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 -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.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 +87 -0
- package/dist/dropdown.option.test.interactions.single.js +22 -0
- package/dist/dropdown.styles.js +25 -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 +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 +6 -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 +18 -16
- /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,204 @@
|
|
1
|
+
import './textarea.js';
|
2
|
+
import * as sinon from 'sinon';
|
3
|
+
import { aTimeout, expect, fixture, oneEvent } from '@open-wc/testing';
|
4
|
+
import { sendKeys } from '@web/test-runner-commands';
|
5
|
+
it('dispatches a `input` event when typed in', async () => {
|
6
|
+
const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
|
7
|
+
const textarea = await fixture(template);
|
8
|
+
setTimeout(async () => {
|
9
|
+
textarea.focus();
|
10
|
+
await sendKeys({ type: 'testing' });
|
11
|
+
textarea.blur();
|
12
|
+
});
|
13
|
+
const event = await oneEvent(textarea, 'input');
|
14
|
+
expect(event instanceof Event).to.be.true;
|
15
|
+
expect(event.bubbles).to.be.true;
|
16
|
+
});
|
17
|
+
it('dispatches an `change` event when typed in', async () => {
|
18
|
+
const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
|
19
|
+
const textarea = await fixture(template);
|
20
|
+
setTimeout(async () => {
|
21
|
+
textarea.focus();
|
22
|
+
await sendKeys({ type: 'testing' });
|
23
|
+
textarea.blur();
|
24
|
+
});
|
25
|
+
const event = await oneEvent(textarea, 'change');
|
26
|
+
expect(event instanceof Event).to.be.true;
|
27
|
+
expect(event.bubbles).to.be.true;
|
28
|
+
});
|
29
|
+
it('dispatches an `invalid` event on submit when required and no value', async () => {
|
30
|
+
const form = document.createElement('form');
|
31
|
+
const template = `<glide-core-textarea label="label" required></glide-core-textarea>`;
|
32
|
+
const textarea = await fixture(template, {
|
33
|
+
parentNode: form,
|
34
|
+
});
|
35
|
+
setTimeout(() => form.requestSubmit());
|
36
|
+
const event = await oneEvent(textarea, 'invalid');
|
37
|
+
expect(event instanceof Event).to.be.true;
|
38
|
+
});
|
39
|
+
it('dispatches an `invalid` event after `checkValidity` is called when required and no value', async () => {
|
40
|
+
const form = document.createElement('form');
|
41
|
+
const template = `<glide-core-textarea label="label" required></glide-core-textarea>`;
|
42
|
+
const textarea = await fixture(template, {
|
43
|
+
parentNode: form,
|
44
|
+
});
|
45
|
+
setTimeout(() => textarea.checkValidity());
|
46
|
+
const event = await oneEvent(textarea, 'invalid');
|
47
|
+
expect(event instanceof Event).to.be.true;
|
48
|
+
});
|
49
|
+
it('dispatches an `invalid` event after `reportValidity` is called when required and no value', async () => {
|
50
|
+
const form = document.createElement('form');
|
51
|
+
const template = `<glide-core-textarea label="label" required></glide-core-textarea>`;
|
52
|
+
const textarea = await fixture(template, {
|
53
|
+
parentNode: form,
|
54
|
+
});
|
55
|
+
setTimeout(() => textarea.reportValidity());
|
56
|
+
const event = await oneEvent(textarea, 'invalid');
|
57
|
+
expect(event instanceof Event).to.be.true;
|
58
|
+
});
|
59
|
+
it('does not dispatch an `invalid` event after `checkValidity` is called when not required', async () => {
|
60
|
+
const form = document.createElement('form');
|
61
|
+
const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
|
62
|
+
const textarea = await fixture(template, {
|
63
|
+
parentNode: form,
|
64
|
+
});
|
65
|
+
const spy = sinon.spy();
|
66
|
+
textarea.addEventListener('invalid', spy);
|
67
|
+
textarea.checkValidity();
|
68
|
+
await aTimeout(0);
|
69
|
+
expect(spy.notCalled).to.be.true;
|
70
|
+
});
|
71
|
+
it('does not dispatch an `invalid` event after `checkValidity` is called when required, no value, and disabled', async () => {
|
72
|
+
const form = document.createElement('form');
|
73
|
+
const template = `<glide-core-textarea label="label" required disabled></glide-core-textarea>`;
|
74
|
+
const textarea = await fixture(template, {
|
75
|
+
parentNode: form,
|
76
|
+
});
|
77
|
+
const spy = sinon.spy();
|
78
|
+
textarea.addEventListener('invalid', spy);
|
79
|
+
textarea.checkValidity();
|
80
|
+
await aTimeout(0);
|
81
|
+
expect(spy.notCalled).to.be.true;
|
82
|
+
});
|
83
|
+
it('does not dispatch an `invalid` event when `reportValidity` is called when not required,', async () => {
|
84
|
+
const form = document.createElement('form');
|
85
|
+
const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
|
86
|
+
const textarea = await fixture(template, {
|
87
|
+
parentNode: form,
|
88
|
+
});
|
89
|
+
const spy = sinon.spy();
|
90
|
+
textarea.addEventListener('invalid', spy);
|
91
|
+
textarea.reportValidity();
|
92
|
+
await aTimeout(0);
|
93
|
+
expect(spy.notCalled).to.be.true;
|
94
|
+
});
|
95
|
+
it('does not dispatch an `invalid` event when `reportValidity` is called when required, no value, and disabled', async () => {
|
96
|
+
const form = document.createElement('form');
|
97
|
+
const template = `<glide-core-textarea label="label" required disabled></glide-core-textarea>`;
|
98
|
+
const textarea = await fixture(template, {
|
99
|
+
parentNode: form,
|
100
|
+
});
|
101
|
+
const spy = sinon.spy();
|
102
|
+
textarea.addEventListener('invalid', spy);
|
103
|
+
textarea.reportValidity();
|
104
|
+
await aTimeout(0);
|
105
|
+
expect(spy.notCalled).to.be.true;
|
106
|
+
});
|
107
|
+
it('dispatches an `invalid` event after `requestSubmit` is called when `maxlength` exceeded', async () => {
|
108
|
+
const form = document.createElement('form');
|
109
|
+
const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
|
110
|
+
const textarea = await fixture(template, {
|
111
|
+
parentNode: form,
|
112
|
+
});
|
113
|
+
setTimeout(async () => {
|
114
|
+
textarea.focus();
|
115
|
+
await sendKeys({ type: 'testing' });
|
116
|
+
form.requestSubmit();
|
117
|
+
});
|
118
|
+
const event = await oneEvent(textarea, 'invalid');
|
119
|
+
expect(event instanceof Event).to.be.true;
|
120
|
+
});
|
121
|
+
it('dispatches an `invalid` event after `checkValidity` is called when `maxlength` exceeded', async () => {
|
122
|
+
const form = document.createElement('form');
|
123
|
+
const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
|
124
|
+
const textarea = await fixture(template, {
|
125
|
+
parentNode: form,
|
126
|
+
});
|
127
|
+
setTimeout(async () => {
|
128
|
+
textarea.focus();
|
129
|
+
await sendKeys({ type: 'testing' });
|
130
|
+
textarea.checkValidity();
|
131
|
+
});
|
132
|
+
const event = await oneEvent(textarea, 'invalid');
|
133
|
+
expect(event instanceof Event).to.be.true;
|
134
|
+
});
|
135
|
+
it('dispatches an `invalid` event after `reportValidity` is called when `maxlength` exceeded', async () => {
|
136
|
+
const form = document.createElement('form');
|
137
|
+
const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
|
138
|
+
const textarea = await fixture(template, {
|
139
|
+
parentNode: form,
|
140
|
+
});
|
141
|
+
setTimeout(async () => {
|
142
|
+
textarea.focus();
|
143
|
+
await sendKeys({ type: 'testing' });
|
144
|
+
textarea.reportValidity();
|
145
|
+
});
|
146
|
+
const event = await oneEvent(textarea, 'invalid');
|
147
|
+
expect(event instanceof Event).to.be.true;
|
148
|
+
});
|
149
|
+
it('does not dispatch an `invalid` event after `checkValidity` is called when `maxlength` not exceeded', async () => {
|
150
|
+
const form = document.createElement('form');
|
151
|
+
const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
|
152
|
+
const textarea = await fixture(template, {
|
153
|
+
parentNode: form,
|
154
|
+
});
|
155
|
+
const spy = sinon.spy();
|
156
|
+
textarea.addEventListener('invalid', spy);
|
157
|
+
textarea.focus();
|
158
|
+
await sendKeys({ type: 'ab' });
|
159
|
+
textarea.checkValidity();
|
160
|
+
await aTimeout(0);
|
161
|
+
expect(spy.notCalled).to.be.true;
|
162
|
+
});
|
163
|
+
it('does not dispatch an `invalid` event after `checkValidity` is called when `maxlength` exceeded and disabled', async () => {
|
164
|
+
const form = document.createElement('form');
|
165
|
+
const template = `<glide-core-textarea label="label" maxlength="3" disabled></glide-core-textarea>`;
|
166
|
+
const textarea = await fixture(template, {
|
167
|
+
parentNode: form,
|
168
|
+
});
|
169
|
+
const spy = sinon.spy();
|
170
|
+
textarea.addEventListener('invalid', spy);
|
171
|
+
textarea.focus();
|
172
|
+
await sendKeys({ type: 'test' });
|
173
|
+
textarea.checkValidity();
|
174
|
+
await aTimeout(0);
|
175
|
+
expect(spy.notCalled).to.be.true;
|
176
|
+
});
|
177
|
+
it('does not dispatch an `invalid` event when `reportValidity` is called and `maxlength` is not exceeded,', async () => {
|
178
|
+
const form = document.createElement('form');
|
179
|
+
const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
|
180
|
+
const textarea = await fixture(template, {
|
181
|
+
parentNode: form,
|
182
|
+
});
|
183
|
+
const spy = sinon.spy();
|
184
|
+
textarea.addEventListener('invalid', spy);
|
185
|
+
textarea.focus();
|
186
|
+
await sendKeys({ type: 'ab' });
|
187
|
+
textarea.reportValidity();
|
188
|
+
await aTimeout(0);
|
189
|
+
expect(spy.notCalled).to.be.true;
|
190
|
+
});
|
191
|
+
it('does not dispatch an `invalid` event when `reportValidity` is called `maxlength` exceeded and disabled,', async () => {
|
192
|
+
const form = document.createElement('form');
|
193
|
+
const template = `<glide-core-textarea label="label" maxlength="3" disabled></glide-core-textarea>`;
|
194
|
+
const textarea = await fixture(template, {
|
195
|
+
parentNode: form,
|
196
|
+
});
|
197
|
+
const spy = sinon.spy();
|
198
|
+
textarea.addEventListener('invalid', spy);
|
199
|
+
textarea.focus();
|
200
|
+
await sendKeys({ type: 'test' });
|
201
|
+
textarea.reportValidity();
|
202
|
+
await aTimeout(0);
|
203
|
+
expect(spy.notCalled).to.be.true;
|
204
|
+
});
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import './textarea.js';
|
2
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import { sendKeys } from '@web/test-runner-commands';
|
4
|
+
it('can be reset to initial value', async () => {
|
5
|
+
const form = document.createElement('form');
|
6
|
+
const textarea = await fixture(html `<glide-core-textarea
|
7
|
+
value="testing"
|
8
|
+
label="label"
|
9
|
+
></glide-core-textarea>`, { parentNode: form });
|
10
|
+
textarea.focus();
|
11
|
+
await sendKeys({ type: '-value' });
|
12
|
+
await expect(textarea.value).to.equal('testing-value');
|
13
|
+
form.reset();
|
14
|
+
expect(textarea.value).to.equal('testing');
|
15
|
+
});
|
16
|
+
it('can be reset if there was no initial value', async () => {
|
17
|
+
const form = document.createElement('form');
|
18
|
+
const textarea = await fixture(html `<glide-core-textarea label="label"></glide-core-textarea>`, { parentNode: form });
|
19
|
+
textarea.value = 'value';
|
20
|
+
form.reset();
|
21
|
+
expect(textarea.value).to.equal('');
|
22
|
+
});
|
23
|
+
it('has `formData` when it has a `value` and `name`', async () => {
|
24
|
+
const form = document.createElement('form');
|
25
|
+
await fixture(html `<glide-core-textarea
|
26
|
+
value="value"
|
27
|
+
label="label"
|
28
|
+
name="name"
|
29
|
+
></glide-core-textarea>`, { parentNode: form });
|
30
|
+
const formData = new FormData(form);
|
31
|
+
expect(formData.get('name')).to.be.equal('value');
|
32
|
+
});
|
33
|
+
it('has `formData` when text is entered and has a `name`', async () => {
|
34
|
+
const form = document.createElement('form');
|
35
|
+
const textarea = await fixture(html `<glide-core-textarea
|
36
|
+
value=""
|
37
|
+
label="label"
|
38
|
+
name="name"
|
39
|
+
></glide-core-textarea>`, { parentNode: form });
|
40
|
+
textarea?.focus();
|
41
|
+
await sendKeys({ type: 'testing' });
|
42
|
+
const formData = new FormData(form);
|
43
|
+
expect(formData.get('name')).to.be.equal('testing');
|
44
|
+
});
|
45
|
+
it('has no `formData` value when it has a value and is disabled', async () => {
|
46
|
+
const form = document.createElement('form');
|
47
|
+
await fixture(html `<glide-core-textarea
|
48
|
+
value="value"
|
49
|
+
label="label"
|
50
|
+
name="test-name"
|
51
|
+
disabled
|
52
|
+
></glide-core-textarea>`, { parentNode: form });
|
53
|
+
const formData = new FormData(form);
|
54
|
+
expect(formData.get('test-name')).to.be.null;
|
55
|
+
});
|
56
|
+
it('appends no `formData` when it has a value and no `name`', async () => {
|
57
|
+
const form = document.createElement('form');
|
58
|
+
await fixture(html `<glide-core-textarea
|
59
|
+
value="value"
|
60
|
+
label="label"
|
61
|
+
></glide-core-textarea>`, { parentNode: form });
|
62
|
+
const formData = new FormData(form);
|
63
|
+
expect(formData).to.be.empty;
|
64
|
+
});
|
65
|
+
it('appends no `formData` when it has no value and a `name`', async () => {
|
66
|
+
const form = document.createElement('form');
|
67
|
+
await fixture(html `<glide-core-textarea label="label" name="name"></glide-core-textarea>`, { parentNode: form });
|
68
|
+
const formData = new FormData(form);
|
69
|
+
expect(formData).to.be.empty;
|
70
|
+
});
|
@@ -0,0 +1,83 @@
|
|
1
|
+
import { expect, fixture } from '@open-wc/testing';
|
2
|
+
import { sendKeys } from '@web/test-runner-commands';
|
3
|
+
import GlideCoreTextarea from './textarea.js';
|
4
|
+
GlideCoreTextarea.shadowRootOptions.mode = 'open';
|
5
|
+
it('is valid by default', async () => {
|
6
|
+
const template = '<glide-core-textarea></glide-core-textarea>';
|
7
|
+
const textarea = await fixture(template);
|
8
|
+
expect(textarea.validity?.valid).to.be.true;
|
9
|
+
expect(textarea.validity?.valueMissing).to.be.false;
|
10
|
+
expect(textarea.validity?.tooLong).to.be.false;
|
11
|
+
expect(textarea.checkValidity()).to.be.true;
|
12
|
+
expect(textarea.reportValidity()).to.be.true;
|
13
|
+
});
|
14
|
+
it('is valid after being filled in and required', async () => {
|
15
|
+
const template = '<glide-core-textarea required></glide-core-textarea>';
|
16
|
+
const textarea = await fixture(template);
|
17
|
+
textarea.focus();
|
18
|
+
await sendKeys({ type: 'value' });
|
19
|
+
expect(textarea.validity?.valid).to.be.true;
|
20
|
+
expect(textarea.validity?.valueMissing).to.be.false;
|
21
|
+
expect(textarea.validity?.tooLong).to.be.false;
|
22
|
+
expect(textarea.checkValidity()).to.be.true;
|
23
|
+
expect(textarea.reportValidity()).to.be.true;
|
24
|
+
});
|
25
|
+
it('is invalid if no value and required', async () => {
|
26
|
+
const template = '<glide-core-textarea required></glide-core-textarea>';
|
27
|
+
const textarea = await fixture(template);
|
28
|
+
expect(textarea.validity?.valid).to.be.false;
|
29
|
+
expect(textarea.validity?.valueMissing).to.be.true;
|
30
|
+
expect(textarea.validity?.tooLong).to.be.false;
|
31
|
+
expect(textarea.willValidate).to.be.true;
|
32
|
+
expect(textarea.checkValidity()).to.be.false;
|
33
|
+
expect(textarea.reportValidity()).to.be.false;
|
34
|
+
});
|
35
|
+
it('is valid when empty and does not exceed `maxlength`', async () => {
|
36
|
+
const template = '<glide-core-textarea maxlength="3"></glide-core-textarea>';
|
37
|
+
const textarea = await fixture(template);
|
38
|
+
expect(textarea.validity?.valid).to.be.true;
|
39
|
+
expect(textarea.validity?.valueMissing).to.be.false;
|
40
|
+
expect(textarea.validity?.tooLong).to.be.false;
|
41
|
+
expect(textarea.checkValidity()).to.be.true;
|
42
|
+
expect(textarea.reportValidity()).to.be.true;
|
43
|
+
});
|
44
|
+
it('is valid when filled in and does not exceed `maxlength`', async () => {
|
45
|
+
const template = '<glide-core-textarea maxlength="3"></glide-core-textarea>';
|
46
|
+
const textarea = await fixture(template);
|
47
|
+
textarea.focus();
|
48
|
+
await sendKeys({ type: 'abc' });
|
49
|
+
expect(textarea.validity?.valid).to.be.true;
|
50
|
+
expect(textarea.validity?.valueMissing).to.be.false;
|
51
|
+
expect(textarea.validity?.tooLong).to.be.false;
|
52
|
+
expect(textarea.checkValidity()).to.be.true;
|
53
|
+
expect(textarea.reportValidity()).to.be.true;
|
54
|
+
});
|
55
|
+
it('is invalid when filled in and exceeds `maxlength`', async () => {
|
56
|
+
const template = '<glide-core-textarea maxlength="3"></glide-core-textarea>';
|
57
|
+
const textarea = await fixture(template);
|
58
|
+
textarea.focus();
|
59
|
+
await sendKeys({ type: 'value' });
|
60
|
+
expect(textarea.validity?.valid).to.be.false;
|
61
|
+
expect(textarea.validity?.valueMissing).to.be.false;
|
62
|
+
expect(textarea.validity?.tooLong).to.be.true;
|
63
|
+
expect(textarea.checkValidity()).to.be.false;
|
64
|
+
expect(textarea.reportValidity()).to.be.false;
|
65
|
+
});
|
66
|
+
it('is valid if no value but required and disabled', async () => {
|
67
|
+
const template = '<glide-core-textarea required disabled></glide-core-textarea>';
|
68
|
+
const textarea = await fixture(template);
|
69
|
+
expect(textarea.validity?.valid).to.be.true;
|
70
|
+
expect(textarea.validity?.valueMissing).to.be.false;
|
71
|
+
expect(textarea.validity?.tooLong).to.be.false;
|
72
|
+
expect(textarea.checkValidity()).to.be.true;
|
73
|
+
expect(textarea.reportValidity()).to.be.true;
|
74
|
+
});
|
75
|
+
it('is valid when filled in, disabled, and exceeds `maxlength`', async () => {
|
76
|
+
const template = '<glide-core-textarea value="value" disabled maxlength="3"></glide-core-textarea>';
|
77
|
+
const textarea = await fixture(template);
|
78
|
+
expect(textarea.validity?.valid).to.be.true;
|
79
|
+
expect(textarea.validity?.valueMissing).to.be.false;
|
80
|
+
expect(textarea.validity?.tooLong).to.be.false;
|
81
|
+
expect(textarea.checkValidity()).to.be.true;
|
82
|
+
expect(textarea.reportValidity()).to.be.true;
|
83
|
+
});
|
package/dist/toasts.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,s){var r,i=arguments.length,n=i<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,o):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,o,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(i<3?r(n):i>3?r(t,o,n):r(t,o))||n);return i>3&&n&&Object.defineProperty(t,o,n),n};import"./toasts.toast.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement}from"lit/decorators.js";import styles from"./toasts.styles.js";let GlideCoreToasts=class GlideCoreToasts extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}add(e){const{variant:t,label:o,description:s,duration:r}=e,i=Object.assign(document.createElement("glide-core-toast"),{variant:t,label:o,description:s,duration:r});return this.#e.value.append(i),i.addEventListener("close",(()=>{i.remove()}),{once:!0}),i}render(){return html`<div class="component" role="region" tabindex="-1" aria-label="Notifications" ${ref(this.#e)}></div>`}#e=createRef()};GlideCoreToasts=__decorate([customElement("glide-core-toasts")],GlideCoreToasts);export default GlideCoreToasts;
|
package/dist/toasts.styles.js
CHANGED
@@ -0,0 +1,94 @@
|
|
1
|
+
import { assert, expect, fixture, html } from '@open-wc/testing';
|
2
|
+
import GlideCoreToasts from './toasts.js';
|
3
|
+
GlideCoreToasts.shadowRootOptions.mode = 'open';
|
4
|
+
// NOTE: Due to https://github.com/modernweb-dev/web/issues/2520, we sometimes need
|
5
|
+
// to manually dispatch the `transitionend` event in tests.
|
6
|
+
it('registers', async () => {
|
7
|
+
expect(window.customElements.get('glide-core-toasts')).to.equal(GlideCoreToasts);
|
8
|
+
});
|
9
|
+
it('is accessible', async () => {
|
10
|
+
const component = await fixture(html `<glide-core-toasts></glide-core-toasts>`);
|
11
|
+
component.add({
|
12
|
+
label: 'Test toast',
|
13
|
+
description: 'Test toast description',
|
14
|
+
variant: 'informational',
|
15
|
+
});
|
16
|
+
await expect(component).to.be.accessible();
|
17
|
+
});
|
18
|
+
it('sets correct role', async () => {
|
19
|
+
const component = await fixture(html `<glide-core-toasts></glide-core-toasts>`);
|
20
|
+
component.add({
|
21
|
+
label: 'Test toast',
|
22
|
+
description: 'Test toast description',
|
23
|
+
variant: 'informational',
|
24
|
+
});
|
25
|
+
expect(component.shadowRoot?.firstElementChild?.getAttribute('role')).to.equal('region');
|
26
|
+
});
|
27
|
+
it('can add a toast', async () => {
|
28
|
+
const component = await fixture(html `<glide-core-toasts></glide-core-toasts>`);
|
29
|
+
component.add({
|
30
|
+
label: 'Test toast',
|
31
|
+
description: 'Test toast description',
|
32
|
+
variant: 'informational',
|
33
|
+
});
|
34
|
+
const toasts = component.shadowRoot?.querySelectorAll('glide-core-toast');
|
35
|
+
assert(toasts);
|
36
|
+
expect(toasts.length).to.equal(1);
|
37
|
+
const toast = toasts[0];
|
38
|
+
expect(toast.label).to.equal('Test toast');
|
39
|
+
expect(toast.description).to.equal('Test toast description');
|
40
|
+
expect(toast.variant).to.equal('informational');
|
41
|
+
});
|
42
|
+
it('can add a toast with duration', async () => {
|
43
|
+
const component = await fixture(html `<glide-core-toasts></glide-core-toasts>`);
|
44
|
+
component.add({
|
45
|
+
label: 'Test toast',
|
46
|
+
description: 'Test toast description',
|
47
|
+
variant: 'informational',
|
48
|
+
duration: 10_000,
|
49
|
+
});
|
50
|
+
const toasts = component.shadowRoot?.querySelectorAll('glide-core-toast');
|
51
|
+
assert(toasts);
|
52
|
+
const toast = toasts[0];
|
53
|
+
expect(toast.duration).to.equal(10_000);
|
54
|
+
});
|
55
|
+
it('can add multiple toasts', async () => {
|
56
|
+
const component = await fixture(html `<glide-core-toasts></glide-core-toasts>`);
|
57
|
+
component.add({
|
58
|
+
label: 'Test toast',
|
59
|
+
description: 'Test toast description',
|
60
|
+
variant: 'informational',
|
61
|
+
});
|
62
|
+
component.add({
|
63
|
+
label: 'Test toast 2',
|
64
|
+
description: 'Test toast description 2',
|
65
|
+
variant: 'success',
|
66
|
+
});
|
67
|
+
const toasts = component.shadowRoot?.querySelectorAll('glide-core-toast');
|
68
|
+
assert(toasts);
|
69
|
+
expect(toasts.length).to.equal(2);
|
70
|
+
const toast1 = toasts[0];
|
71
|
+
expect(toast1.label).to.equal('Test toast');
|
72
|
+
expect(toast1.description).to.equal('Test toast description');
|
73
|
+
expect(toast1.variant).to.equal('informational');
|
74
|
+
const toast2 = toasts[1];
|
75
|
+
expect(toast2.label).to.equal('Test toast 2');
|
76
|
+
expect(toast2.description).to.equal('Test toast description 2');
|
77
|
+
expect(toast2.variant).to.equal('success');
|
78
|
+
});
|
79
|
+
it('removes a closed toast from the DOM', async () => {
|
80
|
+
const component = await fixture(html `<glide-core-toasts></glide-core-toasts>`);
|
81
|
+
component.add({
|
82
|
+
label: 'Test toast',
|
83
|
+
description: 'Test toast description',
|
84
|
+
variant: 'informational',
|
85
|
+
});
|
86
|
+
let toasts = component.shadowRoot?.querySelectorAll('glide-core-toast');
|
87
|
+
assert(toasts);
|
88
|
+
expect(toasts.length).to.equal(1);
|
89
|
+
const toast = toasts[0];
|
90
|
+
toast.close();
|
91
|
+
toast.dispatchEvent(new Event('close', { bubbles: true }));
|
92
|
+
toasts = component.shadowRoot?.querySelectorAll('glide-core-toast');
|
93
|
+
expect(toasts?.length).to.equal(0);
|
94
|
+
});
|
package/dist/toasts.toast.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
var __decorate=this&&this.__decorate||function(t,e,o,s){var i,r=arguments.length,a=r<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,o):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,o,s);else for(var n=t.length-1;n>=0;n--)(i=t[n])&&(a=(r<3?i(a):r>3?i(e,o,a):i(e,o))||a);return r>3&&a&&Object.defineProperty(e,o,a),a};import"./icon-button.js";import"./status-indicator.js";import"./tooltip.js";import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import styles from"./toasts.toast.styles.js";let GlideCoreToast=class GlideCoreToast extends LitElement{constructor(){super(...arguments),this.duration=5e3,this.#t=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){const t=this.#t?.value;t?.addEventListener("transitionend",(()=>{t?.classList?.remove("open"),t?.classList?.remove("closing"),t?.classList?.add("closed"),this.dispatchEvent(new Event("close",{bubbles:!0}))}),{once:!0}),t?.classList?.add("closing")}firstUpdated(){requestAnimationFrame((()=>{this.open()}))}open(){const t=Math.max(this.duration??0,5e3);t<Number.POSITIVE_INFINITY&&setTimeout((()=>{this.close()}),t),this.#t?.value?.classList?.add("open")}render(){return html`<div class="${classMap({component:!0,[this.variant]:!0})}" role="alert" aria-labelledby="label description" ${ref(this.#t)}><glide-core-status-indicator style="--size: 1.25rem;" class="icon" variant="${this.#e}"></glide-core-status-indicator><div class="label" id="label">${this.label}</div><glide-core-icon-button label="Close" variant="tertiary" class="close-button" @click="${this.#o}"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></glide-core-icon-button><div class="description" id="description">${this.description}</div></div>`}#t;#o(){this.close()}get#e(){return{informational:"warning-informational",success:"success"}[this.variant]}};__decorate([property({reflect:!0})],GlideCoreToast.prototype,"label",void 0),__decorate([property({reflect:!0})],GlideCoreToast.prototype,"description",void 0),__decorate([property()],GlideCoreToast.prototype,"variant",void 0),__decorate([property({type:Number})],GlideCoreToast.prototype,"duration",void 0),GlideCoreToast=__decorate([customElement("glide-core-toast")],GlideCoreToast);export default GlideCoreToast;
|
@@ -1,8 +1,9 @@
|
|
1
|
-
|
1
|
+
import{css}from"lit";export default[css`
|
2
2
|
.component {
|
3
3
|
align-items: center;
|
4
4
|
border-radius: var(--glide-core-spacing-sm);
|
5
5
|
box-shadow: var(--glide-core-shadow-lg);
|
6
|
+
color: var(--glide-core-text-body-2);
|
6
7
|
column-gap: var(--glide-core-spacing-xs);
|
7
8
|
display: grid;
|
8
9
|
font-family: var(--glide-core-body-xs-font-family);
|
@@ -51,10 +52,12 @@
|
|
51
52
|
}
|
52
53
|
|
53
54
|
.close-button {
|
55
|
+
--icon-color: var(--glide-core-icon-default2);
|
56
|
+
|
54
57
|
grid-column: 3;
|
55
58
|
}
|
56
59
|
|
57
60
|
.description {
|
58
61
|
grid-column: 2;
|
59
62
|
}
|
60
|
-
`];
|
63
|
+
`];
|
@@ -0,0 +1,139 @@
|
|
1
|
+
import { assert, expect, fixture, html } from '@open-wc/testing';
|
2
|
+
import GlideCoreToast from './toasts.toast.js';
|
3
|
+
import sinon from 'sinon';
|
4
|
+
GlideCoreToast.shadowRootOptions.mode = 'open';
|
5
|
+
// NOTE: Due to https://github.com/modernweb-dev/web/issues/2520, we sometimes need
|
6
|
+
// to manually dispatch the `transitionend` event in tests.
|
7
|
+
it('registers', async () => {
|
8
|
+
expect(window.customElements.get('glide-core-toast')).to.equal(GlideCoreToast);
|
9
|
+
});
|
10
|
+
it('is accessible', async () => {
|
11
|
+
const component = await fixture(html `<glide-core-toast
|
12
|
+
variant="informational"
|
13
|
+
label="Label"
|
14
|
+
description="Toast description"
|
15
|
+
></glide-core-toast>`);
|
16
|
+
await expect(component).to.be.accessible();
|
17
|
+
});
|
18
|
+
it('sets correct role', async () => {
|
19
|
+
const component = await fixture(html `<glide-core-toast
|
20
|
+
variant="informational"
|
21
|
+
label="Label"
|
22
|
+
description="Toast description"
|
23
|
+
></glide-core-toast>`);
|
24
|
+
expect(component.shadowRoot?.firstElementChild?.getAttribute('role')).to.equal('alert');
|
25
|
+
});
|
26
|
+
it('sets correct aria labelling', async () => {
|
27
|
+
const component = await fixture(html `<glide-core-toast
|
28
|
+
variant="informational"
|
29
|
+
label="Label"
|
30
|
+
description="Toast description"
|
31
|
+
></glide-core-toast>`);
|
32
|
+
expect(component.shadowRoot?.firstElementChild?.getAttribute('aria-labelledby')).to.equal('label description');
|
33
|
+
expect(component.shadowRoot?.firstElementChild?.querySelector('#label')
|
34
|
+
?.textContent).to.equal('Label');
|
35
|
+
expect(component.shadowRoot?.firstElementChild?.querySelector('#description')
|
36
|
+
?.textContent).to.equal('Toast description');
|
37
|
+
});
|
38
|
+
it('sets variant, label, and description', async () => {
|
39
|
+
const component = await fixture(html `<glide-core-toast
|
40
|
+
variant="informational"
|
41
|
+
label="Label"
|
42
|
+
description="Toast description"
|
43
|
+
></glide-core-toast>`);
|
44
|
+
await expect(component.variant).to.equal('informational');
|
45
|
+
await expect(component.label).to.equal('Label');
|
46
|
+
await expect(component.description).to.equal('Toast description');
|
47
|
+
});
|
48
|
+
it('opens and closes by default', async () => {
|
49
|
+
const clock = sinon.useFakeTimers();
|
50
|
+
const component = await fixture(html `<glide-core-toast
|
51
|
+
variant="informational"
|
52
|
+
label="Label"
|
53
|
+
description="Toast description"
|
54
|
+
></glide-core-toast>`);
|
55
|
+
clock.tick(3000);
|
56
|
+
const shadowElement = component.shadowRoot.firstElementChild;
|
57
|
+
await expect([...shadowElement.classList]).to.deep.equal([
|
58
|
+
'component',
|
59
|
+
'informational',
|
60
|
+
'open',
|
61
|
+
]);
|
62
|
+
clock.tick(3000);
|
63
|
+
shadowElement?.dispatchEvent(new TransitionEvent('transitionend'));
|
64
|
+
await expect([
|
65
|
+
...component.shadowRoot.firstElementChild.classList,
|
66
|
+
]).to.deep.equal(['component', 'informational', 'closed']);
|
67
|
+
clock.restore();
|
68
|
+
});
|
69
|
+
it('responds to duration', async () => {
|
70
|
+
const clock = sinon.useFakeTimers();
|
71
|
+
const component = await fixture(html `<glide-core-toast
|
72
|
+
variant="informational"
|
73
|
+
label="Label"
|
74
|
+
description="Toast description"
|
75
|
+
duration="10000"
|
76
|
+
></glide-core-toast>`);
|
77
|
+
clock.tick(9500);
|
78
|
+
const shadowElement = component.shadowRoot.firstElementChild;
|
79
|
+
await expect([...shadowElement.classList]).to.deep.equal([
|
80
|
+
'component',
|
81
|
+
'informational',
|
82
|
+
'open',
|
83
|
+
]);
|
84
|
+
clock.tick(1000);
|
85
|
+
shadowElement?.dispatchEvent(new TransitionEvent('transitionend'));
|
86
|
+
await expect([
|
87
|
+
...component.shadowRoot.firstElementChild.classList,
|
88
|
+
]).to.deep.equal(['component', 'informational', 'closed']);
|
89
|
+
clock.restore();
|
90
|
+
});
|
91
|
+
it('responds to duration of Infinity', async () => {
|
92
|
+
const clock = sinon.useFakeTimers();
|
93
|
+
const component = await fixture(html `<glide-core-toast
|
94
|
+
variant="informational"
|
95
|
+
label="Label"
|
96
|
+
description="Toast description"
|
97
|
+
duration="Infinity"
|
98
|
+
></glide-core-toast>`);
|
99
|
+
clock.tick(9500);
|
100
|
+
const shadowElement = component.shadowRoot.firstElementChild;
|
101
|
+
await expect([...shadowElement.classList]).to.deep.equal([
|
102
|
+
'component',
|
103
|
+
'informational',
|
104
|
+
'open',
|
105
|
+
]);
|
106
|
+
clock.restore();
|
107
|
+
});
|
108
|
+
it('does not allow less than 5000 duration', async () => {
|
109
|
+
const clock = sinon.useFakeTimers();
|
110
|
+
const component = await fixture(html `<glide-core-toast
|
111
|
+
variant="informational"
|
112
|
+
label="Label"
|
113
|
+
description="Toast description"
|
114
|
+
duration="3000"
|
115
|
+
></glide-core-toast>`);
|
116
|
+
clock.tick(4000);
|
117
|
+
const shadowElement = component.shadowRoot.firstElementChild;
|
118
|
+
await expect([...shadowElement.classList]).to.deep.equal([
|
119
|
+
'component',
|
120
|
+
'informational',
|
121
|
+
'open',
|
122
|
+
]);
|
123
|
+
clock.restore();
|
124
|
+
});
|
125
|
+
it('can be closed by clicking on the x icon', async () => {
|
126
|
+
const component = await fixture(html `<glide-core-toast
|
127
|
+
variant="informational"
|
128
|
+
label="Label"
|
129
|
+
description="Toast description"
|
130
|
+
></glide-core-toast>`);
|
131
|
+
const shadowElement = component.shadowRoot.firstElementChild;
|
132
|
+
const closeButton = shadowElement?.querySelector('glide-core-icon-button[label="Close"]');
|
133
|
+
assert(closeButton);
|
134
|
+
closeButton.click();
|
135
|
+
shadowElement?.dispatchEvent(new TransitionEvent('transitionend'));
|
136
|
+
await expect([
|
137
|
+
...component.shadowRoot.firstElementChild.classList,
|
138
|
+
]).to.deep.equal(['component', 'informational', 'closed']);
|
139
|
+
});
|