@gitlab/ui 54.1.2 → 54.2.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/CHANGELOG.md +7 -0
- package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +5 -11
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +1 -1
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.js +2 -2
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +2 -2
- package/dist/components/base/new_dropdowns/listbox/listbox.js +2 -2
- package/dist/components/base/new_dropdowns/listbox/listbox_group.js +1 -1
- package/dist/components/base/new_dropdowns/listbox/listbox_item.js +3 -3
- package/dist/index.css +2 -2
- package/dist/index.css.map +1 -1
- package/package.json +1 -1
- package/scss_to_js/scss_variables.js +1 -0
- package/scss_to_js/scss_variables.json +5 -0
- package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.spec.js +18 -20
- package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +14 -19
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.scss +2 -2
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.stories.js +9 -8
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +1 -1
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.vue +2 -2
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.spec.js +3 -3
- package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.vue +6 -6
- package/src/components/base/new_dropdowns/dropdown.scss +95 -4
- package/src/components/base/new_dropdowns/dropdown_item.scss +71 -0
- package/src/components/base/new_dropdowns/listbox/listbox.scss +2 -2
- package/src/components/base/new_dropdowns/listbox/listbox.stories.js +12 -10
- package/src/components/base/new_dropdowns/listbox/listbox.vue +3 -3
- package/src/components/base/new_dropdowns/listbox/listbox_group.vue +6 -2
- package/src/components/base/new_dropdowns/listbox/listbox_item.vue +4 -4
- package/src/scss/components.scss +1 -1
- package/src/scss/variables.scss +1 -0
- package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.scss +0 -5
package/package.json
CHANGED
|
@@ -325,6 +325,7 @@ export const glIconRadio = ''
|
|
|
325
325
|
export const defaultIconSize = '1rem'
|
|
326
326
|
export const glIconSizes = '8 12 14 16 24 32 48 72'
|
|
327
327
|
export const glDropdownWidth = '15rem'
|
|
328
|
+
export const glNewDropdownWidth = '16rem'
|
|
328
329
|
export const glDropdownWidthNarrow = '10rem'
|
|
329
330
|
export const glDropdownWidthWide = '25rem'
|
|
330
331
|
export const glMaxDropdownMaxHeight = '19.5rem'
|
|
@@ -1735,6 +1735,11 @@
|
|
|
1735
1735
|
"value": "px-to-rem(240px)",
|
|
1736
1736
|
"compiledValue": "15rem"
|
|
1737
1737
|
},
|
|
1738
|
+
{
|
|
1739
|
+
"name": "$gl-new-dropdown-width",
|
|
1740
|
+
"value": "px-to-rem(256px)",
|
|
1741
|
+
"compiledValue": "16rem"
|
|
1742
|
+
},
|
|
1738
1743
|
{
|
|
1739
1744
|
"name": "$gl-dropdown-width-narrow",
|
|
1740
1745
|
"value": "px-to-rem(160px)",
|
|
@@ -19,8 +19,7 @@ const DEFAULT_BTN_TOGGLE_CLASSES = [
|
|
|
19
19
|
'btn-default',
|
|
20
20
|
'btn-md',
|
|
21
21
|
'gl-button',
|
|
22
|
-
'dropdown-toggle',
|
|
23
|
-
'gl-dropdown-toggle',
|
|
22
|
+
'gl-new-dropdown-toggle',
|
|
24
23
|
];
|
|
25
24
|
|
|
26
25
|
describe('base dropdown', () => {
|
|
@@ -42,10 +41,10 @@ describe('base dropdown', () => {
|
|
|
42
41
|
jest.clearAllMocks();
|
|
43
42
|
});
|
|
44
43
|
|
|
45
|
-
const findDefaultDropdownToggle = () => wrapper.find('.btn.gl-dropdown-toggle');
|
|
46
|
-
const findCustomDropdownToggle = () => wrapper.find('.gl-dropdown-custom-toggle');
|
|
44
|
+
const findDefaultDropdownToggle = () => wrapper.find('.btn.gl-new-dropdown-toggle');
|
|
45
|
+
const findCustomDropdownToggle = () => wrapper.find('.gl-new-dropdown-custom-toggle');
|
|
47
46
|
const findDropdownToggleText = () => findDefaultDropdownToggle().find('.gl-button-text');
|
|
48
|
-
const findDropdownMenu = () => wrapper.find('.dropdown-
|
|
47
|
+
const findDropdownMenu = () => wrapper.find('.gl-new-dropdown-panel');
|
|
49
48
|
|
|
50
49
|
describe('popper.js instance', () => {
|
|
51
50
|
it('should initialize popper.js instance with toggle and menu elements and config for left-aligned menu', async () => {
|
|
@@ -95,7 +94,7 @@ describe('base dropdown', () => {
|
|
|
95
94
|
|
|
96
95
|
it('renders the content', () => {
|
|
97
96
|
buildWrapper({}, slots);
|
|
98
|
-
expect(wrapper.find('.gl-dropdown-inner').html()).toContain(defaultContent);
|
|
97
|
+
expect(wrapper.find('.gl-new-dropdown-inner').html()).toContain(defaultContent);
|
|
99
98
|
});
|
|
100
99
|
});
|
|
101
100
|
|
|
@@ -103,11 +102,10 @@ describe('base dropdown', () => {
|
|
|
103
102
|
props | toggleClasses
|
|
104
103
|
${{}} | ${[]}
|
|
105
104
|
${{ toggleText: 'toggleText' }} | ${[]}
|
|
106
|
-
${{
|
|
107
|
-
${{ icon: 'close' }}
|
|
108
|
-
${{ icon: 'close',
|
|
109
|
-
${{
|
|
110
|
-
${{ toggleText: 'toggleText', noCaret: true }} | ${['dropdown-toggle-no-caret']}
|
|
105
|
+
${{ icon: 'close' }} | ${['gl-new-dropdown-icon-only']}
|
|
106
|
+
${{ icon: 'close', toggleText: 'toggleText', textSrOnly: true }} | ${['gl-new-dropdown-icon-only']}
|
|
107
|
+
${{ icon: 'close', textSrOnly: true }} | ${['gl-new-dropdown-icon-only']}
|
|
108
|
+
${{ toggleText: 'toggleText', noCaret: true }} | ${['gl-new-dropdown-toggle-no-caret']}
|
|
111
109
|
`('dropdown with props $props', ({ props, toggleClasses }) => {
|
|
112
110
|
beforeEach(async () => {
|
|
113
111
|
buildWrapper(props);
|
|
@@ -153,7 +151,7 @@ describe('base dropdown', () => {
|
|
|
153
151
|
it('applies block style if true', () => {
|
|
154
152
|
buildWrapper({ block: true });
|
|
155
153
|
|
|
156
|
-
expect(wrapper.classes()).toContain('gl-display-block');
|
|
154
|
+
expect(wrapper.classes()).toContain('gl-display-block!');
|
|
157
155
|
expect(findDropdownToggleText().classes()).toContain('gl-w-full');
|
|
158
156
|
expect(findDefaultDropdownToggle().props('block')).toBe(true);
|
|
159
157
|
});
|
|
@@ -170,14 +168,14 @@ describe('base dropdown', () => {
|
|
|
170
168
|
|
|
171
169
|
// open menu clicking toggle btn
|
|
172
170
|
await toggle.trigger('click');
|
|
173
|
-
expect(menu.classes('
|
|
171
|
+
expect(menu.classes('gl-display-block!')).toBe(true);
|
|
174
172
|
expect(toggle.attributes('aria-expanded')).toBe('true');
|
|
175
173
|
await nextTick();
|
|
176
174
|
expect(wrapper.emitted(GL_DROPDOWN_SHOWN).length).toBe(1);
|
|
177
175
|
|
|
178
176
|
// close menu clicking toggle btn again
|
|
179
177
|
await toggle.trigger('click');
|
|
180
|
-
expect(menu.classes('
|
|
178
|
+
expect(menu.classes('gl-display-block!')).toBe(false);
|
|
181
179
|
expect(toggle.attributes('aria-expanded')).toBeUndefined();
|
|
182
180
|
expect(wrapper.emitted(GL_DROPDOWN_HIDDEN).length).toBe(1);
|
|
183
181
|
});
|
|
@@ -188,11 +186,11 @@ describe('base dropdown', () => {
|
|
|
188
186
|
|
|
189
187
|
// open menu clicking toggle btn
|
|
190
188
|
await toggle.trigger('click');
|
|
191
|
-
expect(menu.classes('
|
|
189
|
+
expect(menu.classes('gl-display-block!')).toBe(true);
|
|
192
190
|
|
|
193
191
|
// close menu pressing ESC on it
|
|
194
192
|
await menu.trigger('keydown.esc');
|
|
195
|
-
expect(menu.classes('
|
|
193
|
+
expect(menu.classes('gl-display-block!')).toBe(false);
|
|
196
194
|
expect(toggle.attributes('aria-expanded')).toBeUndefined();
|
|
197
195
|
expect(wrapper.emitted(GL_DROPDOWN_HIDDEN).length).toBe(1);
|
|
198
196
|
expect(toggle.element).toHaveFocus();
|
|
@@ -225,14 +223,14 @@ describe('base dropdown', () => {
|
|
|
225
223
|
const menu = findDropdownMenu();
|
|
226
224
|
// open menu clicking toggle btn
|
|
227
225
|
await toggle.trigger('keydown', { code: ENTER });
|
|
228
|
-
expect(menu.classes('
|
|
226
|
+
expect(menu.classes('gl-display-block!')).toBe(true);
|
|
229
227
|
expect(toggle.attributes('aria-expanded')).toBe('true');
|
|
230
228
|
await nextTick();
|
|
231
229
|
expect(wrapper.emitted(GL_DROPDOWN_SHOWN).length).toBe(1);
|
|
232
230
|
|
|
233
231
|
// close menu clicking toggle btn again
|
|
234
232
|
await toggle.trigger('keydown', { code: ENTER });
|
|
235
|
-
expect(menu.classes('
|
|
233
|
+
expect(menu.classes('gl-display-block!')).toBe(false);
|
|
236
234
|
expect(toggle.attributes('aria-expanded')).toBeUndefined();
|
|
237
235
|
expect(wrapper.emitted(GL_DROPDOWN_HIDDEN).length).toBe(1);
|
|
238
236
|
});
|
|
@@ -242,11 +240,11 @@ describe('base dropdown', () => {
|
|
|
242
240
|
const menu = findDropdownMenu();
|
|
243
241
|
// open menu clicking toggle btn
|
|
244
242
|
await toggle.trigger('click');
|
|
245
|
-
expect(menu.classes('
|
|
243
|
+
expect(menu.classes('gl-display-block!')).toBe(true);
|
|
246
244
|
|
|
247
245
|
// close menu pressing ESC on it
|
|
248
246
|
await menu.trigger('keydown.esc');
|
|
249
|
-
expect(menu.classes('
|
|
247
|
+
expect(menu.classes('gl-display-block!')).toBe(false);
|
|
250
248
|
expect(toggle.attributes('aria-expanded')).toBeUndefined();
|
|
251
249
|
expect(wrapper.emitted(GL_DROPDOWN_HIDDEN).length).toBe(1);
|
|
252
250
|
expect(toggle.element).toHaveFocus();
|
|
@@ -119,18 +119,13 @@ export default {
|
|
|
119
119
|
isIconOnly() {
|
|
120
120
|
return Boolean(this.icon && (!this.toggleText?.length || this.textSrOnly));
|
|
121
121
|
},
|
|
122
|
-
isIconWithText() {
|
|
123
|
-
return Boolean(this.icon && this.toggleText?.length && !this.textSrOnly);
|
|
124
|
-
},
|
|
125
122
|
toggleButtonClasses() {
|
|
126
123
|
return [
|
|
127
124
|
this.toggleClass,
|
|
128
125
|
{
|
|
129
|
-
'gl-dropdown-toggle': true,
|
|
130
|
-
'dropdown-
|
|
131
|
-
'dropdown-
|
|
132
|
-
'dropdown-icon-text': this.isIconWithText,
|
|
133
|
-
'dropdown-toggle-no-caret': this.noCaret,
|
|
126
|
+
'gl-new-dropdown-toggle': true,
|
|
127
|
+
'gl-new-dropdown-icon-only': this.isIconOnly,
|
|
128
|
+
'gl-new-dropdown-toggle-no-caret': this.noCaret,
|
|
134
129
|
},
|
|
135
130
|
];
|
|
136
131
|
},
|
|
@@ -165,7 +160,7 @@ export default {
|
|
|
165
160
|
return {
|
|
166
161
|
is: 'div',
|
|
167
162
|
role: 'button',
|
|
168
|
-
class: 'gl-dropdown-custom-toggle
|
|
163
|
+
class: 'gl-new-dropdown-custom-toggle',
|
|
169
164
|
tabindex: '0',
|
|
170
165
|
listeners: {
|
|
171
166
|
keydown: (event) => this.onKeydown(event),
|
|
@@ -247,11 +242,7 @@ export default {
|
|
|
247
242
|
</script>
|
|
248
243
|
|
|
249
244
|
<template>
|
|
250
|
-
<div
|
|
251
|
-
v-outside="close"
|
|
252
|
-
class="gl-dropdown dropdown gl-display-inline-flex gl-vertical-align-middle"
|
|
253
|
-
:class="{ 'gl-display-block': block }"
|
|
254
|
-
>
|
|
245
|
+
<div v-outside="close" class="gl-new-dropdown" :class="{ 'gl-display-block!': block }">
|
|
255
246
|
<component
|
|
256
247
|
:is="toggleOptions.is"
|
|
257
248
|
v-bind="toggleOptions"
|
|
@@ -266,10 +257,14 @@ export default {
|
|
|
266
257
|
>
|
|
267
258
|
<!-- @slot Custom toggle button content -->
|
|
268
259
|
<slot name="toggle">
|
|
269
|
-
<span class="gl-dropdown-button-text" :class="{ 'gl-sr-only': textSrOnly }">
|
|
260
|
+
<span class="gl-new-dropdown-button-text" :class="{ 'gl-sr-only': textSrOnly }">
|
|
270
261
|
{{ toggleText }}
|
|
271
262
|
</span>
|
|
272
|
-
<gl-icon
|
|
263
|
+
<gl-icon
|
|
264
|
+
v-if="!noCaret"
|
|
265
|
+
class="gl-button-icon gl-new-dropdown-chevron"
|
|
266
|
+
name="chevron-down"
|
|
267
|
+
/>
|
|
273
268
|
</slot>
|
|
274
269
|
</component>
|
|
275
270
|
|
|
@@ -277,11 +272,11 @@ export default {
|
|
|
277
272
|
:id="baseDropdownId"
|
|
278
273
|
ref="content"
|
|
279
274
|
data-testid="base-dropdown-menu"
|
|
280
|
-
class="dropdown-
|
|
281
|
-
:class="{
|
|
275
|
+
class="gl-new-dropdown-panel"
|
|
276
|
+
:class="{ 'gl-display-block!': visible }"
|
|
282
277
|
@keydown.esc.stop.prevent="closeAndFocus"
|
|
283
278
|
>
|
|
284
|
-
<div class="gl-dropdown-inner">
|
|
279
|
+
<div class="gl-new-dropdown-inner">
|
|
285
280
|
<slot></slot>
|
|
286
281
|
</div>
|
|
287
282
|
</div>
|
|
@@ -148,15 +148,15 @@ export const CustomListItem = (args, { argTypes }) => ({
|
|
|
148
148
|
`
|
|
149
149
|
<template #list-item="{ item }">
|
|
150
150
|
<a ref="link" class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-hover-text-gray-900 gl-hover-text-decoration-none gl-text-gray-900" :href="item.href" v-bind="item.extraAttrs">
|
|
151
|
-
{{item.text}}
|
|
152
|
-
<gl-badge
|
|
151
|
+
{{ item.text }}
|
|
152
|
+
<gl-badge pill size="sm" variant="neutral">{{ item.count }}</gl-badge>
|
|
153
153
|
</a>
|
|
154
154
|
</template>
|
|
155
155
|
`,
|
|
156
156
|
{
|
|
157
157
|
bindingOverrides: {
|
|
158
158
|
'@action': 'navigate',
|
|
159
|
-
class: 'gl-display-block gl-text-center',
|
|
159
|
+
class: 'gl-display-block! gl-text-center',
|
|
160
160
|
},
|
|
161
161
|
}
|
|
162
162
|
),
|
|
@@ -228,14 +228,14 @@ export const CustomGroupsAndItems = (args, { argTypes }) => ({
|
|
|
228
228
|
template: template(
|
|
229
229
|
`
|
|
230
230
|
<template #group-label="{ group }">
|
|
231
|
-
{{ group.name }} <gl-badge size="sm">{{ getTotalMrs(group.items)
|
|
231
|
+
{{ group.name }} <gl-badge pill size="sm" variant="neutral">{{ getTotalMrs(group.items) }}</gl-badge>
|
|
232
232
|
</template>
|
|
233
233
|
<template #list-item="{ item }">
|
|
234
|
-
<a ref="link" class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-hover-text-gray-900 gl-hover-text-decoration-none gl-text-gray-900" :href="item.href" v-bind="item.extraAttrs">
|
|
235
|
-
{{item.text}}
|
|
236
|
-
<gl-badge pill size="sm"
|
|
234
|
+
<a ref="link" tabindex="-1" class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-hover-text-gray-900 gl-hover-text-decoration-none gl-text-gray-900" :href="item.href" v-bind="item.extraAttrs">
|
|
235
|
+
{{ item.text }}
|
|
236
|
+
<gl-badge pill size="sm" variant="neutral">{{ item.count }}</gl-badge>
|
|
237
237
|
</a>
|
|
238
|
-
|
|
238
|
+
</template>
|
|
239
239
|
`,
|
|
240
240
|
{
|
|
241
241
|
bindingOverrides: {
|
|
@@ -274,6 +274,7 @@ export const CustomGroupsItemsAndToggle = makeGroupedExample({
|
|
|
274
274
|
<a
|
|
275
275
|
class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-hover-text-gray-900 gl-hover-text-decoration-none gl-text-gray-900"
|
|
276
276
|
:href="item.href"
|
|
277
|
+
tabindex="-1"
|
|
277
278
|
v-bind="item.extraAttrs"
|
|
278
279
|
>
|
|
279
280
|
{{item.text}}
|
|
@@ -311,7 +311,7 @@ export default {
|
|
|
311
311
|
:role="disclosureOptions.role"
|
|
312
312
|
:aria-labelledby="listAriaLabelledBy || toggleId"
|
|
313
313
|
data-testid="disclosure-content"
|
|
314
|
-
class="gl-dropdown-contents
|
|
314
|
+
class="gl-new-dropdown-contents"
|
|
315
315
|
tabindex="-1"
|
|
316
316
|
@keydown="onKeydown"
|
|
317
317
|
>
|
|
@@ -3,7 +3,7 @@ import { uniqueId } from 'lodash';
|
|
|
3
3
|
import GlDisclosureDropdownItem from './disclosure_dropdown_item.vue';
|
|
4
4
|
import { isGroup } from './utils';
|
|
5
5
|
|
|
6
|
-
export const GROUP_TOP_BORDER_CLASSES = 'gl-border-t gl-pt-
|
|
6
|
+
export const GROUP_TOP_BORDER_CLASSES = 'gl-border-t gl-pt-2 gl-mt-2';
|
|
7
7
|
|
|
8
8
|
export default {
|
|
9
9
|
components: {
|
|
@@ -57,7 +57,7 @@ export default {
|
|
|
57
57
|
v-if="showHeader"
|
|
58
58
|
:id="nameId"
|
|
59
59
|
aria-hidden="true"
|
|
60
|
-
class="gl-pl-
|
|
60
|
+
class="gl-pl-4 gl-py-2 gl-font-sm gl-font-weight-bold"
|
|
61
61
|
>
|
|
62
62
|
<slot name="group-label">{{ group.name }}</slot>
|
|
63
63
|
</div>
|
|
@@ -39,12 +39,12 @@ describe('GlDisclosureDropdownItem', () => {
|
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
-
describe('when item has
|
|
42
|
+
describe('when item has a `href`', () => {
|
|
43
43
|
beforeEach(() => {
|
|
44
44
|
buildWrapper({ item: mockItems[0] });
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
const findLink = () => wrapper.find('a.dropdown-item');
|
|
47
|
+
const findLink = () => wrapper.find('a.gl-new-dropdown-item-content');
|
|
48
48
|
|
|
49
49
|
it('should render a link', () => {
|
|
50
50
|
expect(findLink().exists()).toBe(true);
|
|
@@ -65,7 +65,7 @@ describe('GlDisclosureDropdownItem', () => {
|
|
|
65
65
|
action.mockClear();
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
const findButton = () => wrapper.find('button[type="button"].dropdown-item');
|
|
68
|
+
const findButton = () => wrapper.find('button[type="button"].gl-new-dropdown-item-content');
|
|
69
69
|
|
|
70
70
|
it('should render a button', () => {
|
|
71
71
|
expect(findButton().exists()).toBe(true);
|
|
@@ -3,7 +3,7 @@ import { ENTER, SPACE } from '../constants';
|
|
|
3
3
|
import { stopEvent } from '../../../../utils/utils';
|
|
4
4
|
import { isItem } from './utils';
|
|
5
5
|
|
|
6
|
-
export const ITEM_CLASS = 'gl-dropdown-item';
|
|
6
|
+
export const ITEM_CLASS = 'gl-new-dropdown-item';
|
|
7
7
|
|
|
8
8
|
export default {
|
|
9
9
|
ITEM_CLASS,
|
|
@@ -73,13 +73,13 @@ export default {
|
|
|
73
73
|
<li
|
|
74
74
|
tabindex="0"
|
|
75
75
|
:class="$options.ITEM_CLASS"
|
|
76
|
-
class="gl-
|
|
76
|
+
class="gl-new-dropdown-item"
|
|
77
77
|
data-testid="disclosure-dropdown-item"
|
|
78
78
|
@click="action"
|
|
79
79
|
@keydown="onKeydown"
|
|
80
80
|
>
|
|
81
|
-
<div v-if="isCustomContent" class="dropdown-item">
|
|
82
|
-
<div class="gl-dropdown-item-text-wrapper">
|
|
81
|
+
<div v-if="isCustomContent" class="gl-new-dropdown-item-content">
|
|
82
|
+
<div class="gl-new-dropdown-item-text-wrapper">
|
|
83
83
|
<slot></slot>
|
|
84
84
|
</div>
|
|
85
85
|
</div>
|
|
@@ -89,11 +89,11 @@ export default {
|
|
|
89
89
|
:is="itemComponent.is"
|
|
90
90
|
v-bind="itemComponent.attrs"
|
|
91
91
|
ref="item"
|
|
92
|
-
class="dropdown-item"
|
|
92
|
+
class="gl-new-dropdown-item-content"
|
|
93
93
|
tabindex="-1"
|
|
94
94
|
v-on="itemComponent.listeners"
|
|
95
95
|
>
|
|
96
|
-
<span class="gl-dropdown-item-text-wrapper">
|
|
96
|
+
<span class="gl-new-dropdown-item-text-wrapper">
|
|
97
97
|
{{ item.text }}
|
|
98
98
|
</span>
|
|
99
99
|
</component>
|
|
@@ -1,6 +1,97 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
.gl-new-dropdown {
|
|
2
|
+
@include gl-display-inline-flex;
|
|
3
|
+
@include gl-vertical-align-middle;
|
|
4
|
+
|
|
5
|
+
.gl-new-dropdown-custom-toggle {
|
|
6
|
+
@include gl-cursor-pointer;
|
|
7
|
+
|
|
8
|
+
&:focus {
|
|
9
|
+
@include gl-focus;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.gl-new-dropdown-panel {
|
|
14
|
+
@include gl-display-none;
|
|
15
|
+
@include gl-bg-white;
|
|
16
|
+
@include gl-border-1;
|
|
17
|
+
@include gl-border-solid;
|
|
18
|
+
@include gl-border-gray-200;
|
|
19
|
+
@include gl-rounded-lg;
|
|
20
|
+
@include gl-shadow-md;
|
|
21
|
+
width: $gl-new-dropdown-width;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.gl-new-dropdown-inner {
|
|
25
|
+
@include gl-display-flex;
|
|
26
|
+
@include gl-flex-direction-column;
|
|
27
|
+
max-height: $gl-max-dropdown-max-height;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.gl-new-dropdown-contents {
|
|
31
|
+
@include gl-flex-grow-1;
|
|
32
|
+
@include gl-overflow-y-auto;
|
|
33
|
+
@include gl-pl-0;
|
|
34
|
+
@include gl-mb-0;
|
|
35
|
+
@include gl-py-2;
|
|
36
|
+
@include gl-list-style-none;
|
|
37
|
+
|
|
38
|
+
ul {
|
|
39
|
+
@include gl-list-style-none;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.gl-new-dropdown-toggle {
|
|
44
|
+
&.gl-button {
|
|
45
|
+
@include gl-pr-3;
|
|
46
|
+
|
|
47
|
+
&.btn-sm {
|
|
48
|
+
@include gl-pr-2;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&.gl-new-dropdown-toggle-no-caret,
|
|
53
|
+
&.gl-new-dropdown-toggle-no-caret.btn-sm {
|
|
54
|
+
@include gl-p-3;
|
|
55
|
+
|
|
56
|
+
.gl-new-dropdown-chevron {
|
|
57
|
+
@include gl-display-none;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.gl-new-dropdown-toggle {
|
|
63
|
+
.gl-button-text {
|
|
64
|
+
@include gl-display-inline-flex;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.gl-new-dropdown-button-text {
|
|
69
|
+
@include gl-mr-auto;
|
|
70
|
+
@include gl-overflow-hidden;
|
|
71
|
+
@include gl-text-overflow-ellipsis;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
&.btn-sm .gl-icon {
|
|
75
|
+
@include gl-my-0;
|
|
76
|
+
|
|
77
|
+
&.gl-new-dropdown-chevron {
|
|
78
|
+
@include gl-h-5;
|
|
79
|
+
@include gl-w-5;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.gl-button .gl-new-dropdown-chevron {
|
|
84
|
+
@include gl-ml-2;
|
|
85
|
+
@include gl-mr-0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.gl-new-dropdown-icon-only {
|
|
89
|
+
.gl-button-icon.gl-button-icon {
|
|
90
|
+
@include gl-mr-0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&.btn-sm .gl-new-dropdown-chevron {
|
|
94
|
+
@include gl-mx-0;
|
|
95
|
+
}
|
|
5
96
|
}
|
|
6
97
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
.gl-new-dropdown-item {
|
|
2
|
+
@include gl-cursor-pointer;
|
|
3
|
+
@include gl-px-2;
|
|
4
|
+
@include gl-my-1;
|
|
5
|
+
|
|
6
|
+
&:first-child {
|
|
7
|
+
@include gl-mt-0;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
&:last-child {
|
|
11
|
+
@include gl-mb-0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
&:active,
|
|
15
|
+
&:hover,
|
|
16
|
+
&:focus,
|
|
17
|
+
&:focus:active {
|
|
18
|
+
.gl-new-dropdown-item-content {
|
|
19
|
+
@include gl-bg-gray-50;
|
|
20
|
+
@include gl-text-decoration-none;
|
|
21
|
+
@include gl-text-gray-900;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
&:focus-visible {
|
|
26
|
+
outline: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&:active,
|
|
30
|
+
&:focus,
|
|
31
|
+
&:focus:active {
|
|
32
|
+
.gl-new-dropdown-item-content {
|
|
33
|
+
@include gl-focus($inset: true);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.gl-new-dropdown-item-content {
|
|
38
|
+
@include gl-w-full;
|
|
39
|
+
@include gl-bg-transparent;
|
|
40
|
+
@include gl-align-items-center;
|
|
41
|
+
@include gl-border-0;
|
|
42
|
+
@include gl-display-flex;
|
|
43
|
+
@include gl-font-base;
|
|
44
|
+
@include gl-font-weight-normal;
|
|
45
|
+
@include gl-line-height-normal;
|
|
46
|
+
@include gl-px-3;
|
|
47
|
+
@include gl-py-0;
|
|
48
|
+
@include gl-relative;
|
|
49
|
+
@include gl-rounded-base;
|
|
50
|
+
@include gl-text-gray-900;
|
|
51
|
+
@include gl-text-left;
|
|
52
|
+
@include gl-white-space-normal;
|
|
53
|
+
|
|
54
|
+
.gl-new-dropdown-item-check-icon {
|
|
55
|
+
@include gl-flex-shrink-0;
|
|
56
|
+
@include gl-mr-3;
|
|
57
|
+
@include gl-text-blue-400;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.gl-new-dropdown-item-icon {
|
|
61
|
+
@include gl-flex-shrink-0;
|
|
62
|
+
@include gl-mr-3;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.gl-new-dropdown-item-text-wrapper {
|
|
66
|
+
@include gl-min-w-0;
|
|
67
|
+
@include gl-flex-grow-1;
|
|
68
|
+
@include gl-py-3;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -9,7 +9,7 @@ $clear-button-size: 24px;
|
|
|
9
9
|
@include gl-line-height-normal;
|
|
10
10
|
@include gl-h-auto;
|
|
11
11
|
@include gl-border-none;
|
|
12
|
-
|
|
12
|
+
padding-left: calc(#{$gl-spacing-scale-7} + #{$gl-spacing-scale-2});
|
|
13
13
|
padding-right: calc(#{$gl-spacing-scale-6} + #{$gl-spacing-scale-2});
|
|
14
14
|
@include gl-py-4;
|
|
15
15
|
@include gl-font-base;
|
|
@@ -37,6 +37,6 @@ $clear-button-size: 24px;
|
|
|
37
37
|
.gl-listbox-search-clear-button {
|
|
38
38
|
@include gl-absolute;
|
|
39
39
|
top: calc(50% - #{$clear-button-size} / 2);
|
|
40
|
-
right: $gl-spacing-scale-
|
|
40
|
+
right: $gl-spacing-scale-3;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -175,8 +175,9 @@ export const HeaderAndFooter = (args, { argTypes }) => ({
|
|
|
175
175
|
}
|
|
176
176
|
},
|
|
177
177
|
methods: {
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
selectAll() {
|
|
179
|
+
const allValues = mockOptions.map(({ value }) => value);
|
|
180
|
+
this.selected = [...allValues];
|
|
180
181
|
},
|
|
181
182
|
onReset() {
|
|
182
183
|
this.selected = [];
|
|
@@ -185,12 +186,13 @@ export const HeaderAndFooter = (args, { argTypes }) => ({
|
|
|
185
186
|
template: template(
|
|
186
187
|
`
|
|
187
188
|
<template #footer>
|
|
188
|
-
|
|
189
|
-
<gl-button
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
189
|
+
<div class="gl-border-t-solid gl-border-t-1 gl-border-t-gray-100 gl-display-flex gl-flex-direction-column gl-p-2! gl-pt-0!">
|
|
190
|
+
<gl-button @click="selectAll" category="tertiary" block class="gl-justify-content-start! gl-mt-2!"">
|
|
191
|
+
Select all
|
|
192
|
+
</gl-button>
|
|
193
|
+
<gl-button category="tertiary" block class="gl-justify-content-start! gl-mt-2!">
|
|
194
|
+
Manage departments
|
|
195
|
+
</gl-button>
|
|
194
196
|
</div>
|
|
195
197
|
</template>
|
|
196
198
|
`,
|
|
@@ -242,7 +244,7 @@ export const CustomListItem = (args, { argTypes }) => ({
|
|
|
242
244
|
template: template(
|
|
243
245
|
`<template #list-item="{ item }">
|
|
244
246
|
<span class="gl-display-flex gl-align-items-center">
|
|
245
|
-
<gl-avatar :size="32" :entity-name="item.value" class
|
|
247
|
+
<gl-avatar :size="32" :entity-name="item.value" class="gl-mr-3"/>
|
|
246
248
|
<span class="gl-display-flex gl-flex-direction-column">
|
|
247
249
|
<span class="gl-font-weight-bold gl-white-space-nowrap">{{ item.text }}</span>
|
|
248
250
|
<span class="gl-text-gray-400"> {{ item.secondaryText }}</span>
|
|
@@ -291,7 +293,7 @@ export const CustomToggle = (args, { argTypes }) => ({
|
|
|
291
293
|
</template>
|
|
292
294
|
<template #list-item="{ item }">
|
|
293
295
|
<span class="gl-display-flex gl-align-items-center">
|
|
294
|
-
<gl-avatar :size="32" :entity-name="item.value" class
|
|
296
|
+
<gl-avatar :size="32" :entity-name="item.value" class="gl-mr-3"/>
|
|
295
297
|
<span class="gl-display-flex gl-flex-direction-column">
|
|
296
298
|
<span class="gl-font-weight-bold gl-white-space-nowrap">{{ item.text }}</span>
|
|
297
299
|
<span class="gl-text-gray-400"> {{ item.secondaryText }}</span>
|
|
@@ -28,7 +28,7 @@ import { isOption, itemsValidator, flattenedOptions } from './utils';
|
|
|
28
28
|
|
|
29
29
|
export const ITEM_SELECTOR = '[role="option"]';
|
|
30
30
|
const HEADER_ITEMS_BORDER_CLASSES = ['gl-border-b-1', 'gl-border-b-solid', 'gl-border-b-gray-200'];
|
|
31
|
-
const GROUP_TOP_BORDER_CLASSES = ['gl-border-t', 'gl-pt-
|
|
31
|
+
const GROUP_TOP_BORDER_CLASSES = ['gl-border-t', 'gl-pt-1', 'gl-mt-2'];
|
|
32
32
|
export const SEARCH_INPUT_SELECTOR = '.gl-listbox-search-input';
|
|
33
33
|
|
|
34
34
|
export default {
|
|
@@ -625,7 +625,7 @@ export default {
|
|
|
625
625
|
ref="list"
|
|
626
626
|
:aria-labelledby="listAriaLabelledBy || headerId || toggleId"
|
|
627
627
|
role="listbox"
|
|
628
|
-
class="gl-dropdown-contents
|
|
628
|
+
class="gl-new-dropdown-contents"
|
|
629
629
|
tabindex="-1"
|
|
630
630
|
@keydown="onKeydown"
|
|
631
631
|
>
|
|
@@ -692,7 +692,7 @@ export default {
|
|
|
692
692
|
<div
|
|
693
693
|
v-else-if="showNoResultsText"
|
|
694
694
|
aria-live="assertive"
|
|
695
|
-
class="gl-pl-7 gl-pr-5 gl-
|
|
695
|
+
class="gl-pl-7 gl-pr-5 gl-py-3 gl-font-base gl-text-gray-600"
|
|
696
696
|
data-testid="listbox-no-results-text"
|
|
697
697
|
>
|
|
698
698
|
{{ noResultsText }}
|
|
@@ -15,8 +15,12 @@ export default {
|
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
17
|
<template>
|
|
18
|
-
<ul role="group" :aria-labelledby="nameId" class="gl-mb-0 gl-pl-0
|
|
19
|
-
<li
|
|
18
|
+
<ul role="group" :aria-labelledby="nameId" class="gl-mb-0 gl-pl-0">
|
|
19
|
+
<li
|
|
20
|
+
:id="nameId"
|
|
21
|
+
role="presentation"
|
|
22
|
+
class="gl-pl-4 gl-pt-3 gl-pb-2 gl-font-sm gl-font-weight-bold"
|
|
23
|
+
>
|
|
20
24
|
<slot name="group-label">{{ name }}</slot>
|
|
21
25
|
</li>
|
|
22
26
|
<slot></slot>
|