@crowdstrike/glide-core 0.12.2 → 0.13.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/dist/accordion.d.ts +1 -1
- package/dist/accordion.styles.js +2 -1
- package/dist/button-group.js +1 -1
- package/dist/button-group.stories.d.ts +0 -1
- package/dist/button-group.test.events.js +2 -0
- package/dist/checkbox-group.styles.js +1 -1
- package/dist/checkbox.styles.js +6 -3
- package/dist/drawer.js +1 -1
- package/dist/dropdown.d.ts +8 -1
- package/dist/dropdown.js +140 -74
- package/dist/dropdown.option.js +1 -1
- package/dist/dropdown.option.styles.js +39 -7
- package/dist/dropdown.option.test.interactions.multiple.js +2 -2
- package/dist/dropdown.option.test.interactions.single.js +2 -2
- package/dist/dropdown.styles.js +121 -16
- package/dist/dropdown.test.basics.filterable.js +19 -57
- package/dist/dropdown.test.basics.js +24 -244
- package/dist/dropdown.test.basics.multiple.js +13 -60
- package/dist/dropdown.test.basics.single.js +2 -8
- package/dist/dropdown.test.events.filterable.js +12 -66
- package/dist/dropdown.test.events.js +75 -49
- package/dist/dropdown.test.events.multiple.js +17 -87
- package/dist/dropdown.test.events.single.js +12 -60
- package/dist/dropdown.test.focus.filterable.js +11 -58
- package/dist/dropdown.test.focus.js +62 -9
- package/dist/dropdown.test.focus.multiple.js +22 -38
- package/dist/dropdown.test.focus.single.js +5 -16
- package/dist/dropdown.test.interactions.filterable.js +167 -69
- package/dist/dropdown.test.interactions.js +226 -244
- package/dist/dropdown.test.interactions.multiple.js +78 -274
- package/dist/dropdown.test.interactions.single.js +20 -85
- package/dist/dropdown.test.validity.js +12 -49
- package/dist/input.d.ts +1 -1
- package/dist/input.js +2 -1
- package/dist/input.styles.js +44 -30
- package/dist/label.js +1 -1
- package/dist/label.styles.js +7 -3
- package/dist/library/localize.d.ts +2 -0
- package/dist/menu.js +1 -1
- package/dist/menu.stories.d.ts +1 -0
- package/dist/menu.styles.js +1 -1
- package/dist/menu.test.interactions.js +1 -1
- package/dist/modal.d.ts +1 -1
- package/dist/modal.js +1 -1
- package/dist/radio-group.stories.d.ts +0 -1
- package/dist/radio-group.styles.js +1 -1
- package/dist/styles/variables.css +1 -1
- package/dist/tab.group.d.ts +0 -1
- package/dist/tab.group.js +1 -1
- package/dist/tab.group.styles.js +5 -13
- package/dist/tab.panel.styles.js +0 -3
- package/dist/tabs.stories.d.ts +0 -1
- package/dist/tag.js +1 -1
- package/dist/tag.styles.js +5 -3
- package/dist/tag.test.interactions.js +8 -8
- package/dist/textarea.styles.js +1 -1
- package/dist/translations/en.js +1 -1
- package/dist/translations/fr.d.ts +1 -1
- package/dist/translations/fr.js +1 -1
- package/dist/translations/ja.d.ts +1 -1
- package/dist/translations/ja.js +1 -1
- package/dist/tree.stories.d.ts +0 -1
- package/package.json +18 -18
@@ -27,7 +27,7 @@ import{css}from"lit";export default[css`
|
|
27
27
|
font-style: var(--glide-core-body-sm-font-style);
|
28
28
|
font-weight: var(--glide-core-body-sm-font-weight);
|
29
29
|
line-height: var(--glide-core-body-sm-line-height);
|
30
|
-
padding-inline-start:
|
30
|
+
padding-inline-start: 0.625rem;
|
31
31
|
|
32
32
|
&:not(.editable) {
|
33
33
|
padding-inline-end: var(--glide-core-spacing-sm);
|
@@ -40,7 +40,7 @@ import{css}from"lit";export default[css`
|
|
40
40
|
font-style: var(--glide-core-body-xs-font-style);
|
41
41
|
font-weight: var(--glide-core-body-xs-font-weight);
|
42
42
|
line-height: var(--glide-core-body-xs-line-height);
|
43
|
-
padding-inline-start: var(--glide-core-spacing-
|
43
|
+
padding-inline-start: var(--glide-core-spacing-sm);
|
44
44
|
|
45
45
|
&:not(.editable) {
|
46
46
|
padding-inline-end: var(--glide-core-spacing-xs);
|
@@ -86,15 +86,47 @@ import{css}from"lit";export default[css`
|
|
86
86
|
}
|
87
87
|
|
88
88
|
.icon-slot {
|
89
|
-
|
90
|
-
|
89
|
+
&.large {
|
90
|
+
&::slotted(*) {
|
91
|
+
block-size: 1rem;
|
92
|
+
inline-size: 1rem;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
&.small {
|
97
|
+
&::slotted(*) {
|
98
|
+
block-size: 0.75rem;
|
99
|
+
inline-size: 0.75rem;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
&::slotted(*) {
|
104
|
+
align-items: center;
|
105
|
+
display: flex;
|
106
|
+
padding-inline-end: var(--glide-core-spacing-xs);
|
107
|
+
}
|
91
108
|
}
|
92
109
|
|
93
110
|
.checkbox-icon-slot {
|
111
|
+
&.large {
|
112
|
+
&::slotted(*) {
|
113
|
+
block-size: 1rem;
|
114
|
+
inline-size: 1rem;
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
&.small {
|
119
|
+
&::slotted(*) {
|
120
|
+
block-size: 0.75rem;
|
121
|
+
inline-size: 0.75rem;
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
94
125
|
&::slotted(*) {
|
95
|
-
|
96
|
-
|
97
|
-
|
126
|
+
align-items: center;
|
127
|
+
block-size: 0.75rem;
|
128
|
+
display: flex;
|
129
|
+
inline-size: 0.75rem;
|
98
130
|
}
|
99
131
|
}
|
100
132
|
|
@@ -35,8 +35,8 @@ it('sets `privateIsEditActive`', async () => {
|
|
35
35
|
private-multiple
|
36
36
|
></glide-core-dropdown-option>`);
|
37
37
|
const button = component.shadowRoot?.querySelector('[data-test="edit-button"]');
|
38
|
-
button?.dispatchEvent(new
|
38
|
+
button?.dispatchEvent(new MouseEvent('mouseover'));
|
39
39
|
expect(component.privateIsEditActive).to.be.true;
|
40
|
-
button?.dispatchEvent(new
|
40
|
+
button?.dispatchEvent(new MouseEvent('mouseout'));
|
41
41
|
expect(component.privateIsEditActive).to.be.false;
|
42
42
|
});
|
@@ -69,8 +69,8 @@ it('sets `privateIsEditActive`', async () => {
|
|
69
69
|
editable
|
70
70
|
></glide-core-dropdown-option>`);
|
71
71
|
const button = component.shadowRoot?.querySelector('[data-test="edit-button"]');
|
72
|
-
button?.dispatchEvent(new
|
72
|
+
button?.dispatchEvent(new MouseEvent('mouseover'));
|
73
73
|
expect(component.privateIsEditActive).to.be.true;
|
74
|
-
button?.dispatchEvent(new
|
74
|
+
button?.dispatchEvent(new MouseEvent('mouseout'));
|
75
75
|
expect(component.privateIsEditActive).to.be.false;
|
76
76
|
});
|
package/dist/dropdown.styles.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import opacityAndScaleAnimation from"./styles/opacity-and-scale-animation.js";import visuallyHidden from"./styles/visually-hidden.js";export default[css`
|
2
|
-
${focusOutline(".
|
3
|
-
${opacityAndScaleAnimation(".options:popover-open")}
|
2
|
+
${focusOutline(".add-button:focus-visible")}
|
3
|
+
${opacityAndScaleAnimation(".options-and-footer:popover-open")}
|
4
|
+
${visuallyHidden(".item-count")}
|
4
5
|
${visuallyHidden(".selected-option-labels")}
|
5
6
|
`,css`
|
6
7
|
.component {
|
@@ -14,6 +15,19 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
14
15
|
position: relative;
|
15
16
|
}
|
16
17
|
|
18
|
+
glide-core-private-label {
|
19
|
+
&::part(private-control-and-summary) {
|
20
|
+
/*
|
21
|
+
The Label component's grid column styling combined with the fact that
|
22
|
+
".dropdown-and-options" isn't a direct descendant of that grid means that
|
23
|
+
Dropdown's label won't shrink when space constrained without a minimum
|
24
|
+
width on Label's ".control-and-summary". It's not clear to me why Grid
|
25
|
+
behaves this way.
|
26
|
+
*/
|
27
|
+
min-inline-size: var(--min-inline-size);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
17
31
|
.dropdown {
|
18
32
|
--button-and-input-height: 1.25rem;
|
19
33
|
|
@@ -38,7 +52,6 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
38
52
|
background-color 200ms ease-in-out,
|
39
53
|
border-color 200ms ease-in-out;
|
40
54
|
user-select: none;
|
41
|
-
white-space: nowrap;
|
42
55
|
|
43
56
|
&.quiet:not(.multiple) {
|
44
57
|
background-color: transparent;
|
@@ -79,6 +92,7 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
79
92
|
|
80
93
|
&:is(
|
81
94
|
:hover,
|
95
|
+
:has(.primary-button:hover),
|
82
96
|
:has(.primary-button:focus-visible, .input:focus-visible)
|
83
97
|
):not(&.disabled, &.error, &.quiet, &.readonly) {
|
84
98
|
border-color: var(--glide-core-border-focus);
|
@@ -91,49 +105,126 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
91
105
|
}
|
92
106
|
}
|
93
107
|
|
94
|
-
.options {
|
108
|
+
.options-and-footer {
|
95
109
|
--border-width: 1px;
|
96
|
-
--padding: var(--glide-core-spacing-xxxs);
|
97
110
|
|
98
111
|
background-color: var(--glide-core-surface-modal);
|
99
|
-
border: var(--border-width) solid var(--glide-core-
|
112
|
+
border: var(--border-width) solid var(--glide-core-border-base-lighter);
|
100
113
|
border-radius: var(--glide-core-spacing-xs);
|
101
114
|
box-shadow: var(--glide-core-shadow-lg);
|
102
|
-
box-sizing: border-box;
|
103
115
|
inset: unset;
|
116
|
+
min-inline-size: var(--min-inline-size);
|
117
|
+
padding: 0;
|
118
|
+
position: absolute;
|
119
|
+
}
|
120
|
+
|
121
|
+
.options {
|
122
|
+
box-sizing: border-box;
|
104
123
|
max-block-size: calc(
|
105
|
-
var(--private-option-height) * 9 + var(--
|
124
|
+
var(--private-option-height) * 9 + var(--glide-core-spacing-xxxs) * 2 +
|
106
125
|
var(--border-width) * 2
|
107
126
|
);
|
108
|
-
min-inline-size: var(--min-inline-size);
|
109
127
|
overflow: auto;
|
110
|
-
padding: var(--padding);
|
111
|
-
position: absolute;
|
112
128
|
scroll-behavior: smooth;
|
113
129
|
|
130
|
+
&.large {
|
131
|
+
--private-option-height: 1.75rem;
|
132
|
+
}
|
133
|
+
|
134
|
+
&.small {
|
135
|
+
--private-option-height: 1.25rem;
|
136
|
+
}
|
137
|
+
|
114
138
|
&.hidden {
|
115
139
|
display: none;
|
116
140
|
}
|
141
|
+
}
|
142
|
+
|
143
|
+
.options-slot {
|
144
|
+
display: block;
|
145
|
+
padding: var(--glide-core-spacing-xxxs);
|
146
|
+
}
|
147
|
+
|
148
|
+
.footer {
|
149
|
+
border-block-start: 1px solid var(--glide-core-border-base);
|
150
|
+
display: none;
|
151
|
+
inline-size: calc(100% - var(--glide-core-spacing-xxxs) * 2);
|
152
|
+
inset-block-end: 0;
|
153
|
+
padding: var(--glide-core-spacing-xxxs);
|
154
|
+
|
155
|
+
/*
|
156
|
+
"sticky" is a little hack so that footer is absolutely positioned but
|
157
|
+
its space in layout is preserved, so it doesn't overlap the last option.
|
158
|
+
*/
|
159
|
+
position: sticky;
|
160
|
+
|
161
|
+
&.visible {
|
162
|
+
display: block;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
.add-button {
|
167
|
+
align-items: center;
|
168
|
+
background-color: transparent;
|
169
|
+
border: none;
|
170
|
+
border-radius: 0.75rem;
|
171
|
+
display: flex;
|
172
|
+
font-family: var(--glide-core-body-sm-font-family);
|
173
|
+
font-weight: var(--glide-core-body-sm-font-weight);
|
174
|
+
inline-size: 100%;
|
175
|
+
line-height: 100%;
|
176
|
+
text-align: start;
|
117
177
|
|
118
178
|
&.large {
|
119
|
-
--
|
179
|
+
--size: 1rem;
|
180
|
+
|
181
|
+
column-gap: 0.625rem;
|
182
|
+
font-size: var(--glide-core-body-sm-font-size);
|
183
|
+
padding-block: 0.375rem;
|
184
|
+
padding-inline: var(--glide-core-spacing-sm);
|
120
185
|
}
|
121
186
|
|
122
187
|
&.small {
|
123
|
-
--
|
188
|
+
--size: 0.875rem;
|
189
|
+
|
190
|
+
column-gap: var(--glide-core-spacing-xs);
|
191
|
+
font-size: var(--glide-core-body-xs-font-size);
|
192
|
+
padding-block: var(--glide-core-spacing-xxxs);
|
193
|
+
padding-inline: var(--glide-core-spacing-xs);
|
194
|
+
}
|
195
|
+
|
196
|
+
&:focus {
|
197
|
+
outline: none;
|
198
|
+
}
|
199
|
+
|
200
|
+
&:focus-visible {
|
201
|
+
outline-offset: -2px;
|
202
|
+
}
|
203
|
+
|
204
|
+
&:focus,
|
205
|
+
&:hover {
|
206
|
+
background-color: var(--glide-core-surface-hover);
|
124
207
|
}
|
125
208
|
}
|
126
209
|
|
127
210
|
.select-all {
|
128
|
-
border-block-end: 1px solid var(--glide-core-border-base
|
129
|
-
|
130
|
-
padding-block-end: var(--glide-core-spacing-xxxs);
|
211
|
+
border-block-end: 1px solid var(--glide-core-border-base);
|
212
|
+
padding: var(--glide-core-spacing-xxxs);
|
131
213
|
|
132
214
|
&:not([hidden]) {
|
133
215
|
display: block;
|
134
216
|
}
|
135
217
|
}
|
136
218
|
|
219
|
+
.no-results {
|
220
|
+
font-family: var(--glide-core-body-sm-font-family);
|
221
|
+
font-size: var(--glide-core-body-sm-font-size);
|
222
|
+
font-weight: var(--glide-core-body-sm-font-weight);
|
223
|
+
line-height: var(--glide-core-body-sm-line-height);
|
224
|
+
padding: 0.625rem 0.875rem;
|
225
|
+
text-transform: capitalize;
|
226
|
+
}
|
227
|
+
|
137
228
|
.placeholder {
|
138
229
|
/*
|
139
230
|
Using the browser's default placeholder color for now, as
|
@@ -179,6 +270,7 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
179
270
|
align-content: center;
|
180
271
|
color: var(--glide-core-text-link);
|
181
272
|
margin-inline-end: var(--glide-core-spacing-md);
|
273
|
+
white-space: nowrap;
|
182
274
|
}
|
183
275
|
|
184
276
|
.single-select-icon-slot {
|
@@ -195,12 +287,25 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
195
287
|
}
|
196
288
|
}
|
197
289
|
|
290
|
+
.internal-label-tooltip {
|
291
|
+
display: none;
|
292
|
+
overflow: hidden;
|
293
|
+
|
294
|
+
&.visible {
|
295
|
+
display: block;
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
198
299
|
.internal-label {
|
300
|
+
overflow: hidden;
|
301
|
+
|
199
302
|
/*
|
200
303
|
2px so the label is vertically aligned. "vertical-align: middle" has no
|
201
304
|
effect on flex children.
|
202
305
|
*/
|
203
306
|
padding-block-start: 0.125rem;
|
307
|
+
text-overflow: ellipsis;
|
308
|
+
white-space: nowrap;
|
204
309
|
}
|
205
310
|
|
206
311
|
.primary-button {
|
@@ -4,69 +4,31 @@ import { expect, fixture, html } from '@open-wc/testing';
|
|
4
4
|
import GlideCoreDropdown from './dropdown.js';
|
5
5
|
GlideCoreDropdown.shadowRootOptions.mode = 'open';
|
6
6
|
const defaultSlot = html `
|
7
|
-
<glide-core-dropdown-option
|
8
|
-
|
9
|
-
|
10
|
-
></glide-core-dropdown-option>
|
11
|
-
|
12
|
-
<glide-core-dropdown-option
|
13
|
-
|
14
|
-
|
15
|
-
></glide-core-dropdown-option>
|
16
|
-
|
17
|
-
<glide-core-dropdown-option
|
18
|
-
label="Three"
|
19
|
-
value="three"
|
20
|
-
></glide-core-dropdown-option>
|
21
|
-
|
22
|
-
<glide-core-dropdown-option
|
23
|
-
label="Four"
|
24
|
-
value="four"
|
25
|
-
></glide-core-dropdown-option>
|
26
|
-
|
27
|
-
<glide-core-dropdown-option
|
28
|
-
label="Five"
|
29
|
-
value="five"
|
30
|
-
></glide-core-dropdown-option>
|
31
|
-
|
32
|
-
<glide-core-dropdown-option
|
33
|
-
label="Six"
|
34
|
-
value="six"
|
35
|
-
></glide-core-dropdown-option>
|
36
|
-
|
37
|
-
<glide-core-dropdown-option
|
38
|
-
label="Seven"
|
39
|
-
value="seven"
|
40
|
-
></glide-core-dropdown-option>
|
41
|
-
|
42
|
-
<glide-core-dropdown-option
|
43
|
-
label="Eight"
|
44
|
-
value="eight"
|
45
|
-
></glide-core-dropdown-option>
|
46
|
-
|
47
|
-
<glide-core-dropdown-option
|
48
|
-
label="Nine"
|
49
|
-
value="nine"
|
50
|
-
></glide-core-dropdown-option>
|
51
|
-
|
52
|
-
<glide-core-dropdown-option
|
53
|
-
label="Ten"
|
54
|
-
value="ten"
|
55
|
-
></glide-core-dropdown-option>
|
56
|
-
|
57
|
-
<glide-core-dropdown-option
|
58
|
-
label="Eleven"
|
59
|
-
value="eleven"
|
60
|
-
></glide-core-dropdown-option>
|
7
|
+
<glide-core-dropdown-option label="One"></glide-core-dropdown-option>
|
8
|
+
<glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
|
9
|
+
<glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
|
10
|
+
<glide-core-dropdown-option label="Four"></glide-core-dropdown-option>
|
11
|
+
<glide-core-dropdown-option label="Five"></glide-core-dropdown-option>
|
12
|
+
<glide-core-dropdown-option label="Six"></glide-core-dropdown-option>
|
13
|
+
<glide-core-dropdown-option label="Seven"></glide-core-dropdown-option>
|
14
|
+
<glide-core-dropdown-option label="Eight"></glide-core-dropdown-option>
|
15
|
+
<glide-core-dropdown-option label="Nine"></glide-core-dropdown-option>
|
16
|
+
<glide-core-dropdown-option label="Ten"></glide-core-dropdown-option>
|
17
|
+
<glide-core-dropdown-option label="Eleven"></glide-core-dropdown-option>
|
61
18
|
`;
|
62
19
|
it('is accessible', async () => {
|
63
20
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
|
64
21
|
${defaultSlot}
|
65
22
|
</glide-core-dropdown>`);
|
66
23
|
await expect(component).to.be.accessible({
|
67
|
-
|
68
|
-
|
69
|
-
|
24
|
+
ignoredRules: [
|
25
|
+
// Axe doesn't like that our item count element doesn't have a `role`. Yet
|
26
|
+
// it does label `<input>` and is announced correctly, at least by VoiceOver.
|
27
|
+
'aria-prohibited-attr',
|
28
|
+
// Axe doesn't search within slots when determining whether an element
|
29
|
+
// has an ID that matches `aria-activedescendant` exists.
|
30
|
+
'aria-valid-attr-value',
|
31
|
+
],
|
70
32
|
});
|
71
33
|
});
|
72
34
|
it('is filterable', async () => {
|