@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
package/dist/tab.styles.js
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
"
|
1
|
+
import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
|
2
|
+
:host {
|
3
|
+
outline: none;
|
4
|
+
}
|
5
|
+
|
6
|
+
/* Using nesting creates an issue on Safari with :host */
|
7
|
+
/* stylelint-disable-next-line csstools/use-nesting */
|
8
|
+
:host(:focus-visible) .component .container {
|
9
|
+
${focusOutline};
|
10
|
+
}
|
11
|
+
|
2
12
|
.component {
|
3
13
|
align-items: center;
|
4
14
|
cursor: pointer;
|
@@ -11,73 +21,88 @@
|
|
11
21
|
line-height: 1.1875rem;
|
12
22
|
padding-block: var(--glide-core-spacing-xs);
|
13
23
|
padding-inline: var(--glide-core-spacing-md);
|
14
|
-
}
|
15
24
|
|
16
|
-
|
17
|
-
|
18
|
-
.primary {
|
19
|
-
border: 1px solid transparent;
|
20
|
-
border-block-end-width: 0;
|
21
|
-
border-end-end-radius: 0;
|
22
|
-
border-end-start-radius: 0;
|
23
|
-
border-start-end-radius: var(--glide-core-spacing-sm);
|
24
|
-
border-start-start-radius: var(--glide-core-spacing-sm);
|
25
|
-
font-weight: var(--glide-core-heading-xxs-font-weight);
|
26
|
-
|
27
|
-
&.active,
|
28
|
-
&.tab:hover:not(.disabled) {
|
29
|
-
background-color: var(--glide-core-surface-base);
|
30
|
-
border: 1px solid var(--glide-core-border-primary);
|
31
|
-
|
32
|
-
/* hide the outer tab-group bottom border */
|
33
|
-
border-block-end: 1px solid var(--glide-core-surface-base);
|
34
|
-
margin-block-end: -1px;
|
25
|
+
&:hover {
|
26
|
+
color: var(--glide-core-text-primary);
|
35
27
|
}
|
36
|
-
}
|
37
28
|
|
38
|
-
|
39
|
-
|
40
|
-
|
29
|
+
&.disabled {
|
30
|
+
border: none;
|
31
|
+
color: var(--glide-core-text-tertiary-disabled);
|
32
|
+
pointer-events: none;
|
33
|
+
}
|
41
34
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
35
|
+
& .container {
|
36
|
+
border-radius: 0.0625rem;
|
37
|
+
display: flex;
|
38
|
+
gap: var(--glide-core-spacing-xs);
|
39
|
+
}
|
40
|
+
|
41
|
+
/* Primary */
|
42
|
+
|
43
|
+
&.primary {
|
44
|
+
border: 1px solid transparent;
|
45
|
+
border-block-end-width: 0;
|
46
|
+
border-end-end-radius: 0;
|
47
|
+
border-end-start-radius: 0;
|
48
|
+
border-start-end-radius: var(--glide-core-spacing-sm);
|
49
|
+
border-start-start-radius: var(--glide-core-spacing-sm);
|
50
|
+
font-weight: var(--glide-core-heading-xxs-font-weight);
|
47
51
|
|
48
|
-
|
52
|
+
&.active,
|
53
|
+
&:hover:not(.disabled) {
|
54
|
+
background-color: var(--glide-core-surface-base);
|
55
|
+
border: 1px solid var(--glide-core-border-primary);
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
font-weight: var(--glide-core-body-sm-font-weight);
|
57
|
+
/* hide the outer tab-group bottom border */
|
58
|
+
border-block-end: 1px solid var(--glide-core-surface-base);
|
59
|
+
margin-block-end: -1px;
|
60
|
+
}
|
55
61
|
|
56
|
-
|
57
|
-
|
62
|
+
& .active.default-slot {
|
63
|
+
background-color: red;
|
64
|
+
}
|
58
65
|
}
|
59
|
-
}
|
60
66
|
|
61
|
-
|
67
|
+
/* Secondary */
|
62
68
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
69
|
+
&.secondary {
|
70
|
+
border-color: transparent;
|
71
|
+
border-style: solid;
|
72
|
+
border-width: 1px;
|
73
|
+
font-weight: var(--glide-core-body-sm-font-weight);
|
67
74
|
|
68
|
-
|
69
|
-
|
70
|
-
|
75
|
+
&.active {
|
76
|
+
border-block-end: 2px solid var(--glide-core-border-focus);
|
77
|
+
}
|
71
78
|
}
|
72
79
|
|
73
|
-
|
74
|
-
|
75
|
-
|
80
|
+
/* Vertical */
|
81
|
+
|
82
|
+
&.vertical {
|
83
|
+
flex-direction: column;
|
84
|
+
font-weight: var(--glide-core-body-sm-font-weight);
|
85
|
+
padding-inline: var(--glide-core-spacing-xxs);
|
86
|
+
|
87
|
+
& .default-slot {
|
88
|
+
transform: rotate(180deg);
|
89
|
+
writing-mode: vertical-lr;
|
90
|
+
}
|
91
|
+
|
92
|
+
&.active {
|
93
|
+
border-inline-start: 2px solid var(--glide-core-border-focus);
|
94
|
+
}
|
95
|
+
|
96
|
+
&.active,
|
97
|
+
&.disabled {
|
98
|
+
background-color: var(--glide-core-surface-base);
|
99
|
+
}
|
76
100
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
101
|
+
& .container {
|
102
|
+
display: flex;
|
103
|
+
flex-direction: column;
|
104
|
+
gap: var(--glide-core-spacing-xs);
|
105
|
+
}
|
81
106
|
}
|
82
107
|
}
|
83
|
-
`];
|
108
|
+
`];
|
@@ -0,0 +1,71 @@
|
|
1
|
+
import './tab.js';
|
2
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreTab from './tab.js';
|
4
|
+
GlideCoreTab.shadowRootOptions.mode = 'open';
|
5
|
+
it('registers', async () => {
|
6
|
+
expect(window.customElements.get('glide-core-tab')).to.equal(GlideCoreTab);
|
7
|
+
});
|
8
|
+
it('renders correct markup and sets correct attributes for the default case', async () => {
|
9
|
+
const element = await fixture(html `
|
10
|
+
<glide-core-tab>Tab</glide-core-tab>
|
11
|
+
`);
|
12
|
+
await expect(element).to.not.be.accessible();
|
13
|
+
expect(element.active).to.equal(false, 'active defaults to false');
|
14
|
+
expect(element.disabled).to.equal(false, 'disabled defaults to false');
|
15
|
+
expect(element.variant).to.equal('primary');
|
16
|
+
expect(element.getAttribute('aria-disabled')).to.equal(null, 'does not set aria-disabled');
|
17
|
+
expect([...element.shadowRoot.firstElementChild.classList]).to.deep.equal([
|
18
|
+
'component',
|
19
|
+
'primary',
|
20
|
+
]);
|
21
|
+
});
|
22
|
+
it('renders a secondary variant', async () => {
|
23
|
+
const element = await fixture(html `
|
24
|
+
<glide-core-tab variant="secondary">Tab</glide-core-tab>
|
25
|
+
`);
|
26
|
+
expect([...element.shadowRoot.firstElementChild.classList]).to.deep.equal([
|
27
|
+
'component',
|
28
|
+
'secondary',
|
29
|
+
]);
|
30
|
+
});
|
31
|
+
it('renders a vertical variant', async () => {
|
32
|
+
const element = await fixture(html `
|
33
|
+
<glide-core-tab variant="vertical">Tab</glide-core-tab>
|
34
|
+
`);
|
35
|
+
expect([...element.shadowRoot.firstElementChild.classList]).to.deep.equal([
|
36
|
+
'component',
|
37
|
+
'vertical',
|
38
|
+
]);
|
39
|
+
});
|
40
|
+
it('sets the panel attribute', async () => {
|
41
|
+
const element = await fixture(html `
|
42
|
+
<glide-core-tab panel="details">Tab</glide-core-tab>
|
43
|
+
`);
|
44
|
+
expect(element.panel).to.equal('details');
|
45
|
+
});
|
46
|
+
it('sets the active attribute', async () => {
|
47
|
+
const element = await fixture(html `
|
48
|
+
<glide-core-tab active>Tab</glide-core-tab>
|
49
|
+
`);
|
50
|
+
expect(element.active).to.equal(true);
|
51
|
+
});
|
52
|
+
it('sets the disabled attribute', async () => {
|
53
|
+
const element = await fixture(html `
|
54
|
+
<glide-core-tab disabled>Tab</glide-core-tab>
|
55
|
+
`);
|
56
|
+
expect(element.disabled).to.equal(true);
|
57
|
+
expect(element).to.have.attribute('aria-disabled', 'true');
|
58
|
+
});
|
59
|
+
it('renders the icon slot', async () => {
|
60
|
+
const element = await fixture(html `
|
61
|
+
<glide-core-tab>
|
62
|
+
<span slot="icon">Icon</span>
|
63
|
+
<span>Tab</span>
|
64
|
+
</glide-core-tab>
|
65
|
+
`);
|
66
|
+
const slotNodes = element
|
67
|
+
.shadowRoot.querySelector('slot[name="icon"]')
|
68
|
+
?.assignedNodes();
|
69
|
+
expect(slotNodes?.length).to.equal(1);
|
70
|
+
expect(slotNodes?.at(0)?.textContent?.trim()).to.equal('Icon');
|
71
|
+
});
|
package/dist/tag.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,l){var i,r=arguments.length,s=r<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,l);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(s=(r<3?i(s):r>3?i(t,o,s):i(t,o))||s);return r>3&&s&&Object.defineProperty(t,o,s),s};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{owSlot}from"./library/ow.js";import{when}from"lit/directives/when.js";import styles from"./tag.styles.js";let GlideCoreTag=class GlideCoreTag extends LitElement{constructor(){super(...arguments),this.size="medium",this.removableLabel="",this.#e=createRef(),this.#t=createRef(),this.#o=createRef(),this.#l=new LocalizeController(this),this.#i=createRef(),this.#r=200,this.#s=()=>{new Promise((()=>setTimeout((()=>{this.remove()}),this.#r))),this.#t.value?.classList.toggle("activate"),this.#t.value?.classList.toggle("deactivate"),this.dispatchEvent(new Event("remove"))}}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}click(){this.#e.value?.click()}firstUpdated(){owSlot(this.#o.value)}render(){return html`<div class="${classMap({component:!0,activate:!0,[this.size]:!0})}" ${ref(this.#t)}><slot name="prefix" ${ref(this.#i)}></slot><slot @slotchange="${this.#a}" ${ref(this.#o)}></slot>${when(this.removableLabel,(()=>html`<button type="button" class="${classMap({[this.size]:!0})}" aria-label="${this.#l.term("removeTag",this.removableLabel)}" data-test="button" ${ref(this.#e)} @click="${this.#s}"><svg width="12" height="12" 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></button>`))}</div>`}#e;#t;#o;#l;#i;#r;#s;#a(){owSlot(this.#o.value)}};__decorate([property({reflect:!0})],GlideCoreTag.prototype,"size",void 0),__decorate([property({attribute:"removable-label"})],GlideCoreTag.prototype,"removableLabel",void 0),GlideCoreTag=__decorate([customElement("glide-core-tag")],GlideCoreTag);export default GlideCoreTag;
|
package/dist/tag.styles.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
|
2
2
|
.component {
|
3
3
|
align-items: center;
|
4
4
|
background: var(--glide-core-surface-base);
|
@@ -96,6 +96,7 @@
|
|
96
96
|
background-color: transparent;
|
97
97
|
block-size: var(--glide-core-spacing-sm);
|
98
98
|
border: none;
|
99
|
+
border-radius: 0.0625rem;
|
99
100
|
color: var(--glide-core-icon-display);
|
100
101
|
cursor: pointer;
|
101
102
|
display: flex;
|
@@ -127,7 +128,7 @@
|
|
127
128
|
}
|
128
129
|
|
129
130
|
&:focus-visible {
|
130
|
-
${
|
131
|
+
${focusOutline};
|
131
132
|
}
|
132
133
|
}
|
133
|
-
`];
|
134
|
+
`];
|
@@ -0,0 +1,118 @@
|
|
1
|
+
import { ArgumentError } from 'ow';
|
2
|
+
import { aTimeout, expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreTag from './tag.js';
|
4
|
+
import sinon from 'sinon';
|
5
|
+
GlideCoreTag.shadowRootOptions.mode = 'open';
|
6
|
+
it('registers', async () => {
|
7
|
+
expect(window.customElements.get('glide-core-tag')).to.equal(GlideCoreTag);
|
8
|
+
});
|
9
|
+
it('is accessible', async () => {
|
10
|
+
const element = await fixture(html `<glide-core-tag>Tag</glide-core-tag>`);
|
11
|
+
// Wait for the animation to complete
|
12
|
+
await aTimeout(200);
|
13
|
+
await expect(element).to.be.accessible();
|
14
|
+
});
|
15
|
+
it('renders with default slot content', async () => {
|
16
|
+
const element = await fixture(html `<glide-core-tag><span data-content>Tag</span></glide-core-tag>`);
|
17
|
+
expect(element).to.be.not.null;
|
18
|
+
const container = element.shadowRoot?.querySelector('.component');
|
19
|
+
expect(container).to.be.not.null;
|
20
|
+
const contentRendered = element.querySelector('[data-content]');
|
21
|
+
expect(contentRendered).to.be.not.null;
|
22
|
+
expect(contentRendered?.textContent).to.be.equal('Tag');
|
23
|
+
});
|
24
|
+
it('does not render an icon button when "removable-label" attribute is not set', async () => {
|
25
|
+
const element = await fixture(html `<glide-core-tag><span data-content>Tag</span></glide-core-tag>`);
|
26
|
+
expect(element).to.not.have.attribute('removable-label');
|
27
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
28
|
+
expect(iconButton).to.be.null;
|
29
|
+
});
|
30
|
+
it('renders an icon button with aria-label when "removable-label" attribute is set', async () => {
|
31
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
32
|
+
><span slot="prefix">Prefix</span
|
33
|
+
><span data-content>Tag</span></glide-core-tag
|
34
|
+
>`);
|
35
|
+
expect(element).to.be.not.null;
|
36
|
+
expect(element).to.have.attribute('removable-label', 'test-aria-label');
|
37
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
38
|
+
expect(iconButton).to.be.not.null;
|
39
|
+
expect(iconButton).to.have.attribute('aria-label', `Remove tag: test-aria-label`);
|
40
|
+
expect(iconButton).to.have.attribute('type', 'button');
|
41
|
+
});
|
42
|
+
it('renders the "prefix" slot and its content', async () => {
|
43
|
+
const element = await fixture(html `<glide-core-tag
|
44
|
+
><span slot="prefix" data-prefix>test-prefix</span>Tag</glide-core-tag
|
45
|
+
>`);
|
46
|
+
const prefixSlot = element.shadowRoot?.querySelector('slot[name="prefix"]');
|
47
|
+
expect(prefixSlot?.assignedNodes()?.length).to.be.equal(1);
|
48
|
+
expect(document.querySelector('[data-prefix]')).to.be.not.null;
|
49
|
+
expect(document.querySelector('[data-prefix]')?.textContent).to.be.equal('test-prefix');
|
50
|
+
});
|
51
|
+
it('renders correctly when the "size" attribute is set to "small"', async () => {
|
52
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label" size="small"
|
53
|
+
><span slot="prefix">Prefix</span
|
54
|
+
><span data-content>Tag</span></glide-core-tag
|
55
|
+
>`);
|
56
|
+
const container = element.shadowRoot?.querySelector('.component');
|
57
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
58
|
+
expect(container).to.have.class('small');
|
59
|
+
expect(iconButton).to.have.class('small');
|
60
|
+
});
|
61
|
+
it('renders correctly when the "size" attribute is set to "large"', async () => {
|
62
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label" size="large"
|
63
|
+
><span slot="prefix">Prefix</span
|
64
|
+
><span data-content>Tag</span></glide-core-tag
|
65
|
+
>`);
|
66
|
+
const container = element.shadowRoot?.querySelector('.component');
|
67
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
68
|
+
expect(container).to.have.class('large');
|
69
|
+
expect(iconButton).to.have.class('large');
|
70
|
+
});
|
71
|
+
it('throws an error when the default slot is empty', async () => {
|
72
|
+
const spy = sinon.spy();
|
73
|
+
try {
|
74
|
+
await fixture(html `<glide-core-tag></glide-core-tag>`);
|
75
|
+
}
|
76
|
+
catch (error) {
|
77
|
+
if (error instanceof ArgumentError) {
|
78
|
+
spy();
|
79
|
+
}
|
80
|
+
}
|
81
|
+
expect(spy.called).to.be.true;
|
82
|
+
});
|
83
|
+
it('does not throw an error when the default slot is non-empty', async () => {
|
84
|
+
const spy = sinon.spy();
|
85
|
+
try {
|
86
|
+
await fixture(html `<glide-core-tag>Tag</glide-core-tag>`);
|
87
|
+
}
|
88
|
+
catch (error) {
|
89
|
+
if (error instanceof ArgumentError) {
|
90
|
+
spy();
|
91
|
+
}
|
92
|
+
}
|
93
|
+
expect(spy.notCalled).to.be.true;
|
94
|
+
});
|
95
|
+
it('toggles the "activate" and "deactivate" clases when the button is clicked', async () => {
|
96
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
97
|
+
><span slot="prefix">Prefix</span>Tag</glide-core-tag
|
98
|
+
>`);
|
99
|
+
const container = element.shadowRoot?.querySelector('.component');
|
100
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
101
|
+
expect(container).to.have.class('activate');
|
102
|
+
iconButton?.click();
|
103
|
+
expect(container).to.have.class('deactivate');
|
104
|
+
});
|
105
|
+
it('removes the tag from the DOM when the button is clicked', async () => {
|
106
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
107
|
+
><span slot="prefix">Prefix</span
|
108
|
+
><span data-content>Tag</span></glide-core-tag
|
109
|
+
>`);
|
110
|
+
expect(element.shadowRoot?.querySelector('.component')).to.be.not.null;
|
111
|
+
expect(document.querySelector('[data-content]')).to.be.not.null;
|
112
|
+
element?.click();
|
113
|
+
// Wait for the animation to complete
|
114
|
+
await aTimeout(300);
|
115
|
+
// the tag and its contents should be removed
|
116
|
+
expect(document.querySelector('glide-core-tag')).to.be.null;
|
117
|
+
expect(document.querySelector('[data-content]')).to.be.null;
|
118
|
+
});
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import './tag.js';
|
2
|
+
import { expect, fixture, html, oneEvent } from '@open-wc/testing';
|
3
|
+
import GlideCoreTag from './tag.js';
|
4
|
+
GlideCoreTag.shadowRootOptions.mode = 'open';
|
5
|
+
it('dispatches a "remove" event when the icon button is clicked', async () => {
|
6
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
7
|
+
><span slot="prefix">Prefix</span
|
8
|
+
><span data-content>Tag</span></glide-core-tag
|
9
|
+
>`);
|
10
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
11
|
+
setTimeout(() => {
|
12
|
+
iconButton?.click();
|
13
|
+
});
|
14
|
+
const event = await oneEvent(element, 'remove');
|
15
|
+
expect(event?.type).to.be.equal('remove');
|
16
|
+
});
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
2
|
+
import GlideCoreTag from './tag.js';
|
3
|
+
GlideCoreTag.shadowRootOptions.mode = 'open';
|
4
|
+
it('calling `focus()` focuses the button', async () => {
|
5
|
+
const element = await fixture(html `<glide-core-tag removable-label="Removable Label"
|
6
|
+
>Tag</glide-core-tag
|
7
|
+
>`);
|
8
|
+
element.focus();
|
9
|
+
const button = element.shadowRoot?.querySelector('[data-test="button"]');
|
10
|
+
expect(element.shadowRoot?.activeElement).to.equal(button);
|
11
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
|
2
|
+
import GlideCoreTag from './tag.js';
|
3
|
+
GlideCoreTag.shadowRootOptions.mode = 'open';
|
4
|
+
it('renders dynamic string in Japanese', async () => {
|
5
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
6
|
+
><span slot="prefix">Prefix</span
|
7
|
+
><span data-content>Tag</span></glide-core-tag
|
8
|
+
>`);
|
9
|
+
document.documentElement.setAttribute('lang', 'ja');
|
10
|
+
await elementUpdated(element);
|
11
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
12
|
+
expect(iconButton).to.have.attribute('aria-label', `タグを削除: test-aria-label`);
|
13
|
+
expect(iconButton).to.have.attribute('type', 'button');
|
14
|
+
});
|
15
|
+
it('renders dynamic string in French', async () => {
|
16
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
17
|
+
><span slot="prefix">Prefix</span
|
18
|
+
><span data-content>Tag</span></glide-core-tag
|
19
|
+
>`);
|
20
|
+
document.documentElement.setAttribute('lang', 'fr');
|
21
|
+
await elementUpdated(element);
|
22
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
23
|
+
expect(iconButton).to.have.attribute('aria-label', `Supprimer la balise : test-aria-label`);
|
24
|
+
expect(iconButton).to.have.attribute('type', 'button');
|
25
|
+
});
|
package/dist/textarea.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
</textarea></div><div class="meta" data-test-description-container id="meta" slot="description"><slot name="description"></slot>${
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,i,a){var r,o=arguments.length,l=o<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,i,a);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(l=(o<3?r(l):o>3?r(t,i,l):r(t,i))||l);return o>3&&l&&Object.defineProperty(t,i,l),l};import"./label.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,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{when}from"lit/directives/when.js";import styles from"./textarea.styles.js";let GlideCoreTextarea=class GlideCoreTextarea extends LitElement{static{this.formAssociated=!0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed",delegatesFocus:!0}}static{this.styles=styles}blur(){this.#e.value?.blur()}checkValidity(){return this.isCheckingValidity=!0,this.#t.checkValidity()}disconnectedCallback(){super.disconnectedCallback(),this.form?.removeEventListener("formdata",this.#i),this.removeEventListener("invalid",this.#a)}get form(){return this.#t.form}get validity(){return this.#t.validity}get willValidate(){return this.#t.willValidate}formAssociatedCallback(){this.form?.addEventListener("formdata",this.#i)}formResetCallback(){this.value=this.getAttribute("value")??""}render(){return html`<glide-core-label orientation="${this.orientation}" ?disabled="${this.disabled}" ?error="${this.#r||this.#o}" ?hide="${this.hideLabel}" ?required="${this.required}"><slot name="tooltip" slot="tooltip"></slot><label class="label" for="textarea">${this.label}</label><div class="textarea-container" slot="control"><textarea class="${classMap({error:this.#r||this.#o})}" id="textarea" name="${ifDefined(this.name)}" placeholder="${ifDefined(this.placeholder)}" rows="${this.rows}" autocapitalize="${ifDefined(this.autocapitalize)}" spellcheck="${this.spellcheck}" ?required="${this.required}" ?readonly="${this.readonly}" ?disabled="${this.disabled}" aria-describedby="meta" ${ref(this.#e)} @input="${this.#l}" @change="${this.#s}">
|
2
|
+
</textarea></div><div class="meta" data-test-description-container id="meta" slot="description"><slot name="description"></slot>${when(this.maxlength,(()=>html`<div class="${classMap({"character-count":!0,error:this.#o})}" data-test-maxlength>${this.value.length}/${this.maxlength}</div>`))}</div></glide-core-label>`}reportValidity(){return this.#t.reportValidity()}updated(){this.#e.value&&(this.#e.value.value=this.value),this.#d()}constructor(){super(),this.value="",this.label="",this.hideLabel=!1,this.orientation="horizontal",this.placeholder="",this.rows=2,this.required=!1,this.readonly=!1,this.disabled=!1,this.spellcheck=!1,this.autocapitalize="on",this.isCheckingValidity=!1,this.isReportValidityOrSubmit=!1,this.#e=createRef(),this.#i=({formData:e})=>{this.value.length>0&&this.name&&this.value&&!this.disabled&&e.append(this.name,this.value)},this.#t=this.attachInternals(),this.addEventListener("invalid",this.#a)}#t;#e;#i;get#r(){return!this.disabled&&!this.readonly&&!this.validity.valid&&this.isReportValidityOrSubmit}get#o(){return!(!this.maxlength||this.disabled)&&this.value.length>this.maxlength}#s(e){const t=this.#e.value.value;this.value=t,this.#d(),this.dispatchEvent(new Event(e.type,e))}#l(){const e=this.#e.value.value;this.value=e,this.#t.setFormValue(this.value),this.#d()}#a(e){e.preventDefault(),this.isCheckingValidity||(this.isCheckingValidity=!1,this.isReportValidityOrSubmit=!0)}async#d(){const e=this.#e.value;this.#o?this.#t.setValidity({...e?.validity,tooLong:!0}," ",e):this.#t.setValidity(e?.validity,e?.validationMessage,e),await this.updateComplete}};__decorate([property()],GlideCoreTextarea.prototype,"value",void 0),__decorate([property()],GlideCoreTextarea.prototype,"label",void 0),__decorate([property({attribute:"hide-label",type:Boolean})],GlideCoreTextarea.prototype,"hideLabel",void 0),__decorate([property({reflect:!0})],GlideCoreTextarea.prototype,"orientation",void 0),__decorate([property()],GlideCoreTextarea.prototype,"placeholder",void 0),__decorate([property({reflect:!0,type:Number})],GlideCoreTextarea.prototype,"rows",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"required",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"readonly",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"disabled",void 0),__decorate([property({type:Number,converter:e=>e&&Number.parseInt(e,10)})],GlideCoreTextarea.prototype,"maxlength",void 0),__decorate([property({reflect:!0})],GlideCoreTextarea.prototype,"name",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"spellcheck",void 0),__decorate([property()],GlideCoreTextarea.prototype,"autocapitalize",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isCheckingValidity",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isReportValidityOrSubmit",void 0),GlideCoreTextarea=__decorate([customElement("glide-core-textarea")],GlideCoreTextarea);export default GlideCoreTextarea;
|
package/dist/textarea.styles.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
import{css}from"lit";export default css`
|
2
2
|
glide-core-label::part(tooltip-and-label-container) {
|
3
3
|
align-items: flex-start;
|
4
4
|
margin-block-start: var(--glide-core-spacing-sm);
|
@@ -33,7 +33,8 @@
|
|
33
33
|
outline: none;
|
34
34
|
}
|
35
35
|
|
36
|
-
&:focus-visible
|
36
|
+
&:focus-visible,
|
37
|
+
&:focus-visible[readonly] {
|
37
38
|
border-color: var(--glide-core-border-focus);
|
38
39
|
}
|
39
40
|
|
@@ -48,7 +49,7 @@
|
|
48
49
|
}
|
49
50
|
|
50
51
|
&[disabled] {
|
51
|
-
background-color: var(--glide-core-surface-
|
52
|
+
background-color: var(--glide-core-surface-disabled);
|
52
53
|
border: 0.0625rem solid var(--glide-core-border-base-light);
|
53
54
|
color: var(--glide-core-text-tertiary-disabled);
|
54
55
|
}
|
@@ -66,4 +67,4 @@
|
|
66
67
|
font-weight: var(--glide-core-font-weight-bold);
|
67
68
|
}
|
68
69
|
}
|
69
|
-
`;
|
70
|
+
`;
|