@gitlab/ui 54.1.1 → 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.
Files changed (31) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +5 -11
  3. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +1 -1
  4. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.js +2 -2
  5. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +2 -2
  6. package/dist/components/base/new_dropdowns/listbox/listbox.js +2 -2
  7. package/dist/components/base/new_dropdowns/listbox/listbox_group.js +1 -1
  8. package/dist/components/base/new_dropdowns/listbox/listbox_item.js +3 -3
  9. package/dist/index.css +2 -2
  10. package/dist/index.css.map +1 -1
  11. package/package.json +3 -3
  12. package/scss_to_js/scss_variables.js +1 -0
  13. package/scss_to_js/scss_variables.json +5 -0
  14. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.spec.js +18 -20
  15. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +14 -19
  16. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.scss +2 -2
  17. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.stories.js +9 -8
  18. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +1 -1
  19. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.vue +2 -2
  20. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.spec.js +3 -3
  21. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.vue +6 -6
  22. package/src/components/base/new_dropdowns/dropdown.scss +95 -4
  23. package/src/components/base/new_dropdowns/dropdown_item.scss +71 -0
  24. package/src/components/base/new_dropdowns/listbox/listbox.scss +2 -2
  25. package/src/components/base/new_dropdowns/listbox/listbox.stories.js +12 -10
  26. package/src/components/base/new_dropdowns/listbox/listbox.vue +4 -4
  27. package/src/components/base/new_dropdowns/listbox/listbox_group.vue +6 -2
  28. package/src/components/base/new_dropdowns/listbox/listbox_item.vue +4 -4
  29. package/src/scss/components.scss +1 -1
  30. package/src/scss/variables.scss +1 -0
  31. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.scss +0 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "54.1.1",
3
+ "version": "54.2.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -39,7 +39,7 @@
39
39
  "test:unit:watch": "yarn test:unit --watch",
40
40
  "test:unit:debug": "NODE_ENV=test node --inspect node_modules/.bin/jest --testPathIgnorePatterns storyshot.spec.js --watch --runInBand",
41
41
  "test:unit-vue3": "VUE_VERSION=3 NODE_ENV=test jest --testPathIgnorePatterns storyshots.spec.js",
42
- "test:unit-vue3:watch": "VUE_VERSION=3 yarn test:unit --watch --notify",
42
+ "test:unit-vue3:watch": "VUE_VERSION=3 yarn test:unit --watch",
43
43
  "test:unit-vue3:debug": "VUE_VERSION=3 NODE_ENV=test node --inspect node_modules/.bin/jest --testPathIgnorePatterns storyshot.spec.js --watch --runInBand",
44
44
  "test:visual": "./bin/run-visual-tests.sh 'jest ./tests/storyshots.spec.js'",
45
45
  "test:visual:minimal": "node ./bin/run_minimal_visual_tests.js",
@@ -85,7 +85,7 @@
85
85
  "@babel/core": "^7.20.12",
86
86
  "@babel/preset-env": "^7.20.2",
87
87
  "@gitlab/eslint-plugin": "18.1.0",
88
- "@gitlab/fonts": "^1.1.0",
88
+ "@gitlab/fonts": "^1.1.2",
89
89
  "@gitlab/stylelint-config": "4.1.0",
90
90
  "@gitlab/svgs": "3.17.0",
91
91
  "@rollup/plugin-commonjs": "^11.1.0",
@@ -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-menu');
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
- ${{ toggleText: 'toggleText', icon: 'close' }} | ${['dropdown-icon-text']}
107
- ${{ icon: 'close' }} | ${['dropdown-icon-only']}
108
- ${{ icon: 'close', toggleText: 'toggleText', textSrOnly: true }} | ${['dropdown-icon-only']}
109
- ${{ icon: 'close', textSrOnly: true }} | ${['dropdown-icon-only']}
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('show')).toBe(true);
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('show')).toBe(false);
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('show')).toBe(true);
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('show')).toBe(false);
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('show')).toBe(true);
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('show')).toBe(false);
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('show')).toBe(true);
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('show')).toBe(false);
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-toggle': true,
131
- 'dropdown-icon-only': this.isIconOnly,
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 gl-hover-cursor-pointer',
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 v-if="!noCaret" class="gl-button-icon dropdown-chevron" name="chevron-down" />
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-menu"
281
- :class="{ show: visible }"
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>
@@ -1,6 +1,6 @@
1
1
  .gl-disclosure-dropdown {
2
- &.gl-dropdown {
3
- .gl-dropdown-inner {
2
+ &.gl-new-dropdown {
3
+ .gl-new-dropdown-inner {
4
4
  max-height: none;
5
5
  }
6
6
  }
@@ -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 v-if="item.count" pill size="sm">{{item.count}}</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) }}</gl-badge>
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" v-if="item.count">{{item.count}}</gl-badge>
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
- </template>
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 gl-list-style-none gl-pl-0 gl-mb-0"
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-3 gl-mt-3';
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-5 gl-py-2 gl-font-sm gl-font-weight-bold"
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 an `href`', () => {
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-dropdown-item gl-focusable-dropdown-item"
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
- // TODO: remove in scope of https://gitlab.com/gitlab-org/gitlab-ui/-/issues/2111
2
- .gl-focusable-dropdown-item {
3
- &:focus {
4
- @include gl-focus($inset: true);
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
- @include gl-pl-7;
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-2;
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
- selectItem(index) {
179
- this.selected.push(mockOptions[index].value);
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
- <div class="gl-border-t-solid gl-border-t-1 gl-border-t-gray-100 gl-display-flex gl-justify-content-center gl-p-3">
189
- <gl-button-group :vertical="false">
190
- <gl-button @click="selectItem(0)">1st</gl-button>
191
- <gl-button @click="selectItem(1)">2nd</gl-button>
192
- <gl-button @click="selectItem(2)">3rd</gl-button>
193
- </gl-button-group>
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-="gl-mr-3"/>
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-="gl-mr-3"/>
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>