@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,140 @@
|
|
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('registers', async () => {
|
6
|
+
expect(window.customElements.get('glide-core-textarea')).to.equal(GlideCoreTextarea);
|
7
|
+
});
|
8
|
+
it('is accessible', async () => {
|
9
|
+
const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
|
10
|
+
const element = await fixture(template);
|
11
|
+
await expect(element).to.be.accessible();
|
12
|
+
});
|
13
|
+
it('renders a textarea with two rows and value when attribute `value` is set ', async () => {
|
14
|
+
const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
|
15
|
+
const element = await fixture(template);
|
16
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
17
|
+
expect(element);
|
18
|
+
expect(element).to.have.attribute('rows', '2');
|
19
|
+
expect(textarea).to.exist;
|
20
|
+
expect(textarea).to.have.attribute('rows', '2');
|
21
|
+
});
|
22
|
+
it('renders the `rows` attribute on the textarea when set', async () => {
|
23
|
+
const template = `<glide-core-textarea value="value" label="label" rows="5"></glide-core-textarea>`;
|
24
|
+
const element = await fixture(template);
|
25
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
26
|
+
expect(textarea).to.have.attribute('rows', '5');
|
27
|
+
});
|
28
|
+
it('renders a label when attribute `label` is set', async () => {
|
29
|
+
const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
|
30
|
+
const element = await fixture(template);
|
31
|
+
const label = element.shadowRoot.querySelector('label');
|
32
|
+
expect(label).to.exist;
|
33
|
+
expect(label?.textContent?.trim()).to.be.equal('label');
|
34
|
+
});
|
35
|
+
it('renders the textarea as readonly when attribute `readonly` is set', async () => {
|
36
|
+
const template = `<glide-core-textarea value="value" label="label" readonly></glide-core-textarea>`;
|
37
|
+
const element = await fixture(template);
|
38
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
39
|
+
expect(textarea).to.have.attribute('readonly');
|
40
|
+
});
|
41
|
+
it('renders the textarea as disabled when attribute `disabled` is set', async () => {
|
42
|
+
const template = `<glide-core-textarea value="value" label="label" disabled></glide-core-textarea>`;
|
43
|
+
const element = await fixture(template);
|
44
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
45
|
+
expect(textarea).to.have.attribute('disabled');
|
46
|
+
});
|
47
|
+
it('renders the textarea with a placeholder when attribute `placeholder` is set', async () => {
|
48
|
+
const template = `<glide-core-textarea value="" label="label" placeholder="placeholder"></glide-core-textarea>`;
|
49
|
+
const element = await fixture(template);
|
50
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
51
|
+
expect(textarea).to.have.attribute('placeholder', 'placeholder');
|
52
|
+
});
|
53
|
+
it('renders `required` on textarea when set', async () => {
|
54
|
+
const template = `<glide-core-textarea value="value" label="label" required></glide-core-textarea>`;
|
55
|
+
const element = await fixture(template);
|
56
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
57
|
+
expect(textarea).to.have.attribute('required');
|
58
|
+
});
|
59
|
+
it('renders a `name` attribute on the textarea when set', async () => {
|
60
|
+
const template = `<glide-core-textarea value="value" label="label" name="test-name"></glide-core-textarea>`;
|
61
|
+
const element = await fixture(template);
|
62
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
63
|
+
expect(textarea).to.have.attribute('name', 'test-name');
|
64
|
+
});
|
65
|
+
it('supports a "tooltip" slot', async () => {
|
66
|
+
const template = `
|
67
|
+
<glide-core-textarea value="value" label="label" required>
|
68
|
+
<div slot="tooltip">Tooltip</div>
|
69
|
+
</glide-core-textarea>
|
70
|
+
`;
|
71
|
+
const element = await fixture(template);
|
72
|
+
const assignedElements = element.shadowRoot
|
73
|
+
?.querySelector('slot[name="tooltip"]')
|
74
|
+
?.assignedElements();
|
75
|
+
expect(assignedElements?.at(0)?.textContent).to.equal('Tooltip');
|
76
|
+
});
|
77
|
+
it('renders a slot with description', async () => {
|
78
|
+
const template = `<glide-core-textarea value="value" label="label"><span slot="description" data-test-content>Description</slot></glide-core-textarea>`;
|
79
|
+
const element = await fixture(template);
|
80
|
+
expect(element).to.exist;
|
81
|
+
const contentRendered = element.querySelector('[data-test-content]');
|
82
|
+
expect(contentRendered).to.exist;
|
83
|
+
expect(contentRendered?.textContent).to.be.equal('Description');
|
84
|
+
});
|
85
|
+
it('renders a character count when attribute `maxlength` is set greater than zero', async () => {
|
86
|
+
const template = `<glide-core-textarea value="value" label="label" maxlength="10"><span slot="description">Description</span></glide-core-textarea>`;
|
87
|
+
const element = await fixture(template);
|
88
|
+
const container = element.shadowRoot.querySelector('[data-test-maxlength]');
|
89
|
+
expect(container?.textContent?.trim()).to.be.equal('5/10');
|
90
|
+
});
|
91
|
+
it('does not render a character count when attribute `maxlength` is set less than than zero', async () => {
|
92
|
+
const template = `<glide-core-textarea value="value" label="label" maxlength="0"><span slot="description" data-test-content>Description</span></glide-core-textarea>`;
|
93
|
+
const element = await fixture(template);
|
94
|
+
const container = element.shadowRoot.querySelector('[data-test-description-container]');
|
95
|
+
expect(container?.textContent?.trim()).to.be.equal('');
|
96
|
+
});
|
97
|
+
it('focuses the textarea when the label is clicked', async () => {
|
98
|
+
const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
|
99
|
+
const element = await fixture(template);
|
100
|
+
const label = element.shadowRoot.querySelector('label');
|
101
|
+
label?.click();
|
102
|
+
expect(element).to.have.focus;
|
103
|
+
await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
|
104
|
+
});
|
105
|
+
it('has tabbable textarea', async () => {
|
106
|
+
const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
|
107
|
+
const element = await fixture(template);
|
108
|
+
await sendKeys({ press: 'Tab' });
|
109
|
+
expect(element).to.have.focus;
|
110
|
+
await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
|
111
|
+
});
|
112
|
+
it('renders text when typed into text area', async () => {
|
113
|
+
const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
|
114
|
+
const element = await fixture(template);
|
115
|
+
const textarea = element.shadowRoot.querySelector('textarea');
|
116
|
+
element.focus();
|
117
|
+
await sendKeys({ type: 'test text' });
|
118
|
+
expect(textarea?.value).to.equal('test text');
|
119
|
+
});
|
120
|
+
it('returns the content of the textarea when getting the `value` property', async () => {
|
121
|
+
const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
|
122
|
+
const element = await fixture(template);
|
123
|
+
element.focus();
|
124
|
+
await sendKeys({ type: 'test text' });
|
125
|
+
expect(element.value).to.equal('test text');
|
126
|
+
});
|
127
|
+
it('focuses the textarea when `focus` is called', async () => {
|
128
|
+
const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
|
129
|
+
const element = await fixture(template);
|
130
|
+
element.focus();
|
131
|
+
await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
|
132
|
+
});
|
133
|
+
it('blurs the textarea when `blur` is called', async () => {
|
134
|
+
const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
|
135
|
+
const element = await fixture(template);
|
136
|
+
element.focus();
|
137
|
+
await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
|
138
|
+
element.blur();
|
139
|
+
await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.not.equal('textarea');
|
140
|
+
});
|
@@ -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,r){var s,i=arguments.length,l=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,r);else for(var a=e.length-1;a>=0;a--)(s=e[a])&&(l=(i<3?s(l):i>3?s(t,o,l):s(t,o))||l);return i>3&&l&&Object.defineProperty(t,o,l),l};import"./toasts.toast.js";import{LitElement,html}from"lit";import{LocalizeController}from"./library/localize.js";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:r,duration:s}=e,i=Object.assign(document.createElement("glide-core-toast"),{variant:t,label:o,description:r,duration:s});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="${this.#t.term("notifications")}" ${ref(this.#e)}></div>`}#e=createRef();#t=new LocalizeController(this)};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(e,t,o,i){var s,r=arguments.length,l=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,i);else for(var a=e.length-1;a>=0;a--)(s=e[a])&&(l=(r<3?s(l):r>3?s(t,o,l):s(t,o))||l);return r>3&&l&&Object.defineProperty(t,o,l),l};import"./icon-button.js";import"./status-indicator.js";import"./tooltip.js";import{LitElement,html}from"lit";import{LocalizeController}from"./library/localize.js";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.#e=createRef(),this.#t=new LocalizeController(this)}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){const e=this.#e?.value;e?.addEventListener("transitionend",(()=>{e?.classList?.remove("open"),e?.classList?.remove("closing"),e?.classList?.add("closed"),this.dispatchEvent(new Event("close",{bubbles:!0}))}),{once:!0}),e?.classList?.add("closing")}firstUpdated(){requestAnimationFrame((()=>{this.open()}))}open(){const e=Math.max(this.duration??0,5e3);e<Number.POSITIVE_INFINITY&&setTimeout((()=>{this.close()}),e),this.#e?.value?.classList?.add("open")}render(){return html`<div class="${classMap({component:!0,[this.variant]:!0})}" role="alert" aria-labelledby="label description" ${ref(this.#e)}><glide-core-status-indicator style="--size: 1.25rem;" class="icon" variant="${this.#o}"></glide-core-status-indicator><div class="label" id="label">${this.label}</div><glide-core-icon-button label="${this.#t.term("close")}" variant="tertiary" class="close-button" @click="${this.#i}"><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>`}#e;#t;#i(){this.close()}get#o(){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;
|