@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.
Files changed (63) hide show
  1. package/dist/accordion.d.ts +1 -1
  2. package/dist/accordion.styles.js +2 -1
  3. package/dist/button-group.js +1 -1
  4. package/dist/button-group.stories.d.ts +0 -1
  5. package/dist/button-group.test.events.js +2 -0
  6. package/dist/checkbox-group.styles.js +1 -1
  7. package/dist/checkbox.styles.js +6 -3
  8. package/dist/drawer.js +1 -1
  9. package/dist/dropdown.d.ts +8 -1
  10. package/dist/dropdown.js +140 -74
  11. package/dist/dropdown.option.js +1 -1
  12. package/dist/dropdown.option.styles.js +39 -7
  13. package/dist/dropdown.option.test.interactions.multiple.js +2 -2
  14. package/dist/dropdown.option.test.interactions.single.js +2 -2
  15. package/dist/dropdown.styles.js +121 -16
  16. package/dist/dropdown.test.basics.filterable.js +19 -57
  17. package/dist/dropdown.test.basics.js +24 -244
  18. package/dist/dropdown.test.basics.multiple.js +13 -60
  19. package/dist/dropdown.test.basics.single.js +2 -8
  20. package/dist/dropdown.test.events.filterable.js +12 -66
  21. package/dist/dropdown.test.events.js +75 -49
  22. package/dist/dropdown.test.events.multiple.js +17 -87
  23. package/dist/dropdown.test.events.single.js +12 -60
  24. package/dist/dropdown.test.focus.filterable.js +11 -58
  25. package/dist/dropdown.test.focus.js +62 -9
  26. package/dist/dropdown.test.focus.multiple.js +22 -38
  27. package/dist/dropdown.test.focus.single.js +5 -16
  28. package/dist/dropdown.test.interactions.filterable.js +167 -69
  29. package/dist/dropdown.test.interactions.js +226 -244
  30. package/dist/dropdown.test.interactions.multiple.js +78 -274
  31. package/dist/dropdown.test.interactions.single.js +20 -85
  32. package/dist/dropdown.test.validity.js +12 -49
  33. package/dist/input.d.ts +1 -1
  34. package/dist/input.js +2 -1
  35. package/dist/input.styles.js +44 -30
  36. package/dist/label.js +1 -1
  37. package/dist/label.styles.js +7 -3
  38. package/dist/library/localize.d.ts +2 -0
  39. package/dist/menu.js +1 -1
  40. package/dist/menu.stories.d.ts +1 -0
  41. package/dist/menu.styles.js +1 -1
  42. package/dist/menu.test.interactions.js +1 -1
  43. package/dist/modal.d.ts +1 -1
  44. package/dist/modal.js +1 -1
  45. package/dist/radio-group.stories.d.ts +0 -1
  46. package/dist/radio-group.styles.js +1 -1
  47. package/dist/styles/variables.css +1 -1
  48. package/dist/tab.group.d.ts +0 -1
  49. package/dist/tab.group.js +1 -1
  50. package/dist/tab.group.styles.js +5 -13
  51. package/dist/tab.panel.styles.js +0 -3
  52. package/dist/tabs.stories.d.ts +0 -1
  53. package/dist/tag.js +1 -1
  54. package/dist/tag.styles.js +5 -3
  55. package/dist/tag.test.interactions.js +8 -8
  56. package/dist/textarea.styles.js +1 -1
  57. package/dist/translations/en.js +1 -1
  58. package/dist/translations/fr.d.ts +1 -1
  59. package/dist/translations/fr.js +1 -1
  60. package/dist/translations/ja.d.ts +1 -1
  61. package/dist/translations/ja.js +1 -1
  62. package/dist/tree.stories.d.ts +0 -1
  63. 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: var(--glide-core-spacing-sm);
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-xs);
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
- display: block;
90
- padding-inline-end: var(--glide-core-spacing-xs);
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
- block-size: 1rem;
96
- display: block;
97
- inline-size: 1rem;
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 Event('mouseover'));
38
+ button?.dispatchEvent(new MouseEvent('mouseover'));
39
39
  expect(component.privateIsEditActive).to.be.true;
40
- button?.dispatchEvent(new Event('mouseout'));
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 Event('mouseover'));
72
+ button?.dispatchEvent(new MouseEvent('mouseover'));
73
73
  expect(component.privateIsEditActive).to.be.true;
74
- button?.dispatchEvent(new Event('mouseout'));
74
+ button?.dispatchEvent(new MouseEvent('mouseout'));
75
75
  expect(component.privateIsEditActive).to.be.false;
76
76
  });
@@ -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(".edit-button:focus-visible")}
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-surface-modal);
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(--padding) * 2 +
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
- --private-option-height: 1.75rem;
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
- --private-option-height: 1.25rem;
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-light);
129
- margin-block-end: var(--glide-core-spacing-xxxs);
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
- label="One"
9
- value="one"
10
- ></glide-core-dropdown-option>
11
-
12
- <glide-core-dropdown-option
13
- label="Two"
14
- value="two"
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
- // Axe doesn't search within slots when determining whether an element
68
- // has an ID that matches `aria-activedescendant` exists.
69
- ignoredRules: ['aria-valid-attr-value'],
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 () => {